Python Backend - Study Notes 3
날짜: 2022.03.05
[2장: 현대 웹 시스템 구조 및 아키텍처]
초기의 웹은 서버가 HTML을 클라이언트 (a.k.a. 사용자)한테 넘겨주는 형식이었다. 이 당시 웹은 매우 정적이고 재미없었다. 이후 자바스크립트의 도입으로 사용자와 상호작용하고 동적인 웹사이트인 interactive web page의 개발이 더욱 활발하게 이뤄지기 시작했다. 점차 자바스크립트가 main stream 되면서 SPA (Single Page Application) 방식의 프론트엔드 개발이 인기를 끌었다. SPA란 단일 페이지로 구성되어 있는 HTML과 메인 자바스크립트가 모든 페이지 및 기능들을 동적으로 구현하는 것이다. (개발바닥 채널에서 SPA 얘기할 때 뭔가 싶었는데 이런 거였네..)
결국 HTML과 자바스크립트가 프론트엔드를 담당하고, 실시간 데이터 통신이 백엔드 영역으로 넘어가면서 오늘날의 Front-end / Back-end로 나눠졌다.
- 프론트엔드 서버: 페이지 렌더링에 필요한 HTML과 Javascript 파일 전송
- 백엔드 서버: 페이지에서 필요한 데이터 생성 및 전송 담당
이로서 많은 수의 동시 요청을 장애 없이 실시간으로, 그리고 최대한 빠른 속도로 처리할 수 있는 시스템을 구현하는 것이 백엔드 개발자의 중요한 역할이 된다. 그러므로 백엔드 개발에 주로 사용되는 언어는 안정적이고 확장성이 높으며 실행 속도도 높은, 시스템을 구현하기에 유리한 언어가 주로 사용된다. 앞으로 내가 배워할 언어 리스트라고 봐야겠다. 대표적으로 Java, Scala, Rust, Python, Ruby, PHP가 있다.
[웹 시스템 아키텍처]
현대의 웹 시스템 구조가 처리해야 하는 동시 요청수와 데이터의 규모가 기하급수적으로 증가하면서 웹 시스템들의 구조 또한 더욱 방대해지고 복잡해지게 된다. 그러면서 백엔드 개발자의 영역이 일반적인 백엔드 API 시스템 개발부터 Data Pipeline 시스템, Machine Learning 시스템, Big Data 분석 시스템 등으로 확대되고 있다.
그냥 역사 관련된 내용이었음.
끝~
[3장: 첫 API 개발 시작]
앞서 언급한 Flask라는 API 프레임워크를 기반으로 API를 개발할 것이다. 먼저 파이썬 가상 환경을 생성해야 한다. 터미널에 아래 명령어를 실행하면 된다.
“pythonvirtualenv”라고 되어있는 곳에 사용자가 원하는 가상 환경의 이름을 입력하면 된다. 나는 함축된 단어를 보면 뭔지 잘 이해 못 해서 저렇게 길게 풀어쓰는 걸 선호한다. (언젠가는 고쳐야 될 습관이다..) 이제 conda를 사용해서 가상 환경을 만들었으니까 실행시켜줘야 한다.
위의 명령어를 통해 가상 환경을 활성화 시켰다. 활성화와 동시에 본인이 만든 가상환경에 접속하는 것이기 때문에 이제부터는 가상환경 속에서 프로그래밍을 진행하게 된다. 또 다른 가상환경이 있다면 그 가상환경에 해당하는 이름을 “pythonvirtualenv” 대신에 사용하면 된다. 가상 환경 비활성화는 다음과 같다.
본인이 생성한 파이썬 가상환경을 보려면 밑의 명령어를 통해 리스트 확인이 가능하다.
위와 같이 파이썬 가상 환경을 만든 뒤, 접속한 이유는 “패키지 설치”를 위함이다. 이 책의 경우 Flask라는 패키지 설치를 위한 것이다. Flask 설치는 “pip”라는 파이썬 패키지 매니저를 통해 진행된다. 터미널에서 pip를 사용하면 손쉽게 파이썬 패키지들을 설치할 수 있다.
이제 파이썬 명령어를 통해서 Flask를 import 해서 사용할 수 있다.
앞으로의 명령어는 python으로 실행된다. 일종의 터미널에 입력할 언어를 설정한 것이다.
여기까지 했으면 python 기반의 가상 개발환경에서 app이라는 Flask 객체를 만들어서 Flask의 기능들을 사용할 수 있다. 위와 같은 방식은 터미널 커맨드 라인에서 파이썬을 실행시키는 것이다. IDE에서 파이썬 프로그래밍을 하는 것은 뒤에 나와있다.
[ping 엔드포인트 구현]
이제 모든 준비가 완료되었다고 보면 된다. (적어도 간단한 API 개발을 위한 준비..) 이제 API 개발을 시작해보자.
엔드포인트가 무엇인지부터 살펴봐야 이번 섹션에서 다룰 내용이 이해될 것이다.
엔드포인트랑 API 서버가 제공하는 통신채널이다. 프론트엔드 서버 (클라이언트)가 백엔드 API 서버와 통신할 때 엔드포인트에 접속하는 형태로 통신한다. 각 엔드포인트는 고유의 URL 주소를 가지며, 고유의 URL 주소를 통해 해당 엔드포인트에 접속할 수 있다.
고유의 엔드포인트라고 하는 이유는 엔드포인트는 대부분 고유의 기능을 담당하고, 여러 개의 엔드포인트가 모여서 하나의 API를 구성하기 때문이다. 이해하기 쉬운 예시로 SNS 서비스를 위한 API를 설계한다고 하면 sign-up, log-in, create-post, follow 등의 엔드포인트를 만들고 이러한 기능들을 수행하는 엔드포인트들이 모여서 SNS 서비스 API를 구성한다. 파이썬에 비유를 하자면 API라는 클래스가 있고, 엔드포인트라는 메서드들로 이루어진 것이다.
ping 엔드포인트의 경우, “health check” 엔드포인트이다. API 서버에 접속하지 않고 해당 API의 정상 운행 여부를 체크하는 기능이다. ping 이라고 보내면, pong 이라는 텍스트를 return 하는 함수 기능을 가진 엔드포인트이다.
이제 API 코드가 위치할 디렉터리를 생성한다. (나는 온라인 IDE라서 이 부분은 생략했다.)
디렉터리의 이름을 “api”라고 정한 것이며, 이제 여기에다가 파일을 만들고 파일 안에 파이썬 파일을 만들어서 그곳에서 프로그래밍을 진행하면 되는 것이다. (디렉터리 > 파일 > 파이썬 파일)
위 명령어를 통해 “api” 디렉터리로 이동한다. 이제 API 애플리케이션을 디렉터리에 만들면 된다. API 애플리케이션은 vscode에서 프로그래밍할 것이다.
https://www.freecodecamp.org/news/how-to-open-visual-studio-code-from-your-terminal/
https://vscode.one/start-vscode-from-terminal/
먼저 위에 링크에 나와있는 vscode 설정을 한다. 그러면 mac terminal에서 code 명령어를 통해 바로 vscode에 접속할 수 있다. 열고자 하는 특정 파일이 없을 경우 다음 명령어를 입력하면 그냥 vscode를 열 수 있다.
만약 특정 파일을 열고 싶다면 code 다음에 오는 “.” 대신에 파일 이름을 다음과 같이 입력하면 된다.
원하는 파일 이름을 지정하면 된다. 혹시나 위의 command line을 터미널에 입력했는데 파일을 못 찾는다고 나오면 파일이 자동으로 생성되지 않는다는 것이므로 vscode에 들어가서 수동으로 “ping-app.py” 파일을 만들어주고 다시 터미널에서 위의 command line을 입력하도록 하자. vscode에서 수동으로 파일을 만들 경우 파일 위치 (디렉터리)를 주의해서 만들자.
이제 vscode를 사용해서 ping-app.py를 프로그래밍할 것이다.
(코드에 대한 설명 시 코드라인 번호에 대해서 해설을 추가하도록 하겠다.)
① : Flask의 기능들을 사용하기 위해서 Flask라는 툴 키트 (Tool Kit)를 가져오는 것이다.
③ : “Flask(__name__)” 은 Flask 객체를 만드는 코드이다. Flask Type의 객체를 변수에 저장함으로써 이제는 app을 통해서 Flask 메서드에 접근 가능하다. 여기서 만든 Flask의 객체가 결국 API 애플리케이션이 되는 것이다. 그래서 변수 이름을 정할 때 만드는 API 애플리케이션을 포괄적으로 나타낼 수 있게 설정해야 한다. ⑤에서 보듯이 “@app.route”을 사용한다. “@app.route” 이름은 API 공통 이름으로 사용되는 것이다.
⑤ : 여기서 만드는 것이 엔드포인트이다. “app”이라는 API 애플리케이션 안에 세부적인 고유의 기능들을 담당하는 엔드포인트 함수이다. 고유 주소 “/ping”, 그리고 HTTP 메서드를 설정하는 영역이다. HTTP 메서드 관련해서는 다음 포스트에서 다룰 것이다.
⑥ : 엔드포인트 함수이다. 파이썬 함수하고 비슷하다고 생각하면 된다. 로직에 따라서 원하는 기능을 구현하도록 설계하면 된다.
[API 실행하기]
위에서 우리는 “app”이라는 API를 만들었다. (아직 5% 정도밖에 완성 안됨..) vscode와 파이썬을 사용해서 한 개의 엔드포인트, 즉 한개의 기능을 가진 API를 만든 것이다. API 애플리케이션을 vscode에서 코딩했다면, 이제는 다시 Terminal로 돌아와야 된다. 먼저 터미널에서 파이썬 가상 환경을 실행시킨다.
터미널이 “app” API를 찾을 수 있도록, 해당 디렉터리로 이동한다.
이제 “app” API를 실행시키는 터미널용 명령어를 입력하면 된다.
위의 명령어에서 조심해야 할 것은, 터미널이 app.py가 있는 디렉터리에 위치하고 있어야 된다는 것이다. “FLASK_DEBUG=1”은 디버깅 모드를 활성화시켜놓았다는 의미이다. 이럴 경우 “app.py”의 코드가 수정될 경우에 터미널에서 Flask 재시작 명령어를 입력할 필요 없이 자동으로 재시작한다. 편리성을 위해서 사용한다.
[HTTP 입문, 그리고 로컬 호스트]
위에서 “flask run” 명령어를 통해서 우리가 만들어 놓은 “app.py”를 실행시킨 것이다. 터미널에서 우리에게 돌려준 내용을 보자.
우리가 알아야 하는 것은 API 애플리케이션 app.py가 http://127.0.0.1:5000에서 실행되고 있다는 것이다. “127.0.0.1”은 로컬 호스트 (local host)의 IP 주소이다. 로컬 호스트란 시스템이 실행되고 있는 해당 컴퓨터를 의미한다. 우리는 현재 개인 컴퓨터에서 시스템을 실행하고 있기 때문에
“local host주소 = IP 주소 = 컴퓨터 주소”
가 되는 것이다. “127.0.0.1”은 결국에 우리 컴퓨터 상에서 운영체제가 임의의 프로그램을 돌릴 때 지정해주는 예약된 주소로 일반 인터넷상에서 쓰이는 IP와는 다르다.
지금까지 진행한 내용은 우리의 API 애플리케이션을 컴퓨터 시스템 (local host)에서 실행시킨 것이다. 실행만 시켜놓으면 우리가 원하는 기능 (=미리 구현해 놓은 엔드포인트)이 알아서 시작되지 않기 때문에 적절한 명령어와 통신 형식을 보내줘야 한다. 우리가 HTTP 형식으로 API app.py에 요청 (request)을 보내야 한다. 이 책의 목표 중 하나가 터미널 환경에 익숙해지는 것이기 때문에, 우리는 터미널에서 HTTP request를 보낼 것이다. (터미널에서 테스트하는 것이 가장 보편적인 듯..) HTTP request & response 통신을 가능토록 해주는 기능이 “httpie”라는 툴이다. 이제 httpie를 설치하고 실행시켜보자.
[터미널에서 API로 HTTP request 보내기]
[goormide 사용하면 대충 위와 같은 화면으로 실행된다]
이제 터미널에서 API 쪽으로 HTTP request를 보낼 수 있다. API는 이미 컴퓨터의 시스템 (local host)에서 실행 중이기 때문에 우리가 원하는 기능을 보내달라고 요청하면 보내줄 준비를 하고 있다.
우리가 현재 터미널에서 API 시스템을 실행시키고 있고, 요청을 보내는 클라이언트 측면에서도 HTTP request를 실행시키려 하는 것이다. 이미 터미널에서 API 시스템을 실행시키고 있으니까, 서버와 클라이언트의 명령어 구분을 위해서 새로운 터미널 탭을 하나 더 열어야 된다. 그리고 이제 클라이언트 입장에서 API app.py를 접속하는 것이다.
[goormide 터미널에서 ping 엔드포인트 실행결과]
(백엔드 서버가 완성도를 갖출수록 데이터를 다룰 수 있기 때문에 HTTP request도 더 복잡해진다. 아직은 매우 간단하다.)
위의 명령어를 앞에서부터 순차적으로 해석하면 “http” 요청을 “-v”라는 옵션으로 보낸다는 의미이다. 우리의 http 요청은 “GET”이며, 우리의 요청이 도달해야 하는 목적지 주소는 “http://localhost:5000/ping”이다. 목적지 주소로 명령어를 넘기는 것이다. 주소지에서 “5000”은 로컬 주소의 포트 (port) 번호이다. (일종의 더 세부적인 주소로 명령을 처리하는 곳) 여기까지 과정을 client와 server로 나눠서 설명하면 다음과 같다.
① : Server Terminal - Flask API “app.py” running
② : Client Terminal - Send HTTP request to server
③ : Server Terminal - API app.py receives client request and returns “return statement”
④ : Client Terminal - Receives “return statement”
위의 절차를 통해서 클라이언트는 API app.py에서 “/ping”이라는 주소의 기능을 실행시킨 것이고, 클라이언트 터미널에 “pong”이라는 문자열이 return 됨으로써 HTTP request & response가 한차례 끝난 것이다.
위 과정에서 HTTP request & response를 다뤘는데, API의 기본적인 통신 방식인 HTTP에 대한 내용은 다음 포스트에서 깊이 다룬다.
'Tech Development > Python Backend (Flask API)' 카테고리의 다른 글
Python Backend - Study Notes 6 (0) | 2022.09.01 |
---|---|
Python Backend - Study Notes 5 (0) | 2022.09.01 |
Python Backend - Study Notes 4 (0) | 2022.06.24 |
Python Backend - Study Notes 2 (0) | 2022.06.16 |
Python Backend - Study Notes 1 (0) | 2022.06.16 |
댓글