Inflearn brand logo image

인프런 커뮤니티 질문&답변

한현진님의 프로필 이미지
한현진

작성한 질문수

스프링 DB 2편 - 데이터 접근 활용 기술

커스텀aop와 트랜잭션을 같이 사용할때 우선순위에 관한 질문

해결된 질문

작성

·

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에 의해 처리됩니다. 트랜잭션의 적용 순서는 스프링 내부의 포인트컷과 어드바이스 순서에 따라 달라질 수 있습니다.
  • 특정 커스텀 AOP를 추가한다면, @Transactional의 다음에 실행될 수도 있으며, 이를 조정하기 위해서는 @Order 어노테이션을 사용할 수 있습니다.

커스텀 AOP 적용 시 주의점

  • 커스텀 AOP를 트랜잭션보다 먼저 적용해야 하는 경우도 있습니다. 예컨대, 커스텀 AOP에서 특정 조건을 체크해서 메소드 실행을 막거나 데이터를 변형해야 한다면, 트랜잭션 전에 실행되어야 합니다.
  • 순서를 정할 때는 트랜잭션의 목적을 항상 우선 검토해야 합니다. 주요 트랜잭션 관리는 기본적으로 데이터의 일관성을 유지하기 위해 사용되므로 트랜잭션의 전후에 어떤 행동이 필요할지를 고려해야 합니다.

@Repository와 우선순위

  • @Repository는 SQL 체크 예외를 언체크 예외로 변환하는 AOP를 제공합니다. 일반적으로 @Transactional과 독립적으로 작동하며, 우선순위가 AOP 적용에 따라 달라질 수 있습니다.
  • Data Access 예외를 언체크 예외로 변환하는 작업이 먼저 이루어진 후, 그 예외를 기반으로 트랜잭션 처리에 들어가는 구조입니다.

관련된 자세한 논의는 “트랜잭션 관리와 AOP”에 대해 다뤄진 답변을 참고하실 수 있습니다. 추가적으로, 스프링의 내부 메커니즘을 이해하는 데 도움이 될 수 있는 다른 질문들도 참고해 보세요:
- “애노테이션 @Transactional의 위치 질문입니다.”
- “@Transactional 우선권 질문입니다.”

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

한현진님의 프로필 이미지
한현진

작성한 질문수

질문하기