[SpringBoot] 상세 페이지 만들기(URL에서 자바 객체값 사용)

2024. 8. 31. 10:22자바 웹 개발/스프링부트

질문 목록의 제목을 클릭하면 상세 페이지가 호출되도록 제목에 링크를 추가해보기 위해 .question_list.html을 수정해보자. 

<table>
    <thead>
        <tr>
            <th>제목</th>
            <th>작성일시</th>
        </tr>
    </thead>
    <tbody>
        <tr th:each="question, index : ${questionList}">
           <td>
               <a th:href="@{|/question/detail/${question.id}|}"
              th:text="${question.subject}"></a>
           </td>
            <td th:text="${question.createDate}"></td>
        </tr>
    </tbody>
</table>

 

URL을 연결하기 위해 th:href 속성을 사용한다. URL은 반드시 @{와 } 사이에 입력해야한다. 자바의 객체 값을 더할 때에는 반드시 | |로 감싸주어야 한다. 

 

변하는 id값을 얻기 위해서 QuestionController을 다음과 같이 수정한다. 

@GetMapping(value = "/detail/{id}")
  public String detail(Model model, @PathVariable("id") Integer id){
    return "question_detail";
  }

 

@PathVariable과 @GetMapping에서 사용하는 값이 동일해야한다. 

 

id값으로 질문 데이터를 조회하기 위해 getQuestion메서드를 QuestionService에 추가해보자. 

public Question getQuestion(Integer id){
    Optional<Question> question = this.questionRepository.findById(id);
    if(question.isPresent()){
      return question.get();
    } else {
      throw new DataNotFoundException("question not found");
    }
  }

질문 데이터가 없을 경우에는 예외 클래스를 실행하도록 했다. 

 

QuestionController로 돌아가 QuestionService의 getQuestion 메서드를 호출하여 Qeustion 객체를 템플릿에 전달하도록 한다. 

  @GetMapping(value = "/detail/{id}")
  public String detail(Model model, @PathVariable("id") Integer id){
    Question question = this.questionService.getQuestion(id);
    model.addAttribute("question", question);
    return "question_detail";
  }

 

Model 객체에 question 이름으로 객체를 저장했으므로 다음과 같이 할 수 있다. 

    <h1 th:text="${question.subject}"></h1>
    <div th:text="${question.content}"></div>