Spring/Spring DB

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 14. μŠ€ν”„λ§ μ˜ˆμ™Έ 처리

체크 μ˜ˆμ™Έμ™€ μΈν„°νŽ˜μ΄μŠ€ μ„œλΉ„μŠ€ 계측은 가급적 νŠΉμ • κ΅¬ν˜„ κΈ°μˆ μ— μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , μˆœμˆ˜ν•˜κ²Œ μœ μ§€ν•˜λŠ” 것이 μ’‹λ‹€. μ΄λ ‡κ²Œ ν•˜λ €λ©΄ μ˜ˆμ™Έμ— λŒ€ν•œ μ˜μ‘΄λ„ ν•¨κ»˜ ν•΄κ²°ν•΄μ•Όν•œλ‹€. 예λ₯Ό λ“€μ–΄μ„œ μ„œλΉ„μŠ€κ°€ μ²˜λ¦¬ν•  수 μ—†λŠ” SQLException 에 λŒ€ν•œ μ˜μ‘΄μ„ μ œκ±°ν•˜λ €λ©΄ μ–΄λ–»κ²Œ ν•΄μ•Όν• κΉŒ? μ„œλΉ„μŠ€κ°€ μ²˜λ¦¬ν•  수 μ—†μœΌλ―€λ‘œ 리포지토리가 λ˜μ§€λŠ” SQLException 체크 μ˜ˆμ™Έλ₯Ό λŸ°νƒ€μž„ μ˜ˆμ™Έλ‘œ μ „ν™˜ν•΄μ„œ μ„œλΉ„μŠ€ 계측에 λ˜μ§€μž. μ΄λ ‡κ²Œ ν•˜λ©΄ μ„œλΉ„μŠ€ 계측이 ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό λ¬΄μ‹œν•  수 있기 λ•Œλ¬Έμ—, νŠΉμ • κ΅¬ν˜„ κΈ°μˆ μ— μ˜μ‘΄ν•˜λŠ” 뢀뢄을 μ œκ±°ν•˜κ³  μ„œλΉ„μŠ€ 계측을 μˆœμˆ˜ν•˜κ²Œ μœ μ§€ν•  수 μžˆλ‹€. 체크 μ˜ˆμ™Έ μ½”λ“œμ— μΈν„°νŽ˜μ΄μŠ€ λ„μž… public class MemberRepositoryV3 implements MemberRepositoryEx { public Me..

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 13. 체크 μ˜ˆμ™Έμ™€ 언체크(λŸ°νƒ€μž„) μ˜ˆμ™Έ ν™œμš©

체크 μ˜ˆμ™Έ ν™œμš© κΈ°λ³Έ 원칙은 λ‹€μŒ 2가지λ₯Ό κΈ°μ–΅ν•˜μž. 1. 기본적으둜 언체크(λŸ°νƒ€μž„) μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•˜μž. 2. 체크 μ˜ˆμ™ΈλŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μƒ μ˜λ„μ μœΌλ‘œ λ˜μ§€λŠ” μ˜ˆμ™Έμ—λ§Œ μ‚¬μš©ν•˜μž. 이 경우 ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μž‘μ•„μ„œ λ°˜λ“œμ‹œ μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” 문제일 λ•Œλ§Œ 체크 μ˜ˆμ™Έλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄μ„œ λ‹€μŒκ³Ό 같은 κ²½μš°κ°€ μžˆλ‹€. 체크 μ˜ˆμ™Έ 예) κ³„μ’Œ 이체 μ‹€νŒ¨ μ˜ˆμ™Έ κ²°μ œμ‹œ 포인트 λΆ€μ‘± μ˜ˆμ™Έ 둜그인 ID, PW 뢈일치 μ˜ˆμ™Έ λ¬Όλ‘  이 κ²½μš°μ—λ„ 100% 체크 μ˜ˆμ™Έλ‘œ λ§Œλ“€μ–΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. λ‹€λ§Œ κ³„μ’Œ 이체 μ‹€νŒ¨μ²˜λŸΌ 맀우 μ‹¬κ°ν•œ λ¬Έμ œλŠ” κ°œλ°œμžκ°€ μ‹€μˆ˜λ‘œ μ˜ˆμ™Έλ₯Ό λ†“μΉ˜λ©΄ μ•ˆλœλ‹€κ³  νŒλ‹¨ν•  수 μžˆλ‹€. 이 경우 체크 μ˜ˆμ™Έλ‘œ λ§Œλ“€μ–΄ 두면 컴파일러λ₯Ό 톡해 λ†“μΉœ μ˜ˆμ™Έλ₯Ό 인지할 수 μžˆλ‹€. 체크 μ˜ˆμ™Έμ˜ 문제점 체크 μ˜ˆμ™ΈλŠ” μ»΄νŒŒμΌλŸ¬κ°€ μ˜ˆμ™Έ λˆ„λ½μ„ 체크해..

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 12. μ˜ˆμ™Έ(Exception)의 이해 / 체크,언체크 μ˜ˆμ™Έ

μ˜ˆμ™Έ(Exception) μžλ°”μ—μ„œ μ˜ˆμ™Έ(Exception)λŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒν•  수 μžˆλŠ” μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황 λ˜λŠ” 였λ₯˜λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ˜ˆμ™ΈλŠ” ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 도쀑 λ°œμƒν•  수 있으며, λ°œμƒ μ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. Throwable μ΅œμƒμœ„ μ˜ˆμ™Έ , μ˜ˆμ™Έ(Exception)와 μ—λŸ¬(Error)λ₯Ό λͺ¨λ‘ ν¬ν•¨ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€. μ—λŸ¬(Error) λ©”λͺ¨λ¦¬ λΆ€μ‘±μ΄λ‚˜ μ‹¬κ°ν•œ μ‹œμŠ€ν…œ 였λ₯˜μ™€ 같이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 볡ꡬ λΆˆκ°€λŠ₯ν•œ μ‹œμŠ€ν…œ μ˜ˆμ™Έμ΄λ‹€. μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμžλŠ” 이 μ˜ˆμ™Έλ₯Ό 작으렀고 ν•΄μ„œλŠ” μ•ˆλœλ‹€. μ˜ˆμ™Έ(Exception) μ˜ˆμ™ΈλŠ” 크게 두 가지 μ’…λ₯˜λ‘œ λ‚˜λ‰˜λ©°, 각각 checked μ˜ˆμ™Έμ™€ unchecked μ˜ˆμ™Έλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€. Checked μ˜ˆμ™ΈλŠ” RuntimeException 클래슀λ₯Ό μƒμ†ν•˜μ§€ μ•ŠλŠ” μ˜ˆμ™Έ..

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 11. μŠ€ν”„λ§ λΆ€νŠΈμ˜ μžλ™ λ¦¬μ†ŒμŠ€ 등둝

μŠ€ν”„λ§ λΆ€νŠΈκ°€ λ“±μž₯ν•˜κΈ° μ΄μ „μ—λŠ” λ°μ΄ν„°μ†ŒμŠ€μ™€ νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €λ₯Ό κ°œλ°œμžκ°€ 직접 μŠ€ν”„λ§ 빈으둜 λ“±λ‘ν•΄μ„œ μ‚¬μš©ν–ˆλ‹€. @Bean DataSource dataSource() { return new DriverManagerDataSource(URL, USERNAME, PASSWORD); } @Bean PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource()); } λ°μ΄ν„°μ†ŒμŠ€μ™€ νŠΈλžœμž­μ…˜ λ§€λ‹ˆμ €λ₯Ό 직접 μŠ€ν”„λ§ 빈으둜 등둝 μŠ€ν”„λ§ λΆ€νŠΈκ°€ λ‚˜μ˜€λ©΄μ„œ λ§Žμ€ 뢀뢄이 μžλ™ν™”λ˜μ—ˆλ‹€. λ°μ΄ν„°μ†ŒμŠ€(DataSource) - μžλ™ 등둝 μŠ€ν”„λ§ λΆ€νŠΈλŠ” λ°μ΄ν„°μ†ŒμŠ€( DataSource )λ₯Ό μŠ€ν”„λ§ λΉˆμ— μžλ™μœΌλ‘œ 등둝..

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 10. νŠΈλžœμž­μ…˜ AOP / @Transactional

νŠΈλžœμž­μ…˜ AOP 이해 μ§€κΈˆκΉŒμ§€ νŠΈλžœμž­μ…˜μ„ νŽΈλ¦¬ν•˜κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄μ„œ νŠΈλžœμž­μ…˜ 좔상화도 λ„μž…ν•˜κ³ , μΆ”κ°€λ‘œ 반볡적인 νŠΈλžœμž­μ…˜ λ‘œμ§μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ νŠΈλžœμž­μ…˜ ν…œν”Œλ¦Ώλ„ λ„μž…ν–ˆλ‹€. νŠΈλžœμž­μ…˜ ν…œν”Œλ¦Ώ 덕뢄에 νŠΈλžœμž­μ…˜μ„ μ²˜λ¦¬ν•˜λŠ” 반볡 μ½”λ“œλŠ” ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ μ„œλΉ„μŠ€ 계측에 μˆœμˆ˜ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직만 λ‚¨κΈ΄λ‹€λŠ” λͺ©ν‘œλŠ” 아직 λ‹¬μ„±ν•˜μ§€ λͺ»ν–ˆλ‹€. 이럴 λ•Œ μŠ€ν”„λ§ AOPλ₯Ό 톡해 ν”„λ‘μ‹œλ₯Ό λ„μž…ν•˜λ©΄ 문제λ₯Ό κΉ”λ”ν•˜κ²Œ ν•΄κ²°ν•  수 μžˆλ‹€. μ°Έκ³  ) μ§€κΈˆμ€ @Transactional 을 μ‚¬μš©ν•˜λ©΄ μŠ€ν”„λ§μ΄ AOPλ₯Ό μ‚¬μš©ν•΄μ„œ νŠΈλžœμž­μ…˜μ„ νŽΈλ¦¬ν•˜κ²Œ μ²˜λ¦¬ν•΄μ€€λ‹€ μ •λ„λ‘œ 이해해도 λœλ‹€. ν”„λ‘μ‹œλ₯Ό ν†΅ν•œ 문제 ν•΄κ²° ν”„λ‘μ‹œ λ„μž… μ „ ν”„λ‘μ‹œλ₯Ό λ„μž…ν•˜κΈ° μ „μ—λŠ” 기쑴처럼 μ„œλΉ„μŠ€μ˜ λ‘œμ§μ—μ„œ νŠΈλžœμž­μ…˜μ„ 직접 μ‹œμž‘ν•œλ‹€. μ„œλΉ„μŠ€μ— λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 νŠΈλžœμž­μ…˜ 처리 둜직이..

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 9. νŠΈλžœμž­μ…˜ ν…œν”Œλ¦Ώ

νŠΈλžœμž­μ…˜ μ‚¬μš© μ½”λ“œ //νŠΈλžœμž­μ…˜ μ‹œμž‘ 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

[μŠ€ν”„λ§ DB 1편] - 8. νŠΈλžœμž­μ…˜ 좔상화

νŠΈλžœμž­μ…˜ 좔상화 κ΅¬ν˜„ κΈ°μˆ λ§ˆλ‹€ νŠΈλžœμž­μ…˜μ„ μ‚¬μš©ν•˜λŠ” 방법이 λ‹€λ₯΄λ‹€. JDBC : con.setAutoCommit(false) JPA : transaction.begin() ν–₯ν›„ JDBCμ—μ„œ JPA 같은 λ‹€λ₯Έ 데이터 μ ‘κ·Ό 기술둜 λ³€κ²½ν•˜λ©΄, μ„œλΉ„μŠ€ κ³„μΈ΅μ˜ νŠΈλžœμž­μ…˜ κ΄€λ ¨ μ½”λ“œλ„ λͺ¨λ‘ ν•¨κ»˜ μˆ˜μ •ν•΄μ•Ό ν•œλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λ €λ©΄ νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μΆ”μƒν™”ν•˜λ©΄ λœλ‹€. νŠΈλžœμž­μ…˜ 좔상화 μΈν„°νŽ˜μ΄μŠ€ public interface TxManager { begin(); commit(); rollback(); } TxManager μΈν„°νŽ˜μ΄μŠ€λ₯Ό 기반으둜 각각의 κΈ°μˆ μ— λ§žλŠ” κ΅¬ν˜„μ²΄λ₯Ό λ§Œλ“€λ©΄ λœλ‹€. JdbcTxManager : JDBC νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” κ΅¬ν˜„μ²΄ JpaTxManager : JPA νŠΈλžœμž­μ…˜ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” κ΅¬ν˜„μ²΄ 트..

Spring/Spring DB

[μŠ€ν”„λ§ DB 1편] - 7. μŠ€ν”„λ§κ³Ό 문제 ν•΄κ²° - νŠΈλžœμž­μ…˜

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ꡬ쑰 μ‹œκ°„μ΄ ν˜λŸ¬μ„œ UI(μ›Ή)와 κ΄€λ ¨λœ 뢀뢄이 λ³€ν•˜κ³ , 데이터 μ €μž₯ κΈ°μˆ μ„ λ‹€λ₯Έ 기술둜 변경해도, λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ μ΅œλŒ€ν•œ 변경없이 μœ μ§€λ˜μ–΄μ•Ό ν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ €λ©΄ μ„œλΉ„μŠ€ 계측을 νŠΉμ • κΈ°μˆ μ— 쒅속적이지 μ•Šκ²Œ κ°œλ°œν•΄μ•Ό ν•œλ‹€. μ΄λ ‡κ²Œ 계측을 λ‚˜λˆˆ μ΄μœ λ„ μ„œλΉ„μŠ€ 계측을 μ΅œλŒ€ν•œ μˆœμˆ˜ν•˜κ²Œ μœ μ§€ν•˜κΈ° μœ„ν•œ λͺ©μ μ΄ 크닀. 예λ₯Ό λ“€μ–΄μ„œ JDBCλ₯Ό μ‚¬μš©ν•˜λ‹€κ°€ JPA 둜 변경해도 μ„œλΉ„μŠ€ 계측은 λ³€κ²½ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€. λ¬Όλ‘  μ„œλΉ„μŠ€ κ³„μΈ΅μ—μ„œ 데이터 μ ‘κ·Ό 계측을 직접 μ ‘κ·Όν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜κ³  μ„œλΉ„μŠ€ 계측은 이 μΈν„°νŽ˜μ΄μŠ€μ— μ˜μ‘΄ν•˜λŠ” 것이 μ’‹λ‹€. κ·Έλž˜μ•Ό μ„œλΉ„μŠ€ μ½”λ“œμ˜ λ³€κ²½ 없이 JdbcRepository λ₯Ό JpaRepository 둜 λ³€κ²½ν•  수 μžˆλ‹€. μ •λ¦¬ν•˜μžλ©΄ μ„œλΉ„μŠ€ 계측은 가급적 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직만 ..

hello_u
'Spring/Spring DB' μΉ΄ν…Œκ³ λ¦¬μ˜ κΈ€ λͺ©λ‘ (2 Page)