일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 아규먼트 리졸버
- 터미널 실행
- intellij 속도 향상
- 할일관리
- 테이블항목
- Gradle - Groovy
- Gradle - Kotlin
- 쿼리에러
- 어노테이션
- 파이썬
- create 모드
- ERD 수정
- jpa 연관관계
- restful api 명세서
- 데이터베이스
- auto ddl
- 연관관계
- sendError()
- Intellij terminal jar
- jpa
- restful 카멜케이스
- restful api 작성 방법
- logout http 메소드
- 테이블구성
- springboot mysql
- SpringBoot개인프로젝트
- restful login 메소드
- initializr
- springboot
- 알고리즘
- Today
- Total
리나 Dev토리
@SessionAttribute(name="userId", required = false)를 간결하게 본문
@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 강의