Web 10

트랜잭션후 메시지 전송을 보장하는 방법, How to guarantee to send events after Transaction

이 글에서 다루는 내용 이 글은 MSA 환경에서 로컬 트랜잭션의 커밋이후 메시지 전송을 보장하는 방법에 대해서 다룹니다. 내용을 다루기 위해서 예시와 함께 작성되었습니다. https://microservices.io/patterns/data/transactional-outbox.html Microservices Pattern: Pattern: Transactional outbox First, write the message/event to a database OUTBOX table as part of the transaction that updates business objects, and then publish it to a message broker. microservices.io 목차 트랜잭션의 커..

Web 2024.04.22

MSA에서 다른 서비스의 트랜잭션이 실패된다면 어떻게 해야할까?, Saga

이 글은 MSA 환경에서 다른 서비스의 트랜잭션 Fail으로 인한 보상로직을 작성하는 방법에 대해서 다루는 글입니다. 이 글을 쓰는 이유 최근에 MSA하다가 A 컴포턴트에서 트랜잭션을 마치고, B 컴포넌트에 이벤트를 던져두었더니, B 컴포넌트가 제대로 처리를 못하면 어떻게 해야하나라는 질문을 받았습니다. 그래서 해결책을 찾아보다가 이 해결책으로 Saga pattern을 알게 되었고, Saga pattern에 대해서 공유하고자 글을 씁니다. https://microservices.io/patterns/data/saga.html Microservices Pattern: Pattern: Saga Implement transactions using a saga, which is sequence of local ..

Web 2024.04.13

Unable to load class 'javax.persistence.Entity'.

QueryDsl을 사용하려고 보니 javax에서 persistence 를 찾고 있었다. Spring 6부터는 JDK 17과 함께 jakarta ee를 채택했기 때문에 스프링부트를 통해서 jpa를 사용하려고 하고 있었다면 javax가 없어서 당연히 나타나는 에러라고 생각이 들었다. 인터넷에서 검색해보니 classifier를 gradle에서 명시하는 방법이 있어서 jakarta를 명시해서 문제를 해결했다. 이전 설정 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}" annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}" 수정 이후 설정 implementation "com.queryds..

Web/Spring 2023.02.05

스프링에서 싱글톤으로 관리하는 빈의 생성주기

스프링 빈 생성주기에 대해서 배웠다. 정확히는 스프링에서 싱글톤으로 관리하는 빈에 대한 생성주기였다. 스프링 컨테이너 생성 스프링 컨테이너의 생성은 말 그대로 Application Context(이하 스프링 컨테이너)의 생성이다. 빈 객체 등록 스프링 컨테이너가 생성되면 빈 객체 등록이 이뤄진다. 이때, 빈이 생성자 주입을 사용하도록 되어있다면, 필요한 의존관계가 빈 객체등록 시점에서 이뤄진다. 의존관계 주입 만약 모든 의존관계가 다 생성자 등록이라면 빈 객체등록이 끝나는 시점에 의존관계 주입도 이미 끝나있을 것이다. 이 의존관계 주입단계에서는 수정자 주입이나, 필드주입을 받는 빈이 주입을 받는다. 초기화 콜백 위 단계에서 의존관계가 주입된 빈들은 초기화 콜백이 수행된다. 초기화 콜백은 Initializ..

Web/Spring 2023.01.26

인텔리제이는 생각보다 더 많은 도움을 준다.

평소에 인텔리제이에 IdeaVim을 켜서 쓰는 편이다. 그것만으로 충분히 좋은 IDE라고 생각했는데 최근에 김영한님의 스프링 강의를 들으면서 더 강력한 기능들을 많이 배울 수 있었다. 그래서 좋은거 나눠가지자는 생각으로 내가 쓰는 좋은 기능들을 함께 공유하고자 한다. 내 키보드는 capslock의 위치에 ctrl이 들어가있다. 이걸 감안하고 보길 바란다. 그리고 나는 Mac 유저다. 그러니 윈도우 유저들은 기능만 참고하고 위치는 알아서 쓰면 된다. Keymap Tool window 화면 전환과 관련된 키맵들이다. run 현재 실행중인 어플리케이션의 출력물을 확인할 수 있다. 테스트코드를 돌리고 있었다면 테스트 코드, 어플리케이션 코드를 작성하고 있었다면 어플리케이션 코드를 볼 수 있다. cmd + 4 g..

Web 2023.01.25

스프링 컨테이너

기존에 사용했던 Nest.js와 Flutter 에서 의존관계를 관리했던 방법 Nest.js를 쓰거나 Flutter 로 어플리케이션 개발을 할때는 DI를 구현해서 사용했다. Flutter 로 DI를 구현해서 사용했을때에는 Service Locator라는 라이브러리를 사용해서 어플리케이션 실행 시점에 ServiceLocatorInitializer(가칭)에서 의존관계를 조립해서 모든 의존관계를 ServiceLocator에 주입해두고 꺼내서 썼다. 어디에서 어떻게 의존관계가 관리되는지는 명확했다. Nest.js를 쓸때는 초기화된 결과들이 저장되는 곳은 몰라도, @Module을 통해서 어떤 모듈이 서로 참조하고, 노출되는 Provider는 어떤것이 있는지 알 수 있었다. 스프링은 어떻게 의존관계를 관리하지? 내가..

Web/Spring 2023.01.24

JWT, Json Web Token

JWT, Json Web Token에 대한 글입니다. 1. JWT의 정의와 구조 2. 장점이 무엇인지 3. 언제 사용하면 좋은지 다루는 내용은 크게 세 가지로 위 세가지 내용을 다룹니다. JWT의 정의와 구조 JWT는 RFC 7519으로 토큰기반 인증 시스템을 구현한 것입니다. 이름에서 알 수 있듯이 JWT는 토큰 내부의 정보를 Json으로 저장하고 있습니다. 하지만 이 정보는 암호화 되어있고, URL에 공개되지 않기 때문에 적은 비용으로 안전하게 데이터를 전송할 수 있습니다. JWT의 내부 구조는 HEADER, Payload, Signature로 구성되어있으며 이 정보들은 .(dot)을 통해서 구분됩니다. 좌측에는 JWT, 그리고 우측에는 JWT 내부의 정보가 담겨있습니다. 헤더: JWT를 복호화하는데..

Web 2020.03.30