하나씩 차근차근
article thumbnail

이번 포스트에서는 localhost:8080/question/list 에 출력되는 질문을 클릭했을때

해당 질문의 내용, 댓글, 날짜 등을 상세하게 볼 수 있는 상세 페이지를 만들어보겠습니다.

 

question_list 수정

먼저 question_list 페이지를 수정해서 질문의 제목을 클릭하면 페이지를 이동시키겠습니다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<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>
</body>
</html>

thymeleaf 를 통해 th:href="@{주소}" 를 사용하면 html 의 하이퍼링크 기능을 사용할 수 있습니다.

우리는 각 질문의 id 값을 통해 해당 질문을 상세하게 볼 수 있는 페이지로 이동하겠습니다.

예를 들어 1번 질문은 "localhost:8080/question/detail/1" 을 입력해서 상세 페이지로 이동할 수 있습니다.

 

Controller 작성

다음으로 "localhost:8080/question/detail/id값" 에 접속했을때 브라우저를 통해 페이지를 보여줄 수 있도록

QuestionController 를 작성하겠습니다. 

package com.crud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.web.bind.annotation.RestController;

import com.crud.model.Question;
import com.crud.repository.QuestionRepository;
import com.crud.service.QuestionService;

@Controller
public class QuestionController {
	
	@Autowired
	private QuestionService questionService;

	@GetMapping("/question/list")
	public String list(Model model) {
		List<Question> questionList = questionService.getList();
		model.addAttribute("questionList", questionList);
		return "question_list";
	}
	
	@GetMapping("/question/detail/{id}")
	public String detail(Model model, @PathVariable("id") Integer id) {
		return "question_detail";
	}
}

위와 같이 detail 메서드를 작성해서 question_detail 페이지를 보여주도록 합니다.

여기서 주의할점은 @PathVariable 의 괄호 안의 문자는 주소의 데이터와 같은 값이어야 합니다.

"/question/detail/{데이터 변수}" 의 데이터 변수는 @PathVariable("데이터변수") 와 동일해야함 

 

QuestionService 작성

다음으로 QuestionService 에서 id 를 통해 question 데이터를 가져오는 getQuestion 메서드를 작성합니다.

package com.crud.service;

import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.crud.model.Question;
import com.crud.repository.QuestionRepository;

@Service
public class QuestionService {

	@Autowired
	private QuestionRepository questionRepository;
	
	public List<Question> getList() {
		return questionRepository.findAll();
	}
	
	public Question getQuestion(Integer id) {
		Optional<Question> question = questionRepository.findById(id);
		// question 없을 경우 예외처리 필요
		
		return question.get();
	}
}

findById(id) 를 통해 question 을 가져오는데 이때 결과는 Optional 객체로 가져옵니다.

때문에 우리는 Optional 객체를 get 메서드를 통해 question 객체로 받아와야합니다.

추후에 id 에 해당하는 question 이 없는 경우를 예외처리 하겠습니다.

 

Controller 작성 (추가)

위에서 작성한 QuestionController 의 detail 메서드에서 QuestionService 의 getQuestion 메서드를 통해

데이터를 가져오도록 작성하겠습니다.

package com.crud.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
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 org.springframework.web.bind.annotation.RestController;

import com.crud.model.Question;
import com.crud.repository.QuestionRepository;
import com.crud.service.QuestionService;

@Controller
public class QuestionController {
	
	@Autowired
	private QuestionService questionService;

	@GetMapping("/question/list")
	public String list(Model model) {
		List<Question> questionList = questionService.getList();
		model.addAttribute("questionList", questionList);
		return "question_list";
	}
	
	@GetMapping("/question/detail/{id}")
	public String detail(Model model, @PathVariable("id") Integer id) {
		Question question = questionService.getQuestion(id);
		model.addAttribute("question", question);
		return "question_detail";
	}
}

detail 메서드에서 questionService 의 getQuestion 메서드를 통해 question 을 가져옵니다.

가져온 question 을 model 을 통해 question_detail 페이지에 넘겨주게 됩니다.

 

question_detail 작성

마지막으로 question_detail 페이지를 templates 디렉토리 안에 다음과 같이 작성합니다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1 th:text = "${question.subject}"></h1>
	<div th:text = "${question.content}"></div>
</body>
</html>

localhost:8080/question/list 에 출력되는 질문의 제목을 클릭하면 아래와 같이 

해당 질문의 상세 페이지인 /question/detail/1 로 이동하는것을 확인할 수 있습니다.

 

profile

하나씩 차근차근

@jeehwan_lee

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!