본문 바로가기
Backend/Spring

[Spring] 서비스 계층과 트랜젝션*

by 희디 2023. 8. 29.

서비스와 트랜젝션의 개념 

 

서비스(service)

: 컨트롤러와 리파지터리 사이에 위치하는 계층으로, 서버의 핵심 기능(비즈니스 로직)을 처리하는 순서를 총괄

책에 있는 그림을 그려보면서 정리를 해봤다. (손글씨가 이쁜 편이 아니라 양해부탁 드립니다..) 

주방장을 보면, 총괄하는 (컨트롤러와 리파지터리의 중간에 있는 것을 확인가능) 역할임을 알 수 있다. 

 

트랜젝션(transaction)

: 모두 성공해야 하는 일련의 과정, 쪼갤 수 없는 업무 처리의 최소 단위 

: 일반적으로 서비스 업무 처리는 트랜잭션 단위로 진행된다. 

 

롤백 (rollback) 

: 트랜젝션이 실패로 돌아갈 경우 진행 초기 단계로 돌리는 것 

 

예를 들어, 식당 예약을 보자면, 1~6단계를 모두 완료해야 예약이 된다고 하자. 하지만, 고객이 3단계까지만 완료를 한다면, 예약이 취소된다.

 

앞에서 공부한 내용의 코드를 보면, 아래와 같이 역할이 나누어짐을 볼 수 있다. 

https://daywnme.tistory.com/411

 

일반적으로 웹 서비스는 컨트롤러와 리파지터리 사이에 서비스 계층을 두어 역할을 분업한다. 

 

서비스 계층 만들기 

@Service 어노테이션을 붙이면, 해당 클래스를 서비스로 인식해 스프링부트에 서비스 객체를 생성한다. 

이제는 서비스 객체를 이용해 CRUD를 해보고자 한다.

@Slf4j
@Service  // 서비스 객체 생성
public class ArticleService {

    @Autowired
    // 라피지터리와 협업할 수 있게 추가.
    private ArticleRepository articleRepository;
}

위는 Service 객체인 ArticleService 클래스이다. 서비스는 리파지터리를 통해 DB에 접근하므로, @AutoWired로 리파지터리 객체를 주입해 협업할 수 있게 추가해준다. 

 

그리고 컨트롤러에도 서비스객체를 주입해줘서 컨트롤러가 서비스를 통해 작업할 수 있게 설정한다. 

@RestController
@Slf4j
public class ArticleApiController {
    @Autowired
    private ArticleService articleService;
}

 

GET 방식

컨트롤러

 

서비스

 이전과 똑같이 결과가 나온다.

(이때 data.sql에 있던 sql문을 h2에 삽입을 하고 실행을 해야 저거처럼 원하는 결과를 얻을 수 있다. ) 

 

Post : 생성하기

컨트롤러
서비스

 

기존에 id가 6까지 있었는데 7이 추가되었다.

post를 성공한 줄 알았는데 id와 함께 post를 해보니 기존의 데이터가 수정된 것을 확인할 수 있다.

이를 수정해야한다. 

수정한 결과, null을 반환해서 BAD_REQUEST 반환함

 

PATCH : 수정하기 

수정하는 코드는 서비스에 위임할 것임. 

컨트롤러
서비스

 

 

Delete : 삭제하기

컨트롤러
서비스

204는 NO_CONTENT의 상태 코드 반환 상태이다. 

 

한 번 더 삭제 요청을 하니 오류를 냄 

 

 

트랜잭션 맛보기 

트랜잭션은 반드시 성공해야만 하는 일련의 과정이다.

그래서 성공하지 못하면, 원래 상태로 롤백된다. (복구된다) 

 

한 번 아래의 시나리오로 롤백이 되는지 확인해보자.

 

1. 게시판에 데이터 3개 한꺼번에 생성요청하기 

2. 데이터를 DB에 저장하는 과정에서 의도적으로 오류 발생시키기

3. 어떻게 롤백되는지 확인해보기 

컨트롤러
서비스

 

 

내부 서버 에러이다. 원인을 찾아보자. 

 

먼저, 제대로 insert는 완료되었다. 그러고나서 아래와 같이 에러가 발생했다. 

DB에 데이터가 생성되고 에러가 났다. 이를 해결해야 할것이다. 생성이 안 되도록.

하지만, 예상대로 IllegalArguentException이 발생되었다. 

에러가 발생한 데이터를 생성하지 않게하기 위해서는 트랜젝션을 선언해줘야 한다. 

트랜젝션은 주로 서비스가 담당한다.

이제 어노테이션을 붙인 후 다시 post로 요청을 하고 DB를 확인해봐도 데이터가 추가가 안 됨을 확인할 수 있었다. 

즉, 롤백이 된 것이다.