experience
[230811] Jpa OSIV ๊ด๋ จํ์ฌ ๊ฒช์๋ ๋ฌธ์
Jpa OSIV
Created: March 26, 2024 2:47 PM
Complete: No
Category: JPA
Date: August 11, 2023
- ๋ฌธ์ ์ํฉ
- ์
๋ฐ์ดํธ API ์์ service ๋ ์ด์ด์์ ๋ค์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋๋ฐ, read DataSource๋ฅผ ๋ณธ๋ค.
- @Transactional A() -> @Transational(readOnly=true) B() -> @Transactional(readOnly=false) C()
- ์์
- propagation ์ด default ๊ธฐ ๋๋ฌธ์ ์ฒ์ ํธ๋์ญ์
์ด ์ด๋ฆฐ DataSource ๋ฅผ ํ์ธํ ๊ฒ์ด๋ค.
- REQUIRED(default)
- ๋ถ๋ชจ ํธ๋์ญ์ ๋ด์์ ์คํ, ์์ผ๋ฉด ์๋ก์ด ํธ๋์ญ์ ์์ฑ
- ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ ๊ณณ์์ ๋ณ๋์ ํธ๋์ญ์ ์ด ์ค์ ๋์ด ์์ง ์๋ค๋ฉด ํธ๋์ญ์ ์ ์๋ก ์์ํ๋ค.
- ํธ์ถํ ๊ณณ์์ ์ด๋ฏธ ํธ๋์ญ์ ์ด ์ค์ ๋์ด ์๋ค๋ฉด ๊ธฐ์กด์ ํธ๋์ญ์ ๋ด์์ ๋ก์ง์ ์คํํ๋ค.
- REQUIRED(default)
- ๊ฒฐ๊ณผ
- readOnly=false ์ด๋, read DataSource๋ฅผ ๋ณธ๋ค.
2023-08-11T17:56:26.617+09:00 INFO [,64d5f7baeb9940a9a1462e64b3488a21,a1462e64b3488a21] 61842 --- [nio-8080-exec-3] e.t.m.a.c.c.m.DynamicRoutingDataSource : debug logg: read
# read DataSource๋ฅผ ๋ณธ๋ค..
Hibernate:
select
2023-08-11T17:56:26.868+09:00 INFO [,64d5f7baeb9940a9a1462e64b3488a21,a1462e64b3488a21] 61842 --- [nio-8080-exec-3] : [getMessages] txActive : true, readOnly: false # ์ฒ์ ํธ๋์ญ์
์ด ์ ์ฉ๋๋ A() ๋ฉ์๋์์๋ readOnly false
2023-08-11T17:56:26.869+09:00 INFO [,64d5f7baeb9940a9a1462e64b3488a21,a1462e64b3488a21] 61842 --- [nio-8080-exec-3] ReadService : [getMessages] txActive : true, readOnly: false # readOnlyํธ๋์ญ์
์ด ๋ถ์ B() readOnly false
Hibernate:
select...
2023-08-11T17:56:27.063+09:00 INFO [,64d5f7baeb9940a9a1462e64b3488a21,a1462e64b3488a21] 61842 --- [nio-8080-exec-3] ReadService : [getMessages] txActive : true, readOnly: false # ํธ๋์ญ์
์ด๋
ธํ
์ด์
์ด ๋ถ์ C() readOnly false
Hibernate:
select ...
2023-08-11T17:56:27.079+09:00 INFO [,64d5f7baeb9940a9a1462e64b3488a21,a1462e64b3488a21] 61842 --- [nio-8080-exec-3] UpdateService : [getMessages] txActive : true, readOnly: false # ํธ๋์ญ์
์ด๋
ธํ
์ด์
์ด ๋ถ์ D() readOnly false
Hibernate:
update ...
logging:
level:
org:
springframework:
transaction:
interceptor: TRACE
- ํ์ธ
Controller - validator ์์ ์ฒ์ DB Connection ์๋
ํธ๋์ญ์ ์ด ๋ถ๋ฆฌ(Propagation.REQUIRES_NEWS) ๋์ด๋ readDB ์ปค๋ฅ์ ์ผ๋ก ์ฐ๊ฒฐ๋จ
AbstractRouingDataSource - determineCurrentLookupKey() ๋ก DB Connection ํ์ธ
- ํด๊ฒฐ
ํธ๋์ญ์ ์ด ๋ถ๋ฆฌ๋์์๋๋ง๋ค ์ฒดํฌํ๋๋ก ๋ณ๊ฒฝ โ OSIV false
spring: jpa: open-in-view: false
- JpaTransactionManager ๋ฅผ ํตํด ์ธ์ ์ด ์ข ๋ฃ๋๋ ์์ ํ์ธ โ closeEntityManager ์์ ์ธ์ ์ข ๋ฃํจ
- ํธ๋์ญ์
์ด ์ข
๋ฃ๋ ๋ entityManagerHolder ๋ฅผ ์์ฑํ๋๋ก ํด์ผํ๋๋ฐ entityHolder ๊ฐ ์ง์๋๋ ์ด์ โ JPA OSIV
- controller ์์ฒญ์ ๋ฐ๋ ์๊ฐ๋ถํฐ EntityManager ๋ฅผ ์์ฑํจ
- ์ด ๋๋ฌธ์ ํธ๋์ญ์
๋ณ๋ก DB ๋์ ๋ผ์ฐํ
์ด ๋์ํ์ง ์์์
- OSIV true ์ ๋จ์
- controller ๋จ๊น์ง ์ค๋ซ๋์ DB connection์ ๋ฌผ๊ณ ์์ผ๋ฉด ์ฅ์ ๋ฅผ ์ด๋ํ ์ ์๋ค.
- ์ฅ์ ์ผ๋ก๋ ์ง์ฐ๋ก๋ฉ์ด ํ์ํ ์ํฐํฐ๋ฅผ ์ ์ฐํ๊ฒ ์ธ ์ ์๋ค๋ ์ ์ด๋ค.
- ํ์ฌ ์๋น์ค์ฝ๋์์๋ ๊ฐ์ฒด๊ฐ ๋งคํ์ ์ฌ์ฉํ์ง ์์ ์ฅ์ ์ด ๋์ง ์๋๋ค.