Spring DB Part I
Spring DB Part I
μνλμ μ€νλ§ DB 1νΈ - λ°μ΄ν° μ κ·Ό ν΅μ¬ μ리 κ°μλ₯Ό μμ½ν λ΄μ©μ λλ€.
Intro
H2 λ°μ΄ν°λ² μ΄μ€ μ€μ
Download
μ€ν
μ€ν κΆν:
chmod 755 h2.sh
μ€ν:
./h2.sh
mv.db νμΌ μμ±:
jdbc:h2:~/test
μ μ:
jdbc:h2:tcp://localhost/~/test
JDBC
Java Database Connectivity
μλ°μμ λ°μ΄ν°λ² μ΄μ€μ μ μνκΈ° μν΄ μ¬μ©λλ μλ° API
Server <-> DB
Connection μ°κ²°
: μ£Όλ‘ TCP/IPλ₯Ό μ¬μ©ν΄μ 컀λ₯μ μ°κ²°SQL μ λ¬
: μλ²λ DBκ° μ΄ν΄ν μ μλ SQLμ 컀λ₯μ μΌλ‘ DBμ μ λ¬Response
: DBλ μ λ¬λ SQLμ μννκ³ κ·Έ κ²°κ³Όλ₯Ό μλ΅ -> μλ²λ μλ΅ κ²°κ³Ό νμ©
JDBC νμ€ μΈν°νμ΄μ€
java.sql.Connection
: μ°κ²°java.sql.Statement
: SQLμ λ΄μ λ΄μ©java.sql.ResultSet
: SQL μμ² μλ΅
JDBC λ°μ΄ν° μ κ·Ό κΈ°μ
SQL Mapper
Spring JdbcTemplate
MyBatis
ORM
JPA
hibernate
eclipse link
λ°μ΄ν°λ² μ΄μ€ μ°κ²°
JDBCλ
java.sql.Connection
νμ€ μ»€λ₯μ μΈν°νμ΄μ€λ₯Ό μ μH2 λ°μ΄ν°λ² μ΄μ€ λλΌμ΄λ²λ JDBC Connection μΈν°νμ΄μ€λ₯Ό ꡬνν
org.h2.jdbc.JdbcConnection
ꡬν체 μ 곡
JDBCκ° μ 곡νλ
DriverManager
λ λΌμ΄λΈλ¬λ¦¬μ λ±λ‘λ DB λλΌμ΄λ²λ€μ κ΄λ¦¬νκ³ , 컀λ₯μ μ νλνλ κΈ°λ₯ μ 곡
.
DriverManager 컀λ₯μ μμ² νλ¦
μ ν리μΌμ΄μ λ‘μ§μμ 컀λ₯μ μ΄ νμνλ©΄
DriverManager.getConnection()
νΈμΆDriverManager
λ λΌμ΄λΈλ¬λ¦¬μ λ±λ‘λ λλΌμ΄λ² λͺ©λ‘μ μλμΌλ‘ μΈμλλΌμ΄λ²λ€μκ² μμλλ‘ URL, dμ΄λ¦, λΉλ°λ²νΈ λ± μ μμ΄ νμν μ 보λ₯Ό λ겨 컀λ₯μ μ νλν μ μλμ§ νμΈ
κ°κ°μ λλΌμ΄λ²λ URL μ 보λ₯Ό 체ν¬ν΄μ λ³ΈμΈμ΄ μ²λ¦¬ν μ μλ μμ²μΈμ§ νμΈ
μ°Ύμ 컀λ₯μ ꡬν체λ₯Ό ν΄λΌμ΄μΈνΈμ λ°ν
μ²λ¦¬κ° κ°λ₯ν λλΌμ΄λ²μ κ²½μ° μ€μ λ°μ΄ν°λ² μ΄μ€μ μ°κ²°ν΄μ 컀λ₯μ μ νλνκ³ μ΄ μ»€λ₯μ μ ν΄λΌμ΄μΈνΈμ λ°ν
λ°λ©΄ URLμ΄ jdbc:h2 λ‘ μμνλλ° MySQL λλΌμ΄λ²κ° λ¨Όμ μ€νλ κ²½μ°, μ²λ¦¬ν μ μλ€λ κ²°κ³Όλ₯Ό λ°ννκ² λκ³ , λ€μ λλΌμ΄λ²μκ² μμκ° μ λ¬
getConnection() & close()
DriverManager
DataSource
λ±λ‘
μ‘°ν
μμ , μμ
Connection Pool & DataSource
λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ νλ κ³Όμ
μλ²μμ DB λλΌμ΄λ²λ₯Ό ν΅ν΄ 컀λ₯μ μ‘°ν
DB λλΌμ΄λ²λ DBμ TCP/IP 컀λ₯μ μ°κ²° (3 way handshake λμ λ°μ)
TCP/IP 컀λ₯μ μ΄ μ°κ²°λλ©΄, ID/PWμ κΈ°ν λΆκ°μ 보λ₯Ό DBμ μ λ¬
DBλ ID/PWλ₯Ό ν΅ν΄ λ΄λΆ μΈμ¦μ μλ£νκ³ , λ΄λΆ DB μΈμ μμ±
DBλ 컀λ₯μ μμ±μ΄ μλ£λμλ€λ μλ΅ μ λ¬
DB λλΌμ΄λ²λ 컀λ₯μ κ°μ²΄λ₯Ό μμ±ν΄μ ν΄λΌμ΄μΈνΈμ λ°ν
ConnectionPool
컀λ₯μ μ κ΄λ¦¬νλ μμμ₯(!)
DriverManager λ₯Ό ν΅ν΄ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ μ λ§€λ² μλ‘ μμ±νλ κ³Όμ μμ λ°μνλ μλ΅ μλ μ ν λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ μ»€λ₯μ μ 미리 μμ±ν΄λκ³ μ¬μ©
ConnectionPool μ΄κΈ°ν
μ ν리μΌμ΄μ μμ μμ μ νμν λ§νΌμ 컀λ₯μ μ 미리 ν보ν΄μ νμ 보κ΄
κΈ°λ³Έκ°μ λ³΄ν΅ 10κ°
ConnectionPool μ°κ²° μν
컀λ₯μ νμ λ€μ΄ μλ 컀λ₯μ μ TCP/IPλ‘ DBμ 컀λ₯μ μ΄ μ°κ²°λμ΄ μλ μν
μΈμ λ μ§ SQLμ DBμ μ λ¬ κ°λ₯
ConnectionPool μ¬μ©
컀λ₯μ νμ ν΅ν΄ μ΄λ―Έ μμ±λμ΄ μλ 컀λ₯μ μ κ°μ²΄ μ°Έμ‘°λ‘ μ»μ΄μ μ¬μ©
컀λ₯μ μ μμ²νλ©΄ 컀λ₯μ νμ μμ μ΄ κ°μ§κ³ μλ 컀λ₯μ μ€ νλλ₯Ό λ°ν
컀λ₯μ νλ‘λΆν° λ°μ 컀λ₯μ μ μ¬μ©ν΄μ SQLμ DBμ μ λ¬νκ³ , κ·Έ κ²°κ³Όλ₯Ό λ°μμ μ²λ¦¬
컀λ₯μ μ λͺ¨λ μ¬μ©νλ©΄ 컀λ₯μ μ μ’ λ£νμ§ μκ³ λ€μ μ¬μ©ν μ μλλ‘ μ»€λ₯μ νμ λ°ν
DataSource
컀λ₯μ μ νλνλ λ°©λ²μ μΆμν νλ μΈν°νμ΄μ€
컀λ₯μ ν μ€νμμ€
commons-dbcp2
,tomcat-jdbc pool
,HikariCP
μ μ§μ μμ‘΄νλ κ²μ΄ μλλΌ, DataSource μΈν°νμ΄μ€μλ§ μμ‘΄νλ©΄ λλ€!
DriverManager
DriverManager
컀λ₯μ μ νλν λ λ§λ€ URL/USERNAME/PASSWORD λ₯Ό νλΌλ―Έν°λ‘ κ³μ μ λ¬
DataSourceDriverManager
λ°λ©΄, μ²μ κ°μ²΄λ₯Ό μμ±ν λλ§ νμν ν리미ν°λ₯Ό λκΈ°κ³ , 컀λ₯μ μ νλν λλ λ¨μν dataSource.getConnection() λ§ νΈμΆ
μ€μ
κ³Όμ¬μ©
μ λΆλ¦¬κ° λͺ ν
Connection Pool
컀λ₯μ νμ λ³λμ μ°λ λ μ¬μ©ν΄μ 컀λ₯μ νμ 컀λ₯μ μ μ±μ΄λ€.
DriverManagerDataSource λ νμ μλ‘μ΄ μ»€λ₯μ μ μμ±νλ λ°λ©΄, 컀λ₯μ νμ 컀λ₯μ μ μ¬μ¬μ©
Transaction
DBμμ νΈλμμ μ νλμ μμ λ₯Ό μμ νκ² μ²λ¦¬νλλ‘ λ³΄μ₯
컀λ°(Commit)
: λͺ¨λ μμ μ΄ μ±κ³΅ν΄μ DBμ μ μ λ°μνλ κ²λ‘€λ°±(Rollback)
: μμ μ΄ νλλΌλ μ€ν¨ν΄μ μμ μ΄μ μΌλ‘ λλ리λ κ²
νΈλμμ
ACID
νΈλμμ μ μμμ±(Atomicity), μΌκ΄μ±(Consistency), 격리μ±(Isolation), μ§μμ±(Durability)μ 보μ₯ν΄μΌ νλ€.
μμμ±(Atomicity)
: νΈλμμ λ΄μμ μ€νν μμ λ€μ λ§μΉ νλμ μμ μΈ κ²μ²λΌ λͺ¨λ μ±κ³΅ νκ±°λ λͺ¨λ μ€ν¨ν΄μΌ νλ€.μΌκ΄μ±(Consistency)
: λͺ¨λ νΈλμμ μ μΌκ΄μ± μλ λ°μ΄ν°λ² μ΄μ€ μνλ₯Ό μ μ§ν΄μΌ νλ€.λ°μ΄ν°λ² μ΄μ€μμ μ ν λ¬΄κ²°μ± μ μ½ μ‘°κ±΄μ νμ λ§μ‘±ν΄μΌ νλ€.
격리μ±(Isolation)
: λμμ μ€νλλ νΈλμμ λ€μ΄ μλ‘μκ² μν₯μ λ―ΈμΉμ§ μλλ‘ κ²©λ¦¬νλ€.λμμ κ°μ λ°μ΄ν°λ₯Ό μμ νμ§ λͺ»νλλ‘ ν΄μΌ νλ€.
νΈλμμ κ°μ 격리μ±μ μλ²½ν 보μ₯νλ €λ©΄ νΈλμμ μ κ±°μ μμλλ‘ μ€νν΄μΌ νλ―λ‘ ANSI νμ€μ νΈλμμ μ 격리 μμ€μ 4λ¨κ³λ‘ λλμ΄ μ μ
격리μ±μ λμμ±κ³Ό κ΄λ ¨λ μ±λ₯ μ΄μλ‘ μΈν΄ νΈλμμ 격리 μμ€(Isolation level)μ μ νν μ μλ€.
READ UNCOMMITED(컀λ°λμ§ μμ μ½κΈ°)
READ COMMITTED(컀λ°λ μ½κΈ°)
REPEATABLE READ(λ°λ³΅ κ°λ₯ν μ½κΈ°)
SERIALIZABLE(μ§λ ¬ν κ°λ₯)
μ§μμ±(Durability)
: νΈλμμ μ μ±κ³΅μ μΌλ‘ λλ΄λ©΄ κ·Έ κ²°κ³Όκ° νμ κΈ°λ‘λμ΄μΌ νλ€.μ€κ°μ μμ€ν μ λ¬Έμ κ° λ°μν΄λ λ°μ΄ν°λ² μ΄μ€ λ‘κ·Έ λ±μ μ¬μ©ν΄μ μ±κ³΅ν νΈλμμ λ΄μ©μ 볡ꡬν΄μΌ νλ€.
νΈλμμ μ μ¬μ© μμ
λ°μ΄ν° λ³κ²½ 쿼리λ₯Ό μ€ννκ³ λ°μ΄ν°λ² μ΄μ€μ κ²°κ³Όλ₯Ό λ°μνλ €λ©΄ commit μ νΈμΆνκ³ ,
κ²°κ³Όλ₯Ό λ°μνκ³ μΆμ§ μλ€λ©΄ rollback μ νΈμΆ
컀λ°μ νΈμΆνκΈ° μ κΉμ§λ μμλ‘ λ°μ΄ν°λ₯Ό μ μ₯ -> ν΄λΉ νΈλμμ μ μμ
μλ컀λ°κ³Ό μλ컀λ°
μλ 컀λ°
κ°κ°μ 쿼리 μ€ν μ§ν μλμΌλ‘ μ»€λ° νΈμΆ
컀λ°μ΄λ λ‘€λ°±μ μ§μ νΈμΆνμ§ μμλ λλ νΈλ¦¬ν¨
νμ§λ§, μνλ νΈλμμ κΈ°λ₯μ μ λλ‘ μ¬μ©ν μ μλ λ¨μ μ‘΄μ¬
μλ 컀λ°
μλ μ»€λ° λͺ¨λλ‘ μ€μ νλ κ²μ΄ νΈλμμ μμ
μ΄ν commit, rollback νΈμΆ νμ
μλ/μλ μ»€λ° λͺ¨λλ νλ² μ€μ νλ©΄ ν΄λΉ μΈμ μμ κ³μ μ μ§ (μ€κ° λ³κ²½λ κ°λ₯)
Lock
μΈμ μ΄ νΈλμμ μ μμνκ³ λ°μ΄ν°λ₯Ό μμ νλ λμ μ»€λ° or λ‘€λ°± μ κΉμ§ λ€λ₯Έ μΈμ μμ ν΄λΉ λ°μ΄ν°λ₯Ό μμ ν μ μλλ‘ λ½μ μ 곡
λ€λ₯Έ μΈμ μ λ½μ νλν λκΉμ§ λκΈ°
λ½ λκΈ° μκ°μ λμ΄κ°λ©΄ λ½ νμμμ μ€λ₯ λ°μ(λ½ λκΈ° μκ°μ μ€μ κ°λ₯)
Lock Timeout μκ° μ€μ
Lock Timeout Error
μ‘°νμ λ½
μΌλ°μ μΈ μ‘°νλ λ½μ μ¬μ©νμ§ μμ§λ§,
λ½μ νλν΄μ λ³κ²½μ λ§κ³ μΆλ€λ©΄,
select .. for update
ꡬ문μ μ¬μ©νΈλμμ μ’ λ£ μμ κΉμ§ ν΄λΉ λ°μ΄ν°λ₯Ό λ€λ₯Έ κ³³μμ λ³κ²½νμ§ λͺ»νλλ‘ κ°μ λ‘ λ§μμΌ ν κ²½μ° μ¬μ©
ν΄λΉ μΈμ μ΄ μ‘°ν μμ μ λ½μ κ°μ Έκ°λ²λ¦¬κΈ° λλ¬Έμ λ€λ₯Έ μΈμ μμ ν΄λΉ λ°μ΄ν°λ₯Ό λ³κ²½ν μ μλ€(νΈλμμ μ»€λ° μ λ½ λ°λ©)
κ³Όκ±° νΈλμμ
μ μ©
νΈλμμ μ μλΉμ€ κ³μΈ΅μμλΆν° μμ
λΉμ¦λμ€ λ‘μ§μ΄ μλͺ»λλ©΄ λ¬Έμ κ° λλ λΆλΆμ ν¨κ» λ‘€λ°±ν΄μ£Όμ΄μΌ νλ€.
νΈλμμ μ μμνλ €λ©΄ 컀λ₯μ μ΄ νμ.
set autocommit false;
κ°μ μΈμ μ μ¬μ©νκΈ° μν΄ νΈλμμ μ μ¬μ©νλ λμ κ°μ 컀λ₯μ μ μ μ§ν΄μΌ νλ€.
κ°μ₯ λ¨μν λ°©λ²μ 컀λ₯μ μ νλΌλ―Έν°λ‘ μ λ¬νλ λ°©λ²
κ³Όκ±° μλ²μμμ νΈλμ μ μ μ©μ μλΉμ€ κ³μΈ΅μ΄ λ§€μ° μ§μ λΆν΄μ§κ³ μκ°λ³΄λ€ λ§€μ° λ³΅μ‘ν μ½λλ₯Ό μꡬ..
κΈ°μ‘΄ νΈλμμ μ λ¬Έμ μ
JDBC ꡬν κΈ°μ μ΄ μλΉμ€ κ³μΈ΅μ λμλλ λ¬Έμ
λ°μ΄ν° μ κ·Ό κ³μΈ΅μ JDBC ꡬν κΈ°μ μμΈκ° μλΉμ€ κ³μΈ΅μΌλ‘ μ ν
try, catch, finally .. μ μ¬ν μ½λμ λ°λ³΅
Transaction Problem
Spring Transaction Manager
νΈλμμ μΆμν
PlatformTransactionManager
interfaceJdbcTransactionManager
JpaTransactionManager
HibernateTransactionManager
EtcTransactionManager
리μμ€ λκΈ°ν
νΈλμμ μ μ μ§νκΈ° μν΄ νΈλμμ μ μμλΆν° λκΉμ§ κ°μ λ°μ΄ν°λ² μ΄μ€ 컀λ₯μ μ μ μ§ν΄μΌ νλ€.
κ³Όκ±°μλ νλΌλ―Έν°λ‘ 컀λ₯μ μ μ λ¬νμ§λ§
μ€νλ§μ
org.springframework.transaction.support.TransactionSynchronizationManager
λ₯Ό ν΅ν΄ThreadLocal
λ‘ μ»€λ₯μ μ λκΈ°νTransactionManager
λ λ΄λΆμμTransactionSynchronizationManager
λ₯Ό μ¬μ©νκ³ ,TransactionManager
λ₯Ό ν΅ν΄ 컀λ₯μ μ νλThreadLocal
μ μ¬μ©ν΄μ λ©ν°μ°λ λ μν©μ μμ νκ² μ»€λ₯μ μ λκΈ°νκ° κ°λ₯
.
λμ λ°©μ
1.TransactionManagerλ dataSourceλ₯Ό ν΅ν΄ 컀λ₯μ μ λ§λ€κ³ νΈλμμ μμ
2.TransactionManagerλ νΈλμμ μ΄ μμλ 컀λ₯μ μ TransactionSynchronizationManagerμ 보κ΄
3.Repositoryλ TransactionSynchronizationManagerμ 보κ΄λ 컀λ₯μ μ κΊΌλ΄μ μ¬μ©
4.νΈλμμ μ΄ μ’ λ£λλ©΄ TransactionManagerλ TransactionSynchronizationManagerμ 보κ΄λ 컀λ₯μ μ ν΅ν΄ νΈλμμ μ μ’ λ£νκ³ , 컀λ₯μ λ λ«μ
TransactionManager
νΈλμμ λκΈ°νλ₯Ό μ¬μ©νλ €λ©΄ DataSourceUtilsλ₯Ό μ¬μ©
DataSourceUtils.getConnection()
TransactionSynchronizationManagerκ° κ΄λ¦¬νλ 컀λ₯μ μ΄ μμΌλ©΄ ν΄λΉ 컀λ₯μ μ λ°ν
컀λ₯μ μ΄ μλ κ²½μ° μλ‘μ΄ μ»€λ₯μ μ μμ±ν΄μ λ°ν
DataSourceUtils.releaseConnection()
νΈλμμ μ μ¬μ©νκΈ° μν΄ λκΈ°νλ 컀λ₯μ μ 컀λ₯μ μ λ«μ§ μκ³ κ·Έλλ‘ μ μ§
TransactionSynchronizationManagerκ° κ΄λ¦¬νλ 컀λ₯μ μ΄ μλ κ²½μ° ν΄λΉ 컀λ₯μ μ λ«μ
commit(status), rollback(status) νΈμΆ μ μμμ release μν
Transaction Template
ν
νλ¦Ώ μ½λ°± ν¨ν΄ μ μ©μ μν΄ TransactionTemplate
ν
νλ¦Ώ ν΄λμ€ μμ±
Transactionμ λ°λ³΅λλ try, catch, finally μ½λ μ κ±°
λ¨, μλΉμ€ λ‘μ§μ νΈλμμ μ²λ¦¬ μ½λκ° ν¬ν¨λμ΄ μλ λ¨μ μ΄ μ‘΄μ¬
Transaction AOP
TransactionalProxy λμ μ ν΅ν΄ νΈλμμ μ²λ¦¬ κ°μ²΄μ λΉμ¦λμ€ λ‘μ§ μ²λ¦¬ μλΉμ€ κ°μ²΄λ₯Ό λͺ ννκ² λΆλ¦¬
@Transactional
μ νΈλμμ μ²λ¦¬κ° νμν κ³³μ μΆκ°ν΄μ£Όλ©΄, μ€νλ§μ νΈλμμ AOPκ° νΈλμμ μ΄ μ μ©λ νλ‘μλ₯Ό μμ±νκ³ μλμΌλ‘ νΈλμμ μ²λ¦¬TransactionalProxy
λ₯Ό λμ νλ©΄@Transactional
μ΄ λΆμ΄ μλ λ©μλλ ν΄λμ€μ Springμ΄ ν΄λΉ μλΉμ€ λ‘μ§μ μμλ°μμ μλμΌλ‘ νΈλμμ μ½λλ₯Ό μμ±xxxService$$EnhancerBySpringCGLIB$$..
νΈλμμ
AOP λμ νλ¦
Transactionμ΄ μ μ©λ ν΄λμ€/λ©μλ νΈμΆ
Transactionμ΄ μ μ©λ
Spring AOP Proxy νΈμΆ
Spring Containerμ λ±λ‘λ
Transaction Manager
νλνΈλμμ μμ
. transactionManager.getTransaction()transactionManagerλ λ΄λΆμμ DataSourceλ₯Ό μ¬μ©ν΄
컀λ₯μ μμ±
컀λ₯μ μ
μλ μ»€λ° λͺ¨λλ‘ λ³κ²½
ν΄μ μ€μ λ°μ΄ν°λ² μ΄μ€ νΈλμμ μμ. setAutoCommit(false)컀λ₯μ μ
TransactionSynchronizationManager
μ 보κ΄TransactionSynchronizationManagerλ
ThreadLocal
μ 컀λ₯μ μ 보κ΄ThreadLocal: λ©ν° μ°λ λ νκ²½μμλ μμ νκ² μ»€λ₯μ 보κ΄
Spring AOP Proxyμμ μ€μ λΉμ¦λμ€ λ‘μ§μ μ€ννλ©΄μ 리ν¬μ§ν 리μ
λ©μλλ€μ νΈμΆ
(컀λ₯μ μ νλΌλ―Έν°λ‘ μ λ¬ν νμκ° μμ΄μ§)리ν¬μ§ν 리λ DataSourceUtils.getConnection()μ ν΅ν΄
TransactionSynchronizationManager
μ 보κ΄λ컀λ₯μ μ κΊΌλ΄μ μ¬μ©
κ°μ 컀λ₯μ μ μ¬μ©νκ³ , νΈλμμ λ μ μ§
νλν 컀λ₯μ μ μ¬μ©ν΄μ
SQL
μ λ°μ΄ν°λ² μ΄μ€μμ λ¬ λ° μ€ν
λΉμ¦λμ€ λ‘μ§μ΄ λλκ³
νΈλμμ μ μ’ λ£
λ₯Ό μν΄TransactionSynchronizationManager
λ₯Ό ν΅νλκΈ°νλ 컀λ₯μ μ νλ
νλν 컀λ₯μ μ ν΅ν΄ 컀λ°/λ‘€λ°± ν νΈλμμ μ’ λ£
μ 체
리μμ€
(TransactionSynchronizationManager, ThreadLocal, setAutoCommit(true), con.close()..)μ 리
SpringBoot μλ 리μμ€ λ±λ‘
κΈ°μ‘΄μλ λ°μ΄ν°μμ€μ νΈλμμ 맀λμ λ₯Ό XMLλ‘ λ±λ‘νκ±°λ μ§μ μ€νλ§ λΉμΌλ‘ λ±λ‘ν΄μΌ νμ§λ§, SpringBootλ₯Ό ν΅ν΄ λ§μ λΆλΆμ΄ μλν
μλ λ±λ‘
DataSource
application.properties
μ μλ μμ±μ μ¬μ©ν΄μ DataSourceλ₯Ό μμ±νκ³ μ€νλ§ λΉμ μλμΌλ‘ λ±λ‘μ§μ DataSourceλ₯Ό λΉμΌλ‘ λ±λ‘νλ©΄ μ€νλ§ λΆνΈλ μλμΌλ‘ λ±λ‘νμ§ μμ
TransactionManager
μ€νλ§ λΆνΈλ μ μ ν νΈλμμ 맀λμ (PlatformTransactionManager)λ₯Ό μλμΌλ‘ μ€νλ§ λΉμ λ±λ‘
μλ λ±λ‘ μ€νλ§ λΉ μ΄λ¦: transactionManager
DataSourceμ λ§μ°¬κ°μ§λ‘ μ§μ TransactionManagerλ₯Ό λΉμΌλ‘ λ±λ‘νλ©΄ μ€νλ§ λΆνΈλ μλμΌλ‘ λ±λ‘νμ§ μμ
μλμΌλ‘ λ±λ‘λλ νΈλμμ 맀λμ λ νμ¬ λ±λ‘λ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ³΄κ³ νλ¨
JDBC: DataSourceTransactionManager
JPA: JpaTransactionManager
JDBC + JPA: JpaTransactionManager
SpringBootκ° application.propertiesμ μ§μ λ μμ±μ μ°Έκ³ ν΄μ λ°μ΄ν°μμ€μ νΈλμμ 맀λμ λ₯Ό μλμΌλ‘ μμ±
μμ±μλ₯Ό ν΅ν΄ SpringBootκ° λ§λ€μ΄μ€ λ°μ΄ν°μμ€ λΉμ μ£Όμ κ°λ₯
μ§μ λ±λ‘
Java Excaption
Object
: λͺ¨λ κ°μ²΄μ μ΅μμ λΆλͺ¨Throwable
: μ΅μμ μμΈμμ μμΈλ₯Ό μ‘μΌλ©΄ κ·Έ νμ μμΈ(Error..)κΉμ§ ν¨κ» μ‘μΌλ―λ‘, Throwable μμΈλ μ‘μ§ λ§κ³ , ExceptionλΆν° μ‘μ.
Error
: μ ν리μΌμ΄μ μμ 볡ꡬ λΆκ°λ₯ν μμ€ν μμΈ (λ©λͺ¨λ¦¬ λΆμ‘±μ΄λ μ¬κ°ν μμ€ν μ€λ₯)unchecked exception
Exception
: μ ν리μΌμ΄μ λ‘μ§μμ μ¬μ©ν μ μλ μ€μ§μ μΈ μ΅μμ μμΈExceptionκ³Ό κ·Έ νμ μμΈλ λͺ¨λ μ»΄νμΌλ¬κ° 체ν¬νλ checked exception
μ»΄νμΌλ¬κ° 체ν¬ν΄ μ£ΌκΈ° λλ¬Έμ μ‘κ±°λ λμ§κ±°λ νλλ₯Ό νμλ‘ μ ν
λ¨, RuntimeExceptionμ μμΈ
RuntimeException
: μ»΄νμΌλ¬κ° 체ν¬νμ§ μλ unchecked exceptionRuntimeExceptionκ³Ό κ·Έ μμ μμΈλ λͺ¨λ unchecked exception
μμΈμ κΈ°λ³Έ κ·μΉ
μμΈλ μ‘μμ μ²λ¦¬νκ±°λ λμ ΈμΌ ν¨.
μμΈλ₯Ό μ‘κ±°λ λμ§ λ μ§μ ν μμΈλΏλ§ μλλΌ μμ μμΈλ€λ ν¨κ» μ²λ¦¬
.
μμΈ μ‘κΈ°
try-catch
Repository μμΈ λ°μ -> Serviceλ‘ μμΈ throws -> Serviceμμ μμΈ μ²λ¦¬ -> μ΄ν μ μ νλ¦μΌλ‘ λμ
μμΈ λμ§κΈ°
throws Exception
Repository μμΈ λ°μ -> Serviceλ‘ μμΈ throws -> Controllerλ‘ μμΈ throws
μμΈλ₯Ό μ²λ¦¬νμ§ λͺ»νκ³ κ³μ λμ§λ©΄ main() μ°λ λμ κ²½μ° μμΈ λ‘κ·Έλ₯Ό μΆλ ₯νλ©΄μ μμ€ν μ΄ μ’ λ£λκ³ , μΉ μ ν리μΌμ΄μ μ κ²½μ° WASκ° ν΄λΉ μμΈλ₯Ό λ°μμ μ²λ¦¬νλλ°, μ£Όλ‘ μ¬μ©μμκ² μ§μ ν μ€λ₯ νμ΄μ§λ₯Ό μ λ¬
Checked Exception
μ»΄νμΌλ¬κ° μμΈλ₯Ό 체ν¬ν΄μ£Όλ©΄, μ‘μμ μ²λ¦¬νκ±°λ, λ°μΌλ‘ λμ§λλ‘ μ μΈ
μμΈλ₯Ό μ‘μμ μ²λ¦¬ν μ μμ κ²½μ°μλ μμΈλ₯Ό throwsλ‘ λμ Έμ€μΌ ν¨.
μ₯μ : μ€μλ‘ μμΈλ₯Ό λλ½νμ§ μλλ‘ μ»΄νμΌλ¬λ₯Ό ν΅ν΄ λ¬Έμ λ₯Ό μ‘μμ£Όλ μμ μ₯μΉ
λ¨μ : λͺ¨λ μ²΄ν¬ μμΈλ₯Ό λ°λμ μ‘κ±°λ λμ§λλ‘ μ²λ¦¬ν΄μΌ νλ λ²κ±°λ‘μ
ν¬κ² μ κ²½μ°κ³ μΆμ§ μμ μμΈκΉμ§ λͺ¨λ μ±κ²¨μΌ νκ³ , μμ‘΄κ΄κ³μ λ°λ₯Έ λ¨μ λ μ‘΄μ¬
νμ©
\1. κΈ°λ³Έμ μΌλ‘ Unchecked(Runtime) Exceptionλ₯Ό μ¬μ©νμ.
Checked Exceptionμ Service, Controllerμμ μ²λ¦¬ν μ μλ μμΈλ₯Ό throws μ μΈμΌλ‘ κ³μ λμ§λ€λ³΄λ©΄,
볡ꡬ λΆκ°λ₯ν μμΈ
,μμ‘΄ κ΄κ³ λ¬Έμ
λ°μ볡ꡬ λΆκ°λ₯ν μμΈ
: λ‘κ·Έλ₯Ό λ¨κΈ°κ³ ServletFilter, SpringInterceptor, Spring ControllerAdviceλ₯Ό ν΅ν΄ μΌκ΄μ±μκ² κ³΅ν΅μΌλ‘ μ²λ¦¬νμ. (μ€λ¬΄μ λλΆλΆμ μμΈλ€μ 볡ꡬ λΆκ°λ₯ν μμ€ν μμΈ)μμ‘΄ κ΄κ³ λ¬Έμ
: μ²λ¦¬ν μλ μλ SQLExceptionμ μμ‘΄νμ¬ κΈ°μ μ΄ λ³κ²½λλ©΄ μμ‘΄ μ½λλ₯Ό μ λΆ κ³ μ³μ£Όμ΄μΌ νλ λ¬Έμ λ°μ(OCP, DI μλ°). -> Exceptionμ λμ Έμ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμ κ² κ°μ§λ§, λͺ¨λ μμΈλ₯Ό λ€ λ¨μ§κΈ° λλ¬Έμ μ²΄ν¬ μμΈλ₯Ό 체ν¬ν μ μλ κΈ°λ₯μ΄ λ¬΄ν¨ν
\2. μ²΄ν¬ μμΈλ λΉμ¦λμ€ λ‘μ§μ μλμ μΌλ‘ λμ§λ μμΈλ₯Ό μ‘μμ λ°λμ μ²λ¦¬ν΄μΌ νλ κ²½μ°μλ§ μ¬μ©νμ.
κ³μ’ μ΄μ²΄ μ€ν¨ μμΈ
κ²°μ μ ν¬μΈνΈ λΆμ‘± μμΈ
λ‘κ·ΈμΈ ID, PW λΆμΌμΉ μμΈ
Unchecked Exception
μ»΄νμΌλ¬κ° 체ν¬νμ§ μλ μμΈ
μ²΄ν¬ μμΈμ μΈμ²΄ν¬ μμΈλ κΈ°λ³Έμ μΌλ‘ λμΌνμ§λ§,
Checked Exception: μμΈλ₯Ό μ‘μμ μ²λ¦¬νμ§ μμΌλ©΄ νμ throws μ μΈ νμ
Unchecked Exception: μμΈλ₯Ό μ‘μμ μ²λ¦¬νμ§ μμλ throws μλ΅ κ°λ₯
μμΈλ₯Ό μ²λ¦¬ν μ μμ λ μμΈλ₯Ό λ°μΌλ‘ λμ§λλ°, throwsλ₯Ό νμλ‘ μ μΈν΄μΌ νλκ° μλ΅ν μ μλκ°μ μ°¨μ΄κ° νΌ
μ₯μ : μ κ²½μ°κ³ μΆμ§ μμ μΈμ²΄ν¬ μμΈλ 무μνκ³ throws μ μΈ μλ΅ κ°λ₯
λ¨μ : μ»΄νμΌλ¬κ° μμΈ λλ½μ μ‘μμ£Όμ§ μμΌλ―λ‘, μ€μλ‘ μμΈλ₯Ό λλ½ν μ μμ
νμ©
CheckedExceptionμ΄ λ°μνλ©΄ RuntimeExceptionμΌλ‘ μ νν΄μ μμΈλ₯Ό λμ§μ.
μμ€ν μμ λ°μν μμΈλ λλΆλΆ 볡ꡬ λΆκ°λ₯ μμΈμ΄λ―λ‘, Runtime Exceptionμ μ¬μ©νλ©΄ μλΉμ€λ 컨νΈλ‘€λ¬κ° 볡ꡬ λΆκ°λ₯ν μμΈλ₯Ό μ κ²½μ°μ§ μμλ λκ³ κ³΅ν΅μΌλ‘ μ²λ¦¬ν μ μλ€.
ν΄λΉ κ°μ²΄κ° μ²λ¦¬ν μ μλ μμΈλ 무μνλ©΄ λλ―λ‘, μμΈλ₯Ό κ°μ λ‘ μμ‘΄νμ§ μμλ λλ€.
RuntimeExceptionμ λμΉ μ μκΈ° λλ¬Έμ λ¬Έμνκ° μ€μ
JPA EntityManager
JdbcTemplate
Stack Trace
μμΈλ₯Ό μ νν λλ λ°λμ κΈ°μ‘΄ μμΈλ₯Ό ν¬ν¨ν΄μΌ νμ
κ·Έλ μ§ μμΌλ©΄.. μ€ν νΈλ μ΄μ€λ₯Ό νμΈν λ μλ¨μμ λ°μν μμΈλ₯Ό νμΈν μ μλ μ¬κ°ν λ¬Έμ λ°μ
λ‘κ·Έλ₯Ό μΆλ ₯ν λ λ§μ§λ§ νλΌλ―Έν°μ μμΈλ₯Ό λ£μ΄μ£Όλ©΄ λ‘κ·Έμ μ€ν νΈλ μ΄μ€ μΆλ ₯ κ°λ₯
Spring Exception
μλΉμ€ κ³μΈ΅μ κ°κΈμ νΉμ ꡬν κΈ°μ μ μμ‘΄νμ§ μκ³ , μμνκ² μ μ§νλ κ²μ΄ μ’λ€.
μμΈμ λν μμ‘΄(μμΈ λμ)μ ν΄κ²°νκΈ° μν΄ λ°νμ μμΈμ μΈν°νμ΄μ€λ₯Ό μ μ©ν΄ 보μ.
μ κ·Ό μμΈ μμ±
Service Layerμμ νΉμ κΈ°μ μ μμ‘΄μ μΈ μμΈ(ex. SQLException)λ₯Ό μ‘μμ μ²λ¦¬νκ³ μΆμ κ²½μ°, RuntimeException μμΈλ₯Ό μμλ°μ 컀μ€ν μμΈλ₯Ό Repository Layerμμ λ³νν΄μ μ²λ¦¬ν μ μμ
λ¨, SQL ErrorCodeλ λ°μ΄ν°λ² μ΄μ€ λ§λ€ λ€λ₯΄λ―λ‘ λ°μ΄ν°λ² μ΄μ€μ μ’ μμ
μ€νλ§μ μμΈ μΆμν
μ€νλ§μ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ λν μΌκ΄λ μμΈ μΆμνλ₯Ό μ 곡
μ€νλ§μ΄ μ 곡νλ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ λͺ¨λ μμΈλ λ°νμ μμΈ
DataAccessException
NonTransient
ExceptionμΌμμ μ΄μ§ μμ μμΈ, κ°μ SQLμ κ·Έλλ‘ λ°λ³΅ μ€ννλ©΄ μ€ν¨
ex. SQL λ¬Έλ² μ€λ₯, λ°μ΄ν°λ² μ΄μ€ μ μ½μ‘°κ±΄ μλ°° λ±
Transient
ExceptionμΌμμ μΈ μμΈ, νμ μμΈλ λμΌν SQLμ λ€μ μλνμ λ μ±κ³΅ν κ°λ₯μ± μ‘΄μ¬
ex. 쿼리 νμμμ, λ½ κ΄λ ¨ μ€λ₯ λ±
κ° μμΈλ νΉμ κΈ°μ μ μ’ μλμ§ μκ² μ€κ³
νΉμ κΈ°μ μ μ¬μ©νλ©΄μ λ°μνλ μμΈλ₯Ό μ€νλ§μ΄ μ 곡νλ μμΈλ‘ λ³ννλ μν μν
μμΈ λ³νκΈ°λ₯Ό ν΅ν΄μ SQLExceptionμ ErrorCodeμ λ§λ μ μ ν μ€νλ§ λ°μ΄ν° μ κ·Ό μμΈλ‘ λ³ν
Service/Controller Layerμμ μμΈ μ²λ¦¬κ° νμνλ©΄ νΉμ κΈ°μ μ μ’ μμ μΈ SQLException λμ μ€νλ§μ΄ μ 곡νλ λ°μ΄ν° μ κ·Ό μμΈλ₯Ό μ¬μ©
Repository
Service
μ€νλ§μ΄ μ 곡νλ SQL μμΈ λ³νκΈ°
SQL ErrorCode
SQL ErrorCodeλ₯Ό sql-error-codes.xml νμΌμ λμ ν΄μ μ΄λ€ λ°μ΄ν° μ κ·Ό μμΈλ‘ μ νν΄μΌ ν μ§ νμ
ν νλ¦Ώ μ½λ°± ν¨ν΄
JDBCμ λ°λ³΅ λ¬Έμ λ₯Ό ν΄κ²°
JdbcTemplate
컀λ₯μ μ‘°ν, 컀λ₯μ λκΈ°ν
PeparedStatement μμ± λ° νλΌλ―Έν° λ°μΈλ©
쿼리 μ€ν
κ²°κ³Ό λ°μΈλ©
μμΈ λ°μμ μ€νλ§ μμΈ λ³νκΈ° μ€ν
리μμ€ μ’ λ£
νΈλμμ μ μν 컀λ₯μ λκΈ°ν, μ€νλ§ μμΈ λ³νκΈ°λ μλ μ€ν
Last updated