NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET 매크로 프로그램 만들기. (웹서비스 / RESTful API 만들기)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 오늘부터 웹관련 자동화 액션들을 하나씩 추가할 예정인데요. 이 액션들이 매크로 프로그램에서 GUI를 가진다 하더라도 어느정도는 웹 기반 지식은 필요합니다. 왜냐혀면, 흔히 사용하는 용어들과 설정 방법들이 일반적인 윈도우 환경과는 다르기 때문입니다. 개발자도 CS 프로그램만 다루던 개발자가 웹 개발을 하게 되면 다시 배워야 하는것처럼, 같은 언어를 사용한다 하더라도 프론트엔드를 제어하는 방법이 아예 다르기 때문입니다.

     

    일단, 우리가 개발할 웹서비스가 무엇인지 알아야겠죠? 요즘은 웹서비스는 잘 안만들고, 거의 RESTful로 만드는 추세입니다. 요즘이라고 하긴 좀 그렇네요. 이미 오래되었으니까요. 웹 서비스(Web Service)는 네트워크 상에서 서로 다른 종류의 컴퓨터들 간에 상호작용을 하기 위한 소프트웨어 시스템입니다. 웹 서비스는 서비스 지향적 분산 컴퓨팅 기술의 일종으로, 프로토콜 스택은 SOAP, WSDL, UDDI 등등 종류가 많습니다. 모든 메시징에 XML이 사용되어 상호운용성이 높지만, 요즘은 잘 사용하지 않는 기술입니다.

     

    기존의 분산 컴퓨팅 기술들인 CORBA, DCOM, RMI과 비교했을 때 주된 차이점은 다음과 같습니다.

    • 느슨한 연결(Loose Coupling)
    • 이진 부호화(바이너리 인코딩)가 아닌 XML 유니코드 부호화 사용
    • 객체 지향(Object-Oriented)이 아닌 메시지 지향(Message-Oriented)


    웹 서비스라는 명칭을 가지고 있지만 월드 와이드 웹과 혼동하여서는 안됩니다. WWW는 사람과 컴퓨터 간의 상호작용을 위한 시스템인 데 반해, 웹 서비스는 컴퓨터와 컴퓨터 간의 상호작용을 위한 시스템입니다. 분산 컴퓨팅을 실현할 수 있는 신기술로 등장하여 큰 기대감에 매스미디어에서 여러 번 다루어져서 인지도는 증가하였지만, 시장에서의 실효성 때문에 많이 보급되지 않았습니다. 아직 관련 기술의 표준화가 더디어 보급은 늦어지고 있는데요. 최근에 서비스 지향 아키텍처(SOA)가 각광을 받으면서 그 기반 기술인 웹 서비스 또한 주목을 다시 받고 있긴 합니다.

     

    웹 2.0과 함께 SOAP을 이용하지 않는 REST(RESTful 또는 웹 API) 스타일 웹 서비스도 등장하여 많은 사용되고 있습니다. 웹 2.0의 한 분야로 웹 서비스를 이용하여 여러 웹 서비스를 조합하여 웹 애플리케이션이나 서비스를 구축하는 것을 매시업이라고 부르는데요. 현재 이 분야는 수많은 사업으로까지 확장되어 서비스되고 있습니다.

    8Vce0H5.jpeg

     

     

    RESTful API는 두 컴퓨터 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위해 사용하는 인터페이스입니다. 대부분의 비즈니스 애플리케이션은 다양한 태스크를 수행하기 위해 다른 내부 애플리케이션 및 서드 파티 애플리케이션과 통신해야 합니다. 예를 들어 월간 급여 명세서를 생성하려면 인보이스 발행을 자동화하고 내부의 근무 시간 기록 애플리케이션과 통신하기 위해 내부 계정 시스템이 데이터를 고객의 뱅킹 시스템과 공유해야 합니다. RESTful API는 안전하고 신뢰할 수 있으며 효율적인 소프트웨어 통신 표준을 따르므로 이러한 정보 교환을 효과적으로 처리할 수 있습니다. 참고로, 웹서비스는 Xml을 사용하지만, RESTful은 Json을 사용합니다. RESTful이 메시징에서 주류가 된 다양한 이유중에 하나가 포멧입니다.

     

    웹 관련해서 알아야 할 내용들이 더 많지만, 프로그래밍 강좌는 아니라서 간단한 개념과 웹서비스와 RESTful이 뭔지만 알아보고 넘어갈께요. 자~ 이제 본격적으로 코딩을 해볼까요? 아래와 같이 웹서비스 모델을 하나 추가해줍니다. 웹은 처음이라서 카테고리부터 만들어줘야 합니다.

    oNdG2Wz.jpeg

     

     

    이전 버전의 엔지엠 6도 웹서비스 액션이 존재합니다. 하지만, 이전 기술로 만들어진터라 많은 부분이 개선되었는데요. 이 부분도 잠깐 언급하고 넘어갈께요. 그리고, 응답 헤더 정보도 많은 변화가 있었기 때문에 이 부분도 이전과 다르게 처리했습니다. 일단, 기존에는 웹서비스를 아래와 같이 구현했었습니다.

    HttpWebRequest request = null;
    HttpWebResponse response = null;
    string charset = null;
    string result = null;
    
    switch (method)
    {
        case Definition.HttpMethod.POST:
            request = (HttpWebRequest)WebRequest.Create(siteUrl);

     

    HttpWebRequest와 WebRequest등등... 여기에서 파생된 모든 기능은 이제 사용할 수 없습니다. 물론, 사용한다고 해서 동작을 안하는건 아닙니다. 하지만, 닷넷에서 더이상 지원을 안하기 때문에 나중에 어떤 문제가 발생할지 알 수 없습니다. 웹은 점점 더 발전하고, 새로운 뭔가가 나올텐데요. 그에 맞게 업그레이드가 되어야 합니다. 하지만, 아래 그림과 같이 더이상 사용되지 않고 있습니다.

    CnXyYeE.jpeg

     

     

    그래서, HttpClient를 사용해서 다시 만들어야 하는데요. 기존에 사용하던 것과 달라서 관련 도움말을 참고해서 다시 코딩했습니다. 기존에는 대부분 설정들이 속성으로 빠져 나와 있었습니다. 그리고, 헤더와 바디 구분이 없었어요. 일관성이 없다랄까? 아무튼 그렇습니다.

    request.ContentType = $"text/plain;charset={charset}";

     

    그리고, WebRequest의 버그인지는 모르겠지만, Headers는 정상적으로 처리가 되는 반면, POST의 Parameters는 처리되지 않는 문제가 있습니다. 내부에서 Json 처리시에 문제가 되는거 같더라고요. 닷넷 Json Parser를 찾아보면 Dictionary 형태의 Key, Value 목록이어야 합니다. 하지만, Add 메소드로 추가한 항목들은 처리가 안되더라고요.

    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
    {
        string json = JsonConvert.SerializeObject(parameters);
        streamWriter.Write(json);
    }

     

    이 부분도 새로운 버전에서는 개선이 되었습니다. 닷넷은 정말 오래 되었지만, 아직도 뭔가 문제가 있는데요. 이런 부분들을 찾아서 수정하는게 정말 힘든일입니다. 제대로 될거라고 생각하고 만든 코드들이 의도한데로 동작하지 않으면 스트레스를 받게 되니까요. 그렇더라도 문제를 해결해 나가면서 개선할 수 있다면 정말 다행입니다. 그리고, 아무런 도움없이 혼자서 해결하기란 정말 쉽지 않은 문제입니다.

     

    아래는 응답에 대한 처리인데요. 뭔가 일관성이 없게 느껴집니다.

    response = (HttpWebResponse)request.GetResponse();
    
    using (var streamReader = new StreamReader(response.GetResponseStream(), encoding))
        result = streamReader.ReadToEnd();

     

    이젠 HttpClient를 사용해서 웹서비스와 RESTful을 어떻게 처리하는지 알아볼께요.

    var httpClient = new HttpClient();

     

    UserAgent를 설정해줍니다. 물론, 사용자가 임의로 입력할 수 있습니다.

    httpClient.DefaultRequestHeaders.UserAgent.ParseAdd(UserAgent);

     

    옵션으로 제공해줘야 합니다.

    [LocalizedCategory("Action")]
    [LocalizedDisplayName("Timeout")]
    [LocalizedDescription("Timeout")]
    [Browsable(true)]
    [DefaultValue(0)]
    public int TimeoutDelay { get; set; } = 0;
    
    [LocalizedCategory("Action")]
    [LocalizedDisplayName("UserAgent")]
    [LocalizedDescription("UserAgent")]
    [Browsable(true)]
    [DefaultValue(null)]
    public string? UserAgent { get; set; }

     

    WebRequest와 다른점은 기존의 숫자 초 단위 체크에서 TimeSpan을 사용해서 좀 더 풍부하게 설정할 수 있다는 점입니다.

    httpClient.Timeout = TimeSpan.FromMilliseconds(TimeoutDelay);

     

    이제 헤더 정보를 설정하는 부분인데요. 일부 헤더 정보는 객체를 사용해서 처리해줘야 합니다.

    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/plain"));

     

    캐릭터 셋도 따로 처리해줘야 합니다.

    httpClient.DefaultRequestHeaders.AcceptCharset.Add(new StringWithQualityHeaderValue(charset));

     

    이제 POST로 API를 호출하는 부분인데요. 이 코드가 핵심이라고 할 수 있습니다.

    var task1 = httpClient.PostAsync(URL, encodedContent);
    task1.Wait(TimeoutDelay, player.CT);
    var task2 = task1.Result.Content.ReadAsStringAsync();
    task2.Wait(TimeoutDelay, player.CT);
    
    response = task1.Result;
    result = task2.Result;

     

    이제 완성된 웹서비스 액션을 테스트 해봐야 하는데요. API를 제공해주는 서버를 만들어야 의도한데로 동작하는지 체크할 수 있습니다. 이런 일련의 활동들을 QA Test라고 부르긴하지만, 1인 개발자는 직접 모든걸 해줘야 합니다. 다행스럽게도 많은 리소스를 줄일 수 있는 방법이 있습니다. 무료로 이용할 수 있는 RESTful 테스트 사이트입니다. 서버 구축하고, API 설계 및 디자인 시간을 줄일 수 있습니다.

     

    아래 링크는 API를 테스트 해볼 수 있는 무료 사이트입니다. 자세하게 설명되어 있고, 속도도 빨라서 이런저런 테스트 용도로 많이 사용하고 있습니다.

    https://jsonplaceholder.typicode.com/ ]

    lDJTkT9.jpeg

     

     

    이제 완성된 액션을 테스트 해볼까요? 테스트 방법은 아래 동영상을 참고하셔서 따라 해보세요.

     

     

    이 글이 도움이 되셨다면~ 커피 한잔이라도 후원 부탁드립니다^^

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.