본문 바로가기

Spring

[Spring]Spring 시작해보기(8) - 상세 페이지 만들기

질문에 대한 제목, 내용을 볼 수 있는 상세페이지를 만들어보자.

해당 질문의 id값을 사용해 출력시킬 건데, URL에 맨 마지막에 id값을 넣어 출력시킬 것이다.

 

1. question_list.html 파일 수정

Question의 subject를 클릭하면 question_id를 전송하고, detail페이지로 이동할 수 있는 Link를 <a> 태그를 통해 넣어주었다.

<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="${#strings.substring(question.createDate, 2, 16)}"></td>
        </tr>
    </tbody>
</table>

여기서 th:href속성을 사용하는데 URL주소를 나타낼 때에는 꼭 @{ } 사이에 입력해야 한다.

또한, /question/detail/ 과 ${question.id}의 값이 조합되어 사용되어야 하는데 이 때 좌우에 | 문자를 추가해주어야 한다.

 

2. detail controller 생성

QuestionController 내 detail을 만들어 준다.

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

여기서 @PathVariable(”id”)는 가장 마지막에 들어가는 id값을 얻을 때 사용하며, URL의 가장 마지막{} 사이에 들어가 있는 문자와 @PathVariable(””)내에 들어간 문자는 무조건 같아야 한다.

 

3. HTML 파일 생성

controller를 통해 return 해주었지만, Template이 없어 출력을 시키지 못하고 있다.

출력을 시켜주기 위해 controller에서 반환한 값과 같은 이름인 html파일을 생성해야 한다.

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

하지만, id로 찾은 question의 정보가 없어 출력이 되지 않는다.

 

4. Service 생성

Controller에서 Repository로 바로 참조하지 않게 하기 위해 Service를 생성한다.

Service 내에서는 Repository을 참조하여 id를 통해 Question을 찾아 다시 Controller로 보내주는 역할을 한다.

 

5. detail controller 수정

Service를 통해 얻은 Question 객체를 addAttribute 를 통해 html로 이동시킬 수 있도록 한다.

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

결과는 잘 나온다