기존 Controller
@RequiredArgsConstructor
@Controller
public class IndexController {
private final GamesService gamesService;
private final HttpSession httpSession;
@GetMapping("/")
public String index(Model model){
model.addAttribute("games", gamesService.findAllPaging(0,9));
SessionUser user = (SessionUser) httpSession.getAttribute("user")
if (user != null) {
model.addAttribute("userName",user.getName());
}
return "index";
}
}
유저를 사용하다가 로직을 바꾸게 된다면 Session user하나하나 찾아가면서 모두 바꿔야 하는 번거러움이 있다.
1. 어노테이션 생성
@Target(ElementType.PARAMETER) //파라미터로 선언된 객체만 사용
@Retention(RetentionPolicy.RUNTIME)//런타임까지 남아있는다.
public @interface LoginUser { //LoginUser 어노테이션 생성
}
어노테이션을 선언해서 사용할 수 있도록 생성 시켜줌.
2. Argument Resolver 생성
※ Argument Resolver: Controller에 들어오는 파라미터를 가공 하거나 (ex. 암호화 된 내용 복호화), 파라미터를 추가하거나 수정해야 하는 경우에 사용한다
@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
private final HttpSession httpSession;
@Override// @LoginUser 어노테이션이 붙어 있고, 파라미터 클래스 타입이 SessionUser 타입인 경우를 판단
public boolean supportsParameter(MethodParameter parameter){
boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
return isLoginUserAnnotation && isUserClass;
}
@Override // 파라미터에 전달할 객체를 생성
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory BinderFactory) throws Exception{
return httpSession.getAttribute("user");
}
}
3. WebConfig
LogingUserArgumentResolver가 인식 될 수 있도록 WebMvcConfigurer에 추가함
@RequiredArgsConstructor
@Configuration // 스프링에 인식할 수 있도록 MvcConfigurer 에 추가
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers){
argumentResolvers.add(loginUserArgumentResolver);
}
}
'JAVA > Spring Boot' 카테고리의 다른 글
(node.js) express 프로젝트 구조 (0) | 2021.08.31 |
---|---|
(Spring Boot) 동작 원리 (0) | 2021.08.10 |
(스프링 부트) 구글 로그인 구현 (0) | 2021.07.13 |
(Spring Boot)TestRestTemplate null request Error (0) | 2021.07.12 |
(Spring Boot)Entity에 있는 리스트 조회 제한하기 (0) | 2021.07.08 |