6. 게시글 상세보기 구현

Stupefyee's avatar
Dec 30, 2024
6. 게시글 상세보기 구현

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. 서비스 상세페이지 구현 결과

5번 게시글을 클릭했을 때
5번 게시글을 클릭했을 때
해당 게시글의 정보를 잘 출력하는 것을 확인
해당 게시글의 정보를 잘 출력하는 것을 확인
Share article

stupefyee