로그인 애노테이션 만들어보기

CJY·2023년 4월 9일
0

스프링

목록 보기
12/14

HomeController

홈페이지에 들어온 사용자를 로그인한 사용자와 비로그인 사용자를 구분하기 쉽게 코드를 짜고싶다. 요청 매핑 핸들러 어뎁터의 기능을 활용해보자.

@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 뒤의 클래스 정보가 무엇인지도 확인하는 작업도 있다.

@Login 애노테이션 생성

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}

@Target(ElementType.PARAMETER): 파라미터에만 적용
@Retention(RetentionPolicy.RUNTIME): 런타임까지 애노테이션 정보가 남아있다. 이 애노테이션에 대해서는 다른 글에서 더 알아보자.

로그인 argument resolver 생성

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("내가 정한 세션이름");
	}
}
  • supportsParameter()을 통해 애노테이션이 붙었는지와 파라미터 타입에 대한 검사를 한다.
  • 만약 supportParameter()을 통과하면 argument resolve를 실행한다.
  • resolveArgument()에 로직을 넣으면 되는데 지금은 로그인 회원에 대한 정보를 세션을 통해 받아오는 것이다.

WebMvcConfigurer

이제 내가 만든 argumentResolver를 등록해주면 된다.

@Configuration
public class 나의웹콘피그 implements WebMvcConfigurer {

	@Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    	resolvers.add(new 나의로그인아규먼트리졸버());
	}
}

정리

이 과정이 로그인 처리하는데 있어 필수과정은 아니지만 한번 애노테이션을 이렇게 만들어놓으면 앞으로 로그인 여부와 관련한 컨트롤러를 생성할 때 쉽게 처리할 수 있다. 프로젝트의 확장성을 생각하면 좋은 선택지가 될 것 같다.

profile
열심히 성장 중인 백엔드

0개의 댓글