점프 투 스프링부트를 참고하여 학습,작성하였습니다.
1.질문에 링크 추가
Thymeleaf 속성을 사용하여 질문의 subject 텍스트에 /question/detail/${question.id} 링크를 등록한다.
Thymeleaf에서 | 기호로 감싸면 문자열 연결, 정적인 URL 구성, 복잡한 문자열 처리를 할수있다.
href를 통해 링크를 누르면 HTTP GET요청이 발생한다 .
<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>
2.매핑
PathVariable은 Spring Framework에서 컨트롤러 메서드의 매개변수로 사용되어 경로 변수(path variable)를 받아오는 데 사용된다.
import org.springframework.web.bind.annotation.PathVariable;
/question/detail/{id} 경로로 GET 요청이 들어오면, id 값을 추출하여 해당 ID에 대한 질문의 상세 정보를 보여주는 페이지로 이동하는 기능을 수행한다.
/question/detail/{id}경로로 매핑한다.
@PathVariable("id") Integer id는 id라는 이름의 경로 변수를 받아오는 매개변수이다.
question_detail템플릿으로 리턴된다.
@GetMapping(value = "/question/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id) {
return "question_detail";
}
question_detail.html 파일도 templates 폴더에 만들어준다
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
</body>
</html>
3.상세페이지에 서비스 사용
QuestionService 클래스에 getQuestion 메서드를 추가한다.
만약 question객체 값이 존재한다면 get() 메서드를 호출하여 실제 질문 객체(Question)를 반환
없다면 DataNotFoundException 예외를 발생시킨다.
이 예외는 사용자 정의 예외로 만들어야한다.
import java.util.Optional;
import com.example.DataNotFoundException;
@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");
}
}
}
3-1. DataNotFoundException 예외
@ResponseStatus 어노테이션으로 해당 예외가 발생했을 때 HTTP 상태 코드가 404로 설정하고 entity not found을 클라이언트에게 보낸다.
DataNotFoundException 클래스는 RuntimeException을 상속받아 자바의 런타임 예외 클래스로 만든다.
public DataNotFoundException메소드는 예외 메시지를 받아서 상위 클래스인 RuntimeException의 생성자를 호출하여 예외 객체를 초기화한다.
예외 메시지는 사용자가 지정한 메시지인 "entity not found"가 된다.
package com.example;
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);
}
}
4.컨트롤러 수정
서비스를 만들었으니 Question 객체를 템플릿에 전달하도록 수정한다.
@GetMapping(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";
}
5.템플릿 수정
question_detail 템플릿에 받아온 question객체의 subject, content를 이용해 작성한다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1 th:text="${question.subject}"></h1>
<div th:text="${question.content}"></div>
</body>
</html>
6.결과
질문에 링크가 생겼다.
링크를 누르면 해당페이지가 나온다.
없는 페이지는 예외처리대로 404 Not found오류가 발생하는것을 볼수있다.
'BackEnd > SpringBoot' 카테고리의 다른 글
[Spring Boot] URL 프리픽스 생략 RequestMapping (0) | 2024.07.01 |
---|---|
[SpringBoot] 서비스 (0) | 2024.07.01 |
[Spring Boot] 루트 URL (0) | 2024.07.01 |