메타코딩 - (스프링부트 강좌 45강(블로그 프로젝트) - 스프링 JPA의 OSIV 전략) 확인!
🔍트랜잭션 이란?
- 일을 처리되기 위한 가장 적은 단위
🔍데이터베이스 격리 수준(Isolation Level) 이란?
- 트랜잭션에서 일관성 없는 데이터를 허용하는 수준
PHANTOM READ (데이터가 보였다 안보였다)
-> 정합성이 깨짐
더보기



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

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



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

🔍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 스프링 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료, 이때 플러시를 호출하는 것이 아니라 바로 종료하게 됨.
'Springboot > Springboot Blog Project' 카테고리의 다른 글
비밀번호 해쉬화(암호화), 스프링 시큐리티 로그인 구현하기 (0) | 2022.09.24 |
---|---|
블로그 프로젝트 전통적인 방식의 로그인 방법 (0) | 2022.09.24 |
Service가 필요한 이유 - 메타 코딩 참조- 수정중 (0) | 2022.09.24 |
Ajax를 사용하는 이유 - 메타코딩 유튜브 요약 (0) | 2022.09.24 |
ajax 통신, 회원가입 구현하기 (0) | 2022.09.24 |