본문 바로가기

SpringBoot

[Do it] 2장 스프링 부트 기본 익히기(3)

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로 전송하는 것