Skip to content

타입 정보

Fox Web API 는 HTTP/JSON 기반의 통신 메커니즘을 사용합니다. 이 때 JSON 의 데이터 타입과 닷넷의 데이터 타입이 일치하지 않기 때문에 여러가지 문제가 발생하곤 합니다.

개요

Fox Web API 는 다음 그림과 같이 클라이언트로부터 전송된 JSON 데이터를 역직렬화하여 FoxBizRequest 혹은 FoxDataRequest 객체를 생성합니다. 이 때 매개변수를 나타내는 Parameters 컬렉션은 IDictionary<string, object> 타입으로 정의되어 있기 때문에 클라이언트가 전송한 데이터 타입을 그대로 사용합니다.

입력 JSON 과 역직렬화

예를 들어 Javascript 기반 웹 앱이 다음과 같은 JSON 으로 Fox Biz Service 를 호출한다고 가정해 봅시다.

1
2
3
4
5
6
7
{
    "classId": "MyBizClass",
    "methodId": "MyBizMethod",
    "parameters": {
        "realValue": 9.99
    }
}

이 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 타입의 매개변수를 갖는 비즈 메서드를 생각해 봅시다.

1
2
3
4
5
[FoxBizMethod]
public decimal Calculate(decimal a, decimal b)
{
    return a + b;
}

Calculate 메서드는 두 개의 decimal 타입 매개변수를 갖고 있으며 decimal 타입을 리턴합니다. 이 메서드를 Fox Web API 를 통해 호출하는 클라이언트는 다음과 같이 JSON 형식으로 요청을 전송할 수 있습니다.

const bizRequest = {
    "classId": "BizLib3.BizLogic3",
    "methodId": "Calculate",
    "parameters": {
        "a": 123.45,
        "b": 67.89
    }
};
const httpResponse = await fetch("/api/bizservice/execute", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(bizRequest)
});
const bizResponse = await httpResponse.json();
console.log("Biz Service Response:", bizResponse);

하지만 위 Javascript 코드는 ArgumentException 예외를 발생시킵니다. 왜냐하면 JSON 에서 123.45 와 67.89 는 double 타입으로 인식되기 때문입니다. Fox Biz Service 는 JSON 으로부터 FoxBizRequest 객체를 역직렬화 할 때 Parameters 컬렉션에 double 타입으로 저장하며, 이 값은 비즈 메서드의 매개변수 타입인 decimal 과 일치하지 않기 때문에 예외가 발생합니다.

Fox Biz Service 구성 설정에서 supportJsonType 속성을 true 로 설정하면 이러한 문제를 완화할 수 있습니다.

1
2
3
4
5
{
  "bizService": {
      "supportJsonType": true
  }
}

supportJsonType 속성이 true 로 지정되면 JSON 으로 전달된 값(Parameters 컬렉션에 기록된 값의 타입)과 매개변수 값 타입이 일치하지 않을 때 다음과 같은 방식으로 형변환을 시도 합니다.

  • JSON 으로 전달된 값은 ValueType 혹은 문자열 타입이어야 하며 매개변수 타입은 ref 타입이 아니어야 합니다.
  • 값 타입을 매개변수 타입에 할당이 가능해야 합니다. (IsAssignableFrom 메서드 사용)
  • Convert.ChangeType 메서드를 사용하여 값 타입을 매개변수 타입으로 변환할 수 있어야 합니다.

supportJsonType 속성이 true 로 지정되면 위 Javascript 코드와 같은 호출 뿐만 아니라 문자열을 사용하는 다음과 같은 JSON 으로도 Calcuate 메서드를 호출할 수 있습니다.

1
2
3
4
5
6
7
8
{
    "classId": "BizLib3.BizLogic3",
    "methodId": "Calculate",
    "parameters": {
        "a": "123.45",
        "b": "67.89"
    }
}

타입 정보 지원

타입 정보 설정