1. 쿼리스트링과 패스변수 : 주소로 데이터 찾기
쿼리스트링(where절) : unique하지 않은 것 예) /board?title=바다&…
패스변수(where절) : unique한 것 예) /board/1
REST API 설계 Rules 및 예시
- 소문자를 사용한다.
- 언더바(_) 대신 하이픈(-)을 사용한다.
- 마지막에 슬래시(/)를 포함하지 않는다.
- 행위를 포함하지 않는다.
- 파일 확장자는 URL에 포함시키지 않는다.
2. 상세페이지와 Controller 연결하기
BoardController
@GetMapping("/board/{id}")
public String detail(@PathVariable("id") int id, Model model) { //(@PathVariable("id")의 id 생략가능하지만 오류를 대비해 써라
BoardResponse.DetailDTO boardDetail = boardService.게시글상세보기(id);
model.addAttribute("model", boardDetail);//request객체(model)에 boardDetail담아야해
return "detail";
}
BoardService
public BoardResponse.DetailDTO 게시글상세보기(int id) {
Board board = boardRepository.findById(id);
return new BoardResponse.DetailDTO(board);
}
BoardRepository
public Board findById(int id) {
Query q = em.createNativeQuery("select * from board_tb where id = ?", Board.class);
q.setParameter(1, id); // 물음표 완성하기( 물음표 순서, 물음표에 바인딩 될 변수값)
return (Board) q.getSingleResult();
}
Board.class : 이 쿼리의 결과를 Board객체로 변환
q.setParameter(1, id); → 첫번째 “?”에 id 값을 넣겠다!!!

Object는 모든 class로 다운캐스팅 가능
BoardResponse
@Data
public static class DetailDTO{
private int id;
private String title;
private String content;
private String createdAt;
public DetailDTO(Board board) {
this.id = board.getId();
this.title = board.getTitle();
this.content = board.getContent();
String createdAt = board.getCreatedAt().toString();
this.createdAt = board.getCreatedAt().toString(); // TODO: 2025.11.18 형태로 변경하기
}
}
Share article