트랜잭션 문제점

2023. 7. 1. 16:58·Spring
728x90

 

 

1.트랜잭션 문제

2.예외 누수 문제

3.JDBC 반복 문제

 

 

 

 

트랜잭션 문제

 

JDBC 구현 기술이 서비스 계층에 누수되는 문제


트랜잭션을 적용하기 위해
JDBC 구현 기술이 서비스 계층에 누수되었다.
서비스 계층은 순수해야 한다. 구현 기술을 변경해도 서비스 계층 코드는 최대한 유지할 수 있어야 한다. (변화에 대응)

그래서 데이터 접근 계층에 JDBC 코드를 다 몰아두는 것이다.
물론 데이터 접근 계층의 구현 기술이 변경될 수도 있으니 데이터 접근 계층은 인터페이스를 제공 하는 것이 좋다.

서비스 계층은 특정 기술에 종속되지 않아야 한다. 지금까지 그렇게 노력해서 데이터 접근 계층으로 JDBC 관련 코드를 모았는데, 트랜잭션을 적용하면서 결국 서비스 계층에 JDBC 구현 기술의 누수가 발생했다.

 

 

 

트랜잭션 동기화 문제


같은 트랜잭션을 유지하기 위해 커넥션을 파라미터로 넘겨야 한다
.
이때 파생되는 문제들도 있다. 똑같은 기능도 트랜잭션용 기능과 트랜잭션을 유지하지 않아도 되는 기 능으로 분리해야 한다.

 

 

트랜잭션 적용 반복 문제


트랜잭션 적용 코드를 보면 반복이 많다
. try , catch , finally ...

 

 

 

예외 누수

 

데이터 접근 계층의 JDBC 구현 기술 예외가 서비스 계층으로 전파된다.
SQLException 은 체크 예외이기 때문에 데이터 접근 계층을 호출한 서비스 계층에서 해당 예외를 잡아서

처리하거나 명시적으로 throws 를 통해서 다시 밖으로 던져야한다.
SQLException 은 JDBC 전용 기술이다. 향후 JPA나 다른 데이터 접근 기술을 사용하면, 그에 맞는 다른

예외로 변경해야 하고, 결국 서비스 코드도 수정해야 한다.

 

 

 

JDBC 반복 문제


지금까지 작성한 MemberRepository 코드는 순수한 JDBC를 사용했다.

이 코드들은 유사한 코드의 반복이 너무 많다. try , catch , finally ...

커넥션을 열고, PreparedStatement 를 사용하고, 결과를 매핑하고... 실행하고, 커넥션과 리소스를 정리한다.

 

 

 

스프링과 문제 해결

스프링은 서비스 계층을 순수하게 유지하면서, 지금까지 이야기한 문제들을 해결할 수 있는 다양한 방법과 기술들을 제공한다.
지금부터 스프링을 사용해서 해결할 수 있는 문제들을 하나씩 알아보자.

 

 

 

트랜잭션 추상화

현재 서비스 계층은 트랜잭션을 사용하기 위해서 JDBC 기술에 의존하고 있다. 향후 JDBC에서 JPA 같은 다른 데이터 접근 기술로 변경하면, 서비스 계층의 트랜잭션 관련 코드도 모두 함께 수정해야 한다.

구현 기술에 따른 트랜잭션 사용법

트랜잭션은 원자적 단위의 비즈니스 로직을 처리하기 위해 사용한다. 구현 기술마다 트랜잭션을 사용하는 방법이 다르다.

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 기술을 사용하고, JDBC 트랜잭션에 의존하다가 JPA 기술로 변경하게 되면 서비스 계층의 트랜잭션을 처리하는 코드도 모두 함께 변경해야 한다.

 

 

트랜잭션 동기화

스프링이 제공하는 트랜잭션 매니저는 크게 2가지 역할을 한다.

1.트랜잭션 추상화
2.리소스 동기화

 

 

트랜잭션 추상화

트랜잭션 기술을 추상화 하는 부분은 앞에서 설명했다.

 

 

리소스 동기화

트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 데이터베이스 커넥션을 유지해아한다. 결국 같은 커넥션을 동기화(맞추어 사용)하기 위해서 이전에는 파라미터로 커넥션을 전달하는 방법을 사용했다. 파라미터로 커넥션을 전달하는 방법은 코드가 지저분해지는 것은 물론이고, 커넥션을 넘기는 메서드와 넘기 지 않는 메서드를 중복해서 만들어야 하는 등 여러가지 단점들이 많다.

 

 

 

 

 

스프링은 트랜잭션 동기화 매니저를 제공한다.

이것은 쓰레드 로컬( ThreadLocal )을 사용해서 커넥션을 동기화해준다. 트랜잭션 매니저는 내부에서 이 트랜잭션 동기화 매니저를 사용한다.


트랜잭션 동기화 매니저는 쓰레드 로컬을 사용하기 때문에 멀티쓰레드 상황에 안전하게 커넥션을 동기화 할 수 있다. 따라서 커넥션이 필요하면 트랜잭션 동기화 매니저를 통해 커넥션을 획득하면 된다. 따라서 이전처 럼 파라미터로 커넥션을 전달하지 않아도 된다.

동작 방식을 간단하게 설명하면 다음과 같다.

 

  1. 트랜잭션을 시작하려면 커넥션이 필요하다. 트랜잭션 매니저는 데이터소스를 통해 커넥션을 만들고 트랜잭션을 시작한다.
  2. 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저에 보관한다.
  3. 리포지토리는 트랜잭션 동기화 매니저에 보관된 커넥션을 꺼내서 사용한다. 따라서 파라미터로 커넥션을 전달하지 않아도 된다.
  4. 트랜잭션이 종료되면 트랜잭션 매니저는 트랜잭션 동기화 매니저에 보관된 커넥션을 통해 트랜잭션을 종료하고 커넥션도 닫는다.

 

728x90

'Spring' 카테고리의 다른 글

JDBC & JPA  (0) 2023.07.10
DAO, DTO, VO  (0) 2023.07.02
트랜잭션  (0) 2023.06.29
커넥션 풀  (0) 2023.06.29
SQL Mapper와 ORM 기술  (0) 2023.06.28
'Spring' 카테고리의 다른 글
  • JDBC & JPA
  • DAO, DTO, VO
  • 트랜잭션
  • 커넥션 풀
minseououo
minseououo
    250x250
  • minseououo
    StudyRepository
    minseououo
  • 전체
    오늘
    어제
    • 분류 전체보기 (99)
      • 인버터 (5)
      • 자동차 (25)
      • 모터 (5)
      • 검증 (2)
      • Spring (46)
      • 프로젝트 (1)
      • 인공지능 (2)
      • 운영체제 (5)
      • Algorithm (2)
      • 소프트웨어공학 (5)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    인버터
    ASW
    ISO26262
    AUTOSAR
    dq변환
    코깅 토크
    park변환
    자바
    EILS
    ASPICE
    자율주행
    Spring
    자동차 신차 개발 프로세스
    자동차 통신
    PI제어
    SDV
    모터제어
    백앤드
    hils 검증
    bsw
    약계자제어
    토크 리플
    clarke변환
    java
    MILS
    스프링
    자동차
    자동차 네트워크
    mtpa
    전류 제한원
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
minseououo
트랜잭션 문제점
상단으로

티스토리툴바