ㅁ 하나의 서비스에 하나의 쿼리만 실행시, 쿼리가 성공적으로 수행되면 자동으로 스프링에서 커밋처리가 된다.
- 그런데 하나의 서비스에 여러 dml문을 수행할 때가 있다.
여러 dml문이 정상적으로 다 완료되었을 때만 커밋이 진행되어야 한다.
중간에 하나라도 예외가 발생하면 rollback해서 모든 dml문들이 취소되어야 한다.
ㅁ 스프링 부트의 경우
- ~ServiceImpl 클래스의 트랜잭션 처리가 필요한 메소드(여러개의 쿼리를 실행하는 메소드)들 위에 @Transactional을 붙인다.
- 각 메소드 위가 아닌 클래스 위에 @Transactional을 붙이면 이 클래스 안의 모든 메소드에 트랜잭션 처리가 적용된다.
ㅁ
- 스프링 부트에서 @Transactional처럼 내장된 AOP 기능을 사용할 때는 별도의 포인트컷 등록이 필요 없다.
- 스프링 트랜잭션 AOP
@Transactional을 사용하는 경우, 스프링이 트랜잭션이 적용될 메소드(즉, 포인트컷)를 자동으로 감지하고 처리합니다.
- 직접 AOP를 구현하는 경우
@Aspect를 사용해서 직접 AOP를 구현하려면 포인트컷을 작성해야 합니다.
결론
- @Transactional 같은 스프링 내장 AOP 기능: 포인트컷 등록 불필요.
- 직접 AOP 구현 (@Aspect 사용): 포인트컷 등록 필요.
ㅁ
- Spring Boot는 @SpringBootApplication 안에 이미 @EnableTransactionManagement가 포함되어 있고, 필요한 트랜잭션 관련 빈들도 자동으로 구성해주기 때문입니다.
ㅁ 트랜잭션 처리가 잘 되는지 확인해보기
- 정상적으로 작동하는 서비스 메소드다.
- 첫번째 쿼리가 실행되고 나서 두번째 쿼리가 실행되기 전에 의도적으로 예외를 발생시켜 본다.
- 두번째 쿼리 실행 전 예외가 발생하여 T_ATTACHMENT 테이블엔 데이터가 insert되지 않았는데, T_EQUIPMENT 테이블엔 데이터가 insert되었다.
- 중간에 하나라도 예외가 발생하면 rollback해서 모든 dml문들이 취소되어야 한다.
- 트랜잭션 처리가 필요한 메소드 위에 @Transactional을 붙였다. 다시 테스트 해본다.
- 아까와 똑같이 첨부파일을 포함한 비품 추가 기능을 이용했으나 T_EQUIPMENT 테이블에도, T_ATTACHMENT 테이블에도 insert되지 않는다. 트랜잭션 처리가 잘 되었다.
'프로젝트 > 파이널프로젝트-대학 행정 그룹웨어' 카테고리의 다른 글
Interceptor로 관리자 권한 체크하기 (0) | 2024.12.01 |
---|---|
스프링 스케줄러를 사용해서 매일 밤 12시에 쿼리 실행하기 (1) | 2024.12.01 |
coolsms로 예약 신청 결과 문자로 전송하기 (0) | 2024.11.30 |
[문제] 예약 내역에서 비품이 안 보임 (0) | 2024.11.27 |
[문제] 나갔다 들어오면 채팅이 안보임 (0) | 2024.11.19 |