개발/Java&Kotlin

[Spring] 비즈니스 로직 층의 설계와 구현

devhooney 2022. 7. 21. 03:01
728x90

비즈니스 로직 층의 역할은 도메인 모델인지, 트랜잭션 스크립트인지 관계없이 업무 처리(비즈니스 로직)를 하는 것

비즈니스 로직과 밀접한 관계가 있는 트랜잭션 처리는 잘 대응해야 함

 

5.1 트랜잭션이란?

- 트랜잭션이란 관련된 여러 처리를 하나의 큰 처리로 취급할 경우의 단위

- 트랜잭션 내의 모든 처리가 성공했을 때 트랜잭션이 확정

- 트랜잭션 내에서 하나라도 실패할 경우 트랜잭션이 시작하기 전의 상태로 롤백

 

(1) 여러 업무에 걸쳐진 트랜잭션

예) 고객이 주문한 상품을 공장에 발주하고 물건이 도착하면 고객에게 출하하기 전까지의 트랜잭션 단위

 

(2) 하나의 사례에서 사용자로부터의 여러 요청에 걸쳐서 발생하는 트랜잭션

예) 상품의 재고를 화면에 표시하고, 출하할 상품 수를 입력한 후 확정 버튼을 누르기까지의 트랜잭션 단위

 

(3) 하나의 요청 안에서 데이터 소스(DB)의 트랜잭션

예) 주문 확정의 요청을 받아서 발주 테이블과 고객 테이블, 재고 테이블을 갱신하기까지의 트랜잭션 단위

 

- 크게 3개의 트랜잭션으로 나눴지만, 이 안에서 작은 단위의 트랜잭션이 여러 개 발생

 

5.1.1 트랜잭션의 경계

- 트랜잭션의 경계는 프레젠테이션 층과 비즈니스 로직 층 사이에 위치

- 자세한 설명으로는 프레젠테이션 층에 공개된 서비스 클래스의 메소드가 트랜잭션의 시작과 종료

- 다시 말해, 컨트롤러에서 서비스 클래스의 메소드가 호출되면 트랜잭션의 시작,

서비스 클래스의 메소드를 마치고 컨트롤러로 돌아갈 때 트랜잭션의 종료

 

5.1.2 트랜잭션 처리를 구현하는 장소 문제

- 트랜잭션 처리는 데이터의 액세스 기술에 따라 달라진다.

- JDBC를 이용한다면 트랜잭션의 커밋이나 롤백은 비즈니스 로직 안에서 이루어진다.(문제점)

 

5.1.3 AOP를 이용한 트랜잭션 처리

- AOP를 사용하면 문제점을 해결 가능

https://ojt90902.tistory.com/866

- AOP로 서비스에 어드바이스를 적용함으로써 서비스 내부를 수정하지 않고 트랜잭션 처리를 구현할 수 있다.

- 스프링이 제공하는 트랜잭션 매니저와 트랜잭션 어드바이스를 이용할 수 있다.

 

5.2 트랜잭션 매니저

- 트랜잭션 매니저는 스프링이 제공하는 트랜잭션 처리를 위한 부품

 

5.1.2 트랜잭션 정의 정보

- 트랜잭션 매니저로 설정할 수 있는 트랜잭션 정의 정보

(설명할게 많아 링크 참조)

(1) 전파(propagation) 속성

https://wangmin.tistory.com/59?category=948114 

 

스프링 트랜잭션 전파 속성(Transaction Propagation in Spring)

Spring Framework의 트랜잭션 전파속성 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다. 트랜잭션 경계의 시작지점에서 트랜잭션 전파 속성을 참조해서, 해당 범위의

wangmin.tistory.com

(2) 독립성(isolation) 수준

https://gyoogle.dev/blog/computer-science/data-base/Transaction%20Isolation%20Level.html

 

트랜잭션 격리 수준(Transaction Isolation Level) | 👨🏻‍💻 Tech Interview

트랜잭션 격리 수준(Transaction Isolation Level) Isolation level 트랜잭션에서 일관성 없는 데이터를 허용하도록 하는 수준 Isolation level의 필요성 데이터베이스는 ACID 특징과 같이 트랜잭션이 독립적인 수

gyoogle.dev

(3) 타임아웃

트랜잭션이 취소되는 만료 시간을 초 단위로 설정

(4) 읽기 전용

트랜잭션 내의 처리가 읽기 전용으로 설정 -> DB나 ORM 프레임워크 쪽에서 최적화가 이뤄진다.

(5) 롤백 대상 예외

어느 예외가 던져졌을 때 롤백할 지 설정할 수 있다.

기본적으로 실행 시 예외가 던져지면 롤백이 이루어지고, 검사 예외는 던져져도 롤백되지 않으니 주의

(6) 커밋 대상 예외

어느 예외가 던져졌을 때 커밋할 지 설정할 수 있다.

기본으로 검사 예외가 던져졌을 때 커밋이 이루어진다.

 

5.2.2 트랜잭션 매니저의 구현 클래스

- 트랜잭션 매니저의 이용 방법은 데이터 액세스 기술에 의존 X

- 데이터 액세스 기술별로 제공되는 트랜잭션 매니저의 구현 클래스가 공통 인터페이스를 구현함으로써 실현된다.

 

5.3 트랜잭션 기능의 사용법

- 트랜잭션 기능의 사용법

(1) 선언적 트랜잭션

트랜잭션 처리의 대상이 되는 메소드를 Bean 정의 파일 혹은 어노테이션으로 지정하는 방법

지정할 때 트랜잭션 정의 정보도 함께 설정

나머지는 스프링이 자동으로 프록시를 생성해 트랜잭션 처리 해준다.

(2) 명시적 트랜잭션

트랜잭션 매니저의 API를 애플리케이션 프로그램에서 직접 호출해서 트랜잭션 처리를 하는 방법

애플리케이션의 소스 코드에 트랜잭션 처리를 기술하게 되므로 소스 코드가 복잡해져서 웬만하면 피하는게 좋다.

 

5.3.1 선언적 트랜잭션 설정

- Bean 정의 파일로 설정하거나 어노테이션으로 설정

- 어노테이션에 의한 선언적 트랜잭션

// 기본
@Transactional
public class PetServiceImpl {
	...(생략)...
}

// 설정값 추가
@Transactional(
	propagation=Propagation.REQUIRED,
    isolation=Isolation.READ_COMMITTED,
    timeout=10,
    readOnly=false,
    rollbackFor="BusinessException.Class"
)
public void updatePet(Pet pet) throws BusinessException {
	...(생략)...
}

- 명시적 트랜잭션은 생략

728x90