1. 질문 목록 만들기
- 질문 목록이 담긴 페이지
1) 질문 목록 URL 매핑하기
QuestionController.java
- /question/list URL을 매핑하기 위한 컨트롤러
package com.example.demo.question;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class QuestionController{
@GetMapping("/question/list")
@ResponseBody
public String list() {
return "question list";
}
}
2) 템플릿 설정하기
템플릿(template)
- 자바 코드를 삽입할 수 있는 HTML 형식의 파일
- 스프링 부트에서는 템플릿 엔진을 지원
- 템플릿 엔진 종류 : Tymeleaf, Mustache, Groovy, Freemaker, Velocity 등
타임리프 설치
build.gradle
3) 템플릿 사용하기
/templates/question_list.html
<h2>Hello Template</h2>
questionController.java
- 템플릿을 사용하기 때문에 기존에 사용하던 @ResponseBody은 필요없으므로 삭제
- list 메서드에서 question_list.html 템플릿 파일 이름인 'question_list"를 리턴
package com.example.demo.question;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class QuestionController{
@GetMapping("/question/list")
public String list() {
return "question_list"; //파일명을 의미하는 question_list.html
}
}
4) 데이터를 템플릿에 전달하기
- 질문 목록이 담긴 데이터를 조회하여 템플릿을 통해 화면에 전달
- 질문 목록과 관련된 데이터를 조회하려면 QuestionRepository를 사용해야 함
- QuestionRepository로 조회한 질문 목록 데이터는 Model 클래스를 사용하여 템플릿에 전달할 수 있음
QuestionController.java
package com.example.demo.question;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class QuestionController{
private final QuestionRepository questionRepository;
@GetMapping("/question/list")
//매개변수로 Model을 지정하면 객체가 자동으로 생성
public String list(Model model) {
List<Question>questionList = this.questionRepository.findAll();
model.addAttribute("questionList", questionList);
return "question_list";
}
}
- @RequiredArgsConstructor의 생성자 방식으로 questionRepository 객체를 주입
- 스프링 부트가 내부적으로 QuestionController를 생성할 때 롬복으로 만들어진 생성자에 의해 questionRepository 객체가 자동으로 주입
- QuestionRepository의 findAll 메서드를 사용하여 질문 목록 데이터인 questionList를 생성하고 Model 객체에 'questionList'라는 이름으로 저장
- Model 객체는 자바 클래스와 템플릿 간의 연결 고리 역할을 함
- Model 객체에 값을 담아 두면 템플릿에서 그 값을 사용할 수 있음
- Model 객체는 따로 생성할 필요 없이 컨트롤러의 메서드에 매개변수로 지정하기만 하면 스프링 부트가 자동으로 Model 객체를 생성
5) 데이터를 화면에 출력하기
templates/question_list.java
<table>
<thead>
<tr>
<th>제목</th>
<th>작성일시</th>
</tr>
</thead>
<tbody>
<tr th:each="question:${questionList}">
<!--question 객체의 subject를 <td>태그로 출력-->
<td th:text="${question.subject}"></td>
<!--question 객체의 crateDate를 <td>태그로 출력-->
<td th:text="${question.createDate}"></td>
</tr>
</tbody>
</table>
- 질문 목록을 HTML의 테이블 구조로 표시
<tr th:each="question:${questionList}">
- th:는 타임리프에서 사용하는 속성, 자바 코드와 연결되는 부분
- 타임리프는 Model 객체에 저장한 questionList를 ${questionList}로 읽을 수 있음
- questionList에 저장된 데이터를 하나씩 꺼내 question 변수에 대입한 후 questionList의 개수만큼 반복하며 <tr>...</tr> 문장을 출력하라는 의미
2. 루트 URL 사용하기
루트 URL
- 서버의 URL을 요청할 때 도메인명 뒤에 아무런 주소도 덧붙이지 않는 URL
- 루트 URL을 요청했을 때 보여 지는 페이지를 메인 페이지라 함
- 질문 목록을 메인 페이지로 정하고, 루트 URL을 요청했을 때 질문 목록 화면으로 이동되도록 수정
MainController.java
package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class MainController {
@GetMapping("/sbb")
@ResponseBody
public String index() {
return "안녕하세요 sbb에 오신 것을 환영합니다.";
}
@GetMapping("/")
public String root() {
return "redirect:/question/list";
}
}
- root 메서드를 추가하고 / URL을 매핑
- 리턴 문자열 'redirect:/question/list'는 /question/list URL로 페이지를 리다이렉트하라는 명령
- 리다이렉트란 클라이언트가 요청하면 새로운 URL로 전송하는 것
'SpringBoot' 카테고리의 다른 글
[Do it] 2장 스프링 부트 기본 기능 익히기(5) (0) | 2024.01.21 |
---|---|
[Do it] 2장 스프링 부트 기본 기능 익히기 (4) (0) | 2024.01.21 |
[Do it] 2장 스프링 부트 기본 기능 익히기(2) (1) | 2024.01.19 |
[Do it] 2장 스프링 부트 기본 기능 익히기 (1) (0) | 2024.01.18 |
[Do it] 1장 스프링 부트 개발 준비하기 (1) | 2024.01.18 |