Spring

@RequestParam vs @ModelAttribute vs @RequestBody

dev-rootable 2023. 7. 14. 15:02

📌 @RequestParam

 

단일 데이터를 받기 위해 사용

 

클라이언트 요청의 Content-Type이 "application/json"이든 "application/x-www-form-encoded"이든 "multipart/form-data"이든 상관 없이 동일하게 key에 매칭되는 하나의 필드 값을 받을 수 있다. 

 

URL에서 파라미터를 추출하기 때문에 HTTP API처럼 직접 HTTP 바디에 데이터를 담는 경우에는 사용 불가

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(인프런) by 김영한

 

요청 파라미터 이름과 변수 이름이 같으면, @RequestParam의 name 값이 없어도 된다.

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(인프런) by 김영한

 

위 경우처럼 이름이 같은 상황에서 String, int, Integer 등 단순 타입이면 @RequestParam 생략 가능

 

@RequestParam 생략하면 Spring MVC 내부에서 required=false를 적용한다. 즉, 빈 값을 허용한다.

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(인프런) by 김영한

 

특별히 값을 지정하지 않았을 때, 기본 값을 설정하려면 defaultValue 옵션을 사용하면 된다. (빈 문자도 기본 값으로 바뀜)

 

defaultValue가 있기 때문에 required 옵션은 의미가 없다.

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(인프런) by 김영한

 

파라미터 값을  Map 또는 MultiValueMap으로 받을 수 있다.

 

출처 : 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술(인프런) by 김영한

 

동일 키에 값이 2개 이상인 경우 MultiValueMap을 사용해야 한다.

 

요청 : http://localhost:8080/request-param-map?username=hello&age=20&username=kim

 

 

📌 @ModelAttribute

 

🔎 객체 생성과 바인딩

 

요청 파라미터 값(쿼리 스트링) 또는 Form 입력 값을 객체에 바인딩할 수 있다. 해당 객체는 @ModelAttribute에서 자동으로 생성한다.

 

HTTP API처럼 직접 HTTP 바디에 데이터를 담는 경우에는 사용 불가

 

@ModelAttribute 사용 전

 

@ModelAttribute 사용 후

 

위 코드에서 객체를 생성하고, 각 요청 파라미터 값의 setter를 호출하여 값을 바인딩하는 부분을 @ModelAttribute가 수행한다. 그래서 @ModelAttribute가 지정되는 클래스는 getter, setter가 있는 Beans 클래스여야 한다.

 

타입이 맞지 않는 값을 넣으면 BindException 발생

 

🔎 뷰 전달

 

지정한 객체를 Model 객체에 자동으로 담아준다.

 

@ModelAttribute의 name 속성을 생략하면 Model 객체에 담을 때 클래스 이름의 앞글자만 소문자로 바꿔서 저장함

 

🔎 메서드 단위 사용

 

메서드에 선언하여 반환 값이 Model 객체에 자동으로 담기도록 한다.

 

컨트롤러가 호출될 때마다 사용되므로 미리 생성해두고 재사용하는 것이 더 효율적

 

@ModelAttribute의 name 속성이 key가 된다.

 

@ModelAttribute는 생략 가능하다. 그런데 @RequestParam도 생략 가능하기 때문에 생략시 따르는 규칙이 있다.

 

💡 @ModelAttribute 생략시 규칙

1. String, int, Integer 같은 단순 타입 = @RequestParam
2. 나머지 = @ModelAttribute 적용(argument resolver로 지정해둔 타입 제외)

 

📌 @RequestBody(Read HTTP Body)

 

HTTP 메시지 바디 정보를 편리하게 조회할 수 있다.

 

뷰 리졸버를 통해 뷰를 조회하지 않으며, HttpMessageConverter가 동작하여 요청 바디의 내용을 그대로 가져온다.

 

바디를 조회하는 기능은 요청 파라미터를 조회하는 @RequestParam, @ModelAttribute와 관계 없다.

 

 

References:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com