Published on

[Python] Python을 이용해서 REST통신을 하는 윈도우 프로그램을 만들어보자

Authors
  • avatar
    Name
    Almer Minified
    Twitter

[Python] REST통신 기능이 내재된 윈도우 프로그램 만들기

REST통신에 대해

REST통신은 웹 주소를 기반으로 POST, PUT, GET, DELETE 이 네 가지 http 메소드로 통신하는 것을 의미한다. 그 데이터의 유형은 주로 JSON형식이 쓰인다. 즉 내가 어떤 인터넷 주소로 저 방법 중 하나로 요청을 보내면 그 요청을 받게 된 서버가 데이터를 JSON형태로 반환한다는 것이다. 이전의 웹소켓방식 통신과 다른 점은 이게 Stateless 즉 무상태 통신이라서 전 통신의 상태를 서로 기본적으론 모르고 다 별개의 트랜잭션으로 처리된다는 것이다. 그래서 요청이 많아질수록 웹소켓보다 오버헤드가 커질 수 밖에 없다. 통신에 필요한 데이터가 따로 있을 수 밖에 없으니까말이다.

주된 사용처

주로 브라우저에서 웹서버와 클라이언트의 통신을 위해 많이 사용된다. 뿐만 아니라 앱에서도 많이 사용된다. 그러나 윈도우 프로그램에서 통신할 일이 있는데 윈도우 프로그램의 경우 브라우저나 앱에서 돌아가는 것이 아니므로 따로 빌드를 해줘야 한다. 그것을 해주는 것이 pyinstaller 즉 파이썬에서의 빌드를 도와주는 라이브러리이다. 이번 글에서는 pyinstaller를 통해 REST통신을 하는 서비스를 빌드해볼 것이다.

REST 통신을 위한 코드 작성

간단하게 어떤 서버에서 get요청을 보내고 그 요청을 통해 받아온 사이트의 주소를 화면에 나타내는 프로그램을 만들것이다. 이 기능은 윈도우 상에서 링크트리처럼 역할하면서 작동할 것이다. 구현하길 원하는 모습

내부 통신을 위한 코드

우선은 우린 requests 라이브러리를 이용할 것이다. 이 라이브러리는 파이썬에서 여러 HTTP 요청을 쉽게 하고 반응을 처리할 수 있게 도와준다.

pip install requests

리퀘스츠가 설치되었다면 그 이후엔 데이터를 가져오는 코드를 만들어보자.

          import requests
          from tkinter import *
          import webbrowser

          def fetch_data():
              # 요청을 처리할 서버 주소
              url = "http://api-server.com"
              response = requests.get(url)
              if response.status_code == 200:
                  # Response Url 내용 처리
                  text.insert(END, response.text)
                  # 이번에 쓰인 url주소 처리
                  link.set(url)

이 요청은 데이터를 가져와서 만약 성공했다면 그 처리를 하는 부분이다. response.status_code == 200 이 부분이 요청이 성공적이었음을 판단하는 코드인데 status_code는 서버에 따라 다를 수 있다. 의도한 대로 바꿔서 사용하면 편리하다.

링크 주소 처리

        def open_link(url):
          webbrowser.open(url)

이 코드는 가져온 링크를 webbrowser 라이브러리를 통해 실행하는 코드이다. webbrowser는 파이썬에 내재된 표준 라이브러리라서 그냥 쓰면 된다. 시스템에 지정된 웹 브라우저를 통해 주소를 열도록 해준다.

실행 로직 만들기

        root = Tk()
        root.title("REST 통신기")
        text = Text(root, height=10, width=50)
        text.pack()
        fetch_button = Button(root, text="Fetch Data", command=fetch_data)
        fetch_button.pack()
        link = StringVar()
        link_label = Label(root, textvariable=link, fg="blue", cursor="hand2")
        link_label.pack()
        link_label.bind("<Button-1>", lambda e: open_link(link.get()))
        root.mainloop()

이 코드들은 일단 Tk클래스를 이용해서 기본 창을 초기화한다. Tk는 Tkinter GUI에 동봉된 클래스이다. 그 다음에 root.title을 이용해서 기본 창 제목을 설정한다. 그 후에 텍스트 박스를 생성하는데 Text(root, height, width)를 이용해서 만든다. 이건 높이랑 가로를 설정해서 글상자를 만들고 pack를 통해 아까 만든 위젯에 붙여넣는다. 그 다음엔 아까 만든 함수를 실행하는 fetch_button을 만든다. 그 다음에 역시 pack을 해준다. 그 후 StringVar를 초기화해준다. 여기에다가 받아온 값을 넣을 것이다. 그 후에 Label을 만들어서 붙여준 다음에 bind를 통해 이벤트를 처리해준다. 그리고 마지막으로 mainloop()를 통해 GUI가 닫힐때까지 사용자의 응답을 기다리도록 실행시킨다.

메인 로직을 exe파일로 변환

이제 드디어 pyinstaller를 통해 exe파일로 변환할 것이다.

pip install pyinstaller

우선 pyinstaller를 설치하자. 이 라이브러리를 이용하면 파이썬 로직을 쉽게 exe파일로 만들어준다.

pyinstaller --onefile fetch_data.py

아까 저장한 파일명이 fetch_data.py 이다. 이 명령어를실행하면 이제 dist폴더에 .exe파일이 생성된다. 이 파일을 실행해보자. 추가로

--windowed

옵션을 사용하면 콘솔 창 없이도 프로그램이 실행된다.