질문 목록에 대한 페이지를 만들었으므로 질문의 상세 정보를 알 수 있는 상세 페이지를 만들어본다.

 

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

+ Recent posts