질문 목록에 대한 페이지를 만들었으므로 질문의 상세 정보를 알 수 있는 상세 페이지를 만들어본다.
1. 질문 상세 링크 추가
질문목록에서 제목을 클릭했을 때 상세화면이 호출되도록 질문목록 템플릿을 다음과 같이 수정
question_list.html
<table>
<thead>
<tr>
<th>제목</th>
<th>작성일시</th>
</tr>
</thead>
<tbody>
<tr th:each="question : ${questionList}">
<td>
<a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>
</td>
<td th:text="${question.createDate}"></td>
</tr>
</tbody>
</table>
- 타임리프에서 링크의 주소는 th:href 속성을 사용
- URL 주소를 나타낼때는 반드시 @{ 문자와 } 문자 사이에 입력
- URL주소의 좌우에 | 문자없이 다음과 같이 사용하면 오류가 발생
/question/detail/ 과 같은 문자열과 ${question.id}와 같은 자바 객체의 값을 더할 때는 반드시 예제와 같이 | 기호로 좌우를 감싸 주어야 한다.
QuestionController.java 수정
package com.myspringboot.ssh.question;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class QuestionController {
// private final QuestionRepository questionRepository;
private final QuestionService questionService;
@RequestMapping("/question/list")
public String list(Model model) {
//List<Question> questionList = questionRepository.findAll();
List<Question> questionList = this.questionService.getList();
model.addAttribute("questionList", questionList);
return "question_list";
}
// 추가
@RequestMapping(value="/question/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id) {
return "question_detail";
}
}
- 변하는 id 값을 얻을 때에는 위와 같이 @PathVariable 애너테이션을 사용
- @RequestMapping에서 사용한 매개변수 ({id}) 와 @PathVariable 에서 사용한 매개변수({id}) 처럼 이름이 동일해야한다.
QuestionService.java 수정
package com.myspringboot.ssh.question;
import java.util.List;
import java.util.Optional;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class QuestionService {
private final QuestionRepository questionRepository;
public List<Question> getList(){
return this.questionRepository.findAll();
}
//추가
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");
}
}
}
위 코드를 작성하고 나면 throw new DataNotFoundException("question not found"); 부분에서 컴파일 에러가 발생할 것이다.
참조해야하는 DataNotFoundException 클래스가 없기떄문. id값에 해당하는 Question 데이터가 없을 경우 처리를 위한 DataNotFoundException 를 생성한다.
DataNotFoundException.java 생성
package com.myspringboot.ssh;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason ="entity not found")
public class DataNotFoundException extends RuntimeException{
private static final long serialVersionUID = 1L;
public DataNotFoundException(String message) {
super(message);
}
}
- RuntimeException을 상속
- DataNotFoundException이 발생하면 @ResponseStatus 애너테이션에 의해 404 오류 발생
QuestionController.java 수정
package com.myspringboot.ssh.question;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class QuestionController {
// private final QuestionRepository questionRepository;
private final QuestionService questionService;
@RequestMapping("/question/list")
public String list(Model model) {
//List<Question> questionList = questionRepository.findAll();
List<Question> questionList = this.questionService.getList();
model.addAttribute("questionList", questionList);
return "question_list";
}
@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";
}
}
question_detail.html 템플릿 생성
<h1 th:text="${question.subject}"></h1>
<div th:text="${question.content}"></div>
질문목록에서 제목 클릭 결과
출처 : 점프 투 스프링부트 https://wikidocs.net/161302#_1
'Backend > Spring Boot' 카테고리의 다른 글
[Spring Boot] 답변 등록(1/2) (0) | 2022.08.22 |
---|---|
[Spring Boot] URL 프리픽스(prefix) (0) | 2022.08.22 |
[Spring Boot] Service (서비스) (0) | 2022.08.17 |
[Spring Boot] ROOT URL (0) | 2022.08.17 |
[Spring boot] 자주 사용하는 타임리프의 속성 (0) | 2022.08.17 |