๐ค ๋ฐฐ๊ฒฝ
์คํ๋ง์์ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ, ๋๋ ๊ฐ๋จํ๊ฒ JPA์ ํจ๊ป @Transactional ์ด๋ ธํ ์ด์ ์ ํด๋์ค ํน์ ๋ฉ์๋์ ์ค์ ํด ์๋ค. ๊ทธ๋ฌ๋ ์ค ์ต๊ทผ ์ด์ ์ค์ธ ์๋น์ค์์ Transaction Lock ์ด์๊ฐ ๋ฐ์ํ๋ฉด์ ๋ฌธ๋ ์ด๋ ๊ฒ ๋ง ์ฌ์ฉํ๋ ๊ฒ ์ณ์ ์ผ์ธ๊ฐ๋ฅผ ๊ณ ๋ฏผํ๊ฒ ๋์๊ณ , ์กฐ์ฌ ๋ฐ ์ ๋ฆฌ ์ฐจ์์์ ํด๋น ๋ด์ฉ์ ๋ํด ์์ฑํ๊ฒ ๋์๋ค.
ํด๋น ํฌ์คํ ์์๋ @Transactional ๊ฐ๋ ๊ณผ ์๋ฆฌ๋ณด๋ค๋ ํน์ง, ์ฌ์ฉ ๋ฐฉ๋ฒ, ์ฃผ์์ ์ ๋ํด์ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ๊ณ ์ ํ๋ค.
1. ํน์ง
@Transactional์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค.
- AOP๋ฅผ ํตํด ๊ตฌํ๋์๋ค.
- ์ด๋ ธํ ์ด์ ์ด ์ ์ธ๋ ํด๋์ค์ ํธ๋์ญ์ ์ด ์ ์ฉ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
- CheckedException ๋๋ ์์ธ๊ฐ ์๋ ๊ฒฝ์ฐ๋ ๋ฉ์๋๊ฐ ์ข
๋ฃ๋๋ฉด์ Commit ์ฒ๋ฆฌ๋๋ค.
- UncheckedException๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๋ Rollback ์ฒ๋ฆฌ๋๋ค.
- Proxy Mode๊ฐ Default๋ก ์ค์ ๋์ด์๋ค.
2. ์ฌ์ฉ ๋ฐฉ๋ฒ
@Transactional ์ด๋ ธํ ์ด์ ์ ์ดํด๋ณด๋ฉด ์ ์ ์๋ฏ์ด ์ผ๋ฐ์ ์ผ๋ก Service Layer์ ํด๋์ค ๋๋ ๋ฉ์๋์ ์ ์ฉํ๋ค.
Repository Layer์๋ ์ ์ธ ๊ฐ๋ฅํ์ง๋ง ์ ํธํ์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค. (์คํ๋ง ๊ณต์ ๋ฌธ์)
๊ฐ์ธ์ ์ผ๋ก ์ ํธํ๋ ๋ฐฉ์์ ํด๋์ค ๋จ์ @Transactional(readOnly = true) readOnly ์ต์ ์ ๋ถ์ฌํด์ ์ ์ธํ๊ณ ,
Create, Update, Delete๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ๋ฉ์๋ ๋จ์ @Transactional์ ์ ์ธํ๋ค.
Why?
๊ฐ๋ฐ ๊ณผ์ ์์ ์ค์๋ก readOnly ์ต์ ์ ์ ์ฉํ์ง ์์ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. readOnly๋ JPA์ ์ฌ์ฉํ ๋ CUD ์ฒ๋ฆฌ๋ฅผ ์ ์ธํจ์ผ๋ก์จ(์ค๋ ์ท ๊ด๋ฆฌ X) ์กฐํ ์ฑ๋ฅ์ ํฅ์ํ ์ ์๋ ์ค์ํ ์ต์ ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก CUD ๊ณผ์ ์ด ํ์ํ ๊ฒฝ์ฐ ๋ณ๋๋ก ๋ฉ์๋์ @Transactional์ ์ ์ธํจ์ผ๋ก์จ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
readOnly๋ ์ฑ๋ฅ ํฅ์ ์ต์ ๋ฟ๋ง ์๋๋ผ ์๋น์ค์์ Mater(CRUD), Slave(Read Only)๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ๋ฆฌ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ, ํด๋น ์ต์ ์ ๋ฐํ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ํฌ์ธํธ๋ฅผ ๋ค๋ฅด๊ฒ ์ ์ฉํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ค์ ์์์ด๋ค.
3. ์ฃผ์์
- ์ธ๋ถ API ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ๋ @Transactional ์ฌ์ฉ์ ๊ณ ๋ฏผํ์.
์ธ๋ถ API ์์ฒญ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ์์ค๊ฐ ๋ง์ด ๋ค๊ณ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ฝ API ์ฒ๋ฆฌ๊ฐ ์๋ ์๋น์ค ๋ฉ์๋์ @Transactional์ ์ ์ธํ๋ค๋ฉด, ํด๋น ์๋น์ค ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ํธ๋์ญ์ ์ด ์กํ์์ ๊ฒ์ด๋ฏ๋ก ์ฑ๋ฅ ์์ผ๋ก ๋ฌธ์ ๊ฐ ์์์ง ๊ณ ๋ฏผํด๋ณด์์ผ ํ๋ค.
- Propagation.REQUIRES_NEW๋ ์๋ก์ด ํด๋์ค์ ์ ์ธํด์ ์ฌ์ฉํ์.
์๋ก์ด ํธ๋์ญ์ (Propagation.REQUIRES_NEW)์ ๋์ผํ ํด๋์ค ๋ด ๋ฉ์๋์์ ํธ์ถํ๋ฉด ์๋ก ์์ฑ๋์ง ์๋๋ค. ๋ฐ๋์ ๋ค๋ฅธ ํด๋์ค์์ ์ ์ธํ๊ณ ํธ์ถํด์ผ ํ๋ค.
์คํ๋ง ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด, Default Proxy Mode(์คํ๋ง์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ Proxy)์์๋ ํ๋ก์๋ฅผ ํตํด ๋ค์ด์ค๋ ์ธ๋ถ(๋ค๋ฅธ ํด๋์ค) ๋ฉ์๋ ํธ์ถ๋ง ๊ฐ๋ก์ฑ๋ค๊ณ ํ๋ค. ์ฆ, ์์ฒด ํธ์ถ(๋์ผํ ํด๋์ค์์ ๋ค๋ฅธ ๋ฉ์๋๋ฅผ ํธ์ถ)์ ํธ์ถ๋ ๋ฉ์๋๊ฐ @Transactional๊ฐ ์์ด๋ ๋ฐํ์ ์ ์ค์ ํธ๋์ญ์ ์ผ๋ก ์ด์ด์ง์ง ์๋๋ค.
๊ณต์ ๋ฌธ์์ ์๋ ๋ด์ฉ์ด๋ฏ๋ก, ์์ธํ ์๋ฆฌ์ ๋ด์ฉ์ REFERENCE๋ฅผ ์ฐธ๊ณ ํ์.
- public ๋ฉ์๋์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
์คํ๋ง ํธ๋์ญ์ AOP ๊ธฐ๋ฅ์ public์์๋ง ํธ๋์ญ์ ์ ์ ์ฉํ ์ ์๋๋ก ๊ธฐ๋ณธ ์ค์ ์ด ๋์ด์๋ค.
private, protected ๋ฉ์๋์ ์ ์ธํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง๋ ์์ง๋ง, ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์๋๋ค.
- ์ด๊ธฐํ ์์ ์ดํ์ ์ ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์คํ๋ง ํ๋ ์์ํฌ์์๋ ์ด๊ธฐํ ์ฝ๋๊ฐ ์คํ๋ ๋ค ํธ๋์ญ์ AOP๊ฐ ์ ์ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก @PostConstruct ์ ๋ ธํ ์ด์ ๊ณผ @Transactional ์ ๋ ธํ ์ด์ ์ ๊ฐ์ด ์ฌ์ฉํ ๊ฒฝ์ฐ ์์๊ณผ ๋ฌ๋ฆฌ ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์๋๋ค.
REFERENCE
Using @Transactional :: Spring Framework
The @Transactional annotation is metadata that specifies that an interface, class, or method must have transactional semantics (for example, "start a brand new read-only transaction when this method is invoked, suspending any existing transaction"). The de
docs.spring.io
๋๊ธ