홈페이지에 들어온 사용자를 로그인한 사용자와 비로그인 사용자를 구분하기 쉽게 코드를 짜고싶다. 요청 매핑 핸들러 어뎁터의 기능을 활용해보자.
@GetMapping("/")
public String homeLogin(@Login Member loginMember, Model model) {
if (loginMember == null) {
return "home";
}
model.addAttribute("member", loginMember);
return "loginHome";
}
평소와 다른게 있다면 @Login
이 파라미터 안에 있다는 것이다. 자바나 스프링에서 제공하는 애노테이션은 아니고 이제 우리가 만들어 볼 어노테이션이다.
기본 원리는 @Login
이 붙은 파라미터가 있다면 ArgumentResolver
가 request의 세션을 확인해서 멤버 객체의 정보를 받아올 것이다. 물론 @Login
뒤의 클래스 정보가 무엇인지도 확인하는 작업도 있다.
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
@Target(ElementType.PARAMETER)
: 파라미터에만 적용
@Retention(RetentionPolicy.RUNTIME)
: 런타임까지 애노테이션 정보가 남아있다. 이 애노테이션에 대해서는 다른 글에서 더 알아보자.
public class 나의로그인아규먼트리졸버 implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasMemberType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NatvieWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null) {
return null;
}
return session.getAttribute("내가 정한 세션이름");
}
}
이제 내가 만든 argumentResolver를 등록해주면 된다.
@Configuration
public class 나의웹콘피그 implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new 나의로그인아규먼트리졸버());
}
}
이 과정이 로그인 처리하는데 있어 필수과정은 아니지만 한번 애노테이션을 이렇게 만들어놓으면 앞으로 로그인 여부와 관련한 컨트롤러를 생성할 때 쉽게 처리할 수 있다. 프로젝트의 확장성을 생각하면 좋은 선택지가 될 것 같다.