살구잼의 여정
article thumbnail

[Section3 - Spring MVC] 트랜잭션(Transaction)

- 트랜잭션이 뭐였는지 기억이 안난다면?

트랜잭션 범위의 영속성 컨텍스트

스프링이나 J2EE 컨테이너 환경에서 JPA를 사용하면 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.

이 전략은 트랜잭션의 범위와 영속성 컨텍스트의 생존 범위가 같다(트랜잭션을 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다는 의미). 그리고 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다. 

이 전략은 트랜잭션이라는 단위로 영속성 컨텍스트를 관리하므로 트랜잭션을 커밋하거나 롤백할 때 문제가 없다. 

유일한 단점은 프리젠테이션 계층에서 엔티티가 준영속 상태가 되므로 지연 로딩을 할 수 없다는 점이다.

OSIV (Open Session In View = 영속성 컨텍스트를 뷰까지 열어둔다는 뜻. 하이버네이트에서 사용하는 용어. 영속성 컨텍스트가 살아있으면 엔티티는 영속 상태로 유지된다.)를 사용하면 이런 문제들을 해결할 수 있다.

* JPA에서는 OEIV (Open EntitiyManager In View)라고 부르나, 관례상 둘다 OSIV라고 한다. 

기존 OSIV는 프리젠테이션 계층에서도 엔티티를 수정할 수 있다는 단점이 있었으나, 스프링 프레임워크가 제공하는 OSIV는 프리젠테이션 계층에서 엔티티를 수정하지 않는다!

 

 

준영속 상태와 지연 로딩

트랜잭션은 보통 서비스 계층에서 시작하므로 서비스 계층이 끝나는 시점에 트랜잭션이 종료되며, 영속성 컨텍스트도 함께 종료된다. 따라서 조회한 엔티티가 서비스와 레포지토리 계층에서는 영속성 컨텍스트에 관리되면서 영속 상태를 유지하지만, 컨트롤러나 뷰 같은 프리젠테이션 계층에서는 준영속 상태가 된다. 

profile

살구잼의 여정

@드림살구잼

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