YeaLow
article thumbnail

메타코딩 - (스프링부트 강좌 45강(블로그 프로젝트) - 스프링 JPA의 OSIV 전략) 확인!

🔍트랜잭션 이란?

  • 일을 처리되기 위한 가장 적은 단위

트랜잭션을 하나로 묶어서 관리 - 서비스(Service)

🔍데이터베이스 격리 수준(Isolation Level) 이란?

  • 트랜잭션에서 일관성 없는 데이터를 허용하는 수준

트랜잭션이 진행중 셀렉트를 하면 아직 commit이 안되었기 떄문에 undo영역의 임꺽정이 select 된다
commit 하게 되면 undo 영역이 장보고로 변경 됨
트랜잭션이 시작하는 시간이 달랐는데 누군가 커밋을 하면 전에 데이터를 사용하는 사람의 데이터 정합성이 깨진다!

 

PHANTOM READ (데이터가 보였다 안보였다)

-> 정합성이 깨짐

더보기
왼쪽은 T12 오른쪽은 T11 트랜잭션이다

즉 자기 트랜잭션 번호보다 낮은 undo 로그를 보고 select 한다

정합성을 유지하기 위해 @Transaction 사용한다!

 

🔍DB 격리 수준 종류

  • Read Uncommitted
  • Read Commited
  • Repeatable Read
  • Serializable

Read Uncommitted -> Serializable 로 갈수록 격리 수준이 높다.(high)

Serializable -> Read Uncommitted 로 갈수록 격리 수준이 낮다.(low)

 

Read Uncommitted SELECT 문장 수행 시 해당 데이터에 Shared Lock이 걸리지 않는 수준.
아직 커밋되지 않은 트랜잭션 A의 데이터를 B가 SELECT할 수 있음.
Read Commited SELECT 문장이 수행되는 동안 데이터에 Shared Lock이 걸림.
아직 커밋되지 않은 트랜잭션 A의 데이터를 B가 SELECT할 수 없음.
Repeatable Read 트랜잭션 A가 시작되기 전에 커밋된 내용까지만 조회 가능.
자신의 트랜잭션보다 낮은 트랜잭션에서 커밋된 것만 읽는다.
Serializable 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당되는 영역에 대한 수정 및 입력 불가.
완벽한 LOCK을 건다.

 

🔍스프링부트의 전통적인 트랜잭션

  • 세션의 시작은 서블릿이 시작되는 시점부터 (세션은 영속성 컨텍스트를 포함한다.)
  • 트랜잭션의 시작은 서비스 레이어부터, JDBC 커넥션 또한 이 시점부터.
  • 트랜잭션의 종료는 서비스 계층에서 종료, JDBC 커넥션 또한 이 시점부터 종료.
  • 세션은 컨트롤러 영역까지 끌고 가기 때문에 영속성이 보장되어 select가 가능해지고 lazy-loading이 가능해진다.

더보기
전통적인 스프링부트 방식
예전 방식
타이밍이 짧아 진다

 

Eager 로딩시
서비스쪽으로 넘어가면 1차캐시의 이대호 롯데팀은 비영속 상태가 된다!
Lazy 로딩시!
프록시 객체를 들고와서 다시 JDBC 커넥션을 통해 롯데팀 정보를 받아 올 수 있다

 

즉! OSIV 로 사용시
처음 리퀘스트 시작 - 세션이 시작된다. (영속성 컨텍스트가 먼저 로딩된다)

🔍스프링 JPA의 OSIV 전략?

  • OSIV(Open Session In View)는 영속성 컨텍스트를 뷰까지 열어두는 기능임.
  • 영속성 컨텍스트가 유지될 경우 엔티티도 영속 상태로 유지됨.
  • JPA에서는 OEIV(Open EntityManager In View), Hibernate에서는 OSIV라고 부른다.

 

🔍OSIV 동작 원리

스프링프레임워크 OSIV는 비즈니스 계층에서 트랜잭션을 사용하는 OSIV임. 영속성 컨텍스트는 사용자의 요청 시점에 생성되지만 데이터를 쓰거나 수정할 수 있는 트랜잭션은 비즈니스 계층에서만 사용하도록 트랜잭션이 일어난다.

  • 클라이언트 요청이 들어오면 서블릿 필터 or 스프링 인터셉터에서 영속성 컨텍스트를 생성하는데 이 시점에서 트랜잭션은 시작하지 않음!
  • 서비스 계층에서 @Transeactional로 트랜잭션을 시작 시 위에서 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작함.
  • 서비스 계층이 끝나면 트랜잭션을 커밋하고 영속성 컨텍스트를 플러시함. -> 이 시점에 트랜잭션은 종료되지만 영속성 컨텍스트는 종료되지 않음.
  • 컨트롤러, 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지하게 됨.
  • 서블릿 필터 or 스프링 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료, 이때 플러시를 호출하는 것이 아니라 바로 종료하게 됨.
profile

YeaLow

@YeaLow

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!