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

김허수님의 프로필 이미지
김허수

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

정리

@ModelAttribute와 html/text에 대하여 질문이 있습니다.

해결된 질문

작성

·

320

·

수정됨

0


[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

  1. 컨버전 서비스는 @RequestParam, @ModelAttribute, @PathVariable, 뷰 템플릿에 적용된다는 내용에 궁금증이 생겨 질문을 드립니다. @ModelAttribute는 @RequestParam의 기능에서 객체를 생성하고 model에 담는 기능이 추가되었다고 생각했었습니다. 이렇게 객체가 생성될 때 컨버전 서비스가 작용되는 걸까요? 하지만, String을 다른 타입으로 바꾸어 받을 수 있는 @PathVariable이나 @RequestParam과는 달리 객체를 생성하거나 set하는 @ModelAttribute는 컨버전과 관계가 없게 느껴집니다. 어떤 경우 @ModelAttribute에도 컨버전 서비스가 적용되는 것인가요?

  2. html/form형식에서 post방식을 통해 http요청의 바디에 데이터가 들어온다고 학습하였습니다. 이때 데이터가 바디에있지만 @ResponseBody가 아닌 마치 get방식처럼 @RequestParam, @ModelAttribute을 이용해야 하는 것은 스프링의 api때문으로 이해하면 될까요?

답변 2

1

안녕하세요. 김허수님, 공식 서포터즈 y2gcoder입니다.

 

  1. ModelAttribute로 받은 객체의 각 단일 필드에서의 변환에 컨버젼 서비스가 필요합니다. @RequestParam에서 언급하셨던 것과 같이 String으로 들어온 숫자 값을 int 필드에 담고자할 때 컨버젼 서비스를 사용한다고 이해해주시면 감사하겠습니다.

  2. 이부분은 뇌피셜이기는 하나 application/x-www-form-urlencoded 형식으로 인코딩된 POST의 폼 데이터와 GET의 쿼리 파라미터가 모두 key=value 쌍으로 구성되고 &로 쌍을 구분한다는 형식의 유사성 때문이 아닐까 싶습니다. 처리하는 방식이 유사하기 때문에 GET 과 POST 의 데이터를 모두 @RequestParam, @ModelAttribute로 처리하게 된 것 같습니다! 반면에 @RequestBody는 요청 바디에 그대로 값을 적는 방식이고 위에서 말한 application/x-www-form-urlencoded 의 폼 데이터나 쿼리 파라미터와는 다른 형식이기 때문에 위의 두가지와 다르게 처리해줘야 할 필요성이 있어 @RequestBody를 따로 둔 것이 아닐까 생각합니다.

 

감사합니다.

김허수님의 프로필 이미지
김허수
질문자

답변 정말 감사합니다!

말씀하신 대로 ModelAttribute에서 필드가 String이 아닐경우 컨버전서비스 객체가 개입하겠네요!

실험해보니 ModelAttribute의 대상 객체 내부 필드에 사용자의 임의의 객체가 있는 경우 컨버전을 등록하지 않으면 사용할 수 없음을 확인할 수 있었습니다.

 

(2024-01-03T18:43:20.472+09:00 WARN 3476 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.String hello.typeconverter.controller.ConverterController.myTest(hello.typeconverter.mytest.MyAttributedClass): [Field error in object 'myAttributedClass' on field 'customInstanceInField': rejected value [123]; codes [typeMismatch.myAttributedClass.customInstanceInField,typeMismatch.customInstanceInField,typeMismatch.hello.typeconverter.mytest.CustomInstanceInField,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [myAttributedClass.customInstanceInField,customInstanceInField]; arguments []; default message [customInstanceInField]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'hello.typeconverter.mytest.CustomInstanceInField' for property 'customInstanceInField'; Cannot convert value of type 'java.lang.String' to required type 'hello.typeconverter.mytest.CustomInstanceInField' for property 'customInstanceInField': no matching editors or conversion strategy found]] ]

)

 

2번에 대한 질문도 좋은 답변이 됐습니다. 감사합니다!

0

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

질문하신 내용은 ‘@ModelAttribute’와 관련된 내용인 것 같습니다. @ModelAttribute가 어떻게 동작하는지, 컨버전 서비스가 어떻게 적용되는지에 대해 궁금해 하시는 것으로 보입니다. 또한, HTML 폼에서 POST 방식을 통해 데이터를 전송할 때 @ModelAttribute@RequestParam의 사용에 대해 문의하셨습니다.

다행히 이와 관련된 내용을 설명하는 기존 답변을 찾을 수 있었습니다. 아래의 링크를 참고하시면 @ModelAttribute와 컨버전 서비스에 대한 설명을 확인하실 수 있을 것입니다.

또한, @ModelAttribute의 작동 방식과 HTTP 요청에 바디가 있을 때 @RequestParam, @ModelAttribute 사용에 대한 답변은 아래 링크에서 추가적으로 확인하실 수 있습니다.

위 링크들을 참고하시면 궁금증을 해결하는데 도움이 될 것입니다.

김허수님의 프로필 이미지
김허수

작성한 질문수

질문하기