프로젝트

21일차

사랑박 2023. 3. 12. 11:15

오늘은 Part2. 게시판 서비스 강의의 `게시글 페이지 만들기` 부분을 학습하였다.

타임리프

타임리프는 뷰 템플릿 엔진으로 JSP, Freemarker와 같이 서버에서 클라이언트에게 응답할 브라우저 화면을 만들어주는 역할을 한다.

타임리프 문법

th:
태그 안의 값을 서버에서 전달 받은 값에 따라서 표현하고자 할 때 사용
th:text
태그 안에 text 할당
th:utext
태그 안에 text 할당, html태그가 있다면 태그 값을 반영해서 표시
th:value
엘리먼트들의 value 값을 지정
th:with
변수 값을 지정해서 사용
th:case
Switch-case 문이 필요할 때 사용
*로 else를 처리
${...}
컨트롤러에서 전달받은 변수에 접근할 수 있으며 th:속성 내에서만 사용 가능
@{...}
@{...}안에 적힌 URL은 앞에 contextPath/ + URL을 의미함
*{...}
th:object로 정의된 변수의 변수 값을 의미한다.
*{name} == ${member.name}
 

타임리프 decopled template logic

html문서에서 타임리프 구문을 따로 분리시켜서 작성하고, html 문서를 순수 마크업 상태로 유지시키는 방법이다.
 

사용방법

ThymeleafConfig.java

package com.project.projectboard.config;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.ConstructorBinding;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;

@Configuration
public class ThymeleafConfig {

    @Bean
    public SpringResourceTemplateResolver thymeleafTemplateResolver(
            SpringResourceTemplateResolver defaultTemplateResolver,
            Thymeleaf3Properties thymeleaf3Properties
    ) {
        defaultTemplateResolver.setUseDecoupledLogic(thymeleaf3Properties.isDecoupledLogic());

        return defaultTemplateResolver;
    }


    @RequiredArgsConstructor
    @Getter
    @ConstructorBinding
    @ConfigurationProperties("spring.thymeleaf3")
    public static class Thymeleaf3Properties {
        /**
         * Use Thymeleaf 3 Decoupled Logic
         */
        private final boolean decoupledLogic;
    }

}

하지만 여기서 @ConfigurationProperties에 빨간줄이 나타날 수도 있는데, 이는 만약에 유저가 ConfigurationProperties를 직접 만든 경우에는 스캔을 진행해줘야 하기 때문에 생기는 것이다. 따라서 main 애플리케이션 파일에 @ConfigurationPropertiesScan을 추가해주면 된다.
 
다음으로 application.yaml 파일에 옵션을 추가해주면 된다.

  thymeleaf3:
    decoupled-logic: true