해결된 질문
작성
·
57
0
트랜잭션도 @Transactional을 사용하면 일종의 aop로 작동하지 않습니까?
@Transactional은 그러면 우선순위가 어느정도인지 궁금합니다.
그리고 커스텀aop를 적용할때 트랜잭션보다 먼저 적용해야하는 건지도 궁금합니다.
그리고 @Repository를 사용하면 sql 체크 예외를 DataAccess 언체크 예외로 바꿔주는 aop가 있다는데, 그러면 @Repository가 @Transactional보다 우선순위가 낮아야지 언체크 예외로 변한 예외를 보고 트랜잭션이 롤백을 할텐데, 그러면 Repository는 무조건 Transactional 보다 우선순위가 낮게 만들어진건지도 궁금합니다.
답변 2
1
안녕하세요. 한현진님
@Transactional은 Ordered.LOWEST_PRECEDENCE를 가져서, 다른 우선순위가 지정된 AOP들에 비해 상대적으로 안쪽 레이어에서 동작하는 것이 기본 전략입니다. 따라서 다른 AOP보다 가장 늦게 시작됩니다. 이렇게 설정한 이유는 예를 들어, 로깅, 인증, 입력값 검증 등의 대부분의 공통 로직 AOP는 트랜잭션이 실행되기 전에 수행되어야 합니다.
만약 트랜잭션 경계 내부에서 특정 AOP 로직을 적용해야 한다면, 그 로직은 AOP보다는 해당 트랜잭션 메소드 내의 일반 호출이나 다른 컴포넌트로 분리하는 것이 더 명확한 설계일 수 있습니다.
트랜잭션 커밋/롤백 이후에 특정 동작을 수행해야 한다면 (예: 이벤트 발행, 알림 전송), AOP 우선순위로 해결하기보다는 @TransactionalEventListener를 사용하는 것이 권장됩니다. 이는 트랜잭션의 특정 생명주기(예: AFTER_COMMIT, AFTER_ROLLBACK)에 맞추어 동작합니다.
추가로 @Repository를 사용하면 sql 체크 예외를 DataAccess 언체크 예외로 바꿔주는 aop는 크게 고민하지 않아도 괜찮습니다. 왜냐하면 적용하는 계층이 다르기 때문입니다.
보통 @Transactional 은 Service 계층(비즈니스 로직)에 붙인다.
@Repository 의 예외 변환 AOP는 DAO/Repository 계층 빈(=다른 프록시)에 붙는다.
Service → Repository 호출이 이뤄질 때 이미 트랜잭션은 열려 있으므로,
Repository 안쪽에서 발생한 SQLException → DataAccessException 변환이 끝난 뒤 예외가 Service 프록시의 트랜잭션 어드바이스로 전파된다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴입니다. 한현진님.
스프링 프레임워크에서 @Transactional
은 AOP(Aspect Oriented Programming)의 한 형태로 동작합니다. 이 어노테이션은 메소드 실행 전후에 트랜잭션을 관리하며, 롤백을 자동으로 처리합니다.
@Transactional
의 우선순위@Transactional
은 기본적으로 스프링의 트랜잭션 관리 AOP에 의해 처리됩니다. 트랜잭션의 적용 순서는 스프링 내부의 포인트컷과 어드바이스 순서에 따라 달라질 수 있습니다.@Transactional
의 다음에 실행될 수도 있으며, 이를 조정하기 위해서는 @Order
어노테이션을 사용할 수 있습니다.@Repository
와 우선순위@Repository
는 SQL 체크 예외를 언체크 예외로 변환하는 AOP를 제공합니다. 일반적으로 @Transactional
과 독립적으로 작동하며, 우선순위가 AOP 적용에 따라 달라질 수 있습니다.관련된 자세한 논의는 “트랜잭션 관리와 AOP”에 대해 다뤄진 답변을 참고하실 수 있습니다. 추가적으로, 스프링의 내부 메커니즘을 이해하는 데 도움이 될 수 있는 다른 질문들도 참고해 보세요:
- “애노테이션 @Transactional의 위치 질문입니다.”
- “@Transactional 우선권 질문입니다.”
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
감사합니다!!