이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. TransactionTemplate을 통한 코드 개선 public void accountTransfer(String fromId, String toId, int money) throws SQLException { TransactionStatus transaction = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { bizLogic(fromId, toId, money); transactionManager.commit(transaction); } catch (Exception e) { transactionManager.rollback(transaction);..
이 글은 인프런 김영한님의 강의를 수강하고 복습하며 작성한 글입니다. PlatformTransactionManager의 역할 각 DB마다 트랜잭션 접근 방법이 다르기 때문에 트랜잭션 접근의 추상화가 필요했다. 스프링은 PlatformTransactionManager를 통해 이 부분을 추상화 해준다. 여기서 PlatformTransactionManager가 하는 일은 두 가지 일이 있다. 트랜잭션 추상화 리소스 동기화 여기서 트랜잭션을 추상화 하는 방법은 앞선 게시글에서 정리가 되었다. 그렇다면 트랜잭션(리소스) 동기화는 무엇을 의미하는 것일까? 트랜잭션 동기화 트랜잭션을 유지하려면 트랜잭션의 시작 ~ 끝까지 같은 DB 커넥션을 유지해야한다. 이전의 MemberServiceV2에서는 같은 Connectio..
이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다 어플리케이션의 구조 프레젠테이션 계층 UI와 관련된 처리 담당 웹 요청을 받고 응답해줌. 사용자 요청을 검증 주 사용 기술 : 서블릿 / HTTP / Spring MVC 서비스 계층 비즈니스 로직을 담당 (계좌이체) 주 사용 기술 : 가급적 특정 기술에 의존하지 않고, 순수 자바 코드로 작성해야함. 데이터 접근 계층 실제 DB에 접근하는 코드 주 사용 기술 : JDBC, JPA, File, Redis, Mongo 여러 어플리케이션 구조가 있지만 가장 많이 사용하는 방법은 역할에 따라 3가지 계층으로 나누는 방법이다. 이 때 위와 같이 3개의 계층으로 나눈다. 어플리케이션의 구조 위에서 어플리케이션을 3개의 계층으로 나눈다고 했다. 이 3개의 계층..
이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. 비즈니스 로직 with 트랜잭션 구현 앞선 게시글에서는 "set autocommit false"를 이용해서 트랜잭션을 구현했다. 이번 포스팅에서는 실제 어플리케이션에서 어떻게 트랜잭션을 사용해 원자성이 중요한 비즈니스 로직을 구현하는지 확인해본다. 먼저 트랜잭션 없이 단순하게 계좌이체 비즈니스 로직만 구현해보자. MemberSerivce 코드 구현(비즈니스 로직) @RequiredArgsConstructor public class MemberService1 { private final MemberRepositoryV1 memberRepository; public void accountTransfer(String fromId, String toI..
이 글은 인프런 김영한님의 강의를 복습하며 작성한 글입니다. DB 조회에는 락이 필요없다. 기본적으로 SELECT 쿼리를 이용해 DB에서 데이터를 조회하는 시점에서, 세션은 DB Lock을 얻을 수 없는 상황에서도 데이터를 조회할 수 있다. 왜냐하면 데이터 조회 시에는 락이 필요없기 때문이다. 반면에 데이터를 수정할 때는 반드시 DB 락이 있는 상황에서만 가능하다. DB 조회 시 락 설정하기 데이터를 조회하는 순간에 락을 획득해야 할 때가 있다. 획득하는 순간부터 트랜잭션이 끝날 때까지 이 데이터는 다른 곳에서 건드리지 않아야할 경우, DB 조회 시 락을 설정해볼 수 있다. 왜냐하면 DB 조회 시 락을 획득하면, 데이터를 수정하는 다른 DB 세션이 락을 얻지 못하는 상황이기 때문이다. SELECT * F..