본문 바로가기
Memo/우테코 4기

[우테코] JDBC 라이브러리 구현 미션 학습 로그

by 연로그 2022. 11. 13.
반응형

포스팅을 깜빡하고 있다가 여태까지 한 미션들을 복습하며 이제야 정리하게 되었다.

 


1. 요구사항 ✨

 

자세한 미션 요구사항 및 수행 내역은 깃허브 레포지토리에 branch 별로 분류해두었습니다.

학습 목표: JdbcTemplate을 직접 구현해보자.

 

GitHub - yeon-06/jwp-dashboard-jdbc: [우아한테크코스 4기] JDBC 라이브러리 구현하기

[우아한테크코스 4기] JDBC 라이브러리 구현하기. Contribute to yeon-06/jwp-dashboard-jdbc development by creating an account on GitHub.

github.com

 


2. 학습 내역 🔮

 

💜 Local Transaction vs Global Transaction

👉 https://yeonyeon.tistory.com/279

 

[Spring] Local Transaction vs Global Transaction

✨ 트랜잭션 DB 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 한꺼번에 모두 수행되어야 할 일련의 연산들 트랜잭션은 데이터베이스, 메시지 큐 등 다양한 자원에서 다양

yeonyeon.tistory.com

 

💜 트랜잭션 특성 (ACID)

  • Atomicity: 트랜잭션에 포함된 모든 작업이 모두 성공 또는 모두 실패 (=원자성)
  • Consistency: 트랜잭션 실행 전후에 데이터의 일관성이 손상되지 않음 (=일관성)
  • Isolation: 동시에 실행하는 여러 개의 트랜잭션들은 서로 독립적 (= 독립성; 격리성)
  • Durability: 커밋이 완료된 트랜잭션은 손상되지 않는 성질 (= 지속성; 영속성)

 

💜 트랜잭션 격리 수준

  • Read Uncommitted: 커밋되지 않은 데이터도 조회 가능
  • Read Committed: 커밋된 데이터만 조회
  • Repeatable Read: 같은 트랜잭션 내에서 동일 결과를 보여줄 수 있게 보장 (하지만 phantom read현상 존재)
  • Serializable: 조회도 lock을 걸어 phantom read 해결

 

🔻 Phantom Read
다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다 안보였다 하는 현상. MySQL의 InnoDB에서는 Repeatable Read에서도 Phantom Read가 발생하지 않는다고 알려져있지만 완전히 맞는 말은 아니다. select ...for update 같은 경우에는 쓰기 잠금을 획득해야하기 때문에 Phantom Read 현상이 발생할 수 있다.

 

💜 트랜잭션 전파 속성

  • REQUIRED: 디폴트. 기존 트랜잭션이 있으면 사용하고 없으면 새로 생성
  • SUPPORTS: 기존 트랜잭션이 있으면 사용하고 없으면 트랜잭션 없이 로직 수행
  • MANDATORY: 기존 트랜잭션 있으면 사용하고 없으면 예외 발생
  • NEVER: 기존 트랜잭션이 있으면 예외 발생
  • NOT_SUPPORTED: 기존 트랜잭션이 있으면 일시 중지 후 트랜잭션 없이 로직 수행
  • REQUIRES_NEW: 기존 트랜잭션이 있으면 일시 중지 후 새 트랜잭션 생성
  • NESTED: 기존 트랜잭션이 있으면 save point를 표시해 로직에서 예외 발생 시 해당 save point로 롤백. 기존 트랜잭션이 없으면 REQUIRED와 동일하게 동작.

 

💜 트랜잭션 경계

👉 트랜잭션을 적용할 시작 지점부터 끝 지점. 특정 범위 내의 로직을 하나의 작업으로 묶어 전부 commit 또는 rollback을 적용할지 지정할 수 있다. JDBC 같은 경우에는 Connection 를 이용해 setAutoCommit(false)를 통해 트랜잭션을 시작하고 commit() 또는 rollback()을 통해 트랜잭션을 종료할 수 있다.

 

 

 


3. 실습 링크 ⭐

 

👉 우테코 핸즈온 실습: https://github.com/yeon-06/jwp-hands-on/pull/7

 

[221025] Transaction 활용하기 by yeon-06 · Pull Request #7 · yeon-06/jwp-hands-on

학습 순서 stage0 - ACID ACID가 각각 어떤 것을 의미하는지 학습하고 테스트를 통과시킨다. stage1 - 격리 레벨 격리 레벨(isolation level)을 학습하고 실제로 어떤 현상이 발생하는지 테스트로 확인해보

github.com

 

👉 토비의 스프링 실습: https://github.com/yeon-06/toby-spring/pull/7

 

[Chapter 5] 서비스 추상화 by yeon-06 · Pull Request #7 · yeon-06/toby-spring

(22.10.14) 💥해당 PR의 UserServiceTest는 잘못되었습니다.💥 👉 올바른 테스트는 Chapter 6에서 참고하시길 바랍니다. SQ3R ❓ ENUM의 사용 목적 enum에 대한 설명은 예전에 포스팅했던 글로 대체한다 👉

github.com

반응형