본문 바로가기

Spring21

스프링 트랜잭션 동기화로 메시지 발행 타이밍 제어하기 들어가기에 앞서실무에서 비즈니스 로직을 구현하다 보면 MQ에 메시지를 발행하여 비동기로 작업을 처리하거나, Redis를 임시 데이터 저장소로 활용하는 경우가 많았습니다. 외부 시스템과 연동할 때 스프링 트랜잭션이 롤백되면 불필요한 연산이 발생하거나, 데이터베이스 커밋 전에 비동기 작업이 완료되어 DB에 똑바로 반영되지 않는 문제가 종종 발생했습니다.문제를 해결하기 위해 먼저 떠오른 것은 스프링 이벤트였습니다. 과거에 해당 기능을 사용했던 경험을 떠올려 보면, @TransactionalEventListener의 AFTER_COMMIT, AFTER_ROLLBACK 등의 옵션을 사용하여 이벤트를 소비하는 작업의 실행 시점을 트랜잭션의 커밋, 롤백이 성공한 시점으로 조절할 수 있었습니다. 그리고 이 기능의 기반.. 2026. 2. 17.
스프링 트랜잭션 롤백 제어하기 들어가기에 앞서스프링 트랜잭션은 UncheckedException은 롤백하고 CheckedException은 비즈니스 예외로 취급하여 롤백하지 않는다.스프링 프레임워크의 트랜잭션에 대해 처음 배울 때 들었던 이야기입니다. 최근 실무에서 스프링 트랜잭션의 롤백을 제어하여 비즈니스 요구사항을 구현했습니다. 이 경험을 바탕으로 스프링 트랜잭션의 롤백이 어떻게 동작하는지 직접 프레임워크 코드와 공식 문서를 통해 학습한 내용을 정리해보려고 합니다.본 게시글에서는 다음 내용을 다룹니다.스프링 트랜잭션의 기본 롤백 정책과 그 이유rollbackFor, noRollbackFor 속성을 통한 롤백 규칙 커스터마이징실무에서 noRollbackFor를 활용한 사례스프링 트랜잭션의 기본 롤백 정책스프링의 선언적 트랜잭션(@T.. 2026. 2. 1.
Jedis, Lettuce, Redisson. 레디스를 위한 세 가지 자바 클라이언트 세 가지 레디스 자바 클라이언트Jedis제디스(Jedis)는 동기식 작업을 지원하는 레디스 클라이언트입니다. 다른 클라이언트에 비해 간단하고 사용하기 쉬운 API를 제공합니다. 제디스 인스턴스는 스레드 안전(Thread-safe)하지 않기 때문에 멀티 스레드 환경에서 사용하려는 경우 제디스풀(JedisPool)을 사용해야 합니다.Lettuce레투스(Lettuce)는 동기, 비동기, 반응형 작업을 지원하는 레디스 클라이언트입니다. 제디스와 달리 스레드 안전하기 때문에 여러 스레드에서 안전하게 사용할 수 있습니다.Redisson레디슨(Redisson)은 다양한 분산 객체를 제공하는 레디스 클라이언트입니다. 다른 두 클라이언트가 레디스의 기본 자료구조를 다루는 API만 제공하는 데 비해 레디슨은 분산된 환경에.. 2024. 10. 30.
스프링 @Retry를 이용한 재시도 처리하기 Spring RetrySpring Retry 프로젝트는 스프링 애플리케이션에 대해 명령형 또는 선언적 재시도 처리를 지원합니다. 의존성이를 사용하기 위해서는 다음의 의존성을 추가해주어야 합니다. Spring Retry는 스프링 AOP를 이용하여 선언적 방식을 제공합니다. 따라서 AOP 의존성이 필요하며 다른 스타터 의존성에 AOP 의존성도 포함되어있다면 생략해도 됩니다.implementation 'org.springframework.boot:spring-boot-starter-aop'implementation 'org.springframework.retry:spring-retry'Retryable사용 방식은 간단합니다. 별도의 configuration에 @EnableRetry를 추가한 뒤, 재시도 처리를.. 2024. 6. 12.
스프링 @Async를 이용한 비동기 실행 적용하기 Spring Async@Async비동기 실행을 위한 @Async를 사용하기 위해서는 먼저 적당한 @Configuration 클래스에 @EnableAsync를 추가해주어야 합니다.@EnableAsync @Configuration public class AsyncConfig {}그런 다음 비동기적으로 실행되길 원하는 메서드에 @Async 어노테이션을 추가하면 됩니다. 다음은 Spring Event의 이벤트 리스너의 비동기 실행을 적용하기 위해 @Async를 사용하는 코드입니다.@Async @TransactionalEventListener public void createDefaultLinkBundle(CreateMemberEvent event) { CreateLinkBundleCommand.. 2024. 6. 11.
스프링에서 외부 API 호출을 테스트하는 방법(feat. RestClient) RestClient는 Spring 6.1 버전부터 추가된 동기식 HTTP 클라이언트로 기존의 동기식 HTTP 클라이언트인 RestTemplate에 비해 훨씬 더 현대적인 API를 제공합니다.RestClient의 테스트 방법을 찾던 중 유효하게 사용할 수 있는 두 가지 방법에 대해 알게 되어 기록합니다. @RestClientTest@RestClientTest를 사용하면 Jackson, GSON 등의 클라이언트 테스트와 관련된 bean 구성만 적용하여 최소한의 컨텍스트로 테스트가 실행됩니다.이 때, 테스트를 위해 사용하는 MockRestServiceServer와 RestClient가 바인드되어야 하기 때문에 RestClient를 사용하는 bean은 생성자에서 RestClient.Builder를 파라미터로 .. 2024. 5. 20.