트랜잭션 AOP 주의 사항 - 초기화 시점
2022. 8. 23. 13:54
데이터 접근 기술/스프링 트랜잭션
스프링 초기화 시점에는 트랜잭션 AOP가 적용되지 않을 수 있다. 예제 코드를 보자 package hello.springtx.apply; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.TestConfigurat..
트랜잭션 AOP 주의 사항 - 프록시 내부 호출2
2022. 8. 23. 13:27
데이터 접근 기술/스프링 트랜잭션
메서드 내부 호출 때문에 트랜잭션 프록시가 적용되지 않는 문제를 해결하기 위해 internal() 메서드를 별도의 클래스로 분리하자. InternalCallV2Test package hello.springtx.apply; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.conte..
트랜잭션 AOP 주의 사항 - 프록시 내부 호출1
2022. 8. 23. 12:06
데이터 접근 기술/스프링 트랜잭션
@Transactional 을 사용하면 스프링의 트랜잭션 AOP가 적용된다. 트랜잭션 AOP는 기본적으로 프록시 방식의 AOP를 사용한다. 앞서 배운 것 처럼 @Transactional 을 적용하면 프록시 객체가 요청을 먼저 받아서 트랜잭션을 처리하고, 실제 객체를 호출해준다. 따라서 트랜잭션을 적용하려면 항상 프록시를 통해서 대상 객체(Target)을 호출해야 한다. 이렇게 해야 프록시에서 먼저 트랜잭션을 적용하고, 이후에 대상 객체를 호출하게 된다. 만약 프록시를 거치지 않고 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 트랜잭션도 적용되지 않는다. AOP를 적용하면 스프링은 대상 객체 대신에 프록시를 스프링 빈으로 등록한다. 따라서 스프링은 의존관계 주입시에 항상 실제 객체 대신에 프록시..
트랜잭션 적용 위치
2022. 8. 23. 01:07
데이터 접근 기술/스프링 트랜잭션
이번시간에는 코드를 통해 @Transactional 의 적용 위치에 따른 우선순위를 확인해보자. 인터페이스와 해당 인터페이스를 구현한 클래스에 애노테이션을 붙일 수 있다면 더 구체적인 클래스가 더 높은 우선순위를 가진다. TxLevelTest package hello.springtx.apply; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.co..
트랜잭션 적용 확인
2022. 8. 22. 21:52
데이터 접근 기술/스프링 트랜잭션
트랜잭션 적용 확인 @Transactional 을 통해 선언적 트랜잭션 방식을 사용하면 단순히 애노테이션 하나로 트랜잭션을 적용할 수 있다. 그런데 이 기능은 트랜잭션 관련 코드가 눈에 보이지 않고, AOP를 기반으로 동작하기 때문에, 실제 트랜잭션이 적용되고 있는지 아닌지를 확인하기가 어렵다. 스프링 트랜잭션이 실제 적용되고 있는지 확인하는 방법을 알아보자. TxApplyBasicTest package hello.springtx.apply; import lombok.extern.slf4j.Slf4j; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.aop.support...