질문 목록 만들기
http://localhost:8080/question/list 요청

=> 404에러 발생. 저 url과 매핑되는 것이 없기 때문.
질문 목록 URL 매핑하기
com.mysite.sbb.question 패키지 안에
QuestionController.java 클래스 생성.
QuestionController.java
package com.mysite.sbb.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";
}
}

재실행 하면 문자열이 출력된 것을 확인 가능.
URL 매핑에 성공한 것이다.
템플릿 설정하기
앞서 'question list'를 직접 자바 코드로 작성하여 문자열로 리턴하였다.
하지만 보통 자바 코드에서 직접 만들지 않고 템플릿을 사용한다.
템플릿이란? 자바 코드를 삽입할 수 있는 HTML 형식의 파일을 말한다.
템플릿으로는 타임리프(Thymeleaf)를 사용할 것이다.
타임리프 설치
//thymeleaf
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'

build.gradle 파일에 추가하고 마우스 우클릭 후 [Gradle] -> [Refresh...] 클릭.
템플릿 사용하기
html파일 생성
src/main/resources/template 을 선택 후 우클릭을 눌러 [New -> File]을 클릭한다..
파일이름은 "question_list.html"로 입력한다.

<h2>Hello Template</h2>

Controller 수정
package com.mysite.sbb.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")
public String list() {
return "question_list";
}
}
@ResponseBody 어노테이션을 삭제하고, return값은 html의 파일명으로 수정한다.

실행 후 화면.
데이터를 템플릿에 전달하기
이제 질문 목록의 데이터를 조회하여 템플릿을 통해 화면에 출력하려고 한다..
질문 관련 데이터를 조회하기 위해서는 QuestionRepository를 사용해야 한다.
Controller 수정
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 lombok.RequiredArgsConstructor;
@RequiredArgsConstructor
@Controller
public class QuestionController {
private final QuestionRepostiory questionRepostiory;
@GetMapping("/question/list")
public String list(Model model) {
List<Question> questionList = this.questionRepostiory.findAll();
model.addAttribute("questionList",questionList);
return "question_list";
}
}
@RequiredArgscontructor 어노테이션은 생성자 방식으로 questionRepository 객체를 주입한다. final이 붙은 속성을 포함하는 생성자를 자동으로 만들어주는 역할을 한다.
또 finalAll() 메서드를 이용하여 질문 목록을 가져와 questionList에 저장해준다.
list메서드의 매개변수에 있는 model을 통해서 템플릿으로 데이터를 전달해준다.
데이터 화면에 출력하기
html 템플릿 수정
question_list.html
<table>
<thead>
<tr>
<th>제목</th>
<th>작성일시</th>
</tr>
</thead>
<tbody>
<tr th:each="question : ${questionList}">
<td th:text="${question.subject}"></td>
<td th:text="${question.createDate}"></td>
</tr>
</tbody>
</table>
tbody 안의 내용이 가장 중요하다.
th:는 타임리프에서 사용하는 속성인데 이 곳에서 자바 코드와 연결된다. 자바 코드에서 model에 담아 전달했던 questionList를 ${questionList}를 통해 받는다.
th:each문을 통해 questionList에서 값을 하나씩 꺼내 출력한다.

실행결과.
루트 URL 사용하기
http://localhost:8080 으로 접속해보자.

현재 루트 URL을 매핑하지 않아서 404 오류가 뜬다.
MainController.java
package com.mysite.sbb;
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";
}
}
"/"url과 매핑을 시킨다.
여기서 "redirect:/question/list" 이 부분은 루트로 들어오면 /question/list 페이지로 리다이렉트 하라는 명령어이다.

따라서 localhost:8080을 입력해도 localhost:8080/question/list로 자동으로 이동한다.
'IT > Spring Boot' 카테고리의 다른 글
[Spring Boot] 10. 상세 페이지 작성 (0) | 2024.04.08 |
---|---|
[Spring Boot] 9. 서비스 생성, 컨트롤러-서비스-리포지토리 분리 및 연결 (0) | 2024.04.08 |
[Spring Boot] 7. JUnit 테스트 (Answer 예제) (0) | 2024.04.05 |
[Spring Boot] 6. 리포지터리 생성, JUnit 테스트 (Question 예제) (0) | 2024.04.05 |
[Spring Boot] 5. H2 데이터베이스, JPA (0) | 2024.04.04 |