본문 바로가기

COM

[C#] RESTful API 웹 서비스(WCF) 구축하는 방법 (json, xml) [1][프로젝트 구성]

간혹 타 업체에서 웹으로 간단히 접근하여 사내 데이터를 확인할 수 있도록 API를 요청하는 경우가 있습니다.

이 경우 해야할 일은 크게 1. 데이터에 연동하는 코드부분, 2. rest api wcf 프로젝트 구현 코드부분, 3. 외부 서비스 설정 부분으로 나뉩니다.

 

해당 방법에 대해 1번은 mysql, csv(파싱해서 간단히 쓸 때)에 대한 데이터 연동 코딩은 구글링해보면 자료가 많이 나와 있으나, 2번인 wcf 프로젝트를 구성하고, 3번인 코딩 및 빌드 후 iis 인터넷 관리자를 통해 외부에 서비스를 하는 방법에 대한 자료가  인터넷 상에 부족한 듯 싶어 해당 부분에 대한 글 남깁니다.

 

 

 

요약 :

프로그램은 visual studio, 언어는 C#을 사용해 RESTful 형식의 wcf 웹 서비스를 구축하여 IIS 관리자를 이용해 외부에서 접근할 수 있도록 서비스하기.

 


 

 

 

1. visual studio에서 wcf 프로젝트 생성

 

 

설명 편의상 프로젝트 이름을 동일하게 해주세요.

wcfRestTest2

 

 


 

 

 

 

2. Web.config 코드 수정

프로젝트를 생성하면 어느정도 사용자의 편의를 위해 코드가 작성되어 있습니다.

웹서비스를 만들기 위해서는 Web.config 를 수정해줘야합니다.

 

 

<behaviors> 부터 </serviceBehaviors> 까지 삭제한 후 그 위치에 아래 코드 삽입

 

 

 

 

 

//Web.config

<services>
      <service name="wcfRestTest2.Service1" behaviorConfiguration="wcfRestTest2.Service1Behavior">
        <endpoint address="" behaviorConfiguration="wcfRestTest2.Service1Behavior" binding="webHttpBinding" contract="wcfRestTest2.IService1">
        </endpoint>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="wcfRestTest2.Service1Behavior">
          <!-- 메타데이터 정보를 공개하지 않으려면 배포하기 전에 아래 값을 false로 설정하십시오. -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- 디버깅 목적으로 오류에서 예외 정보를 받으려면 아래의 값을 true로 설정하십시오. 예외 정보를 공개하지 않으려면 배포하기 전에 false로 설정하십시오. -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="wcfRestTest2.Service1Behavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>

 

 

 

 

 

 

 

 

 


 

 

 

 

3. IService1.cs 코드 수정

 

클라이언트(타업체)가 URL을 통하여 서버(사내)로 인자를 전달해줄 수 있도록 [OperationContract] 부분을 수정해 줍니다.

 

 

 

 

 

 

 

//IService1.cs

	[OperationContract]
        [WebGet(UriTemplate = "GetData/{value}")]
        string GetData(string value);

 

 

 

 

 

 

 


 

 

 

4. Service1.svc.cs 코드 수정

 

 

3번 내용대로 IService1.cs 코드를 수정하면 Service1.svc.cs에 아래 그림처럼 코드 오류가 떠있을 겁니다.

 

 

 

 

 

 

 

 

해당 코드 오류의 원인은 함수의 파라미터 값의 형식이 달라서 생긴 오류입니다.

3번에서 우리가 IService1.cs의 GetData의 파라미터 형식을 string으로 지정해줬기 때문입니다.

따라서 파라미터 값의 형식만 맞으면 됨으로, 해당 GetData 함수의 정의 부분에 있는 파라미터를 동일하게 아래 그림처럼 string 으로 바꿔주면 코드 오류가 사라집니다.

 

(지금은 간단한 예제로 입력받은 값만 보여주는 함수가 구현되어 있는데, 각자 서버의 목적에 맞게끔(데이터 연동 등) 코딩하기 위해서는 GetData 함수 안에 각자의 목적에 맞게 코딩을 해서 사용하시면 됩니다.)

 

 

 

 

 


 

 

 

 

5. 웹서비스 실행해보기

이제 서비스 실행을 위한 기본적인 수정은 끝났습니다. 한번 실행해보겠습니다.

 

솔루션 탐색기 - Service1.svc 마우스 우클릭 - 브라우저에서 보기 클릭

 

 

 

 

 

브라우저가 뜨면 주소창에 http://localhost:4044/Service1.svc/getdata/ABC 와 같은 형식으로 입력해 보세요.

(설명 : localhost 뒤 숫자 4~5자리는 컴퓨터마다 다르고, getdata는 아까 우리가 구현한 함수의 이름이며, ABC는 파라미터 로 임의의 값을 준겁니다. 아무값이나 넣어보시면서 확인해보세요.)

 

 

아래와 같이 나오면 정상적으로 구현된 상태입니다.

 

 

 

 

 

 

 

 

 

 

이제 클라이언트에게 반환하는 객체의 형식을 string을 반환하는 XML이 아닌 자주 사용하는 json 형식으로 바꿔보도록 하겠습니다.

 

 

 


 

 

 

 

6. 데이터 반환 형식 변환하기 (string 에서 class 로)

 

 

 

 

 

//IService1.cs


	[OperationContract]
        [WebGet(UriTemplate = "GetData/{value}")]
        상품정보 GetData(string value);
   
//-----------------------------------------------------------
        
        [DataContract]
    	public class 상품정보
    	{

        [DataMember(Order = 0)]
        public string product { get; set; }

        [DataMember(Order = 1)]
        public int price { get; set; }
        
    	}

 

 

 

 

 


 

 

 

 

IService.cs 에서 함수 반환 유형이 string에서 우리가 만든 클래스인 '상품정보' 로 변경되었으니

Service1.svc.cs 에서도 마찬가지로 함수의 반환 유형을 변환해줘야 합니다.

(4번의 설명 내용과 동일합니다.)

 

 

 

 

//Service1.svc.cs

        public 상품정보 GetData(string product)
        {
            상품정보 goodsInfo = new 상품정보();
            goodsInfo.product = product;
            goodsInfo.price = 5000;


            return goodsInfo;
        }

 

 

 

 

위 코드는 클라이언트에게 받은 값(product)과 함께 5000 이라는 고정적인 변수(price)를 반환해주는 코드 입니다.

 

 

 

 


 

 

 

 

 

 

json으로 변환하기 전인 현재까지는 '상품정보' class가 어떤 형식으로 반환되는지 일단 한번 웹서비스 실행해보기

 

 

주소창에 http://localhost:40443/Service1.svc/getdata/banana 입력!

 

 

 

 

 

 

 

위 그림처럼 클래스는 위와 같은 모양의 XML 형식으로 반환됩니다.

 

이제 반환형식을 흔히 사용하는 JSON 으로 바꿔보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

//IService1.cs

        [OperationContract]
        [WebGet(UriTemplate = "GetData/{value}", ResponseFormat = WebMessageFormat.Json)]
        상품정보 GetData(string value);

 

 

 

 

 

 

 

 

 

이제 한번 실행해볼까요?

 

 

 

 

 

 

 

 

클릭!

 

 

 

주소창에 http://localhost:40443/Service1.svc/getdata/banana 입력

 

 

 

 

 

 

 

 

 

위와 같이 나오면 성공! 이제 서버 단의 코드 구현은 끝났습니다.

 

 

 

 

 

 

 

 

여기서 잠깐!

 

 

 

 

여기서 주소창에 http://localhost 는 무엇을 뜻하는 걸까요?

 

localhost란 127.0.0.1과 같은 표현이며 네트워크 안에서의 내 컴퓨터를 지칭합니다.

 

(우리가 주로 목적지를 입력하는)주소창에 입력한 http://localhost 는

즉 내가 갈 목적지가 내 컴퓨터라는 얘기인 것이죠.

 

저 주소의 의미는 곧 내 컴퓨터에 도달해 내 컴퓨터에서 제공하는 서비스를 실행해보겠다는 의미입니다.

 

 

 

 

 

 

그렇다면 클라이언트(우리 회사 데이터 확인을 원하던 타업체)에서도 지금 내가 한 것 처럼 주소창에 http://localhost 라는 주소를 입력하면 어떻게 될까요?

 

클라이언트도 마찬가지로 목적지가 서비스를 제공하는 서버가 아닌 클라이언트 컴퓨터 자신을 지칭하게 되므로, 서버가 제공하는 서비스는 확인할 수 없습니다.

 

쉽게 말해 옆집에서 서비스를 제공하는데, 클라이언트는 자기 집 대문을 계속 두드리며 서비스 내놓으라는 꼴인 것입니다.

 

그렇다면 우리의 목적인! 외부의 클라이언트가, 내가 제공하는 서비스에 접근하게 허용해주는 것은 어떻게 해야할까요?

 

간단하게 설명하자면 IIS 인터넷 관리자를 통한 설정이 필요합니다.

 

이에 관련해서는 다음 포스트인 아래 링크에서 확인 가능합니다.

 

 

https://anythingcafe.tistory.com/7

 

[C#] RESTful API 웹 서비스(WCF) 구축하는 방법 (json, xml) [2][iis(인터넷 정보 서비스)관리자 - 외부 서비

우리는 이제 "2. rest api wcf 프로젝트 구현 코드부분" 과 "3. 외부 서비스 설정 부분" 중 2번은 이전 시간에 완료한 상태입니다. (코드 구현 부분 못보신 분은 아래 링크 참조) https://anythingcafe.tistory.

anythingcafe.tistory.com

 

 

 

 

 

 

 

그냥 따라하시다 보면 이해가 잘 되시지 않으시겠지만 결국, restful api wcf 웹서비스는 결국 클라이언트에서 요청한 것을 내가 의도한(함수) 대로 값을 처리해 클라이언트에게 다시 반환해주는 것이라고 생각하시면 점차 이해가 되실 겁니다 :)

 

 

 

 

 

 


 

 

- 이상 전달 끝 -