본문 바로가기
프로젝트/파이널프로젝트-대학 행정 그룹웨어

스프링 부트 프로젝트에 AOP로 트랜잭션 처리하기

by moca7 2024. 12. 2.

 

 

 

 하나의 서비스에 하나의 쿼리만 실행시, 쿼리가 성공적으로 수행되면 자동으로 스프링에서 커밋처리가 된다.

- 그런데 하나의 서비스에 여러 dml문을 수행할 때가 있다.

여러 dml문이 정상적으로 다 완료되었을 때만 커밋이 진행되어야 한다.

중간에 하나라도 예외가 발생하면 rollback해서 모든 dml문들이 취소되어야 한다.

 

 

 

ㅁ 스프링 부트의 경우

- ~ServiceImpl 클래스의 트랜잭션 처리가 필요한 메소드(여러개의 쿼리를 실행하는 메소드)들 위에 @Transactional을 붙인다.

- 각 메소드 위가 아닌 클래스 위에 @Transactional을 붙이면 이 클래스 안의 모든 메소드에 트랜잭션 처리가 적용된다. 

 

 

 

ㅁ 

- 스프링 부트에서 @Transactional처럼 내장된 AOP 기능을 사용할 때는 별도의 포인트컷 등록이 필요 없다.

- 스프링 트랜잭션 AOP

@Transactional을 사용하는 경우, 스프링이 트랜잭션이 적용될 메소드(즉, 포인트컷)를 자동으로 감지하고 처리합니다.

- 직접 AOP를 구현하는 경우 

@Aspect를 사용해서 직접 AOP를 구현하려면 포인트컷을 작성해야 합니다.

 

결론

  1. @Transactional 같은 스프링 내장 AOP 기능: 포인트컷 등록 불필요.
  2. 직접 AOP 구현 (@Aspect 사용): 포인트컷 등록 필요.

 

- Spring Boot는 @SpringBootApplication 안에 이미 @EnableTransactionManagement가 포함되어 있고, 필요한 트랜잭션 관련 빈들도 자동으로 구성해주기 때문입니다.

 

 

 

 

 

 

ㅁ 트랜잭션 처리가 잘 되는지 확인해보기

 

 

 

 

- 정상적으로 작동하는 서비스 메소드다.

 

 

 

 

 

 

- 첫번째 쿼리가 실행되고 나서 두번째 쿼리가 실행되기 전에 의도적으로 예외를 발생시켜 본다.

 

 

 

 

 

 

 

 

- 두번째 쿼리 실행 전 예외가 발생하여 T_ATTACHMENT 테이블엔 데이터가 insert되지 않았는데, T_EQUIPMENT 테이블엔 데이터가 insert되었다.

- 중간에 하나라도 예외가 발생하면 rollback해서 모든 dml문들이 취소되어야 한다.

 

 

 

 

 

 

- 트랜잭션 처리가 필요한 메소드 위에 @Transactional을 붙였다. 다시 테스트 해본다.

 

- 아까와 똑같이 첨부파일을 포함한 비품 추가 기능을 이용했으나 T_EQUIPMENT 테이블에도, T_ATTACHMENT 테이블에도 insert되지 않는다. 트랜잭션 처리가 잘 되었다.