[스프링부트 시리즈12] 서비스 활용하기

질문 목록에서 질문 제목 클릭시 답변이 나오는 화면으로 넘어가게 해보자.

Featured image

서비스 활용하기


서비스란 무엇인가?


전 편에서는 줄곧 QuestionController에서 QuestionRepository를 직접 접근해 질문 목록 데이터를 조회했다. 하지만 대부분의 규모있는 스프링부트 프로젝트에서는 컨트롤러에서 리포지토리를 직접 호출하지 않고 중간에 서비스를 두어 데이터를 처리한다. SBB 를 서비스를 사용하도록 개선해보자.

서비스가 필요한 이유


서비스란 스프링에서 데이터 처리를 위해 작성하는 클래스이다.

서비스 만들기


컨트롤러에서 리포지터리 대신 사용할 서비스를 만들어 보자. 먼저 src/main/java 디렉터리의 com.mysite.sbb.question 패키지에 QuestionService.java 파일을 만들어 다음과 같은 내용을 작성해 보자.

[파일명:/question/QuestionService.java]

package com.mysite.sbb.question;

import java.util.List;

import org.springframework.stereotype.Service;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service
public class QuestionService {

    private final QuestionRepository questionRepository;

    public List<Question> getList() {
        return this.questionRepository.findAll();
    }
}

생성한 클래스를 서비스로 만들기 위해서는 이와 같이 클래스명 위에 @Service 애너테이션을 붙이면 된다. @Controller, @Entity 등과 마찬가지로 스프링 부트는 @Service 애너테이션이 붙은 클래스를 서비스로 인식하므로 서비스를 쉽게 생성할 수 있다.

여기서 questionRepository 객체는 @RequiredArgsConstructor에 의해 생성자 방식으로 주입된다.

이 코드에서는 질문 목록 데이터를 조회하여 리턴하는 getList 메서드를 추가했다. etList 메서드의 내용을 살펴보면 컨트롤러(QuestionController)에서 리포지터리를 사용했던 부분을 그대로 옮긴 것을 알 수 있다.

컨트롤러에서 서비스 사용하기


QuestionController.java 파일로 돌아가 QuestionController가 리포지토리 대신 서비스를 사용하도록 다음과 같이 수정해보자.

[파일명:/question/QuestionController.java]

(... 생략 ...)
public class QuestionController {

    private final QuestionService questionService;

    @GetMapping("/question/list")
    public String list(Model model) {
        List<Question> questionList = this.questionService.getList();
        model.addAttribute("questionList", questionList);
        return "question_list";
    }
}

여기서 questionService 객체도 @RequiredArgsConstructor에 의해 생성자 방식으로 주입된다.

브라우저로 http://localhost:8080/question/list 페이지에 접속하면 리포지터리를 사용했을 때와 동일한 화면을 볼 수 있다. 리스트

앞으로 작성할 다른 컨트롤러들도 이와 같이 리포지터리를 직접 사용하지 않고 컨트롤러 → 서비스 → 리포지터리 순서로 접근하는 과정을 거쳐 데이터를 처리할 것이다.