s00jin 님의 블로그

9. [게시판] Spring Boot/Mysql을 사용한 CRUD 게시판 만들기 | 게시판 리스트 & 게시판 상세 페이지 구현하기 본문

프로젝트/하고 싶은거 다해보는 내 사이트

9. [게시판] Spring Boot/Mysql을 사용한 CRUD 게시판 만들기 | 게시판 리스트 & 게시판 상세 페이지 구현하기

s00jin 2025. 8. 21. 16:06

BoardController 

게시판 관련 url을 매핑하기 위한 컨트롤러를 작성해줬다.

 

package org.mySite.webBoard.controller;

import lombok.RequiredArgsConstructor;
import org.mySite.webBoard.domain.Board;
import org.mySite.webBoard.repository.BoardRepository;
import org.mySite.webBoard.service.BoardService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@RequiredArgsConstructor
@Controller
public class BoardController {

    private final BoardService boardService;

    @GetMapping("/board/list")
    public String list(Model model) {
        List<Board> boardList = this.boardService.getList();
        model.addAttribute("boardList", boardList);
        return "board_list";
    }
    
    @GetMapping(value = "/board/detail/{id}")
    public String detail(Model model, @PathVariable("id") Long id){
        Board board = this.boardService.getBoard(id);
        model.addAttribute("board", board);
        return "board_detail";
    }
}

 

 

  • PathVariable 애너테이션으로 id 받아오기 GetMapping에 있는 id랑 PathBariable의 매개변수 이름이 같아야 함
  • model 객체에 boardList라는 이름으로 boardList 저장

@RequiredArgsConstructor

  • 롬복이 제공하는 애너테이션
  • final이 붙은 속성을 포함하는 생성자를 자동으로 만들어 주는 역할

Model

  • Model 객체에 값을 담아두면 템플릿에서 그 값을 사용할 수 있음
  • 모델 객체는 따로 생성할 필요 없이 컨트롤러의 메서드에 매개변수로 지정하기만 하면 스프링 부트가 자동으로 객체 생성

BoardService 

package org.mySite.webBoard.service;

import lombok.RequiredArgsConstructor;
import org.mySite.webBoard.domain.Board;
import org.mySite.webBoard.repository.BoardRepository;
import org.springframework.stereotype.Service;
import org.mySite.DataNotFoundException;

import java.util.List;
import java.util.Optional;

@RequiredArgsConstructor
@Service
public class BoardService {

    // todo : dto 만들어서 리팩토링하기
    // todo : impl 만들어서 분리하기
    private final BoardRepository boardRepository;

    // 게시판 리스트
    public List<Board> getList() {
        return this.boardRepository.findAll();
    }

    // 게시판 상세 페이지
    public Board getBoard(Long id){
        // id로 게시판 조회
        Optional<Board> board = this.boardRepository.findById(id);
        // optional 객체이므로 if~else로 검사
        if (board.isPresent()){
            return board.get();
        } else { // 없으면 예외처리
            throw new DataNotFoundException("board not found");
        }
    }
}

 

 

findById의 결과가 null일 수도 있기에 Optional로 받아줬다.


board_list.html 

<html lang="ko" xmlns:th="http://www.thymeleaf.org">

<table>
    <thead>
        <tr>
            <th>제목</th>
            <th>작성일시</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="board : ${boardList}">
            <td>
                <a th:href="@{|/board/detail/${board.id}|}" th:text="${board.subject}"></a>
            </td>
            <td th:text="${board.createDate}"></td>
        </tr>
    </tbody>
</table>
  • 제목 누르면 상세 페이지로 들어감

board_detail.html

<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1 th:text="${board.subject}"></h1>
    <div th:text="${board.content}"></div>
</body>
</html>

DataNotFoundException.java

package org.mySite;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "entity not found")
public class DataNotFoundException extends RuntimeException {
    private static final long serialVersionUID = 1L;
    public DataNotFoundException(String message) {
        super(message);
    }
}

 

코드를 다 작성하고 실행하면, 아래와 같은 실행 화면을 볼 수 있다.

게시판 리스트 화면
게시판 상세 페이지 화면

  • 없는 id 조회 시 404에러 반환
  • 디자인은 뒤에 추가되는 블로그에서 추가