Spring Boot

[게시판 만들기 (4)] 게시글 목록

서윤-정 2024. 1. 14. 01:28

 

BoardController에 findAll 메서드를 추가한다.

Get 요청이 / 경로로 즉, http://localhost:8092/board/ 로 들어오면 실행되는 메서드이다.

게시글의 목록을 조회하고 해당 정보를 'list.html' 템플릿에 전달한다. 

 

[ BoardController ]

@GetMapping("/")
public String findAll(Model model) {
    // DB에서 전체 게시글 데이터를 가져와서 list.html에 보여준다.
    List<BoardDTO> boardDTOList = boardService.findAll();
    model.addAttribute("boardList", boardDTOList);
    return "list";
}

 

model.addAttribute은 조회한 게시글 목록을 Model에 "boardList"라는 이름으로 추가한다. 

이렇게 추가된 데이터는 뷰에서 사용할 수 있다. 

 

 

 

 

 

 

 

 

 

BoardService 파일에도 findAll 메서드를 추가한다.

 

[ BoardService ]

public List<BoardDTO> findAll() {
    List<BoardEntity> boardEntityList = boardRepository.findAll();
    List<BoardDTO> boardDTOList = new ArrayList<>();
    for (BoardEntity boardEntity: boardEntityList) {
        boardDTOList.add(BoardDTO.toBoardDTO(boardEntity));
    }
    return boardDTOList;
}

 

List<BoardEntity> boardEntityList = boardRepository.findAll();

boardRepository를 통해 데이터베이스에서 모든 게시글을 조회한다.

findAll 메서드는 JpaRepository에서 제공하는 메서드로, 해당 엔티티에 대한 모든 레코드를 가져온다.

 

List<BoardDTO> boardDTOList = new ArrayList<>();

조회한 게시글을 담을 BoardDTO 객체의 리스트를 생성한다.

 

for (BoardEntity boardEntity: boardEntityList) {

조회한 게시글 엔티티들을 순회하면서 각각에 대한 BoardDTO 객체를 생성하고 리스트에 추가한다.

 

boardDTOList.add(BoardDTO.toBoardDTO(boardEntity));

BoardDTO.toBoardDTO 메서드를 사용하여 BoardEntity를 BoardDTO로 변환한 후 리스트에 추가한다. 

엔티티 객체를 화면에 표시할 DTO로 변환하는 과정이다. 

 

return boardDTOList;

최종적으로 조회한 모든 게시글에 대한 정보가 담긴 BoardDTO 리스트를 반환한다.

 

 

 

 

 

 

 

 

 

 

BoardDTO 클래스에 toBoardDTO 메서드를 추가한다.

이 메서드는 BoardEntity 엔티티를 BoardDTO 데이터 전송 객체로 변환하는 역할을 한다.

 

[ BoardDTO ]

public static BoardDTO toBoardDTO(BoardEntity boardEntity) {
    BoardDTO boardDTO = new BoardDTO();
    boardDTO.setId(boardEntity.getId());
    boardDTO.setBoardWriter(boardEntity.getBoardWriter());
    boardDTO.setBoardPass(boardEntity.getBoardPass());
    boardDTO.setBoardTitle(boardEntity.getBoardTitle());
    boardDTO.setBoardContents(boardEntity.getBoardContents());
    boardDTO.setBoardHits(boardEntity.getBoardHits());
    boardDTO.setBoardCreatedTime(boardEntity.getCreatedTime());
    boardDTO.setBoardUpdatedTime(boardEntity.getUpdatedTime());

    return boardDTO;
}

 

엔티티의 데이터가 모두 DTO로 복사되면, 최종적으로 변환된 BoardDTO 객체를 반환한다.

 

 

 

 

 

 

 

 

 

 

templates 패키지에 list.html 파일을 생성한다.

 

[ list.html ]

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>list</title>
</head>
<body>
<table>
    <tr>
        <th>id</th>
        <th>title</th>
        <th>title(||쓰지 않은 경우)</th>
        <th>writer</th>
        <th>date</th>
        <th>hits</th>
    </tr>
    <tr th:each="board: ${boardList}">
        <td th:text="${board.id}"></td>
        <td><a th:href="@{|/board/${board.id}|}" th:text="${board.boardTitle}"></a></td>
        <td><a th:href="@{/board/${board.id}}" th:text="${board.boardTitle}"></a></td>
        <td th:text="${board.boardWriter}"></td>
        <td th:text="*{#temporals.format(board.boardCreatedTime, 'yyyy-MM-dd HH:mm:ss')}"></td>
        <td th:text="${board.boardHits}"></td>
    </tr>
</table>
</body>
</html>

 

<tr th:each="board: ${boardList}">

th:each 속성은 반복문을 나타낸다.

${boardList}에 있는 각 board에 대해 반복된다.

 

<a th:href="@{|/board/${board.id}|}" th:text="${board.boardTitle}"></a>

링크의 URL은 '/board/${board.id}가 된다.

 

<a th:href="@{/board/${board.id}}" th:text="${board.boardTitle}"></a>

| | 를 사용하지 않을 경우 링크의 URL은 '/board/$%7Bboard.id%7D' 처럼 된다. 

 

 

 

 

 

 

 

 

 

 

실행해보자!!!

리스트가 잘 출력되었다.

 

 

 

아직 저 링크를 누르면 에러 페이지가 나온다.