본문 바로가기
Spring/게시판 CRUD + 추가기능들

게시글 목록

by chogigang 2023. 3. 28.

 

게시판 글쓰기를 완료했다면 게시글 목록을 불러올수 있게 해줘야합니다.

 

 

순서도는 컨트롤러작성 ->서비스 작성 ->DTO 엔티티 변환 클래스 작성 ->서비스 마저 작성 -> HTML 작성 확인

 

이 정상적인 루트입니다.  가장 핵심은 컨트롤이 관련 db를 다 긁어모아서 목록을 뽑아낼 db를 view 단으로 전달해야합니

다. 그럴때 가공할 db를 보조해줄 서비스,DTO 를 손보고  작성된 (서비스+DTO) 클래스가 컨트롤에 탑제가 되어서 컨트롤이 HTML 단으로 넘기고 받은 프론트가 출력 하는것 정도 로 생각하시면 됩니다.

 

 

 

 

BoardController

package cho.boardplus.controller;

import cho.boardplus.dto.BoardDTO;
import cho.boardplus.service.BoardService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequiredArgsConstructor
@RequestMapping("/board")
@Controller
public class BoardController {

    private final BoardService boardService;


    //메인페이지
    @GetMapping("/index")
    public String index() {

        return "index";
    }

    //글 작성 페이지
    @GetMapping("/save")
    public String writeForm() {
        return "save";
    }


    // 글작성 컨트롤러
    @PostMapping("save")
    public String save(@ModelAttribute BoardDTO boardDTO) {
        System.out.println("boardDTO = " + boardDTO);
        boardService.save(boardDTO);
        return "index"; //index 로 변경

    }


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

 

  1. 데이터에서 전체 목록을 db에서부터 가져와야  하기때문에 모델 객체를 사용을 합니다. 
  2. List<BoardDTO> boardDTOList = boardService.findAll() 게시글의 모든 글을 담아와야 하기 때문에 List에 boardDTO만 담는다는 제네릭을 선언후 서비스단에서 db정보를 받아오도록 설정 했습니다. 
  3. 가져온 데이터를 모델 객체에다 담아야 하기때문에model.addAttribute("boardList",boardDTOList) 로 담아서 리턴값은 게시글 목록을 보내고 싶은곳 에 보내줍니다. html 에서는 tr th:each = "board : ${boardList}" 를 호출해야 값을 리턴받습니다.

 

이제 finAll을 서비스단에서 작성을 해줘야 합니다.

 

BoardService

package cho.boardplus.service;

import cho.boardplus.repository.BoardRepository;
import cho.boardplus.dto.BoardDTO;
import cho.boardplus.entity.BoardEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


//DTO -> Entity  (Entity Class)
//Entity -> DTO (DTO Class)

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

    //작성
    public void save(BoardDTO boardDTO) {
        BoardEntity boardEntity = BoardEntity.toSaveEntity(boardDTO); 
        boardRepository.save(boardEntity); 

    }

    public List<BoardDTO> finAll() { // 추가
       List<BoardEntity>boardEntityList= boardRepository.findAll();
       List<BoardDTO> boardDTOList = new ArrayList();
    }
}

 

finAll을 할때 레포지토리에서 무엇을 가져올때는 거의 대부분 Entity로 옵니다. 거의 무조건 Entity로 옵니다.

우리는 목록 출력이니 List 형식의 Entity가 넘어오게 되는 겁니다. 그리고 엔티티로 넘어오는 객체를 DTO로 옮겨 담아서

다시 컨트롤러쪽으로 리턴 시켜야합니다.

 

BoardDTO

package cho.boardplus.dto;

import cho.boardplus.entity.BoardEntity;
import lombok.*;

import java.time.LocalDateTime;

//DTO(Data Transfer Object) 데이터를 전송할때 쓰는 객체 , VO ,Bean         /Entity
@Getter
@Setter
@ToString//필드값 확인할때 사용
@NoArgsConstructor //기본 생성자
@AllArgsConstructor // 모든 필드를 매개변수로 하는 생성자.
public class BoardDTO {

    private Long id;
    private String boardWriter;
    private String boardTitle;
    private  String boardContents;
    private int boardHits;  //조회수
    private LocalDateTime boardCreatedTime;
    private LocalDateTime boardUpdateTime;

  

    //DTO 를 엔티티로 변환
    public static BoardDTO toBoardDTO(BoardEntity boardEntity){ //추가
        BoardDTO boardDTO = new BoardDTO();
        boardDTO.setId(boardDTO.getId());
        boardDTO.setBoardWriter(boardEntity.getBardWriter());
        boardDTO.setBoardTitle(boardEntity.getBoardTitle());
        boardDTO.setBoardContents(boardEntity.getBoardContents());
        boardDTO.setBoardHits(boardEntity.getBoardHits());
        boardDTO.setBoardCreatedTime(boardEntity.getCreatedTime());
        boardDTO.setBoardUpdateTime(boardEntity.getUpdatedTime());
        return boardDTO;
        
    }
}

 

 

다시 boardservice 로 넘어가서 작업을 마저 해줍니다.

 

BoardService

package cho.boardplus.service;

import cho.boardplus.repository.BoardRepository;
import cho.boardplus.dto.BoardDTO;
import cho.boardplus.entity.BoardEntity;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;


//DTO -> Entity  (Entity Class)
//Entity -> DTO (DTO Class)

@Service
@RequiredArgsConstructor
public class BoardService {

    private final BoardRepository boardRepository;

    //작성
    public void save(BoardDTO boardDTO) {
        BoardEntity boardEntity = BoardEntity.toSaveEntity(boardDTO);
        boardRepository.save(boardEntity);

    }

    public List<BoardDTO> finAll() { // 추가
       List<BoardEntity>boardEntityList= boardRepository.findAll();
       List<BoardDTO> boardDTOList = new ArrayList();
       for (BoardEntity boardEntity:boardEntityList){
           boardDTOList.add(BoardDTO.toBoardDTO(boardEntity ));
       }
        return boardDTOList;
       
    }
}
  1. for 문 맨 아래쪽 에서 반복문으로 접근하는 Entity 객체를 DTO로 변환하고 그 변환한 객체를 BoardDTOList 에다가 담는작업동안에 모두 담을동안 for문을 돌리는 작업을 할겁니다.
  2. 작업이 끝나면 리턴 값으로 boardDTOList; 컨트롤러로 보내주는 작업을 합니다.

앞선에 컨트롤러 작업에서 미리 리스트를 가져오는 작업을 했습니다.

 

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

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>

 

  1. tr th:each = "board : ${boardList}" 컨트롤러에서 정보를 한번에 받습니다 그때 컨트롤러에서 지정한 이름은 boardList 입니다. 
  2. a 링크안쪽에는 board id 를 참고하여 해당 id 값으로 갈수있게 링크를 걸었고 그 뒤는 해당 id게시글의 이름입니다.

 

 
 

 

'Spring > 게시판 CRUD + 추가기능들' 카테고리의 다른 글

게시글 수정  (0) 2023.03.29
게시글 상세조회  (0) 2023.03.28
게시글 작성  (0) 2023.03.27
게시판 댓글 기능 추가 (ajax)  (0) 2023.02.17
mysql db id 연결  (0) 2023.02.14