로그인 처리 - HandlerMethodArgumentResolver

byeol·2023년 4월 1일
0

HandlerMethodArgumentResolver

Strategy interface for resolving method parameters into argument values in the context of a given request.
컨트롤러 메서드에서 특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩 해주는 인터페이스

  • @PathVariable
  • @RequestBody
    모두 HandlerMethodArgumentResolver를 사용해서 값을 받아온다.

1. 애너테이션 작성

...
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
  • @Target : Java complier가 annotation이 어디에 적용될지 결정하기 위해 사용
ElementType.PACKAGE : 패키지 선언
ElementType.TYPE : 타입 선언
ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언
ElementType.CONSTRUCTOR : 생성자 선언
ElementType.FIELD : 멤버 변수 선언
ElementType.LOCAL_VARIABLE : 지역 변수 선언
ElementType.METHOd :메서드 선언
ElementType.PARAMETER : 전달인자 선언
ElementType.TYPE_PARAMETER : 전달인자 타입 선언
ElementType.TYPE_USE : 타입 선언
  • @Retention : Annotaion이 실제로 적용되고 유지되는 범위
RetentionPolicy.RUNTIME : 컴파일 이후에도 JVM에 의해서 계속 참조가 가능, 주로 리플렉션이나 로깅에 많이 사용
RetentionPolicy.CLASS : 컴파일러가 클래스를 참조할 때까지 유효
RetentionPolicy.SOURCE : 컴파일 전까지만 유효, 즉 컴파일 이후에도 사라지게 된다.

2. 객체 작성

import lombok.Data;

import javax.validation.constraints.NotEmpty;

@Data
public class Member {

    private  Long id;//Long은 null값도 가능

    @NotEmpty
    private String loginId; // 로그인 ID

    @NotEmpty
    private String name;

    @NotEmpty
    private String password;
}

3. 컨트롤러 작성

@Slf4j
@Controller
@RequiredArgsConstructor
public class HomeController {
@GetMapping("/")
    public String homeLoginV3ArgumentResolver(
            @Login Member loginMember,
            Model model) {

        //세션에 회원 데이터가 없으면 home
        if (loginMember == null) {
            return "home";
        }

        //세션이 유지되면 로그인으로 이동
        model.addAttribute("member", loginMember);
        return "loginHome";


    }
}

4. resolver 작성

HandlerMethodArgumentResolver를 상속받은 클래스를 구현해야 하는데
상속받을 때 두 개의 메서들 오버라이딩해야 한다.

  • supportsParameter
    지정된 메서드 매개 변수가 이 resolver에서 지원되는지 여부입니다.
  • resolveArgument
    컨트롤러 호출 직전에 호출되어서 필요한 파라미터 정보를 생성해줍니다.
    여기서는 세션에 있는 로그인 회원 정보인 member 객체를 찾아서 반환해줍니다. 이후 스프링 MVC 컨트롤러의 메서드를 호출하면서 여기에서 반환된 member 객체를 파라미터에 전달해줍니다.
@Slf4j
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        log.info("supportsParameter 실행");

        boolean hashLoginAnnotation =
                parameter.hasMethodAnnotation(Login.class);
        boolean hashMemberType =
                Member.class.isAssignableFrom(parameter.getParameterType());

        return hashLoginAnnotation && hashMemberType;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {

        log.info("resolverArgument 실행");

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
        HttpSession session = request.getSession(false);

        if(session == null){
            return null;
        }
        return session.getAttribute(SessionConst.LOGIN_MEMBER);
    }
}

5. resolver 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new LoginMemberArgumentResolver());
    }
profile
꾸준하게 Ready, Set, Go!

0개의 댓글

관련 채용 정보