Python

Background Task API를 개발하다보면 사용자의 요청을 받아 오래걸리는 작업을 해야하는 경우가 종종 있다. 예를 들어, 이메일을 전송하는 로직은 몇 초 이상 걸리기도 한다. 사용자 입장에서는 이메일을 보내는 데 몇 초가 걸리는 것을 기다릴 수 있다고 생각할 수도 있지만, 서버의 입장에서는 불필요하게 리소스를 점유하는 상황을 피하고 싶을 것이다. 이러한 경우에 이메일이 전송 완료되는 것을 기다릴 필요 없이 이메일 전송요청이 오면 바로 응답을 보내고, 별도로 이메일을 보내는 작업을 하는 것이 최선의 방법일 것이다. FastAPI에서는 이렇게 응답을 빠르게 보내고, 추가 작업을 처리할 수 있는 Background Task를 제공한다. 사용법 Background Task를 사용하기 위해서는 먼저 백그..
Middleware Middleware은 어플리케이션의 중간에서 다양한 역할을 수행하는 컴포넌트를 말한다. 클라이언트와 서버 사이의 로드밸런서도 미들웨어의 일종이고, 데이터베이스와 서버 사이의 캐시 서버도 미들웨어의 일종이라고 할 수 있다. FastAPI에서의 비교적 좁은 의미로, 들어오는 모든 요청에 적용되는 함수를 미들웨어라고 한다. 이번 글에서는 FastAPI에서 Middleware를 적용하는 방법에 대해서 알아본다. HTTP Middleware는 모든 HTTP 요청에 대해 같은 함수를 적용할 수 있다. 이것을 사용해서 할 수 있는 것 중 대표적인 것이 실행시간을 측정하는 것이다. 각 HTTP 요청에 대해 path operation을 실행하기 전과 후에 시간을 체크해서 요청을 처리하는 데 걸린 시간..
Exception 어플리케이션을 만들 때 잘 동작하는 경우만 생각하는 실수를 범하기 쉽다. 예를 들어, 로그인 화면에서 이메일을 입력하라고 해도 이메일을 입력하지 않는 사람도 많다. 또는 숫자를 입력해야하는 곳에 문자열을 입력하거나, 계좌이체를 할 때 계좌 잔액보다 많은 금액을 입력하는 경우도 발생할 수 있다. 개발자는 당연하다고 생각한 것들이 사용자들에게는 아닐 수 있다. 혹은 악의적인 의도를 가지고 이상한 값을 입력하는 경우도 많다. 이유가 어찌됐든 이러한 예외적인 상황을 생각하고 대비해야 좋은 서비스를 만들 수 있다. 이번 글에서는 FastAPI에서 이러한 예외 상황을 처리하는 방법을 알아보도록 한다. HTTPException 가장 간단한 방법은 HTTPException을 사용하는 것이다. HTTP..
로그인 일부 무료 어플리케이션을 제외하고 대부분의 어플리케이션은 요청을 보낸 사용자가 누구인지 알아야 하는 상황이 있다. 이전에 썼던 글을 조회한다거나, 글을 쓴 사람이 누구인지, 또 자신의 닉네임을 확인하고 변경하는 등의 상황에서 만약 어플리케이션이 해당 유저가 누구인지 확인할 수 없다면 다른 사람의 정보가 노출될 것이다. 따라서 로그인을 통해 해당 사용자가 누구인지, 또 특정한 요청을 보낼 수 있는 자격이 있는지를 확인할 필요가 있다. 이렇게 사용자가 누구인지를 확인하는 것을 인증(Authentication), 자격이 있는지 확인하는 것을 인가(Authorization)라고 한다. FastAPI에서는 이러한 인증, 인가 프로세스를 쉽게 구현할 수 있게 여러가지 도구를 제공한다. 이번 글에서는 Fast..
SQLAlchemy ORM 이전 글에서 SQLAlchemy를 사용해서 직접 쿼리를 작성하는 방법을 알아보았다. 이번 글에서는 SQLAlchemy ORM을 사용해서 좀 더 편리하게 데이터를 삽입, 조회, 수정, 삭제하는 방법을 알아보도록 하겠다. Session SQLAlchemy Core에서 Connection을 이용해서 데이터베이스에 연결한 것처럼, SQLAlchemy ORM은 Session 객체를 이용해 데이버베이스와 상호작용할 수 있다. 사용 방법도 Connection과 흡사하고, 실제로도 Session 내부적으로 Connection을 사용한다. from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmake..
DB 연결 어플리케이션에서 데이터를 저장하려면 데이터 저장소가 필요하다. 이미지나 직렬화된 데이터를 저장하는 오브젝트 스토리지, JSON 파일을 저장하는 도큐먼트 스토리지, key-value를 저장하는 스토리지 등등 다양한 종류가 있지만, 가장 흔하게 사용하는 것은 RDB(관계형 데이터베이스)일 것이다. 이번 글에서는 FastAPI를 사용해 RDB에 연결하고, 데이터를 저장, 조회, 수정, 삭제하는 방법을 알아볼 것이다. RDB로는 MySQL 8버전을 사용할 것이고, FastAPI 공식 튜토리얼에서도 사용하는 SQLAlchemy를 사용할 것이다. SQLAlchemy SQLAlchemy는 Python에서 SQL을 사용할 수 있게 해주는 라이브러리이며, ORM 기능도 제공한다. 쉽게 말해, SQLAlchem..
DI(Dependency Injection) Dependency란 어떤 일을 진행하기 위해서 필요한 외부의 코드를 말한다. 시스템 차원에서 이러한 Dependency들을 필요한 곳에 제공하는 것을 DI(Dependency Injection)라고 한다. FastAPI도 DI를 간단히 사용할 수 있는 방법을 제공한다. 이번 글에서는 FastAPI에서 DI를 제공하는 방법에 대해 살펴본다. 참고로, Spring에서의 DI와 비교하자면 FastAPI에서의 DI는 조금 더 확장된 개념인 것 같다. Spring에서는 Bean으로 관리되는 컴포넌트들을 자동으로 주입해주는 기능이라면, 추가적으로 Filter에서 제공하는 기능을 일부 포함한다고 보면 될 것 같다. Dependable FastAPI에서 Dependency..
Path Operation Path는 URL에서 도메인 뒤에 붙는 경로를 말한다. 예를 들어, 아래와 같은 URL이 있다고 하자. https://example.com/items/foo 여기서 Path에 해당하는 것은 /items/foo Operation은 HTTP 메소드를 말한다. GET, POST, PUT, DELETE 이외에도 OPTIONS, HEAD, PATCH 등이 있다. 이렇게 Path와 Operation의 조합을 Path Operation이라고 한다. FastAPI에서는 특정한 Path Operation으로 요청이 왔을 때 실행할 함수를 decorator로 FastAPI 인스턴스에 등록할 수 있다. @app.get("/") def hello_world(): return {"Hello": "Wo..
ready-go
'Python' 카테고리의 글 목록