본문으로 바로가기

https://www.inflearn.com/course/스프링-db-1

 

스프링 DB 1편 - 데이터 접근 핵심 원리 - 인프런 | 강의

백엔드 개발에 필요한 DB 데이터 접근 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., - 강의

www.inflearn.com

 

스프링과 문제 해결 - 트랜잭션

문제점들
  • mapper vs repository
  • 서비스 계층을 특정 기술에 종속적이지 않게 개발해야 한다.
    - 컨트롤러에서 UI 변경점 해결 가능하도록, Repository 에서만 데이터 접근기술 해결하도록 진행
  • 서비스 계층은 가급적 비즈니스 로직만 구현하고 특정 구현 기술에 직접 의존해서는 안된다.
  • JDBC 구현 기술이 서비스 계층에 누수되는 문제
    - 데이터 접근 계층에 JDBC 코드에 다 몰아두는것이다.
    - 서비스 계층은 특정 기술에 종속되지 않아야 한다.
      트랜잭션을 적용하면서 결국 서비스 계층에 JDBC 구현 기술의 누수가 발생했다.
  • SQLException 이 서비스 단에 있으면 결국 DB에 종속하는 것이라 문제가 있는 것이다.
트랜잭션 추상화
  • 구현 기술마다 트랜잭션 시작이 다름
    - jdbc : setautocommit
    - jpa : transaction.begins
  • 트랜잭션 추상화 인터페이스 : begin, commit, rollback
  • JpaTxManager, JdbcTxManager 를 의존성 주입받으며 상황에 따라 변경하여 사용
  • platformTxManager 가 인터페이스 이며 이걸 구현한게 많다.
    (jpa, jdbc, 하이버네이트, 기타)
트랜잭션 동기화
  • 트랜잭션 매니저는 트랜잭션 추상화 및 리소스 동기화를 진행함
  • 리소스 동기화
    - 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유지해야 한다.
  • 스프링은 트랜잭션 동기화 매니저를 제공한다.
    - 쓰레드 로컬을 사용해서 커넥션을 동기화 해준다.
    - 트랜잭션 동기화 매니저는 트랜잭션 매니저로 부터 커넥션을 가져와 보관함
      -> TransactionSynchronizationManager
트랜잭션 문제 해결 - 트랜잭션 매니저1
  • 트랜잭션 동기화 매니저가 관리하는 커넥션이 있으면 해당 커넥션을 반환한다.
  • 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 새로운 커넥션을 생성한다.
  • DatasourceUtils를 통해 트랜잭션 종료시, 트랜잭션을 사용하기 위해 동기화된 커넥션은 커넥션을 닫지 않고 그대로 유지
트랜잭션 문제 해결 - 트랜잭션 매니저2
  • 데이터 접근 계층에서 DatasourceUtils 에서 커넥션을 가져오는데,
    이것인 트랜잭션동기화매니저를 통해 가져오는것이 된다.
    -> 즉 서비스 계층과 데이터 접근 계층은 트랜잭션동기화 매니저를 통해 커낵션을 공유하게된다. (쓰레드 로컬 기준으로 판별)
트랜잭션 문제 해결 - 트랜잭션 템플릿
  • 템플릿 콜백 패턴을 활용하여 반복문제를 해결한다.
    -> 스프링이 TransactionTemplate 이라는 편리한 기능을 제공함
트랜잭션 문제 해결 - 트랜잭션 AOP 이해
  • 프록시를 통한 문제해결
    - 프록시를 사용하면 트랜잭션을 처리하는 객체와 비즈니스 로직을 처리하는 서비스 객체를 명확하게 분리할 수 있다.
  • 스프링이 제공하는 트랜잭션 AOP
    - 스프링이 제공하는 AOP 기능을 사용하면 프록시를 매우 편리하게 적용할 수 있다.
트랜잭션 문제 해결 - 트랜잭션 AOP 적용
  • 스프링 AOP 를 사용하려면 스프링 컨테이너를 사용해야 한다.
    - 스프링이 제공하는 AOP 는 스프링에 등록된 트랜잭션 매니저를 찾아가기 때문에 컨테이너 환경을 사용해야함
트랜잭션 AOP 정리
  • 선언적 트랜잭션 관리 vs 프로그래밍 방식 트랜잭션 관리
스프링 부트의 자동 리소스 등록
  • 기존에는 데이터소스와 트랜잭션 매니저를 직접 스프링 빈으로 등록해야 함
  • 개발자가 직접 데이터소스를 빈으로 등록하면 스프링 부트는 데이터소스를 자동으로 등록하지 않음
  • application.properties 에 있는 속성을 사용해서 dataSource를 생성
    - 속성이 없으면 내장 DB를 사용하려고 한다.
  • 스프링 부트는 적절한 트랜잭션 매니저 를 자동으로 스프링 빈에 등록한다.
    - 어떤 트랜잭션 매니저를 선택할지는 현재 등록된 라이브러리를 보고 판단한다.
    - jpaTxManager가 JDBCTx도 커버 가능하긴 한다.