logo
logo
백엔드
FastAPI
파이썬 웹 프레임워크 중 가장 빠른 속도를 자랑하며 Django와 Flask와 비교 불가한 성능을 보여준다
StackOverflow 질문 수: 7623
Github Stars : ★ 82685
사용 기업
인공지능
직장
소셜/컨텐츠
모빌리티
금융/보험
교육
패션
이커머스
기타
종합
헬스케어
techstack-logo
슈퍼브에이아이
techstack-logo
원티드랩
techstack-logo
드림어스컴퍼니
techstack-logo
쏘카
techstack-logo
페이히어
techstack-logo
자란다
techstack-logo
브랜디
techstack-logo
큐피스트
techstack-logo
숨고
techstack-logo
라이너
techstack-logo
카카오엔터테인먼트
techstack-logo
업라이즈
techstack-logo
모노리스
techstack-logo
팀스파르타
techstack-logo
에이비일팔공
techstack-logo
비바리퍼블리카
techstack-logo
SK플래닛
techstack-logo
피플펀드컴퍼니
더 보기
기술 블로그 글
SK텔레콤
FastAPI에서의 의존성 주입: 유연하고 확장 가능한 서비스 구조 만들기
FastAPI는 빠르고 효율적인 웹 프레임워크로, Python을 사용해 REST API를 구축하는 데 매우 유용합니다.이 프레임워크는 또한 의존성 주입(Dependency Injection)을 쉽게 구현할 수 있는 강력한 기능을 제공하여, 더 유연하고 확장 가능한 서비스 구조를 설계하는 데 도움을 줍니다.이번 글에서는 의존성 주입이 무엇인지, 그리고 FastAPI에서 이를 어떻게 적용할 수 있는지 살펴보겠습니다.SOLID 원칙과 의존성 역전 원칙 (DIP)SOLID 원칙은 객체지향 설계의 다섯 가지 주요 원칙을 의미하며, 소프트웨어 개발에서 유연성과 유지보수성을 높이는 데 중점을 둡니다.그중에서도 DIP(Dependency Inversion Principle, 의존성 역전 원칙)은 실무에서 특히 많이 활용되는 원칙 중 하나입니다.DIP는 고수준 모듈(비즈니스 로직)이 저수준 모듈(구체적인 구현체)에 의존하지 않고, 추상화에 의존하도록 설계함으로써 시스템의 결합도를 낮추고 유연성을 높이는 것을 목표로 합니다.아래는 이 구조를 시각적으로 표현한 다이어그램입니다.다이어그램에서 볼 수 있듯이, 고수준 모듈은 추상화된 인터페이스에만 의존하고, 구체적인 구현체는 추상화된 인터페이스를 구현하는 방식으로 설계됩니다.DIP는 쉽게 말해 구체적인 구현 대신 추상화에 의존함으로써, 코드의 수정 없이도 구현체를 교체할 수 있는 구조를 만드는 것을 의미합니다.이로 인해 비즈니스 로직은 데이터 접근 방식의 변화에 영향을 받지 않으며, 시스템의 유지보수성과 확장성을 크게 개선할 수 있습니다.DIP와 의존성 주입 (DI)의존성 주입(Dependency Injection, DI)은 의존성 역전 원칙(DIP)을 구현하는 방법 중 하나입니다.DI는 객체가 직접적으로 다른 객체를 생성하거나 참조하지 않고, 외부에서 필요한 객체를 주입받도록 함으로써 DIP를 실현합니다.이를 통해 시스템의 결합도를 낮추고, 구현체를 쉽게 교체하며, 테스트 용이성을 높일 수 있습니다.이번 글에서는 이러한 의존성 주입을 FastAPI에서 어떻게 활용할 수 있는지, 구체적인 예시를 통해 살펴보겠습니다.의존성 주입은 프로그램의 각 구성 요소가 서로 강하게 결합되는 것을 피하기 위해 사용하는 디자인 패턴입니다.보통 서비스 로직은 데이터 접근 로직과 같은 특정 모듈에 직접 의존하게 되는데, 이는 시스템의 유지보수성을 떨어뜨리고 확장 가능성을 제한합니다.이를 해결하기 위해 의존성 주입은 구체적인 구현체 대신 추상화된 인터페이스에 의존하도록 하여 유연성을 높입니다.간단히 말해, 의존성 주입은 특정 객체가 직접적으로 다른 객체를 생성하거나 의존하지 않도록 하고, 외부에서 필요한 객체를 주입함으로써 시스템의 결합도를 낮추는 방법입니다.이를 통해 구현체 변경이 쉽고, 테스트 시 모의 객체(mock)를 주입하여 독립적인 테스트를 수행할 수 있습니다.FastAPI에서 의존성 주입의 필요성FastAPI에서는 의존성 주입을 사용해 비즈니스 로직과 데이터 접근 로직 간의 결합도를 낮추고, 유연하게 서비스 구조를 변경할
fastapi
mysql
SK텔레콤
FastAPI에 모듈화된 구조 적용을 통한 빠른 프로토타이핑
오늘은 FastAPI와 SQLite를 사용하여 간단한 사용자 정보 관리 기능을 구축하고, 프로젝트를 모범 사례에 맞게 그리고, Fast라는 말에 걸맞게 신속하게 모듈화하는 과정을 공유해보려 합니다.이 글에서는 FastAPI의 주요 기능들을 활용해 어떻게 프로젝트 구조를 만들 수 있는지에 관한 간단한 예시를 소개합니다.이 프로젝트 구조는 API 엔드포인트(api/)와 데이터베이스 연동(db/, crud/)을 모듈화하여 관리합니다.• None 모델 정의는 models/에,• None 데이터 검증용 스키마는 schemas/에 분리하여 코드의 가독성과 유지 보수성을 높였습니다.• None 최상위 main.py는 FastAPI 애플리케이션을 초기화하고 라우터를 등록하는 역할을 합니다.이제, 각 모듈이 어떤 역할을 하는지 자세히 살펴보겠습니다.SQLite 데이터베이스를 설정하기 위해 파일을 작성했습니다.여기서는 함수를 통해 **의존성 주입(Dependency Injection)**을 사용하여 데이터베이스 세션을 주입합니다.2) 데이터베이스 모델 정의 (models/user.py)사용자 테이블을 정의하기 위해 파일을 작성했습니다.입력과 출력을 검증하기 위해 Pydantic 모델을 사용했습니다.데이터베이스와 상호작용하는 CRUD 함수들을 에 정의했습니다.에서는 사용자 관련 API를 정의했습니다.파일에서 FastAPI 애플리케이션을 생성하고 라우터를 등록합니다.서버 기동에 필요한 패키지를 배포합니다.이제 모든 준비가 끝났습니다! FastAPI 서버를 실행해서 API의 동작을 확인해 볼 수 있습니다.• None 모듈화된 프로젝트 구조의 중요성 🚀• None , , , , 로 기능을 분리하여 코드 가독성과 유지 보수성을 크게 향상할 수 있습니다. 모듈화를 통해 재사용성과 확장성이 극대화되었으며, 추후 기능 추가나 데이터베이스 변경이 용이한 구조를 갖추었습니다.• None• None 의존성 주입(Dependency Injection)을 사용해 데이터베이스 세션을 안전하게 관리하고, Pydantic을 활용해 입력 데이터 검증을 강화할 수 있습니다.• None SQLite와 SQLAlchemy를 통한 빠른 프로토타이핑 💡• None SQLite를 사용해 빠르게 데이터베이스 설정을 완료하고, SQLAlchemy로 ORM 방식을 적용해 데이터베이스 관련 처리를 직관적이고 효율적으로 구성할 수 있습니다.• None API 설계와 예외 처리의 중요성 🛡️• None RESTful API 원칙을 준수하며, FastAPI의 HTTPException을 활용해 에러 처리를 구조화했습니다. 이를 통해 명확한 에러 메시지 제공으로 사용자 경험을 개선할 수 있습니다.• None• None FastAPI의 자동 Swagger 문서 생성을 통해 API 테스트를 효율적으로 진행할 수 있었고, 을 사용해 빠르게 서버를 실행해 개발 속도를 높일 수 있습니다.
fastapi
SK텔레콤
FastAPI 프로젝트의 결합도 낮추기 전략
소프트웨어 개발에서 결합도(Coupling)를 낮추고 응집도(Cohesion)를 높이는 것은 유지보수성과 확장성을 향상시키는 핵심 전략입니다.특히 웹 애플리케이션 개발에서 모듈간의 결합도를 낮추면 코드의 재사용성과 테스트 용이성이 크게 향상됩니다.이번 글에서는 FastAPI 프로젝트에서 파일들을 service 구현 그룹과 router 구현 그룹으로 그룹핑하여 결합도를 낮추는 방법을 살펴보겠습니다.결합도를 낮추는 아키텍처의 필요성높은 결합도가 초래하는 위험아키텍처 설계를 소홀히 하거나 결합도를 낮추는 전략을 고려하지 않으면 다음과 같은 문제들이 발생할 수 있습니다:• None 유지보수성 저하: 한 모듈의 변경이 다른 모듈에 연쇄적으로 영향을 미쳐 수정 범위가 넓어집니다.• None 예시: 데이터베이스 스키마 변경 시, 비즈니스 로직과 API 레이어 모두를 수정해야 하는 상황이 발생합니다.• None 확장성 제한: 새로운 기능을 추가하거나 변경하기 어려워집니다.• None 예시: 새로운 API 엔드포인트를 추가하려면 기존 모듈들을 대폭 수정해야 합니다.• None 재사용성 감소: 특정 기능을 다른 프로젝트나 모듈에서 재사용하기 어렵습니다.• None 예시: 다른 프로젝트에서 비슷한 기능이 필요해도 기존 코드를 활용할 수 없습니다.• None 협업 장애: 팀원 간 작업이 겹치거나 충돌하여 생산성이 떨어집니다.• None 예시: 여러 개발자가 동일한 파일을 수정하면서 충돌이 빈번하게 발생합니다.• None 테스트 어려움: 모듈간 의존성이 높아 개별적인 단위 테스트가 어렵습니다.• None 예시: 서비스 레이어를 테스트하려면 데이터베이스와 API 레이어까지 모두 설정해야 합니다.이러한 문제를 해결하기 위해 결합도를 낮추는 아키텍처가 필요합니다.FastAPI는 Python의 최신 기능과 표준을 활용하여 빠르고 효율적인 API를 구축할 수 있게 해주는 프레임워크입니다. 주요 특징은 다음과 같습니다:• None 고성능: 비동기 지원으로 높은 성능을 제공합니다.• None 타입 힌트 기반 개발: Python의 타입 힌트를 활용하여 코드의 가독성과 안정성을 높입니다.• None 자동 문서화: Swagger UI 및 ReDoc을 통한 자동 API 문서 생성을 지원합니다.• None 개발 생산성 향상: 최소한의 코드로 강력한 기능을 구현할 수 있습니다.하지만 이러한 장점을 최대한 활용하려면, 모듈 간 결합도를 낮추고 응집도를 높이는 아키텍처 설계가 필요합니다.역할: 비즈니스 로직과 데이터 처리를 담당하는 핵심 그룹입니다. 데이터베이스와의 상호 작용 및 데이터 가공 로직을 포함합니다.역할: 클라이언트와의 통신을 담당하는 그룹입니다. 클라이언트의 요청을 받아 서비스 그룹의 기능을 호출하여 데이터를 처리하고, 결과를 클라이언트에 응답합니다.결합도를 낮추는 아키텍처의 이점개발자 민수는 비즈니스 로직에 새로운 할인 정책을 적용해야 했습니다.서비스 레이어에서 로직을 수정했지만, router 레이어와 독립적이기 때문에 다른 팀원들이 작업 중인 API 엔드포인트 코드에는
fastapi
SK텔레콤
FastAPI에서 자동 생성되는 Swagger 문서의 cdn.jsdelivr.net 의존성 없애기
다들 알고 계시겠지만, 얼마 전에 큰 일이 있었어요.지난 목요일(5/3)에 cdn.jsdelivr.net이 접속불능에 빠졌습니다.bootstrap, jquery 등등을 저희가 link tag로 편하게 이용하고자 할 때, 무심코 접속하게 되는 사이트입니다.제가 js, css 번들을 다운 받을 필요 없이, 단지 저 link tag를 html에 삽입하는 것만으로 위 라이브러리들을 사용할 수 있어서 편하게 사용들을 했었는데요.저거 넣어서 만들었던 서비스들이 여럿 깨져있어서, cdn.jsdelivr.net이 복구 될 때까지 매우 혼란스러운 하루를 보냈었습니다.대부분의 서비스는, js, css 번들 다운 받아 붙이는 걸로 금새 복구할 수 있었는데,fastapi에는 자동으로 swagger 문서를 생성해주는 매우 편리한 기능이 있는데요.이걸 사내 api 만들어서 공유할 때 engr들이 엄청 많이 쓰고 있었는데, (사실상 fastapi를 사용하는 이유의 8할...)문제는 fastapi에서 자동으로 만드는 swagger 문서가이 두 녀석으로부터 css, js를 받아온다는 것이었습니다.fastapi에서 자동으로 생성해주는 docs endpoint에 대한 configuration 때문에 고민을 좀 했었어요. 결론적으로는 이렇게 해결하시면 됩니다.일단 swagger-ui.css 하고 swagger-ui-bundle.js 를 구합니다.저는 그냥 브라우저로 저 url에 접속해서 구해둔 게 있어서 썼는데요. 구글 검색하시면 css, js 구하실 수 있으실 거예요.얼추 project가 이렇게 구성되어 있다고 치면,app.py를 이렇게 구성하시면 됩니다. 간단한 샘플 코드니 보면 바로 이해되실 거예요.기본적으로 fastapi의 /docs endpoint는fastapi.openapi.docs 에 있는 get_swagger_ui_html 을 실행해서 출력하도록 되어 있습니다.이 부분을 원하는 대로 커스터마이징해서 실행하도록 구성하면 설정을 바꿔줄 수 있어요.저 코드를 실행하고 docs 엔드포인트에 들어가보면저렇게 swagger 문서에서 cdn.jsdelivr.net과의 의존성이 없어진 것을 확인하실 수 있습니다.
fastapi
swagger
연관 기술 스택
techstack-logo
Django
techstack-logo
Flask
Copyright © 2025. Codenary All Rights Reserved.