본문 바로가기

Spring31

@Tracsactional 없이 save()가 동작한다? 개요최근 코드리뷰를 하게 되던 중, 비즈니스 로직에 @Transactional 어노테이션이 누락되어 있는 코드를 보게 되었습니다. 저는 매번 Service를 구현할 때 외부에서 호출하는 public 메인 비즈니스 로직에 아래와 같이 습관처럼 @Transactional을 명시하고 사용했었습니다.쓰기용 SQL 질의인 Insert, Delete, Update를 하나라도 포함한다면 @Transactional 명시한다.조회용 SQL인 Select만 수행하는 메서드에는 @Transactional(readOnly=true)를 명시한다. 위와 같이 습관처럼 @Transactional을 사용하다 보니, 트랜잭션이 명시되지 않은 경우 save() 메서드를 호출했을 때 데이터가 왜 저장되는지, 읽기 전용 트랜잭션에서 sav.. 2024. 8. 24.
@TransactionEventListener의 phase 옵션을 주의해서 사용하자 스프링에서 이벤트 리스너를 사용한다면 보통 ApplicationEventPublisher 를 통해 이벤트를 발생시키고, @TransactionEventListener가 적용된 이벤트 리스너에서 이 이벤트를 받아 처리합니다. 이때, 이벤트를 발생시킨 트랜잭션의 상태(단계)에 따라 이벤트 리스너가 동작하는 시점을 조절하게 되는데이를 조절하는 옵션이 @TransactionEventListener의 phase 옵션 입니다. 이벤트 리스너를 사용할 때 phase 옵션을 잘 알고 사용하지 않는다면 예상하지 못한 문제가 발생할 수 있습니다. @TransactionEventListener의 phase 옵션@TransactionEventListener의 phase옵션은 4가지로 구성되어 있으며, 따로 설정하지 않는다면 .. 2024. 8. 6.
@TransactionalEventListener 비동기 이벤트 처리 하기 회원가입 기능을 구현 중 회원가입 완료 메일 전송 기능을 스프링의 @TransactionalEventListener어노테이션을 사용해서 비동기로 처리했었습니다. 문제 상황아래는 회원가입 후 메일을 전송하는 기능의 코드입니다.@Service@RequiredArgsConstructor@Transactional(readOnly = true)public class MemberSignupService { private final MemberProcessor memberProcessor; private final MailService mailService; @Transactional public MemberSignupDto.Info signup(final MemberSignupDto.Comma.. 2024. 6. 22.
@RequiredArgsConstructor와 @AllArgsConstructor 비교하기 문제 상황프로젝트 진행 중에 Mapstruct 라이브러리를 사용하여 DTO를 자동 매핑하는 과정에서 문제를 겪었습니다.기존에는 무조건 DTO 필드를 @AllArgsConstructor로 설정했었는데, DTO의 특성상 불변 객체로 만드는 것이 더 적합하다고 판단해서 @RequiredArgsConstructor로 변경했었습니다.하지만 @RequiredArgsConstructor로 설정된 클래스의 필드가 누락되어 매핑되지 않는 오류가 발생했고 해결책을 찾기 위해 DTO 클래스를 디컴파일해 본 결과, 문제의 원인을 찾을 수 있었습니다. Lombok 어노테이션 비교Lombok의 @RequiredArgsConstructor와 @AllArgsConstructor는 각각 생성자를 자동으로 생성해주는 편리한 기능을 제공.. 2024. 6. 14.