서비스 구현 (상세보기)

화낼거양's avatar
Nov 18, 2024
서비스 구현 (상세보기)
 
 
 
 

페이지 구성 :

 
<!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() 메서드는 결과가 단일 행일 때 사용하며, 결과가 없거나 둘 이상일 경우 예외를 발생시킵니다.
 
 
 
 
 
 

서비스 상세페이지 구현 결과

 
 
 
 
notion image
 
 
위의 이미지와 같이 5번 게시글을 클릭했을 때
 
 
notion image
 
해당 게시글의 정보를 잘 출력하는 것을 확인할 수 있습니다.
Share article

moohyun