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