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 |