트랜잭션 추상화

jooog·2022년 6월 28일
0

스프링DB

목록 보기
7/13
post-custom-banner

🔎 애플리케이션 구조

일반적인 웹 애플리케이션은 역할에 따라 위의 세가지 계층으로 나뉜다. 프레젠테이션 계층이라고 할 수 있는 Controller에서는 UI와 관련된 처리, 웹 요청 및 응답, 사용자 요청 검증을 한다. 그리고 핵심 비즈니스 로직이 들어가는 서비스 계층은 다른 기술을 사용하기 보다는 순수한 자바 코드로 작성하는 특징을 갖는다. 그리고 실제 데이터 베이스에 접근하는 코드가 들어가는 Repository 계층이 있다. Repository 계층에서는 데이터베이스에 접근하는 JDBC, JPA, Redis 같은 기술이 사용된다.

🔎 @Service / 비즈니스 로직

애플리케이션을 만들 때 가장 중요한 곳은 핵심 비즈니스 로직이 들어가는 Service 계층이다. 다른 계층에서는 코드가 변경될 수 있어도 핵심 비즈니스 로직은 가급적이면 변경없이 유지되는 것이 중요한데 이렇게 변경을 최소화 하기 위해서는 특정 기술에 종속되지 않게 개발하는 것이 중요하다.

🔎 트랜잭션 추상화

트랜잭션은 구현 기술에 따라 사용방법이 다르다. jdbc의 경우에는 'con.setAutoCommit(false)' 로 사용하고 jpa의 경우에는 'transaction.begin()'으로 사용한다.

JDBC 트랜잭션 코드 예시

public void accountTransfer(String fromId, String toId, int money) throws
SQLException {
 Connection con = dataSource.getConnection();
 try {
   con.setAutoCommit(false); //트랜잭션 시작
   //비즈니스 로직
   bizLogic(con, fromId, toId, money);
   con.commit(); //성공시 커밋
 } catch (Exception e) {
   con.rollback(); //실패시 롤백
   throw new IllegalStateException(e);
 } finally {
   release(con);
 }
}

JPA 트랜잭션 코드 예시

public static void main(String[] args) {
 //엔티티 매니저 팩토리 생성
 EntityManagerFactory emf =
   Persistence.createEntityManagerFactory("jpabook");
   
 EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
 
 EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
 
 try {
   tx.begin(); //트랜잭션 시작
   logic(em); //비즈니스 로직
   tx.commit();//트랜잭션 커밋
 } catch (Exception e) {
   tx.rollback(); //트랜잭션 롤백
 } finally {
 em.close(); //엔티티 매니저 종료
 }
 emf.close(); //엔티티 매니저 팩토리 종료
}

위의 코드에서 보는 것 처럼 데이터 접근 기술마다 트랜잭션을 사용하는 코드가 다르다. 이런경우에는 JDBC에서 JPA로 변경하면 서비스계층의 코드도 전부 변경해야한다. 이런 변경사항을 최소화 하기 위한 방법이 바로 '트랜잭션 추상화'다.

🔎 트랜잭션 추상화 인터페이스

public interface TxManager {
 begin();
 commit();
 rollback();
}

인터페이스를 만들고 각각의 기술에 맞는 구현체를 변경하는 방식을 사용하는 것이다. 만약 jdbc를 사용하면 JdbcTxManager를 사용하고 jpa를 사용한다면 JpaTxManager 구현체를 사용하는 것이다.

🔎 PlatformTransactionManager 인터페이스

스프링은 트랜잭션 인터페이스를 만들고 각각의 기술에 맞는 구현체들을 이미 다 만들어두었다. 따라서 개발자는 각 데이터 접근 기술에 맞는 트랜잭션 구현체를 편리하게 가져다 쓰면 된다.


import org.springframework.transaction.TransactionManager;

public interface PlatformTransactionManager extends TransactionManager {

    TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
            throws TransactionException;

    void commit(TransactionStatus status) throws TransactionException;
    void rollback(TransactionStatus status) throws TransactionException;
}

'getTransaction'을 하면 트랜잭션을 획득하고 트랜잭션을 시작한다. 그 다음으로는 기본적인 기능인 'commit'과 'rollback'이 있다.

이 글은 김영한님의 스프링 DB 1편 - 데이터 접근 핵심 원리 강의를 듣고 정리한 내용입니다.

post-custom-banner

0개의 댓글