OSIV

Gunjoo Ahn·2023년 9월 15일
0
post-custom-banner

OSIV

Open Session In View의 약자로 영속성 컨텍스트를 뷰까지 열어둔다는 뜻이다. 영속성 컨텍스트가 살아있으면 엔티티는 영속상태로 유지된다. 따라서 뷰에서도 지연 로딩을 사용할 수 있다.

OSIV는 하이버네이트에서 사용하는 용어로, JPA에서는 OEIV(Oepn EntityManager In View)라 한다. 하지만 관례상 OSIV로 부른다.

뷰에서 지연 로딩이 필요한가?

뷰에서 지연 로딩을 할 수 없다면, 애초에 모든 필요한 정보를 DTO를 통하여 반환해주거나 FACADE 계층을 두어 반환해주어야 한다.

단순한 조회이기에 JPA Entity를 그대로 사용 가능함에도 불구하고 거의 똑같은 DTO 클래스를 만들거나 FACADE를 적용할 경우 단순한 위임 메소드들이 많아지게 된다.

따라서 OSIV를 사용하여 세션(엔티티 메니저)를 뷰 레벨까지 열어두어 지연 로딩을 할 수 있도록 한다면 이러한 단순 코딩 작업들이 확연하게 줄어들 것이다.

다만 뷰 레벨에서는 뷰라는 이름에 걸맞게 조회만 가능하도록 하여야 어플리케이션 유지 보수에 어려움이 없다. 스프링 프레임워크에서는 뷰 레벨에서 엔티티를 수정하지 않도록 기능을 제공한다.

스프링 OSIV

비즈니스 계층에서 트랜잭션을 사용하는 OSIV

  • 영속성 컨텍스트를 프리젠테이션 계층까지 유지한다.
  • 프리젠테이션 계층에는 트랜잭션이 없으므로 엔티티를 수정할 수 없다.
  • 프리젠테이션 계층에는 트랜잭션이 없지만 트랜잭션 없이 읽기를 사용해서 지연 로딩을 할 수 있다.

스프링 OSIV 주의 사항

class MemberController {
	public String viewMember(Long id){
		Member member = memberService.getMember(id);
        member.setName("XXX"); // 1
        
        memberService.biz(); // 2
        return "view";
	}
}

class MemberService {
	// 3. AOP 트랜잭션 시작 
	// 5. AOP 나오면서 flush -> member name "XXX" 반영
	@Transactional
    public void biz() {
        // 4. ... 비즈니스 로직
    }
}

스프링 OSIV는 같은 영속성 컨텍스트를 여러 트랜잭션이 공유할 수 있으므로 이런 문제가 발생한다. OSIV를 사용하지 않는 트랜잭션 범위의 영속성 컨텍스트 전략은 트랜잭션의 생명주기와 영속성 컨텍스트의 생명주기가 같으므로 이런 문제가 발생하지 않는다.

같은 영속성 컨텍스트를 여러 트랜잭션이 공유할 수 있다는 점을 주의하자.

특히 롤백 시 주의해야한다.

Reference

자바 ORM 표준 JPA 프로그래밍 13장

profile
Backend Developer
post-custom-banner

0개의 댓글