바인딩(Binding)은 Web API가 컨트롤러의 액션 메서드를 호출할 때 해당 메서드의 매개변수에 값을 설정하는 과정을 의미합니다.
Web API는 매개변수의 타입에 따라 서로 다른 방식으로 값을 바인딩하며, 필요에 따라 이 기본 동작을 사용자가 직접 변경(커스터마이징)할 수도 있습니다.
기본 바인딩 규칙
매개변수가 단순 타입(simple type), 즉 int, bool, double 같은 기본형이라면 Web API는 URI(라우트 데이터 또는 쿼리 스트링)에서 값을 가져오려고 시도합니다.
반면 매개변수가 복합 타입(complex type), 예를 들어 Customer나 Employee 같은 클래스라면 Web API 프레임워크는 요청 본문(request body)에서 값을 가져오려고 시도합니다.
이러한 기본 동작은 [FromBody]와 [FromUri] 특성(Attribute)을 사용하여 얼마든지 변경할 수 있습니다.
단순 타입의 판별 기준
여기서 말하는 단순 타입에는 double, DateTime, GUID, string처럼 .NET의 기본 형식(primitive type)뿐만 아니라, 문자열(String)로부터 변환될 수 있는 모든 타입이 포함됩니다.
예제: 단순 타입 바인딩
public Student Get(int id){}예제: 복합 타입 바인딩
매개변수가 복합 타입이라면 Web API는 메시지 본문(message body)에서 값을 바인딩하려고 시도합니다.
public Student Post(Employee employee){}[FromUri] 특성
기본적으로 복합 타입은 요청 본문에서 읽히지만, [FromUri] 특성을 매개변수에 추가하면 Web API가 URI(쿼리 스트링)에서 복합 타입의 값을 읽도록 강제할 수 있습니다.
예제
public Student Get([FromUri] Employee employee)
public HttpResponseMessage Get([FromUri] Employee employee) { ... }[FromBody] 특성
반대로 [FromBody] 특성을 사용하면 단순 타입의 값을 URI가 아닌 요청 본문에서 읽도록 강제할 수 있습니다. 이는 기본 동작과 정반대의 결과를 만듭니다.
아래 예제에서 Web API는 미디어 타입 포매터(media-type formatter)를 사용해 요청 본문에서 name 값을 읽어옵니다.
주의 사항
하나의 액션 메서드에는 [FromBody] 특성을 여러 번 사용할 수 없습니다. 즉, 단일 액션에서는 요청 본문으로부터 오직 하나의 매개변수만 바인딩할 수 있습니다.
예제
public Student Post([FromBody] string name){...}
public HttpResponseMessage Post([FromBody] string name) { ... }정리
ASP.NET Web API의 매개변수 바인딩은 매개변수 타입에 따라 자동으로 결정되지만, [FromUri]와 [FromBody] 특성을 활용하면 값이 읽혀지는 위치를 명시적으로 제어할 수 있습니다. 복잡한 조회 조건을 URL로 전달해야 할 때는 [FromUri], 보안상 민감하거나 크기가 큰 데이터를 전송할 때는 [FromBody]를 적절히 활용하는 것이 좋습니다.