IT/Spring Boot
[Spring Boot] 10. 상세 페이지 작성
우웅지
2024. 4. 8. 17:37
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