๐ Spring ํธ๋์ญ์ ์ ํ(Propagation), ์ธ์ ์ด๋ค ๊ฑธ ์จ์ผ ํ ๊น?
Spring์์ @Transactional์ ์ฌ์ฉํ ๋ propagation ์์ฑ์ ์ ํํ ์ดํดํ๋ ๊ฑด ์ ๋ง ์ค์ํฉ๋๋ค.
ํธ๋์ญ์
์ด ์ด๋ฏธ ์์๋์ด ์์ ๋, ํธ์ถ๋ ๋ฉ์๋๋ ๊ทธ ํธ๋์ญ์
์ ์ฐธ์ฌํ ์ง, ์๋ก ์์ํ ์ง๋ฅผ ์ด ์์ฑ์ด ๊ฒฐ์ ํ์ฃ .
์ด ํฌ์คํธ์์๋ Spring์ ์ ํ ์ต์
๋ค์ ์ ๋ฆฌํ๊ณ , ์ค์ ์ํฉ์ ๋ง๋ ์ ํ๋ฒ๋ ํจ๊ป ์๊ฐํ ๊ฒ์.
โ propagation์ด๋?
ํธ๋์ญ์ ์ด ์๋ ์ํ์์, ํธ์ถ๋๋ ๋ฉ์๋๊ฐ ์ด๋ป๊ฒ ๋ฐ์ํ ์ง ์ค์ ํ๋ ๊ฒ
Spring์ ์ด 7๊ฐ์ง ์ ํ ์ต์ ์ ์ ๊ณตํฉ๋๋ค:
| ์ต์ ๋ช | ์ค๋ช |
|---|---|
REQUIRED |
ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ฐธ์ฌ, ์์ผ๋ฉด ์๋ก ์์ (๊ธฐ๋ณธ๊ฐ) |
REQUIRES_NEW |
ํญ์ ์๋ก์ด ํธ๋์ญ์ ์์, ๊ธฐ์กด ํธ๋์ญ์ ์ ์ผ์ ์ค๋จ |
NESTED |
์ค์ฒฉ ํธ๋์ญ์ ์์ฑ (savepoint ๊ธฐ๋ฐ) |
SUPPORTS |
์์ผ๋ฉด ์ฐธ์ฌ, ์์ผ๋ฉด ํธ๋์ญ์ ์์ด ์คํ |
NOT_SUPPORTED |
ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์ค๋จ, ํธ๋์ญ์ ์์ด ์คํ |
MANDATORY |
๋ฐ๋์ ํธ๋์ญ์ ์์์๋ง ์คํ, ์์ผ๋ฉด ์์ธ |
NEVER |
ํธ๋์ญ์ ์ด ์์ผ๋ฉด ์์ธ ๋ฐ์, ์์ด์ผ๋ง ์คํ |
๐ก ์ ํ ์ต์ ๋ณ ์์ ์ ์ฌ์ฉ ์์
1. REQUIRED - ๊ธฐ๋ณธ๊ฐ
@Transactional(propagation = Propagation.REQUIRED)
public void serviceA() {
serviceB(); // ๊ฐ์ ํธ๋์ญ์
์ ์ฐธ์ฌ
}
โ ์ผ๋ฐ์ ์ธ CRUD, ์๋น์ค ๊ณ์ธต ๋ก์ง์ ๊ฐ์ฅ ์ ํฉ
2. REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void serviceB() {
// ๊ธฐ์กด ํธ๋์ญ์
์ค๋จ, ์ ํธ๋์ญ์
์์
}
โ ์: ๋ก๊ทธ ์ ์ฅ, ์๋ฆผ ์ ์ก ๋ฑ ๋ฉ์ธ ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋ ์์ ์ฒ๋ฆฌ
3. NESTED
@Transactional(propagation = Propagation.NESTED)
public void serviceC() {
// savepoint ๊ธฐ๋ฐ ์ค์ฒฉ ํธ๋์ญ์
}
โ ์ผ๋ถ ์์ ๋ง ๋กค๋ฐฑํ๊ณ ๋๋จธ์ง๋ ์ ์งํ๊ณ ์ถ์ ๋ โ JDBC savepoint ์ง์์ด ํ์
4. SUPPORTS
@Transactional(propagation = Propagation.SUPPORTS)
public void readService() {
// ํธ๋์ญ์
์ ๋ฌด์ ๋ฐ๋ผ ์ ์ฐํ๊ฒ ์คํ
}
โ ์ฝ๊ธฐ ์ ์ฉ ์๋น์ค์ ์ ํฉ
5. NOT_SUPPORTED
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void externalCall() {
// ํธ๋์ญ์
์์ด ์คํ
}
โ ์ธ๋ถ API ํธ์ถ ๋ฑ ํธ๋์ญ์ ์ด ์คํ๋ ค ๋ฌธ์ ๋ ์ ์๋ ๊ฒฝ์ฐ
6. MANDATORY
@Transactional(propagation = Propagation.MANDATORY)
public void coreLogic() {
// ํธ๋์ญ์
์์ผ๋ฉด ์์ธ ๋ฐ์
}
โ ๋ฌด์กฐ๊ฑด ํธ๋์ญ์ ๋ด์์ ์คํ๋์ด์ผ ํ๋ ํต์ฌ ๋ก์ง
7. NEVER
@Transactional(propagation = Propagation.NEVER)
public void noTransactionAllowed() {
// ํธ๋์ญ์
์์ผ๋ฉด ์์ธ
}
โ ํธ๋์ญ์ ์ด ์ ๋ ์กด์ฌํด์ ์ ๋๋ ์์
โ ๏ธ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ๋ด๋ถ ๋ฉ์๋ ํธ์ถ ์
@Transactional์ ๋์ํ์ง ์์ (ํ๋ก์ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ) REQUIRES_NEW๋ ํธ๋์ญ์ ์ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ์น ์์ ์ปค๋ฐ/๋กค๋ฐฑ์ด ๋ฐ์ํ ์ ์์
๐ ์ธ์ ์ด๋ค ๊ฑธ ์จ์ผ ํ ๊น?
| ์ํฉ | ์ถ์ฒ ์ ํ ์ ๋ต |
|---|---|
| ์ผ๋ฐ์ ์ธ ์๋น์ค ๋ก์ง | REQUIRED |
| ๋ณ๋ ์ฒ๋ฆฌํ ๋ถ๊ฐ ๋ก์ง (๋ก๊ทธ, ์๋ฆผ) | REQUIRES_NEW |
| ๋ถ๋ถ ๋กค๋ฐฑ์ด ํ์ํ ์๋ธ ๋ก์ง | NESTED |
| ํธ๋์ญ์ ์ด ํ์์ธ ํต์ฌ ๋ก์ง | MANDATORY |
| ํธ๋์ญ์ ์์ด ์คํํด์ผ ํ ์์ | NOT_SUPPORTED or NEVER |
๐ง ๋ง๋ฌด๋ฆฌ
ํธ๋์ญ์
์ ํ ์ ๋ต์ ์ ์ดํดํ๊ณ ์ ์ฉํ๋ฉด, ๋น์ฆ๋์ค ๋ก์ง์ ์์ ์ฑ๊ณผ ์ ์ฐ์ฑ์ด ํจ์ฌ ํฅ์๋ฉ๋๋ค.
ํนํ REQUIRES_NEW๋ NESTED ๊ฐ์ ์ ๋ต์ ์๋ง ์ฐ๋ฉด ์ค๋ฌด์์ ํฐ ํ์ด ๋์ด์ค์.
๋ณต์กํ ํธ๋์ญ์
ํ๋ฆ์ ๋ง๋ฅ๋จ๋ ธ์ ๋, ์ด๋ค ์ ํ ์ต์
์ด ์ ์ ํ์ง ๊ผญ ํ ๋ฒ ๊ณ ๋ฏผํด๋ณด์ธ์!
'Spring & SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Gateway๋? Front Desk? Entrance? (0) | 2025.04.15 |
|---|---|
| MSA ํ๊ฒฝ์์ Spring Clound์ Role (1) | 2025.04.15 |
| Spring Boot์ Redis ์ฌ์ฉํด๋ณด๊ธฐ (0) | 2025.01.07 |
| @Slf4j ๋ฐ Logger์ ๋ํ ์ดํด (0) | 2024.04.28 |
| @RequestPart (0) | 2024.04.24 |