정보를 주고받을 때 널리 사용되는 형식
REST란?
Resource + Method + Representations of Resource
URI : 특정 Resource를 식별하는 식별자
URL : 리소스가 어디 있는지 알려주기 위한 규약
URI는 "식별"을 위한 것이며, URL은 "특정 위치"를 의미함
URL은 URI의 Subset
ex)
index.html
파일을 접속하고 싶다고 가정하자. 이 때 우리는 'https://~/index.html' 로도 접속 가능하며,'https://~/index' 로도 접근 가능하다. 전자는 URI임과 동시에 URL이다. 왜냐하면 해당 파일이 /index.html에 존재함을 알리기 때문이다. 하지만, 후자는 주소 자체로는 index.html 파일인지, index.js 파일인지 알 수가 없다. 이런 연결 과정은 서버 내부에서 처리해주기 때문에, 식별을 위한 URI는 맞지만 리소스가 어디있는지는 알려주지 않으므로 URL은 아니다
Server-Client 구조
Stateless : 작업을 위한 상태정보를 따로 저장하고 관리하지 않음
Cacheable
Uniform Interface : Resource에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 스타일
계층형 구조
URI는 정보의 자원을 표현해야 함
자원에 대한 행위는 HTTP Method로 표현함
URI는 "자원"에 집중해야지, 행위에 대한 설명은 부가되지 않는 것이 좋음
정보를 주고 받을 떄 지켜야 하는 통신 프로토콜(규약)
HTTP를 통해 Request 및 Respond를 수행할 때 정보를 Packet에 저장하여 통신
Packet 구조 : Header + Body
Client 요청에 따라 서버의 반응을 알려주는 Code
1xx(정보) : 요청을 받았고 프로세스를 진행하겠음을 알림
2xx(성공) : 요청을 성공적으로 받아 실행함
3xx(Redirection) : 요청 완료를 위해 추가 작업이 필요
4xx(클라이언트 오류) : (클라이언트측 실수로) 요청을 처리할 수 없음
5xx(Server 오류) : (Server측 문제로) 요청에 대한 응답에 실패함
동기 : 요청을 보낸 후 응답(결과물)을 받아야 다음 동작이 이루어지는 방식
비동기 : 요청을 보낼 때 응답 상태와 상관 없이 다음 동작을 수행함
비동기를 위해 AJAX나 setTimeout 등을 활용함
A() 메서드와 B() 메서드가 관련이 없는 메서드라고 생각하자. 만약, A() B()를 연속 해서 실행시키는데 A는 시간이 많이 걸리는 작업이고 B는 시간이 적게 걸리는 작업일 경우, B는 A가 실행이 다 될 때까지 억울하게 기다려야 할 것이다.
이런 방식을 "동기"라고 한다.
내가 먼저 도착했으면 쟤보다 빨리 수행됐을텐데... ㅂㄷㅂㄷ.....
이런 단점을 해결해주는 것이 "비동기"이다.
A()는 A나름대로 수행하고, 바로 B 메서드까지 수행시키는 것이다. 그러면 B메서드는 먼저 수행되었기 때문에 B에 대한 Respond를 먼저 줄 것이며, 나중에 A 메서드의 수행 결과를 제출해줄 것이다.
Internet Protocol
네트워크에 연결된 특정 PC의 주소
4덩이의 숫자로 구성된 IP 주소 체계를 IPv4라고 함
몇가지 IP 주소는 용도가 정해져 있음
최근 IPv4 주소로 부족해져 IPv6가 나옴
PC에 접속할 수 있게 하는 통로(Channel)
포트는 중복해서 활용할 수 없음
0 ~ 65535까지의 Port가 존재하나, 이 중 통신에 의한 규약에 몇 개는 사용되고 있음
웹에서 Get Method를 활용할 때 데이터를 전송하기 위해서는 "URI"에 정보를 담아 보낸다.
이 때 URI에 정보를 담는 방법에 Path Parameter 방식과 Query Parameter 방식이 존재한다.
Path Parameter
Query Parameter
예시로 보는 Path Parameter, Query Parameter
Resource 식별 시 차이점
위에서 ID가 100인 사용자 정보를 가져오는 예시를 생각해보자.
이 때, user ID가 100인 사용자가 없다고 가정해보자.
이 때 Path Parameter는 경로에 존재하는 내용이 없으므로 "404 Error"가 발생하며, Query Parameter는 해당 Query String에 적절한 데이터가 없으므로 빈 리스트가 나온다.
Path Parameter는 전해지는 데이터도 "경로"로 파악하기 때문에 데이터가 없을 경우 "잘못된 경로"라고 이해하여 404 Error를 내며, Query Parameter는 "데이터"가 온 것으로 파악하기 때문에, 데이터가 없을 경우 "입력 데이터에 해당하는 데이터가 없음"으로 이해하여 빈 리스트를 반환하는 것이다.
그렇다면 언제, 어떤 것을 활용해야할까?
결론만 말하자면 Resource를 식별하는 상황에서는 Path Variable이 적합하며, 정렬이나 필터링을 해야 할 경우 Query Parameter가 적절하다
만약 정해지지 않은 값에 대한 요청이 올 경우 빈 쿼리를 내는 것보다는 404 Error를 내서 Client가 잘못된 요청을 보냈다는 것을 알리는 것이 User입장에서도, 관리자 입장에서도 편하다(User : 내가 잘못 입력했음을 알 수 있음, 관리자 : Request 내용을 보고 서버 관리가 수월해짐)
만약 내가 잘못된 입력을 보냈는데 빈 리스트가 오면 이게 데이터가 있는데 에러가 난건지, 빈 데이터 자체가 데이터인지 알 수가 없을 것이다(Optional한 값이라 빈 칸으로 놔뒀는데, 이 값을 요청할 경우에도 빈 리스트가 반환되므로)
Query Parameter는 "정렬"이나 "필터링"을 해야하는 경우에 적합하다고 말한다.
예를 들어 내가 기사를 모으는데 "AI"에 관련된 기사만 모으고 싶다. 이 때 news?category=AI라고 요청했을 때, 해당하는 데이터가 없다고 가정하자.
만약 news/AI로 입력했다면 404 Error가 발생할 것이다. 그런데 User는 이 에러가 "news"라는 경로가 존재하지 않는지, "AI"가 잘못된건지, 아니면 데이터 자체가 없는 것인지 알 수가 없다.
즉, 'news'라는 데이터는 존재하지만, AI 관련 기사가 없다는 것을 말해주기 위해서는 Query Parameter를 통해 빈 리스트를 반환해주는 것이 더 User가 보기에 적합할 것이다
최근 떠오르는 Python Web Framework
High Performance
쉬움
Productivity
Flask보다 간결한 Router 문법
Asynchronous(비동기) 지원
Built-in API Documentation(Swagger)
Pydantic을 이용한 Serialization 및 Validation
아직은 다른 웹 프레임워크 사용자가 많음
ORM 등 Database와 관련된 라이브러리가 적음
Postman과 같은 역할을 수행할 수 있게 만든 기능
해당 사이트를 "어떻게 활용해야하는지" 등에 대해 자동으로 Document를 만들어주며, 제대로 실행되는지 여부도 확인할 수 있기 때문에 편안함
REST API 설계 및 문서화할 때 활용
구축된 프로젝트를 유지보수하거나 다른 개발팀과 협업할 때 좋음
기능 : API 디자인, API 빌드, API 문서화, API 테스팅
아래 설명에 실행을 통해 자세히 확인 가능
Depndency Resolver
Virtualenv를 생성하여 격리된 환경에서 빠르게 개발이 가능해짐
pyproject.toml을 기준으로 여러 툴들의 Config를 명시적으로 관리
Python 2.7이나 3.5+ 버전이 존재해야 활용 가능
Writing lock file에서 생성되는 파일
이 파일을 활용하면 Local과 동일한 의존성을 가질 수 있음
poetry.lock 파일로 requirements.txt 파일 만들기
poetry export -f requirements.txt > requirements.txt
poetry.lock Update
poetry update
: 패키지 Updatepoetry update --lock
: poetry.lock 파일만 UpdateMac OS / Linux
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
Windows(Powershell)
(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py -UseBasicParsing).Content | python -
Pip을 활용한 설치
pip install --user poetry
사용할 라이브러리를 지정하는 과정
대화 형식으로 Package 설치 가능
설치한 패키지 목록은 pyproject.toml
에 저장됨
poetry init
을 수행했을 때, 만약 toml파일이 없는 경우라면 Package name, Version 등에 대한 정보를 입력하도록 한다. 아무렇게나 써도 큰 문제가 없는 것은 확인했지만, 이왕이면 구분을 위해 입력해주자
Search for packages to add
부분을 보자. 이 곳에 내가 원하는 설치 라이브러리 이름을 입력하면, 아래 부분에 [0] ~ [9]까지 list가 나옴을 알 수 있다. 여기에서 "내가 원하는 라이브러리"를 선택하면 된다.
Pandas와 Numpy를 설치해봤다. 원하는 라이브러리 List의 숫자를 입력 후 엔터를 치면 설정되며 Version을 선택할 수도 있다. 만약, Version을 선택하지 않고 엔터를 치면 최신 버전으로 설치한다.
설치할 라이브러리를 모두 선택했다면 "Add a Package"를 물어보는 구간에서 Blank(엔터)를 누르면 다음 질문으로 넘어간다
Development Depndency를 설치할 것이냐는 질문을 하는데, 이는 "Dev용 서버"를 만들 것인지 묻는 것이다. 만약 만든다면, Dev용 서버에서만 설치할 라이브러리를 입력하면 된다
Generated file은 곧 pyproject.toml의 내용과 동일하다. cat pyproject.toml
을 통해 파일을 보면 동일하게 입력되어 있음을 알 수 있다
poetry shell
: Poetry를 활성화poetry install
pyproject.toml
에 저장된 내용을 Base로 라이브러리 설치pyproject.toml
파일에 존재하는 모든 라이브러리에 대한 정보를 poetry.lock
에 저장시키고, 라이브러리를 설치함
poetry.lock
파일만 항상 일치한다면 poetry install
명령어를 통해 의존성 관리를 최신으로 할 수 있음
poetry add {설치할 라이브러리}
Poetry 환경에서 실험을 진행하던 도중 모듈(라이브러리)을 추가하고 싶을 경우 사용하는 명령어
Poetry Add로 필요한 패키지를 추가할 경우 설치가 진행되며, 자동으로 pyproject.toml
파일도 Update됨
poetry add
명령어를 활용하면 Dependency 추가를 할 뿐만 아니라 자동으로 설치까지 진행되는 것을 알 수 있다poetry add
이전, 오른쪽은 명령어 수행 이후 pyproject.toml 파일이다.