[์คํ๋ง DB 1ํธ] - 8. ํธ๋์ญ์ ์ถ์ํ
ํธ๋์ญ์ ์ถ์ํ
๊ตฌํ ๊ธฐ์ ๋ง๋ค ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅด๋ค.
JDBC : con.setAutoCommit(false)
JPA : transaction.begin()
ํฅํ JDBC์์ JPA ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ๋ก ๋ณ๊ฒฝํ๋ฉด, ์๋น์ค ๊ณ์ธต์ ํธ๋์ญ์ ๊ด๋ จ ์ฝ๋๋ ๋ชจ๋ ํจ๊ป ์์ ํด์ผ ํ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ํธ๋์ญ์
๊ธฐ๋ฅ์ ์ถ์ํํ๋ฉด ๋๋ค.
ํธ๋์ญ์ ์ถ์ํ ์ธํฐํ์ด์ค
public interface TxManager {
begin();
commit();
rollback();
}
TxManager ์ธํฐํ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๊ฐ์ ๊ธฐ์ ์ ๋ง๋ ๊ตฌํ์ฒด๋ฅผ ๋ง๋ค๋ฉด ๋๋ค.
JdbcTxManager : JDBC ํธ๋์ญ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ตฌํ์ฒด
JpaTxManager : JPA ํธ๋์ญ์
๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ตฌํ์ฒด
ํธ๋์ญ์ ์ถ์ํ์ ์์กด๊ด๊ณ

์๋น์ค๋ ํน์ ํธ๋์ญ์ ๊ธฐ์ ์ ์ง์ ์์กดํ๋ ๊ฒ์ด ์๋๋ผ, TxManager ๋ผ๋ ์ถ์ํ๋ ์ธํฐํ์ด์ค์ ์์กดํ๋ค.
ํด๋ผ์ด์ธํธ์ธ ์๋น์ค๋ ์ธํฐํ์ด์ค์ ์์กดํ๊ณ DI๋ฅผ ์ฌ์ฉํ ๋๋ถ์ OCP ์์น์ ์งํค๊ฒ ๋์๋ค.
์คํ๋ง์ ํธ๋์ญ์
์ถ์ํ

์ฐ๋ฆฌ๋ ์คํ๋ง์ด ์ ๊ณตํ๋ ํธ๋์ญ์ ์ถ์ํ ๊ธฐ์ ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์คํ๋ง ํธ๋์ญ์ ์ถ์ํ์ ํต์ฌ์ PlatformTransactionManager ์ธํฐํ์ด์ค์ด๋ค.
private final PlatformTransactionManager transactionManager;
//ํธ๋์ญ์
์์
TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
transactionManager.commit(status); //์ฑ๊ณต์ ์ปค๋ฐ
transactionManager.rollback(status); //์คํจ์ ๋กค๋ฐฑ
ํธ๋์ญ์ ๋๊ธฐํ
ํธ๋์ญ์ ์ ์ ์งํ๋ ค๋ฉด ํธ๋์ญ์ ์ ์์๋ถํฐ ๋๊น์ง ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ ์งํด์ํ๋ค.
๊ฒฐ๊ตญ ๊ฐ์ ์ปค๋ฅ์ ์ ๋๊ธฐํ(๋ง์ถ์ด ์ฌ์ฉ)ํ๊ธฐ ์ํด์ ์ด์ ์๋ ํ๋ผ๋ฏธํฐ๋ก ์ปค๋ฅ์ ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
ํ๋ผ๋ฏธํฐ๋ก ์ปค๋ฅ์ ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๋ ๊ฒ์ ๋ฌผ๋ก ์ด๊ณ ,
์ปค๋ฅ์ ์ ๋๊ธฐ๋ ๋ฉ์๋์ ๋๊ธฐ์ง ์๋ ๋ฉ์๋๋ฅผ ์ค๋ณตํด์ ๋ง๋ค์ด์ผ ํ๋ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๋จ์ ๋ค์ด ๋ง๋ค.
ํธ๋์ญ์ ๋งค๋์ ์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์

์คํ๋ง์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋ฅผ ์ ๊ณตํ๋ค.
์ด๊ฒ์ ์ฐ๋ ๋ ๋ก์ปฌ( ThreadLocal )์ ์ฌ์ฉํด์ ์ปค๋ฅ์ ์ ๋๊ธฐํํด์ค๋ค.
ํธ๋์ญ์ ๋งค๋์ ๋ ๋ด๋ถ์์ ์ด ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋ฅผ ์ฌ์ฉํ๋ค.
ํธ๋์ญ์
๋๊ธฐํ ๋งค๋์ ๋ ์ฐ๋ ๋ ๋ก์ปฌ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ฐ๋ ๋ ์ํฉ์ ์์ ํ๊ฒ ์ปค๋ฅ์
์ ๋๊ธฐํ ํ ์ ์๋ค.
๋ฐ๋ผ์ ์ปค๋ฅ์ ์ด ํ์ํ๋ฉด ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋ฅผ ํตํด ์ปค๋ฅ์ ์ ํ๋ํ๋ฉด ๋๋ค.
๋ฐ๋ผ์ ์ด์ ์ฒ๋ผ ํ๋ผ๋ฏธํฐ๋ก ์ปค๋ฅ์ ์ ์ ๋ฌํ์ง ์์๋ ๋๋ค.
๋์ ๋ฐฉ์
1. ํธ๋์ญ์ ์ ์์ํ๋ ค๋ฉด ์ปค๋ฅ์ ์ด ํ์ํ๋ค. ํธ๋์ญ์ ๋งค๋์ ๋ ๋ฐ์ดํฐ์์ค๋ฅผ ํตํด ์ปค๋ฅ์ ์ ๋ง๋ค๊ณ ํธ๋์ญ์ ์ ์์ํ๋ค.
2. ํธ๋์ญ์ ๋งค๋์ ๋ ํธ๋์ญ์ ์ด ์์๋ ์ปค๋ฅ์ ์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ดํ๋ค.
3. ๋ฆฌํฌ์งํ ๋ฆฌ๋ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ด๋ ์ปค๋ฅ์ ์ ๊บผ๋ด์ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ํ๋ผ๋ฏธํฐ๋ก ์ปค๋ฅ์ ์ ์ ๋ฌํ์ง ์์๋ ๋๋ค.
4. ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด ํธ๋์ญ์ ๋งค๋์ ๋ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ด๋ ์ปค๋ฅ์ ์ ํตํด ํธ๋์ญ์ ์ ์ข ๋ฃํ๊ณ , ์ปค๋ฅ์ ๋ ๋ซ๋๋ค.
DataSourceUtils.getConnection()
private Connection getConnection() throws SQLException {
//์ฃผ์! ํธ๋์ญ์
๋๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด DataSourceUtils๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
Connection con = DataSourceUtils.getConnection(dataSource);
log.info("get connection={} class={}", con, con.getClass());
return con;
}
ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๊ฐ ๊ด๋ฆฌํ๋ ์ปค๋ฅ์ ์ด ์์ผ๋ฉด ํด๋น ์ปค๋ฅ์ ์ ๋ฐํํ๋ค.
ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๊ฐ ๊ด๋ฆฌํ๋ ์ปค๋ฅ์ ์ด ์๋ ๊ฒฝ์ฐ ์๋ก์ด ์ปค๋ฅ์ ์ ์์ฑํด์ ๋ฐํํ๋ค.
ํธ๋์ญ์ ๋งค๋์ ๋ ๋ฐ์ดํฐ์์ค๋ฅผ ํตํด ์ปค๋ฅ์ ์ ์์ฑํ๋ฏ๋ก DataSource ๊ฐ ํ์ํ๋ค.
DataSourceUtils.releaseConnection()
private void close(Connection con, Statement stmt, ResultSet rs) {
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
//์ฃผ์! ํธ๋์ญ์
๋๊ธฐํ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด DataSourceUtils๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
DataSourceUtils.releaseConnection(con, dataSource);
}
DataSourceUtils.releaseConnection() ์ ์ฌ์ฉํ๋ฉด ์ปค๋ฅ์ ์ ๋ฐ๋ก ๋ซ๋ ๊ฒ์ด ์๋๋ค.
ํธ๋์ญ์ ์ ์ฌ์ฉํ๊ธฐ ์ํด ๋๊ธฐํ๋ ์ปค๋ฅ์ ์ ์ปค๋ฅ์ ์ ๋ซ์ง ์๊ณ ๊ทธ๋๋ก ์ ์งํด์ค๋ค.
ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๊ฐ ๊ด๋ฆฌํ๋ ์ปค๋ฅ์ ์ด ์๋ ๊ฒฝ์ฐ ํด๋น ์ปค๋ฅ์ ์ ๋ซ๋๋ค.
ํธ๋์ญ์ ๋งค๋์ ์ ์ ์ฒด ๋์ ํ๋ฆ
ํธ๋์ญ์ ๋งค๋์ 1 - ํธ๋์ญ์ ์์

ํด๋ผ์ด์ธํธ์ ์์ฒญ์ผ๋ก ์๋น์ค ๋ก์ง์ ์คํํ๋ค.
1. ์๋น์ค ๊ณ์ธต์์ transactionManager.getTransaction() ์ ํธ์ถํด์ ํธ๋์ญ์ ์ ์์ํ๋ค.
2. ํธ๋์ญ์ ์ ์์ํ๋ ค๋ฉด ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ด ํ์ํ๋ค.
ํธ๋์ญ์ ๋งค๋์ ๋ ๋ด๋ถ์์ ๋ฐ์ดํฐ์์ค๋ฅผ ์ฌ์ฉํด์ ์ปค๋ฅ์ ์ ์์ฑํ๋ค.
3. ์ปค๋ฅ์ ์ ์๋ ์ปค๋ฐ ๋ชจ๋๋ก ๋ณ๊ฒฝํด์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ์์ํ๋ค.
4. ์ปค๋ฅ์ ์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ดํ๋ค.
5. ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋ ์ฐ๋ ๋ ๋ก์ปฌ์ ์ปค๋ฅ์ ์ ๋ณด๊ดํ๋ค.
๋ฐ๋ผ์ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์ ์์ ํ๊ฒ ์ปค๋ฅ์ ์ ๋ณด๊ดํ ์ ์๋ค.
ํธ๋์ญ์ ๋งค๋์ 2 - ๋ก์ง ์คํ

6. ์๋น์ค๋ ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ๋ฉด์ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฉ์๋๋ค์ ํธ์ถํ๋ค.
์ด๋ ์ปค๋ฅ์ ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ์ง ์๋๋ค.
7. ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฉ์๋๋ค์ ํธ๋์ญ์ ์ด ์์๋ ์ปค๋ฅ์ ์ด ํ์ํ๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ๋ DataSourceUtils.getConnection() ์ ์ฌ์ฉํด์ ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ์ ๋ณด๊ด๋ ์ปค๋ฅ์ ์ ๊บผ๋ด์ ์ฌ์ฉํ๋ค.
์ด ๊ณผ์ ์ ํตํด์ ์์ฐ์ค๋ฝ๊ฒ ๊ฐ์ ์ปค๋ฅ์ ์ ์ฌ์ฉํ๊ณ , ํธ๋์ญ์ ๋ ์ ์ง๋๋ค.
8. ํ๋ํ ์ปค๋ฅ์ ์ ์ฌ์ฉํด์ SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ฌํด์ ์คํํ๋ค.
ํธ๋์ญ์ ๋งค๋์ 3 - ํธ๋์ญ์ ์ข ๋ฃ
9. ๋น์ฆ๋์ค ๋ก์ง์ด ๋๋๊ณ ํธ๋์ญ์ ์ ์ข ๋ฃํ๋ค.
ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑํ๋ฉด ์ข ๋ฃ๋๋ค.
10. ํธ๋์ญ์ ์ ์ข ๋ฃํ๋ ค๋ฉด ๋๊ธฐํ๋ ์ปค๋ฅ์ ์ด ํ์ํ๋ค.
ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋ฅผ ํตํด ๋๊ธฐํ๋ ์ปค๋ฅ์ ์ ํ๋ํ๋ค.
11. ํ๋ํ ์ปค๋ฅ์ ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ฑฐ๋ ๋กค๋ฐฑํ๋ค.
12. ์ ์ฒด ๋ฆฌ์์ค๋ฅผ ์ ๋ฆฌํ๋ค.
ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋ฅผ ์ ๋ฆฌํ๋ค. ์ฐ๋ ๋ ๋ก์ปฌ์ ์ฌ์ฉํ ๊ผญ ์ ๋ฆฌํด์ผ ํ๋ค.
con.setAutoCommit(true) ๋ก ๋๋๋ฆฐ๋ค. ์ปค๋ฅ์ ํ์ ๊ณ ๋ คํด์ผ ํ๋ค.
con.close() ๋ฅผ ํธ์ถํด์ ์ปค๋ฅ์ ์ ์ข ๋ฃํ๋ค.
์ปค๋ฅ์ ํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ con.close() ๋ฅผ ํธ์ถํ๋ฉด ์ปค๋ฅ์ ํ์ ๋ฐํ๋๋ค.
์ ๋ฆฌ
ํธ๋์ญ์
์ถ์ํ ๋๋ถ์ ์๋น์ค ์ฝ๋๋ ์ด์ JDBC ๊ธฐ์ ์ ์์กดํ์ง ์๋๋ค.
์ดํ JDBC์์ JPA๋ก ๋ณ๊ฒฝํด๋ ์๋น์ค ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ ์งํ ์ ์๋ค.
๊ธฐ์ ๋ณ๊ฒฝ์ ์์กด๊ด๊ณ ์ฃผ์ ๋ง DataSourceTransactionManager ์์ JpaTransactionManager ๋ก ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
ํธ๋์ญ์ ๋๊ธฐํ ๋งค๋์ ๋๋ถ์ ์ปค๋ฅ์ ์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ์ง ์์๋ ๋๋ค.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1/dashboard
์คํ๋ง DB 1ํธ - ๋ฐ์ดํฐ ์ ๊ทผ ํต์ฌ ์๋ฆฌ - ์ธํ๋ฐ | ๊ฐ์
๋ฐฑ์๋ ๊ฐ๋ฐ์ ํ์ํ DB ๋ฐ์ดํฐ ์ ๊ทผ ๊ธฐ์ ์ ๊ธฐ์ด๋ถํฐ ์ดํดํ๊ณ , ์์ฑํ ์ ์์ต๋๋ค. ์คํ๋ง DB ์ ๊ทผ ๊ธฐ์ ์ ์๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ , ๋ ๊น์ด์๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํ ์ ์์ต๋๋ค., - ๊ฐ์
www.inflearn.com