๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

experience

[230811] Jpa OSIV ๊ด€๋ จํ•˜์—ฌ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ

Jpa OSIV

Created: March 26, 2024 2:47 PM
Complete: No
Category: JPA
Date: August 11, 2023

  1. ๋ฌธ์ œ ์ƒํ™ฉ
  • ์—…๋ฐ์ดํŠธ API ์—์„œ service ๋ ˆ์ด์–ด์—์„œ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š”๋ฐ, read DataSource๋ฅผ ๋ณธ๋‹ค.
    • @Transactional A() -> @Transational(readOnly=true) B() -> @Transactional(readOnly=false) C()
  1. ์˜ˆ์ƒ
  • propagation ์ด default ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ํŠธ๋žœ์žญ์…˜์ด ์—ด๋ฆฐ DataSource ๋ฅผ ํ™•์ธํ•  ๊ฒƒ์ด๋‹ค.
    • REQUIRED(default)
      • ๋ถ€๋ชจ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์‹คํ–‰, ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜ ์ƒ์„ฑ
      • ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ ๊ณณ์—์„œ ๋ณ„๋„์˜ ํŠธ๋žœ์žญ์…˜์ด ์„ค์ •๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ƒˆ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
      • ํ˜ธ์ถœํ•œ ๊ณณ์—์„œ ์ด๋ฏธ ํŠธ๋žœ์žญ์…˜์ด ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด ๊ธฐ์กด์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋กœ์ง์„ ์‹คํ–‰ํ•œ๋‹ค.
  1. ๊ฒฐ๊ณผ
  • 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
  1. ํ™•์ธ
  • Controller - validator ์—์„œ ์ฒ˜์Œ DB Connection ์‹œ๋„

    • ํŠธ๋žœ์žญ์…˜์ด ๋ถ„๋ฆฌ(Propagation.REQUIRES_NEWS) ๋˜์–ด๋„ readDB ์ปค๋„ฅ์…˜์œผ๋กœ ์—ฐ๊ฒฐ๋จ

  • AbstractRouingDataSource - determineCurrentLookupKey() ๋กœ DB Connection ํ™•์ธ

  1. ํ•ด๊ฒฐ
  • ํŠธ๋žœ์žญ์…˜์ด ๋ถ„๋ฆฌ๋˜์—ˆ์„๋•Œ๋งˆ๋‹ค ์ฒดํฌํ•˜๋„๋ก ๋ณ€๊ฒฝ โ†’ OSIV false

      spring:
          jpa:
              open-in-view: false
    • JpaTransactionManager ๋ฅผ ํ†ตํ•ด ์„ธ์…˜์ด ์ข…๋ฃŒ๋˜๋Š” ์‹œ์  ํ™•์ธ โ†’ closeEntityManager ์—์„œ ์„ธ์…˜ ์ข…๋ฃŒํ•จ

- ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ entityManagerHolder ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•ด์•ผํ•˜๋Š”๋ฐ entityHolder ๊ฐ€ ์ง€์†๋˜๋Š” ์ด์œ  โ†’ JPA OSIV
    - controller ์š”์ฒญ์„ ๋ฐ›๋Š” ์ˆœ๊ฐ„๋ถ€ํ„ฐ EntityManager ๋ฅผ ์ƒ์„ฑํ•จ
    - ์ด ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜๋ณ„๋กœ DB ๋™์  ๋ผ์šฐํŒ…์ด ๋™์ž‘ํ•˜์ง€ ์•Š์•˜์Œ
  1. OSIV true ์˜ ๋‹จ์ 
  • controller ๋‹จ๊นŒ์ง€ ์˜ค๋žซ๋™์•ˆ DB connection์„ ๋ฌผ๊ณ  ์žˆ์œผ๋ฉด ์žฅ์• ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์žฅ์ ์œผ๋กœ๋Š” ์ง€์—ฐ๋กœ๋”ฉ์ด ํ•„์š”ํ•œ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค.
    • ํ˜„์žฌ ์„œ๋น„์Šค์ฝ”๋“œ์—์„œ๋Š” ๊ฐ์ฒด๊ฐ„ ๋งคํ•‘์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ ์žฅ์ ์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.