Loading...
2021. 11. 9. 10:48

[FastAPI] 13. SQLAlchemy와 Pydantic을 이용한 관계 데이터 매핑

SQLAlchemy를 사용하다보면 원하지 않을 때 API에서 모든 컬럼에 대한 데이터를 받아와 최적화 하기가 어려울 때가 있습니다. 어떤 API에서는 특정 컬럼에 대한 데이터 혹은 관계 데이터가 필요할 때가 있는데, 그렇지 않은 데이터까지 모두 나오게 되어 오히려 API 로딩 속도를 저하시키고 서버 부하에 원인이 되기도 합니다. SQLAlchemy ORM의 relationship SQLAlchemy ORM에서는 관계된 데이터를 가져오기 위해 relationship을 사용할 수 있습니다. 예를 들어 블로그를 하나 만드려는데, 어떤 카테고리의 글인지를 알기 위해서 아래와 같이 데이터를 설계해 볼 수 있습니다. 카테고리는 하위 카테고리를 가질 수 있고, 하나의 컨텐츠는 카테고리 하나를 가질 수 있다라고 했을 ..

2021. 10. 30. 22:24

[FastAPI] 12. Pytest / UnitTest를 이용한 테스트 코드 작성

이번 포스트에서는 Pytest와 Unit Test를 이용하여 FastAPI에서 작성한 API를 테스트할 수 있는 방법에 대해 알아보겠습니다. Pytest Python 언어에서 지원하는 테스트 프레임워크에는 Pytest가 있습니다. Pytest는 Python에서 간단한 코드에 대해 심플하고 간결한 테스트 코드를 작성할 수 있도록 도와주며 다양한 플러그인들을 활용하여 규모가 크고 복잡한 애플리케이션에 대해서도 테스트를 쉽게 할 수 있도록 도와주는 프레임워크입니다. 주요 특징으로 아래와 같습니다. 테스트 코드 실행에 실패할 경우 자세한 정보 표시 지원 테스트 모듈 및 기능을 자동으로 검색해주는 기능 지원 Session과 같은 수명이 긴 리소스를 매개변수화 해주고, 이를 관리하기 위한 매커니즘 제공 unitte..

2021. 9. 26. 11:47

[FastAPI] 11. Dependency Injector를 이용한 의존성 관리

서버 애플리케이션을 개발하다보면 규모가 커지게 되어 이를 효율적으로 관리할 필요가 생기게 됩니다. 이에 적용하는 것으로 대표적인 아키텍처인 Layered Architecture가 있습니다. Layered Architecture는 서버 애플리케이션을 운용하기 위해 사용하는 현대 대표적인 방법으로, Application, Domain, Infrastructure의 3개로 나눌 수 있는데, 이들을 전부 객체 지향 프로그래밍으로 구현하게 되면 각각의 의존성이 늘어나게 되고, 그 로직이 커지면 이 역시 관리가 힘들어집니다. Python에서는 이러한 의존성 관리를 유연하게 하기 위해 다양한 DI 프레임워크가 존재하는데, 그 중에서도 Dependency Injector를 사용 해보고자 합니다. Dependency I..

2021. 5. 2. 19:38

[FastAPI] 10. Middleware를 이용한 전후 처리

API를 호출할 때 처리 시간이 어느 정도 소모되는지 궁금하다거나 클라이언트로부터 요청을 받았을 때 받은 EndPoint와 데이터가 궁금하다면 어떻게 해야할까요? Middleware Spring에서는 Intercepter, Filter와 같은 중간 처리 방법이 있다면, Flask에서는 App Context 중 after_request나 before_request 등의 콜백 함수로 받아 처리하는 등 여러가지 방법이 있습니다. FastAPI에는 Middleware 패턴을 가지고 있습니다. Middleware 패턴은 API 호출 전후를 중심으로 하나의 콜백 함수가 실행되고 난 뒤, API Router로 요청을 넘기는 패턴입니다. 클라이언트가 요청을 받으면 이 요청은 먼저 Middleware에서 받게 됩니다. ..

2021. 4. 4. 12:52

[FastAPI] 9. Persistence Layer 구간을 비동기 처리 하는 방법

첫 포스트에서 우리는 FastAPI가 ASGI 기반의 uvicorn을 이용하여 uvloop에 기반한 비동기 처리로 API 요청과 응답을 비동기로 처리할 수 있다는 이야기를 하였습니다. 하지만 공교롭게도 Database Connection에서 이러한 기능을 지원해주지 않아 API 요청 단에는 비동기 처리가 가능하여도 DB에 액세스 하는 구간은 비동기 처리가 되지 않기 때문에 Blocking이 발생하고, 다음 요청이 계속 대기 되는 문제점을 가지고 있었습니다. Python DB API 그렇다면 파이썬은 어떤식으로 Database와 연결할 수 있는 것일까요? Java의 경우는 JDBC라는 Database Connector라는 것이 존재하여 애플리케이션과 Database 사이를 연결해주는 게 가능한데요. Pyt..

2021. 3. 14. 16:53

[FastAPI] 8. 비동기 처리에서 SQLAlchemy의 scoped_session이 문제가 되는 이유

아래의 포스트에서 FastAPI가 SQLAlchemy와 연동하였을 때 비동기적으로 처리하는 부분이 미흡하다는 단점에 대해 이야기했었던 적이 있습니다. 2020.12.27 - [Programming/Python] - [FastAPI] 2. SQLAlchemy를 이용한 간단한 CRUD API 만들기 [FastAPI] 2. SQLAlchemy를 이용한 간단한 CRUD API 만들기 이번 글에서는 ORM에 대한 사용 방법에 대해 알아보도록 하겠습니다. ORM은 Object Relation Mapping의 약자로 객체를 이용해서 데이터베이스 Entity에 접근하는 방법입니다. 보통 애플리케이션 레벨에서 blog.neonkid.xyz 이 부분에서 다룬 SQLAlchemy의 scoped_session에 대해 좀 더 ..

2021. 2. 27. 16:39

[FastAPI] 7. Google-auth 및 PyJWT를 이용한 OAuth2 인증 구현 2

지난 글에 이어서 이번 포스트에서는 OAuth2 인증 토큰을 API에서 받아 처리하는 방법에 대해 알아보도록 하겠습니다. HTTP Header 우리가 REST API를 통신하는 데 사용하는 HTTP 프로토콜은 Header와 Body라는 구조로 이뤄져 있습니다. Header와 Body 모두 개발자가 다룰 수 있는 데이터 구조로 되어 있으며 Header에는 전송하고자 하는 서버 혹은 클라이언트의 정보 내지 전송하고자 하는 대상에 부가적인 메타데이터를 넘겨줄 떄 사용합니다. 쉬운 예시로 위와 같이 로컬 서버에게 GET 메소드를 이용해서 리소스를 가져오는 호출을 전달했을 경우 데이터를 받는 대상자에게 부가적인 메타 데이터를 가져올 수 있도록 Key-value 형태의 데이터 구조를 가지고 있습니다. 이 중에서 가..

2021. 2. 13. 13:26

[FastAPI] 6. Google-auth 및 PyJWT를 이용한 OAuth2 인증 구현 1

이번 포스트에서는 인증에 대한 이야기를 해보고자 합니다. Spring에서는 Spring Security라는 모듈을 제공하여 개발자가 인증에 대한 구현을 개별적으로 하지 않고도 쉽게 구현할 수 있는 방법이 존재했습니다. 이를 통하여 Google 개발자 콘솔에서 Client ID를 미리 발급받은 후 구현되어 있는 구현체만 잘 사용하면 어렵지 않게 OAuth2 인증을 구현할 수 있었죠. FastAPI도 이와 비슷하게 OAuth2 인증을 구현하지만 JWT를 사용하는 것에는 별도의 구현 처리를 해줘야 합니다. 이번 포스트에서는 이 두 라이브러리를 가지고 OAuth2 인증을 어떻게 구현할 수 있는지에 대해 알아보겠습니다. [Spring boot] Spring boot Security로 시작해보는 인증 Spring ..

2021. 1. 31. 00:11

[FastAPI] 5. pyyaml을 이용한 FastAPI 환경 나누기

FastAPI로 기본적인 API와 문서를 만드는 작업 그리고 데이터베이스를 연동하는 것까지 해봤다면 이제는 본격적인 애플리케이션 배포를 위해 환경을 나누어야 합니다. 여기서 환경이라는 것은 무엇일까요? 개발 환경? 개발 환경이라면 우리는 PyCharm을 사용하고 Python을 설치했고 이미 다 작업한 것이 아닌가요? 2021/01/16 - [Programming/Python] - [FastAPI] 4. SQLAlchemy + Alembic 조합을 이용한 Database Migration 가이드 [FastAPI] 4. SQLAlchemy + Alembic 조합을 이용한 Database Migration 가이드 웹 서비스를 개발하고 배포한 뒤에 반드시 한 번 쯤 따르는 업데이트 사항이 바로 데이터베이스 마이..

2020. 12. 31. 15:41

[FastAPI] 3. SQLAlchemy + Graphene 조합으로 GraphQL 서버 만들기

이번 포스트에서는 GraphQL에 대한 이야기를 해보도록 하겠습니다. What is GraphQL ? GraphQL에 대한 이야기는 그리 길지 않기 때문에 여기서 간단하게 다뤄보도록 하겠습니다. GraphQL은 Facebook에서 개발한 데이터 표현 언어로 여기서 QL이 Query Language에 해당합니다. 우리는 서버에서 데이터를 가져오기 위해 REST API를 사용하였고, REST API는 메소드와 요청 데이터 혹은 응답 데이터로 구분하여 원하는 데이터를 가져오거나 데이터를 적재하는 등을 수행하였습니다. 그러나 GraphQL은 메소드 없이 오직 Query Language만을 이용하여 원하는 모델을 적재하고, 가져올 수 있습니다. 또한 원하는 항목을 클라이언트가 직접 명시함으로써 서버에서 제공해주는..

2020. 12. 27. 12:14

[FastAPI] 2. SQLAlchemy를 이용한 간단한 CRUD API 만들기

이번 글에서는 ORM에 대한 사용 방법에 대해 알아보도록 하겠습니다. ORM은 Object Relation Mapping의 약자로 객체를 이용해서 데이터베이스 Entity에 접근하는 방법입니다. 보통 애플리케이션 레벨에서 DB에 접근할 때는 데이터베이스 드라이버를 이용하여 SQL Query를 던져 실행하는 방법을 사용하지만 SQL Query는 소프트웨어 엔지니어에게 있어 러닝 커브를 증가 시키고, 소프트웨어 코드 가독성을 저하시키는 원인이 되었습니다. 하지만 ORM을 이용하면 기본적인 CRUD를 포함한 간단한 쿼리에 대해 SQL Query를 프로그래밍 코드에 질의하지 않아도 프로그래밍 코드 안에서 처리할 수 있는 이점을 얻을 수 있습니다. Python 언어에서의 대표적인 ORM 라이브러리로 SQLAlch..

2020. 12. 25. 16:42

[FastAPI] 1. GET, POST, PUT, DELETE 등 기본 API 만들고 문서 자동화 해보기

지난 글에 이어서 FastAPI를 이용해서 기본적인 REST API 개발 이야기 두 번째를 이어가보도록 하겠습니다. 우리가 REST API를 개발하면 주요 메소드 종류 5가지가 있는데요. 바로 GET, POST, PUT, DELETE, PATCH 이렇게 5가지 입니다. 물론 이 외에도 OPTIONS가 있지만 이 글에서는 다루지 않겠습니다. 기본 API 만들기 (GET) REST API의 기본 API는 먼저 GET 메소드부터 시작됩니다. GET 메소드는 서버로부터 리소스를 가져올 때 쓰는 READ API 입니다. FastAPI에서는 아래의 두 가지 방법으로 작성할 수 있습니다. from fastapi import FastAPI app = FastAPI() @app.route('/health') async ..

2020. 12. 25. 15:16

[Python] FastAPI 프레임워크를 이용한 비동기 REST API 개발

Python 언어를 이용하여 REST API 서버를 만들 수 있는 방법은 여러 방법이 있습니다. 국내 혹은 많은 개발자들의 사랑을 받고 있는 Django, 그리고 가벼운 프레임워크로써 많이 사용하고 있는 Flask 등 여러가지가 있는데요. 이번 글에서는 Jetbrains의 IDE 도구인 PyCharm과 FastAPI 프레임워크를 이용해서 REST API 서버를 개발하는 시간을 가져보도록 하겠습니다. What is FastAPI? Python에서는 웹 서버와 연동하기 위해 WSGI라는 인터페이스를 사용합니다. 그러나 WSGI는 동기 방식으로 프로그램을 처리하기 때문에 미리 들어온 요청을 처리할 때까지 다음 사람이 계속 기다려야 하는 단점을 감수해야 합니다. FastAPI는 Starlette이라는 비동기 프..