2023-06-19

1. 문제 발생

image-20230619163849086

Thyemleaf 설정 전에는 한글깨지는 현상이 없었Thymeleaf 설정 후 html내에 있는 한글과 Controller에서 전달하는 한글들이 깨지는 상황이 발생.

  1. web.xml에 CharacterEncodingFilter 설정 문제없음.

    <!-- encodingFilter -->
    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter
        </filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
  2. Window -> Preferences -> Web -> HTML Files -> The following encoding will apply : Encoding : UTF-8로 설정 문제없음.
    image-20230619164531905

  3. htmlcharset="UTF-8" 문제없음.

    <!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    안녕하세요
    <span th:text="'내 이름은 ' + ${name} + '입니다' ">
    </body>
    </html>
    

2. 문제 원인

<property name="characterEncoding" value="UTF-8" />

SpringResourceTemplateResolverThymeleaf에서 사용하는 템플릿 파일을 찾아내기 위한 리졸버(resolver)입니다. 이 리졸버는 템플릿 파일의 위치와 확장자 등을 설정할 수 있습니다. 만약 템플릿이 UTF-8로 작성되어 있다면 SpringResourceTemplateResolver 또한characterEncoding 을 통해 UTF-8 인코딩을 설정해야 html내에 있는 한글이 안깨진다고 합니다.

그리고 ThymeleafViewResolver는 뷰를 렌더링하여 클라이언트에게 전달하는 역할을 합니다. 이 뷰 리졸버는 templateEngine 빈과 연결되어 작동하며 characterEncoding을 통해 UTF-8 인코딩을 설정하면 뷰를 클라이언트로 전송할 때 해당 인코딩이 적용되어 전달되게 됩니다.

3. 문제 해결

<bean id="templateResolver" class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".html" />
    <property name="templateMode" value="HTML5" />
    <property name="characterEncoding" value="UTF-8" />
</bean>

<bean id="templateEngine" class="org.thymeleaf.spring5.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver" />
</bean>

<bean class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine" />
    <property name="characterEncoding" value="UTF-8" />
</bean>

따라서, SpringResourceTemplateResolvercharacterEncoding 속성은 템플릿 파일의 인코딩을 설정하고, ThymeleafViewResolvercharacterEncoding 속성은 뷰의 출력 인코딩을 설정하는 것입니다. 이 두 설정을 모두 해줘야 템플릿 파일의 내용을 올바르게 읽고, 뷰를 클라이언트에게 전달할 때 한글이 깨지지 않고 제대로 표시됩니다.

image-20230619170956372

댓글남기기