inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

타임리프

237

루돌프친구

작성한 질문수 31

1

타임리프를 배우고 웹 개발시 header.html, footer.html을 나눠서 작성하고 있습니다.

예를 들어 유저의 개인정보를 변경하는 페이지(profile.html)는 관련 Contoller에서 user의 id를 넘겨서 뿌려줘서 잘 작동하는데

문제는 header.html에서 사용하는 user의 id입니다.
예를 들어header.html에 메뉴바가 있어서 해당 아이콘을 누르면 user의 id를 실어서 profile.html로 넘어가게끔 해야하는데 id를 어디서 받아와야하는지 모르겠습니다.

Controller

@Controller
public class BasicController {

    @GetMapping("/layout/header")
    public String userInfo(@AuthenticationPrincipal PrincipalDetails principalDetails, Model model) {
        model.addAttribute("user.", "principalDetails.getUser()");
        return "layout/header";
    }
}
<nav class="navi">
   <ul class="navi-list">
      <li class="navi-item"> <a th:href="@{/user/{id}(id = ${user.id})}"></a></li>
   </ul>
</nav>

 [[ 에러내용은 ]]

Exception evaluating SpringEL expression: "user.id" (template: "/layout/header" - line 43, col 32)

Property or field 'id' cannot be found on null

 

 

코드를 어떻게 작성해야하는지 모르겠습니다. 아래와 같은 방법으로도 안 되어서 갈피를 못 잡겠습니다.

<a th:href="'/user/' + ${user.id}">

spring MVC

답변 1

2

David

안녕하세요. hwanghsp님, 공식 서포터즈 David입니다.

모델 속성의 key로 'user.' (점 포함)을 작성하셨는데 .(점)을 빼보시고 다시 시도해보시겠어요?

감사합니다.

0

루돌프친구

답변감사합니다, 해당 부분은 제가 글을 올리는 과정에서 오타였습니다,,;;

0

David

profile을 호출하는 핸들러에서 model에 user id를 담으시면 header fragment 내에서 불러올 수 있는데 한 번 해보시겠어요?

0

루돌프친구

profile.html을 호출하는 핸들러에 (header.html와 profile.html에 쓰일) 세션(principalDetails.getUser())을 담아서 보냈습니다. (다른 곳에서 세션id는 principalDetails.getUser().getId() 하면 나왔습니다 )

  • 보낼 때 principalDetails.getUser().getId() 이렇게도 해봤는데 안되었습니다.

@RequiredArgsConstructor
@Controller
public class UserController {

    private final UserService userService;

    @GetMapping("/user/{pageUserId}")
    public String popular(@PathVariable int pageUserId, Model model, @AuthenticationPrincipal PrincipalDetails principalDetails) {
       
        model.addAttribute("principal", principalDetails.getUser());


        return "/user/profile";
    }

 

 

그후 이제 .html에서 가져다 써야 하는데

다른 것들은 다 불러 왔는데 id가 안들어가네요, 말씀주신 [header fragment 내 불러올 수 있는 방법] 알 수 있을까요?

 

header.html

<nav th:object="${principal}"> 이렇게도 해봤는데 안됩니다.

id를 써야될 부분은)

<a th:href="@{/user/{id}(id = ${principal?.id})}">
<!DOCTYPE html>
<html th:fragment="header" xmlns:th="http://www.thymeleaf.org"  >

<head>
   <meta charset="UTF-8">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title></title>
</head>

<body>
   <header class="header">
      <div class="container">
         <a th:href="@{/image/story}" class="logo">
            <img th:src="@{/images/logo.png}" alt="">
         </a>
         <nav class="navi">
            <ul class="navi-list">
               <li class="navi-item"><a th:href="@{/image/story}">
                     <i class="fas fa-home"></i>
                  </a></li>
               <li class="navi-item"><a th:href="@{/image/popular}">
                     <i class="far fa-compass"></i>
                  </a></li>
               <li class="navi-item"><a th:href="@{/user/{id}(id = ${principal?.id})}">
                     <i class="far fa-user"></i>
                  </a></li>
            </ul>
         </nav>
      </div>
   </header>
</body>

</html>

0

David

컨트롤러 내에서 해당 id가 정상적으로 찍히는지 확인해주실 수 있으실까요?

0

루돌프친구

지금 header.html에 profile.html은 무조건 1로 가게 해둬서 다른 id로 로그인시 에러발생합니다.

<li class="navi-item"><a th:href="@{/user/1}">

image

 

해당 컨트롤러 내에서 이렇게 찍어보았을 때 콘솔 내용 입니다.

System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println("dto: " + dto);
System.out.println("principalId: " + principalDetails.getUser().getId());
System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++");

 

콘솔

image

 

해당 User.java:17과 Image.java:18은 도메인 위의 @Data 입니다.

0

David

NPE가 발생하는걸로 보아서는 사용자 정보를 정상적으로 불러오지 못한 걸로 보여지는데, 이 부분을 해결해보시겠어요?

0

루돌프친구

현재 profile을 호출하는 핸들러에서 model에 user id를 담았더니 profile.html에서 사용가능함을 확인했습니다. (로그인한 아이디 : principalDetails.getUser().getId())

Controller

model.addAttribute("principalId",  principalDetails.getUser().getId());
        return "/user/profile";

 

profile.html

<button th:onclick="'profileImageUpload(' + ${dto.user.id} + ', ' + ${principalId} + ')'">사진 업로드</button>

 

여기서 어떻게 하면 header fragment 내에서 불러와서 쓸 수있나요?

이미지 업로드와 db 트랜잭션 묶는법

0

71

1

Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4

0

93

2

MessageSourceTest 코드

0

68

1

인터셉터 에러 설정

0

70

1

resolveArgument()메서드 질문

0

72

1

43강 검증1 에서 실패 로직 관련 질문있습니다.

0

82

2

타임리프 3.X 버전 rendering, serializer 에러 해결 방법

2

162

3

스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ

0

124

3

pdf 오타 문의

0

66

1

ItemUpdateForm 검증 관련 질문입니다.

0

62

1

22page 링크 주소 변경

0

71

2

특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문

0

61

1

섹션3번 수업에 대한 질문입니다.

0

99

2

@Autowired 보다 더 좋은 방법이 어떤 걸까요?

0

99

2

타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.

0

83

1

자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다

0

159

3

스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문

0

82

1

톰캣 에러 페이지가 안보입니다.

0

121

2

apiEceptionController에서 센드 에러 호출하면 안되는지?

0

92

1

세션 타임아웃시 쿠키 삭제 방법이 없나요?

0

138

2

ApiExceptionController 질문드립니다.

0

72

1

셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?

0

69

1

MemberRepository 필드의 fianl 선언 유무

0

93

2

혹시 index.html 에서는 fragment 사용이 안되는건가요

0

64

1