MVC 구조의 스프링 부트에서 서비스(Service) 클래스의 대한 고찰

유동재·2024년 4월 6일
0

Spring Boot

목록 보기
3/7
post-thumbnail

MVC 구조의 M, V, C는 각각 Model, View, Controller를 의미한다.
간단하게 Model 은 데이터 베이슬 의마한다고 볼 수 있고, View 는 프론트 엔드를, Controller는 백 엔드를 의미한다고 볼 수 있다.

스프링 부트는 이러한 MVC 구조를 가지고 있다.

그리고 스프링 구조에서 가장 주된 기능을 수행하는 클래스는 아무래도 서비스(Service) 클래스 일 것이다. 프로젝트를 진행하면서, 해당 클래스의 구조에 대한 고찰을 해보았다.

결론부터 말하자면, 모든 서비스 클래스의 최상단에 트랙잭션 읽기 전용이라는 어노테이션을 붙이고, 내부의 메서드들에는, Post 와 Delete 요청인 경우에는 일반적인 트랜잭션 어노테이션을 붙여주는 것이다. 아래의 코드가 그 예시로, 실제 프로젝트에 사용한 장바구니와 관련된 로직을 처리한 서비스 클래스이다.

@Transactional(readOnly = true)
@Service
@Slf4j
public class CartService {
	// 생성자 주입
    private final CartRepository cartRepository;
    private final MemberRepository memberRepository;
    private final GoodsRepository goodsRepository;
    private final ModelMapper modelMapper;

    public CartService(CartRepository cartRepository, MemberRepository memberRepository, GoodsRepository goodsRepository, ModelMapper modelMapper) {
        this.cartRepository = cartRepository;
        this.memberRepository = memberRepository;
        this.goodsRepository = goodsRepository;
        this.modelMapper = modelMapper;
    }
    // 이하생략 ...

위와 같이 서비스 클래스의 최상단에 @Transactional(readOnly = true) 를 붙인다.

    // 장바구니에 물품을 추가하는 메서드
	@Transactional
    public Long insertCart(CartDto cartDto) {
    // ...
    }
    
    // 장바구니에 추가되어있는 물품을 삭제하는 메서드
    @Transactional
    public void deleteCart(Long id) {
    // ...
    }
    
    // 해당 회원이 장바구니에 담은 물품들을 조회하는 메서드
    public CartDto selectCart(Long id) {
	// ...
    }

내부에서는 POST 와 DELETE 요청을 수행하는 경우에는 상단에 @Transactional 를 붙여주고, GET 요청을 수행할 때에는 상단에 아무 어노테이션도 붙이지 않는다.

해당 구조의 장점에 대해서 간단하게 설명하자면,
먼저 이 구조는 최상단에 읽기 전용 트랙잭션 어노테이션을 통하여 클래스 내의 모든 메서드에 대하여 롤백 기능을 넣어주며 "데이터 무결성 보장" 이라는 설정을 적용한다. 그리고 필요한 경우에만 일반 트랙잭션 어노테이션으로 이 설정을 덮어써서 쓰기 권한을 추가하는 구조이다.

만약 서비스 클래스에 트랜잭션 어노테이션이 존재하지 않고, 오직 try-catch 문 만으로 예외 처리를 한다면, 하나의 try문 안에 데이터 베이스, 즉 엔티티 객체에 관련된 작업이 연속적으로 이루어질 때, 중간에서 오류가 발생한다면 중간 이전의 작업은 데이터 베이스에 적용이 되나, 오류가 발생한 중간 지점 이후의 작업은 적용이 되지 않아, 데이터 무결성에 문제를 초래할 수도 있다. 그렇기 때문에 해당 구조와 같이 서비스 클래스를 설계한다면, 더욱 우수한 MVC 구조를 설계할 수 있을 것이라고 생각한다.

profile
풀 스택이 되기 위해 노력하는 개발자입니다!

0개의 댓글

관련 채용 정보