[aws] 어노테이션으로 개선하기
어노테이션 기반으로 개선하기
같은 코드가 반복되는 것은 개선해야합니다.
1. IndexController
의 session
부분 어노테이션으로 개선
Annotation 생성
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginUser {
}
LoginUserArgumentResolver
라는 HandlerMethodArgumentResolver
구현체 생성
@RequiredArgsConstructor
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
private final HttpSession httpSession;
// 파라미터가 유효한 값인지 검증
@Override
public boolean supportsParameter(MethodParameter parameter) {
// 파라미터에 `LoginUser` 라는 어노테이션이 붙어있어야 합니다.
boolean isLoginUserAnnotation = parameter.getParameterAnnotation(LoginUser.class) != null;
// 파라미터의 타입이 `SessionUser`타입이어야 합니다.
boolean isUserClass = SessionUser.class.equals(parameter.getParameterType());
return isLoginUserAnnotation && isUserClass;
}
// 파라미터에 전달할 객체 생성
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
// 세션에서 "user"란 이름의 객체를 가져옵니다.
return httpSession.getAttribute("user");
}
}
WebConfig
라는 WebMvcConfigurer
구현체 생성
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(loginUserArgumentResolver);
}
}
IndexController 변경전
@GetMapping("/")
public String index(Model model){
model.addAttribute("posts", postsService.findAllDesc());
SessionUser user = (SessionUser) httpSession.getAttribute("user");
if(user != null){
model.addAttribute("username", user.getName());
}
return "index";
}
IndexController 변경후
@GetMapping("/")
public String index(Model model, @LoginUser SessionUser user){
model.addAttribute("posts", postsService.findAllDesc());
if(user != null){
model.addAttribute("username", user.getName());
}
return "index";
}
댓글남기기