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

lhs's avatar
Nov 18, 2024
[스프링 부트] 14. 상세보기 구현
 

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); } }
  • boardRepositoryfindById 메서드를 사용해 게시글 정보를 가져와 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(); } }
  • entityManagercreateNativeQuery 메서드를 사용하여 쿼리를 생성한다.
  • 쿼리문에서 값은 ?로 설정한다.
  • setParameter 메서드를 사용하여 ?에 인덱스와 값을 설정한다.
    • 인덱스는 1부터 시작한다.
  • getSingleResult() 메서드를 호출하여 결과를 Object로 받아 Board로 다운캐스팅하여 반환한다.
    • 테이블에서 하나의 행만 반환할 때 사용되며, 반환값은 Object 타입이다.

6. 출력 확인

notion image
 
Share article

LHS's Study Space