JAVA/Spring Boot

(스프링 부트) 커스텀어노테이션으로 중복코드 방지

ri5 2021. 7. 14. 15:28

기존 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);
    }
}