inblog logo
|
LHS's Study Space
    스프링부트

    [스프링 부트] 14. 상세보기 구현

    lhs's avatar
    lhs
    Nov 18, 2024
    [스프링 부트] 14. 상세보기 구현
    Contents
    1. detail.mustache2. BoardController3. BoardResponse4. BoardService5. BoardRepository6. 출력 확인
     

    1. detail.mustache

    <!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> <nav> <ul> <li> <a href="#">홈</a> </li> <li> <a href="#">글쓰기</a> </li> </ul> </nav> <hr> <section> <div> 번호: {{model.id}}<br> 제목: {{model.title}}<br> 내용: {{model.content}}<br> 작성일: {{model.createdAt}}<br> </div> </section> </body> <script> console.log("되냐?"); </script> </html>
    • 중괄호 두 개 사이에 지정된 키값과 필드명을 사용하여 값을 가져올 수 있다.

    2. BoardController

    @RequiredArgsConstructor @Controller public class BoardController { private final BoardService boardService; @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}") : URL 경로에서 중괄호로 감싼 값을 메서드에서 @PathVariable("id") 어노테이션을 사용하여 int id 형태로 받을 수 있다.
    • boardService의 게시글상세보기 메서드를 통해 DetailDTO 객체로 정보를 받아 model에 저장하고, 이를 뷰로 전달한다.

    3. BoardResponse

    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().toLocalDateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd")); } } }
    • Board 객체를 매개변수로 받아 DetailDTO를 생성한다.
    • 작성일은 format 메서드를 사용해 2024.11.18과 같은 형식으로 변환한다.

    4. BoardService

    @RequiredArgsConstructor @Service public class BoardService { private final BoardRepository boardRepository; public BoardResponse.DetailDTO 게시글상세보기(int id) { Board board = boardRepository.findById(id); return new BoardResponse.DetailDTO(board); } }
    • boardRepository의 findById 메서드를 사용해 게시글 정보를 가져와 board에 저장한다.
    • 해당 정보를 바탕으로 DetailDTO를 생성하여 반환한다.

    5. BoardRepository

    @RequiredArgsConstructor @Repository public class BoardRepository { private final EntityManager entityManager; public Board findById(int id) { Query q = entityManager.createNativeQuery("select * from board_tb where id = ?", Board.class); q.setParameter(1, id); return (Board) q.getSingleResult(); } }
    • entityManager의 createNativeQuery 메서드를 사용하여 쿼리를 생성한다.
    • 쿼리문에서 값은 ?로 설정한다.
    • setParameter 메서드를 사용하여 ?에 인덱스와 값을 설정한다.
      • 인덱스는 1부터 시작한다.
    • getSingleResult() 메서드를 호출하여 결과를 Object로 받아 Board로 다운캐스팅하여 반환한다.
      • 테이블에서 하나의 행만 반환할 때 사용되며, 반환값은 Object 타입이다.

    6. 출력 확인

    notion image
     
    Share article
    Contents
    1. detail.mustache2. BoardController3. BoardResponse4. BoardService5. BoardRepository6. 출력 확인

    LHS's Study Space

    RSS·Powered by Inblog