소개
게시글
질문&답변
2021.01.29
ValidateDuplicateMember 메소드와 트랜젝션 관련해서 질문입니다.
==============기존 소스코드================= @Service @Transactional(readOnly = true) @RequiredArgsConstructor public class MemberService { ... private void ValidateDuplicateMember(Member member) { List findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } ... } ============================================== 강사님께서는 해당 메서드의 접근지정자를 private으로 하시고 클래스 범위에서 @Transactional(readOnly = true) 애노테이션을 붙이셨는데, ==============변경 소스코드1==================@Service@RequiredArgsConstructor public class MemberService { ... @Transactional(readOnly = true) private void ValidateDuplicateMember(Member member) { List findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } } ... } ========================================== 보시는 것처럼, private 메서드에서 트랜젝션 애노테이션을 붙이면, Methods annotated with '@Transactional' must be overridable 라는 에러가 표시됩니다. ==============변경 소스코드2==================@Service@RequiredArgsConstructor public class MemberService { ... @Transactional(readOnly = true) protected void ValidateDuplicateMember(Member member) { List findMembers = memberRepository.findByName(member.getName()); if (!findMembers.isEmpty()) { throw new IllegalStateException("이미 존재하는 회원입니다."); } } ... } ========================================== 따라서 protected로 변경해주면 에러가 사라지는데, 질문1. 결론은 기존 소스코드에서 처럼 클래스안에 private 메서드가 존재하고 클래스레벨로 트랜잭션 어노테이션을 주었을때 private 메서드에 트랜잭션이 정말 적용되는지 궁금합니다. 음,, 변경 소스코드1 에서 처럼 private 메서드에 트랜잭션 애노테이션을 주면 에러가 나기때문에 이런 궁금증이 생겼습니다. 질문2. 추가적으로, 변경 소스코드2는 protected 로 변경해서 에러를 없앴는데 private 메서드에 트랜잭션 애노테이션을 적용할 때 접근지정자를 이렇게 바꿔서 적용을 해도되는지 궁금합니다. 질문을 너무 난해하게 해서 죄송합니다 ㅜㅜ..
- 2
- 3
- 593
질문&답변
2020.12.31
TestBean 클래스 관련 질문입니다.
귀중한 시간 내주셔서 감사합니다.
- 0
- 3
- 1.2K