작성
·
339
2
안녕하세요, 강사님.
해당 강의 관련 질문이 있어 질문드립니다.
1. 해당 강의 마지막 부분에서 'public이 아닌 곳에 @Transactional이 붙어있는 경우 예외가 발생하지 않고 트랜잭션 적용만 무시된다.'를 설명해주셨는데요, 이 말이 '@Transactional을 '비즈니스 시작점(외부 트랜잭션)'에 걸 때 그 메서드의 제어자가 private일 경우 예외가 발생하지 않고 트랜잭션 적용이 무시된다.'를 말씀하시는 것인가요? 즉, 내부 트랜잭션은 제어자가 어떻든 관련이 없다인가요?
아래 질문부터는 1번 질문이 맞다고 가정하고 질문드립니다.
예를 들어, 한 클래스 내에 다음의 3개 메서드가 있고,
A 메서드(public, @Transactional 붙음)
B, C 메서드(모두 private)
A 메서드 내에 B와 C 메서드를 각각 호출하는 로직이 존재하고, C 메서드 내에 B 메서드를 호출하는 로직이 존재한다고 할 경우
2. A메서드가 비즈니스 로직의 시작점이기 때문에 B, C 메서드가 기존의 트랜잭션에 참여하는 형태를 가진다고 봐도 될까요?
3. B와 C 메서드 사이에 호출이 일어나게 되는 경우 이미 논리적으로 하나의 트랜잭션(A, B, C)에 속해있기 때문에 B와 C의 제어자를 private으로 그대로 두어도 괜찮을까요?
4. 호출 관계가 복잡해 함수를 각각의 클래스로 나눈다면, 기존의 B, C 함수(이제는 클래스)를 다룰 때는 @Transactional을 어떻게 적용해야 할까요?
저는 비즈니스 시작점인 A 클래스에 @Transactional을 남기고, B, C 클래스에는 두 클래스 사이에 호출이 일어나기에 @Transactional(REQUIRES_NEW) 옵션을 주는 식으로 작성했는데요,
이미 논리적으로 하나의 트랜잭션으로 묶여있는데 굳이 REQUIRES_NEW 옵션을 주는 건 트랜잭션을 과도하게 설정한 것이 아닌가 생각하게 되어 해당 질문을 남기게 되었습니다.
답변 1
2
안녕하세요. comingsoon님^^
간단하게 답변을 드릴께요. 다음 2가지만 기억하시면 됩니다.
1. public 메서드에만 트랜잭션이 적용됩니다.
2. 외부 호출인 경우에만 트랜잭션이 적용됩니다.
이것을 기반으로 생각하신 부분을 직접 코드로 테스트해보시면 이해가 되실꺼에요.
추가로 REQUIRES_NEW는 아주 특별한 경우가 아니면 사용하지 않는 것이 좋습니다.
감사합니다.