[TIL] Transactional

정석·2024년 8월 30일

TIL

목록 보기
31/40
post-thumbnail

일정 관리 서버 프로젝트 → 해당 프로젝트를 내용을 회고하며 작성합니다.

프로젝트 중 DB 로직을 활용하는 Service 에서 데이터의 영속성 관리를 위해 Transactional 를 활용했다. 코드상에서 보면 다음과 같다.


해당 서비스에서 실행되는 메서드 전부 전이되도록 class 위에 선언을 했지만, 이는 여러 문제를 발생시킬 수 있다는 걸 알게 되었다.해당 문제를 알게 되어 간 과정을 작성해 본다.

Transactional 이란?

  • 데이터베이스의 상태를 변경하는 작업 또는 한 번에 수행되어야 하는 연산들
  • 커밋을 수행하며 예외 발생 시 rollback 처리도 수행한다.

따라서 네 가지의 특성을 가진다.

  1. 원자성 → 하나의 트랜잭션 안에서 실행한 작업들은 하나의 단위로 처리한다. (모두 성공 또는 모두 실패)

  2. 일관성 → 일관성 있는 데이터베이스 상태를 유지한다.

  3. 격리성 → 동시에 실행되고 있는 트랜잭션들이 서로 영향을 받지 않도록 격리한다.

  4. 영속성 → 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.

결국 여러줄 로직이 이어진 코드에서 뭔가 예외가 발생하여 실행 흐름이 끊긴다면 그 직전까지 진행했던 쿼리문 또는 DB 변경 내용들이 커밋되지 않고 되돌아가게 도와준다. 나 또한 이런 기능을 위해 사용했다.


하지만, Transactional 를 선언하면 하나의 트랜잭션이 생겨 관리된다. 따라서 나처럼 클래스 단위에 묶게 되면 클래스 전체에 하나의 트랜잭션만 생기게 되는 거다.

그렇다면, 만약 해당 클래스에 하나의 요청이 아닌 다수의 요청이 들어온다면? 트랜잭션 내에서 값을 정확히 전달하지 못할 것이다.

따라서 DB 접근이 필요한 부분에 각각 Transactional 를 설정해줘야 했다.

다음과 같다.

생성 또는 수정되는 로직이 수행되는 메서드에만 각각 설정해준다.


@Transactional(readOnly = true)

위와 같이 설정을 바꿔 준 이후 readOnly 기능을 알게 되었다.

단어 그대로 '읽기만 수행' 한다는 의미이다.

  1. 읽기만 수행한다면 ? -> 영속성 컨텍스트는 변경감지(Dirty Checking) 을 하지 않게 되고 이를 통해 성능향상 측면에 이점을 주게 된다.

  2. 개발자로하여금 '조회 메서드' 라는 의미를 알게 되어 가독성이 향상된다.

  3. Replication 방식에서 부하 분산을 해결할 수 있다.
    래플리케이션 방식에선 readOnly = true 설정이 된 메서드는 무조건 Slave DB내에서 수행하기 때문에 트래픽을 분산시킨다.


참고 블로그

https://hungseong.tistory.com/74

https://velog.io/@kdhyo/JavaTransactional-Annotation-%EC%95%8C%EA%B3%A0-%EC%93%B0%EC%9E%90-26her30h

0개의 댓글