타임리프로 Java 객체 접근하기

알파로그·2023년 4월 25일
0

HTML / CSS

목록 보기
6/6

✏️ 발단

  • SSR 방식의 프로젝트중 Enum 값에 따라서 다른 text 가 출력될 필요가 있었다.

  • Enum 객체

package com.baeker.baeker.myStudy;

public enum StudyStatus {
    MEMBER, PENDING, INVITING
}

  • html 계층
    • enum 값이 text 타입이 아니기 때문에 ‘ ‘ 를 사용해서 비교가 불가능했다.
    • 전부 fales 로 판정됨
<h3 th:if="${myStudy.status eq 'PENDING'"
    th:text="|${myStudy.study.name}에 가입 신청|"
    class="font-bold text-lg">
</h3>

<h3 th:if="${myStudy.status eq 'INVITING'"
    th:text="|${myStudy.study.name}에서 초대|"
    class="font-bold text-lg">
</h3>

✏️ 문제 해결

📍 Controller 계층에서 enum 값을 String 으로 변환해서 Model 에 전달하기

  • 이 방법으로 구현하면 원하는 방식으로 될것이라 확신했지만,
    위 html 코드는 th:each 문에 의해 반복된 하나의 Index 이다.
    - 이 방법으로 문제를 해결하려면 service 계층에서 Controller 로 반환하는 List 값을 새로 변경해야되고,
    - entity 의 필드값도 추가해야되기때문에 코드의 많은 수정이 불가피했다.

  • 최소한의 리소스 만으로 문제를 해결하고 싶었기 때문에 이 방법은 제외했다.

📍 Enum 을 Bean 으로 등록

  • ${@객체명} 이 방법을 사용하면 타임리프에서 Bean 으로 등록된 java 객체로 바로 접근이 가능하다는 걸 알고있었다.
    • 이 방법을 사용하기 위해서 Enum 객체에 @Component 를 선언하니 아래와 같은 문제가 발생했다.
    • Compont 를 사용했기 때문에 Scan 의 대상이 됬지만 Bean 으로 등록은 되지 않았기 때문에 서버를 실행시킬 수 없다는 의미 같았다.
      • 이 문제를 해결하기 위해선 Bean 으로 등록을 해주어야 하는데,
        Bean 을 등록해줄 별도의 Configuation 계층을 만들어야 했기 때문에 이 방법도 제외했다.
***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.baeker.baeker.myStudy.StudyStatus required a bean of type 'java.lang.String' that could not be found.

📍 T("fully qualified class name") 표현식 사용

  • 방법을 찾아보던중
    어떤 선행작업을 하지 않아도 타임리프 문법으로 java 객체에 접근할 수 있다는 것을 알아냈다.
    - 아래와 같이 입력하면 별도의 작업없이 java 객체에 접근이 가능하다고 한다.
${T(com 부터 객체까지의 경로)}

  • 현재 프로젝트에 이 표현식을 적용해 봤다.
    • 정상적으로 작동이 되었다.
    • 지금은 경로에 모든 길이를 적었지만 th:object 를 사용하면 더 편리하게 사용이 가능하다.
<h3 th:if="${myStudy.status eq T(com.baeker.baeker.myStudy.StudyStatus).PENDING}"
    th:text="|${myStudy.study.name}에 가입 신청|"
    class="font-bold text-lg"></h3>

<h3 th:if="${myStudy.status eq T(com.baeker.baeker.myStudy.StudyStatus).INVITING}"
    th:text="|${myStudy.study.name}에서 초대|"
    class="font-bold text-lg"></h3>
profile
잘못된 내용 PR 환영

0개의 댓글