์คํ๋ง๋ถํธ ํ๋ก์ ํธ๋ฅผ ์คํ์ํค๋ฉด ์์ ๊ฐ์ WARN์ด ํ์๋๋ค.
spring.jpa.open-in-view์ ๊ธฐ๋ณธ๊ฐ์ true์ด๋ฉฐ ํด๋นํ๋ WARN์ false ๊ฐ์ผ๋ก ์ง์ ํด์ฃผ๋ฉด ์์ด์ง๋ค.

๋ฐฐํฌ์ฉ ์ชฝ yml ํ์ผ์ spring.jpa.open-in-view๋ฅผ false๋ก ํด์ฃผ์๊ณ , ๋ก์ปฌ ์ชฝ์๋ ๋ณ๋ค๋ฅธ ์ง์ ์ ํ์ง ์๊ณ ๋ฐฐํฌํ๋๋ ๋ฐฐํฌ ์ฌ์ดํธ์์ ๊ธ ์ ์ฒด๊ฐ ์กฐํ๋์ง ์๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
open-in-view:false ๋ฅผ ์ฃผ์์ฒ๋ฆฌํ๋ ๋คํํ ๊ธ ์ ์ฒด ์กฐํ๊ฐ ์ ์์ ์ผ๋ก ์๋ํ๋ค.
open-in-view๊ฐ ๋ฌด์์ด๊ธธ๋ ์กฐํ์ ์ํฅ์ ๋ฏธ์น๋์ง ์์๋ณด๊ฒ ๋ค!
์์ ์ ๋ค์๋ ๊น์ํ ๊ฐ์ฌ๋์ '์ค์ ! ์คํ๋ง๋ถํธ์ JPA ํ์ฉ2 - API ๊ฐ๋ฐ ์ฑ๋ฅ์ต์ ํ' ๊ฐ์์์ ์น์ 5 API ๊ฐ๋ฐ ๊ณ ๊ธ-์ค๋ฌด ํ์ ์ต์ ํ - 'OSIV์ ์ฑ๋ฅ ์ต์ ํ'๋ผ๋ ์์์ด ์๋ค. ๊ฐ์๋ฅผ ๋ค์์ง ๋ฒ์จ 2๋ ์ด ํ๋ ๊ณ ๊ทธ์ ์์ด ์ด๋ฒ์ ๋ง์ฃผ์น ์ค๋ฅ์ ๊ด๋ จ๋ open-in-view๊ฐ ์์ํ๊ฒ ๋ค๊ฐ์๋ค. ์ด๋ฒ ๊ธฐํ์ OSIV(Open Session in View) ๊ฐ๋ ์ ๋ํด ๋ค์ ํ๋ฒ ์ง๊ณ ํ๋ก์ ํธ ์ํํ ๋ ์์ง ์๊ณ ํ์ฉํด์ผ๊ฒ ๋ค..
Open-in-view๋ ?
ํ์ด๋ฒ๋ค์ดํธ์์๋ Open Session in View๋ก ํํ
JPA ์์์ฑ ์ปจํ ์คํธ๋ service ๊ณ์ธต์์ transaction์ ์์ํ ๋(@Transactional) DB connection์ ๊ฐ์ ธ์จ๋ค.
๊ทธ๋ผ DB์ ๋ฐ๋ฉํ๋ ์์ ์ ์ธ์ ์ผ๊น?
OSIV๊ฐ true๋ก ์ง์ ๋์ด์๋ค๋ฉด service๊ณ์ธต์์ @Transactional์ ๋ถ์ธ ๋ฉ์๋ ์คํ์ด ๋๋๋ ๋ฐ๋ฉํ์ง ์๊ณ ์ฌ์ฉ์์๊ฒ api๊ฐ ๋ฐํ๋ ๋๊น์ง ๋๋ ๋ทฐ ํ ํ๋ฆฟ์ธ ๊ฒฝ์ฐ ๋ ๋๋งํ ๋๊น์ง ๊ฐ๊ณ ์๋ค. ๊ทธ๋์ Lazy Loading์ด ๋ทฐ ํ ํ๋ฆฟ์ด๋ API controller์์๋ ๊ฐ๋ฅํ ๊ฒ์ด๋ค!
๋ ๋๋ง์ด ์์ฑ๋๊ณ , response๋๋ฉด ๊ทธ์ ์์ผ ๋ฐ๋ฉํ๊ณ ์์์ฑ ์ปจํ ์คํธ๋ ์ฌ๋ผ์ง๊ฒ ๋๋ค.
ํ์ง๋ง true๋ก ์ง์ ํ๋ฉด ๋๋ฌด ์ค๋์๊ฐ ๋์ DB connection ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ ํธ๋ํฝ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ปค๋ฅ์ ์ด ๋ถ์กฑํ๊ฒ ๋์ด ๊ฒฐ๊ตญ ์ฅ์ ๋ก ์ด์ด์ง ์ ์๋ ์น๋ช ์ ์ธ ๋จ์ ์ ๊ฐ๊ณ ์๋ค.
open-in-view:false ์ค๋ฅ ์ํฉ
hibernate์ sql๋ก๊ทธ๋ฅผ ๋ณด๋ฉด ๊ฒ์๊ธ ์กฐํ๋ ๋์์ผ๋, ํ์๋ฆฌํ์์ ๊ฒ์๊ธ ์์ฑ์์ ๋๋ค์์ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค.
์์ ๊ฐ์ด LazyInitializationException์ ๋ฐ์์ํค๋ฉฐ Board ์ํฐํฐ์ fetchType=LAZY๋ก ์ง์ ํ๋ user ํ๋์ commentList ํ๋๊ฐ no Session์ด๋ผ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
open-in-view:false๋ก ์ง์ ํ๋ฉด EntityManager๊ฐ transcation์ commit๊ณผ ํจ๊ป ๋ซํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ง์ฐ๋ก๋ฉ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ด์์์ด์ผ ๊ฐ๋ฅํ ๊ฒ์ธ๋ฐ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ฃฝ์ด์ ํ๋ก์๊ฐ ์ด๊ธฐํ๋์ง ๋ชปํ๋ ์ํฉ์ด๋ค.
์ฆ, controller์์ view์๊ฒ ๋ฐํํ ๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ ์ ๊ทผํ ์ ์๊ฒ ๋์ด user๋ผ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ฒ ๋ ๊ฒ์ด๋ค!
์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ open-in-view:true๋ก ์ง์ ํ๋ฉด JPA EntityManager๋ ๋ซํ์ง ์์ ํธ๋์ญ์ ์ด ๋๋๋ DB connection์ด ๋ฐ๋ฉ๋์ง ์์ผ๋ฉฐ Client์๊ฒ ์๋ต์ด ๋๊ณ ๋ ํ์ DB connection์ ๋ฐ๋ฉํ๋ค.
ํด๊ฒฐ ๋ฐ ์ ๋ฆฌ
- open-in-view:true๋ก ์ง์ ํ๋ฉด ์ต์ด DB connection ์์ ์์ ๋ถํฐ API ์๋ต์ด ๋๋ ๋๊น์ง ์์์ฑ ์ปจํ
์คํธ์ DB connection์ ์ ์งํ๊ธฐ ๋๋ฌธ์ @Transactional์ ๋ฒ์ด๋ ๊ณณ์์๋ ์ง์ฐ๋ก๋ฉ์ ํ ์ ์๋ค.
- open-in-view:false๋ก ์ง์ ํ๋ฉด ํธ๋์ญ์
์ ์ข
๋ฃํ ๋ ์์์ฑ ์ปจํ
์ค๋ฅผ ๋ซ๊ณ DB connection์ ๋ฐ๋ก ๋ฐ๋ฉํ๊ธฐ ๋๋ฌธ์ ์ง์ฐ๋ก๋ฉ ๊ด๋ จ ์ฝ๋๋ฅผ ํธ๋์ญ์
์์ผ๋ก ๋ฃ์ด์ผ ํ๋ฉฐ view template์์๋ ์ง์ฐ๋ก๋ฉ์ด ์๋ํ์ง ์๋๋ค.
๐ ํธ๋์ญ์ ์ด ๋๋๊ธฐ ์ ์ ์ง์ฐ๋ก๋ฉ์ ๊ฐ์ ๋ก ํธ์ถํด์ผ ํ๋ค. (๋๋ fetch join)
๐ open-in-view:false๋ก ์ง์ ํ๊ณ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
- Query์ Command ๋ถ๋ฆฌ
- ex) OrderService
- OrderService : ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง
- OrderQueryService : ํ๋ฉด์ด๋ API์ ๋ง์ถ ์๋น์ค (์ฃผ๋ก ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ฌ์ฉ)
open-in-view:true๋ก ์ค์ ํด์ ํด๊ฒฐํ๊ธด ํ์ผ๋ ์ค๋ฌด์์๋ OSIV๋ฅผ ๋๊ณ , ADMIN๊ณผ ๊ฐ์ด ์ปค๋ฅ์ ์ ๋ง์ด ์ฌ์ฉํ์ง ์๋ ๊ณณ์์๋ OSIV๋ฅผ ์ผ ๋ค๊ณ ํ๋ค. ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ ์ถํ์ ์ ์ฉํด๋ด์ผ๊ฒ ๋ค!
์ฐธ๊ณ ์๋ฃ
Spring Boot์ open-in-view, ๊ทธ ์ํ์ฑ์ ๋ํ์ฌ.
์ค์ ์๋ฒ ์ฅ์ ํด๊ฒฐ๊ณผ์ ์ ์ค์ฌ์ผ๋ก
medium.com
์ค์ ! ์คํ๋ง ๋ถํธ์ JPA ํ์ฉ2 - API ๊ฐ๋ฐ๊ณผ ์ฑ๋ฅ ์ต์ ํ | ๊น์ํ - ์ธํ๋ฐ
๊น์ํ | ์คํ๋ง ๋ถํธ์ JPA๋ฅผ ํ์ฉํด์ API๋ฅผ ๊ฐ๋ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ JPA ๊ทนํ์ ์ฑ๋ฅ ์ต์ ํ ๋ฐฉ๋ฒ์ ํ์ตํ ์ ์์ต๋๋ค., ์คํ๋ง ๋ถํธ, ์ค๋ฌด์์ ์ ์ฐ๊ณ ์ถ๋ค๋ฉด? ๋ณต์กํ ๋ฌธ์ ๊น์ง ํด๊ฒฐํ๋ ํ์ ๊ธธ
www.inflearn.com
https://www.inflearn.com/course/ORM-JPA-Basic#
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ | ๊น์ํ - ์ธํ๋ฐ
๊น์ํ | JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., ์ค๋ฌด์์๋
www.inflearn.com
'Database > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] @Column(unique=true)์ @UniqueConstraint (0) | 2024.05.01 |
---|---|
[JPA] JPA Entity๊ฐ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๊ฐ์ ธ์ผํ๋ ์ด์ - Reflection (1) | 2024.03.16 |