JiwonDev

#20 JDBC ํŠธ๋žœ์žญ์…˜ (Spring -@Transaction)

by JiwonDev

Spring์˜ @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") ๋ฅ˜์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ํ˜ธ์ถœํ•˜์ง€ ์•Š์•„๋„ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

  1. JDBC ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•œ๋‹ค.
  2. ์ž๋ฐ”์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ธฐ๋ณธ ๊ฐ’์ธ connection.setAutoCommit(true) ์˜ต์…˜์€ ๋ชจ๋“  SQL Statement๋ฅผ ๋ž˜ํ•‘ํ•˜์—ฌ ์ปค๋ฐ‹, ๋กค๋ฐฑ๋“ฑ์˜ ํŠธ๋žœ์žญ์…˜์ด JDBC API ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ฒŒ๋œ๋‹ค. ํ•ด๋‹น ์˜ต์…˜์„ false๋กœ ๋ฐ”๊พธ์–ด์•ผ ๋‚ด๊ฐ€ ์ง์ ‘ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ์„ 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

ํ™œ๋™ํ•˜๊ธฐ