기본적인 맥락 설명은 건너뜁니다.

Thymeleaf layout 파일을 만들고, 해당 레이아웃을 사용하는 파일에서 sidebar 프래그먼트를 지정했다. 아래와 같은 코드다.

<th:block layout:fragment="sidebar" th:replace="fragments/sidebar-system"></th:block>

지금은 system 사이드바인데, type이 system일 때는 system 사이드바를 사용하고 싶지만, type이 app일 때는 app 사이드바를 사용하고 싶다.

그래서 아래처럼 하면 안 된다.

<th:block th:if="${type == 'system'}" 
          layout:fragment="sidebar" th:replace="fragments/sidebar-system"></th:block>
<th:block th:if="${type == 'app'}" 
          layout:fragment="sidebar" th:replace="fragments/sidebar-app"></th:block>

이유는 간단한데, if문보다 layout:fragment가 우선하기 때문이라고 한다.

해결책 - 파일은 하나만, 그 안에서 if문

해결책은 단순하다.

layout:fragment에는 파일을 하나만 지정해 주고, 그 안에서 if문을 사용한다.

<th:block layout:fragment="sidebar" th:replace="fragments/sidebar"></th:block>

위와 같이 코드를 쓰고, 아래처럼 sidebar.html 파일을 만든다.

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" th:lang="${#locale}">
<body>
    <!--/*@thymesVar id="type" type="java.lang.String"*/-->
    <th:block th:if="${type == 'system'}">
        <div class="u-padding-top" th:replace="fragments/sidebar-system"></div>
    </th:block>
    <th:block th:if="${type == 'app'}">
        <div class="u-padding-top" th:replace="fragments/sidebar-app"></div>
    </th:block>
</body>
</html>

그러면 잘 작동한다.

title 태그

title 태그도 마찬가지 방식으로 처리하면 된다. title 태그는 fragment는 아니지만 역시 비슷하게 작동하는 듯하다.

<title th:replace="fragments/title"></title>