Data Base/스프링 DB
-
스프링 DB - 트랜잭션 문제 해결(트랜잭션 템플릿)Data Base/스프링 DB 2023. 11. 28. 13:50
트랜잭션 문제 해결(트랜잭션 템플릿) 트랜잭션을 사용하는 로직을 살펴보녕 다음과 같은 패턴이 반복되는 것을 확인할 수 있다. 트랜잭션 사용 코드 TransactionStatus status = transactionMnager.getTransaction(new DefaultTransactionDefinition()); try{ //비지니스 로직 bizLogic(fromId,toId,money); //성공시 커밋 transactionManager.commit(status); }catch(Exception e){ //실패시 롤백 transactionManager.rollback(status); throw new IlleagalStateException(e); } 트랜잭션을 시작하고, 비지니스 로직을 실행하고,..
-
스프링 DB - 트랜잭션 문제 해결(트랜잭션 매니저2)Data Base/스프링 DB 2023. 11. 28. 11:49
트랜잭션 문제 해결 - 트랜잭션 매니저2 트랜잭션 매니저1 - 트랜잭션 시작 클라이언트의 요청으로 서비스 로직을 실행한다. 1.서비스 계층에서 `transactionManager.getTransaction( )`을 호출해서 트랜잭션을 시작한다. 2.트랜잭션을 시작하려면 먼저 데이터베이스 커넥션이 필요하다. 트랜잭션 매니저는 내부에서 데이터 소스를 사용해서커넥션을 생성한다. 3.커넥션을 수동 커밋모드로 변경해서 실제 데이터베이스 트랜잭션을 시작한다. 4.커넥션을 트랜잭션 동기화 매니저에 보관한다. 5.트랜잭션 동기화 매니저는 쓰레드 로컬에 커넥션을 보관한다. 따라 멀티 쓰레드 환경에서 안정하게 커넥션을 보관할 수 있다. 트랜잭션 매니저2 - 로직 실행 6.서비스는 비지니스 로직을 실행하서 리포지토리의 메서..
-
스프링 DB - 트랜잭션 문제 해결(트랜잭션 매니저1)Data Base/스프링 DB 2023. 11. 28. 10:58
트랜잭션 문제 해결(트랜잭션 매니저1) MemberRepositoryV3 package hello.jdbc.repository; import hello.jdbc.domain.Member; import lombok.extern.slf4j.Slf4j; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.JdbcUtils; import javax.sql.DataSource; import java.sql.*; import java.util.NoSuchElementException; /** * 트랜잭션 - 트랜잭션 매니저 * DataSourceUtils.getConnection() * D..
-
스프링 DB - 트랜잭션 동기화Data Base/스프링 DB 2023. 11. 27. 15:01
트랜잭션 동기화 스프링이 제공하는 트랜잭션 매니저는 크게 2가지 역할을 한다. 트랜잭션 추상화 리소스 동기화 리소스 동기화 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유지해야한다. 결국 같은 커넥션을 동기화(맞추어 사용)하기 위해서 이전 게시글에서 파라미터로 커넥션을 전달하는 방법을 사용했다. 파라미터로 커넥션을 전달하는 방법은 코드가 지저분해지는 것은 물론이고, 커넥션을 넘기는 메서드와 넘기지 않는 메서드를 중복해서 만들어야 하는 등 단점들이 많다. 커넥션과 세션 트랜잭션 매니저와 트랜잭션 동기화 매니저 스프링은 *트랜잭션 동기화 매니저*를 제공한다. 이것은 쓰레드 로컬(ThreadLocal)을 사용해서 커넥션을 동기화해준다. 트랜잭션매니저는 내부넹서 이 트랜잭션 동기화..
-
스프링 DB - 트랜잭션 추상화Data Base/스프링 DB 2023. 11. 27. 14:09
트래잭션 추상화 현재 서비스 계층은 트랜잭션을 사용하기 위해서 JDBC기술에 의존하고 있다. 향후 JDBC에서 JPA같은 다른 데이터 접근 기술로 변경하면, 서비스 계층 트랜잭션 관련 코드도 모두 함께 수정해야한다. 구현 기술에 따른 트랜잭션 사용법 트랜잭션은 원자적 단위의 비지니스 로직을 처리하기 위해 사용한다. 구현 기술마다 트랜잭션을 사용하는 방법이 다른다. JDBC : `con.setAutoCommit(false)` JPA : `transaction.begin()` JDBC 트랜잭션 코드 예시 public void accountTransfer(String fromId, String toId, int money) throws SQLException { Connection con = dataSourc..
-
스프링 DB - 스프링과 문제 해결(트랜잭션)Data Base/스프링 DB 2023. 11. 27. 12:39
문제점들 어플리케이션 구조 여러가지 애플리케이션 구조가 있지만, 가장 단순하면서 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 것이다. 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청과 응답 사용자 요청을 검증 주 사용 기술 서블릿과 HTTP같은 웹기술, 스프링 MVC 서비스 계층 비지니스 로직을 담당 주 사용 기술: 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성 데이터 접근 계층 실제 데이터베이스에 접근하는 코드 주 사용 기술: JDBC, JPA, File, Redis, Mongo ... 순수한 서비스 계층 여기서 가장 중요한 곳은 어디일까? 바로 핵심 로직이 들어있는 서비스 계층이다. 시간이 흘러서 UI(웹)와 관련된 부분이 변하고, 데이터 저장 기술은 다른 기술로 변경해도..
-
스프링 DB - 트랜잭션 적용2Data Base/스프링 DB 2023. 11. 27. 11:06
트랜잭션 - 적용 이번에는 DB트랜잭션을 사용해서 앞서 발생한 문제점을 해결해보자 애플리케이션에서 트랜잭션을 어떤 계층에 걸어야 할까? 쉽게 이야기해서 트랜잭션을 어디에서 시작하고, 어디서에 커밋해야할까? 비지니스 로직과 트랜잭션 트랜잭션은 비지니스 로직이 있는 서비스 계층에서 시작해야 한다. 비지니스 로직이 잘못되면 해당 비지니스 로직으로 인해 문제가 되는 부분을 함께 롤백해야 하기 때문이다. 그런데 트랜잭션을 시작(set autocommit false)하려면 커넥션이 필요하다. 결국 서비스 계층에서 커넥션을 만들고, 트랜잭션 커밋 이후에 커넥션을 종료해야 한다. 애플리케이션에서 DB 트랜잭션을 사용하려면 *트랜잭션을 사용하는 동안 같은 커넥션을 유지*해야한다. 그래야 같은 세션을 사용할 수 있다. p..
-
스프링 DB - 트랜잭션 적용1Data Base/스프링 DB 2023. 11. 24. 17:23
트랜잭션 적용1 실제 애플리케이션에서 DB 트랜잭션을 사용해서 계좌이체 같이 원자성이 중요한 비지니스 로직을 어떻게 구현하는지 알아보자 먼저 트랜잭션 없이 단순하게 계좌이체 비지니스 로직만 구현해보자. MemberServiceV1 package hello.jdbc.service; import hello.jdbc.domain.Member; import hello.jdbc.repository.MemberRepositoryV1; import lombok.RequiredArgsConstructor; import java.sql.SQLException; @RequiredArgsConstructor public class MemberServiceV1 { private final MemberRepositoryV1 m..