ํธ๋์ญ์ AOP @Transactional ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
by rlaehddnd0422ํธ๋์ญ์ ์ด๋?
ํธ๋์ญ์ ์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ๋ ผ๋ฆฌ์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํ ์์ ์ด ๋จ์, ์ผ๋ จ์ ์ฐ์ฐ๋ค์ ์๋ฏธํฉ๋๋ค.
์คํ๋ง์์๋ JDBC, JPA ๋ฑ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ํธ๋์ญ์ ์ถ์ํ(PlatformTransactionManager)์ ์ ๊ณตํฉ๋๋ค. ๋ ์ฌ๋ฌ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ๋ค(JDBC, Mybatis, JPA ๋ฑ) ์ ๋ํ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ PlatformTransactionManager์ ๊ตฌํ์ฒด๋ก ์ ๊ณตํฉ๋๋ค.
PlatformTransactionManager.interface
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
์ฌ๊ธฐ์ ๋ํด์ ์คํ๋ง ๋ถํธ๋ ์ด๋ค ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ์ฌ์ฉํ๋์ง ์๋์ผ๋ก ์ธ์ํด์ ์ ์ ํ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ ํํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๊น์ง ํด์ค๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ ํํ๊ณ ๋ฑ๋กํ๋ ๊ณผ์ ๋ ์๋ตํ ์ ์์ต๋๋ค.
ํธ๋์ญ์ ๋งค๋์ ๋ DataSource๋ฅผ ์ฃผ์ ๋ฐ์ ๋ฑ๋ก๋๋๋ฐ ๊ทธ๋ ๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์ ๋ํ ์ ๋ณด์ธ DataSource๋ ์ด๋ป๊ฒ ์ค์ ํ ๊น?
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. application.properties์ ์ค์ ์ ๋ณด๋ฅผ ์์ฑํจ์ผ๋ก์จ ์คํ๋ง๋ถํธ๊ฐ ์ค์ ์ ๋ณด๋ฅผ ๋ณด๊ณ ์๋์ผ๋ก ๋น์ผ๋ก ๋ฑ๋กํ๋๋ก ์ ๋ โ
2. ์ง์ ์๋์ผ๋ก ๋น ๋ฑ๋ก
์ฃผ๋ก DataSource๋ 1๋ฒ ๋ฐฉ๋ฒ์ ํตํด ์์ฑ ๋ฐ ์ฃผ์ ํฉ๋๋ค.
๋ ํธ๋์ญ์ ๋งค๋์ ๋ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ง์ ์์ฑํด์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ๊ฐ์ ์ ์ผ๋ก ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์์ต๋๋ค.
ํธ๋์ญ์ ๋งค๋์ ์ฌ์ฉ ๋ฐฉ๋ฒ
1. ํธ๋์ญ์ ๋งค๋์ ์ง์ ์ฌ์ฉ
ํธ๋์ญ์ ๋งค๋์ ์ ์ธ
@Service
public class MyService {
@Autowired PlatformTransactionManager transactionManager;
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
- ์คํ๋ง ๋ถํธ๊ฐ ์๋์ผ๋ก ๋ฑ๋กํ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฌ์ฉํฉ๋๋ค by @Autowired
- status๋ commit, rollback ์์ ์ฌ์ฉ๋ฉ๋๋ค.
ํธ๋์ญ์ ์์ - ์ปค๋ฐ/๋กค๋ฐฑ
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
public void logic()
{
try {
//๋น์ฆ๋์ค ๋ก์ง
bizLogic(fromId, toId, money);
transactionManager.commit(status); //์ฑ๊ณต์ ์ปค๋ฐ
} catch (Exception e) {
transactionManager.rollback(status); //์คํจ์ ๋กค๋ฐฑ
throw new IllegalStateException(e);
}
}
2. ๊ฐ์ ์ ์ผ๋ก ์ด๋ ธํ ์ด์ ์ ํตํด ์ฌ์ฉ
์ ๋ฐฉ๋ฒ์์๋ PlatformTransactionManager๋ฅผ ์ง์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ํ์ง๋ง @Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ์ด ์ฝ๋๋ฅผ ๋ ๊ฐ๋จํ๊ณ ๊ฐ๋ ์ฑ ์ข๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
@Transaction
@Service
public class MyService {
@Transactional
public void logic()
{
bizlogic();
...
}
}
@Transactional ๋์ ์ ๋์๋ฐฉ์
๋ฉ์๋๋ ํด๋์ค ๋ ๋ฒจ์ @Transactional์ ๊ฑธ์ด์ฃผ๋ฉด
1. AOP ํ๋ก์์์์คํ๋ง ๋ถํธ๋ฅผ ํตํด ์๋์ผ๋ก ๋น์ผ๋ก ๋ฑ๋ก๋ ํธ๋์ญ์ ๋งค๋์ ๋ฅผ ์ฌ์ฉํด ๋ฑ๋ก๋ DataSource๋ฅผ ํตํด ์ปค๋ฅ์ ์ ์์ฑํด์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ดํ๊ณ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค.
2. ํธ๋์ญ์ ์ฒ๋ฆฌ๋ก์ง์์ ์ค์ ๋น์ฆ๋์ค๋ก์ง์ ํธ์ถํ์ฌ ํธ๋์ญ์ ์ ์คํํ๋๋ฐ ์ด ๋ ๋ฆฌํฌ์งํ ๋ฆฌ์์๋ ๋๊ธฐํ ๋งค๋์ ์ ๋ฑ๋ก๋ ์ปค๋ฅ์ ์ ์ป์ด ๋น์ฆ๋์ค ๋ก์ง ์คํํฉ๋๋ค.
3. AOP ํ๋ก์์์ ํธ๋์ญ์ ์ ์ฑ๊ณตํ๋ฉด commit, ์คํจํ๋ฉด rollback ํฉ๋๋ค.
์คํ๋ง์ ํธ๋์ญ์ AOP๋ @Transactional ์ด๋ ธํ ์ด์ ์ ์ธ์ํด์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๋ ํ๋ก์๋ฅผ ์ ์ฉํด์ค๋๋ค.
@Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํด ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋์ ํ๋ฉด ์ฝ๋๊ฐ ๋งค์ฐ ๊น๋ํด์ง๊ธฐ ๋๋ฌธ์, ์คํ๋ง ๊ฐ๋ฐ์๋ผ๋ฉด ๊ผญ ์ฌ์ฉ๋ฐฉ๋ฒ๊ณผ ์์๋์ด์ผ ํฉ๋๋ค.
์ง๊ธ๋ถํฐ @Transactional์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค๊ณผ @Transactional์ ์ต์ ๋ค์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
ํธ๋์ญ์ ์ ์ฉ ํ์ธํ๊ธฐ
@Transactional ์ ๋ฉ์๋๋ ํด๋์ค์ ๋ถ์ด๋ฉด ํด๋น ๊ฐ์ฒด๋ ํธ๋์ญ์ AOP ์ ์ฉ์ ๋์์ด ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ ๊ฐ์ฒด ๋์ ์ ํธ๋์ญ์ ์ ์ฒ๋ฆฌํด์ฃผ๋ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์คํ๋ง ๋น์ ๋ฑ๋ก๋๊ณ , ํด๋น ํด๋์ค๋ฅผ ์ฃผ์ ์ ๋ฐ์ ๋์๋ ์ค์ ๊ฐ์ฒด ๋์ ํ๋ก์ ๊ฐ์ฒด๊ฐ ์ฃผ์ ๋ฉ๋๋ค.
AopUtils.isAopProxy(๊ฐ์ฒด) ๋ฅผ ์ด์ฉํ๋ฉด ๋์ ๊ฐ์ฒด๊ฐ ํธ๋์ญ์ AOP๊ฐ ์ ์ฉ๋ ๊ฐ์ฒด์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.
@Transactional ์ด๋ ธํ ์ด์ ์ ํตํด ํธ๋์ญ์ ์ด ์ ์ฉ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํ ๋ฐฉ๋ฒ
TransactionSynchronizationManager.isActualTransactionActive()
static class BasicService
{
@Transactional
public void tx() {
log.info("call tx");
boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}",txActive);
}
public void nonTx()
{
log.info("call nontx");
boolean txActive = TransactionSynchronizationManager.isActualTransactionActive();
log.info("tx active = {}",txActive);
}
}
@Test
void txTest()
{
basicService.tx();
basicService.nonTx();
}
ํธ๋์ญ์ ์ ์ฉ ์์น
์คํ๋ง์ ํญ์ ๋ ๊ตฌ์ฒด์ ์ด๊ณ ์์ธํ ๊ฒ์ด ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค. ๊ฐ๋ น @Transactional์ readOnly ์ต์ ์ true๋ก ํด๋์ค๋ ๋ฒจ์ ์ ์ฉํ๊ณ , ๋ฉ์๋๋ ๋ฒจ์์ @Transactional readOnly ์ต์ ์ false๋ก ์ง์ ํ๋ฉด ํด๋น ๋ฉ์๋๋ readOnly ์ต์ ์ด false๋ก ์ง์ ๋๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ .
readOnly ์ต์ ์ ๋ค์์ ์์ธํ ์ค๋ช ํ๊ฒ ์ง๋ง, ์ฌ๊ธฐ์ ๊ฐ๋จํ ๋งํ์๋ฉด ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ ์ ์ฉํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
ํด๋น ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ ํธ๋์ญ์ ์ด ์ ์ฉ๋์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์
TransactionSynchronizationManager.isCurrentTransactionReadOnly() ๋ฉ์๋๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก @Transactional์ ํด๋์ค๋ ๋ฉ์๋ ๋ฟ๋ง ์๋๋ผ ์ธํฐํ์ด์ค์๋ ์ ์ฉํ ์ ์๋๋ฐ, ์ธํฐํ์ด์ค์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์์ต๋๋ค. ์ ์ฉํ๊ฒ ๋๋ค๋ฉด ์ธํฐํ์ด์ค๊ฐ ๊ฐ์ฅ ๋ ๊ตฌ์ฒด์ ์ธ ๋ ๋ฒจ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋๋ค.
ํธ๋์ญ์ AOP @Transactional ์ฌ์ฉ ์ ์ฃผ์์ฌํญ 1 - ํ๋ก์ ๋ด๋ถ ํธ์ถ
๊ฒฐ๋ก ์ ์ผ๋ก ๋งํ์๋ฉด ๋์ผ ํด๋์ค ๋ด๋ถ์ ์กด์ฌํ๋ ๋ฉ์๋1๊ณผ ๋ฉ์๋2๊ฐ ์๋ค๊ณ ๊ฐ์ ํ ๋, @Transactional์ด ์ ์ฉ๋์ง ์์ ๋ฉ์๋1์์ ๋ด๋ถ ํธ์ถ๋ก @Transactional์ด ์ ์ฉ๋ ๋ฉ์๋2๋ฅผ ํธ์ถ์ ํ๊ฒ ๋๋ฉด ๋ฉ์๋2์๋ @Transactional์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
์ ๊ทธ๋ฐ๊ฑธ๊น์? ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๋ฉด
@Transactional์ด ์ ์ฉ๋ ๋ฉ์๋๋
1. AOP ํ๋ก์ ๊ฐ์ง ๊ฐ์ฒด์์ @Transactional์ด ๋ถ์ ํด๋น ๋ฉ์๋๋ฅผ ์คํํ๊ณ
2. ์ค์ ๊ฐ์ฒด๋ฅผ ํธ์ถ๋์ด ๋์ํฉ๋๋ค.
๋ง์ฝ @Transactional์ด ์ ์ฉ๋์ง ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ํธ๋์ญ์ ์ด ์ ์ฉ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ํตํด ์ค์ ๊ฐ์ฒด๊ฐ ํธ์ถ๋๋ ๊ฒ์ด ์๋๋ผ, ๊ณง๋ฐ๋ก ์ค์ ๊ฐ์ฒด๊ฐ ํธ์ถ๋์ด ์ค์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ @Transactional์ด ๋ถ์ด์๋ค ํ๋๋ผ๋ ์ค์ ๊ฐ์ฒด์์๋ ์ด๋ฅผ ์ธ์ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
ํด๊ฒฐ๋ฒ
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ฃผ๋ฉด ๋ฉ๋๋ค.
ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์์ ๋ฉ์๋1๊ณผ ํธ๋์ญ์ ์ด ์ ์ฉ๋ ๋ฉ์๋2๋ฅผ ํ ํด๋์ค ๋ด์ ์ค์ ํ๋ ๊ฒ์ด ์๋ ํธ๋์ญ์ ์ด ์ ์ฉ๋ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ๋ถ๋ฆฌํจ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํธ๋์ญ์ AOP @Transactional ์ฌ์ฉ ์ ์ฃผ์์ฌํญ 2 - public ๋ฉ์๋
@Transactional์ public ๋ฉ์๋์๋ง ์ ์ฉ๋๋๋ก ๊ธฐ๋ณธ ์ค์ ์ด ๋์ด ์๊ธฐ ๋๋ฌธ์ ๊ทธ ์ธ์ ์ ๊ทผ ์ ์ด์์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
@Transactional์ ์ ์ฉํ๋ฉด ๊ฐ์ง ํ๋ก์ ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด ์ง๋๋ฐ, public์ด ์๋ ๋ค๋ฅธ ์ ๊ทผ์ ์ด์๋ก ๋ง์๋๋ค๋ฉด ํ๋ก์ ๊ฐ์ฒด๊ฐ ์์ฑ๋์ง ์์ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด๋ฌํ ํผ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ์คํ๋ง์ ์ผ๋ฐ์ ์ผ๋ก public ๋ฉ์๋์๋ง @Transactional ์ด๋ ธํ ์ด์ ์ ์ ์ฉํ๋๋ก ์ค์ ๋์ด ์์ต๋๋ค.
ํธ๋์ญ์ AOP @Transactional ์ฌ์ฉ ์ ์ฃผ์์ฌํญ 3 - ์ด๊ธฐํ ์์
@PostConstruct์ @Transactional์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
ํจ๊ป ์ ์ฉํ๊ฒ ๋๋ฉด @PostConstruct๋ก ์ด๊ธฐํ ์ฝ๋๊ฐ ๋จผ์ ํธ์ถ๋ ์ดํ์ ๊ทธ ๋ค์์ ํธ๋์ญ์ AOP๊ฐ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ์ด ์ ์ฉ๋์ง ์์ต๋๋ค.
์ด๊ธฐํ ์ดํ ์ฝ๋๊ฐ ํธ์ถ๋๊ธฐ ์ ์ ํธ๋์ญ์ AOP๋ฅผ ์ ์ฉ์ํค๊ณ ์ถ๋ค๋ฉด @PostConstruct๋์ @EventListener(value = ApplicationReadyEvent.class)๋ฅผ ์ ์ฉํ๋ฉด ๋ฉ๋๋ค.
@EventListener ์ด๋ ธํ ์ด์ ์ ์คํ๋ง ํ๋ ์์ํฌ์์ ์ ๊ณตํ๋ ์ด๋ ธํ ์ด์ ์ค ํ๋๋ก, ์ด๋ฒคํธ๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
@EventListener ์ด๋ ธํ ์ด์ ์ ๋ฉ์๋์ ์ ์ฉ๋๋ฉฐ, ๋ฉ์๋๊ฐ ์ด๋ฒคํธ๋ฅผ ์์ ํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๋ฒคํธ๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ๋ ๋ค์ํ ์ด๋ฒคํธ ์ค ํ๋์ผ ์ ์์ผ๋ฉฐ, ์๋ฅผ ๋ค์ด ApplicationReadyEvent๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์๋๊ณ ์ด๊ธฐํ๋๊ณ ์ค๋น๋ ํ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ๋๋ค.
<์ ๋ฆฌ>
ํธ๋์ญ์ AOP์ ๋์๋ฐฉ์์ ๋ค์ ํ๋ฒ ์ดํด๋ณด์์ต๋๋ค.
@Transactional ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ๋ฉ์๋๊ฐ ์คํ๋ ๋, ์คํ๋ง์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ด ๋ฉ์๋๋ฅผ ๊ฐ์ธ๊ณ , ํ๋ก์ ๊ฐ์ฒด๊ฐ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋๋ก ํฉ๋๋ค. ์ด๋ ํ๋ก์ ๊ฐ์ฒด์ ๋ด๋ถ ๋์ ๋ฐฉ์์ ๋๋ต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- @Transactional ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๋ฉด, ์คํ๋ง์ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
- ํ๋ก์ ๊ฐ์ฒด๋ ์๋ณธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ , ์๋ณธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค.
- ์๋ณธ ๋ฉ์๋๊ฐ ์คํ๋๋ฉด, ํ๋ก์ ๊ฐ์ฒด๋ ํด๋น ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ , ๋ฉ์๋ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
- ์๋ณธ ๋ฉ์๋์ ์คํ์ด ์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉด, ํ๋ก์ ๊ฐ์ฒด๋ ํธ๋์ญ์ ์ ์ปค๋ฐํฉ๋๋ค. ์ด๋, ์ปค๋ฐ์ด ์คํจํ๋ฉด ๋กค๋ฐฑํฉ๋๋ค.
- ์๋ณธ ๋ฉ์๋์ ์คํ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ํ๋ก์ ๊ฐ์ฒด๋ ํธ๋์ญ์ ์ ๋กค๋ฐฑํฉ๋๋ค.
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก @Transactional ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ๋ฉ์๋๋ฅผ ์คํํ๋ฉด, ํด๋น ๋ฉ์๋๊ฐ ์คํ๋๋ ๋์์๋ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ฌ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๋ฑ์ ์ผ๊ด ์ฒ๋ฆฌ ์์ ์ ์์ ํ๊ฒ ์ํํ ์ ์์ต๋๋ค.
๋ํ ์คํ๋ง์ AOP(Aspect Oriented Programming)์ ์ฌ์ฉํ์ฌ @Transactional ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋ ๋ฉ์๋๋ฅผ ํ๋ก์ ๊ฐ์ฒด๋ก ๊ฐ์ธ๊ณ , ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ์ํํฉ๋๋ค.
์ด๋, AOP๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์์ ๋ฉ์๋์ ์ ๊ทผ ์ ์ด์์ ๋ฐ๋ผ ํ๋ก์ ๊ฐ์ฒด์ ์์ฑ ๋ฐฉ์์ด ๊ฒฐ์ ๋ฉ๋๋ค.
public ๋ฉ์๋์๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ง๋ง, private ๋ฉ์๋์๋ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ผ๋ฏ๋ก, private ๋ฉ์๋์๋ @Transactional ์ด๋ ธํ ์ด์ ์ด ์ ์ฉ๋์ด๋ ํธ๋์ญ์ ์ฒ๋ฆฌ๊ฐ ์ํ๋์ง ์์ต๋๋ค.
- @Transactional์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ ๋ค์ ๋ํด์ ์์๋ณด์์ต๋๋ค.
- @Transactional์ Proxy๋ก ๋์ํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํฉ์๋ค.
- @Transactional์ public ๋ฉ์๋์๋ง ์ ์ฉ๋ฉ๋๋ค.
- @PostConstruct์ @Transactional์ ๊ฐ์ด ์ ์ฉํ๊ฒ๋๋ฉด ํธ๋์ญ์ ์ด AOP๊ฐ ์ ์ฉ๋์ง ์์ต๋๋ค.
<์ฐธ๊ณ ์๋ฃ>
'๐ Backend > DB Access' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํธ๋์ญ์ ์ ํ์ ๊ดํ์ฌ (0) | 2023.04.25 |
---|---|
ํธ๋์ญ์ AOP @Transactional์ ์ต์ (0) | 2023.04.20 |
[Querydsl] Querydsl ์ด๋? (0) | 2023.04.19 |
[Spring Data JPA] ์คํ๋ง ๋ฐ์ดํฐ JPA (0) | 2023.04.17 |
[JPA] JPA(Java Persistent API) (0) | 2023.04.17 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
Study Repository
rlaehddnd0422