스프링 부트 프로젝트를 하던 도중 Service 클래스에서 @Transactional 사용에 옵션을 설정할 수 있다는 것을 처음 알았다.
옵션을 한번 추가해보라는 피드백을 받고 한번 이 에너테이션에 대해 알아보기로 했다.
프로그램 성능에 직접적인 영향을 끼칠 수도 있는 중요한 옵션이기 때문에 한번 정리를 해보겠다.
트랜잭션(Transaction)의 정의
데이터 베이스의 상태를 변경할 때, 한번에 수행되어야 하는 연산
트랜잭션 ACID 성질
- 원자성(Atomicity) : 트랜잭션이 DB에 모두 반영되거나, 전혀 반영되지 않거나 해야한다.
- 일관성(Consistency) : 트랜잭션은 일관성 있는 DB 상태를 유지해야한다. 작업 처리의 결과가 항상 일관되어야 함.
- 독립성(Isolation) : 동시에 실행되는 트랜잭션은 서로에게 영향을 끼치지 않는다.
- 지속성(Durablity) : 성공적으로 완료된 트랜잭션은 DB에 영구적으로 보존되어야 함.
스프링 트랜잭션
스프링에서는 에너테이션 방식으로 @Transactional을 추가하여 사용한다.
이를 선언적 트랜잭션
=> 적용된 범위에서 트랜잭션 기능이 포함된 프록시 (대리자) 객체가 생성되어 자동으로 Commit & Rollback 진행
근데 Select는..??
=> 이런 읽기 전용 쿼리도 Transactional이 필요한걸까?
=> @Transactional(readOnly = true) 사용 추천함
써주는 게 좋다!
1. 데이터가 변경되는 일을 사전에 방지한다.
2. CUD 작업을 실행하지 않고, 스냅샷 저장 및 변경 감지(Dirty check) 의 작업을 수행하지 않아 성능이 향상된다.
=> Dirty Check : 상태 변경 검사=> 영속성 컨텍스트와 이어진다.
3. 상황에 따라 DB 서버의 부하를 줄이고 약간의 최적화가 가능하다
4. 해당 에너테이션이 있따면 코드를 직관적으로 이해 가능하다. (Read 동작만 수행하는구나~)
이제부터는 read 쿼리도 해당 에너테이션을 적극 사용하자~
반응형
'📕 Spring Framework > Spring 개념 정리' 카테고리의 다른 글
WebFlux는 무엇이고, 왜 나왔고, 언제 쓰이는가? (0) | 2022.08.31 |
---|---|
Spring Security [2] - 예외 처리 AuthenticationEntryPoint & AccessDeniedHandler (0) | 2022.08.21 |
Spring Security [1] - JWT를 이용한 REST API 인증과 인가 (0) | 2022.08.18 |
2022.05.13 「Session과 Token(Jwt) & 인증과 인가」 (0) | 2022.05.13 |
2022.05.08 「RestFul한 api? & ResponseEntity의 사용」 (0) | 2022.05.08 |