๐ŸŒ‹ OSIV๋ž€ ๋ฌด์—‡์ธ๊ฐ€

OSIV(Open Session In View) ๋ž€?

  • OSIV๋ž€ View์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ์ง€์—ฐ ๋กœ๋”ฉ ๋“ฑ์˜ ์ด์œ ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง€์†ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋˜๋Š” ์˜ต์…˜์ด๋‹ค.

์ฆ‰, ์˜์†์„ฑ ์ปจํƒ์ŠคํŠธ(์•คํ‹ฐํ‹ฐ ๋งค๋‹ˆ์ €)์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ์›น ์š”์ฒญ์ด ๋๋‚  ๋•Œ ๊นŒ์ง€ ์—ฐ์žฅํ•˜๋Š” ์˜ต์…˜์ด๋‹ค. ์ด ์„ค์ •์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณ„๋‹ค๋ฅธ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด default ON ์ƒํƒœ์ด๋‹ค.

์„œ๋ฒ„ ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

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

OSIV์˜ ๋™์ž‘์›๋ฆฌ

Reference โ–ถ ๊บผ์ง„ OSIV ๋„๋‹ค์‹œ๋ณด์ž

Pasted image 20250314152143.png

  1. OpenSessionInViewFilter ์ดˆ๊ธฐํ™”

    • OpenSessionInViewFilter๋Š” Hibernate(JPA๊ฐ์ฒด)์„ธ์…˜์„ ์š”์ฒญ ์ „์ฒด ์ฒ˜๋ฆฌ๋™์•ˆ ์—ด์–ด๋‘๊ธฐ ์œ„ํ•œ ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ์ด๋‹ค.
    • ํ•ด๋‹น ํ•„ํ„ฐ๋Š” sessionFactory์˜ openSession๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด Hibernate์„ธ์…˜์„ ์–ป๋Š”๋‹ค.
  2. ์š”์ฒญ ์ฒ˜๋ฆฌ ์‹œ์ž‘

    • doFilter ๋ฉ”์„œ๋“œ๊ฐ€ FilterChain ๊ฐ์ฒด์— ์˜ํ•ด ํ˜ธ์ถœ๋˜์–ด ์š”์ฒญ์˜ ๊ณ„์† ์ฒ˜๋ฆฌ๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.
  3. DispatcherServlet ๋ฐ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ

    • DispatcherServlet์ด ํ˜ธ์ถœ๋˜์–ด HTTP ์š”์ฒญ์„ ๊ธฐ๋ณธ ์ปจํŠธ๋กค๋Ÿฌ(์—ฌ๊ธฐ์„œ๋Š” PostController)๋กœ ๋ผ์šฐํŒ…ํ•œ๋‹ค.
  4. ์„œ๋น„์Šค ๋ ˆ์ด์–ด ํŠธ๋žœ์žญ์…˜

    • PostController๋Š” PostService๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Post ์—”ํ„ฐํ‹ฐ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜จ๋‹ค.
    • PostService๋Š” ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๋ฉฐ, HibernateTransactionManager OpenSessionInViewFilter์—์„œ ์—ด๋ฆฐ ๋™์ผํ•œ Hibernate ์„ธ์…˜์„ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.
  5. ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋ ˆ์ด์–ด

    • PostService๋Š” PostDAO (๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ฐ์ฒด)์—๊ฒŒ Post ์—”ํ„ฐํ‹ฐ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๋„๋ก ์œ„์ž„ํ•œ๋‹ค.
    • PostDAO๋Š” ์–ด๋– ํ•œ ๊ฒŒ์œผ๋ฅธ ์—ฐ๊ด€์„ฑ๋„ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๊ณ  Post ์—”ํ„ฐํ‹ฐ ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค. ๊ฒŒ์œผ๋ฅธ ์—ฐ๊ด€์„ฑ์€ Hibernate์—์„œ ์ฆ‰์‹œ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๊ณ  ํ•„์š”ํ•  ๋•Œ ๋กœ๋“œ๋˜๋Š” ๊ด€๊ณ„์ด๋‹ค.
  6. ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹
    - PostService๋Š” ๊ธฐ๋ณธ ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„ธ์…˜์ด ์™ธ๋ถ€์—์„œ ์—ด๋ ธ๊ธฐ ๋•Œ๋ฌธ์—( OpenSessionInViewFilter์—์„œ), ์ด ์‹œ์ ์—์„œ ์„ธ์…˜์€ ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค.

    ์ฃผ์˜

    ํŠธ๋ Œ์ ์…˜์€ ์ปค๋ฉง ๋˜๋”๋ผ๋„ ์˜คํ”ˆ ์„ธ์…˜(์˜์†์„ฑ ์ปจํ…์ŠคํŠธ) ์€ ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค!

  7. ๋ทฐ ๋ Œ๋”๋ง ์‹œ์ž‘

    • DispatcherServlet์ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค (UI)๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.
  8. ๊ฒŒ์œผ๋ฅธ ์—ฐ๊ด€์„ฑ ์ดˆ๊ธฐํ™”

    • ๋ Œ๋”๋ง ๊ณผ์ • ์ค‘์— UI๋Š” Post ์—”ํ„ฐํ‹ฐ์˜ ๊ฒŒ์œผ๋ฅธ ์—ฐ๊ด€์„ฑ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ์ด ํƒ์ƒ‰์€ ๊ฒŒ์œผ๋ฅธ ์—ฐ๊ด€์„ฑ์˜ ์ดˆ๊ธฐํ™”๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ฉฐ ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฐ๋‹ค.
  • Lazy Loading์ด ์ผ์–ด๋‚˜๋Š” ์‹œ์ 
  1. ์„ธ์…˜ ๋‹ซํž˜
    • OpenSessionInViewFilter๋Š” ์ด์ œ Hibernate ์„ธ์…˜์„ ๋‹ซ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ์„ธ์…˜๊ณผ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์ด ํ•ด์ œ๋œ๋‹ค.

OSIV์˜ต์…˜์— ๋”ฐ๋ฅธ DB ์ปค๋„ฅ์…˜ ๋ณด์œ  ์—ฌ๋ถ€

1. OSIV OFF

  • JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ DB์ปค๋„ฅ์…˜์„ ์–ป๋Š” ์‹œ์ ์€ DBํŠธ๋ Œ์ ์…˜์„ ์‹œ์ž‘ํ•  ๋•Œ ์ด๋‹ค. @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋งค์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ. -์—†๋‹ค๋ฉด, ํ•ด๋‹น JPA์ฟผ๋ฆฌ(Repository JPA ์กฐํšŒ ๋ฉ”์„œ๋“œ์— ์ž๋™์œผ๋กœ ํŠธ๋ Œ์ ์…˜ ๋ถ€์—ฌ)๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ์–ป๊ฒŒ ๋œ๋‹ค.

  • DB์ปค๋„ฅ์…˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹œ์ ์€ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์˜ @Transactional์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚ ๋•Œ ์ด๋‹ค. ์ด ๋–„, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๊ณ  DB์ปค๋„ฅ์…˜์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

์ฆ‰, ํ•œ ์ปจํŠธ๋กค๋Ÿฌ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์„œ๋น„์Šค ๋ ˆ์ด์–ด์˜ ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ, ๊ฐ๊ฐ์˜ ๋ฉ”์„œ๋“œ๋งˆ๋‹ค ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์ƒ๊ธฐ๊ณ  ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ๋ฐฉ์‹์€ DB์ปค๋„ฅ์…˜์„ ์ตœ์†Œํ•œ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ ˆํ”ฝ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์œ ์—ฐํ•˜๊ณ  ํšจ์œจ์ ์ด๋‹ค.

2. OSIV ON

  • JPA๊ฐ€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์–ป๋Š” ์‹œ์ ์€ ๋™์ผํ•˜๋‹ค. @Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ๋ถ™์€ ๋งค์„œ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ. -์—†๋‹ค๋ฉด, ํ•ด๋‹น JPA์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์‹œ์ ์— ์–ป๊ฒŒ ๋œ๋‹ค.

  • DB์ปค๋„ฅ์…˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์‹œ์ ์€ -api์˜ ๊ฒฝ์šฐ : ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ €์—๊ฒŒ ๋ฐ˜ํ™˜๋  ๋•Œ ๊นŒ์ง€. -tamplate์œผ๋กœ ๊ฐˆ ๊ฒฝ์šฐ : ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋ Œ๋”๋ง ๋˜์–ด ์ถœ๋ ฅ๋  ๋•Œ ๊นŒ์ง€.

์ฆ‰, @Transactional๋ฉ”์„œ๋“œ๊ฐ€ ๋๋‚  ๋–„ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ Lazy Loading์œผ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ด๋ ค ๋†“๋Š”๊ฒƒ์ด๋‹ค.

์ •๋ณด

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” DB์ปค๋„ฅ์…˜์„ ๋ณด์œ ํ•ด์•ผ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ ์ธ ์ธก๋ฉด์—์„œ ์ค‘๋ณต์„ ์ค„์ด๊ณ , ์ง€์—ฐ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์— ํฐ ๋„์›€์„ ์ฃผ์ง€๋งŒ, DB์ปค๋„ฅ์…˜์„ ์˜ค๋ž˜ ๋ฌผ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์นซ ์„ฑ๋Šฅ์ ์ธ ์žฅ์• ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.