본문 바로가기

JPA

13.3 OSIV

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

 

13.3.1 과거 OSIV: 요청당 트랜잭션

OSIV의 핵심은 뷰에서도 지연로딩이 가능하도록 하는 것이다. 가장 단순한 구현방법은 클라이언트의 요청이 들어오자마자 서블릿 필터나 스프링 인터셉터에서 트랜잭션을 시작하고 요청이 끝날 때 트랜잭션도 끝나는 것이다. 이것을 요청당 트랜잭션 방식의 OSIV라 한다.

 

- 요청당 트랜잭션 방식의 문제점

- 컨트롤러나 뷰 같은 프리젠테이션 계층이 엔티티를 변경할 수 있다는 점이다.

 

- 엔티티를 읽기 전용 인터페이스로 제공

- 엔티티 수정 불가능

interface MemberView {
   public String getName();
}

@Entity
class Member implements MemberView {
}

class MemberService {

   public MemberView getMember(id) {
      return memberRepository.findById(id);
   }
}

 

- 엔티티 레핑

- member 엔티티의 읽기 메소드만 제공한다.

class MemberWrapper {
   private Member member;
   
   public MemberWrapper(member) {
     this.member = member;
   }
  
   //읽기 전용 메소드만 제공
   public String getName() {
      member.getName();
   }
}

- DTO만 반환

- 가장 전통적인 방법

- 프리젠테이션 계층에 엔티티 대신에 DTO를 전달하는 방법

- OSIV를 사용하는 장점을 살릴 수 없고 엔티티를 거의 복사한 듯한 DTO 클래스도 하나 더 만들어야한다.

class MemberDTO {

 private String name;
 
 //getter, setter
}

MemberDTO memberDTO = new MemberDTO();
memberDTO.setName(member.getName());
return memberDTO;

 

'JPA' 카테고리의 다른 글

13.3.3 OSIV 정리  (0) 2021.01.29
13.3.2 스프링 OSIV : 비즈니스 계층 트랜잭션  (0) 2021.01.29
13.2.4 FACADE 계층 추가  (0) 2021.01.29
13.2.2 JPQL 페치조인  (0) 2021.01.29
13.2.1 글로벌 페치 전략 수정  (0) 2021.01.29