
안녕하세요. 오늘은 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 |