이전에 작성한 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;
}
}
- 새로운 DTO 리스트를 생성합니다. (빈 리스트)
- findAll 메서드를 통해 먼저 Board 객체 리스트를 반환 받습니다.
- for-each 문을 통해 DTO를 반복적으로 생성하고, DTO 리스트에 담습니다.
- 반복이 끝나면 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개와 필드 명만 작성하면 쉽게 사용할 수 있습니다.
최종 출력 결과

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