후배에게 알려주는 API 백엔드 개발 1. HTTP
HTTP는 웹/앱 백엔드 개발에 앞서 반드시 학습해야하는 내용입니다.
HTTP에 대한 이해 없이 무작정 웹 프레임워크 사용법만 학습하여 만든 엉터리 사이트들이 있습니다.
웹 페이지 이동을 POST Method로 구현하여 웹 브라우저의 '뒤로' 버튼을 클릭 했을때 뒤로 이동하지 않는 사이트, 사용자의 인증 문자열을 Query Parameter에 담아 보내는 등의 경우 100% HTTP에 대한 이해가 없는 개발자의 결과물입니다.
이런 말도안되는 개발자가 더이상 양성되지 않았으면 하는 마음에 이 책은 HTTP 프로토콜에 대한 내용으로 시작합니다.
만약 생소한 용어가 보이면 겁먹지말고 그냥 읽고 넘어가면 됩니다.
일단 끝까지 쭉 직진해서 나가다보면 언젠가 익숙해지게 됩니다.
REST API는 HTTP 요청을 통해 클라이언트와 서버간의 통신이 이루어집니다.
따라서 REST API 개발자는 반드시 HTTP에 대한 이해를 가지고 개발을 시작해야합니다.
이 책에서는 REST API 개발을 위해 필요한 최소한의 내용만을 담고 있습니다.
더 많은 내용은 Mozilla의 mdn web docs를 통해 학습 할 수 있습니다.
HTTP: Hyper Text Transfer Protocol
TCP/IP 통신계층에서 서버와 클라이언트간에 통신을 주고받는데 사용할 메세지의 규약입니다.
HTTP는 웹 브라우저와 웹 서버간의 통신에서 HTML과 같은 문서(하이퍼텍스트)를 전송하기 위한 프로토콜로서 개발되었습니다.
네트워크 통신 계층까지는 알 필요가 없습니다. 어려운 용어를 외울 필요도 없고 원리만 이해하면 됩니다.
초창기 HTTP의 주된 용도는 사용자가 웹 브라우저에 주소를 입력하면 웹 브라우저는 목적지 서버에게 HTML 콘텐츠를 요청하고 서버가 보내준 HTML 콘텐츠를 화면에 그려주는 형태였습니다.
HTTP의 확장성에 기반하여 서버의 응답형식을 HTML뿐만 아니라 XML, JSON등 다양한 형식의 콘텐츠를 도입함으로써 웹 브라우저뿐만 아니라 데스크탑용 어플리케이션, 백엔드와 분리된 웹 프론트 어플리케이션, 모바일 앱 등 다양하게 활용되고 있습니다.
백엔드 개발이란
- 서버에서 중단없이 구동되는(무한루프) 프로그램을 개발하는 것이며
- 웹 브라우저, 모바일 앱, 게임 등(클라이언트)이 서버로 어떤 요청(로그인, 게시물 읽기 등)을 보내오면
- 그에 해당하는 작업을 처리(회원가입, DB에서 게시물 내용 가져오기 등)한 후
- 요청한 클라이언트에게 결과 데이터(HTML, JSON, PNG 등)를 응답하는 과정을 만드는것
HTTP의 특징
HTTP는 인터넷에서 HTML과 같은 하이퍼텍스트 미디어를 전송할 용도로 개발 되었습니다.
TCP/IP 프로토콜 위에서 동작하며 클라이언트(예: 웹 브라우저, 앱)와 서버(웹 서버, 앱 서버) 사이에 이루어지는 요청과 응답을 정의하는 프로토콜입니다. 웹 브라우저, 대부분의 모바일 앱 등이 HTTP를 사용하고 있습니다. 이미 우리는 PC, 스마트폰등을 통해 일상에서 HTTP를 이용하고 있습니다.
HTTP의 무상태성(Stateless)
HTTP는 무상태성(Stateless)이라는 특징을 가지고 있습니다.
HTTP의 특징을 콜센터에 비유하여 설명하면 이해가 쉬운데 여기서 상태성과 무상태성을 구분하여 예시를 들어보겠습니다.
1. Statefull 콜센터
전화를 건다 -> 콜센터 직원이 전화를 받음
할말을 한다 -> 친절한 응대
용건이 끝났으면 전화를 끊는다
다시 전화를 건다 -> 콜센터 직원이 전화를 받음, 고객의 목소리만 들어도 누군지 알고있음
아까 말했던거 계속 이어서 말하면 -> 직전 통화내용에 이어서 대화가 이어짐
용건이 끝났으면 전화를 끊는다
2. Stateless 콜센터(HTTP)
전화를 건다 -> 콜센터 직원이 전화를 받음
할말을 한다 -> 친절한 응대용건이 끝났으면 전화를 끊는다
다시 전화를 건다 -> 콜센터 직원이 전화를 받음. 고객이 누군지, 무슨 대화를 했었는지 전혀 기억 못함
용건이 끝났으면 전화를 끊는다
HTTP 무상태성(Stateless)의 특징은 다음과 같이 정리할 수 있습니다.
- 클라이언트는 어떤 로직 처리에 있어 서버에게 연속적인 요청을 보내야할 때 로직의 진행 상태를 스스로 기억해야한다.(웹 브라우저 또는 앱 내 저장공간에 기록)
- 만약 직전 로직에 이어지는 요청을 보내야할 경우 클라이언트는 직전 로직에 대한 상태(로그인 성공여부 등)값을 새로운 요청 메시지에 담아 보내야한다.(서버는 내가 누군지, 나와 무슨 일을 해왔었는지 기억하지못한다.)
아래 두가지 예를 통해 HTTP에서 연속성 있는 로직의 처리방법에 대해 알아보겠습니다.
블로그에 로그인 후 게시물을 작성하는 예시
제약사항: 블로그의 게시물은 로그인된 사용자만 작성할 수 있습니다. 사용자는 로그인 요청을 보낸 뒤 로그인에 성공하면 이어지는 작업을 수행할 것입니다.
- 클라이언트가 아이디와 패스워드를 서버로 보냄 -> 서버에서 패스워드 검증이 완료되면 임시 출입증 응답(세션 또는 인증토큰)
- 클라이언트는 웹 브라우저나 앱 내 저장공간에 임시 출입증 저장
- 블로그에 게시할 게시글의 제목과 내용을 임시 출입증과 함께 서버로 보냄 -> 서버에서 임시 출입증 검증이 완료되면 데이터베이스에 게시글 저장
쇼핑몰 사이트에서 장바구니에 담긴 상품들을 구입하는 예시
- 사용자는 쇼핑몰 사이트를 둘러보며 구입할 상품들을 장바구니에 담아놓습니다.(선택한 상품을 웹 브라우저의 쿠키에 임시 저장, 서버는 사용자가 장바구니에 어떤 상품을 담았는지 모름)
- 결제하기 버튼을 클릭하면 결제 페이지로 이동합니다. 서버는 사용자의 장바구니 정보를 가지고 있지않기에 비어있는 결제화면의 HTML 콘텐츠만 응답합니다.
- 웹 브라우저는 쿠키에 저장해놓은 사용자의 장바구니 상품 목록들을 불러와 결제 페이지에 추가합니다.
- 결제 버튼을 클릭하면 쿠키에 저장되어있던 상품 목록과 결제정보를 서버로 전달하여 상품 구매를 처리합니다.
나중에 HTML 응답과 Form처리에서 쿠키와 세션을 사용해보며 자세히 알아보겠습니다.
학습을 위한 준비물
Python 언어
본 책을 학습하기 위해서는 Python 언어에 대해 기초적인 사전 지식이 필요합니다.
아래 나열된 사이트를 통해 Python 언어를 학습할 수 있습니다.
Python 공식 홈페이지의 튜토리얼 https://docs.python.org/3/tutorial/index.html
W3Schools https://www.w3schools.com/python
GeeksforGeeks https://www.geeksforgeeks.org/python-programming-language-tutorial
본 책의 예제들은 Python 3.10 이상의 버전을 사용하여 작성되었습니다.
도구
1. [필수] Python: 버전 3.10 이상
2. [필수] Python 가상환경 도구: venv
3. [필수] Python 패키지 인스톨러: pip
4. IDE(Integrated Development Environment, 통합개발환경): Python 개발을 위한 IDE로 아래 소프트웨어들을 추천합니다.
- GNU Emacs(진정한 해커가 되고싶다면): https://www.gnu.org/software/emacs/
- Microsoft Visual Studio Code: https://code.visualstudio.com/
- Jetbrains PyCharm Community Edition: https://www.jetbrains.com/pycharm/
5. [필수] 선호하는 웹 브라우저 1가지 선택
- Mozilla Firefox
- Google Chrome
- Apple Safari
- Microsoft Edge 등
6. API 테스트용 클라이언트
- Postman
- Rapid API 등
7. [필수] CURL: https://curl.se/download.html
- 검색엔진에서 설치와 실행방법을 찾아보세요