Backend/Java

Spring - OSIV

개발자의 첫 걸음 2025. 12. 18. 10:00

안녕하세요. 오늘은 OSIV에 대해 알아볼게요.

 

 

 

OSIV

 

OSIV(Open Session(In JPA에선 EntityManager) In View)는 

 

요청이 시작될 때부터 응답이 끝날 때까지 영속성 컨텍스트(Seeeion / EntityManager)를 열어두는 전략으로 

 

컨트롤러(View)에서도 JPA 엔티티를 시용할 수 있게 해주는 기능이에요.

 

 

 

OSIV가 왜 생겼을까?

 

문제의 상황은 예시로 보여드릴게요.

@Controller
public class MemberController {

    @GetMapping("/members")
    public Member getMember() {
        return memberService.findMember();
    }
}

// Service
@Transactional
public Member findMember() {
    return memberRepository.findById(1L).get();
}

// Entity
@ManyToOne(fetch = FetchType.LAZY)
private Team team;

여기서 컨트롤러가 

member.getTeam().getName(); // ❌ 에러 발생

Service 트랜잭션이 끝나면 영속성 컨텍스트 종료를 하고

 

Lazy 로딩 불가(LazyInitializationException)가 발생합니다.

 

이걸 해결하기 위해 만든 것이 OSIV에요.

 

 

 

OSIV = true(기본값)

[요청 시작]
   ↓
영속성 컨텍스트 OPEN
   ↓
Controller → Service → Repository → View
   ↓
영속성 컨텍스트 CLOSE
[응답 완료]

기본값의 특징은 컨트롤러에서도 Lazy Loading 이 가능하고 

 

LazyInitializationException 잘 나지 않아서 초보자도 편하게 이용할 수 있어요.

// Controller에서도 가능
member.getTeam().getName();

 

 

 

OSIV = false

[요청 시작]
   ↓
Controller
   ↓
Service (@Transactional)
   ↓
영속성 컨텍스트 OPEN
   ↓
영속성 컨텍스트 CLOSE
   ↓
Controller
[응답 완료]

이렇게 설정한다면 Service 계층까지만 영속이 되어

// 컨트롤러에서 접근 시
LazyInitializationException ❌

 

컨트롤러에서 Lazy Loding을 할 수 없어요.

 

대신 성능과 안정성이 높아져서 실무에서 선호하는 스타일이에요.

 

 

다음은 OSIV ON vs OFF 비교 표에요.

 

구분 OSIV ON  OSIV OFF
Lazy 로딩 Controller 가능 Service만 가능
DB 커넥션 오래 유지 ❌ 짧게 사용 👍
성능 낮아질 수 있음 좋음
구조 느슨 명확
실무

 

 

 

여기까지 OSIV에 대해 알아봤는데요.

 

OSIV를 활용해 JPA의 동작 원리를 이해해 보는 것은 어떨까요?

'Backend > Java' 카테고리의 다른 글

Spring - security crypto  (0) 2025.12.25
Spring - RestTemplate  (0) 2025.12.23
Spring - interceptor  (1) 2025.12.16
영속성 컨텍스트 (Persistence Context)  (1) 2025.12.14
Spring Boot - Mustache  (0) 2025.12.12