인프런 커뮤니티 질문&답변

잘열심히님의 프로필 이미지
잘열심히

작성한 질문수

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

@ModelAttribute에 대해서 궁금한점이 있습니다.

작성

·

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

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 잘열심히님

다음을 참고해보시면 도움이 되실거에요.

https://velog.io/@0_0_yoon/%EB%A0%88%EB%B2%A83-ServletModelAttributeMethodProcessor%EA%B0%80-%EB%8F%99%EC%9E%91%ED%95%98%EB%8A%94-%EA%B3%BC%EC%A0%95

감사합니다.

잘열심히님의 프로필 이미지
잘열심히
질문자

답변 감사합니다

0

안녕하세요, 인프런 AI 인턴입니다.

잘열심히님의 질문은 @ModelAttribute가 붙어있는 파라미터와 없는 파라미터 사이에서 객체 생성 방식이 어떻게 다른지, 특히 @ModelAttribute가 붙어있을 때 객체가 어떻게 생성되는지에 대한 것 같습니다.

이와 관련하여 제시해주신 코드 및 설명을 기반으로 해당 주제에 대해 논의된 기존의 답변들을 살펴보았습니다. 아래의 질문과 답변들이 유사한 맥락의 내용을 담고 있으며, 이는 @ModelAttribute와 관련해 자세히 설명하고 있어 도움이 될 것 같습니다.

  1. @ModelAttribute가 있을 때, Model 객체 생성

    • 이 게시물에서는 @ModelAttribute 어노테이션이 파라미터에 있으면 Model 객체를 자동으로 생성하고 Model.addAttribute까지 해주는지에 대한 질문에, 강의의 김영한 강사님께서 직접 답변을 해주셨습니다. 그 내용에 따르면 Model 객체는 전체 구조에서 사용되며, RequestMappingHandlerAdapter에서 생성된다고 합니다.
  2. @ModelAttribute 어노테이션에 대해 질문 있습니다.

    • 이 질문에서는 @ModelAttribute 어노테이션이 Model에 더해지는 과정에 대해 논의되었습니다. 답변에 따르면 @ModelAttribute가 붙은 파라미터는 해당 타입의 객체를 Model에 추가하는 역할을 한다고 설명되고 있습니다.
  3. ArgumentResolver에 대해서 질문있습니다.

    • 여기에서는 HandlerMethodArgumentResolver를 직접 구현할 때 고려해야 하는 사항에 대한 질문과 그에 대한 답변을 찾을 수 있습니다. 이는 커스텀 파라미터 처리에 대한 이해를 심화하는 데 도움이 될 수 있습니다.

@ModelAttribute 어노테이션은 메서드 파라미터나 리턴 타입 앞에 붙을 수 있으며, HTTP 요청 파라미터들을 바인딩해서 모델 객체를 만들어서 넘겨주는 역할을 합니다. 스프링 MVC에서는 이 어노테이션이 붙은 파라미터에 대해서는 자동으로 모델 객체를 생성하고 요청 파라미터들을 해당 객체에 바인딩합니다. 만약 @ModelAttribute가 없는 경우에는 스프링 MVC의 HandlerMethodArgumentResolver를 통하여 파라미터에 맞는 객체를 생성해주어야 합니다.

이러한 차이는 스프링의 내부 구현에 의해 처리되는데, @ModelAttribute가 붙은 경우엔 스프링 내부의 해당 애너테이션을 처리하는 기본 HandlerMethodArgumentResolver가 작동하여 모델 객체를 생성해주는 반면, 커스텀 HandlerMethodArgumentResolver를 사용하는 경우에는 개발자가 명시적으로 해당 타입의 객체 생성 로직을 정의해주어야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

잘열심히님의 프로필 이미지
잘열심히

작성한 질문수

질문하기