๐น Transaction
[ ํธ๋์ญ์ (Transaction)์ ํ์์ฑ ]
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ณผ์ ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด, ๋ฐ์ดํฐ๊ฐ ๋ถ์์ ํ ์ํ๋ก ๋จ์ง ์๋๋ก ์์ ์ด์ ์ ์ํ๋ก ๋๋๋ฆฐ ํ, ๋ค์ ์์ ์์ ์ด ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค. ์ด๋ ๊ฒ ์ฌ๋ฌ ์์ ์ ์ํํ๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋, ์ด์ ์ํ๋ก ๋๋๋ฆฌ๋ ๋กค๋ฐฑ(Rollback) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ์ด ํธ๋์ญ์ (Transaction)์ด๋ค.
ํธ๋์ญ์ ์ ํ๋์ ๋ ผ๋ฆฌ์ ์ธ ์์ ๋จ์๋ก, ๋ฐ๋์ Commit(์ปค๋ฐ) ๋๋ Rollback(๋กค๋ฐฑ)์ผ๋ก ๋ง๋ฌด๋ฆฌ๋์ด์ผ ํ๋ค. ์ฆ, ํธ๋์ญ์ ์ด ์ ์์ ์ผ๋ก ์๋ฃ๋๋ฉด ์ปค๋ฐ์ ์ํํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ ํ๊ณ , ๋์ค์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑ์ ์ํํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ์ทจ์ํ๋ค.
์๋ฅผ ๋ค์ด, ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๋ ๋์ค์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ฉด, ํด๋น ์์ ์ ์์๋ ๊ฒ์ฒ๋ผ ์ทจ์๋๋ค. ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ ์์ ์ด ์ฐ์์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ, ๋ถ๋ถ์ ์ผ๋ก๋ง ๋ณ๊ฒฝ์ด ๋ฐ์๋์ง ์๋๋ก ์ ์ฒด ์์ ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด ๊ด๋ฆฌํด์ผ ํ๋ค.
ํธ๋์ญ์ ์ ์ข ๋ฃ ๋ฐฉ์์ ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋๋ค.
1. ํธ๋์ญ์ ์ปค๋ฐ (Commit) : ๋ชจ๋ ์์ ์ด ์ ์์ ์ผ๋ก ์๋ฃ๋์์ ๋, ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ๋ค.
2. ํธ๋์ญ์ ๋กค๋ฐฑ (Rollback) : ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์์ ์ ์ทจ์ํด์ผ ํ ๊ฒฝ์ฐ, ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์๋ ์ํ๋ก ๋๋๋ฆฐ๋ค.
์ฌ๋ฌ ๊ฐ์ ์์ ์ด ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ด ์๋ ๊ฒฝ์ฐ, ๋ชจ๋ ์์ ์ด ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์์ ๋๋ง ์ปค๋ฐ์ ์คํํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํด์ผ ํ๋ค. ๋ง์ฝ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑ์ ์ํํ์ฌ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํด์ผ ํ๋ค.
[ ํธ๋์ญ์ ACID ]
ํธ๋์ญ์ ์ ๋ค์ ๋ค ๊ฐ์ง ํน์ฑ์ ํตํด ๋ฐ์ดํฐ์ ์ ๋ขฐ์ฑ๊ณผ ์์ ์ฑ์ ๋ณด์ฅํ๋ค.
1. ์์์ฑ (Atomicity)
- ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ์์ ์ ์์ ํ ์คํ๋๊ฑฐ๋ ์ ํ ์คํ๋์ง ์์์ผ ํ๋ค.
- ์ฆ, ํ๋์ ์์ ์ด๋ผ๋ ์คํจํ๋ฉด ์ ์ฒด ํธ๋์ญ์ ์ด ๋กค๋ฐฑ(Rollback)๋์ด ๋ถ๋ถ ์คํ ์ํ๊ฐ ๋จ์ง ์๋๋ค.
2. ์ผ๊ด์ฑ (Consistency)
- ํธ๋์ญ์ ์คํ ์ ํ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌด๊ฒฐ์ฑ๊ณผ ์ ํฉ์ฑ์ด ์ ์ง๋์ด์ผ ํ๋ค.
- ์๋ฅผ ๋ค์ด, ์ํ ๊ณ์ข์์ ๋์ ์ด์ฒดํ ๋, ํ ๊ณ์ข์์ ๋น ์ ธ๋๊ฐ ๊ธ์ก๊ณผ ๋ค๋ฅธ ๊ณ์ข์ ์ ๊ธ๋ ๊ธ์ก์ด ํญ์ ์ผ์นํด์ผ ํ๋ค.
3. ๊ณ ๋ฆฝ์ฑ(Isolation)
- ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ์คํ๋ ๋, ์๋ก ๊ฐ์ญํ์ง ์๋๋ก ๋ณด์ฅํด์ผ ํ๋ค.
- ์ฆ, ํ๋์ ํธ๋์ญ์ ์ด ์๋ฃ๋๊ธฐ ์ ์ ๋ค๋ฅธ ํธ๋์ญ์ ์ด ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
- ์ด๋ฅผ ์ํด ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค(Isolation Level)์ ์ค์ ํ์ฌ ๋์์ฑ ์ ์ด๋ฅผ ์ํํ ์ ์๋ค.
4. ์ง์์ฑ(Durability)
- ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ํธ๋์ญ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋์ด์ผ ํ๋ค.
- ์์คํ ์ฅ์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ปค๋ฐ๋ ๋ฐ์ดํฐ๋ ์์ค๋์ง ์๋๋ค.
๐น Spring์์ ์ ๊ณตํ๋ Transaction ํต์ฌ ๊ธฐ์
Spring์ ํจ์จ์ ์ธ ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ํต์ฌ ๊ธฐ์ ์ ์ ๊ณตํ๋ค.
1. ํธ๋์ญ์ ๋๊ธฐํ (Transaction Synchronization)
2. ํธ๋์ญ์ ์ถ์ํ (Transaction Abstraction)
3. AOP๋ฅผ ์ด์ฉํ ํธ๋์ญ์ ๋ถ๋ฆฌ (Transaction Management with AOP)
[ ํธ๋์ญ์ ๋๊ธฐํ (Transaction Synchronization) ]
JDBC๋ฅผ ์ด์ฉํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ํ๋์ ํธ๋์ญ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ฉด, ์ปค๋ฅ์ (Connection) ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๊ณ ๊ณต์ ํ๋ ๋ฑ์ ์์ ์ด ํ์ํ๋ค. ํ์ง๋ง ์ด๋ฐ ๋ฐฉ์์ ๋ณต์กํ๊ณ , ๋ถํ์ํ ์ฝ๋๊ฐ ๋ง์์ง ๋ฟ๋ง ์๋๋ผ, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์๋ค.
Spring์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํธ๋์ญ์ ๋๊ธฐํ(Transaction Synchronization) ๊ธฐ์ ์ ์ ๊ณต์ ์ ๊ณตํ๋ค.
ํธ๋์ญ์ ๋๊ธฐํ๋ ํธ๋์ญ์ ์ ์์ํ ๋ ์์ฑ๋ ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ํน๋ณํ ์ ์ฅ์์ ๋ณด๊ดํด ๋๊ณ , ํ์ํ ๋ ๊บผ๋ด ์ธ ์ ์๋๋ก ํ๋ ๊ธฐ์ ์ด๋ค. ์ด๋ฅผ ํตํด ๋ถํ์ํ ์ปค๋ฅ์ ์์ฑ์ ๋ฐฉ์งํ๊ณ , ์ผ๊ด๋ ํธ๋์ญ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ํ, Spring์ ํธ๋์ญ์ ๋๊ธฐํ ์ ์ฅ์๋ ์์ ์ค๋ ๋๋ณ๋ก ์ปค๋ฅ์ ๊ฐ์ฒด๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฏ๋ก, ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ์ปค๋ฅ์ ์ถฉ๋ ์์ด ์์ ํ๊ฒ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ ์ ์๋ค.
[ ํธ๋์ญ์ ๋๊ธฐํ ์์ ]
// ํธ๋์ญ์
๋๊ธฐํ ์์
TransactionSynchronizationManager.initSynchronization();
// ์ปค๋ฅ์
ํ๋
Connection c = DataSourceUtils.getConnection(dataSource);
// ํธ๋์ญ์
๋ด ์์
์ํ
try {
// ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ํ
} finally {
// ์ปค๋ฅ์
๋ฐํ ๋ฐ ๋๊ธฐํ ์ข
๋ฃ
DataSourceUtils.releaseConnection(c, dataSource);
TransactionSynchronizationManager.unbindResource(dataSource);
TransactionSynchronizationManager.clearSynchronization();
}
ํ์ง๋ง, ๊ฐ๋ฐ์๊ฐ JDBC๊ฐ ์๋ Hibernate์ ๊ฐ์ ORM ๊ธฐ์ ์ ์ฌ์ฉํ๋ค๋ฉด, ์์ JDBC ๊ธฐ๋ฐ ํธ๋์ญ์ ๋๊ธฐํ ์ฝ๋๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
๋ํ์ ์ผ๋ก Hibernate๋ JDBC์ Connection ๊ฐ์ฒด๊ฐ ์๋ Session ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, JDBC์ ์ข ์์ ์ธ ๋ฐฉ์์ผ๋ก ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๋ฉด Hibernate ํ๊ฒฝ์์๋ ์ ๋๋ก ๋์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ค.
์ด๋ฌํ ๊ธฐ์ ์์กด์ฑ์ ์ค์ด๊ณ , ๋ค์ํ ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ ์ ์๋๋ก Spring์ ํธ๋์ญ์ ์ถ์ํ(Transaction Abstraction) ๊ธฐ์ ์ ์ ๊ณตํ๋ค.
[ ํธ๋์ญ์ ์ถ์ํ (Transaction Abstraction) ]
Spring์ ๋ค์ํ ํธ๋์ญ์ ๊ธฐ์ ์ ๊ณตํต์ ์ ์ถ์ํํ์ฌ ํธ๋์ญ์ ์ถ์ํ (Transaction Abstraction) ๊ธฐ์ ์ ์ ๊ณต์ ์ ๊ณตํ๋ค. ์ด๋ฅผ ํ์ฉํ๋ฉด JDBC, Hibernate ๋ฑ ํน์ ๊ธฐ์ ์ ์ข ์๋์ง ์๊ณ ๋ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ํธ๋์ญ์ ์ ์ฒ๋ฆฌํ ์ ์๋ค.
Spring์์ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๋ ํต์ฌ ์ธํฐํ์ด์ค๋ PlatformTransactionManager์ด๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ํธ๋์ญ์ ์ ๊ธฐ์ ์ ๊ด๊ณ์์ด ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ์ดํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, JDBC์ ๋ก์ปฌ ํธ๋์ญ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ DataSourceTransactionManager๋ฅผ ํ์ฉํ ์ ์๋ค.
[ ํธ๋์ญ์ ์ถ์ํ ์์ ]
Spring์ PlatformTransactionManager๋ฅผ ํตํด ํธ๋์ญ์
์ ๊ณต์ ํ๊ณ , ์ปค๋ฐํ๊ณ , ๋กค๋ฐฑํ ์ ์๋ค.
public Object invoke(MethodInvocation invocation) throws Throwable {
// ํธ๋์ญ์
์์
TransactionStatus status = this.transactionManager
.getTransaction(new DefaultTransactionDefinition());
try {
Object ret = invocation.proceed(); // ๋์ ๋ฉ์๋ ์คํ
this.transactionManager.commit(status); // ์ฑ๊ณต ์ ์ปค๋ฐ
return ret;
} catch (Throwable t) {
this.transactionManager.rollback(status); // ์์ธ ๋ฐ์ ์ ๋กค๋ฐฑ
throw t; // ์์ธ ๋ค์ ๋์ง๊ธฐ
}
}
ํ์ง๋ง ์์ ๊ฐ์ ํธ๋์ญ์ ๊ด๋ฆฌ ์ฝ๋๊ฐ ๋น์ฆ๋์ค ๋ก์ง ์ฝ๋์ ๊ฒฐํฉ๋์ด ์์ด ๋ ๊ฐ์ง ์ฑ ์(ํธ๋์ญ์ ๊ด๋ฆฌ + ๋น์ฆ๋์ค ๋ก์ง ์คํ)์ ๊ฐ์ง๊ฒ ๋๋ค.
Spring์์๋ AOP(Aspect-Oriented Programming)๋ฅผ ํ์ฉํ์ฌ ํธ๋์ญ์ ๋ก์ง์ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌํจ์ผ๋ก์จ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ ํฅ์์์ผฐ๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ @Transactional ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋์ฑ ๊ฐ๊ฒฐํ๊ฒ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ ์ ์๋ค.
[ AOP๋ฅผ ์ด์ฉํ ํธ๋์ญ์ ๋ถ๋ฆฌ (Transaction Management with AOP) ]
๋น์ฆ๋์ค ๋ก์ง๊ณผ ํธ๋์ญ์ ๊ด๋ฆฌ ์ฝ๋๊ฐ ๋ณต์กํ๊ฒ ์ฝํ ์๋ ์ฝ๋๋ก ์๋ฅผ ๋ค์ด๋ณด์.
public void addUsers(List<User> userList) {
TransactionStatus status = this.transactionManager
.getTransaction(new DefaultTransactionDefinition());
try {
for (User user : userList) {
if (isEmailNotDuplicated(user.getEmail())) {
userRepository.save(user);
}
}
this.transactionManager.commit(status);
} catch (Exception e) {
this.transactionManager.rollback(status);
throw e;
}
}
์์ ์ฝ๋๋ ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์๋ค.
1. ํธ๋์ญ์ ๊ด๋ฆฌ ์ฝ๋์ ๋น์ฆ๋์ค ๋ก์ง์ด ์์ฌ ์์ด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
2. ํธ๋์ญ์ ๊ด๋ฆฌ๋ ํต์ฌ ๋ก์ง๊ณผ ์ฑ๊ฒฉ์ด ๋ค๋ฅด๋ฏ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
ํธ๋์ญ์ ๊ด๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ์์ด ๋ ์ค๋ฅผ ์ ์๋ค.
1. ๋ด๋ถ ๋ฉ์๋๋ก ๋ถ๋ฆฌ
2. DI(Dependency Injection)๋ฅผ ํ์ฉํ ํฉ์ฑ
3. ์์์ ์ด์ฉํ ๊ตฌ์กฐํ
ํ์ง๋ง ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋๋ผ๋ ํธ๋์ญ์ ๊ด๋ จ ์ฝ๋๊ฐ ์์ ํ ์ฌ๋ผ์ง๋ ๊ฒ์ ์๋๋ค. ์ฌ์ ํ ํธ๋์ญ์ ๊ด๋ฆฌ ์ฝ๋๊ฐ ๊ณ์ ๋จ์์๊ณ , ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๊ณณ๋ง๋ค ์ด๋ฅผ ์ ์ฉํด์ผ ๋ฒ๊ฑฐ๋ก์์ด ์๋ค.
Spring์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด AOP(Aspect Oriented Programming, ๊ด์ ์งํฅ ํ๋ก๊ทธ๋๋ฐ) ๊ฐ๋ ์ ๋์ ํ๋ค.
AOP๋ฅผ ํ์ฉํ๋ฉด ํธ๋์ญ์ ์ฝ๋์ ๊ฐ์ ๋ถ๊ฐ ๊ธฐ๋ฅ์ ํต์ฌ ๋ก์ง์์ ์์ ํ ๋ถ๋ฆฌํ ์ ์๋ค. Spring์ ํธ๋์ญ์ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ AOP ๊ธฐ๋ฐ์ ๋ณ๋ ๋ชจ๋๋ก ์ ๊ณตํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ง์ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ ์๋์ผ๋ก ์ ์ฉ๋๋๋ก ์ง์ํ๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ ์ฝ๊ฒ ํ์ฉํ ์ ์๋๋ก @Transactional ์ด๋ ธํ ์ด์ ์ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ์ ์ธํ๋ ๊ฒ๋ง์ผ๋ก๋ Spring์ด ํธ๋์ญ์ ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ค.
[ @Transactional์ ์ ์ฉํ ๊ฐ์ ๋ ์ฝ๋ ]
Spring์ AOP ๊ธฐ๋ฐ ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์๋์ ๊ฐ์ด ํธ๋์ญ์ ๊ด๋ฆฌ ์ฝ๋ ์์ด ๋น์ฆ๋์ค ๋ก์ง๋ง ์์ฑํ ์ ์๋ค.
@Service
@RequiredArgsConstructor
@Transactional // ํด๋์ค ๋ ๋ฒจ์์ ์ ์ธํ๋ฉด ๋ชจ๋ public ๋ฉ์๋์ ํธ๋์ญ์
์ด ์ ์ฉ๋จ
public class UserService {
private final UserRepository userRepository;
public void addUsers(List<User> userList) {
for (User user : userList) {
if (isEmailNotDuplicated(user.getEmail())) {
userRepository.save(user);
}
}
}
}
@Transactional์ ์ ์ฉํ๋ฉด ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๋ณด์์ฑ์ด ํฅ์๋๋ฉฐ, ํธ๋์ญ์ ๊ด๋ จ ์ฝ๋๊ฐ ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๋์ด ์ฝ๋์ ๊ฐ๊ฒฐํจ๊ณผ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ํธ๋์ญ์ ์ฒ๋ฆฌ์ ๋ํ ์ธ๋ถ ๊ตฌํ์ ์ ๊ฒฝ ์ธ ํ์ ์์ด, ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์๋ค.
๋ํ, @Transactional์ ํด๋์ค๋ ๋ฉ์๋ ๋ ๋ฒจ์์ ์ค์ ํ ์ ์์ด, ํน์ ๋ฉ์๋์๋ง ํธ๋์ญ์ ์ ์ ์ฉํ๊ฑฐ๋ ํด๋์ค ์ ์ฒด์ ์ ์ฉํ ์ ์๋ ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ค.
์๋ฅผ ๋ค์ด, ์ฝ๊ธฐ ์์ ์ด ๋ง์ ์กฐํ ์์ ์์๋ @Transactional(readOnly = true)๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ๋์ธ ์ ์๋ค.
๐ reference
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Bean Scope (0) | 2025.01.22 |
---|---|
[Spring] Spring @Transactional ์ธ๋ถ ์ค์ (0) | 2025.01.14 |
[Spring] Transaction(ํธ๋์ญ์ ) (0) | 2025.01.09 |
[Spring] ๋ค์ํ ์์กด์ฑ ์ฃผ์ ๋ฐฉ๋ฒ๊ณผ ์์ฑ์ ์ฃผ์ ์ ์ฌ์ฉํด์ผ ํ๋ ์ด์ (0) | 2025.01.04 |
[Spring] ์์กด์ฑ ์ฃผ์ (Dependency Injection, DI) (0) | 2025.01.01 |