[Spring Data] @Transactional ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๋ณด๋Š” Spring์˜ ํŠธ๋žœ์žญ์…˜ ์ด์•ผ๊ธฐ

๋ฐ˜์‘ํ˜•

Spring์„ ํ•œ ๋ฒˆ ์ฏค ์‚ฌ์šฉํ•ด๋ณด์…จ๋‹ค๋ฉด Transactional ์–ด๋…ธํ…Œ์ด์…˜์— ๋Œ€ํ•ด ์•Œ๊ณ ๊ณ„์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฌด์ž‘์ • ์ผ์„ ๋• DB๋ž‘ ์—ฐ๊ฒฐํ•˜๊ณ  ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†ํ•  ๋•Œ ์ด๊ฑฐ ์“ฐ๋ฉด ๋ผ. ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๊ณ„์…จ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ ์ด ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ์™€ ๊ทธ๋ ‡์ง€ ์•Š์•˜์„ ๋•Œ ์™œ ์ด๋Ÿฐ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ ์ฏค ๊ถ๊ธˆ์ฆ์„ ๊ฐ€์ ธ๋ณด์‹  ๋ถ„๋“ค์ด ๊ณ„์‹ ๋‹ค๋ฉด ์ด ๊ธ€์„ ์ฐจ๋ถ„ํžˆ ์ฝ์–ด ๋ณด์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

Transaction

ํŠธ๋žœ์žญ์…˜์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฅธ ๊ธ€์—์„œ๋„ ์ถฉ๋ถ„ํžˆ ์–ธ๊ธ‰๋˜์–ด ์žˆ๋Š” ๋‚ด์šฉ์ด์ง€๋งŒ ์—ฌ๊ธฐ์„œ ํ•œ ๋ฒˆ ๋” ์„ค๋ช…์„ ๋“œ๋ฆฌ๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŠธ๋žœ์žญ์…˜์„ ์ด์•ผ๊ธฐํ•˜๋ฉฐ DBMS ํ˜น์€ ๊ทธ ์œ ์‚ฌํ•œ ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์—ฐ์‚ฐ๋“ค์˜ ์ƒํ˜ธ์ž‘์šฉ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. 

 

์ข€ ๋” ์‰ฝ๊ฒŒ ์„ค๋ช…์„ ํ•ด๋ณด๋ฉด, ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋ฅผ ์˜์†ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด๋“ค์€ ์„ฑ๊ณตํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด ๊ณ„์ขŒ์— ์žˆ๋Š” 40,000์› ์ค‘ Rye๋ผ๋Š” ์‚ฌ๋žŒ์—๊ฒŒ 30,000์›์„ ์†ก๊ธˆํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๊ทธ๋Ÿฌ๋Š” ๋„์ค‘ ๋„คํŠธ์›Œํฌ ์žฅ์• ๋กœ ์ธํ•˜์—ฌ ๋‚ด ๊ณ„์ขŒ์˜ ์ž”์•ก์€ 10,000์›์ด ๋˜์—ˆ์ง€๋งŒ Rye๋ผ๋Š” ์‚ฌ๋žŒ์€ 30,000์›์„ ๋ฐ›์ง€ ๋ชปํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

์šฐ๋ฆฌ๋Š” ์†ก๊ธˆ์ด๋ผ๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ์•„๋ž˜์˜ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

  1. ๋‚ด ๊ณ„์ขŒ์— ์žˆ๋Š” 40,000์›์—์„œ 30,000์›์„ ์ฐจ๊ฐํ•œ๋‹ค.
  2. Rye ๊ณ„์ขŒ์— 30,000์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  3. ์†ก๊ธˆ์„ ์™„๋ฃŒํ•œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ด ์ผ๋ จ์˜ ๊ณผ์ •์„ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์ด๋ผ๊ณ  ์ด์•ผ๊ธฐํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ ๋งŒ์•ฝ ์ค‘๊ฐ„์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด ํŠธ๋žœ์žญ์…˜์€ ์‹คํŒจ๋กœ ๋๋‚˜๊ฒŒ ๋˜์–ด ๋‚ด ๊ณ„์ขŒ์— ์žˆ๋˜ ๋ณ€๋™ ์‚ฌํ•ญ์€ ROLLBACK๋˜์–ด ์ง‘๋‹ˆ๋‹ค.

 

์œ„ ์‚ฌํ•ญ์„ ๋” ๊ฐ„๋žตํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜ ๋‚ด ์—ฐ์‚ฐ์€ ๋ชจ๋‘ ๋…๋ฆฝ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋ฉฐ, ๊ทธ ๊ณผ์ • ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†๊ณ , ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ด๋ผ๋„ ์˜ค๋ฅ˜๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์€ ์ทจ์†Œ๋˜๊ณ  ๋ชจ๋‘ ์›๋ž˜๋Œ€๋กœ ๋˜๋Œ์•„๊ฐ€์•ผ ํ•œ๋‹ค. ๋ฐ˜๋“œ์‹œ ๋ชจ๋“  ์—ฐ์‚ฐ์ด ์„ฑ๊ณตํ•ด์•ผ๋งŒ ํŠธ๋žœ์žญ์…˜์ด ์„ฑ๊ณต๋๋‹ค๊ณ  ๋ณธ๋‹ค.

 

์ด๋Ÿฌํ•œ ํŠธ๋žœ์žญ์…˜์˜ ์›์น™์€ ์˜๋„์น˜ ์•Š์€ ๊ฐ’์ด ์ €์žฅ๋˜๊ฑฐ๋‚˜ ์กฐํšŒ๋˜๋Š” ๊ฑธ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์›์น™์„ ์ž˜ ์ •๋ฆฌํ•œ ๊ฒƒ์„ ๋ฐ”๋กœ ACID๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

https://ko.wikipedia.org/wiki/ACID

 

ACID - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

๋‹ค๋ฅธ ๋œป์— ๋Œ€ํ•ด์„œ๋Š” ์• ์‹œ๋“œ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ญ์‹œ์˜ค. ACID(์›์ž์„ฑ, ์ผ๊ด€์„ฑ, ๊ณ ๋ฆฝ์„ฑ, ์ง€์†์„ฑ)๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์ด ์•ˆ์ „ํ•˜๊ฒŒ ์ˆ˜ํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ์„ฑ์งˆ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์•ฝ์–ด์ด๋‹ค. ์ง ๊ทธ

ko.wikipedia.org

 

 

 

@Transactional

Transactional ์–ด๋…ธํ…Œ์ด์…˜์€ Spring Framework์—์„œ ์ œ๊ณตํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค. ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์— ๋Œ€ํ•ด ์œ„ ํŠธ๋žœ์žญ์…˜ ์›์น™์ด ์ง€์ผœ์ง€๋„๋ก ๋ณด์žฅํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ ์ง์ ‘ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ์„ ์–ธ๋งŒ ํ•ด๋„ ์ด ๊ณผ์ •์ด ์ ์šฉ๋˜์–ด์„œ ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜์ด๋ผ๊ณ ๋„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š” ๋ชจ์ˆœ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

@Transactional์€ ๊ธฐ๋ณธ์ ์œผ๋กœ UnChecked Exception, Error๋งŒ์„ ๋กค๋ฐฑํ•œ๋‹ค.

 

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

 

๋”ฐ๋ผ์„œ ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” Transactional ์–ด๋…ธํ…Œ์ด์…˜์—์„œ rollbackedFor ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋กค๋ฐฑํ•  Exception ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋ฒˆ์—” ์ฃผ๋ฌธ ๋‚ด์—ญ์„ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋ฅผ ๋ดค์„ ๋•Œ๋Š” Transactional์ด ํ•„์š”์—†์„ ์ •๋„์ธ๋ฐ, ์™œ ์—ฌ๊ธฐ์„œ Transactional์ด ํ•„์š”ํ• ๊นŒ์š”?

 

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋„์ค‘, ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋‚˜ ํ•จ์ˆ˜์—์„œ ํ•ด๋‹น ๊ฐ’์„ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ์ž˜๋ชป๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š๋„๋ก ํ•จ.
  • ๋งŒ์•ฝ ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—์„œ ์ˆ˜์ •ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋‚˜ ํ•จ์ˆ˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ํ–‰์œ„๋ฅผ ํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐ˜์˜(commit)๋˜์ง€ ์•Š๋„๋ก ํ•จ.

 

์ด ๋ถ€๋ถ„์€ ACID ์ค‘ ์›์ž์„ฑ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์ž‘์—…์ด ์™„์ „ํ•˜๊ฒŒ ์„ฑ๊ณต, ํ˜น์€ ์‹คํŒจ๋กœ๋งŒ ๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ค‘๊ฐ„์— ์„ฑ๊ณตํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋”๋ผ๋„ ์ตœ์ข… ๋ถ€๋ถ„๊นŒ์ง€ ์™”์„ ๋•Œ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ๊ทธ ์ž‘์—…์€ ์‹คํŒจ๋กœ ๋๋‚˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

 

 

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

๊ทธ๋Ÿฌ๋ฉด ๋„๋Œ€์ฒด ์ด Transactional์€ ์–ด๋–ค์‹์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฑธ๊นŒ์š”? ์•„๋งˆ JPA๋ฅผ ๊ณต๋ถ€ํ•ด๋ณด์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด ์ด ์–ด๋…ธํ…Œ์ด์…˜์ด ๋งˆ๋ƒฅ JPA์—์„œ๋งŒ ๋™์ž‘ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ณธ๋ž˜ Transactional ์–ด๋…ธํ…Œ์ด์…˜์€ Spring Framework์—์„œ ์ง€์›ํ•˜๋Š” AOP ๋ฐฉ์‹์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด๋ฉฐ JPA ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Spring Data๋กœ ๊ตฌํ˜„๋œ R2DBC, JDBC์—์„œ๋„ ๋ชจ๋‘ ์ ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ž…๋‹ˆ๋‹ค.

(๋” ์ค‘์š”ํ•œ ๊ฒƒ์€ JPA๋„ JDBC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค)

 

AOP์— ๋Œ€ํ•ด์„œ ์ž์„ธํžˆ ์•Œ์•„๋ณด์‹œ๋ ค๋ฉด, ์•„๋ž˜์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•ด๋ณด์„ธ์š”.

 

 

[Spring] AOP (Aspect-Oriented Programming) ๊ธฐ๋ณธ๊ณผ ๊ฐœ๋…

Spring์—๋Š” AOP(Aspect-Oriented Programming, ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์ด๋ผ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์Œ? OOP(๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ผ๋Š” ๊ฒƒ์€ ๋“ค์–ด๋ดค๋Š”๋ฐ, AOP๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? AOP vs OOP ? ๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

blog.neonkid.xyz

์šฐ๋ฆฌ๋Š” Transactional์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์‹ค์ œ๋กœ Java์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์–ด๋–ป๊ฒŒ ์˜์†ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ๋Š” ์‹ค์ œ Java์—์„œ JDBC๋ฅผ ์ด์šฉํ•ด DataSource(DB์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ์ธํ„ฐํŽ˜์ด์Šค)์™€ ์ด๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ ๊ฐ์ฒด์ธ Connection์„ ์ด์šฉํ•ด์„œ DB์— ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

 

์‹ค์ œ๋กœ Transactional ์–ด๋…ธํ…Œ์ด์…˜์€ ์œ„ ๋‘ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์›€์ง์ด๋ฉฐ Transactional์—์„œ ๊ธฐ๋ณธ Exception์€ ์œ„์—์„œ ๋งํ•œ๊ฒƒ์ฒ˜๋Ÿผ UnChecked Exception์ด ๊ธฐ๋ณธ๊ฐ’์ธ ํ˜•ํƒœ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ์ฝ”๋“œ๋ฅผ ๋‚ด๊ฐ€ ๋งŒ๋“  ๋ฉ”์„œ๋“œ์— ์‚ฝ์ž…ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, JVM์—์„œ ์ด๋ ‡๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ”„๋ก์‹œ ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๊ณ , ์Šคํ”„๋ง์—์„œ๋Š” ํ›„์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ฐจํ›„ ๋‹ค๋ฅธ ๊ธ€์—์„œ ๊นŠ๊ฒŒ ๋‹ค๋ค„ ๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” Transactional์ด ์œ„์™€ ๊ฐ™์ด ๋™์ž‘ํ•˜๊ณ , JPA์—์„œ๋Š” JPA๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

JPA์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด Entity ๊ฐ์ฒด๋ฅผ ์˜์†ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๊ณ  ๊ทธ๋“ค์˜ ํŠธ๋žœ์žญ์…˜์€ Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ์ง„ํ–‰ํ•˜๋Š” ๊ฑธ๋กœ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— @Transactional์„ ์จ๋„ ๋ณธ๋ž˜ ํŠธ๋žœ์žญ์…˜์˜ ์›์น™์„ ์ •ํ™•ํžˆ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ์—์„œ ๋ณ„๋„์˜ EntityManager ๊ฐ์ฒด๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

 

Spring์—์„œ๋Š” ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ EntityManager ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด๋„ ํ•˜๋‚˜์˜ EntityManager๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์˜ ๊ฒฝ์šฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ 1๊ฐœ๋งŒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด์•ผ๊ธฐ๋Š” ์ฐจํ›„ propagation์„ ๋‹ค๋ฃจ๋ฉด์„œ ์ž์„ธํžˆ ์ด์•ผ๊ธฐ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

@Transactional ์˜ต์…˜

๋งˆ์ง€๋ง‰์œผ๋กœ Transactional ์–ด๋…ธํ…Œ์ด์…˜์˜ ์˜ต์…˜์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 

 

  • isolation

    ํŠธ๋žœ์žญ์…˜์—์„œ ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฐ์ดํ„ฐ ํ—ˆ์šฉ ์ˆ˜์ค€์„ ์„ค์ •ํ•˜๋Š” ๊ฐ’์œผ๋กœ JDBC์˜ isolation์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • propagation

    ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰ ์ค‘ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜ ์ˆ˜ํ–‰์— ๋ผ์น˜๋Š” ์˜ํ–ฅ์„ ์„ค์ •ํ•˜๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

  • noRollbackFor

    ํŠน์ • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด์„œ๋Š” rollback์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

  • rollbackFor

    ํŠน์ • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํด๋ž˜์Šค์— ๋Œ€ํ•ด rollback์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. (๊ธฐ๋ณธ์ ์œผ๋กœ UnChecked๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.)

  • timeout

    ์ง€์ •ํ•œ ์‹œ๊ฐ„ ๋‚ด ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, rollback ํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. (-1์ธ ๊ฒฝ์šฐ ๋ฌด์ œํ•œ, ๊ธฐ๋ณธ๊ฐ’)

  • readOnly

    ํŠธ๋žœ์žญ์…˜์„ ์ฝ๊ธฐ ์ „์šฉ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (DML ์—ฐ์‚ฐ์ด ์ˆ˜ํ–‰๋˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒ)

 

 

 

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

์ตœ๊ทผ์— Spring Data JDBC๋ฅผ ๋‹ค๋ฃจ๊ณ  ๋‚˜์„œ Spring์— ์žˆ๋Š” Transactional ์–ด๋…ธํ…Œ์ด์…˜์ด ๋‹จ์ˆœํžˆ JPA๋งŒ์„ ์œ„ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•˜๊ณ , ์ž‘์„ฑํ•˜๊ณ  ๋‚œ ๋’ค์—์„œ์•ผ Spring์€ ์—ญ์‹œ Framework ๋ผ๋Š” ๊ฑธ  ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ผˆ์ €๋ฆฌ๊ฒŒ ๋Š๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

 

๋ณธ๋ž˜ ์šฐ๋ฆฌ๊ฐ€ Transactional ์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜์†ํ•˜๋ ค๋ฉด ์ปค๋„ฅ์…˜์„ ๋งŒ๋“ค๊ณ , ์˜์†ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šคํ™” ํ•˜๊ฑฐ๋‚˜, Set์œผ๋กœ ๋ฌถ์–ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ • (begin ~ commit)์„ ์ง์ ‘ ์ฝ”๋“œ์— ๋‹ด์•„์„œ ๊ตฌํ˜„ํ•ด์•ผ ๋น„๋กœ์†Œ DB ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์™„์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

์ด ์™ธ์—๋„ Spring์—์„œ Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Spring Configuration์— @EnableTransactionManagement ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉํ•˜์—ฌ TransactionManager ์ธํ„ฐํŽ˜์ด์Šค์— DB ์—ฐ๊ฒฐ ์ •๋ณด ๊ฐ์ฒด์ธ DataSource๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ๊ฑฐ์ณ์•ผ ํ•˜์ง€๋งŒ Spring boot์—์„œ ์ด๋Ÿฌํ•œ ์„ค์ •๋“ค์„ ๋ชจ๋‘ ํ…œํ”Œ๋ฆฟ์ฒ˜๋Ÿผ ์ž˜ ๋งŒ๋“ค์–ด๋†จ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ Spring boot๋ฅผ ์“ธ ๋•Œ ๋งŒํผ์€ ์ตœ๋Œ€ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์…”์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

 
๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments