타입 정보¶
Fox Web API 는 HTTP/JSON 기반의 통신 메커니즘을 사용합니다. 이 때 JSON 의 데이터 타입과 닷넷의 데이터 타입이 일치하지 않기 때문에 여러가지 문제가 발생하곤 합니다.
개요¶
Fox Web API 는 다음 그림과 같이 클라이언트로부터 전송된 JSON 데이터를 역직렬화하여 FoxBizRequest 혹은 FoxDataRequest 객체를 생성합니다. 이 때 매개변수를 나타내는 Parameters 컬렉션은 IDictionary<string, object> 타입으로 정의되어 있기 때문에 클라이언트가 전송한 데이터 타입을 그대로 사용합니다.
예를 들어 Javascript 기반 웹 앱이 다음과 같은 JSON 으로 Fox Biz Service 를 호출한다고 가정해 봅시다.
이 JSON 은 FoxBizRequest 객체로 역직렬화 되며 Parameters 컬렉션의 realValue 키에 대한 값은 double 타입의 9.99 로 역직렬화 됩니다. JSON 은 실수 타입으로 double 타입을 사용하기 때문입니다.
한편, Parameters 컬렉션의 값들을 최종적으로 소비하는 Fox Biz/Data Service 는 실수 타입으로 double 뿐만 아니라 float, decimal 타입도 사용할 수 있습니다. 만약 비즈 메서드의 매개변수 타입이 double 이 아닌 decimal 인 경우 매개변수 타입 불일치 오류가 발생합니다.
Note
ASP.NET Web API 와 같은 환경에서는 Web API 메서드의 매개변수 타입이나 엔티티의 속성 타입을 역직렬화 시점에서 알 수 있기 때문에 역직렬화 도중에 형변환을 시도할 수 있습니다. 하지만 Fox Biz/Data Service 의 환경에서는 역직렬화 시점에서 매개변수에 대한 데이터 타입을 아직 알 수 없기 때문에 이러한 문제가 발생되곤 합니다.
JSON 타입 지원¶
HTML 기반 웹 앱은 Javascript 로 작성되며 Javascript 의 데이터 타입은 JSON 과 크게 다르지 않습니다. 따라서 웹 앱 클라이언트가 Fox Web API 를 통해 백엔드 상의 닷넷 기반 Fox Biz/Data Service 를 호출할 때 데이터 타입 호환성 문제를 겪는 경우가 많습니다. 예를 들어, JSON 에서 decimal 타입은 지원하지 않기 때문에 백엔드 비즈니스 로직에서 decimal 타입을 사용하는 경우 형 변환 문제가 발생하곤 합니다.
이러한 문제를 간단하게 해결하기 위해 Fox Biz Service 는 구성 설정 속성 supportJsonType 을 제공합니다. 이 속성을 true 로 설정하면 Fox Biz Service 의 바인더는 JSON 으로 전달된 값이 비즈니스 로직 메서드의 매개변수 값 타입이 일치하지 않을 때 자동으로 형 변환을 시도합니다.
다음과 같이 decimal 타입의 매개변수를 갖는 비즈 메서드를 생각해 봅시다.
Calculate 메서드는 두 개의 decimal 타입 매개변수를 갖고 있으며 decimal 타입을 리턴합니다. 이 메서드를 Fox Web API 를 통해 호출하는 클라이언트는 다음과 같이 JSON 형식으로 요청을 전송할 수 있습니다.
하지만 위 Javascript 코드는 ArgumentException 예외를 발생시킵니다. 왜냐하면 JSON 에서 123.45 와 67.89 는 double 타입으로 인식되기 때문입니다. Fox Biz Service 는 JSON 으로부터 FoxBizRequest 객체를 역직렬화 할 때 Parameters 컬렉션에 double 타입으로 저장하며, 이 값은 비즈 메서드의 매개변수 타입인 decimal 과 일치하지 않기 때문에 예외가 발생합니다.
Fox Biz Service 구성 설정에서 supportJsonType 속성을 true 로 설정하면 이러한 문제를 완화할 수 있습니다.
supportJsonType 속성이 true 로 지정되면 JSON 으로 전달된 값(Parameters 컬렉션에 기록된 값의 타입)과 매개변수 값 타입이 일치하지 않을 때 다음과 같은 방식으로 형변환을 시도 합니다.
- JSON 으로 전달된 값은
ValueType혹은 문자열 타입이어야 하며 매개변수 타입은ref타입이 아니어야 합니다. - 값 타입을 매개변수 타입에 할당이 가능해야 합니다. (
IsAssignableFrom메서드 사용) Convert.ChangeType메서드를 사용하여 값 타입을 매개변수 타입으로 변환할 수 있어야 합니다.
supportJsonType 속성이 true 로 지정되면 위 Javascript 코드와 같은 호출 뿐만 아니라 문자열을 사용하는 다음과 같은 JSON 으로도 Calcuate 메서드를 호출할 수 있습니다.
