[Spring] OSIV๋กœ ์•Œ์•„๋ณด๋Š” Spring Transaction ํ—ค์งš๊ธฐ

๋ฐ˜์‘ํ˜•

Spring boot์—๋Š” spring.jpa.open-in-view๋ผ๊ณ  ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์€ JPA์˜ OSIV ๊ธฐ๋Šฅ์„ ON/OFF ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ธ๋ฐ์š”. 

 

์ด ์˜ต์…˜์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

OSIV

๋จผ์ € ์ด ์˜ต์…˜์€ JPA์˜ OSIV ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ ์œ ๋ฌด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, OSIV๋ž€, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ View๊นŒ์ง€ ์—ด์–ด๋‘๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด์‹œ๊ฒ ๋‹ค๋ฉด ์•„๋ž˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.

 

2020.06.23 - [Programming/Spring] - [Spring] JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ƒ๋ช…์ฃผ๊ธฐ

 

[Spring] JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์™€ ์ƒ๋ช…์ฃผ๊ธฐ

Spring Framework๋ฅผ ์ด์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” DB ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณดํ†ต JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ DB Connection์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปค๋„ฅ์…˜์ด ์—ฐ

blog.neonkid.xyz

OSIV๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ณ„์† ์œ ์ง€๋˜๋ฉด Entity ๊ฐ์ฒด๋„ ์˜์† ์ƒํƒœ๋กœ ์œ ์ง€๋˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ์จ ์ด ๊ธฐ๋Šฅ์€ ์ฐจํ›„ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

OSIV๋Š” Open Session In View์˜ ์•ฝ์ž๋กœ ์—ฌ๊ธฐ์„œ Session์€ Hibernate ์ธํ„ฐํŽ˜์ด์Šค์˜ Session์„ ๋งํ•œ๋‹ค. JPA์—์„œ๋Š” EntityManager๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— OSIV(Open Session In View)๊ฐ€ ์•„๋‹Œ OEIV(Open EntityManager In View)๋กœ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ๋งž์ง€๋งŒ ํ†ต์ƒ ํŽธํ•˜๊ฒŒ OSIV๋กœ ํ†ตํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

 

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

๊ทธ๋ ‡๋‹ค๋ฉด Spring Framework ์œ„์—์„œ OSIV๋Š” ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ๊นŒ์š”? Spring์ด ์ œ๊ณตํ•˜๋Š” OSIV์—๋Š” ๋‘ ๊ฐ€์ง€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

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

 

Spring JPA์˜ OSIV ์˜ต์…˜์„ true๋กœ ์ฃผ๊ฒŒ ๋˜๋ฉด ์œ„์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ์›๋ฆฌ๋ฅผ ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • Browser์œผ๋กœ๋ถ€ํ„ฐ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Servlet Filter๋‚˜ Spring Interceptor์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ(EntityManager)๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    (ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ์ด์ „ ๊ธ€์—์„œ ๋‹ค๋ค˜๋“ฏ, ์ด ๋ถ€๋ถ„์—์„œ Transaction์„ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.)
  • Transaction AOP ํ˜น์€ begin์„ ์ด์šฉํ•ด์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•  ๋• ์œ„์—์„œ ์ƒ์„ฑํ•œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ด์šฉํ•ด ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    (Spring boot์˜ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ ์ •์˜๋œ autoconfigure๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค)
  • ์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” Service ํด๋ž˜์Šค์—์„œ Transaction AOP๋ฅผ ์ด์šฉํ•œ ๊ฒฝ์šฐ์ด๋ฏ€๋กœ Service ๋กœ์ง์ด ์™„๋ฃŒ๋˜๋ฉด ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•˜๊ณ , ํŠธ๋žœ์žญ์…˜์€ ์ข…๋ฃŒ๋˜์ง€๋งŒ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ์•„์ง ์‚ด์•„์žˆ์Šต๋‹ˆ๋‹ค.
    (์ฆ‰, DB์™€ ์ปค๋„ฅ์…˜์ด ์•„์ง ์ข…๋ฃŒ๋œ ์ƒํƒœ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.)
  • Controller์™€ View๊นŒ์ง€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์œ ์ง€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋•Œ ์‚ฌ์šฉํ•œ Entity๋Š” ๊ณ„์† ์˜์† ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • Servlet Filter ํ˜น์€ Spring Interceptor๋กœ ๋กœ์ง์ด ๋‹ค์‹œ ํšŒ๊ท€๋œ ๊ฒฝ์šฐ, ๊ทธ ๋•Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
    (์ด ๋•Œ, flush ๋ฉ”์„œ๋“œ๊ฐ€ ์•„๋‹Œ close ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.)

 

์—ฌ๊ธฐ์„œ ๋ด์•ผํ•  ์ ์€ Transaction AOP๋ฅผ ๋ฒ—์–ด๋‚œ Controller ๋ ˆ์ด์–ด์—์„œ๋ถ€ํ„ฐ Entity๋Š” ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋Š”๋ฐ, ์ด ๋•Œ๋ถ€ํ„ฐ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ด๋ฏธ ๋๋‚œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Entity ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •/์‚ญ์ œํ•˜๋Š” ์ž‘์—…์ด ์•„๋‹Œ ์กฐํšŒ๋ฅผ ํ•  ๋•Œ๋Š” ์•„๋ฌด๋Ÿฐ ์ƒ๊ด€์ด ์—†์Šต๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Entity ๊ฐ์ฒด๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ณผ์ •์—์„œ Lazy Loading์ด ๋ฐœ์ƒํ•ด๋„ ์กฐํšŒ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Controller ๋ ˆ์ด์–ด์—์„œ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

  • JPA๋ฅผ ์ด์šฉํ•ด Entity ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •/์‚ญ์ œํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋“œ์‹œ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋ฐ–์—์„œ๋Š” Entity ์กฐํšŒ ์™ธ์—๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๊ฑด ์–ด๋–จ๊นŒ? ๋งŒ์•ฝ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋ฐ–์ธ Controller, View ๋‚ด์—์„œ Entity๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด? ์šฐ๋ฆฌ๋Š” ์ด์ „ ๊ธ€์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋ณ€๊ฒฝ ๊ฐ์ง€(Dirty Checking) ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ •์ด ๋ฐ”๋กœ ๋˜์–ด์•ผ ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜ ๋ฐ–์—์„œ๋Š” ๊ทธ๋ ‡๊ฒŒ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

  • ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ DB์— ๋ฐ˜์˜ํ•˜๋ ค๋ฉด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ flush ํ•ด์•ผํ•˜๋Š”๋ฐ, Spring์ด ์ œ๊ณตํ•˜๋Š” OSIV๋Š” ์š”์ฒญ์ด ๊ธ‘๋‚˜๋ฉด flush๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ , close ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ Entity ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ ๋‚ด์šฉ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š๊ณ  ์ข…๋ฃŒํ•จ.
  • ๊ฐ•์ œ๋กœ DI๋ฅผ ์ด์šฉํ•ด Spring ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” EntityManager๋ฅผ ์‚ฌ์šฉํ•ด Controller๋‚˜ View์—์„œ flush ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์ด๋ฅผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋กœ ๋ง‰์•„๋ฒ„๋ฆฌ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ด์„œ ์ด ์—ญ์‹œ ์•ˆ๋จ.

 

 

OSIV๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

์•„๋งˆ ๋ˆˆ์น˜๋ฅผ ์ฑ„์‹  ๋ถ„๋“ค๋„ ๊ณ„์‹œ๊ฒ ์ง€๋งŒ OSIV๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•œ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ต์…˜์—์„œ ์„ค๋ช…ํ•œ ๊ทธ๋Œ€๋กœ View์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋•Œ๋ถ€ํ„ฐ Entity ๊ฐ์ฒด๋Š” ์ค€์˜์† ์ƒํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ถ€ํ„ฐ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฐ–์—์„œ Child Entity๋ฅผ ๋กœ๋”ฉํ•˜๋Š” ๋“ฑ์˜ ํ–‰์œ„๊ฐ€ ์ผ์ ˆ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

 

 

OSIV๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ

๊ทธ๋ ‡๋‹ค๋ฉด OSIV๋Š” ์–ธ์ œ ์“ฐ๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ? 

 

  • View์—์„œ Entity ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด ๋ Œ๋”๋ง ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ. (Spring MVC)
  • Entity ๊ฐ์ฒด ๋‚ด ์—ฐ๊ด€ ๊ฐ์ฒด๋ฅผ View์—์„œ ์ œ์–ดํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ
  • ๊ฐ™์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ.

 

๋ฐ˜๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ๋…์ด๋˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • Controller์™€ Service ๋กœ์ง์ด 1:1 ๋งคํ•‘์ธ ๊ฒฝ์šฐ
  • Service ๋ ˆ์ด์–ด์—์„œ ํŠธ๋žœ์žญ์…˜์ด ์ข…๋ฃŒ๋˜๋Š” ๊ฒฝ์šฐ 
  • Controller์—์„œ Transaction ์™ธ์— ๋ณ„๋„์˜ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์ด ๊ธด ๋กœ์ง์ด ์žˆ๋Š” ๊ฒฝ์šฐ (์˜ˆ: ์™ธ๋ถ€ API ํ˜ธ์ถœ)

 

Spring MVC๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ณดํ†ต Entity ๊ฐ์ฒด๋ฅผ Service Layer ์œ„์ธต๊นŒ์ง€ ๋Œ์–ด์˜ฌ๋ ค์„œ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ํŠธ๋žœ์žญ์…˜์„ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด OSIV์˜ ํ™œ์„ฑํ™”๋Š” ์˜คํžˆ๋ ค DB ์ปค๋„ฅ์…˜์„ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•  ๋ฟ ๊ถŒ์žฅํ•˜๋Š” ์˜ต์…˜์€ ์•„๋‹™๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡์ง€๋งŒ ์ด๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ Lazy Loading(์ง€์—ฐ ๋กœ๋”ฉ)์€ View์— ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ ๋ฟ ์•„๋‹ˆ๋ผ REST API ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ Child Entity๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ๋„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” View์—์„œ ๋กœ๋”ฉํ•˜์ง€ ์•Š๊ณ  Service Layer์—์„œ ๊ฐ€๊ธ‰์ ์ด๋ฉด ๋กœ๋”ฉ์„ ๋๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

 

CQRS

API๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์ปค์ง€๋ฉด OSIV ์˜ต์…˜ ์—†์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋ ˆ์ด์–ด์—์„œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ์ฃผ๋Š” ๊ฒƒ์ด ๋ณต์žก๋„๋ฅผ ๋Š˜๋ฆฌ๋Š” ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” Command์™€ Query๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” CQRS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • OrderService (์˜์†)
  • OrderQueryService (์กฐํšŒ)

 

Spring MVC์™€ ๊ฐ™์€ View๊นŒ์ง€ ๋‹ด๋‹นํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ์—๋Š” ํ™”๋ฉด์— ๋งž์ถฐ Query ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด๋ž˜์„œ ์‚ฌ์‹ค MyBatis๋‚˜ iBatis๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด OSIV๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜๋Š” ๊ฐ€์žฅ ํฐ ๊ฒฝ์šฐ์ด์ง€๋งŒ ๋ณดํŽธ์ ์œผ๋กœ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ์ด์ƒ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ํฐ ์˜ํ–ฅ์„ ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ •๋ง ํฌ๊ณ  ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ๋Š” ์ด ๋‘˜์˜ ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ์ฐจํ›„ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธํ•ด์ง‘๋‹ˆ๋‹ค. ์กฐํšŒ์™€ ์˜์†์— ๋Œ€ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์ปค๋„ฅ์…˜์„ ๊ฐ€๋Šฅํ•œ ๋งŽ์ด ์žฌํ™œ์šฉํ•ด ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์— ์กฐ๊ธˆ์€ ์œ ์—ฐํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

 

2022.02.21 - [Programming/Spring] - [Spring boot] Axon Framework๋กœ ์‹œ์ž‘ํ•˜๋Š” CQRS ๊ธฐ์ดˆ

 

[Spring boot] Axon Framework๋กœ ์‹œ์ž‘ํ•˜๋Š” CQRS ๊ธฐ์ดˆ

๋งŽ์ด ๋ฏธ๋ฃจ์–ด์ง„ Axon Framework์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์ „์— ์•„์ฃผ ์˜ค๋žœ ์‹œ๊ฐ„ ์ „, MSA์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ ์ค‘ ์ด๋ฒคํŠธ ์†Œ์‹ฑ๊ณผ CQRS์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋‚ด์šฉ์„

blog.neonkid.xyz

CQRS๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ๊ธ€ ์ค‘์—์„œ๋Š” Axon ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด Command์™€ Query๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ, ๊ด€์‹ฌ์žˆ๋‹ค๋ฉด ์ฐธ๊ณ ํ•ด๋ณด์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

 

๋งˆ์น˜๋ฉฐ...

์—ฌ๊ธฐ๊นŒ์ง€ ๊ฐ„๋‹จํžˆ OSIV์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์Šต๋‹ˆ๋‹ค. ์ •๋ฆฌํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

  • OSIV๋Š” Spring์—์„œ ORM์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ View์—์„œ๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ต์…˜.
  • ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜ ๋ฐ–์—์„œ๋Š” Entity์˜ ์ง€์—ฐ ๋กœ๋”ฉ ๋“ฑ ์กฐํšŒ๋งŒ ๊ฐ€๋Šฅ.
  • ์„œ๋กœ ๊ฐ๊ธฐ ๋…๋ฆฝ๋œ ํŠธ๋žœ์žญ์…˜์—์„œ ํŠธ๋žœ์žญ์…˜ ๊ณต์œ  ๊ฐ€๋Šฅ

 

๋งŒ์•ฝ, ์—ฌ๋Ÿฌ๋ถ„๋“ค ์ค‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Controller์— ์˜์† ๋กœ์ง ํ˜ธ์ถœ ํ›„ ์™ธ๋ถ€ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋“ฑ์˜ ํ–‰์œ„๋ฅผ ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด OSIV ์˜ต์…˜์— ๋Œ€ํ•ด ๋‹ค์‹œ ํ•œ ๋ฒˆ ์ƒ๊ฐํ•˜์‹ค ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments