FastAPI 기반 마이크로서비스 아키텍처 구축 가이드 - 코드픽 블로그
FastAPI 기반 마이크로서비스 아키텍처 구축 가이드
기술 가이드

FastAPI 기반 마이크로서비스 아키텍처 구축 가이드

2026년 3월 14일 48 views by 코드벤터

FastAPI 기반 마이크로서비스 아키텍처 구축 가이드

현대 소프트웨어 개발에서 시스템의 복잡성은 날이 갈수록 증가하고 있습니다. 사용자 요구사항은 다양해지고, 서비스는 끊임없이 확장되어야 하며, 장애 발생 시에도 시스템은 안정적으로 작동해야 합니다. 이러한 도전 과제에 대응하기 위한 강력한 해법 중 하나가 바로 **마이크로서비스 아키텍처(Microservices Architecture, MSA)**입니다.

그리고 파이썬 생태계에서 마이크로서비스를 구축하기 위한 가장 빠르고 효율적인 도구로 FastAPI가 주목받고 있습니다. 비동기 지원, 강력한 타입 힌트, 자동 문서화 기능은 FastAPI가 마이크로서비스 환경에서 빛을 발하게 합니다.

이 가이드에서는 FastAPI를 활용하여 확장 가능하고 유지보수하기 쉬운 마이크로서비스 아키텍처를 구축하는 방법을 심층적으로 다룹니다. 서비스 분할 전략부터 API Gateway, 서비스 간 통신, 컨테이너화 및 배포까지, 실전 코드 예제와 함께 마이크로서비스 개발의 핵심 요소를 단계별로 살펴보겠습니다.

1. 마이크로서비스 아키텍처 이해

마이크로서비스 아키텍처는 단일의 거대한 애플리케이션을 여러 개의 작고 독립적인 서비스로 분리하여 구축하는 방식입니다. 각 서비스는 자체적인 비즈니스 로직을 가지며, 독립적으로 개발, 배포, 확장될 수 있습니다.

1.1. 모놀리식 vs. 마이크로서비스

전통적인 모놀리식(Monolithic) 아키텍처는 모든 기능이 하나의 코드베이스 내에 통합되어 있는 형태입니다. 이는 개발 초기 단계에서는 빠르고 간단할 수 있지만, 시스템이 커질수록 여러 문제에 직면하게 됩니다. 반면 마이크로서비스는 이러한 문제에 대한 대안을 제시합니다.

특징모놀리식 아키텍처마이크로서비스 아키텍처
**개발**단일 팀, 단일 코드베이스, 쉬운 디버깅여러 팀, 독립적인 코드베이스, 복잡한 통신
**배포**전체 애플리케이션 재배포, 느리고 위험각 서비스 독립적 배포, 빠르고 안전
**확장성**전체 시스템 수직/수평 확장, 비효율적특정 서비스만 독립적 확장, 효율적
**장애 격리**한 부분 장애 시 전체 시스템 영향한 서비스 장애 시 다른 서비스에 미치는 영향 최소화
**기술 스택**단일 기술 스택 (예: Python, Django)Polyglot (각 서비스에 최적화된 기술 스택 선택 가능)
**유지보수**코드베이스 커질수록 복잡도 증가, 병목 현상 발생각 서비스는 작고 이해하기 쉬움, 개별 유지보수 용이

1.2. 마이크로서비스의 장단점

장점:

  • 확장성 (Scalability): 특정 서비스에 부하가 집중될 경우 해당 서비스만 독립적으로 확장할 수 있어 자원 효율성이 높습니다.
  • 탄력성 (Resilience): 한 서비스에 장애가 발생해도 다른 서비스에 미치는 영향을 최소화하여 전체 시스템의 안정성을 높입니다.
  • 독립적인 배포 (Independent Deployment): 각 서비스는 독립적으로 배포될 수 있어 배포 주기가 짧아지고 위험 부담이 줄어듭니다.
  • 기술 스택 다양성 (Polyglot Persistence/Programming): 각 서비스의 특성에 맞는 최적의 프로그래밍 언어나 데이터베이스를 선택할 수 있습니다.
  • 개발 속도 향상: 작은 서비스 단위로 개발이 이루어져 개발팀의 생산성이 향상되고, 새로운 기능을 빠르게 추가할 수 있습니다.

단점:

  • 복잡성 증가: 분산 시스템의 특성상 개발, 테스트, 배포, 운영이 모놀리식보다 훨씬 복잡합니다.
  • 운영 오버헤드: 여러 서비스를 관리하고 모니터링해야 하므로 운영 비용과 노력이 증가합니다.
  • 데이터 일관성: 서비스 간 데이터베이스가 분리되어 있어 분산 트랜잭션 및 데이터 일관성 유지가 어렵습니다.
  • 네트워크 지연 및 통신 오버헤드: 서비스 간 통신 시 네트워크 지연이 발생할 수 있으며, 직렬화/역직렬화에 따른 오버헤드가 있습니다.

2. FastAPI, 마이크로서비스를 위한 최적의 선택

FastAPI는 파이썬 3.7+ 버전에서 비동기 웹 애플리케이션을 구축하기 위한 고성능 웹 프레임워크입니다. 마이크로서비스 아키텍처에 매우 적합한 여러 특징을 가지고 있습니다.

2.1. FastAPI의 핵심 특징

  • 높은 성능: Starlette과 Pydantic을 기반으로 하여 Node.js 및 Go와 동등한 수준의 매우 빠른 성능을 제공합니다.
  • 비동기 지원: async/await 문법을 기본적으로 지원하여 I/O 바운드 작업(네트워크 요청, 데이터베이스 접근 등)이 많은 마이크로서비스 환경에서 뛰어난 효율성을 발휘합니다.
  • 자동 API 문서화: OpenAPI(Swagger UI) 및 ReDoc을 자동으로 생성하여 API 명세를 쉽게 공유하고 테스트할 수 있습니다. 이는 여러 서비스 간의 협업에 필수적입니다.
  • 데이터 유효성 검사 및 직렬화: Pydantic을 통해 강력한 데이터 유효성 검사와 직렬화를 제공하여 안정적인 API를 구축할 수 있습니다.
  • 타입 힌트 활용: 파이썬의 타입 힌트를 적극적으로 활용하여 코드 자동 완성, 에러 검출, 코드 가독성을 높입니다.
  • 쉬운 학습 곡선: 직관적인 API와 풍부한 문서 덕분에 빠르게 학습하고 생산성을 높일 수 있습니다.

2.2. FastAPI로 마이크로서비스를 구축해야 하는 이유

FastAPI는 마이크로서비스의 핵심 요구사항을 충족시키면서 파이썬의 생산성을 극대화합니다.

  • 빠른 개발 속도: Pydantic 모델과 자동 문서화 덕분에 API 개발 및 테스트 시간을 크게 단축할 수 있습니다.
  • 뛰어난 성능: 비동기 처리와 낮은 오버헤드로 인해 높은 트래픽을 처리하는 마이크로서비스에 적합합니다.
  • 강력한 데이터 유효성 검사: 서비스 간 데이터 교환 시 발생할 수 있는 오류를 사전에 방지하여 안정성을 높입니다.
  • 명확한 API 계약: 자동 생성되는 OpenAPI 문서는 여러 서비스 개발팀 간의 API 계약을 명확하게 하고 커뮤니케이션 비용을 줄여줍니다.
  • 컨테이너 친화적: 가볍고 빠르게 시작할 수 있어 Docker, Kubernetes와 같은 컨테이너 환경에 최적화되어 있습니다.

3. FastAPI 마이크로서비스 아키텍처 핵심 구성 요소

성공적인 마이크로서비스 아키텍처를 구축하기 위해서는 몇 가지 핵심 구성 요소를 이해하고 설계해야 합니다.

3.1. 서비스 분할 전략 (Service Decomposition)

마이크로서비스 아키텍처의 가장 중요한 첫 단계는 시스템을 어떤 기준으로 서비스로 분할할 것인지 결정하는 것입니다.

  • 비즈니스 기능 기준 (Domain-driven design): 가장 일반적인 방법으로, 특정 비즈니스 도메인(예: 사용자 관리, 주문 처리, 상품 관리)을 기준으로 서비스를 나눕니다. 각 서비스는 해당 도메인의 모든 비즈니스 로직과 데이터를 책임집니다.
  • 바운디드 컨텍스트 (Bounded Context): DDD(Domain-Driven Design)의 개념으로, 각 서비스가 명확한 경계를 가지는 컨텍스트 내에서 작동하도록 합니다. 예를 들어, 상품이라는 개념은 재고 관리 서비스와 카탈로그 서비스에서 다르게 정의될 수 있습니다.
  • 데이터베이스 기준: 각 서비스가 독립적인 데이터베이스를 가지도록 분할합니다. 이는 데이터 일관성 문제를 야기할 수 있지만, 서비스 간의 강력한 결합을 방지합니다.

3.2. API Gateway

API Gateway는 외부 클라이언트(웹, 모바일 앱)의 모든 요청을 받아 적절한 내부 마이크로서비스로 라우팅하는 단일 진입점 역할을 합니다.

주요 기능:

  • 요청 라우팅: 외부 요청을 올바른 서비스로 전달합니다.
  • 인증 및 권한 부여: 모든 요청에 대한 인증 및 권한 검사를 수행합니다.
  • 로깅 및 모니터링: 모든 요청/응답에 대한 로그를 기록하고 성능 지표를 수집합니다.
  • 속도 제한 (Rate Limiting): 과도한 요청으로부터 백엔드 서비스를 보호합니다.
  • 응답 변환: 여러 서비스의 응답을 클라이언트에 필요한 형태로 통합하거나 변환합니다.

FastAPI 자체를 사용하여 간단한 API Gateway를 구축할 수도 있지만, 실제 운영 환경에서는 Nginx, Kong, Ocelot 등 전문 API Gateway 솔루션을 사용하는 것이 일반적입니다.

python
# 간단한 FastAPI 기반 API Gateway 예시 (실제 운영용은 아님)
from fastapi import FastAPI, Request, HTTPException
import httpx # 비동기 HTTP 클라이언트

app = FastAPI()

# 내부 서비스들의 주소 (실제로는 서비스 디스커버리에서 가져옴)
SERVICE_URLS = {
    "users": "http://user-service:8001",
    "products": "http://product-service:8002",
}

@app.api_route("/{service_name}/{path:path}", methods=["GET", "POST", "PUT", "DELETE"])
async def gateway(service_name: str, path: str, request: Request):
    if service_name not in SERVICE_URLS:
        raise HTTPException(status_code=404, detail=f"Service {service_name} not found")

    target_url = f"{SERVICE_URLS[service_name]}/{path}"
    
    # 요청 헤더, 쿼리 파라미터, 바디 등을 복사하여 전달
    headers = {k: v for k, v in request.headers.items() if k.lower() not in ["host", "content-length"]}
    
    async with httpx.AsyncClient() as client:
        try:
            # 요청 메서드에 따라 적절한 클라이언트 메서드 호출
            if request.method == "GET":
                response = await client.get(target_url, params=request.query_params, headers=headers)
            elif request.method == "POST":
                body = await request.body()
                response = await client.post(target_url, params=request.query_params, headers=headers, content=body)
            # ... PUT, DELETE 등 다른 메서드 처리
            else:
                raise HTTPException(status_code=405, detail="Method Not Allowed")

            response.raise_for_status() # HTTP 에러 발생 시 예외 처리
            return response.json()
        except httpx.HTTPStatusError as e:
            raise HTTPException(status_code=e.response.status_code, detail=str(e.response.text))
        except httpx.RequestError as e:
            raise HTTPException(status_code=500, detail=f"Proxy error: {e}")

# 실행: uvicorn gateway_main:app --host 0.0.0.0 --port 8000

3.3. 서비스 간 통신 (Inter-service Communication)

마이크로서비스는 서로 독립적으로 작동하지만, 필요한 경우 데이터를 교환해야 합니다. 통신 방식은 크게 동기식과 비동기식으로 나눌 수 있습니다.

  • 동기식 통신 (Synchronous Communication):

    • HTTP/REST: 가장 일반적인 방식으로, FastAPI 서비스 간에 RESTful API를 통해 직접 호출합니다. httpx와 같은 비동기 HTTP 클라이언트를 사용하면 FastAPI의 비동기 장점을 살릴 수 있습니다.
    • gRPC: 고성능 원격 프로시저 호출(RPC) 프레임워크로, HTTP/2를 기반으로 하며 프로토콜 버퍼를 사용하여 효율적인 데이터 직렬화를 제공합니다. 언어 중립적이며 양방향 스트리밍을 지원합니다.
    • 장점: 구현이 간단하고 즉각적인 응답을 받을 수 있습니다.
    • 단점: 서비스 간 강한 결합을 유발하고, 한 서비스의 지연이 전체 시스템에 영향을 줄 수 있습니다.
  • 비동기식 통신 (Asynchronous Communication):

    • 메시지 큐 (Message Queue): Kafka, RabbitMQ, Redis Streams 등과 같은 메시지 브로커를 사용하여 서비스 간에 메시지를 비동기적으로 주고받습니다. 생산자(Producer)는 메시지를 큐에 발행하고, 소비자(Consumer)는 큐에서 메시지를 가져와 처리합니다.
    • 장점: 서비스 간 결합도를 낮추고, 시스템의 탄력성을 높이며, 대규모 트래픽 처리에 유리합니다.
    • 단점: 구현이 복잡하고, 메시지 순서 보장 및 중복 처리 문제 등을 고려해야 합니다.

FastAPI는 async/await를 지원하므로, 메시지 큐 클라이언트(예: aiokafka, aio_pika)와 함께 사용하면 비동기 메시지 처리 서비스를 효율적으로 구축할 수 있습니다.

3.4. 데이터베이스 전략 (Database Strategy)

마이크로서비스 아키텍처에서는 각 서비스가 자신의 비즈니스 로직에 필요한 데이터를 독립적으로 소유하고 관리하는 것이 일반적입니다. 이를 Polyglot Persistence라고 합니다.

  • 서비스별 독립 데이터베이스: 각 서비스는 자신만의 데이터베이스를 가집니다. 이는 서비스 간 결합도를 낮추고, 특정 서비스에 최적화된 데이터베이스(관계형, NoSQL 등)를 선택할 수 있게 합니다.
  • 데이터 일관성: 분리된 데이터베이스로 인해 분산 트랜잭션과 데이터 일관성 유지에 어려움이 있습니다. 이를 해결하기 위해 Saga 패턴, 이벤트 기반 아키텍처(Event-Driven Architecture), 최종 일관성(Eventual Consistency) 등의 전략을 사용합니다.

FastAPI는 SQLAlchemy, Tortoise ORM, Pydantic과 같은 라이브러리와 함께 다양한 데이터베이스(PostgreSQL, MySQL, MongoDB, Redis 등)와 연동할 수 있습니다.

3.5. 서비스 디스커버리 (Service Discovery)

마이크로서비스 환경에서 서비스 인스턴스는 동적으로 생성되거나 삭제될 수 있으며, IP 주소나 포트가 변경될 수 있습니다. 서비스 디스커버리는 이러한 동적인 환경에서 클라이언트나 다른 서비스가 특정 서비스 인스턴스의 네트워크 위치를 찾을 수 있도록 돕는 메커니즘입니다.

  • 클라이언트 측 디스커버리: 클라이언트가 서비스 레지스트리에서 서비스 인스턴스의 위치를 조회한 후 직접 호출합니다. (예: Eureka, Consul)
  • 서버 측 디스커버리: API Gateway와 같은 라우터가 서비스 레지스트리에서 서비스 위치를 조회한 후 요청을 프록시합니다. (예: Kubernetes Service, AWS ALB)

Kubernetes와 같은 컨테이너 오케스트레이션 플랫폼은 내장된 서비스 디스커버리 기능을 제공하여 이 문제를 효과적으로 해결합니다.

3.6. 컨테이너화 및 오케스트레이션

마이크로서비스는 독립적인 배포 단위를 가지므로, 각 서비스를 격리된 환경에서 실행하고 관리하는 것이 중요합니다.

  • Docker: 각 FastAPI 서비스를 Docker 컨테이너로 패키징하여 환경에 구애받지 않고 일관된 방식으로 실행할 수 있게 합니다. Dockerfile을 통해 서비스의 종속성, 환경 설정, 실행 명령 등을 정의합니다.
  • Kubernetes (K8s): 수많은 컨테이너화된 마이크로서비스를 효율적으로 배포, 관리, 확장할 수 있는 컨테이너 오케스트레이션 플랫폼입니다. 서비스 디스커버리, 로드 밸런싱, 자동 복구, 스케일링 등의 기능을 제공하여 마이크로서비스 운영의 복잡성을 크게 줄여줍니다.

3.7. 로깅 및 모니터링

분산 시스템인 마이크로서비스 환경에서는 문제 발생 시 원인을 파악하기 위해 중앙 집중식 로깅 및 모니터링 시스템이 필수적입니다.

  • 중앙 집중식 로깅: 각 서비스에서 발생하는 로그를 Elasticsearch, Logstash, Kibana (ELK Stack) 또는 Grafana Loki와 같은 중앙 저장소로 모아 관리합니다. FastAPI는 파이썬의 logging 모듈을 사용하여 로그를 쉽게 생성할 수 있습니다.
  • 모니터링: Prometheus, Grafana 등을 사용하여 각 서비스의 CPU 사용량, 메모리, 네트워크 트래픽, API 응답 시간 등의 지표를 수집하고 시각화합니다. Opentracing, Jaeger, Zipkin과 같은 분산 트레이싱 도구를 사용하여 서비스 간 호출 흐름을 추적하고 병목 현상을 식별할 수 있습니다.

4. 실전! FastAPI 마이크로서비스 구축 예제

간단한 FastAPI 기반 마이크로서비스를 Docker Compose를 사용하여 구축하는 예제를 살펴보겠습니다. user_serviceproduct_service 두 개의 서비스로 구성됩니다.

4.1. 프로젝트 구조 설계

code
.
├── docker-compose.yml
├── user_service
│   ├── Dockerfile
│   └── main.py
│   └── models.py
├── product_service
│   ├── Dockerfile
│   └── main.py
│   └── models.py
└── README.md

4.2. 기본 FastAPI 서비스 구현

user_service/models.py

python
from pydantic import BaseModel
from typing import Optional

class User(BaseModel):
    id: int
    name: str
    email: str
    
class UserCreate(BaseModel):
    name: str
    email: str

user_service/main.py

python
from fastapi import FastAPI, HTTPException
from typing import List
from .models import User, UserCreate

app = FastAPI(title="User Service")

# 임시 데이터베이스
users_db = {
    1: User(id=1, name="Alice", email="alice@example.com"),
    2: User(id=2, name="Bob", email="bob@example.com"),
}
next_user_id = 3

@app.get("/users", response_model=List[User])
async def get_users():
    return list(users_db.values())

@app.get("/users/{user_id}", response_model=User)
async def get_user(user_id: int):
    if user_id not in users_db:
        raise HTTPException(status_code=404, detail="User not found")
    return users_db[user_id]

@app.post("/users", response_model=User, status_code=201)
async def create_user(user: UserCreate):
    global next_user_id
    new_user = User(id=next_user_id, **user.dict())
    users_db[next_user_id] = new_user
    next_user_id += 1
    return new_user

# 실행: uvicorn main:app --host 0.0.0.0 --port 8001

product_service/models.py

python
from pydantic import BaseModel
from typing import Optional

class Product(BaseModel):
    id: int
    name: str
    price: float
    
class ProductCreate(BaseModel):
    name: str
    price: float

product_service/main.py

python
from fastapi import FastAPI, HTTPException
from typing import List
from .models import Product, ProductCreate

app = FastAPI(title="Product Service")

# 임시 데이터베이스
products_db = {
    101: Product(id=101, name="Laptop", price=1200.00),
    102: Product(id=102, name="Mouse", price=25.00),
}
next_product_id = 103

@app.get("/products", response_model=List[Product])
async def get_products():
    return list(products_db.values())

@app.get("/products/{product_id}", response_model=Product)
async def get_product(product_id: int):
    if product_id not in products_db:
        raise HTTPException(status_code=404, detail="Product not found")
    return products_db[product_id]

@app.post("/products", response_model=Product, status_code=201)
async def create_product(product: ProductCreate):
    global next_product_id
    new_product = Product(id=next_product_id, **product.dict())
    products_db[next_product_id] = new_product
    next_product_id += 1
    return new_product

# 실행: uvicorn main:app --host 0.0.0.0 --port 8002

4.3. Dockerfile 작성

각 서비스 디렉토리(예: user_service/Dockerfile, product_service/Dockerfile)에 다음 내용으로 Dockerfile을 생성합니다.

dockerfile
# user_service/Dockerfile (product_service도 동일)
FROM python:3.9-slim-buster

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

requirements.txt 파일 생성 (각 서비스 디렉토리에):

code
# user_service/requirements.txt
# product_service/requirements.txt
fastapi
uvicorn[standard]

4.4. Docker Compose로 서비스 오케스트레이션

docker-compose.yml 파일을 프로젝트 루트에 생성합니다.

yaml
version: 3.8

services:
  user-service:
    build: ./user_service
    ports:
      - "8001:8000" # 외부 8001 포트 -> 컨테이너 8000 포트
    environment:
      SERVICE_NAME: "user-service"
    networks:
      - microservice-network
    restart: always

  product-service:
    build: ./product_service
    ports:
      - "8002:8000" # 외부 8002 포트 -> 컨테이너 8000 포트
    environment:
      SERVICE_NAME: "product-service"
    networks:
      - microservice-network
    restart: always

  api-gateway:
    build: ./api_gateway # (옵션) 3.2에서 만든 API Gateway
    ports:
      - "8000:8000"
    environment:
      SERVICE_NAME: "api-gateway"
    depends_on:
      - user-service
      - product-service
    networks:
      - microservice-network
    restart: always

networks:
  microservice-network:
    driver: bridge

실행 방법:

  1. 각 서비스 디렉토리(user_service, product_service)에 requirements.txtDockerfile을 생성합니다.
  2. 프로젝트 루트 디렉토리에서 다음 명령어를 실행합니다.
    bash
    docker-compose up --build -d
  3. 서비스 확인:
    • user-service: http://localhost:8001/users
    • product-service: http://localhost:8002/products
    • (옵션) api-gateway: http://localhost:8000/users/users 또는 http://localhost:8000/products/products

이 예제는 아주 기본적인 마이크로서비스 구성이며, 실제 환경에서는 데이터베이스 연동, 비동기 메시징, 서비스 디스커버리, 인증/인가, 로깅/모니터링 등의 복잡한 요소들이 추가됩니다.

5. 마이크로서비스 운영 및 배포 고려사항

마이크로서비스 아키텍처는 개발뿐만 아니라 운영 및 배포 단계에서도 특별한 고려사항이 필요합니다.

  • CI/CD 파이프라인: 각 서비스는 독립적으로 배포될 수 있도록 자동화된 CI/CD(Continuous Integration/Continuous Deployment) 파이프라인을 구축해야 합니다. GitHub Actions, GitLab CI, Jenkins 등이 활용됩니다.
  • 확장성 및 고가용성: Kubernetes와 같은 컨테이너 오케스트레이션 도구를 사용하여 서비스의 인스턴스를 자동으로 확장하고, 장애 발생 시 자동으로 복구하여 고가용성을 확보합니다.
  • 보안: 서비스 간 통신, API Gateway, 데이터베이스 접근 등 모든 접점에서 보안을 강화해야 합니다. JWT(JSON Web Token), OAuth2, mTLS(mutual TLS) 등을 활용할 수 있습니다.
  • 버전 관리: 마이크로서비스는 독립적으로 업데이트되므로, API 버전 관리를 신중하게 수행해야 합니다. (예: URI 버전 관리 /v1/users, 헤더 버전 관리 Accept: application/vnd.myapi.v1+json)

FAQ

Q1: 마이크로서비스 아키텍처는 언제 도입하는 것이 좋을까요?

A1: 마이크로서비스는 시스템의 규모가 커지고, 팀의 규모가 확장되며, 빠른 기능 추가 및 독립적인 배포가 필요한 시점에 고려하는 것이 좋습니다. 초기 단계의 스타트업이나 소규모

개발 의뢰 상담

AI 서비스나 플랫폼 개발을
고민 중이신가요?

CodePick에서는
기획 → 개발 → 운영까지 함께합니다.
아이디어만 있어도 상담 가능합니다.

CodeVenter 개발팀이 직접 담당 · 1~2 영업일 내 회신

✓ 스타트업 MVP 개발✓ AI 서비스 개발✓ 웹 플랫폼 개발✓ 기업 시스템 구축✓ 모바일 앱 개발

AI Development Studio

코드픽 by 코드벤터

  • 대표: 윤승환 · 사업자등록번호: 121-57-64983
  • 대구광역시 중구 국채보상로 586, 16층 · info@codeventer.com

© 2025 코드벤터. All rights reserved.