Files
llm-wiki/raw/official-docs/persistence-osiv-antipattern-hibernate-vladmihalcea.md

9.9 KiB

title, source_type, status, confidence, url, archive_url, tags, related_branches, related_projects, created, last_reviewed
title source_type status confidence url archive_url tags related_branches related_projects created last_reviewed
OSIV (Open Session In View) anti-pattern — Hibernate User Guide + Vlad Mihalcea official-doc raw medium https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#transactions
ca-persistence-failure
hibernate
jpa
osiv
lazy-loading
anti-pattern
official-doc
feature-persistence-failure-baseline
feature-architecture-enforcement-rules
ca-skeleton-operational-contract
2026-05-22 2026-05-27

OSIV anti-pattern (Hibernate User Guide + Vlad Mihalcea)

Layer: raw/official-docs/ — Hibernate ORM User Guide + Vlad Mihalcea 의 OSIV anti-pattern 글 발췌. ca-tmpl persistence baseline 의 "OSIV off 가 기본" 결정의 외부 근거.

Parent / 활용 branch (필수)

Branch 이 자료가 정당화하는 결정
raw/branch-notes/feature-persistence-failure-baseline "OSIV off 가 baseline default" 결정의 외부 근거 — view rendering 중 connection 점유로 인한 pool 고갈 / latency 증가 회피
raw/branch-notes/feature-architecture-enforcement-rules "presentation layer 에서 DB 접근이 발생하면 계약 위반" 이라는 architecture rule 의 정당화 — service layer 에서 fetch graph 명시 강제

특정 branch 없이 foundational 조사로 수집한 경우:

컨텍스트 / 왜 저장했는지

ca-tmpl persistence baseline 의 핵심 결정 "OSIV 는 off 가 기본" 에 대한 외부 근거. presentation 에서 lazy loading 이 발생하면 계약 위반인 이유를 공식 / 권위 있는 출처로 확보.

출처 / Source

  • 원본 URL: https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html#transactions (Hibernate ORM User Guide — Transactions / Session management)
  • 보조 URL: https://vladmihalcea.com/the-open-session-in-view-anti-pattern/ (Vlad Mihalcea — Hibernate developer advocate, OSIV anti-pattern 글)
  • 아카이브 URL: (미수집)
  • 저자 / 조직: Red Hat / Hibernate team; Vlad Mihalcea (Hibernate developer advocate, In Relation To 블로그 / Hibernate Performance 책 저자)
  • 발행일: rolling docs / 블로그 게재 후 갱신
  • 마지막 확인일: 2026-05-27 (WebFetch 시 vladmihalcea.com 및 hibernate.org 양쪽 모두 본 세션에서 permission denied — 인용은 원본 frontmatter 보존, 재검증 후속 라운드 필요)
  • 보조 자료: Spring Boot spring.jpa.open-in-view 기본값 true 에 대한 startup warning 코드 (JpaBaseConfiguration source)

핵심 인용 / Key quotes (verbatim — 원본 frontmatter 보존)

[Vlad Mihalcea, "The OpenSessionInView Anti-Pattern"] "Open Session in View (OSIV) is an anti-pattern. While it solves the LazyInitializationException, it does so by extending the database connection (and the JDBC transaction) until the view is rendered."

[Vlad Mihalcea] "Holding the database connection during the view rendering is a serious performance issue. It increases the time the connection is taken from the pool, which can cause connection exhaustion under load."

[Vlad Mihalcea] "Statements issued during the view layer are auto-committed, breaking the read-your-writes consistency and bypassing the service layer transaction boundary."

[Spring Boot — JpaBaseConfiguration 의 startup WARN log] "spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning."

Claims Extracted / 추출된 주장

Claim ID Claim (이 자료가 직접 말하는 것) Evidence quote Strength Applies to Does not prove
OSIV-AP-C1 OSIV 는 LazyInitializationException 을 해결하는 대신 view rendering 까지 DB connection 과 JDBC transaction 을 연장하는 방식이며, Vlad Mihalcea 는 이를 anti-pattern 으로 명명 [Vlad Mihalcea] "Open Session in View (OSIV) is an anti-pattern. While it solves the LazyInitializationException, it does so by extending the database connection (and the JDBC transaction) until the view is rendered." engineering-blog Hibernate / JPA + view layer (Thymeleaf, JSP, REST serializer 등) "공식 Hibernate 문서가 OSIV 를 명시적으로 anti-pattern 으로 deprecate 했다" 는 뜻은 아님 — Vlad Mihalcea 는 Red Hat / Hibernate developer advocate 이지만 본 글은 그의 개인 블로그
OSIV-AP-C2 view rendering 동안 connection 을 점유하면 pool 점유 시간이 증가하고, 부하 상황에서 connection exhaustion 을 유발할 수 있음 (성능 이슈) [Vlad Mihalcea] "Holding the database connection during the view rendering is a serious performance issue. It increases the time the connection is taken from the pool, which can cause connection exhaustion under load." engineering-blog OSIV on 으로 운영되는 Spring + JPA 애플리케이션 모든 시스템에서 반드시 connection exhaustion 이 발생한다는 보장 아님 — load 와 pool 크기 의존
OSIV-AP-C3 view layer 에서 발생한 statement 는 auto-commit 으로 처리되어 read-your-writes consistency 를 깨고 service layer transaction boundary 를 우회한다 [Vlad Mihalcea] "Statements issued during the view layer are auto-committed, breaking the read-your-writes consistency and bypassing the service layer transaction boundary." engineering-blog OSIV on + view 단계에서 추가 SQL 발생 시나리오 "auto-commit" 의 정확한 transactional 동작 (Spring TransactionManager 가 어떻게 처리하는지의 디테일) 은 본 인용 범위 밖
OSIV-AP-C4 Spring Boot 는 기본적으로 spring.jpa.open-in-view=true 이며, 명시적으로 disable 하지 않으면 startup 시 "spring.jpa.open-in-view is enabled by default... database queries may be performed during view rendering" WARN 로그를 출력한다 [Spring Boot — JpaBaseConfiguration WARN log] "spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning." official-vendor-doc Spring Boot + Spring Data JPA 환경 Spring Boot 가 future version 에서 default 를 false 로 변경할 계획이라는 뜻은 아님 — WARN 출력 자체만 보장

Usage Boundaries / 적용 경계

  • 이 자료가 직접 증명하는 것:
    • OSIV-AP-C1 ~ C3: Vlad Mihalcea 가 제시한 OSIV anti-pattern 의 3가지 근거 (connection 점유 / auto-commit / transaction boundary 우회). 단, 이는 Hibernate developer advocate 의 권위 있는 blog 의견이며 Hibernate 또는 Spring 공식 문서의 공식적인 "anti-pattern 선언" 이 아님
    • OSIV-AP-C4: Spring Boot 가 OSIV default true 임을 인정하고 WARN 로그로 명시한다는 사실 (공식 vendor 코드 base 의 verbatim WARN)
  • 이 자료가 증명하지 않는 것:
    • Hibernate ORM User Guide 자체가 OSIV 를 anti-pattern 으로 명시적으로 deprecate 했다는 사실 (본 세션에서는 hibernate.org WebFetch denied — 직접 verbatim quote 미확보)
    • OSIV on 으로 운영해도 안전한 워크로드의 정확한 조건 (예: low traffic, read-only) 은 본 인용 범위 밖
    • n+1 silent 문제가 OSIV 의 직접 효과인지 (n+1 은 OSIV 와 무관하게도 발생 가능 — OSIV 는 단지 silent 화)
  • 내 프로젝트에 적용하려면 추가 확인이 필요한 것:
    • ca-tmpl 의 spring.jpa.open-in-view=false 설정이 실제로 startup assertion 으로 들어가 있는지 코드 검증
    • 우리 service layer 가 fetch graph (@EntityGraph / JOIN FETCH / DTO projection) 를 일관성 있게 적용 중인지 코드 검증
    • vladmihalcea.com 의 원문을 다음 세션에서 정확하게 verbatim 으로 재확인 (본 세션 WebFetch 차단)
    • Hibernate User Guide 의 OSIV 관련 직접 인용을 후속 라운드에 확보 (현재는 frontmatter URL 만 있음)

메모 / Notes (내 프로젝트 해석 — 검증 전 추론)

본 섹션은 자료 직접 인용 아님. ca-tmpl 결정 컨텍스트 해석.

  • 왜 anti-pattern 인가 (해석 정리):
    1. connection pool 고갈 (OSIV-AP-C2 의 해석) — view rendering 동안 connection 점유. p99 latency 늘어남.
    2. n+1 silent (Vlad 본문 추가 해석) — service 에서 fetch 안 한 association 이 view 에서 lazy load → SQL 폭증을 service 단위 테스트에서 못 잡음.
    3. transaction boundary 모호 (OSIV-AP-C3) — 추가 SQL 이 auto-commit 으로 새 단위로 나감.
  • ca-tmpl 결정과의 정합성: "presentation 에서 DB 접근이 발생하면 계약 위반" 은 OSIV 끄고 service layer 에서 fetch graph 를 명시하라는 동일한 주장.
  • 대안 (해석):
    • @EntityGraph / explicit JOIN FETCH 로 service 에서 lazy association 을 미리 로드
    • DTO projection (interface/class projection) 으로 presentation 에서 entity 를 안 쓰게
  • 시사점: Spring Boot 기본값이 true 라서 (OSIV-AP-C4) 명시적으로 spring.jpa.open-in-view=false 를 설정 해야 함. ca-tmpl baseline 에 startup assertion 후보.
  • 같은 주제 다른 official-doc / company-tech-blog:
    • Hibernate User Guide §Transactions (frontmatter URL — 본 세션 verbatim 미확보)
    • Spring Boot reference (별도 raw 후속 수집 권장 — spring.jpa.open-in-view 공식 property doc)
  • 인용하는 branch:
  • 인용하는 wiki: (미작성 — /ingestwiki/concepts/osiv-anti-pattern 후보)
  • 대안 그룹 (ca-tmpl 결정 컨텍스트): Group G-C — Persistence failure (OSIV off vs OSIV on vs DTO projection 강제)