ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Client와 Server, REST API, JSON
    Project 2023. 6. 26. 16:58
    728x90

    * Client

    정보를 요청하는 측이 클라이언트, 요청을 받아 응답하는 쪽이 서버이다. 클라이언트가 서버로 데이터를 보내는 것을 Request라고 한다. 단순한 검색부터 상품 결제까지 전부 웹 서버로 요청을 보내야 한다. 이러한 요청은 데이터의 모음으로 네트워크를 통해 서버에게 전달되며, 서버로 요청을 보낸 이후 응답이 올 때까지 기다리는 것이 클라이언트의 역할이다. 클라이언트는 HTML, 자바스크립트, CSS 코드를 적절히 화면에 출력하는 기능을 수행한다. 이때 클라이언트는 출력만을 담당하며, 정보를 생성하고 보내는 역할은 전적으로 서버가 담당한다.

    웹뿐만 아니라 온라인 게임에서도 유사한데, 게임 배경 화면이나 캐릭터 이미지 같은 그래픽 파일은 PC에 미리 저장되어 있고, 게임 플레이 도중에 서버로부터 데이터를 받아 내 게임 정보를 재구성해 PC 화면에 출력한다. 웹사이트와 다른 점은 모바일이나 게임 분야에서는 요청이 있을 때 그래픽 요소를 보내기에는 이미지 파일의 크기가 크므로 게임을 설치할 때 기본적인 그래픽 요소를 미리 클라이언트에 다운로드받고, 게임을 하는 동안에는 서버와 최소한의 데이터만 주고받는다는 점이다.

     

    * Server

    클라이언트에 서비스를 제공해주는 컴퓨터를 의미하며, 클라이언트로부터 요청을 받아 그에 맞는 응답을 보내는 역할을 수행한다. 클라이언트가 보낸 요청이 로그인 요청이라면 서버는 현재 사용자가 보낸 아이디와 비밀번호가 정확한지 검사하고 그 결과를 응답으로 보내는 일을 한다. 서버는 서버 프로그램을 이용해 수많은 요청을 내부적으로 처리한다. 서버 프로그램이란 클라이언트에 다양한 서비스를 제공하기 위해서 서버가 실행하는 프로그램이다. 웹이나 모바일에서 서버 개발 시에 Go, Javascript, Python, PHP, JSP, ASP 등의 프로그래밍 언어를 사용하고, 게임 분야에서 서버 개발 시에 C++, C#, Go를 주로 사용한다.

    언어마다 프레임워크가 따로 있는데, 웹 서버 개발 시 Java -> Spring, Python -> Django가 있다. 이러한 프레임워크는 개발 과정을 단축하는 역할을 한다. 서버 프로그램은 사용자의 요청에 대한 특정 작업을 수행하는 데 그 목적이 있다. 서버는 요청받은 작업을 서버 프로그램으로 실행한 다음 클라이언트 프로그램에 응답으로 보내주는 일을 한다.

     

    Python으로 웹 요청

    - HTTP : 웹 상에서 데이터를 주고받기 위한 프로토콜. 보통 웹 문서를 주고받는데 사용된다.

    HTTP 메서드 설명 사용 예시
    GET 특정한 데이터의 조회 요청 특정 페이지 접속, 정보 검색
    POST 특정한 데이터의 생성 요청 회원가입, 글쓰기
    PUT 특정한 데이터의 수정 요청 회원 정보 수정
    DELETE 특정한 데이터의 삭제 요청 회원 정보 삭제

    클라이언트는 웹 서버에 메서드를 이용해 요청하면 서버는 요청받은 메서드를 보고 적절한 기능을 수행하도록 개발해야 한다. GET 메서드는 '저 이 데이터 조회하고 싶어요'라고 요청을 하는 조회의 의미가 있다. 웹 브라우저에서 검색창에 '프로그래밍' 이라고 입력한 다음 엔터키를 누르면 그 순간 웹 브라우저 내부에서는 GET 메서드를 달고 서버에 요청을 보낸다 .

    물론 프로그램을 개발할 때 GET, POST, PUT, DELETE 메서드의 설명을 그대로 따르지 않아도 기능을 구현할 수 있다. 예를 들어 특정 회원의 정보를 삭제하거나 수정할 때에도 POST 메서드를 이용할 수도 있다. 하지만 추후에 설명할 REST 아키텍처에서는 4가지 메서드의 설명에 맞게 프로그램을 개발해야 한다.

    import requests
        
    target = "http://google.com"
    response = requests.get(url=target)
    print(response.text)

    단순히 웹 브라우저를 실행해서 구글에 접속만 해도 이처럼 구글의 웹 서버에 GET 방식으로 호출한 것과 같은 일이 내부적으로 일어난다. 차이점은 웹 브라우저는 웹 문서를 보기 좋게 출력해주고, 앞의 코드는 웹 문서를 그대로 출력했다는 것 뿐이다.

    - POST : 회원가입, 로그인 등 사용자의 정보를 서버로 보낼 때

    - PUT : 수정할 때

    - DELETE : 삭제 요청을 할 때

    * REST API

    - REST : 각 자원에 대하여 자원의 상태에 대한 정보를 주고받는 개발 방식

    GET, POST, PUT,DELETE 등의 HTTP 메서드는 각각의 역할이 있지만, 각 메서드의 기본 설명을 따르지 않아도 프로그램을 개발할 수 있다고 하였다. 하지만 저마다 너무 다른 방향으로 개발하면 문제가 되므로, 기분이 되는 아키텍처가 필요하다. REST는 서버의 자원을 어떠한 방식으로 접근하도록 해야 하는지를 구체적으로 명시한 것이다. 특히 HTTP 프로토콜을 그대로 사용하므로 웹이나 모바일 개발에서 서버와 클라이언트가 통신하기에 적합한 방식이다.

    - API : 프로그램이 상호작용하기 위한 인터페이스

    Ex. 웹에서 게시물 목록을 터치했을 때, 게시물 목록을 받아 오도록 기능을 구현하려면 터치하는 순간 서버의 특정 URL에 접근하도록 만들어야 한다. 예로 /boards 경로에 들어가야 게시물 정보가 나오도록 만들 수 있다면 API 명세는 '클라이언트가 /boards 경로에 들어갔을 때 게시물 목록을 준다'라고 미리 명시해놓는 것이고, API 개발은 실제로 서버의 /boards 경로에 들어갔을 때 관련 정보가 나오도록 개발까지 하는 것을 의미한다. 

    REST를 이용하는 방법은 간단하다. HTTP URI로 자원을 명시하고, HTTP 메서드를 통해 해당 자원을 어떻게 처리할 것인지를 명시하면 된다.

    1. Resource : URI를 이용하여 표현

    2. Verb : HTTP 메서드를 이용하여 표현

    3. Representation

    Ex. https://example.com

     

    Example Domain

    Example Domain This domain is for use in illustrative examples in documents. You may use this domain in literature without prior coordination or asking for permission. More information...

    example.com

    접근 시, URI를 /users 로 지정하고 클라이언트가 회원 정보 관련 요청을 보낼 때에는 https://www.example.com/users 

    에 접근하는 것이다.

     

    * JSON

    : REST API를 사용할 때 사용하는 데이터 형식

    - 데이터를 주고받는 데 사용하는 경량의 데이터 형식

    - 자바스크립트에서 객체를 만들 때 사용하는 표현식과 동일한 형태

    {
    	"id" : "gildong",
        "password" : "192837",
        "age" : 30,
        "hobby" : ["football", "programming"]
    }

    - JSON 객체는 키-값 쌍으로 이루어진 데이터 객체를 저장

    - 파이썬에서는 JSON 라이브러리를 기본으로 제공

    # JSON Encoding in Python
    
    import json
    
    user = {
    	"id" : "gildong",
        "password" : "192837",
        "age" :  30,
        "hobby" : ["football", "programming"]
    }
    
    # Encoding: 파이썬 변수를 JSON 객체로 변환(띄어쓰기 네 칸 들여쓰기 적용)
    json_data = json.dumps(user, indent = 4)
    print(json_data)

     

    # JSON Decoding in Python
    
    import json
    
    # 사전 자료형 데이터 선언
    user = {
    	"id" : "gildong",
        "password" : "192837",
        "age" : 30,
        "hobby" : ["football", "programming"]
    }
    
    # Encoding : 파이썬 변수를 JSON 객체로 변환
    json_data = json_dumps(user)
    
    # Decoding : JSON 객체를 파이썬 변수로 변환
    data = json.loads(json_data)
    print(data)

     

    Python으로 REST API 호출 실습하기 

    : 간단한 웹 서버를 직접 만든 뒤에, 클라이언트 프로그램으로 해당 웹 서버와 통신하는 것이다. 단순히 REST API와 JSON 형식을 익히기에는 너무 번거로우니 JSON 목킹 사이트(https://jsonplaceholder.typicode.com)를 이용한다.

    1. GET 실습

    https://jsonplaceholder.typicode.com/users/1

    위 캡처본과 같이 JSON 형식으로 한 명의 사용자 정보가 나오는 것을 확인할 수 있다.

    GET 실습 2

    https://jsonplaceholder.typicode.com/users

    앞선 예시와 다르게, 서버에서 열 명의 사용자 전체에 대한 정보를 JSON 형태로 반환하는 것을 알 수 있다. REST API에서는 단순히 사용자 혹은 게시물 경로에 접속하는 경우 전체 사용자 목록 혹은 게시물 목록을 모두 반환하도록 동작한다. 

    회원 정보 처리 실습

    Python을 이용하여 모든 사용자 정보를 REST API를 이용해 호출하여 번호 순서대로 이름만 리스트에 담는 프로그램을 작성한다.

    파이썬의 requests 라이브러리는 get() 메서드를 이용해 웹사이트의 응답 정보를 받아온 뒤에, 해당 응답 텍스트가 JSON 형식을 따르는 경우 json() 메서드를 이용해 사전 자료형으로 바로 변환할 수 있다. 다음 코드를 실행하면 웹사이트에서 반환한 모든 사용자 정보에서 이름 정보만 찾아서 name_list에 저장하는 것을 알 수 있다.

    *Parsing : 특정한 형식으로 저장된 데이터에 접근하여 원하는 정보만 찾아서 가공하는 작업

    import requests
    
    target = "https://jsonplaceholder.typicode.com/users"
    response = requests.get(url=target)
    
    data = response.json()
    
    name_list = []
    for user in data:
        name_list.append(user['name'])
    
    print(name_list)
    728x90

    'Project' 카테고리의 다른 글

    웹 크롤러 설계  (0) 2023.07.12
    [Parsing] Scrapy를 활용하여 웹 스크래핑 하기  (0) 2023.07.09
    PySpider  (0) 2023.07.08
    웹 크롤링 데이터를 MySQL에 저장하기  (0) 2023.07.03
    Requests 알아보기  (0) 2023.06.28
Designed by Tistory.