어노테이션 기반으로 개선하기

같은 코드가 반복되는 것은 개선해야합니다.

1. IndexControllersession 부분 어노테이션으로 개선

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";
    }

댓글남기기