🌱Backend/Java

#20 JDBC νŠΈλžœμž­μ…˜ (Spring -@Transaction)

JiwonDev 2021. 7. 21. 19:34

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 곡뢀 이후 μΆ”κ°€ μž‘μ„± μ˜ˆμ •)