Transactional Annotation๊ณผ Proxy
@Transactional์ ๋ฉ์๋ ์คํ ์ ํ์ ํธ๋์ญ์ ์ ์์ํ๊ณ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ผ๋ก ์คํ๋ง์์ ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
ํธ๋์ญ์ ๊ฒฝ๊ณ ์ค์
- ํธ๋์ญ์
์์:
- @Transactional์ด ์ ์ฉ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ๋จผ์ PlatformTransactionManager๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์์ํ๋ค.
- ํธ๋์ญ์ ๋ฉ๋์ ๋ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๊ณ , ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ํธ๋์ญ์ ๋ชจ๋๋ก ์ ํ๋ค.
- ์ด๋ฅผ ํตํด ํด๋น ๋ฉ์๋๊ฐ ํธ๋์ญ์ ๋ด์์ ์คํ๋๋๋ก ํ๋ค.
- ํธ๋์ญ์
์ปค๋ฐ:
- ๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด TransactionManager๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ค.
- ํธ๋์ญ์
๋กค๋ฐฑ:
- ๋ฉ์๋ ์คํ ์ค์ ์ฒดํฌ๋ ์์ธ ์ด์ธ์ ์์ธ(๋ฐํ์ ์์ธ, ์ค๋ฅ)๊ฐ ๋ฐ์ํ๋ฉด TransactionManager๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก Checked Exception๋ ๋กค๋ฐฑํํ์ง ์๋๋ค.
- Runtime Exception, Error์ ๋กค๋ฐฑ์ ์ํํ๋ค.
- ํ์ง๋ง ๊ฐ๋ฐ์ฆ๊ฐ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ฌ ์ฒดํฌ๋ ์์ธ์ ๋กค๋ฐฑ์ ๋ฐ์์ํฌ ์ ์๋ค.
ํธ๋์ญ์ ์์ฑ
@Transactional ์ด๋ ธํ ์ด์ ์ ๋ค์ํ ์์ฑ์ ํตํด ํธ๋์ญ์ ์ ๋์ ๋ฐฉ์์ ์กฐ์ ํ ์ ์๋ค.
- propagation: ํธ๋์ญ์ ์ ํ ๋ฐฉ์ (์: REQUIRED, REQUIRES_NEW ๋ฑ)
- isolation: ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค (์: READ_COMMITTED, SERIALIZABLE ๋ฑ)
- timeout: ํธ๋์ญ์ ์ด ์๋ฃ๋์ด์ผ ํ๋ ์ต๋ ์๊ฐ
- readOnly: ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ฌ๋ถ
- rollbackFor: ๋กค๋ฐฑํ ์์ธ ํ์
- noRollbackFor: ๋กค๋ฐฑํ์ง ์์ ์์ธ ํ์
Proxy
ํ๋ก์๋ ์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ธ์, ํด๋ผ์ด์ธํธ์ ์ค์ ๊ฐ์ฒด ์ฌ์ด์์ ์ํธ์์ฉํ๋ค.
์คํ๋ง์์ ์ฃผ๋ก ๋ฐ๋ณต๋๋ ๋ถ๊ฐ๊ธฐ๋ฅ(๋ก๊น
, ํธ๋์ญ์
๊ด๋ฆฌ, ๋ณด์ ๋ฑ)์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค.
ํด๋ผ์ด์ธํธ๋ ์ค์ ๊ฐ์ฒด๋ฅผ ์ง์ ํธ์ถํ์ง ์๊ณ , ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ํธ์ถํ์ฌ, ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ์ดํ๊ณ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Spring AOP๋ ํ๋ก์ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
@Transactional์ Spring AOP์ ๋ํ์ ์ธ ์๋ก, Proxy ํํ๋ก ๋์ํ๋ค.
์คํ๋ง์์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๋ณด์.
์ธํฐํ์ด์ค ์ ์
1
2
3
public interface MyService {
void performTransaction();
}
MyService๋ ํธ๋์ญ์
์ ์ํํ ๋ฉ์๋๋ฅผ ์ ์ํ ์ธํฐํ์ด์ค์
๋๋ค. ์ธํฐํ์ด์ค๋ฅผ ํตํด ์๋น์ค ๊ตฌํ์ฒด์ ๋ฉ์๋์ ์ ๊ทผํฉ๋๋ค.
์๋น์ค ๊ตฌํ
1
2
3
4
5
6
7
@Service
public class MyServiceImpl implements MyService {
@Transactional
public void performTransaction() {
// ํธ๋์ญ์
๋ด์์ ์ํํ ์์
}
}
@Transactional ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ performTransaction() ๋ฉ์๋๋ฅผ ํธ๋์ญ์
์ฒ๋ฆฌํ๋๋ก ํ๋ค.
์ด ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ์คํ๋ง์ด ์๋์ผ๋ก ํธ๋์ญ์
์ ์์ํ๊ณ , ๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ํธ๋์ญ์
์ ์ปค๋ฐํ๋ฉฐ, ์์ธ ๋ฐ์ ์ ๋กค๋ฐฑํ๋ค.
ํ๋ก์ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ฌ์ฉ
1
2
3
// ํ๋ก์ ๊ฐ์ฒด ์์ฑ ๋ฐ ์ฌ์ฉ
MyService myService = (MyService) context.getBean("myService");
myService.performTransaction();
context.getBean(โmyServiceโ)๋ MyService ํ์
์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ํ๋ก์๋ ์คํ๋ง์ด ์๋์ผ๋ก ์์ฑํ ๋์ ํ๋ก์๋ก, ์ค์ MyServiceImpl์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ํธ๋์ญ์
๊ด๋ จ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ญํ ์ ํฉ๋๋ค.
myService.performTransaction()์ ํธ์ถํ๋ฉด, ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋ฉ์๋๋ฅผ ๊ฐ๋ก์ฑ๊ณ , ๋ฉ์๋ ํธ์ถ ์ ์ ํธ๋์ญ์
์ ์์ํ๊ณ , ๋ฉ์๋ ์ข
๋ฃ ํ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ์ ์ํํฉ๋๋ค
์คํ๋ง์ @Transactional์ด ๋ถ์ ๋ฉ์๋๋ฅผ ์คํํ ๋, JDK ๋์ ํ๋ก์๋ CGLIB์ ์ฌ์ฉํด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ํ๋ก์๋ ์๋ ๋ฉ์๋ ํธ์ถ ์ ์ ํธ๋์ญ์ ์ ์์ํ๊ณ , ๋ฉ์๋ ์๋ฃ ์ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ฑฐ๋, ์์ธ ๋ฐ์ ์ ๋กค๋ฐฑํ๋ค.
์ด ์ฝ๋์์๋ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก JDK ๋์ ํ๋ก์๊ฐ ์ฌ์ฉ๋๋ค.
๋ง์ฝ ์ธํฐํ์ด์ค๊ฐ ์๋ค๋ฉด CGLIB ํ๋ก์๊ฐ ์ฌ์ฉ๋๋ค.
ํ๋ก์ ์์ฑ ๋ฐฉ์
์ธํฐํ์ด์ค ๊ธฐ๋ฐ ํ๋ก์: ์คํ๋ง์ ๊ธฐ๋ณธ์ ์ผ๋ก JDK ๋์ ํ๋ก์๋ฅผ ์ฌ์ฉํด์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
ํด๋์ค ๊ธฐ๋ฐ ํ๋ก์ (CGLIB):
๋ง์ฝ ๋น์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ง ์์๋ค๋ฉด, ์คํ๋ง์ CGLIB๋ฅผ ์ฌ์ฉํ์ฌ ํด๋์ค ๊ธฐ๋ฐ ํ๋ก์๋ฅผ ์์ฑํ๋ค.
๊ทธ๋ฌ๋ฉด @Transactional์ ์ด๋ป๊ฒ ๋์ํ ๊น?
๋ฉ์๋์ ํธ์ถ์ด ์์๋จ๋ฉด ํธ๋์ญ์ ์ด ์์๋๊ณ , ๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ฉฐ, ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ด ๋กค๋ฐฑ๋๋ค.
1. ํ๋ก์ ๊ฐ์ฒด ์์ฑ
- ์คํ๋ง์ @Transactional์ด ์ ์ฉ๋ ํด๋์ค ๋๋ ๋ฉ์๋๋ฅผ ๊ฐ์ธ๋ ํ๋ก์๋ฅผ ์์ฑํ๋ค.
- ์ด ํ๋ก์๋ ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ๊ฐ์ฒด๋ฅผ ํธ์ถํ์ฌ, ํธ๋์ญ์ ๊ด๋ จ ๋ก์ง์ ์ฒ๋ฆฌํ๋ค.
2. ํธ๋์ญ์ ์์
- ๋ฉ์๋ ํธ์ถ์ด ์์๋๋ฉด, ํ๋ก์๋ ๋จผ์ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ํตํด ์๋ก์ด ํธ๋์ญ์ ์ ์์ํ๋ค.
- ์ด ๊ณผ์ ์์ ํธ๋์ฏ์ ๊ฒฝ๊ณ๊ฐ ์ค์ ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ๊ธฐ๋ก๋๋ค.
3. ๋น์ฆ๋์ค ๋ก์ง ์คํ
- ์ค์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ด๊ธด ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค. ์ด ๋ฉ์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฝ๊ธฐ, ์ฐ๊ธฐ ์์ ์ ํ๋ค.
4. ํธ๋์ญ์ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ
- ๋ฉ์๋๊ฐ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด, ํ๋ก์๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ค.
- ๋ฉ์๋ ์คํ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ํ๋ก์๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Transactional
public void placeOrder(Order order) {
// ํธ๋์ญ์
์์
orderRepository.save(order);
// ์ถ๊ฐ ๋ก์ง
// ํธ๋์ญ์
์ปค๋ฐ
}
}
์์ OrderService ํด๋์ค์์ placeOrder ๋ฉ์๋๋ @Transactional ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์
๊ฒฝ๊ณ๋ฅผ ์ ์ํ๊ณ ์๋ค.
์คํ๋ง์ ์ด ํด๋์ค์ ํ๋ก์๋ฅผ ์์ฑํ์ฌ placeOrder ๋ฉ์๋ ํธ์ถ์ ๊ฐ๋ก์ฑ๊ณ ํธ๋์ญ์
์ ๊ด๋ฆฌํ๋ค.
ํ๋ก์๊ฐ ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ๋์ ํ๋ ์ด์
- ์ผ๊ด์ฑ ์ ์ง:
- ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ ์๋์ผ๋ก ์ฒ๋ฆฌํด ์ค์ผ๋ก์จ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ์ฝ๊ฒ ์ ์งํ ์ ์๋ค.
- ์ฝ๋ ๊ฐ๊ฒฐํ:
- ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ์ฝ๋์์ ์ง์ ๊ตฌํํ์ง ์์๋ ๋๋ฏ๋ก ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ค.
- ์ค๋ณต ๋ฐฉ์ง:
- ๋์ผํ ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ ์ฌ๋ฌ ๊ณณ์์ ๋ฐ๋ณตํด์ ์์ฑํ ํ์๊ฐ ์๋ค.
- AOP ์ง์:
- ํ๋ก์๋ ์คํ๋ง AOP๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ๊ด๋ฆฌ์ ๊ฐ์ ํก๋จ ๊ด์ฌ์ฌ๋ฅผ ์ฝ๊ฒ ๊ตฌํํ ์ ์๊ฒ ํด์ค๋ค.
ํ๋ก์๋ ํธ๋์ญ์ ์์, ์ปค๋ฐ, ๋กค๋ฐฑ๊ณผ ๊ฐ์ ์์ ์ ๋์ ์ฒ๋ฆฌํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๊ฒ ํ๊ณ , ์ด ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ ๊ฐ๋ฅ์ฑ์ ์ค์ฌ์ค๋ค.
ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ Proxy ์์ด ์ง์ ๊ตฌํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Autowired
private PlatformTransactionManager transactionManager;
public void placeOrder(Order order) {
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
try {
// ํธ๋์ญ์
์์
orderRepository.save(order);
// ์ถ๊ฐ ๋น์ฆ๋์ค ๋ก์ง ์ํ
// ํธ๋์ญ์
์ปค๋ฐ
transactionManager.commit(status);
} catch (Exception ex) {
// ์์ธ ๋ฐ์ ์ ํธ๋์ญ์
๋กค๋ฐฑ
transactionManager.rollback(status);
throw ex; // ์์ธ ์ฌ๋ฐ์
}
}
}
ํ๋ก์ ์์ด ํธ๋์ญ์ ๊ด๋ฆฌ์ ๋ฌธ์ ์
- ๋ณต์ก์ฑ ์ฆ๊ฐ:
- ํธ๋์ญ์ ์ ์์ํ๊ณ , ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑํ๋ ์ฝ๋๊ฐ ๋ชจ๋ ํธ๋์ญ์ ๋ฉ์๋์ ๋ฐ๋ณต์ ์ผ๋ก ์์ฑ๋์ด์ผ ํ๋ค.
- ์ค๋ฅ ๊ฐ๋ฅ์ฑ:
- ํธ๋์ญ์ ์์, ์ปค๋ฐ, ๋กค๋ฐฑ ๋ก์ง์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ค ๋ณด๋ฉด ์ค์๋ก ๋น ๋จ๋ฆฌ๊ฑฐ๋ ์๋ชป ๊ตฌํํ ์ ์๋ค.
- ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์
๋ก์ง์ ํผํฉ:
- ๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ด ๊ฐ์ ๋ฉ์๋์ ์์ฌ ์์ด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๋ค.
- ์ฌ์ฌ์ฉ์ฑ ๋ถ์กฑ:
- ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ด ํน์ ๋ฉ์๋์ ๊ณ ์ ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค.
ํ๋ก์๋ฅผ ์ฌ์ฉํ ๋์ ์ฅ์
- ์ฝ๋ ๊ฐ๊ฒฐ์ฑ: ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ ๊ฐ ๋ฉ์๋์ ์์ฑํ ํ์ ์์ด @Transactional ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ์ง์ ํ ์ ์๋ค.
- ์ค๋ฅ ๊ฐ์: ์คํ๋ง์ด ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ๋์ ์ฒ๋ฆฌํ๋ฏ๋ก, ๊ฐ๋ฐ์๊ฐ ์ค์๋ก ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ ์๋ชป ๊ตฌํํ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ ๋ค.
- ๋น์ฆ๋์ค ๋ก์ง ์ง์ค: ํธ๋์ญ์ ๊ด๋ฆฌ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ์ฑ ํฅ์: ํธ๋์ญ์
๊ด๋ฆฌ ๋ก์ง์ ์ฌ์ฌ์ฉํ ์ ์๊ณ , ์ฝ๋ ์ค๋ณต์ด ์ค์ด๋ ๋ค.
1 2 3 4 5 6 7 8 9 10 11 12
@Service public class OrderService { @Autowired private OrderRepository orderRepository; @Transactional public void placeOrder(Order order) { orderRepository.save(order); // ์ถ๊ฐ ๋น์ฆ๋์ค ๋ก์ง ์ํ } }
@Transactional ์ ๋ ธํ ์ด์ ์ ์ด์ฉํ๋ฉด ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ํ๋ก์๋ฅผ ํตํด ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ๋์ ํด์ค๋ค.
@Transactional๊ณผ ํ๋ก์์ ๊ด๊ณ
- AOP์ ํ๋ก์ ํจํด:
- ์คํ๋ง์ AOP๋ฅผ ์ด์ฉํ์ฌ @Transactional ์ ๋ ธํ ์ด์ ์ ์ ์ฉํ ๋ ํ๋ก์ ํจํด์ ์ฌ์ฉํ๋ค.
- AOP๋ ์ฝ๋์ ํต์ฌ ๊ธฐ๋ฅ๊ณผ ๊ณตํต๋ ๊ธฐ๋ฅ(๋ถ๊ฐ ๊ธฐ๋ฅ)์ ๋ชจ๋ํํ์ฌ ๊ด๋ฆฌํ๋ ๊ธฐ์ ์ด๋ค.
- ํ๋ก์์ ์ญํ :
- @Transactional ๋ถ์ ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋, ์คํ๋ง ํ๋ ์์ํฌ๋ ๊ทธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ํ์ ์ถ๊ฐ์ ์ธ ์์ ์ ์ํํ๊ธฐ ์ํด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ์ด ํ๋ก์ ๊ฐ์ฒด๋ ์๋ณธ ๊ฐ์ฒด(์๋น์ค ํด๋์ค)๋ฅผ ๊ฐ์ธ๋ฉฐ, ํธ๋์ญ์ ๊ด๋ฆฌ์ ๊ฐ์ ๊ณตํต๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- ํธ๋์ญ์
๊ด๋ฆฌ:
- @Transactional ๋ถ์ ๋ฉ์๋๋ ํธ๋์ญ์ ํ๋ก์์ ์ํด ๊ฐ์ธ์ ธ ์คํ๋๋ค
- ํ๋ก์๋ ํธ๋์ญ์ ์ ์์ํ ํ ๋ฉ์๋๋ฅผ ์คํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ปค๋ฐ ๋๋ ๋กค๋ฐฑํ๋ค.
- ์ด๋ก ์ธํด ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค.
- ๊ฐํธํ ์ค์ :
- ๊ฐ๋ฐ์๋ @Transactional ์ฌ์ฉํ์ฌ ๊ฐํธํ๊ฒ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ์ ์ํ ์ ์๋ค.
- ์ด๋ ์ฝ๋๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๊ณ , ์ผ๊ด๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ๋ณด์ฅํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class OrderService {
@Autowired
private OrderRepository orderRepository;
@Transactional
public void placeOrder(Order order) {
// ๋น์ฆ๋์ค ๋ก์ง ์ํ
orderRepository.save(order);
// ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
๋ฑ
}
// ๋ค๋ฅธ ํธ๋์ญ์
๋ฉ์๋
@Transactional
public void cancelOrder(Order order) {
order.setStatus(OrderStatus.CANCELED);
orderRepository.save(order);
// ์ถ๊ฐ์ ์ธ ๋ก์ง ์ํ
}
}
์ด ์์์์ @Transactional ์ ๋
ธํ
์ด์
์ด ๋ถ์ placeOrder()์ cancelOrder() ๋ฉ์๋๋ ์คํ๋ง ํ๋ก์๊ฐ ๊ด๋ฆฌํ๋ ํธ๋์ญ์
๋ฒ์์์ ์คํ๋๋ค.
๋ฉ์๋ ๋ด์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ์ฐ์ ํ๋์ ํธ๋์ญ์
์ผ๋ก ๋ฌถ์ฌ ์คํ๋๋ค.
๋ฐ๋ผ์ @Transactional์ ์ด์ฉํ๋ฉด ๊ฐ๋ฐ์๋ ํธ๋์ญ์ ๊ด๋ฆฌ์ ๋ํ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํ์ง ์์๋ ๋๋ฉฐ, ์คํ๋ง ํ๋ก์๊ฐ ์ด๋ฅผ ๋์ ์ฒ๋ฆฌํ์ฌ ์ฝ๋์ ๊ฐ๊ฒฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ฌ์ค๋ค.