-
@Transactional 애너테이션에 대하여스터디 노트 2023. 12. 4. 13:09
스프링 프레임워크에선 데이터베이스 트랜잭션 기능을 사용할 수 있는 Transactional 애너테이션을 제공합니다.
이 애너테이션은 JPA가 아닌 스프링 프레임워크에서 제공하는 기능입니다.
트랜잭션은 영속성 프레임워크의 종류와 상관없는 관계형 데이터베이스의 기능이기 때문에 JPA/Hibernate도 결국 SQL쿼리로 데이터를 영속하므로 트랜잭션을 사용할 수 있지요.
다음은 Transactional 애너테이션 코드입니다.@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { ... }
Transactional 애너테이션은 기본적으로 스프링 AOP 기반으로 동작됩니다.
스프링 AOP에는 CGLIB Proxy모드와 AspectJ 모드가 있습니다.
Transactional 애너테이션은 Proxy 모드가 기본이므로 다음과 같이 프록시 객체가 생성되어 트랜잭션을 처리합니다.이와 관련하여 PlatformTransactionManager 클래스는 트랜잭션을 시작하고 커밋하고 롤백하는 메서들르 제공하는 클래스입니다. 이를 직접 개발자가 구현하면 @Transactional 애너테이션 없이도 트랜잭션을 구현할 수 있죠.
하지만 AOP로 처리하는 것이 월등하게(x10000) 편리합니다.
@Transactional 애너테이션을 사용하면 스프링 프레임워크는 TransactionIntercepter 객체를 생성하고 AOP 프록시 객체로 전달을 하며 AOP 프록시 객체는 TransactionIntercepter 객체를 사용해 트랜잭션 기능을 처리합니다.
@Transactional 애너테이션의 경우 Repository가 아니라 Service의 메서드나 클래스에 선언하는 것이 일반적입니다.
서비스의 경우 개발된 유즈케이스를 구현하거나 하나 이상의 여러 데이터를 처리하는 복합적인 기능을 제공하는 것이 대부분입니다.
하나의 유즈케이스를 처리하기 위해 여러 테이블을 비즈니스적으로 조회하고 데이터를 조작하는 쿼리들이 다양하게 발생하게 되기 때문에 서비스 레이어에서 @Transactional을 선언해주는 것이 적합합니다.
애플리케이션에서 트랜잭션을 시작한 후 에러나 예외가 발생하면 그 뒤에 남은 데이터 처리 작업을 실행할 수 없으므로 롤백해야 합니다. 스프링 프레임워크의 기본 설정으로 Unchecked Exception이 발생하면 프레임워크는 진행 중이던 트랜잭션을 자동 롤백합니다.
그러므로 @Transactional 애너테이션 사용 시마다 rollbackFor 속성을 설정하지 않아도 됩니다.
또한 @Transactional(rollbackFor=Throwable.class)처럼 설정하지 않아도 Unchecked Exception에 대해 트랜잭션을 롤백합니다.
이렇다는 것은, Checked Exception의 경우엔 스프링 프레임워크가 롤백을 하지 않는다는 말이 되겠죠.
그러므로 Checked Exception의 경우 트랜잭션을 롤백해야 한다면 위에 언급된 rollbackFor 속성을 명시적으로 선언해주어야 합니다.
'스터디 노트' 카테고리의 다른 글
Optional, 그렇게 쓸꺼야🤔? (1) 2023.12.05 @Transactional 사용 시 주의해야 할 사항들 (1) 2023.12.04 Java에서 Serializable은 무엇일까? 직렬화 vs 역직렬화 (1) 2023.12.04 Aspect Oriented Programming(AOP) 에 대하여 (0) 2023.11.23 모놀리식 아키텍쳐 vs 마이크로 서비스 아키텍쳐 (Monolithic Architecture vs Micro Service Architecture) (1) 2023.11.23