๋ชฉ์ฐจ (OPEN)
- ๐ @Transactional ์ด๋
- ๐๐ปโ๏ธ ํ๋ก์ ๊ธฐ๋ฐ ๋์ ๊ตฌ์กฐ
- โ ๏ธ ๊ณ ๋ คํด์ผ ํ ๊ฒ๋ค
- 1๏ธโฃ ํ๋ก์ ์ฐํ ํธ์ถ ๋ฌธ์
- 2๏ธโฃ ์ฒดํฌ ์์ธ ๋ก๋ฐฑ ์ฌ๋ถ
- 3๏ธโฃ readOnly ์ต์ ์ ์๋ฏธ์ ์ฃผ์์
- 4๏ธโฃ ํธ๋์ญ์ ์ ํฌ๊ธฐ ์กฐ์
- 5๏ธโฃ ๋น๋๊ธฐ ๋ก์ง๊ณผ ํธ๋์ญ์ ์ ๊ด๊ณ
- ๐ ๊ฒฐ๋ก

๐ @Transactional ์ด๋
Spring Framework์์ @Transactional์ ํธ๋์ญ์ ์ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํ ํต์ฌ ์ด๋ ธํ ์ด์ ์ด๋ค.
๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง ๋ฉ์๋์ @Transactional์ ๋ช ์ํจ์ผ๋ก์จ,
ํด๋น ๋ฉ์๋ ์คํ ์ ํ์ ํธ๋์ญ์ ์ ์์๊ณผ ์ข ๋ฃ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ์ง์ํ๋ค.
์ด๋ PlatformTransactionalManager๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ,
๋ด๋ถ์ ์ผ๋ก๋ AOP (Aspect Oriented Programming)๋ฅผ ํตํด์ ๋์ํ๋ค๊ณ ํ๋ค.
์ฆ, @Transactional์ด ๋ถ์ ๋งค์๋๋ Spring์ด ์์ฑํ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด ํธ์ถ๋๋ฉฐ,
ํ๋ก์ ๋ด๋ถ์์ ํธ๋์ญ์ ์ ์์๊ณผ ์ข ๋ฃ๋ฅผ ๋ด๋นํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๐๐ปโ๏ธ ํ๋ก์ ๊ธฐ๋ฐ ๋์ ๊ตฌ์กฐ
์ข ๋ ํ์ด์ ์ค๋ช ํ์๋ฉด,
Spring์์๋ @Transactional์ด๋ผ๋ ์ด๋ ธํ ์ด์ ์ ํตํด ํธ๋์ญ์ ์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ ์ธํ ์ ์๋๋ก ์ง์ํด์ค๋ค.
์ด ์ด๋ ธํ ์ด์ ์ ํด๋์ค ๋๋ ๋ฉ์๋์ ๋ถ์ด๊ธฐ๋ง ํ๋ฉด,
Spring์ด ๋ด๋ถ์ ์ผ๋ก ํด๋น ๋ฉ์๋์ ๋ํด ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ก์ง์ ์๋์ผ๋ก ์ ์ฉํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด๋ฌํ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ ์ด์ ๋ ๋ฐ๋ก ํ๋ก์ (Proxy)๋ผ๋ ๊ธฐ์ ๋๋ถ์ด๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋ ๋, Spring์ @Transactional์ด ๋ถ์ ํด๋์ค๋ ๋ฉ์๋๋ฅผ ๊ฐ์ธ๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ด ํ๋ก์๋ ์ค์ ์๋ณธ ํด๋์ค์ ๋์์ ๋์ ์ํํ๋ ๋๋ฆฌ ๊ฐ์ฒด์ด๋ฉฐ,
ํต์ฌ์ ์ธ ์ญํ ์ ๋น์ฆ๋์ค ๋ก์ง์ ์คํ ์์ ์ ๊ฐ๋ก์ฑ์, ํธ๋์ญ์ ์ ์์ํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.
์ฆ, ์ฐ๋ฆฌ๊ฐ ์๋น์ค๋ฅผ ํธ์ถํ๋ฉด,
์ค์ ๋ก๋ ์๋ณธ ํด๋์ค๊ฐ ์๋, Spring์ด ๋ง๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋จผ์ ์์ฒญ์ ๋ฐ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ , ์ด ํ๋ก์๋ ์์ฒญ์ ๋ฐ์๋ง์ ์๋์ ๊ฐ์ ์์๋ก ๋์ํ๋ค.
- ํ์ฌ ์ด ๋ฉ์๋๋ฅผ ์คํํ๋ ๋ฐ์ ํธ๋์ญ์
์ด ํ์ํ์ง ํ์ธํ๋ค.
์๋ฅผ ๋ค์ด, @Transactional์ด ๋ถ์ด์๊ณ , ํธ๋์ญ์ ์ด ํ์ฑํ๋์ด ์์ง ์๋ค๋ฉด, ์ ํธ๋์ญ์ ์ ์์ํด์ผ ํ ๊ฒ์ด๋ค. - ํธ๋์ญ์
์ด ํ์ํ๋ค๊ณ ํ๋จ๋๋ฉด, Spring์ ๋ด๋ถ์ ์ผ๋ก PlatformTransactionManager๋ฅผ ํตํด ํธ๋์ญ์
์ ์์ํ๋ค.
๊ตฌ์ฒด์ ์ผ๋ก๋ JDBC ์ปค๋ฅ์ ์ ์๋ ์ปค๋ฐ์ ๋๊ณ , ํธ๋์ญ์ ์ ๊ด๋ฆฌํ ์ ์๋ ์ํ๋ก ์ง์ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ด ์์ ๋ถํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ชจ๋ ๋ณ๊ฒฝ ์์ ์ด ํธ๋์ญ์ ์ ๊ด๋ฆฌ ํ์ ๋์ด๊ฒ ๋๋ค. - ํธ๋์ญ์
์ด ์์๋ ์ํ์์๋ ์ด์ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ด ์คํ๋๋ค.
์๋ฅผ ๋ค์ด, DB์ ๊ฐ์ ์ ์ฅํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ฑ์ ์์ ์ด ์ด๋ฃจ์ด์ง๊ฒ ๋๋ ๊ฒ์ด๋ค. - ๋น์ฆ๋์ค ๋ก์ง์ด ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด, Spring์ ํธ๋์ญ์
์ ์ปค๋ฐํ์ฌ ๋ชจ๋ ๋ณ๊ฒฝ์ฌํญ์ DB์ ์ต์ข
๋ฐ์ํ๋ค.
๋ฐ๋๋ก, ๋ก์ง ์ค๊ฐ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด Spring์ ํธ๋์ญ์ ์ ๋กค๋ฐฑํด์ ์ง๊ธ๊น์ง ์ํ๋ ๋ณ๊ฒฝ์ฌํญ์ ๋ชจ๋ ์ทจ์ํ๋ค.
์ด์ฒ๋ผ ๊ฐ๋ฐ์๋ @Transactional์ ๋ฉ์๋์ ์ ์ธํ๊ธฐ๋ง ํ๋ฉด,
ํธ๋์ญ์ ์ผ ์์ํ๊ฑฐ๋ ์ข ๋ฃํ๋ ์ฝ๋๋ฅผ ์ ํ ์์ฑํ์ง ์์๋,
Spring์ด ๋ฐํ์์ ์์ฑํ ํ๋ก์๊ฐ ์์ ๊ฐ์ ์์ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค.
์ด ๋๋ถ์ ๋น์ฆ๋์ค ๋ก์ง ์์ฒด๋ ํธ๋์ญ์ ์ ์ด ๋ก์ง์ผ๋ก๋ถํฐ ๋ถ๋ฆฌ๋์ด ๊น๋ํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋๋ฅผ ์ ์งํ ์ ์๋ ๊ฒ์ด๋ค โจ
โ ๏ธ ๊ณ ๋ คํด์ผ ํ ๊ฒ๋ค
Spring์์ @Transactional ์ด๋ ธํ ์ด์ ์ ๋งค์ฐ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ง๋ง,
๋ด๋ถ ๋์ ๋ฐฉ์์ ์ ํํ ์ดํดํ์ง ๋ชปํ ์ฑ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์์น ๋ชปํ ๋์์ด๋ ๋ฒ๊ทธ๋ก ์ด์ด์ง ์ ์๋ค.
ํนํ, ์ค๋ฌด ํ๊ฒฝ์์๋ ํธ๋์ญ์ ์ฒ๋ฆฌ์ ์ ํ์ฑ๊ณผ ์ผ๊ด์ฑ์ด ์์คํ ์ ์ฒด์ ์์ ์ฑ๊ณผ ์ง๊ฒฐ๋๊ธฐ ๋๋ฌธ์,
์๋์ ๊ฐ์ ํญ๋ชฉ๋ค์ ๋ฐ๋์ ๊ณ ๋ คํด์ผ ํ๋ค๊ณ ํ๋ค.
1๏ธโฃ ํ๋ก์ ์ฐํ ํธ์ถ ๋ฌธ์
@Transactional์ ํ๋ก์ ๊ธฐ๋ฐ AOP ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.
์ด ๋ง์ ๊ณง, ํธ๋์ญ์
์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ ๋ก์ง์ด ์ค์ ๋น์ฆ๋์ค ๋ก์ง ๋ฉ์๋์ ์ง์ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ,
ํด๋น ๋ฉ์๋๋ฅผ ๊ฐ์ธ๊ณ ์๋ ํ๋ก์ธ ๊ฐ์ฒด์์ ํธ๋์ญ์
์ ๊ด๋ฆฌํ๋ค๋ ์๋ฏธ์ด๋ค.
์ด ๊ตฌ์กฐ์์ ํ ๊ฐ์ง ํํ ๋ฐ์ํ๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ,
๋ฐ๋ก ๋์ผ ํด๋์ค ๋ด๋ถ์์์ ์๊ธฐ ๋ฉ์๋ ํธ์ถ์ด๋ค.
์๋ฅผ ๋ค์ด, ํด๋์ค A์ methodA()์ methodB()๊ฐ ์๊ณ ,
methodA()์๋ @Transactional์ด ๋ถ์ด ์์ผ๋ฉฐ,
methodB()๋ methodA()๋ฅผ ๋ด๋ถ์์ ํธ์ถํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
์ด ๊ฒฝ์ฐ, methodB()๊ฐ this.methodA()์ฒ๋ผ ์๊ธฐ ์์ ์ ์ง์ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก methodA()๋ฅผ ์คํํ๋ฉด,
ํด๋น ํธ์ถ์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๊ฑฐ์น์ง ์๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์
์ด ์ ํ ์ ์ฉ๋์ง ์๋๋ค.
์ด๋ ์คํ๋ง AOP ๊ตฌ์กฐ์ ๊ทผ๋ณธ์ ์ธ ์ ์ฝ์ผ๋ก,
ํธ๋์ญ์
๋ก์ง์ ํ๋ก์๋ฅผ ํตํด ์ฐํ ํธ์ถ๋ ๋์๋ง ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ์ํฉ์ ํผํ๊ธฐ ์ํด์๋,
ํธ๋์ญ์
๊ฒฝ๊ณ๊ฐ ํ์ํ ๋ก์ง์ ๋ณ๋์ ์๋น์ค ํด๋์ค๋ก ๋ถ๋ฆฌํ๊ฑฐ๋,
AopContext.currentProxy()๋ฅผ ํ์ฉํด์ ํ์ฌ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ํธ์ถํด์ผ ํ๋ค.
๋ค๋ง, ํ์๋ ์ฌ์ฉ์ด ๊น๋ค๋กญ๊ณ ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ฏ๋ก, ์ผ๋ฐ์ ์ผ๋ก๋ ํด๋์ค ๋ถ๋ฆฌ๋ฅผ ๊ถ์ฅํ๋ค๊ณ ํ๋ค.
2๏ธโฃ ์ฒดํฌ ์์ธ ๋ก๋ฐฑ ์ฌ๋ถ
Spring์ ๊ธฐ๋ณธ ํธ๋์ญ์ ์ฒ๋ฆฌ ์ ์ฑ ์์๋,
RuntimeException๊ณผ Error ํ์ ์ ์์ธ๊ฐ ๋ฐ์ํ์ ๋๋ง ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๊ณ ,
Exception ์ฒ๋ผ ์ฒดํฌ ์์ธ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ์๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ๋์์ด๋ผ๊ณ ํ๋ค.
์ด๋ฌํ ์ค๊ณ๋ ์๋ฐ์ ์์ธ ์ฒ๋ฆฌ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ ์ํ ๊ฒ์ผ๋ก,
์ฒดํฌ ์์ธ๋ ์์น์ ์ผ๋ก ๋ณต๊ตฌ ๊ฐ๋ฅํ ์์ธ๋ก ๊ฐ์ฃผ๋๊ธฐ ๋๋ฌธ์
Spring์ ๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก ์ปค๋ฐ์ ์ํ๋ ๊ฒ์ผ๋ก ํด์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฌ๋ ์ค๋ฌด์์๋ ์ฒดํฌ ์์ธ ์ญ์ ๋กค๋ฐฑ๋์ด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ฐ๋ผ์,
์๋ฅผ ๋ค์ด ํ์ผ ์ ๋ก๋๋ ์ธ๋ถ API ํต์ ๋ฑ์์ IOException๊ณผ ๊ฐ์ ์ฒดํฌ ์์ธ๊ฐ ๋ฐ์ํ์ ๋์๋ DB ์์ ์ ๋กค๋ฐฑํ๊ณ ์ถ๋ค๋ฉด,
@Transactional ์ด๋ ธํ ์ด์ ์ ๋ค์๊ณผ ๊ฐ์ด ๋ช ์์ ์ผ๋ก ๋กค๋ฐฑ ๋์์ ์ง์ ํด์ฃผ์ด์ผ ํ๋ค.
@Transactional(rollbackFor = IOException.class)
๋๋, ๋ณด๋ค ์ผ๋ฐ์ ์ธ ๋ฐฉ์์ผ๋ก๋ rollbackFor = Exception.class์ ๊ฐ์ด ๋ชจ๋ ์ฒดํฌ ์์ธ๋ฅผ ํฌํจ์ํฌ ์๋ ์๋ค๊ณ ํ๋ค.
์ด๋ฌํ ๊ฒ๋ค์ ๋ช ํํ ํ์ง ์์ผ๋ฉด,
์์ธ๊ฐ ๋ฐ์ํ์์๋ ๋ถ๊ตฌํ๊ณ , DB์ ์๋ชป๋ ๋ฐ์ดํฐ๊ฐ ์ปค๋ฐ๋๋ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์์ผ๋ ์ ์ ๊ฒฝ์จ์ฃผ์ด์ผ๊ฒ ๋ค ๐คฏ
3๏ธโฃ readOnly ์ต์ ์ ์๋ฏธ์ ์ฃผ์์
@Transactional ์ด๋ ธํ ์ด์ ์ readOnly ์์ฑ์ ์ง์ํ๋ค.
๋ฐ๋ผ์ ์ด ์์ฑ์ ์๋์ ๊ฐ์ด true๋ก ์ค์ ํ๋ฉด ํด๋น ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ฒ๋ฆฌ๋ ๊ฒ์ด๋ค.
@Transactional(readOnly = true)
์ด ์ค์ ์ JPA ๋๋ JDBC ๋๋ผ์ด๋ฒ์๊ฒ
"์ด ํธ๋์ญ์ ์์๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๋ฐ์ํ์ง ์์."๋ผ๋ ํํธ๋ฅผ ์ ๊ณตํด์ค๋ค.
์ด๋ก ์ธํด Hibernate๋ dirty checking์ ๋นํ์ฑํ ํ๊ณ flush๋ฅผ ์๋ตํ๋ ๋ฑ, ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ์ฌ๋ฌ ์ต์ ํ๋ฅผ ์ ์ฉํ๋ค.
ํ์ง๋ง ์ฃผ์ํ ์ ์, readOnly = true๊ฐ ๊ฐ์ ์ ์ธ ์ฐ๊ธฐ ๋ฐฉ์ง ๊ธฐ๋ฅ์ ์๋๋ผ๋ ๊ฒ์ด๋ค.
์ฆ, ํธ๋์ญ์ ๋ด๋ถ์์ ์ค์๋ก ์ํฐํฐ๋ฅผ ์์ ํ๊ฑฐ๋ ์ฝ์ ํ๋ ๊ฒฝ์ฐ,
Hibernate๋ flush ์์ ์ ํด๋น ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ํ๋ ค๊ณ ์๋ํ๊ฒ ๋๋ฉฐ,
์ด๋ก ์ธํด์ flush ์์ธ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์๋์น ์์ ์ฐ๊ธฐ ์์ ์ด ์งํ๋ ์ ์๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์ readOnly ํธ๋์ญ์ ์์๋ ์ ๋ง๋ก ์ฝ๊ธฐ ์ ์ฉ ์์ ๋ง ์ํํ๋๋ก ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ,
์ฐ๊ธฐ ์์ ์ ๋ฐ๋์ readOnly = false๊ฐ ์ ์ฉ๋ ๋ณ๋์ ํธ๋์ญ์ ์์ ์ํํ๋ ๊ฒ์ด ๋ฐ๋์งํ ๊ฒ์ด๋ค.
4๏ธโฃ ํธ๋์ญ์ ์ ํฌ๊ธฐ ์กฐ์
ํธ๋์ญ์ ์ด ์ ์ฉ๋๋ ์ฝ๋ ๋ธ๋ก์ ๊ธธ์ด๋ ์ง์ ์๊ฐ ๋ํ ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ด๋ผ๊ณ ํ๋ค.
๋ง์ฝ, ํธ๋์ญ์ ์ด ๋๋ฌด ์งง์ ๊ฒฝ์ฐ์๋,
๋น๋ฒํ begin๊ณผ commit ๋๋ rollback์ด ๋ฐ์ํด์ ์คํ๋ ค ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ์ฆ๊ฐํ ์ ์๊ธฐ ๋๋ฌธ์
๋จ์ํ ์กฐํ๋ ์งง์ ์์ ์ ํธ๋์ญ์ ์ ๋ถํ์ํ๊ฒ ๋ง์ด ์์ฑํ๋ ๊ฒ๋ ๋ญ๋น์ธ ๊ฒ์ด๋ค.
๋ฐ๋๋ก, ํธ๋์ญ์ ์ด ๋๋ฌด ๊ธด ๊ฒฝ์ฐ์๋,
์ปค๋ฅ์ ์ด ์ฅ์๊ฐ ์ ์ ๋๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฝ์ด ์ค๋ซ๋์ ์ ์ง๋์ด ๋์์ฑ ๋ฌธ์ ๋ deadlock ๋ฐ์ ํ๋ฅ ์ด ๋์์ง๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์ ํธ๋์ญ์ ์ DB์ ๋ฐ์๋์ด์ผ ํ๋ ์์ ๋จ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ช ํํ ์ ์ํด์ผ ํ๋ฉฐ,
๋ถํ์ํ๊ฒ ๋์ ๋ฒ์๋ฅผ ๊ฐ์ง์ง ์๋๋ก ํญ์ ์ ์ํด์ผ ํ๋ค๊ณ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก๋ ํ๋์ ๋ ผ๋ฆฌ์ ์์ ๋จ์๊ฐ ํธ๋์ญ์ ์ ๊ฒฝ๊ณ๊ฐ ๋์ด์ผ ํจ์ ๊ธฐ์ตํ์.
5๏ธโฃ ๋น๋๊ธฐ ๋ก์ง๊ณผ ํธ๋์ญ์ ์ ๊ด๊ณ
Spring์์๋ @Async๋ฅผ ์ฌ์ฉํด์ ๋ฉ์๋๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์คํํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฐฉ์์ ๋ณ๋์ ์ฐ๋ ๋์์ ๋ฉ์๋๊ฐ ์คํ๋๊ธฐ ๋๋ฌด์, ๊ธฐ์กด ํธ๋์ญ์ ์ปจํ ์คํธ์๋ ์์ ํ ๋ถ๋ฆฌ๋ ์ํ์์ ๋์ํ๋ค.
์ฆ, @Transactional์ด ์ ์ฉ๋ ๋ฉ์๋ ๋ด๋ถ์์ @Async ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด,
ํด๋น ๋น๋๊ธฐ ๋ฉ์๋๋ ํธ๋์ญ์ ์ด ์์ง ์ปค๋ฐ๋๊ธฐ ์ ์ ์คํ๋ ์ ์์ผ๋ฉฐ,
๋์ผํ ํธ๋์ญ์ ์ปจํ ์คํธ๋ฅผ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ DB ์ผ๊ด์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด๋ฌํ ์ํฉ์์๋ ํธ๋์ญ์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ปค๋ฐ๋ ์ดํ์๋ง ๋น๋๊ธฐ ๋ก์ง์ด ์คํ๋๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค.
Spring์์๋ ์ด๋ฅผ ์ํด @TransactionalEventListener(phase = AFTER_COMMIT)์ ์ ๊ณตํ๋ค.
์ด ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด, ์ง์ ๋ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ํธ๋์ญ์ ์ปค๋ฐ ์งํ์ ์คํ๋๋ฏ๋ก,
DB์ ๋ฐ์์ด ํ์ ๋ ์ดํ์ ์์ ํ ์์ ์์ ์๋ฆผ ๋ฐ์ก์ด๋ ๋ฉ์์ง ํ ๋ฐํ ๋ฑ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ ์ ์๋ ๊ฒ์ด๋ค.
๐ ๊ฒฐ๋ก
์์์ ์ดํด๋ณธ ๋ด์ฉ์ ์ข ํฉํ๋ฉด,
@Transactional์ ์ ์ธ์ ์ธ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋งค์ฐ ํธ๋ฆฌํ ๋๊ตฌ์ด์ง๋ง,
ํ๋ก์ ๊ธฐ๋ฐ์ ๋์ ํน์ฑ๊ณผ ํธ๋์ญ์ ์ ํ ๋ฐ ์์ธ ์ฒ๋ฆฌ ์ ์ฑ ์ ์ ํํ ์ดํดํ์ง ์์ผ๋ฉด
์ค๋ฌด์์ ์๊ธฐ์น ์์ ๋์์ ์ ๋ฐํ ์ ์์ ๊ฒ ๊ฐ๋ค.
์ค๋ ์ ๋ฆฌํ ๋ด์ฉ๋ค์ ์ฒด๊ณ์ ์ผ๋ก ์ดํดํ๊ณ ์ ์ฉํด์,
@Transactional์ ์์ ์ ์ด๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํจ์ผ๋ก์จ
์ฌ๋ฌ DB ์ฐ์ฐ์ด ์ฝํ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์์๋ ๋ฐ์ดํฐ ์ ํฉ์ฑ๊ณผ ์์ธ ์ฒ๋ฆฌ ์์ฑ๋๋ฅผ ๋์ผ ์ ์๋๋ก ํด์ผ๊ฒ ๋ค.
'๐ป๊ณต๋ถ ๊ธฐ๋ก > ๐ Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Backend] RedisConfig ์์ฑ: Redis ์ฐ๋ํ๊ธฐ (1) | 2025.06.29 |
|---|---|
| [Backend] RedisTemplate (1) | 2025.06.28 |
| [Backend] Redis TTL + JWT (0) | 2025.06.22 |
| [Backend] JWT (0) | 2025.06.21 |
| [Backend] Java 17 VS Java 21 (2) | 2025.06.17 |