1. 페이지 구성
- Model(request)에 저장한 객체의 id~createdAt 까지 출력할 수 있도록 간단하게 구성되어 있는 페이지
<!doctype html>
<html lang="en">
<head><meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Document</title>
</head>
<body><section><div>
번호 : {{model.id}} <br>
제목 : {{model.title}} <br>
내용 : {{model.content}} <br>
작성일 : {{model.createdAt}}<br></div>
</section>
</body>
</html>
2. Controller:
/**
* 쿼리스트림(where절): /board?title=바다
* 패스변수(where절): /board/1
*/
@GetMapping("/board/{id}")
public String detail(@PathVariable("id") int id, Model model) {
// 게시글 상세 정보를 가져와서
BoardResponse.DetailDTO boardDetail = boardService.게시글상세보기(id);
// 모델에 데이터 추가
model.addAttribute("model", boardDetail);
return "detail"; // detail 페이지 반환
}
- 어노테이션:
@GetMapping("/board/{id}")
: HTTP GET 요청을 처리하며,/board/{id}
경로에 대한 요청을 처리.-
{id}
: 동적 경로 변수
- 메서드 시그니처:
public String detail(@PathVariable("id") int id, Model model)
:id
경로 변수를 받아서,Model
객체에 데이터를 추가한 후 "detail.mustache”를 호출하는 메서드.
- @PathVariable:
@PathVariable("id") int id
: URL 경로의{id}
부분을id
변수에 매핑.
- 서비스 호출:
BoardResponse.DetailDTO boardDetail = boardService.게시글상세보기(id);
:boardService
를 통해 해당id
에 대한 게시글의 상세 정보 조회.
- 모델에 데이터 추가:
model.addAttribute("model", boardDetail);
: 가져온 게시글 상세 정보를 모델에 추가하여 뷰에 전달.model
은 뷰에서 사용할 속성 이름.
- 뷰 이름 반환:
return "detail";
: "detail"이라는 이름의 뷰를 반환.- 뷰 리졸버는 이 이름을 기반으로 실제 뷰 파일을 찾아 렌더링.
3. Service
- boardRepository에서 findById 메서드를 통해 Board 객체를 반환 받은 뒤, DetailDTO로 변환하여 전달하도록 구성.
public BoardResponse.DetailDTO 게시글상세보기(int id) {
// 게시글을 id로 조회
Board board = boardRepository.findById(id);
// Board 객체를 DetailDTO로 변환하여 반환
return new BoardResponse.DetailDTO(board);
}
DetailDTO 클래스 내용
public 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();
this.createdAt = board.getCreatedAt().toString();
}
}
4. Repository
public Board findById(int id) {
Query q = em.createNativeQuery(
"SELECT * FROM board_tb WHERE id = ?",
Board.class
);
// 물음표 순서에 따라 id 값을 바인딩
q.setParameter(1, id);
return (Board) q.getSingleResult();
}
- Native Query 생성:
em.createNativeQuery(...)
:EntityManager
객체를 사용하여 네이티브 SQL 쿼리를 생성"select * from board_tb where id = ?"
:board_tb
테이블에서id
가 특정 값과 일치하는 레코드를 조회하는 쿼리Board.class
: 결과를Board
클래스에 매핑.
- 쿼리 파라미터 설정:
q.setParameter(1, id)
: 첫 번째 물음표에id
값을 바인딩.1
은 첫 번째 파라미터를 의미.
- 결과 반환:
(Board) q.getSingleResult()
: 쿼리 결과를Board
객체로 반환.getSingleResult()
메서드는 결과가 단일 행일 때 사용하며, 결과가 없거나 둘 이상일 경우 예외를 발생.
5. 서비스 상세페이지 구현 결과


Share article