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에러 발생.

 

 

https://exuzii.tistory.com/75

 

스프링 부트 URL 프리픽스 / 매핑 url 중복 제거

@GetMapping("/question//list") @GetMapping(value="/question/detail/{id}") 위의 url의 프리픽스가 /question으로 시작한다. 이렇게 중복될 때 해당 컨트롤러에 매핑되는 url은 항상 /question 으로 시작할 수 있도록 설정

exuzii.tistory.com

 

728x90
반응형
LIST

+ Recent posts