기존 모놀리식 프로젝트 (https://github.com/dasd412/RemakeDiabetesDiaryAPI)를 MSA로 전환한다.도커쿠버네티스스프링 클라우드등등...
빨간 색 표시가 전체 프로젝트(Git repository라 할 수 있다.)이고, 파란색 부분이 하위 프로젝트(MSA라고 할 수 있다.)이다.참고로, 하위 프로젝트는 처음에 인텔리제이 기준으로 폴더 옆에 파란색 상자가 없다. 하위 프로젝트들도 전부 메이븐 프로젝트여야 한
모놀리식 프로젝트를 MSA로 분할하기 위해서 예광탄 코드를 작성한다.(예광탄은 실제 목표물을 조준하기 위해서 시험적으로 쏘는 탄알인데 빛의 궤적을 그려준다. - 실용주의 프로그래머 12장 토픽)일지 CRUD 중 Save diary에 대해 MSA로 분할해본다.스프링 시큐
Writer 1명이 Diary 여러 개를 가지는 일대다의 관계이다.두 개의 마이크로 서비스로 분할하고 통신하는 것JPA 연관 관계를 맺는 엔티티들을 각각의 마이크로 서비스에 분할한다고 하자. 단순히 복붙으로 넣는다면, 당연히 실행이 안될 것이다.왜냐하면 컴파일러가 @O
main과 diary-service-split 브랜치가 있었다. diary-service-split 브랜치는 main 브랜치보다 10커밋 정도 ahead, 1커밋 behind인 상태였다. 생각 없이 rebase를 해봤는데 diary-service-split 브랜치 맨
붉은 색 부분은 대략 구현하였고 파란색 부분을 마저 구현해야 한다.물론, writer를 find 하기 전에 writer를 save 해야 하는 선행 작업이 필요하다. 그런데 이 작업은 spring security와 msa를 같이 고려해야 하므로 현 시점에선 진행하기 어렵
다이어그램 실제 코드 회로 차단기 패턴 테스트 코드 코드 설명 참고 링크 https://ynovytskyy.medium.com/unit-testing-circuit-breaker-8ed2c9098e11 https://jojoldu.tistory.com/226
리포지토리 코드 대부분이 find와 연관이 되있다.create와 update는 기본 JPA 코드를 사용하고 있었다.일지 및 연관된 하위 엔티티 모두를 조회하는 코드 예시이다. 각 엔티티들은 기본키가 복합키 형태로 되어있다.참고로 fetchjoin()은 jpa n+1 문
카프카 의존성을 추가하고 나서 JUnit 테스트가 작동하지 않았다. Brokers may not be available과 같은 에러 메시지를 계속 뱉으면서 무한루프를 돌고 있었다.@SpringBootApplication을 부착한 클래스에 카프카 어노테이션을 부착한 상태
스프링 마이크로 서비스 코딩 공작소 개정 2판 챕터 11 실습 중, docker-compose up을 했다. 그런데 kibana 포트로 접속했더니 kibana server is not ready yet 발생한다.일단 docker-compose up으로 띄워봤다.dock
마이크로 서비스 간의 의존 관계를 명확히 하기 위해 DDD 이벤트 스토밍을 해봤다.한 번 해보니까 서비스 사이의 메시징을 어떻게 구성해야 하는 지 한 눈에 알 수 있었다.위 이벤트 스토밍은 도메인 주도 설계로 시작하는 마이크로 서비스 개발의 절차대로 했으며, 아래 링크
기존 모놀리식 프로젝트 패키지 구조랑 똑같이 구성하고 있었다. 컨트롤러 - 서비스 - 리포지토리 구조의 레이어드 아키텍쳐다. 그런데 이렇게 하면, DB 중심의 아키텍쳐가 되기 쉽다고 한다.컨트롤러 패키지에 있던 것들 중, 컨트롤러와 리퀘스트와 관련된 dto들은 in.w
비용 절감을 위해 Lightsail에 MSA 프로젝트를 배포하려 했다. (AWS 프리티어가 다 끝나가기 때문이다.)Lightsail은 5달러 짜리, 메모리는 1GB인 것을 사용했었다. 그리고 해당 인스턴스에 MySQL, Jenkins, docker, maven, jav
단위 테스트할 때는 로그스태시 연결할 필요가 없다. 그런데 LogstashTcpSocketAppender가 5000번 포트에 접속을 시도하고 있었다.logback.xml이 다음과 같았다.그리고 logback-test.xml은 없었다.이유는 프로파일과 관련있다. tes
이 코드의 deleteById()는 JPA 기본 제공 메서드이다.Querdsl로 짠 코드이다.properties를 사용한다면, 다음으로 바꾼다.logback을 사용한다면, 다음으로 바꾼다.
이 코드인 채로 도커 말아서 띄워봤더니, transactionRequiredException이 발생했다. 트랜잭션 붙였는데, 뭔 소린가 했다.제목 그대로 @Transactional은 private에 붙이면 안된다.왜냐하면 해당 어노테이션은 private method에서
위 설정을 properties에 추가한다.만약, 위처럼 Gateway-server를 통해 redirect를 하고 있다고 하더라도localhost:게이트웨이 포트/리다이렉트 경로/h2-console로 하면 접속이 안된다.localhost:마이크로 서비스 포트/h2-con
언제나처럼 코드를 작성한 후 JUnit으로 테스트를 실시하고 있었다. 그런데 run을 했는데도, 스프링 부트가 매우 오래 로딩되고 있었다!로그는 다음과 같았다.그리고는 다음 로그가 진행되지 않았다.좀 시간 지나고 나서야 테스트가 진행됬다. 너무 오래 걸리는 시간이었다.
https://medium.com/spoontech/%EB%A7%88%EC%9D%B4%ED%81%AC%EB%A1%9C%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B5%AC%EC%A1%B0-msa-%EC%9D%98-%EC%9D%B8%EC%A6%9D-
위 코드에서 claims.put()을 주목하자. 이 코드를 통해서 JWT에 원하는 정보를 넣을 수 있다. 나는 컨트롤러 코드들에 작성자 id가 파라미터가 필요했기 때문에 해당 정보를 넣어줬다.그리고 인증이 성공되었을 때 발동되는 successfulAuthenticati
Request headers에 KEY로 Cookie를 넣는다.VALUE로 refresh-token=(실제 쿠키 값)을 넣는다.예를 들어, @CookieValue("A")String B 라고 하자.그러면 VALUE에 A=(실제 쿠키 값)으로 넣으면 된다.
게이트 웨이를 거쳐서 Google OAuth 인증이 되지 않는다. 대신, 직접 인증 서비스 포트를 호출하면 인증 및 회원 가입이 성공한다.URL1은 게이트 웨이를 경유할 때이며, URL2는 게이트웨이를 경유하지 않고 직접 인증을 시도할 때를 나타낸다.http:
현재까지 완성된 부분이다. 조회 서비스는 이제 작업을 진행할 텐데, 몽고 DB를 사용하여 CQRS 패턴을 도입할 것이다.단계별 점진으로 만들어가는게 CQRS 패턴을 도입하는 방법인 것 같다.1단계)DB를 공통 사용하되, CUD와 R을 분리한다.2단계)DB도 분리한다.3
저장하고자 하는 document json의 형태는 위와 같다. 관계로 나타내면 일대다가 중첩된 것이라 할 수 있겠다. 예를 들어, diary : diet =1:n, diet : food =1:n이라고 할 수 있다.페이징 dto는 diary.written_time, di
stage 2에서 이미지를 stage 1과 동일한 걸로 사용하고 있었다.도커파일로 만든 이미지들의 용량은 평균적으로 500MB였다.stage2에서 distroless 이미지를 사용하였다. 이 이미지는 자바 실행을 위해 가볍게 만들어진 이미지라고 한다.확인해보니 거의 절