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 대 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");
}
// 게시판 CRUD 기능
public interface BoardRepository {
// 게시물 목록 조회 기능
List<Board> findAll(String sort);
// 게시물 상세 조회 기능 - 게시물 번호로 조회
Board findOne(int boardNo);
// 게시물 등록 기능
boolean save(Board board);
// 게시물 삭제 기능
boolean delete(int boardNo);
}
@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;
}
}
@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 패턴