서비스 구현 (2)

화낼거양's avatar
Nov 15, 2024
서비스 구현 (2)
 
 
이전에 작성한 BoardRepository 클래스의 findAll 메서드가 잘 작동하는지 테스트 클래스에서 확인하였습니다.
 
따라서 이제 받아온 모델을 이용하여 나머지 서비스 및 뷰를 구현해보겠습니다.
 
 

Service 클래스

 
 
기존의 findAll 메서드는 Board 객체의 리스트를 반환합니다.
 
위 반환값을 그대로 사용할 시 문제점 :
  • 진행 중인 예제에서는 Board 객체의 id와 title만 활용할 예정입니다.
  • 따라서 나머지 정보들은 전달하지 않아도 되는 불필요한 정보입니다.
 
따라서 단순히 Board 객체를 반환하지 않고, DTO 객체를 새로 만들어 필요한 정보만 담은 객체를 전달하도록 하겠습니다.
 
 

DTO 클래스 내용:

public class BoardResponse { @Data public static class DTO { private int id; private String title; public DTO(Board board) { this.id = board.getId(); this.title = board.getTitle(); } } }
생성할 때 Board 객체를 받아 id와 title 값을 초기화 할 수 있도록 구성되어있습니다.
 
 
 

위 DTO 클래스를 토대로 작성한 Service 객체 내용:

@RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; public List<BoardResponse.DTO> 게시글목록보기() { List<BoardResponse.DTO> dtos = new ArrayList<>(); List<Board> boardList = boardRepository.findAll(); for (Board board : boardList) { BoardResponse.DTO dto = new BoardResponse.DTO(board); dtos.add(dto); } return dtos; } }
 
  1. 새로운 DTO 리스트를 생성합니다. (빈 리스트)
  1. findAll 메서드를 통해 먼저 Board 객체 리스트를 반환 받습니다.
  1. for-each 문을 통해 DTO를 반복적으로 생성하고, DTO 리스트에 담습니다.
  1. 반복이 끝나면 DTO 리스트를 반환합니다.
 
 
 
 

Controller

 
@RequiredArgsConstructor// final이 붙어있는 변수의 생성자를 만들어준다 @Controller public class BoardController { private final BoardService boardService; // 컨트롤러는 view resolver 클래스를 가지고 있고, return 문자열과 동일한 파일을 찾아서 실행한다. @GetMapping("/") public String list(Model model) { // DS(request 객체를 model이라는 객체로 랩핑해서 전달해준다. List<BoardResponse.DTO> boardList = boardService.게시글목록보기(); model.addAttribute("models", boardList); return "list"; } }
 
"컨트롤러는 전달받은 DTO 리스트를 model에 담고 Dispatcher-Servlet에 “list” 문자열을 전달합니다.
Dispatcher-Servlet은 "list" 이름을 가진 뷰를 찾아 렌더링합니다. 이 뷰는 주로 HTML 파일로 변환되어 클라이언트에 응답됩니다."
 
  • Model : request 객체를 랩핑한 객체
 
 
 

수정된 list.mustache 파일 내용

<section> <table border="1"> <tr> <th>번호</th> <th>제목</th> <th></th> </tr> {{#models}} <tr> <td>{{id}}</td> <td>{{title}}</td> <td><a href="/board/{{id}}">상세보기</a></td> </tr> {{/models}} </table> </section>
 
mustache 문법에서의 반복문은 중괄호 2개와 샵(#)을 이용하여 사용할 수 있습니다.
또한 반복문 안에서 Board 객체의 특정 필드값을 이용하려고 할 때도 중괄호 2개와 필드 명만 작성하면 쉽게 사용할 수 있습니다.
 
 
 

최종 출력 결과

 
 
notion image
5개의 Board 객체의 id값과 title 값이 정상적으로 출력된 것을 확인할 수 있습니다.
Share article

moohyun