제 12장: 서비스 계층과 트랜잭션

강연주·2023년 10월 15일
0

서비스와 트랜잭션 개념

서비스란, 컨트롤러와 레포지토리 사이에 위치하는 계층으로, 서버의 핵심 기능(비즈니스 로직)을 처리하는 순서를 총괄합니다.

일반적으로 서비스 업무 처리는 트랜잭션 단위로 진행됩니다. 트랜잭션이란, 모두 성공해야 하는 일련의 과정을 뜻합니다. 예를 들어, 식당 예약을 위해 시간 예약->테이블 지정->메뉴 선택->결제->영수증 발행->예약 완료의 순서로 모두 마쳐야 성공하는 일련의 과정이 트랜잭션입니다. 그리고 트랜잭션이 실패로 돌아갈 경우 진행 초기 단계로 돌리는 것을 롤백이라고 합니다.

앞에서 만든 REST 컨트롤러 코드에서는 컨트롤러가 컨트롤러의 역할(클라이언트 요청과 응답 처리)과 서비스 역할(레포지토리에 데이터를 가져오도록 명령)을 모두 합니다. 이처럼 간단한 처리 과정은 컨트롤러 혼자 수행해도 되지만, 일반적으로 웹 서비스는 복잡한 처리 과정을 컨트롤러와 레포지토리 사이 서비스 게층을 두어 역할을 분업합니다.

서비스 계층 만들기

컨트롤러는 요청과 응답, 서비스는 비즈니스 로직을 한다는 것에 주의하자!
또한, @Service라고 선언하면 스프링에서 스프링빈 객체로 생성하여 관리해준다!

GET 방식

컨트롤러

서비스

POST 방식

컨트롤러
요청과 응답은 여전히 담당!

서비스
서비스에서는 실패 시 NULL, 성공 시 Article을 반환!
추가적으로 POST 방식에 id 값이 들어오면 해당 id의 객체가 수정되므로 id가 들어온 경우도 예외 처리를 해주어야 한다!

PATCH 방식

컨트롤러

서비스

DELETE 방식

컨트롤러

서비스

트랜잭션 맛보기

다음과 같이 서비스의 transactionTest 메서드에서 3개의 게시글을 한번에 등록하고 중간에 강제 에러(id가 -1인 게시글 조회)를 내었을 때(반환은 Article), 우리는 게시글에 등록을 시도한 3개의 게시글을 적용시키고 싶지 않다. 하지만 실제로 게시글을 조회해보면 에러가 났지만 3개의 게시글은 적용된 것을 알 수 있다.

트랜잭션은 보통 서비스에서 관리한다. 서비스의 메서드에 @Transactional을 붙이면 해당 메서드는 하나의 트랜잭션으로 묶인다. 그러면 메서드가 중간에 실패하더라고 롤백을 통해 이전 상태로 돌아갈 수 있다!

profile
백엔드 개발자 준비중

0개의 댓글