전체 글
-
스프링 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..
-
스프링 DB - DB락 조회Data Base/스프링 DB 2023. 11. 24. 15:46
DB락 - 조회 일반적인 조회는 락을 사용하지 않는다. 데이터베이스마다 다르지만, 보통 데이터를 조회할 때는 락을 획득하지 않고 바로 데이터를 조회할 수 있다. 예를 들어 서 세션1이 락을 획득하고 데이터를 변경하고 있어도, 세션2에서 데이터를 조회 할 수 있다. 물론 세션2에서 조회가 아니라 데이터를 변경하려면 락이 필요하기 때문에 락이 돌아 올 때 까지 대기해야 한다. 조회와 락 데이터를 조회할 때도 락을 획득하고 싶을 때가 있다. 이럴 때는 select for update 구문을 사용하면 된다. 이렇게 하면 세션1이 조회 시점에 락을 가져가 버리기 때문에 다른 세션에서 해당 데이터를 변경할 수 없다. 물론 이경우도 커밋 명령어를 통해 트랜잭션을 끝내고 락을 반납한다. 조회 시점에 락이 필요한 경우는..
-
스프링 DB - DB락 개념 이해&실습Data Base/스프링 DB 2023. 11. 24. 14:31
DB락 - 개념 이해 세션1이 트랜잭션을 시작하고 데이터를 수정하는 동안 아직 커밋을 수행하지 않았는데, 세션2에서 동시에 같은 데이터를 수정하게 되면 여러가지 문제가 발생한다. 바로 트랜잭션의 원자성이 깨지는 것이다. 여기에 더해 세션1이 중간에 롤백을 하게 되면 세션2는 잘못된 데이터를 수정하는 문제가 발생한다. 이런 문제를 방지하려면 세션이 트랜잭션을 시작하고 데이터를 수정하는 동안에는 밋이나 롤백 전까지 다른 세션에서 해당 데이터를 수정할 수 없게 막아야한다. 기본 데이터 이력 - SQL set autocommit true; delete from member; insert into member(member_id, money) values('memberA',10000); 락0 세션1은 memberA..
-
스프링 DB - 트랜잭션 DB 예제(트랜잭션 실습)Data Base/스프링 DB 2023. 11. 24. 13:00
트랜잭션 - DB 예제(트랜잭션 실습) 1. 기본 데이터 입력 지금까지 설명한 예시를 직접 확인해보자. 먼저 H2 데이터베이스 웹 콘솔 창을 2개 열러두자. ❗주의 H2 데이터베이스 앱 콘솔 창을 2개 열때는 기존 URL을 복사하면 안된다. http://localhost:8002를 직접 입력해서 완전히 새로운 세션에서 연결하도록 하자. URL을 복사하면 같은 세션(jsessionId)에서 실행되어서 원하는 결과가 나오지 않을 수 있다. 예: http://localhost:8082 에 접근했을 때 다음과 같이 jessionid 값이 서로 달라야 한다. jsession값이 같으면 같은 세션에 접근하게 된다. 먼저 기본 데이터를 다음과 같이 맞추어 둔다. 데이터 초기화 SQL -- 데이터 초기화 set aut..