์๋ก
@ModelAttribute๋ฅผ ์ฌ์ฉํ์ ๋ parameter์ ๊ฐ์ ๋ฃ์ผ๋ฉด ์ ๋ฐ์์ค์ง๋ง body์ ๊ฐ์ ๋ด์ ์ ์กํ๋ฉด null๊ฐ์ด ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ์์์ต๋๋ค. ์ด๋ด ๋ @RequestBody๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ๋ฅด๊ฒ ๊ฐ์ด ์ ๋ด์์ง๋๋ฐ ์ ๊ทธ๋ฐ์ง, ๊ทธ๋ฆฌ๊ณ @ModelAttribute์ @RequestBody์ ์ฐจ์ด๋ ๋ฌด์์ธ์ง์ ๋ํด ๊ถ๊ธํ์ฌ ํ๋ฒ ์ ๋ฆฌ๋ฅผ ํด๋ณผ๊น ํฉ๋๋ค.
๋จผ์ ํด๋ผ์ด์ธํธ์์ ๋ฐ์ ์์ฒญ์ ๊ฐ์ฒด๋ก ๋ฐ์ธ๋ฉํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์๋ @RequestParam, @RequestBody, @ModelAttribute ์ด ์ธ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
๊ณตํต์ ์ธ ์๋์ ๊ฐ์ DTO๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฒ ๊ฐ๊ฐ์ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import lombok.Data;
@Data
public class TestData {
String name;
int age;
}
1. @RequestParam
@RequestParam์ ๊ฐ๊ฐ์ HTTP ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ Body๋ฅผ ์ง์ ์กฐํํ์ง ์์ต๋๋ค.
@ResponseBody
@PostMapping("test/request-param")
public TestData requestParam(@RequestParam String name,
@RequestParam int age) {
TestData testData = new TestData();
testData.setName(name);
testData.setAge(age);
return testData;
}
์ ์ฝ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Postman์ ์ด์ฉํด Parameter์ ๊ฐ์ ๋ฃ์ด ํ ์คํธ๋ฅผ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
์์ํ๋ ๋๋ก name๊ณผ age๋ผ๋ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ๋ด์์ ์ ์กํ๋๋ ์ฌ๋ฐ๋ฅด๊ฒ @ResponseBody๋ฅผ ๊ฑฐ์ณ ์ฌ๋ฐ๋ฅด๊ฒ JSONํ์์ผ๋ก ๊ฐ์ด ๋ด๊ฒจ์ ์์ต๋๋ค.
2. @RequestBody
@RequestBody๋ ํด๋ผ์ด์ธํธ๊ฐ ์ ์กํ๋ JSON(application/json) ํํ์ HTTP Body ๋ด์ฉ์ Java Object๋ก ๋ณํ์์ผ ์ฃผ๋ ์ญํ ์ ํฉ๋๋ค. ๊ฐ์ฅ ํฐ ํน์ง์ ๋ฐ์ธ๋ฉ์ด ์๋ ๋ณํ์ ์ํค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ณ์๋ค์ Setter ํจ์๊ฐ ์์ด๋ ์ ์์ ์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
@ResponseBody
@PostMapping("/test/request-body")
public TestData requestBody(@RequestBody TestData testData) {
return testData;
}
์์ ๊ฐ์ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก Postman์ ์ด์ฉํ์ฌ Body์ JSONํํ๋ก ๊ฐ์ ๋ฃ์ด ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ ์กํด ๋ณด์์ต๋๋ค.
์์ํ๋ ๋๋ก Body์ JSON ํ์์ผ๋ก name๊ณผ age๋ฅผ ๋ด์์ ์ ์กํ๋๋ ์ฌ๋ฐ๋ฅด๊ฒ @ResponseBody๋ฅผ ๊ฑฐ์ณ ์ฌ๋ฐ๋ฅด๊ฒ JSONํ์์ผ๋ก ๊ฐ์ด ๋ด๊ฒจ์ ์์ต๋๋ค.
3. @ModelAttribute
๊ทธ๋ ๋ค๋ฉด ์๋ก ์์ ์ธ๊ธํ๋ค์ํผ ๊ฐ์ฅ ๊ถ๊ธํ๋ @ModelAttribute์ ๋๋ค. ํ ์คํธํด ๋ณผ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง์ ๋๋ค.
- Parameter์ ๊ฐ์ ๋ฃ์ด ์ ์กํด ๋ณธ๋ค.
- Body์ ๊ฐ์ ๋ฃ์ด ์ ์กํด ๋ณธ๋ค.
@ResponseBody
@PostMapping("/test/model-attribute/param")
public TestData modelAttributeParam(@ModelAttribute TestData testData) {
return testData;
}
@ResponseBody
@PostMapping("/test/model-attribute/body")
public TestData modelAttributeBody(@ModelAttribute TestData testData) {
return testData;
}
์ฒซ ๋ฒ์งธ๋ก ์๋์ ๊ฐ์ด Paramater์ ๊ฐ์ ๋ฃ์ด์ ์ ์กํด ๋ณด์์ต๋๋ค.
parameter์ ๋ฃ์ ๊ฐ๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ JSONํ์์ผ๋ก Body์ ๋ฐํ๋์์ต๋๋ค.
๋ ๋ฒ์งธ๋ก๋ ์๋์ ๊ฐ์ด Body์ ๊ฐ์ ๋ฃ์ด์ ์ ์กํด ๋ณด์์ต๋๋ค.
์์๊ณผ๋ ๋ฌ๋ฆฌ name = null, age = 0 ์ฆ ๊ฐ์ด ๋ด๊ธฐ์ง ์์์ต๋๋ค. ์ด๋ป๊ฒ ๋ ๊ฒ์ผ๊น์? @ModelAttribute์์๋ Body๋ฅผ ์ด์ฉํด ์ ์กํ๋ ค๋ฉด Content-Type์ application/json์ด ์๋ multipart/form-data ํํ๋ก ์ ์กํด์ผ๋ง ํฉ๋๋ค.
๋ฐ๋ผ์ ํ๋ฒ Content-Type์ multipart/form-data ํํ๋ก ๋ฐ๊พผ ๋ค ํ ์คํธ๋ฅผ ์งํํด ๋ณด์์ต๋๋ค.
์ด์ ์ผ ์์ํ๋ ๋๋ก name๊ณผ age์ ๊ฐ์ด ๋ด๊ฒจ์ ๋ฐํ๋์์ต๋๋ค.
์ ๋ฆฌ
๋ฐ์ธ๋ฉ ์ข ๋ฅ | ํน์ง |
@ModelAttribute | - ๋ณํ์ด ์๋ ๋ฐ์ธ๋ฉ์ ์ํค๊ธฐ ๋๋ฌธ์ ๋ณ์๋ค์ Setter ํจ์๊ฐ ์์ผ๋ฉด ์ ์ฅ๋์ง ์๋๋ค. - @ModelAttribute๋ฅผ ์ฌ์ฉํ์ฌ HTTP Body์ ๋ด์ฉ์ ๋ด๊ธฐ ์ํด์๋ multipart/form-data ํ์์ผ๋ก ์ ์กํด์ผ ํ๋ค. - HTTP ํ๋ผ๋ฏธํฐ๋ค์ Setter๋ฅผ ํตํด ์ผ๋์ผ ๊ฐ์ฒด์ ๋ฐ์ธ๋ฉํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ค. - @ModelAttribute์๋ ๋งคํ์ํค๋ ํ๋ผ๋ฏธํฐ์ ํ์ ์ด ๊ฐ์ฒด์ ํ์ ๊ณผ ์ผ์นํ๋์ง๋ฅผ ํฌํจํ ๋ค์ํ ๊ฒ์ฆ(Validation) ์์ ์ด ์ถ๊ฐ์ ์ผ๋ก ์งํ๋๋ค. |
@RequestParam | - @RequestParam์ 1๊ฐ์ HTTP ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค. |
@RequestBody | - @RequestBody๋ก ๋ฐ์ ๋ฐ์ดํฐ๋ Spring์์ ๊ด๋ฆฌํ๋ MessageConverter๋ค ์ค ํ๋์ธ MappingJackson2 HttpMessageConverter๋ฅผ ํตํด Java ๊ฐ์ฒด๋ก ๋ณํ๋๋ค. - Spring์ ๋ฉ์์ง๋ฅผ ๋ณํํ๋ ๊ณผ์ ์์ ๊ฐ์ฒด์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๋ด๋ถ์ ์ผ๋ก Reflection์ ์ฌ์ฉํด ๊ฐ์ ํ ๋นํ๋ฏ๋ก @RequestBody์๋ ๊ฐ์ ์ฃผ์ ํ๊ธฐ ์ํ ์์ฑ์๋ Setter๊ฐ ํ์ ์๋ค. |
'BackEnd๐ฑ > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ๊ฐ์ฒด๋ณต์ฌ BeanUtils.copyProperties (0) | 2022.05.15 |
---|---|
[Spring] properties encoding ํ๊ธฐ(๊ตญ์ ํ ํ๊ธ๊นจ์ง) (0) | 2022.04.27 |
[Spring] DAO์ DTO์ ์ฐจ์ด ๊ทธ๋ฆฌ๊ณ VO (0) | 2022.04.14 |
[Spring] @NoArgsConstructor, @RequiredArgsConstructor, @RequiredArgsConstructor (0) | 2022.03.30 |
[Spring] logging ์ ๋ํด ์์๋ณด์ (1) | 2022.03.21 |
[Spring] JUnit5์์์ Exception ์ฒ๋ฆฌ (0) | 2022.03.19 |
๋๊ธ