httpSession.set으로 저장한 유저의 정보를 가져오려면 httpSession.get으로 가져와야한다.
그러면 로그인 유저의 정보를 가져올 때마다 아래와 같은 구조가 반복적으로 나타날 것이다.
@GetMapping("/board/writeForm")
public String writeForm(Model model, HttpSession httpSession) {
SessionMember member = (SessionMember) httpSession.getAttribute("member");
if(member != null) {
model.addAttribute("memberName", member.getName());
}
return "writeForm";
}
- HttpSession httpSession
- SessionMember member = (SessionMember)httpSession.getAttribute("member");
똑같은 코드가 중복되면 괜히 가독성도 떨어지고 여러모로 좋지 않아 보인다.
그러므로 앞으로는 @LoginMember라는 어노테이션을 만들어 중복을 줄이려고 한다.
@GetMapping("/board/writeForm")
public String writeForm(Model model, @LoginMember SessionMember member) {
if(member != null) {
model.addAttribute("memberName", member.getName());
}
return "writeForm";
}
그러면 훨씬 깔끔해진 모습을 볼 수가 있다.
그런데
2024-03-07T12:21:13.524+09:00 ERROR 31396 --- [nio-8091-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.IllegalStateException: argument type mismatch
Controller [com.example.unipetition.petition.board.controller.BoardController]
Method [public java.lang.String com.example.unipetition.petition.board.controller.BoardController.view(java.lang.Long,com.example.unipetition.petition.member.domain.Member,jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse,org.springframework.ui.Model)] with argument values:
[0][type=java.lang.Long] [value=1],
[1][type=com.example.unipetition.security.auth.dto.SessionMember] [value=com.example.unipetition.security.auth.dto.SessionMember@45cfdef4],
[2][type=org.springframework.security.web.servletapi.HttpServlet3RequestFactory$Servlet3SecurityContextHolderAwareRequestWrapper] [value=SecurityContextHolderAwareRequestWrapper[ org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterRequest@19eb920b]],
[3][type=org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterResponse] [value=org.springframework.security.web.header.HeaderWriterFilter$HeaderWriterResponse@53a0c64e],
[4][type=org.springframework.validation.support.BindingAwareModelMap] [value={}] ] with root cause
대충 타입이 맞지 않아 생긴다는 오류다.
"내가 뭘 잘못했는데"
결과는 어노테이션과 메소드 매개변수의 조건을 반환하고, 메소드의 매개변수에 값을 반환하는 역할을 하는 HandlerMethodArgumentResolver의 구현체에 문제가 있었다.
내가 어노테이션을 쓰려는 방식은 이렇다.
@LonginMember SessionMember member
@LonginMember 어노테이션을 사용해 객체를 반환 받아 member로 받는 형식이다.
매개변수의 특정 조건을 확인하는 supportParameter 메소드에는 이런 코드가 있었다.
boolean isMemberClass = Member.class.equals(parameter.getParameterType());
어노테이션과 함께 있는 메소드의 매개변수가 위 코드에 있는 Member.class와 일치하는지 판별한다.
근데 나는 엔티티인 Member 클래스 말고 이것의 dto인 SessionMember로 유저의 정보를 받아오려고 했다.
그렇다. SessionMember는 dto로써 Member 엔티티에서 필요한 정보만 가져오므로 타입이 다르다는 것이다.
결국 supportParameter 메소드의 기존 Member.class를 매개변수로 받기로 한 SessionMember.class로 바꿔주면서 오류는 간단히 해결됐다.
boolean isMemberClass = SessionMember.class.equals(parameter.getParameterType());