everyday com-eat
작성일
2022. 4. 9. 11:32
작성자
갱수터
728x90
  1. 코드를 쓴 상황

    팀프로젝트 중 내가 맡은 기능이 결제파트인데 그 중 결제상세페이지 view단을 관리자페이지와 마이페이지에서 같이 사용해야했다. 관리자페이지와 마이페이지는 left-menu를 제외하고 모든 fragments가 겹치는 상황.

    처음 controller에서 '관리자','마이페이지'같은 문자열을 받아와 html 태그에 th:if 구문으로 분기처리를 하려고 했다. 그런데 th:unless 조건을 붙여 아래 html 태그를 두번 쓰니깐 오류가 났다. 
    두번째로 th:block 구문안에 html태그를 분기처리해봄 target으로 관리자 페이지 controller에서 '관리자'라는 값이 넘어오면 관리자페이지 layout으로 아니라면 마이페이지 layout으로 작성했는데 안됨
    세번째로 if문으로 분기처리를 안하고 그냥 controller에서 layout:decorate에 들어갈 값을 넘겨주면 어떨까 생각하게 되었고 ~{layout/default} 자체를 "layoutDeco"로 view단에 보냈고 layout:decorate=${layoutDeco}로 코드를 작성해봤는데 오류가 났다... 오류 내용을 보면 값은 제대로 가져오는데 파싱이 안되는 상황.. ~{$layout/${layoutDeco}}이렇게도 써보고 여러가지를 시도해봤는데 해결되지 않음
    네번째는 th:attr 구문으로 layout:decorate 속성의 값을 지정해줄려고 했는데 역시나 오류가 났다...
  2. 에러메시지


    th:attr 구문을 이용해서 쓴 th:attr="layout:decorate=${layoutDeco}"의 layoutDeco 바인딩을 전혀 못받아온다...
  3. 내 코드
    <!-- 첫번째 -->
    <html th:if="${target == '관리자'}" xmlns:th="http://www.thymeleaf.org"
    		xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    		layout:decorate="~{layout/default}">
    <html th:unless="${target == '관리자'}" xmlns:th="http://www.thymeleaf.org"
    	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    	layout:decorate="~{layout/mypagedefault}">
    
    <!-- 두번째 -->
    <th:block th:with="target=${layoutDeco}">
    	<html th:if="${target == '관리자'}" xmlns:th="http://www.thymeleaf.org"
    		xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    		layout:decorate="~{layout/default}">
        <html th:unless="${target == '관리자'}" xmlns:th="http://www.thymeleaf.org"
    		xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    		layout:decorate="~{layout/mypagedefault}">
    </th:block>
    
    <!-- 세번째 -->
    <html xmlns:th="http://www.thymeleaf.org"
    	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    	layout:decorate="${layoutDeco}">
    
    <!-- 네번째 -->
    <html xmlns:th="http://www.thymeleaf.org"
    	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
    	th:attr="layout:decorate=${layoutDeco}">
  4. 해결

    선생님께 질문하고 내가 시도해 봤던 방법들을 다 설명 드리고 선생님도 조금 찾아보시다가 해결 방법을 찾아내셨다...
    두번째 시도 했던 방법에서 나는 layoutDeco를 ~{layout/default} 자체를 다 담아놨는데 그냥 layout/default 부분만 담고 view단에서 layout:decorate="~{${layoutDeco}}"로 작성하면 된다...
728x90