์์ฒญ ๋ฐ์ด๋์ ๋ชจ๋ ๊ด๋ จ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ ค๊ณ ํฉ๋๋ค.
์ด๋ฐ ํ๋์ ์์ํด๋ด
[HttpPost({id})]
public virtual async Task<IActionResult> Post(PostRequest model)
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
public class PostRequest
{
[FromRoute]
public int Id { get; set; }
[FromHeader]
public string SomeHeader { get; set; }
[FromBody]
public int Foo { get; set; }
[FromBody]
public string Bar { get; set; }
[FromBody]
public string Baz { get; set; }
}
๋ถํํ๋ ์ฌ๋ฌ [FromBody]
๋ ํ์ฉ๋์ง ์์ต๋๋ค.
ํ์ฉ๋๊ณ ์์๋๋ก ์๋ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ผ๋ฐ CRUD ์ปจํธ๋กค๋ฌ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
[HttpPost({id})]
public virtual async Task<IActionResult> Post(PostRequest model)
{
var command = _mapper.Map<TCommand>(model); // AutoMapper
await _mediator.Send(command); // MediatR
// omitted for brevity
return Created();
}
๋ถ๋ช
ํ ๊ทธ๋ ๊ฒ ๋ณด์ด์ง๋ ์์ ๊ฒ์
๋๋ค.
์์ด๋์ด๋ API/MVC์ ๊ด๋ จ๋์ง ์์ ์ปจํธ๋กค๋ฌ์์ ๋ชจ๋ ๋ก์ง์ ์ ๊ฑฐํ๋ ๊ฒ์
๋๋ค. ๊ทธ๋์ ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ ์ผ์
์ด์ ๋ชจ๋ CRUD ์ปจํธ๋กค๋ฌ ์๊ตฌ ์ฌํญ์ ๋ํด ํ๋์ ๊ตฌํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งค์ฐ ๊ธฐ๋ปค์ต๋๋ค!
[FromBody]
ํ์๋ ์์ต๋๋ค. ๋ค๋ฅธ ์์ฑ์ผ ์ ์์ต๋๋ค. [FromBodyPart]
, [BindFromBody]
๋๋ ์์ ํ ๋ค๋ฅธ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๊ฒ ๊ฐ๋ฅํ ๊น์?
๊ธฐ๋ฅ ์์ฒญ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค ๊ณํ ๊ธฐ๊ฐ ๋์ ์ด ๊ธฐ๋ฅ์ ๊ณ ๋ คํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ด ๋ฌธ์ ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ด๊ฐ ์ฌ์ ํ ์ฌ๊ธฐ์์ ๋๋ตํ์ง ๋ชปํ ๋์ SO ์ง๋ฌธ์ ๋ํ ํด๊ฒฐ์ฑ
์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
https://stackoverflow.com/questions/44261111/how-to-model-bind-path-segment-to-object-property
์ฐ๋ฝ ํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค.
์ด ์ง๋ฌธ์ ์ฌํ๊ฐํ ํ ์ฐ๋ฆฌ๋ ํ๋ ์์ํฌ์์ ๋ฐ๋ฅด๋ ค๋ ์์น๊ณผ ์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๊ธฐ๋ฅ ์์ฒญ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค ๊ณํ ๊ธฐ๊ฐ ๋์ ์ด ๊ธฐ๋ฅ์ ๊ณ ๋ คํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ด ๋ฌธ์ ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.