Spring/Spring DB
μ²΄ν¬ μμΈμ μΈν°νμ΄μ€ μλΉμ€ κ³μΈ΅μ κ°κΈμ νΉμ ꡬν κΈ°μ μ μμ‘΄νμ§ μκ³ , μμνκ² μ μ§νλ κ²μ΄ μ’λ€. μ΄λ κ² νλ €λ©΄ μμΈμ λν μμ‘΄λ ν¨κ» ν΄κ²°ν΄μΌνλ€. μλ₯Ό λ€μ΄μ μλΉμ€κ° μ²λ¦¬ν μ μλ SQLException μ λν μμ‘΄μ μ κ±°νλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉ? μλΉμ€κ° μ²λ¦¬ν μ μμΌλ―λ‘ λ¦¬ν¬μ§ν λ¦¬κ° λμ§λ SQLException μ²΄ν¬ μμΈλ₯Ό λ°νμ μμΈλ‘ μ νν΄μ μλΉμ€ κ³μΈ΅μ λμ§μ. μ΄λ κ² νλ©΄ μλΉμ€ κ³μΈ΅μ΄ ν΄λΉ μμΈλ₯Ό 무μν μ μκΈ° λλ¬Έμ, νΉμ ꡬν κΈ°μ μ μμ‘΄νλ λΆλΆμ μ κ±°νκ³ μλΉμ€ κ³μΈ΅μ μμνκ² μ μ§ν μ μλ€. μ²΄ν¬ μμΈ μ½λμ μΈν°νμ΄μ€ λμ
public class MemberRepositoryV3 implements MemberRepositoryEx { public Me..
Spring/Spring DB
μ²΄ν¬ μμΈ νμ© κΈ°λ³Έ μμΉμ λ€μ 2κ°μ§λ₯Ό κΈ°μ΅νμ. 1. κΈ°λ³Έμ μΌλ‘ μΈμ²΄ν¬(λ°νμ) μμΈλ₯Ό μ¬μ©νμ. 2. μ²΄ν¬ μμΈλ λΉμ¦λμ€ λ‘μ§μ μλμ μΌλ‘ λμ§λ μμΈμλ§ μ¬μ©νμ. μ΄ κ²½μ° ν΄λΉ μμΈλ₯Ό μ‘μμ λ°λμ μ²λ¦¬ν΄μΌ νλ λ¬Έμ μΌ λλ§ μ²΄ν¬ μμΈλ₯Ό μ¬μ©ν΄μΌ νλ€. μλ₯Ό λ€μ΄μ λ€μκ³Ό κ°μ κ²½μ°κ° μλ€. μ²΄ν¬ μμΈ μ) κ³μ’ μ΄μ²΄ μ€ν¨ μμΈ κ²°μ μ ν¬μΈνΈ λΆμ‘± μμΈ λ‘κ·ΈμΈ ID, PW λΆμΌμΉ μμΈ λ¬Όλ‘ μ΄ κ²½μ°μλ 100% μ²΄ν¬ μμΈλ‘ λ§λ€μ΄μΌ νλ κ²μ μλλ€. λ€λ§ κ³μ’ μ΄μ²΄ μ€ν¨μ²λΌ λ§€μ° μ¬κ°ν λ¬Έμ λ κ°λ°μκ° μ€μλ‘ μμΈλ₯Ό λμΉλ©΄ μλλ€κ³ νλ¨ν μ μλ€. μ΄ κ²½μ° μ²΄ν¬ μμΈλ‘ λ§λ€μ΄ λλ©΄ μ»΄νμΌλ¬λ₯Ό ν΅ν΄ λμΉ μμΈλ₯Ό μΈμ§ν μ μλ€. μ²΄ν¬ μμΈμ λ¬Έμ μ μ²΄ν¬ μμΈλ μ»΄νμΌλ¬κ° μμΈ λλ½μ 체ν¬ν΄..
Spring/Spring DB
μμΈ(Exception) μλ°μμ μμΈ(Exception)λ νλ‘κ·Έλ¨ μ€ν μ€ λ°μν μ μλ μμμΉ λͺ»ν μν© λλ μ€λ₯λ₯Ό λνλ
λλ€. μ΄λ¬ν μμΈλ νλ‘κ·Έλ¨ μ€ν λμ€ λ°μν μ μμΌλ©°, λ°μ μ μμΈ μ²λ¦¬λ₯Ό ν΄μ£Όμ΄μΌ ν©λλ€. Throwable μ΅μμ μμΈ , μμΈ(Exception)μ μλ¬(Error)λ₯Ό λͺ¨λ ν¬ν¨νλ ν΄λμ€μ
λλ€. μλ¬(Error) λ©λͺ¨λ¦¬ λΆμ‘±μ΄λ μ¬κ°ν μμ€ν
μ€λ₯μ κ°μ΄ μ ν리μΌμ΄μ
μμ 볡ꡬ λΆκ°λ₯ν μμ€ν
μμΈμ΄λ€. μ ν리μΌμ΄μ
κ°λ°μλ μ΄ μμΈλ₯Ό μ‘μΌλ €κ³ ν΄μλ μλλ€. μμΈ(Exception) μμΈλ ν¬κ² λ κ°μ§ μ’
λ₯λ‘ λλλ©°, κ°κ° checked μμΈμ unchecked μμΈλ‘ ꡬλΆλ©λλ€. Checked μμΈλ RuntimeException ν΄λμ€λ₯Ό μμνμ§ μλ μμΈ..
Spring/Spring DB
μ€νλ§ λΆνΈκ° λ±μ₯νκΈ° μ΄μ μλ λ°μ΄ν°μμ€μ νΈλμμ
맀λμ λ₯Ό κ°λ°μκ° μ§μ μ€νλ§ λΉμΌλ‘ λ±λ‘ν΄μ μ¬μ©νλ€. @Bean DataSource dataSource() { return new DriverManagerDataSource(URL, USERNAME, PASSWORD); } @Bean PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } λ°μ΄ν°μμ€μ νΈλμμ
맀λμ λ₯Ό μ§μ μ€νλ§ λΉμΌλ‘ λ±λ‘ μ€νλ§ λΆνΈκ° λμ€λ©΄μ λ§μ λΆλΆμ΄ μλνλμλ€. λ°μ΄ν°μμ€(DataSource) - μλ λ±λ‘ μ€νλ§ λΆνΈλ λ°μ΄ν°μμ€( DataSource )λ₯Ό μ€νλ§ λΉμ μλμΌλ‘ λ±λ‘..
Spring/Spring DB
νΈλμμ
AOP μ΄ν΄ μ§κΈκΉμ§ νΈλμμ
μ νΈλ¦¬νκ² μ²λ¦¬νκΈ° μν΄μ νΈλμμ
μΆμνλ λμ
νκ³ , μΆκ°λ‘ λ°λ³΅μ μΈ νΈλμμ
λ‘μ§μ ν΄κ²°νκΈ° μν΄ νΈλμμ
ν
νλ¦Ώλ λμ
νλ€. νΈλμμ
ν
νλ¦Ώ λλΆμ νΈλμμ
μ μ²λ¦¬νλ λ°λ³΅ μ½λλ ν΄κ²°ν μ μμλ€. νμ§λ§ μλΉμ€ κ³μΈ΅μ μμν λΉμ¦λμ€ λ‘μ§λ§ λ¨κΈ΄λ€λ λͺ©νλ μμ§ λ¬μ±νμ§ λͺ»νλ€. μ΄λ΄ λ μ€νλ§ AOPλ₯Ό ν΅ν΄ νλ‘μλ₯Ό λμ
νλ©΄ λ¬Έμ λ₯Ό κΉλνκ² ν΄κ²°ν μ μλ€. μ°Έκ³ ) μ§κΈμ @Transactional μ μ¬μ©νλ©΄ μ€νλ§μ΄ AOPλ₯Ό μ¬μ©ν΄μ νΈλμμ
μ νΈλ¦¬νκ² μ²λ¦¬ν΄μ€λ€ μ λλ‘ μ΄ν΄ν΄λ λλ€. νλ‘μλ₯Ό ν΅ν λ¬Έμ ν΄κ²° νλ‘μ λμ
μ νλ‘μλ₯Ό λμ
νκΈ° μ μλ κΈ°μ‘΄μ²λΌ μλΉμ€μ λ‘μ§μμ νΈλμμ
μ μ§μ μμνλ€. μλΉμ€μ λΉμ¦λμ€ λ‘μ§κ³Ό νΈλμμ
μ²λ¦¬ λ‘μ§μ΄..
Spring/Spring DB
νΈλμμ
μ¬μ© μ½λ //νΈλμμ
μμ TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { //λΉμ¦λμ€ λ‘μ§ bizLogic(fromId, toId, money); transactionManager.commit(status); //μ±κ³΅μ μ»€λ° } catch (Exception e) { transactionManager.rollback(status); //μ€ν¨μ λ‘€λ°± throw new IllegalStateException(e); } νΈλμμ
μ μ¬μ©νλ λ‘μ§μ μ΄ν΄λ³΄λ©΄ λ€μκ³Ό κ°μ ν¨ν΄μ΄ λ°λ³΅λλ κ²μ νμΈν μ μλ€. μ΄λ° ννλ κ°κ°μ μλΉμ€μμ λ°λ³΅λλ€. λ¬λΌμ§λ λΆλΆμ..
Spring/Spring DB
νΈλμμ
μΆμν ꡬν κΈ°μ λ§λ€ νΈλμμ
μ μ¬μ©νλ λ°©λ²μ΄ λ€λ₯΄λ€. JDBC : con.setAutoCommit(false) JPA : transaction.begin() ν₯ν JDBCμμ JPA κ°μ λ€λ₯Έ λ°μ΄ν° μ κ·Ό κΈ°μ λ‘ λ³κ²½νλ©΄, μλΉμ€ κ³μΈ΅μ νΈλμμ
κ΄λ ¨ μ½λλ λͺ¨λ ν¨κ» μμ ν΄μΌ νλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €λ©΄ νΈλμμ
κΈ°λ₯μ μΆμννλ©΄ λλ€. νΈλμμ
μΆμν μΈν°νμ΄μ€ public interface TxManager { begin(); commit(); rollback(); } TxManager μΈν°νμ΄μ€λ₯Ό κΈ°λ°μΌλ‘ κ°κ°μ κΈ°μ μ λ§λ ꡬν체λ₯Ό λ§λ€λ©΄ λλ€. JdbcTxManager : JDBC νΈλμμ
κΈ°λ₯μ μ 곡νλ ꡬν체 JpaTxManager : JPA νΈλμμ
κΈ°λ₯μ μ 곡νλ ꡬν체 νΈ..
Spring/Spring DB
μ ν리μΌμ΄μ
ꡬ쑰 μκ°μ΄ νλ¬μ UI(μΉ)μ κ΄λ ¨λ λΆλΆμ΄ λ³νκ³ , λ°μ΄ν° μ μ₯ κΈ°μ μ λ€λ₯Έ κΈ°μ λ‘ λ³κ²½ν΄λ, λΉμ¦λμ€ λ‘μ§μ μ΅λν λ³κ²½μμ΄ μ μ§λμ΄μΌ νλ€. μ΄λ κ² νλ €λ©΄ μλΉμ€ κ³μΈ΅μ νΉμ κΈ°μ μ μ’
μμ μ΄μ§ μκ² κ°λ°ν΄μΌ νλ€. μ΄λ κ² κ³μΈ΅μ λλ μ΄μ λ μλΉμ€ κ³μΈ΅μ μ΅λν μμνκ² μ μ§νκΈ° μν λͺ©μ μ΄ ν¬λ€. μλ₯Ό λ€μ΄μ JDBCλ₯Ό μ¬μ©νλ€κ° JPA λ‘ λ³κ²½ν΄λ μλΉμ€ κ³μΈ΅μ λ³κ²½νμ§ μμλ λλ€. λ¬Όλ‘ μλΉμ€ κ³μΈ΅μμ λ°μ΄ν° μ κ·Ό κ³μΈ΅μ μ§μ μ κ·Όνλ κ²μ΄ μλλΌ, μΈν°νμ΄μ€λ₯Ό μ 곡νκ³ μλΉμ€ κ³μΈ΅μ μ΄ μΈν°νμ΄μ€μ μμ‘΄νλ κ²μ΄ μ’λ€. κ·ΈλμΌ μλΉμ€ μ½λμ λ³κ²½ μμ΄ JdbcRepository λ₯Ό JpaRepository λ‘ λ³κ²½ν μ μλ€. μ 리νμλ©΄ μλΉμ€ κ³μΈ΅μ κ°κΈμ λΉμ¦λμ€ λ‘μ§λ§ ..