1. DB 설계
create table tbl_board (
    board_no INT(8) PRIMARY KEY AUTO_INCREMENT,
    title VARCHAR(200) NOT NULL,
    content TEXT,
    writer VARCHAR(100) NOT NULL,
    view_count INT(8) DEFAULT 0,
    reg_date_time DATETIME DEFAULT CURRENT_TIMESTAMP()
    );
    
    select * FROM tbl_board;
  1. Board 게시물에 담은 데이터들 생성 클래스
// 역할 : 데이터베이스 테이블이랑 1 대 1 매칭되는 얘 - DB에 만들어줘야 함
@Setter @Getter @ToString
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
public class Board {

    private int boardNo;  // 게시글 번호
    private String title;  // 글제목
    private String content; // 글내용
    private String writer; // 작성자명
    private int viewCount;  // 조회수
    private Timestamp regDateTime;  // 작성일시

    // DTO 생성자
    public Board (BoardPostDTO dto) {
        this.title = dto.getTitle();
        this.content = dto.getContent();
        this.writer = dto.getWriter();
    }

    // 게시물 리스트 보여줄 Board 생성자로 담아서 처리
    public Board(ResultSet rs) throws SQLException {
        this.boardNo = rs.getInt("board_no");
        this.title = rs.getString("title");
        this.content = rs.getString("content");
        this.writer = rs.getString("writer");
        this.viewCount = rs.getInt("view_count");
        this.regDateTime = rs.getTimestamp("reg_date_time");

    }
  1. Repository - CRUD
// 게시판 CRUD 기능
public interface BoardRepository {

    // 게시물 목록 조회 기능
    List<Board> findAll(String sort);
    // 게시물 상세 조회 기능 - 게시물 번호로 조회
    Board findOne(int boardNo);
    // 게시물 등록 기능
    boolean save(Board board);
    // 게시물 삭제 기능
    boolean delete(int boardNo);

}
  1. 구현 클래스 생성 Impl (BoardSpringJdbcRepository) - SQL 작성
@Repository
@RequiredArgsConstructor  //final 붙은 필드만 초기화 !
public class BoardSpringJdbcRepository implements BoardRepository {

    private final JdbcTemplate template;

    // 게시물 목록 조회 기능
    @Override
    public List<Board> findAll(String sort) {
        String sql = "SELECT * FROM tbl_board";
        return template.query(sql, (rs, n) -> new Board(rs));
    }

    // 게시물 상세 조회 기능 - 게시물 번호로 조회
    @Override
    public Board findOne(int boardNo) {
        String sql = "SELECT * FROM tbl_board WHERE board_no = ?";
        return template.queryForObject(sql, (rs, n) -> new Board(rs), boardNo);
    }

    // 게시물 등록 기능
    @Override
    public boolean save(Board board) {
        String sql = "INSERT INTO tbl_board " +
                "(title, content, writer) " +
                "VALUES (?, ?, ?)";
        return template.update(sql, board.getTitle(), board.getContent(), board.getWriter()) == 1;
    }

    // 게시물 삭제 기능
    @Override
    public boolean delete(int boardNo) {
        String sql = "DELETE FROM tbl_board WHERE board_no = ?";
        return template.update(sql, boardNo) == 1;
    }
}
  1. Controller 생성 + jsp 화면 표시
@Controller
@RequestMapping("/board")
@RequiredArgsConstructor
public class BoardController {

    private final BoardRepository repository;

    // 1. 목록 조회 요청 (/board/list : GET)
    @GetMapping("/list")
    public String list(@RequestParam(defaultValue = "num") String sort, Model model) {
        System.out.println("/board/list : GET !!");

        List<Board> boardList = repository.findAll();
        model.addAttribute("bList", boardList);

        return "board/list";
    }

    // 2. 글 쓰기 양식 화면 열기 요청 (/board/write : GET) 게시글 쓰게 폼 좀 보여주세요
    @GetMapping("/write")
    public String write() {

        return "board/write";
    }

    // 3. 게시글 등록 요청 (/board/write : POST) DB에 넣어주세요
    // -> 목록 조회 요청 리다이렉션
    @PostMapping("/write")
    public String register(BoardPostDTO dto) throws SQLException {
        Board board = new Board(dto);
        repository.save(board);

        return "redirect:/board/list";
    }
    // 4. 게시글 삭제 요청 (/board/delete : GET)
    //-> 목록 조회 요청 리다이렉션
    @GetMapping("/delete")
    public String remove(@RequestParam("boardNo")int boardNo, Model model) {
        System.out.println("/board/delete : GET !!");
        repository.delete(boardNo);

        return "redirect:/board/list";
    }

    // 5. 게시글 상세 조회 요청 (/board/detail : GET)
    @GetMapping("/detail")
    public String detail (int boardNo, Model model) {
        Board board = repository.findOne(boardNo);
        model.addAttribute("b", board);

        return "board/detail";
    }
}

entity - DB

DTO - *서버에서 조회한 데이터 중 화면에 필요한 데이터만 모아놓은 클래스*

화면에 보여줄 땐 숨길건 숨겨서 정제 처리하는 클래스 생성

Issue attack

<aside> 📌 javax.el.PropertyNotFoundException: Property [shortTitle] not found on type [com.study.springstudy.springmvc.chap04.dto.BoardListResponseDTO]

: [shortTitle] dto 로 정제된 제목 못 찾음 이슈 .jsp → 화면 표시쪽 오류 !

500 error

javax.el.PropertyNotFoundException: Property [sNum] not found on type [com.study.springstudy.springmvc.chap03.dto.ScoreListResponseDto]

: 대소문자 이슈 sNum, bNo → XX / stuNum, boardNo → 정확히 명시

</aside>

Controller-Service-Repository 패턴