โ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํธ๋์ญ์ ๊ด๋ฆฌ
ํธ๋์ญ์ ์ ๋น์ง๋์ค ๋ก์ง์ด ์๋ ์๋น์ค ๊ณ์ธต์์ ์์ํด์ผ ํ๋ค.
๋น์ง๋์ค ๋ก์ง์์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด, ๋ฌธ์ ๊ฐ ์๊ธด ๋ถ๋ถ์ผ๋ก ์ธํด ์คํ์ทจ์๋์ด์ผ ํ๋ ์์ ๋ค์ ์ ๋ถ ๋กค๋ฐฑํด์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํธ๋์ญ์ ์ ์์ํ๋ ค๋ฉด Connection์ด ์์ด์ผ ํ๋ค!
์๋น์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์ ์งํ๋ ค๋ฉด
์๋น์ค ๊ณ์ธต์์ ์ปค๋ฅ์ ์ ๋ง๋ค๊ณ , ํธ๋์ญ์ ์ ๋๋ ๋๊น์ง ๋์ผํ ์ปค๋ฅ์ ์ ์ ์งํด์ผ ํ๋ค.
๐ ๋ฌธ์ ์
์ ์ง๋ณด์๋ฅผ ์ํด์๋ ํ๋์ ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋๋จธ์ง ํด๋์ค๋ค์ ๋ณ๊ฒฝ์ด ์ต์ํ๋์ด์ผ ํ๋ค.
์ฆ UI๊ฐ ๋ฐ๋๊ณ , ๋ฐ์ดํฐ ์ ์ฅ ๊ธฐ์ ์ด ๋ฐ๋๋ค๊ณ ํ๋๋ผ๋
ํต์ฌ ๋น์ง๋์ค ๋ก์ง์ธ ์๋น์ค ๊ณ์ธต์ ์ต๋ํ ์์ ๋์ง ์์์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ํธ๋์ญ์ ์ ์๋น์ค ๊ณ์ธต์์ ์์ํด๋ฒ๋ฆฌ๋ฉด
์๋น์ค ๊ณ์ธต์ jdbc ๊ธฐ์ ์ ์์กดํ๊ฒ ๋๋ค.
๐ ์ฝ๋ ์์
@RequiredArgsConstructor
public class MemberService {
private final DataSource dataSource; // <- jdbc ๊ธฐ์
private final MemberRepository memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
Connection conn = dataSource.getConnection(); // <- jdbc ๊ธฐ์
try {
conn.setAutoCommit(false); // ํธ๋์ญ์
์์
// ๊ณ์ข์ด์ฒด ์์
(์ฝ๋ ์๋ต)
conn.commit(); // ์ฑ๊ณต ์ ์ปค๋ฐ
} catch (Exception e) {
conn.rollback(); // ์คํจ ์ ๋กค๋ฐฑ
throw new IllegalStateException(e);
} finally {
release(conn);
}
}
...
}
์ด๋ ๊ฒ ๋๋ฉด, ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ jdbc ๊ธฐ์ ์ ์ฌ์ฉํ์ง ์๊ฒ ๋๋ค๋ฉด
DataSource, Connection, SQLException ๋ํ ์ฌ์ฉํ์ง ์๊ฒ ๋ ํ ๋
์ด ๋ถ๋ถ๋ค์ ์ ๋ถ ์์ ํด์ฃผ์ด์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
ํ๋ง๋๋ก ํต์ฌ ๋น์ง๋์ค ๋ก์ง๊ณผ jdbc ๊ธฐ์ ์ด ์์ฌ์์ด์, ์ ์ง๋ณด์๊ฐ ํ๋ค์ด์ง๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ๋์ ์ค๋ณต๋ ๋ง์์ง๋ค. (๋๋จธ์ง ์๋น์ค ๋ฉ์๋๋ค์์๋, ์ ์ฝ๋์์ ์๋ต๋ ๊ณ์ข์ด์ฒด ์์ ๋ถ๋ถ(=์ค์ ๋น์ง๋์ค ๋ก์ง ๋ถ๋ถ)์ ์ ์ธํ๊ณ ๋ ๋ชจ๋ ์ฝ๋๊ฐ ๊ฑฐ์ ๋๊ฐ์ ๊ฒ์ด๋ค!)
โ Spring framework์์๋ ํด๊ฒฐ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์คํ๋ง์ TransactionManager ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ํธ๋์ญ์ ๊ธฐ๋ฅ์ ์ถ์ํํ๊ณ ์๋ค.
TransactionManager์ ํ์ ์ธํฐํ์ด์ค์ธ PlatformTransactionManager ์ธํฐํ์ด์ค๋
jdbc ๊ธฐ์ ์ ๋ํ ํธ๋์ญ์ ์ ์ถ์ํํ๊ณ ์๊ณ , ์คํ๋ง์ jdbc ๋๋ผ์ด๋ฒ์ ๋ฐ๋ฅธ ๊ตฌํ์ฒด๋ค์ ์ ๊ณตํ๋ค.
package org.springframework.transaction;
import org.springframework.lang.Nullable;
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition) throws transactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
์ด ํธ๋์ญ์ ๋งค๋์ ๋ ThreadLocal์ ์ฌ์ฉํด์ ์ปค๋ฅ์ ์ ์ ์งํ ์ ์๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์,
๋ฉํฐ์ฐ๋ ๋ ์ํฉ์์ ์์ ํ๊ฒ ์ปค๋ฅ์ ๋๊ธฐํ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ํ์ ๊ตฌํ์ฒด๋ก๋ DataSourceTransactionManager๊ฐ ์๋ค.
๐ DataSourceTransactionManager ๋์ ๋ฐฉ์
- Datasource๋ฅผ ํตํด ์ปค๋ฅ์ ์ ์์ฑํ๊ณ ํธ๋์ญ์ ์ ์์ํ๋ค.
- ํด๋น ์ปค๋ฅ์ ์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์๊ฒ ๋ณด๊ดํ๋ค. (์ฝ๋๋ฅผ ๋ฏ์ด๋ณด๋ ConnectionHolder๊ฐ ์ด ์ญํ ์ ํ๋๊ฒ๊ฐ์๋ฐ ๋ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค)
- ๋ฆฌํฌ์งํ ๋ฆฌ๋ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๊ฐ ๋ณด๊ดํ๊ณ ์๋ ์ปค๋ฅ์ ์ ๊บผ๋ด์ ์ฌ์ฉํ๋ค.
- ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด DataSourceTransactionManager๋ ํด๋น ์ปค๋ฅ์ ์ ์ข ๋ฃํ๊ณ , ์ปค๋ฅ์ ์ ๋ฐํํ๋ค.
โ TransactionTemplate์ ์ฝ๋ ์ค๋ณต ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค๋ค.
TransactionManager๋ฅผ ํตํด ํธ๋์ญ์ ์ ์ถ์ํํ๋๋ผ๋ ์ฝ๋ ์ค๋ณต ๋ฌธ์ ๋ ์ฌ์ ํ ์กด์ฌํ๋ค.
์คํ๋ง ํ๋ ์์ํฌ์์๋ ์ด๊ฒ์ ํด๊ฒฐํด์ฃผ๋ TransactionTemplate ํด๋์ค๋ฅผ ์ ๊ณตํ๋ค.
(ํ ํ๋ฆฟ ์ฝ๋ฐฑ ํจํด)
๐ ์ฝ๋ ์์
@RequiredArgsConstructor
public class MemberService {
private final TransactionTemplate transactionTemplate;
private final MemberRepository memberRepository;
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
// ๋น์ง๋์ค ๋ก์ง๋ง ๋๊ฒจ์ฃผ๋ฉด, ํ
ํ๋ฆฟ ์์์ ์์์
// ํธ๋์ญ์
์์ํ๊ณ , ์ฑ๊ณต์ ์ปค๋ฐ ์คํจ์ ๋กค๋ฐฑ ํ๊ณ ์ปค๋ฅ์
๋ฐํ๊น์ง ํด์ค๋ค.
transactionTemplate.executeWithoutResult((status) -> {
try {
bizLogic(fromId, toId, money);
} catch (SQLException e) {
throw new IllegalStateException(e);
}
});
}
...
}
๐ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์๋ ๋ฌธ์ ์
์ฌ์ ํ ์๋น์ค ๊ณ์ธต์ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ก์ง์ด ํฌํจ๋์ด ์๋ค.
ํ๋์ ํด๋์ค์์ '๋น์ง๋์ค๋ก์ง', 'ํธ๋์ญ์ ์ฒ๋ฆฌ' ๋ผ๋ ๋ ๊ฐ์ง ๊ด์ฌ์ฌ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ ์ง๋ณด์๊ฐ ํ๋ค์ด์ง๋ค.
๊ทธ๋์ ์คํ๋ง ํ๋ ์์ํฌ์์๋ ํธ๋์ญ์ AOP๋ฅผ ์ ๊ณตํ๋ค.
โ @Transactional
์คํ๋ง์์ ์ ๊ณตํ๋ ํธ๋์ญ์ AOP์ด๋ค.
ํธ๋์ญ์ ์ด ํ์ํ ํด๋์ค๋ ๋ฉ์๋์ ์ด ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด,
์คํ๋ง์ ํธ๋์ญ์ AOP๊ฐ ํธ๋์ญ์ ํ๋ก์๋ฅผ ์ ์ฉํด์ค๋ค.
๐ ํธ๋์ญ์ ํ๋ก์
ํธ๋์ญ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ๋์ ์ํํด์ฃผ๋ ๊ฐ์ฒด์ด๋ค.
ํธ๋์ญ์ ํ๋ก์๊ฐ ํธ๋์ญ์ ์์, ์๋น์ค ํด๋์ค์ ๋น์ง๋์ค ํธ์ถ, ์ปค๋ฐ ๋๋ ๋กค๋ฐฑ, ์ปค๋ฅ์ ๋ฐ๋ฉ์ ๋์ ํด์ฃผ๊ธฐ ๋๋ฌธ์
์๋น์ค ํด๋์ค์ ๋ฉ์๋์๋ ๋น์ง๋์ค ๋ก์ง๋ง ๊ตฌํํด๋๋ฉด ๋๋ค.
(์ด๋ ์๋น์ค ํด๋์ค์ ๋ฉ์๋๋ ํธ๋์ญ์ ํ๋ก์์์ ํธ์ถํ ์ ์๋๋ก ๋ชจ๋ public์ผ๋ก ๊ตฌํํด์ผ ํ๋ค)
'๊ฐ์ธ ๊ณต๋ถ > DB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํธ๋์ญ์ (0) | 2025.01.30 |
---|---|
[Jdbc] ์ปค๋ฅ์ ํ๋ง๊ณผ DataSource ์ธํฐํ์ด์ค (1) | 2025.01.28 |
JDBC์ SQL Mapper, ORM ๊ฐ๋จํ ์ ๋ฆฌ (0) | 2025.01.21 |
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณด์๊ณผ PRIVILEGES (0) | 2024.11.24 |
์คํค๋ง ์ ์ ๋ฅผ ํด์ผ ํ๋ ์ด์ (์ฝ์ ์ด์, ์ญ์ ์ด์, ๊ฐฑ์ ์ด์) (1) | 2024.11.11 |