본문 바로가기
Back-end/멋쟁이사자처럼

[멋쟁이사자처럼] level6 구현

by 잔디🌿 2024. 4. 2.

    벌써 4주차라니!!!

     

    이번 과제는 이전에 해왔던 클론코딩을 하는 것이다.

     

    AuthArgumentResolver

     

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // TODO [6단계] parameter가 @Auth 어노테이션을 갖고 있고, 파라미터 타입이 Long.class인 경우 true를 반환하는 조건을 구현하세요.
        if (parameter.hasParameterAnnotation(Auth.class)){
            if(parameter.getParameterType().equals(Long.class)){
                return true;
            }
        }
        return false;
    }

     

    파라미터가 특정한 어노테이션을 가지고 있는지 확인할 때에는 hasParameterAnnotation(어노테이션.class)를 사용하면 된다.

    또한 파라미터의 타입을 확인하기 위해서는 getParameterType를 사용하면 된다.

     

     

    private static String extractAccessToken(NativeWebRequest request) {
        // TODO [6단계] request 헤더에서 "Authorization" 헤더 값을 추출하여 "Bearer "로 시작하는 accessToken을 반환하세요. 유효하지 않을 경우 "로그인 후 접근할 수 있습니다." 메시지와 함께 UnAuthorizedException을 발생시키는 로직을 구현하세요.
        String accessToken = request.getHeader("Authorization");
    
        if (accessToken == null || !accessToken.startsWith("Bearer ")) {
            throw new UnAuthorizedException("로그인 후 접근할 수 있습니다.");
        }
        return accessToken;
    }

     

    NativeWebRequest에서 토큰을 추출하고, 여기서 원하는 조건에 맞지 않으면 UnAuthorizedException을 발생시키는 메서드이다.

    우선 request.getHeader을 이용하여 Authorization 헤더 값을 추출한다. 

    그 다음 토큰 값이 비어있는지와 Bearer으로 시작하는지 확인한 후 맞지 않으면 에러를 발생시킨다.

     

    @Override
    public Object resolveArgument(
            MethodParameter parameter,
            ModelAndViewContainer mavContainer,
            NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory
    ) {
        // TODO [6단계] webRequest로부터 accessToken을 추출하고, jwtService를 사용하여 memberId를 추출하여 반환하는 로직을 구현하세요.
    
        String token = extractAccessToken(webRequest);
    
        token = token.substring(7); 
    
        return jwtService.extractMemberId(token);
    }

     

    여기서는 토큰을 앞서 구현했던 extractAccessToken에서 받는다. 변환된 토큰에서 Bearer을 빼기 위해 substring(7)을 하였다.

    그 다음 앞서 구현했던 jwtService내에 있는 토큰을 주면 멤버 아이디를 반환하는 메서드인 extractMemberId를 호출하여 원하는 값을 추출하였다.

     

    AuthConfig

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        // TODO [6단계] resolvers 리스트에 authArgumentResolver를 추가하세요.
        resolvers.add(authArgumentResolver);
    }

     

    리스트에 authArgumetResolver을 넣는 기능을 구현하였다. 평소대로 add를 사용하여 쉽게 구현하였다.

     

     

    완료!

     

    진짜 이렇게 보면 별로 없는데 생전 처음 접해보는 내용이라 너무 힘들었다.

    게다가 구글링 했을 때에도 별로 도움되는 자료를 찾지 못했다......

    빨리 공부를 더 깊게 해서 코드 이해를 다 할 수 있도록 해야겠다.