Openstack 기반 클라우드 플랫폼 개발 =================================== **수행 기간 : 2023.06 ~ 현재** 프로젝트 개요 ------------- .. image:: _static/cloud-api/cloud-api-표지.png :align: center :width: 800px **Openstack 기반의 클라우드 플랫폼을 만들기 위한 백엔드 시스템 개발 프로젝트 입니다.** - 가상 Network(VPC) API - Volume(Block Storage) API - SSHkey API - Peering Gateway API - NAS API - FileBackup API 위와 같은 클라우드를 사용하기 위한 기본 자원을 제공하는 API 서버를 개발하고 있습니다. 개발 환경 --------- - Language : ``Python 3.11`` - Framework : ``FastAPI`` - ORM : ``Sqlalchemy``, ``Alembic`` - Cloud Infra : ``Openstack`` - DB : ``MySql``, ``Redis`` - MQ : ``Kafka`` - Deploy : ``Docker``, ``k8s``, ``Gitlab CI/CD`` 아키텍처 -------- .. image:: _static/cloud-api/cloud-api-architecture.png :align: center :width: 800px - ``MSA`` 기반의 아키텍처로 서비스를 분리하여 개발 - 인증/인가 서비스, 클라우드 자원 관리 서비스, 클라우드 자원 모니터링 서비스로 구성 - ``Kafka`` 를 사용해 비동기적으로 서비스 간 자원 상태 동기화 처리 역할 및 기여 ------------ 주요 업무 ^^^^^^^^^ - ``FastAPI`` 를 활용한 프로젝트 구품 설계/구현 - 클라우드 도메인의 상품 분석 및 API 설계 - 클라우드 자원과 관련된 DB 스키마 설계 - 아키텍처 개선 - `비동기 프로세스 설계 및 구현 `_ 주요 개선 사항 ^^^^^^^^^^^^^^ 1. Sqlalchemy 버전 업그레이드 (1.4 -> 2.0) - 프로젝트에 적용된 SqlAlchemy 버전을 업그레이드 하는 작업을 수행 - 1.4 버전은 레거시 버전으로 지정되어 사후지원이 불투명 - 마이그레이션으로 얻을 수 있는 기술적 이점을 고려(typing, 쿼리 성능 개선 등) 2. alembic 도입을 통한 DB 버전 관리 - 기존 프로젝트들은 개발자의 로컬 환경, 배포 환경(개발, QA, Production) 간 DB를 수동으로 DML을 실행해 관리 - 또한 QA, Product 환경은 dbsafer로 팀장 결재 이후 DML 쿼리를 실행해야 하는 프로세스가 존재 - alembic을 도입, 배포 후 애플리케이션 실행 시점에 자동으로 최신 버전의 DB로 업그레이드할 수 있게 개선 3. Async-Blocking 구조 개선 - 기존 프로젝트에는 경로 함수를 async def로 작성해 비동기 처리하도록 설계 - async 함수에 DB 쿼리를 동기적으로 수행하는 코드가 있어 경우 async-blocking 현상 발생 - 해당 코드를 sqlalchemy 의 비동기 세션을 사용하는 방식으로 변경하는 리팩토링 진행 4. 단위테스트, 테스트 프레임워크를 적용해 테스트 코드 생산성 향상 - DB를 사용하는 통합 테스트를 성공/실패 모든 테스트 케이스에 사용되는 상황 - mocking, fixture를 코드로 인해 테스트 작성이 힘들어짐 - 테스트 데이터를 fixture를 통해 객체로 만들고 db에 저장하는 테스트 프레임워크 제작 - 테스트를 종류별로 지정해 통합 테스트를 최소화 하고 단위 테스트로 책임 분리 5. 애플리케이션 아키택처 개선 - 유지보수성과 높은 응집력, 낮은 결합력을 유지하는 소프트웨어를 만들기 위한 작업을 진행 - FastAPI 기반 어플리케이션에 클린 아키텍처(Controller, Service, Repository) 도입 - dependency injector 라이브러리를 사용하여 의존성을 외부에서 주입 가능한 형태로 변경 - 작업 단위 패턴(UoW)을 적용해 서비스 레이어에서 DB작업에 대한 원자성을 유지할 수 있게 변경 - 공통 기능을 uility 패키지로 만들어 라이브러리를 팀 내에서 공유해서 사용할 수 있게 변경