리나 Dev토리

@SessionAttribute(name="userId", required = false)를 간결하게 본문

SpringBoot 개인플젝(TodayMaker)

@SessionAttribute(name="userId", required = false)를 간결하게

리나lina 2023. 4. 19. 00:25

서블릿 세션을 적용하고

세션 정보를 가져오는 방법들이 여러 가지 있다.

1. HttpServletRequest에서 세션 정보 가져오기

2. @SessionAttribute에서 세션 정보 가져오기

3. 어노테이션을 생성하고 ArgumentResolver 만들기

 

하위 단계부터 적용해보며, 불편함을 느낄 때 코드를 업그레이드 해보았다.

1. HttpServletRequest

HttpServletRequest 는 웹 브라우저에서 서버로 요청을 보낼때 사용된다.

- HttpServletRequest 가 HTTP 요청 정보를 서블릿에게 전달한다. 

- 그래서 요청 메세지에 있는 header나 Body에 있는 내용, session, cookie 등 정보를 알 수 있다, 

 

위에서 if(session == null) 이면 login 페이지로 가게 해주거나

서블릿 필터 LoginCheck 필터를 만들어서

whiteList가 아닌 페이지는 세션이 없으면 알아서 로그인페이지로 가게 해주었다.

 

2. @SessionAttribute

스프링에서 세션을 더 편하게 사용하게 해주는 어노테이션이다.

할일 추가 페이지를 보여줄 때 

로그인 안한 사용자는 필터에서 걸려서 접속할 수 없고

로그인한 유저만 접속할 수 있다.

세션 정보에서 userId 정보를 받아 user객체를 찾아 주었다.

이 방법이 1번 방법보다 편리하게 해주지면,

그래도 파라미터에 길게 들어가게 되는 단점이 있다.

 

그래서 ArgumentResolver를 사용하면 좀더 간결하게 로그인 회원 정보를 가져올 수 있다.

 

3. ArgumentResolver

3-1. Login 이라는 어노테이션 클래스를 만든다.

@Target(ElementType.PARAMETER) 는 매개변수에 대해 이 어노테이션을 사용할 수 있다는 뜻이고

@Retention(RetentionPolicy.RUNTIME) 는 어노테이션을 언제까지 유지할 지 정책이다. 

정책 종류는 3개가 있다.

- RetentionPolicy.SOURCE: 소스 코드에서만 유지됩니다.
- RetentionPolicy.CLASS: 클래스 파일에만 유지됩니다.
- RetentionPolicy.RUNTIME: 런타임 시에도 유지됩니다.

 

3-2. 아규먼트 리졸버 만들기

@Slf4j
public class LoginArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {  //파라미터 지원 여부
        log.info("supportsParameter 실행");

        boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);  //@Login 있는지 여부
        boolean hasLongType = Long.class.isAssignableFrom(parameter.getParameterType());  //Long타입인지 여부
        return hasLoginAnnotation && hasLongType;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, //파라미터 처리
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        log.info("resolveArgument 실행");

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();  //요청객체 가져오기
        HttpSession session = request.getSession(false);  //세션 가져오기
        if(session == null){  //세션이 없으면 null 반환
            return null;
        }
        return session.getAttribute("userId");
    }
}

3-3. WebConfig에 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public FilterRegistrationBean loginCheckFilter(){
		...
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new LoginArgumentResolver());
    }
}

3-4. 컨트롤러에 적용

적용 후 코드가 보다 간결해졌다.

 

 

 

참고: 인프런 김영한님 MVC2 강의

Comments