트랜잭션

    [Spring] 트랜잭션 전파 - REQUIRES_NEW 활용하기

    트랜잭션 전파 외부 트랜잭션 수행 중 내부 로직에서 새로운 트랜잭션이 수행되어야 할 때, 이때 두 트랜잭션을 어떻게 처리해야 할지 결정하는 것을 트랜잭션 전파 결정이라고 한다. 이때,기본 옵션인 REQUIRES 옵션은 수행중인 외부 트랜잭션에 내부 트랜잭션을 참가시킨다. 이렇게 되면 외부와 내부 트랜잭션을 각각 논리 트랜잭션이라고 하고, 마지막에 DB에 커밋되거나 롤백되는 하나의 트랜잭션을 물리 트랜잭션이라고 한다. 이렇게 되면 정합성을 보장받을 수 있고, 안정적인 장점이 있지만, 회원 가입을 예로 들면 이런 경우가 있을 수 있다. 회원 가입을 처리하는 로직(MemberService)내에는 회원 가입을 하는 로직(MemberRepository), 로그를 남기는 로직(LogRepository)이 존재한다...

    [Spring] 트랜잭션 - 프록시 내부 호출 문제 1

    @Transactional을 사용하면 스프링의 트랜잭션 AOP가 적용된다. 이는 프록시 방식의 AOP를 사용하는데, 프록시 객체를 스프링 빈으로 주입받아 메서드가 실행되면, 적용 대상인지 아닌지를 프록시 객체가 판단 후에 실제 객체의 메서드를 호출하는 것이다. 만약 대상 객체를 직접 호출하게 되면 AOP가 적용되지 않고, 트랜잭션도 적용되지 않는다. 대상 객체 내부에서 메서드 호출이 발생할 경우, 프록시를 거치지 않고 대상 객체를 직접 호출하는 문제가 발생 할 수 있다. 이 경우 @Transactional이 있어도 트랜잭션이 적용되지 않는다. InternalCallV1Test @Slf4j @SpringBootTest public class InternalCallV1Test { @Autowired Call..

    [Spring] 선언적 트랜잭션 동작 확인하기

    스프링이 제공하는 트랜잭션 추상화를 이용하면, 사용하는 ORM 기술이 변경되어도 동일한 방식으로 트랜잭션을 사용할 수 있다. 스프링이 제공하는 추상 인터페이스 PlatfromTransactionManager를 이용하는 방법은 선언적 트랜잭션: @Transactionl 어노테이션으로 트랜잭션 사용 가능 프로그래밍 방식 트랜잭션: 트랜잭션 관련 코드를 작성하여 트랜잭션 사용 가능 이 있다. 이 중 선언적 트랜잭션을 이용하면 @Transactional 하나만으로 프록시 방식의 AOP가 적용되는데, 어노테이션 하나로 트랜잭션을 관리할 수 있는 만큼, 눈으로 동작 과정을 확인하는 것이 어렵다. 그래서 테스트를 통해 실제 트랜잭션이 적용되고 있는지 알아볼 것이다. TxBasicTest @Slf4j @SpringBo..