2 min to read
[스프링부트 시리즈12] 서비스 활용하기
질문 목록에서 질문 제목 클릭시 답변이 나오는 화면으로 넘어가게 해보자.
서비스 활용하기
서비스란 무엇인가?
전 편에서는 줄곧 QuestionController
에서 QuestionRepository
를 직접 접근해 질문 목록 데이터를 조회했다. 하지만 대부분의 규모있는 스프링부트 프로젝트에서는 컨트롤러에서 리포지토리를 직접 호출하지 않고 중간에 서비스를 두어 데이터를 처리한다.
SBB 를 서비스를 사용하도록 개선해보자.
서비스가 필요한 이유
서비스란 스프링에서 데이터 처리를 위해 작성하는 클래스이다.
- 복잡한 코드 모듈화 가능(중복코드 제거)
- 엔티티 객체를 DTO 객체로 변환 가능(컨트롤러가 엔티티 객체를 사용하지 않아 보안성 향상)
- DTO(Data Transfer Object) 클래스는 Question, Answer 를 대신해 사용되는 클래스다.
서비스 만들기
컨트롤러에서 리포지터리 대신 사용할 서비스를 만들어 보자. 먼저 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
페이지에 접속하면 리포지터리를 사용했을 때와 동일한 화면을 볼 수 있다.
앞으로 작성할 다른 컨트롤러들도 이와 같이 리포지터리를 직접 사용하지 않고 컨트롤러 → 서비스 → 리포지터리 순서로 접근하는 과정을 거쳐 데이터를 처리할 것이다.