점프 투 스프링부트 | 2장 HTML과 JAVA 연결, URL prefix

5w31892p·2022년 12월 29일
0

Spring

목록 보기
21/30

:: 질문 상세 페이지

  • 질문 제목 클릭 시 상세화면 호출

질문 상세로 이동할 HTML

  • th:href 링크 주소
    • @{|문자열로된 링크 주소 + ${question의 id}}
  • 타임리프는 문자열을 연결할 때 | 을 사용한다.
    • 문자열과, 자바 객체의 값을 더할 때에는 | | 로 감싸야 오류가 없다.
<td>
	<a th:href="@{|/question/detail/${question.id}|}" th:text="${question.subject}"></a>
</td>

Controller

  • 변하는 id값을 얻을 때에는 @PathVariable을 사용
  • (value = "/question/detail/{id}") 의 id와 @PathVariable("id") 의 매개변수 이름이 동일해야 한다.
@GetMapping(value = "/question/detail/{id}")
public String detail (Model model, @PathVariable("id") Integer id) {
	return "question_detail"
}

Service

  • 출력할 제목과 내용
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");
    }
}

DataNotFoundException

  • 존재하지 않는 id값 넣으면 404 오류가 나오게끔
@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);
    }
}

Controller에 추가

Question question = this.questionService.getQuestion(id);
model.addAttribute("question", question);

질문 상세 HTML

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

:: URL 프리픽스(prefix)

  • url 시작을 같은 것으로 시작할 때 하나로 통일
    • @RequestMapping("/question")
  • 필수 사항은 아니다.

0개의 댓글