페이지 구성 :
<!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>
위와 같이 Model(request)에 저장한 객체의 id~createdAt 까지 출력할 수 있도록 간단하게 구성되어 있는 페이지 입니다.
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";
}
- 어노테이션:
@GetMapping("/board/{id}")
: HTTP GET 요청을 처리하며,/board/{id}
경로에 대한 요청을 처리합니다.{id}
는 동적 경로 변수입니다.
- 메서드 시그니처:
public String detail(@PathVariable("id") int id, Model model)
:id
경로 변수를 받아서,Model
객체에 데이터를 추가한 후 뷰 이름 "detail"을 반환하는 메서드입니다.
- @PathVariable:
@PathVariable("id") int id
: URL 경로의{id}
부분을id
변수에 매핑합니다.
- 서비스 호출:
BoardResponse.DetailDTO boardDetail = boardService.게시글상세보기(id);
:boardService
를 통해 해당id
에 대한 게시글의 상세 정보를 가져옵니다.
- 모델에 데이터 추가:
model.addAttribute("model", boardDetail);
: 가져온 게시글 상세 정보를 모델에 추가하여 뷰에 전달합니다. 여기서 "model"은 뷰에서 사용할 속성 이름입니다.
- 뷰 이름 반환:
return "detail";
: "detail"이라는 이름의 뷰를 반환합니다. 뷰 리졸버는 이 이름을 기반으로 실제 뷰 파일을 찾아 렌더링합니다.
Service :
public BoardResponse.DetailDTO 게시글상세보기(int id) {
Board board = boardRepository.findById(id);
return new BoardResponse.DetailDTO(board);
}
boardRepository에서 findById 메서드를 통해 Board 객체를 반환 받은 뒤,
DetailDTO로 변환하여 전달하도록 구성하였습니다.
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(); // TODO : 2024.11.18 형태로 변경하기
}
}
Repository :
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();
}
- 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