티스토리 뷰

728x90
✍ 글을 적는 이유 

회사 업무 중  Controller에 @Transactional(readOnly = false)를 사용하길래 내가 만든 모든 Controller에 @Transactional(readOnly = false) 붙였다. 

또한 @Transactional(readOnly = false)를 붙이지 않으니 오류 메시지가 나와서 스택오버플로우를 보고 붙여야 하는 줄 알았다.

그러나 사수님으로부터 @PatchMapping 에는 (readOnly = false)를 지우고 @Transactional만 사용하라고 했다.

나는 피드백을 듣고 궁금증이 생겨 이 글을 작성하게 되었다.

 

핵심만 볼라면 5번 글을 봐주세요🥹

 

1.  들어가기에 앞서... 트랜잭션 이란?


1. 데이터베이스의 상태를 변경하는 작업의 수행하는 작업의 단위를 뜻한다.

2. 예외 발생시 rollback 처리를 자동으로 수행한다.

3. 쿼리 문중  insert, select, update, delete 등의 동작들의 작업 단위를 트랜잭션이라고 한다.

[트랜잭션의 성질]

- 원자성 

한 트랜잭션 내에서 실행한 작업들은 하나로 간주, 즉 모두 성공 모두 실패 

- 일관성 

트랜잭션은 일관성 있는 데이터베이스 상태를 유지한다.

- 격리성 

동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않아야한다.

- 지속성

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

2. @Transactional 어노테이션


[선언]

@Transactional
public String test() {
...
}

@Transactional은 현재 Spring에서 트랜잭션을 처리하는데 권장하는 방법이다.

@Transactional 어노테이션을 통해 사용하기 쉽고, 읽기 쉽게 만들어준다.

 

[트랜잭션 선언 방법]

스프링에서 간단하게 어노테이션 방식으로 @Transactional을 메소드, 클래스 위에 추가하여 사용한다.

이 방식을 선언적 트랜잭션이라고 한다.

3. @Transactional의 readOnly 속성


- 트랜잭션을 읽기 전용으로 설정하는 속성

- 성능을 최적화 하는데 사용할 수 있다.

- 특정 트랜잭션 작업 안에서 쓰기 작업이 일어나는 것을 의도적으로 방지 하기 위함

- 일반적으로 읽기 전용 트랜잭션이 시작된 이후 INSERT, UPDATE, DELETE 같은 쓰기 작업이 진행되면 예외가 발생 // SELECT는 제외

 

[속성 readOnly = true, readOnly = false ]

@Transactional(readOnly = true)

❗️TRUE를 줄 경우

- true인 경우 INSERT, UPDATE, DELETE 실행 시 예외 발생 

- 예상치 못한 엔티티의 등록(INSERT), 수정(UPDATE), 삭제(DELETE)를 예방하고 성능을 최적화 할 수 있다. 

@Transactional(readOnly = false)

❗️FALSE를 줄 경우

- 기본 설정은 false

- INSERT, UPDATE, DELETE 실행 시 예외 발생하지 않는다.

 

4. ⭐️⭐️⭐️ @Transactional의 예외처리와 성능 향상 방법


❗️어떻게 예외를 처리하고, 성능을 최적화 하는가?

스프링 프레임워크가 하이버네이트 세션 플러시 모드를 MANUAL로 설정한다. 

이렇게 강제로 플러시를 호출하지 않는 한 플러시가 일어나지 않는다. 

즉 트랜잭션을 커밋하더라도 영속성 컨텍스트는 플러시가 되지 않아서 엔티티의 등록, 수정, 삭제가 동작하지 않고

또한 읽기 전용으로, 영속성 컨텍스트는 변경 감지를 위한 스냅샷을 보관하지 않으므로 성능이 향상된다. 

 

플러시란?

영속성 컨텍스트의 변경 내용을 DB 에 반영하는 것을 말한다.

 

- 자세한건 아래 링크를 참고
https://gmlwjd9405.github.io/2019/08/07/what-is-flush.html

 

❓영속성 컨텍스트란?

- 일부 지속성 저장소 ex: 데이터베이스에서 지속될 데이터를 보유하는 엔티티 집합을 처리한다. 

- 지속성 컨텍스트는 데이터를 저장하고 데이터베이스 같은 저장소에 저장될 자격이 있는 개체를 나타낸다.

즉 영구 데이터를 처리하기 위한 개념을 영속성 컨텍스트 함 

 

영속성 컨텍스트는 JPA에 EntityManager에 있으며 Hibernate를 사용하여 내부적으로 구현한 것 

 

5.  결론

 

- SELECT를 다루는 메소드, 클래스 등에 readOnly true 선언 

- INSERT, UPDATE, DELETE 는 readOnly false 선언

- service단에 설정 

 

혹시 잘못된 내용이 있거나 부족한 부분이 있다면 댓글로 피드백 부탁드리겠습니다! 감사합니다.

 

728x90
댓글
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday