작성
·
269
0
@GetMapping("/nonModelAttribute")
public void getList(Page page) {
}
@GetMapping("/modelAttribute")
public void getList(Model model,@ModelAttribute Page page) {
}
@Slf4j
@Component
public class PageArgumentResolver implements HandlerMethodArgumentResolver{
@Override
public boolean supportsParameter(MethodParameter parameter) {
// TODO Auto-generated method stub
return parameter.getParameterType().equals(Page.class);
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return null;
}
}
강의에서 위 두개가 같다고 하셨는데 위의
/nonModelAttribute의 요청의 경우 Page 객체의 경우에는 Argument에서 객체를 만들지않으면 아예 null이 들어오기때문에 ArgumentResolver를 통해서 객체가 생성이 된다는것을 알수있는데
/modelAttribute의 경우에는 해당 부분에서 객체를 생성하지않아도 객체가 생성이 되던데 두개의 차이점이 있는건가요?? 그리고 만약에 차이가 있다면 ModelAttribute의 객체는 어디서 생성이 되는건가요?
답변 2
1
0
안녕하세요, 인프런 AI 인턴입니다.
잘열심히님의 질문은 @ModelAttribute
가 붙어있는 파라미터와 없는 파라미터 사이에서 객체 생성 방식이 어떻게 다른지, 특히 @ModelAttribute
가 붙어있을 때 객체가 어떻게 생성되는지에 대한 것 같습니다.
이와 관련하여 제시해주신 코드 및 설명을 기반으로 해당 주제에 대해 논의된 기존의 답변들을 살펴보았습니다. 아래의 질문과 답변들이 유사한 맥락의 내용을 담고 있으며, 이는 @ModelAttribute
와 관련해 자세히 설명하고 있어 도움이 될 것 같습니다.
@ModelAttribute가 있을 때, Model 객체 생성
@ModelAttribute
어노테이션이 파라미터에 있으면 Model 객체를 자동으로 생성하고 Model.addAttribute
까지 해주는지에 대한 질문에, 강의의 김영한 강사님께서 직접 답변을 해주셨습니다. 그 내용에 따르면 Model 객체는 전체 구조에서 사용되며, RequestMappingHandlerAdapter
에서 생성된다고 합니다.@ModelAttribute 어노테이션에 대해 질문 있습니다.
@ModelAttribute
어노테이션이 Model에 더해지는 과정에 대해 논의되었습니다. 답변에 따르면 @ModelAttribute
가 붙은 파라미터는 해당 타입의 객체를 Model에 추가하는 역할을 한다고 설명되고 있습니다.HandlerMethodArgumentResolver
를 직접 구현할 때 고려해야 하는 사항에 대한 질문과 그에 대한 답변을 찾을 수 있습니다. 이는 커스텀 파라미터 처리에 대한 이해를 심화하는 데 도움이 될 수 있습니다.@ModelAttribute
어노테이션은 메서드 파라미터나 리턴 타입 앞에 붙을 수 있으며, HTTP 요청 파라미터들을 바인딩해서 모델 객체를 만들어서 넘겨주는 역할을 합니다. 스프링 MVC에서는 이 어노테이션이 붙은 파라미터에 대해서는 자동으로 모델 객체를 생성하고 요청 파라미터들을 해당 객체에 바인딩합니다. 만약 @ModelAttribute
가 없는 경우에는 스프링 MVC의 HandlerMethodArgumentResolver
를 통하여 파라미터에 맞는 객체를 생성해주어야 합니다.
이러한 차이는 스프링의 내부 구현에 의해 처리되는데, @ModelAttribute
가 붙은 경우엔 스프링 내부의 해당 애너테이션을 처리하는 기본 HandlerMethodArgumentResolver
가 작동하여 모델 객체를 생성해주는 반면, 커스텀 HandlerMethodArgumentResolver
를 사용하는 경우에는 개발자가 명시적으로 해당 타입의 객체 생성 로직을 정의해주어야 합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
답변 감사합니다