본문 바로가기
BackEnd/Spring

Template

by 해학 2024. 12. 16.
728x90

 

 

템플릿 설정하기

앞서 우리는 문자열 ‘question list’를 직접 자바 코드로 작성하여 브라우저에 리턴했다. 하지만 보통 브라우저에 응답하는 문자열은 이 예처럼 자바 코드에서 직접 만들지 않는다. 일반적으로 많이 사용하는 방식은 템플릿(template) 방식이다. 템플릿은 자바 코드를 삽입할 수 있는 HTML 형식의 파일을 말한다.

이러한 템플릿을 사용하기 위해 스프링 부트에서는 템플릿 엔진을 지원한다. 템플릿 엔진에는 Thymeleaf, Mustache, Groovy, Freemarker, Velocity 등이 있는데, 이 책에서는 스프링 진영에서 추천하는 타임리프(Thymleaf) 템플릿 엔진을 사용할 것이다.

타임리프에 대한 더 자세한 설명은 타임리프 홈페이지(https://www.thymeleaf.org)에서 확인할 수 있다.

타임리프를 사용하려면 먼저 설치가 필요하다. 다음과 같이 build.gradle 파일을 수정하여 타임리프를 설치해 보자.

 
(... 생략 ...)

dependencies {
    (... 생략 ...)
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect'
}

(... 생략 ...)

이전과 마찬가지로 build.gradle 파일을 선택한 후 마우스 오른쪽 버튼을 눌러 [Gradle → Refresh Gradle Project]를 클릭하여 변경 사항을 적용하면 타임리프가 설치된다.

타임리프를 적용하려면 로컬 서버를 재시작해야 한다. 로컬 서버를 반드시 재시작하고 이후 과정을 진행하자.

템플릿 사용하기

템플릿을 사용할 수 있는 환경을 갖추었으니 이번에는 템플릿을 생성해 질문 목록 페이지를 만들어 보자.

1) src/main/resources 디렉터리에서 templates를 선택한 후, 마우스 오른쪽 버튼을 누르고 [New → File]을 클릭한다. 다음과 같이 파일 이름으로 question_list.html를 입력하여 템플릿을 생성한다.

2) question_list.html 파일의 내용은 다음과 같이 작성해 보자.

[파일명: /templates/question_list.html]

 
<h2>Hello Template</h2>

3) 다시 QuestionController.java 파일로 돌아가 다음과 같이 수정해 보자.

[파일명: /question/questionController.java]

package com.mysite.sbb.question;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class QuestionController {

    @GetMapping("/question/list")
    @ResponseBody
    public String list() {
        return "question_list";
    }
}

이제 템플릿을 사용하기 때문에 기존에 사용하던 @ResponseBody 애너테이션은 필요 없으므로 삭제한다. 그리고 list 메서드에서 question_list.html 템플릿 파일 이름인 'question_list'를 리턴한다.

4) 그리고 다시 로컬 서버를 실행한 뒤, http://localhost:8080/question/list에 접속해 보자. 우리가 question_list.html 파일에 작성한 <h2>Hello Template</h2> 내용이 브라우저에 출력되는 것을 확인할 수 있다.

데이터를 템플릿에 전달하기

앞선 실습을 통해 템플릿에 저장된 내용을 화면에 전달하는 것은 성공했다. 이제 질문 목록이 담긴 데이터를 조회하여 이를 템플릿을 통해 화면에 전달해 보려고 한다. 질문 목록과 관련된 데이터를 조회하려면 QuestionRepository를 사용해야 한다. QuestionRepository로 조회한 질문 목록 데이터는 Model 클래스를 사용하여 템플릿에 전달할 수 있다. 코드를 작성하면서 더 자세히 알아보자.

먼저, 다음과 같이 QuestionController.java를 수정해 보자.

 

[파일명:/question/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 QuestionRepository questionRepository;

    @GetMapping("/question/list")
    public String list(Model model) {
        List<Question> questionList = this.questionRepository.findAll();
        model.addAttribute("questionList", questionList);
        return "question_list";
    }
}

매개변수로 Model을 지정하면 객체가 자동으로 생성된다.

@RequiredArgsConstructor 애너테이션의 생성자 방식으로 questionRepository 객체를 주입했다. @RequiredArgsConstructor는 롬복(Lombok)이 제공하는 애너테이션으로, final이 붙은 속성을 포함하는 생성자를 자동으로 만들어 주는 역할을 한다. 따라서 스프링 부트(Spring Boot)가 내부적으로 QuestionController를 생성할 때 롬복으로 만들어진 생성자에 의해 questionRepository 객체가 자동으로 주입된다.

그리고 QuestionRepository의 findAll 메서드를 사용하여 질문 목록 데이터인 questionList를 생성하고 Model 객체에 ‘questionList’라는 이름으로 저장했다. 여기서 Model 객체는 자바 클래스(Java class)와 템플릿(template) 간의 연결 고리 역할을 한다. Model 객체에 값을 담아 두면 템플릿에서 그 값을 사용할 수 있다. Model 객체는 따로 생성할 필요 없이 컨트롤러의 메서드에 매개변수로 지정하기만 하면 스프링 부트가 자동으로 Model 객체를 생성한다.

 

728x90

'BackEnd > Spring' 카테고리의 다른 글

루트 URL  (1) 2024.12.16
th:each  (0) 2024.12.16
파일관리  (0) 2024.12.16
jpa sql  (0) 2024.12.16
application.properties  (0) 2024.12.16