[FastAPI] 라우터로 나누어 모듈화

Yoo·2025년 8월 6일

목표 : API를 기능별로 분리하여 라우터라는 단위로 나눠서 모듈화

라우터

  • 정의

    API 경로와 그에 연결된 함수를 정의하는 코드 조각

    즉, 사용자가 요청하는 URL 경로와 실행될 함수를 연결해주는 API 입구 역할
  • 장점

    기능별로 나누어 유지보수가 쉬움
    코드가 깔끔하게 분리됨
    규모가 커질수록 각 기능을 모듈처럼 관리

모듈

  • 정의

    기능을 담은 파이썬 파일 하나(.py)
    다른 코드에서 import 해서 가져와 사용
  • 용도

    기능을 파일별로 나눔
    공통 함수들을 따로 관리
    코드가 커지면 유지보수가 쉬움

① main

from fastapi import FastAPI
from routers.dns_measure import router as dns_measure
from routers.dns_apply import router as dns_apply
from routers.dns_reset import router as dns_reset

app = FastAPI()

app.include_router(dns_measure)
app.include_router(dns_apply)
app.include_router(dns_reset)

from A import B as C
A : 함수이름
B : 모듈 안에 있는 함수
C : 코드에서 사용할 이름

app.include_B(C)


② measure API

from fastapi import APIRouter

router = APIRouter()

from fastapi import APIRouter
라우터를 만들기 위해 사용하는 클래스

router = APIRouter()
라우터 객체를 생성

그 후에 코드 작성

@router.get("/measure")
def measure_dns(domain: str = Query(...), count: int = Query(5, gt=0)):
    records = []
    for name, ip in dns_servers.items():
        resolver = dns.resolver.Resolver()
        resolver.nameservers = [ip]

        times = []
        for i in range(count):
            try:
                start = time.time()
                resolver.resolve(domain, 'A')
                end = time.time()
                elapsed = round((end - start) * 1000, 2)
                times.append(elapsed)
            except:
                times.append(float('inf'))

        avg = round(sum(times) / len(times), 2)
        now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        records.append({
            "측정 시간": now,
            "DNS 서버": name,
            "도메인": domain,
            "평균 응답 시간(ms)": avg
        })   

    df = pd.DataFrame(records)
    df.to_csv("dns_응답속도_결과.csv", mode='a', index=False, header=not pd.io.common.file_exists("dns_응답속도_결과.csv"), encoding='utf-8-sig')

    return {
        "도메인": domain,
        "측정 횟수": count,
        "결과": records,
    }  

③ apply API

from fastapi import FastAPI, HTTPException, Query, APIRouter
from auto_dns import set_dns
from dns_servers import dns_servers

router = APIRouter()

@router.get("/apply")
def dns_apply(server : str = Query(...)):
    if server not in dns_servers:
        raise HTTPException(status_code=400, detail="지원되지 않는 DNS 서버입니다.")

    server = server.strip()
    try:
        set_dns(dns_servers[server])
        status = f'{server}로 설정 완료'
    except Exception as e:
        status = f'{server}로 설정 실패'

    return {"message" : status}

④ reset API

from fastapi import FastAPI, APIRouter
from auto_dns import reset_dns

router = APIRouter()

@router.get("/reset")
def reset_dns_api():
    try:
        reset_dns()
        return {
            "message" : "DNS 리셋 완료"
        }
    except Exception as e:
        return{
            "message" : "DNS 리셋 실패"
        } 

⑤ init.py

init 파일은 Python에서 디렉토리를 패키지로 인식시키기 위해 필요한 파일입니다.

from codes.routers.dns_measure import router as dns_measure
from codes.routers.dns_apply import router as dns_apply
from codes.routers.dns_reset import router as dns_reset

codesrouters가 Python 패키지로 인식되기 위해 필요합니다.

profile
월1억벌기

0개의 댓글