앞서 여기서 외부 트랜잭션과 내부 트랜잭션에 대해 설명하였다. 트랜잭션 참여에 대해서 설명을 하였는데, 이번에는 트랜잭션 참여가 아닌 새로운 트랜잭션 생성에 대해서 알아보자. 트랜잭션 참여 @Transactional을 사용할 때 옵션으로 propagation = Propagation.REQUIRED를 사용한다. @Transactional(propagation = Propagation.REQUIRED) public class MemberRepository { // 생략 } 새로운 트랜잭션 생성 @Transactional을 사용할 때 옵션으로 propagation = Propagation.REQUIRES_NEW를 사용한다. @Transactional(propagation = Propagation.REQUIR..
트랜잭션 전파를 공부하면 내부 트랜잭션과 외부 트랜잭션을 공부하게 되는데, 이때 내부 트랜잭션에서 롤백이 호출되었을 때 외부 트랜잭션에서 이를 처리하는 2가지 경우가 존재한다. 외부 트랜잭션 트랜잭션이 시작된 곳을 외부 트랜잭션이라고 한다. 외부 트랜잭션이 최종적으로 커밋 또는 롤백을 처리한다. 내부 트랜잭션 외부 트랜잭션에 참여하는 트랜잭션을 내부 트랜잭션이라고 한다. 내부 트랜잭션에서 발생한 커밋 또는 롤백은 실제로 호출되지 않는다. 커넥션은 단 한 번만 커밋 또는 롤백이 가능하기 때문에, 내부 트랜잭션에서 커밋 또는 롤백을 호출하면 외부 트랜잭션까지 트랜잭션이 사용되지 않고 중간에 종료되는 문제가 발생한다. 예외 1 - RuntimeException MemberService에서 MemberRepos..
@PostConstruct와 @Transactional이 동시에 사용되었을 때 트랜잭션이 적용되지 않는다. 그 이유는 두 애너테이션이 호출되는 시점이 다르기 때문이다. 스프링 생명 주기 스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백 -> 사용 -> 소멸 콜백 -> 스프링 컨테이너 종료 @PostConstruct 호출 시점 스프링 빈이 생성 되고 의존 관계가 주입된 후에 호출된다. @Transactional 호출 시점 초기화 콜백 이후 컨테이너가 초기화된 후에 호출된다. 코드 Hello 클래스가 빈으로 등록되어 있고, initV1() 메서드에 @PostConstruct 애너테이션이 사용되고 있다. @SpringBootTest @Slf4j public class InitT..
클래스에 @Transactional을 붙이면 모든 메서드에 트랜잭션이 적용된다. 특정 메서드에 @Transactional을 붙이면 해당 메서드에만 트랜잭션이 적용된다. 그런데 의문이 들었다. @Transactional이 붙지 않은 메서드를 호출할 때, 해당 클래스는 AOP 프록시가 적용되어 있는지에 대해 궁금했다. 결론부터 말하자면 AOP 프록시가 적용된 상태에서 메서드를 호출하게 된다. 물론 @Transactional이 붙지 않았기 때문에 해당 메서드는 트랜잭션이 적용되지 않는다. 트랜잭션 AOP 적용 CallService 클래스를 보면 internal 메서드에 @Transactional이 붙었다. 따라서 해당 클래스는 AOP 프록시가 적용된다. AOP 프록시가 적용된다는 의미는 프록시 객체가 트랜잭션..
본 글은 다크모드에 최적화되어 있습니다. 스프링에는 데이터 접근 계층(Repository)에서 사용하는 JdbcTemplate과 서비스 계층(Service)에서 사용하는 TransactionTemplated 이 존재합니다. 특별한 기능을 제공하는 것은 아니고 템플릿 콜백 패턴을 사용하여 반복되는 코드를 제거해 줍니다. JdbcTemplate JdbcTemplate은 데이터 접근 계층에서 DB에 접근할 때 반복되는 코드를 제거해 줍니다. 반복되는 코드란 아래의 목록들을 말합니다. 커넥션 조회 및 동기화 PreparedStatement 생성 및 파라미터 바인딩 쿼리 실행 ResultSet으로 결과 바인딩 예외 발생 시 스프링 예외 변환기(DataAccessException) 실행 리소스 종료 위의 목록들 중..