#20 JDBC ํธ๋์ญ์ (Spring -@Transaction)
by JiwonDevSpring์ @Transaction์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ์ดํดํ๊ธฐ ์ํด JDBC์ ํธ๋์ญ์ ์ ๋ํด ๊ณต๋ถํด๋ด ์๋ค.
JDBC์ ์ฌ์ฉ๋ฒ์ ์ด๊ธ์์ ๋ค๋ฃจ์ง ์์ต๋๋ค. ์๋๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
2021.07.21 - [Backend/Java] - #19 JDBC
#19 JDBC
# JDBC? (Java Database Connectivity) Java ์ฝ๋์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ์ ๊ณตํด์ฃผ๋ API. ์ฐธ๊ณ ๋ก JDBC๊ฐ ๋์ค๊ธฐ ์ด์ ์๋ MS์งํ ( C์ธ์ด)์์ ๋ง๋ ODBC API (Open DB Connectivity)๋ฅผ ์ ๊ณตํ์๋ค...
jiwondev.tistory.com
#1. Transaction ์ด๋
ํธ๋์ญ์ (Transaction)์ DB์ ์ํ๋ฅผ ๋ณํ์ํค๋ ํ๋์ ์์ ๋จ์ (๋๋ ํ๋ฒ์ ๋ชจ๋ ์ํํด์ผํ ์ฐ์ฐ๋ค)์ ์๋ฏธํ๋ค. ํธ๋์ญ์ ์ ์ค๊ณํ ๋์๋ ๋ฐ๋์ ACID ์์น์ ์ง์ผ์ผ ํ๋ค.
์ฐ์ Transaction์ ์๋ฏธ๋ '๊ฑฐ๋', ์ฆ ์ํ์์ ์ฌ์ฉํ๋ ๊ฑฐ๋์ ๊ฐ์ ์๋ฏธ์ ๋๋ค.
ํธ๋์ญ์ ์ ํ์์ฑ์ ์ดํดํ๊ธฐ ์ํด [์ํ๊ฐ ์ก๊ธ ์์คํ ]์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
1. A์ํ์์ B์ํ์ผ๋ก ์ก๊ธํฉ๋๋ค.
2. A์ํ์์ ์ก๊ธ์ด ์ฑ๊ณตํ์๊ณ , B์ํ์์ ๋ฐ๋ ์์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ์ฌ ์ ๊ธ๋ฐ์ง ๋ชปํ์ต๋๋ค.
์ด๋ฅผ ๋ฌธ์ ์์ด ๋ณต๊ตฌํ๊ธฐ ์ํด์ ์ด๋ป๊ฒ ํด์ผํ ๊น์? A์ ์ฐ๋ฝ์ ๋ค์ํด์ ํด๋น๊ฑฐ๋๋ฅผ ์ทจ์ํ๊ณ , ์ค๋ฅ๊ฐ ํด๊ฒฐ ๋ ๋ค์ ์ ๊ธ๋๋ฉด ์๋๋ B์ ์ ๊ธ๋๋๋ผ๋ ๋ฌด์ํด๋ฌ๋ผ๊ณ ์ฐ๋ฝํด์ผํ ๊น์? ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ฐ์ดํฐ์ ์์ ์ฑ, ๋ฌด๊ฒฐ์ฑ์ ํ๋ณดํ๋ ๋ฐฉ๋ฒ์ด 'ํธ๋์ญ์ ' ๋จ์ ์ฒ๋ฆฌ์ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๊ฐ๊ฐ์ ์์ ์ 'ํธ๋์ญ์ ' ๋จ์๋ก ๊ด๋ฆฌํ๋ฉฐ ํธ๋์ญ์ ์ด ์ ์ ์๋ฃ๋์ง์์๋ค๋ฉด ์์ ํ๋ ๊ณผ์ ๋ค์ ์ ๋ถ ์์ํ๋ก ๋๋๋ฆฝ๋๋ค. (= ํ ํธ๋์ญ์ ์์ ์ผ๋ถ๋ง ์๋ฃ๋๋ ๊ฒฝ์ฐ๋ ์์ต๋๋ค.)
์ ์์ ์์์ ํ ํธ๋์ญ์ ์ [ A์ํ ์ก๊ธ -> B์ํ ์์ -> ๊ฑฐ๋์๋ฃ ] ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
Atomicity(์์์ฑ) - ํธ๋์ญ์ ์ ๋ ์ด์ ์์ ๋จ์๋ก ์ชผ๊ฐค ์ ์๋ค.
- ํ ํธ๋์ญ์ ๋ด์ ๋ชจ๋ ๋ช ๋ น์ ๋ฐ๋์ ์๋ฒฝํ ์ํ๋์ด์ผ ํ๋ฉฐ, ๋ชจ๋๊ฐ ์๋ฒฝํ ์ํ๋์ง ์๊ณ ์ด๋ํ๋๋ผ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ํธ๋์ญ์ ์ ๋ถ๊ฐ ์ทจ์๋์ด์ผ ํ๋ค. ๋ถ๋ถ ์๋ฃ๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ๋ณดํต ํธ๋์ญ์ ์ฑ๊ณต ์ฐ์ฐ์ Commit(์ปค๋ฐ), ์คํจ ์ฐ์ฐ์ Rollback(๋๋ Aborted) ๋ผ ๋ถ๋ฅธ๋ค.
Consistency(์ผ๊ด์ฑ) - ํธ๋์ญ์ ์ ์ธ์ ๋ ๊ฐ์ ์ ๋ ฅ์๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์์ผํ๋ค.
- ํธ๋์ญ์ ์ด ๊ทธ ์คํ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ๋ฉด ์ธ์ ๋ ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ก ๋ณํํ๋ค.
- ์์คํ ์ด ๊ฐ์ง๊ณ ์๋ ๊ณ ์ ์์๋ ํธ๋์ญ์ ์ํ ์ ๊ณผ ํธ๋์ญ์ ์ํ ์๋ฃ ํ์ ์ํ๊ฐ ๊ฐ์์ผ ํ๋ค.
Isolation(๋ ๋ฆฝ์ฑ,๊ฒฉ๋ฆฌ์ฑ) - ๊ฐ๊ฐ์ ํธ๋์ญ์ ์ ๋ ๋ฆฝ์ ์ด๋ค. ์คํ ์ค ์๋ก ์ํฅ๋ผ์น์ง ์๋๋ค.
- ๋ ์ด์์ ํธ๋์ญ์ ์ด ๋์์ ๋ณํ ์คํ๋๋ ๊ฒฝ์ฐ ์ด๋ ํ๋์ ํธ๋์ญ์ ์คํ์ค์ ๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฐ์ฐ์ด ๋ผ์ด๋ค ์ ์๋ค.
- ์ํ์ค์ธ ํธ๋์ญ์ ์ ์์ ํ ์๋ฃ๋ ๋๊น์ง ๋ค๋ฅธ ํธ๋์ญ์ ์์ ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ฐธ์กฐํ ์ ์๋ค.
Durablility(์์์ฑ,์ง์์ฑ) - ํธ๋์ญ์ ์ ์ํด ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ ์๊ตฌ์ ์ผ๋ก ์ ์ฅ๋๋ค.
- ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ํธ๋์ญ์ ์ ๊ฒฐ๊ณผ๋ ์์คํ ์ด ๊ณ ์ฅ๋๋๋ผ๋ ์๊ตฌ์ ์ผ๋ก ๋ฐ์๋์ด์ผ ํ๋ค.
#2. JDBC ํธ๋์ญ์
DB์์์ ์ฒ๋ฆฌ๋๋ ๋ชจ๋ ๋์์ ํธ๋์ญ์ ๋จ์๋ก ์คํ๋๋ค. ์ฐ๋ฆฌ๊ฐ JDBC ์ฝ๋๋ก ํธ๋์ญ์ ์ ๋ง๋ค์ง ์์๋๋ผ๋ DB ๋ด๋ถ์ ์ผ๋ก๋ ์์ ํธ๋์ญ์ ์ ๋ง๋ค์ด ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ค. ๋ง์ฝ Java ์ฝ๋๋ก ์ง์ ํธ๋์ญ์ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉดConnection ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ด์ฉํ์ฌ ๋ง๋ค ์ ์๋ค.
import java.sql.*;
// import java.sql.Connection;
/* ... ์ค๊ฐ์ฝ๋ ์๋ต ... */
// (1)
Connection connection=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl",
"user","password");
try(connection){
connection.setAutoCommit(false); // (2)
//execute some SQL statements...
connection.commit(); // (3)
}catch(SQLException e){
connection.rollback(); // (4)
}
0. JDBC API๋ฅผ import ํ ํ ๋๋ผ์ด๋ฒ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. (Java1.6 ์ดํ ์๋ต๊ฐ๋ฅ)
* Java 1.6, JDBC 4.0 ์ดํ์ JDBC์์๋ ์๋น์ค ๋ก๋(java.util.ServiceLoader) ๊ธฐ๋ฐ์ผ๋ก JDBC Driver๊ฐ ์๋์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค. ์ฆ Class.forName("com.mysql.jdbc.Driver") ๋ฅ์ ์ฝ๋๋ฅผ ์๋์ผ๋ก ํธ์ถํ์ง ์์๋ ๋ฑ๋ก๋ฉ๋๋ค.
- JDBC ์ปค๋ฅ์ ์ ์์ฑํ๋ค.
- ์๋ฐ์์ ํธ๋์ญ์ ์ ์์ํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ด๋ค. ๊ธฐ๋ณธ ๊ฐ์ธ connection.setAutoCommit(true) ์ต์ ์ ๋ชจ๋ SQL Statement๋ฅผ ๋ํํ์ฌ ์ปค๋ฐ, ๋กค๋ฐฑ๋ฑ์ ํธ๋์ญ์ ์ด JDBC API ๋ด๋ถ์์ ์๋์ผ๋ก ์ฒ๋ฆฌ๋๊ฒ๋๋ค. ํด๋น ์ต์ ์ false๋ก ๋ฐ๊พธ์ด์ผ ๋ด๊ฐ ์ง์ ํธ๋์ญ์ ์ ๊ด๋ฆฌ ํ ์ ์๋ค.
- ํ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ์ SQL์ ์คํ ํ ๋ค .commit() ๋๋ .rollback() ํ๋ค. ์ด๋ DB ํธ๋์ญ์ ์ ์ปค๋ฐ, ๋กค๋ฐฑ๊ณผ ๋์ผํ๋ค.
(์คํ๋ง & DB ๊ณต๋ถ ์ดํ ์ถ๊ฐ ์์ฑ ์์ )
'๐ฑBackend > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
#22 ์๋ฐ ์ฑ ๋ฐฐํฌ (JAR, WAR) (0) | 2021.07.21 |
---|---|
#21 Servlet Context Listener (0) | 2021.07.21 |
#19 JDBC (0) | 2021.07.21 |
#18 JSP Model1, Model2 (MVC) (0) | 2021.07.18 |
#17 Servlet Filter (0) | 2021.07.18 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev