[Spring/TIL] @Transactional를 쓰는 이유

Marryakirise·2024년 1월 8일
1

Spring/TIL

목록 보기
4/5

0. Transactional이 뭘까?

Transaction은 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위를 의미한다. 일반적으로 다음과 같은 질의어(SQL) select, insert, update, delete를 사용해서 데이터베이스에 접근한다.

이때, 작업 단위는 질의어 한 문장이 아니다.

게시판을 예로 들어보자.

  1. 게시판 사용자는 게시글을 작성하고, 올리기 버튼을 누른다.
  2. Insert문을 사용하여 사용자가 입력한 게시글의 데이터를 옮긴다.
  3. 게시판을 구성할 데이터를 다시 select하여 최신 정보로 유지한다.

→ 이때 작업의 단위는 insert문과 select문 둘다를 합친 것이다.

트랜잭션은 안전성을 보장하기 위해 필요한 4가지의 성질, ACID 성질이 있다.

대학교에서 이 내용에 대해 배웠을 때는 별로 중요성을 못 느꼈었는데.. 다들 대학교 수업 잘 들으라고 하는 이유가 있다!

  • 원자성 (Atomicity) : 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것

  • 일관성 (Consistency) : 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다.

  • 독립성 (Isolation) : 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우, 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점을 가리킨다.

  • 지속성 (Durability) : 트랜잭션이 성공적으로 완료됐을 경우, 결과는 영구적으로 반영되어야 한다.


1. @Transactional을 사용하는 이유

이 이유를 알기 위해서는 JPA Dirty Checking 을 알아야한다. 다음을 확인해보자.

https://velog.io/@kirise/SpringTIL-JPA-Dirty-Checking

Dirty Checking은 transaction이 commit될 때 작동한다.
그러므로 transaction이 실행되도록 해줘야하는데, 여기서 @Transactional 어노테이션을 사용한다.

→ Transactional 어노테이션을 붙여주면 Dirty Checking을 하게 되고, 데이터베이스에 commit을 해서 수정된 사항을 save 없이도 반영할 수 있도록 한다!

2. @Transactional(readOnly=true)

✨ 클래스 레벨에는 공통적으로 적용되는 읽기전용 트랜잭션 어노테이션 @Transactional(readOnly = true) 을 선언하고, 추가나 삭제 또는 수정이 있는 작업에는 쓰기가 가능하도록 @Transactional 어노테이션을 메소드에 선언하는 것이 좋다.

1. 조회된 데이터를 return 한다고 해도 의도치 않게 데이터가 변경되는 일을 사전에 방지
2. 엔티티 스냅샷 저장, 더티 체킹 작업을 수행하지 않아 성능 향상
3. DB가 master와 slave로 나누어져 있다면, readOnly=true로 있는 경우에는 읽기 전용으로 master가 아닌 slave를 호출한다. 즉, 상황에 따라 DB 서버의 부하를 줄이고, 약간의 최적화를 할 수 있음
4. 사람들이 직관적으로 보기에 해당 메서드는 READ에 대한 동작만 수행할 것이라고 예상함

참고자료

https://resilient-923.tistory.com/391
https://resilient-923.tistory.com/415

profile
감자의 개발 일기

0개의 댓글

관련 채용 정보