728x90
반응형
SMALL
상세 페이지 만들기
질문 목록에서 질문 제목을 클릭하면 상세페이지로 이동하게끔 하려고 한다.
질문 목록에 링크 추가
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>
상세 페이지 컨트롤러 만들기
위의 링크를 클릭하면 url이 http://localhost:8080/question/detail/2 로 잘 이동한다. 하지만 이에 매핑된 url이 없어 404 오류가 뜬다.
QuestionController.java
package com.mysite.sbb.question;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class QuestionController {
private final QuestionService questionService;
@GetMapping("/question/list")
public String list(Model model) {
List<Question> questionList = this.questionService.getList();
model.addAttribute("questionList",questionList);
return "question_list";
}
@GetMapping(value = "/question/detail/{id}")
public String detail(Model model, @PathVariable("id") Integer id) {
return "question_detail";
}
}
question_detail.html
<h1>제목</h1>
<div>내용</div>
이제 링크 매핑은 됐지만 해당 질문에 맞는 데이터를 가져와야 한다.
상세 페이지에 서비스 사용하기
QuestionService.java
package com.mysite.sbb.question;
import java.util.List;
import java.util.Optional;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Service
public class QuestionService {
private final QuestionRepostiory questionRepostiory;
public List<Question> getList(){
return this.questionRepostiory.findAll();
}
public Question getQuestion(Integer id) {
Optional<Question> question = this.questionRepostiory.findById(id);
if (question.isPresent()) {
return question.get();
} else {
throw new DataNotFoundException("question not found");
}
}
}
DataNotFoundException.java
package com.mysite.sbb;
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);
}
}
QuestionController.java
package com.mysite.sbb.question;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class QuestionController {
private final QuestionService questionService;
@GetMapping("/question/list")
public String list(Model model) {
List<Question> questionList = this.questionService.getList();
model.addAttribute("questionList",questionList);
return "question_list";
}
@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";
}
}
상세 페이지 출력하기
question_detail.html
<h1 th:text="${question.subject}">제목</h1>
<div th:text="${question.content}">내용</div>
해당 id값에 맞는 질문 내용이 정상적으로 보이게 됨.
http://localhost:8080/question/detail/20 와 같은 없는 id값을 요청할 경우 404에러 발생.
스프링 부트 URL 프리픽스 / 매핑 url 중복 제거
@GetMapping("/question//list") @GetMapping(value="/question/detail/{id}") 위의 url의 프리픽스가 /question으로 시작한다. 이렇게 중복될 때 해당 컨트롤러에 매핑되는 url은 항상 /question 으로 시작할 수 있도록 설정
exuzii.tistory.com
728x90
반응형
LIST
'IT > Spring Boot' 카테고리의 다른 글
[Spring Boot] 12. 웹페이지 디자인(CSS) (0) | 2024.04.11 |
---|---|
[Spring Boot] 11. 답변 기능 추가하기 (1) | 2024.04.11 |
[Spring Boot] 9. 서비스 생성, 컨트롤러-서비스-리포지토리 분리 및 연결 (0) | 2024.04.08 |
[Spring Boot] 8. Thymeleaf 템플릿, URL 매핑 (0) | 2024.04.08 |
[Spring Boot] 7. JUnit 테스트 (Answer 예제) (0) | 2024.04.05 |