콘텐츠로 건너뛰기

7-5. 엔드포인트

  • 기준

엔드포인트란 클라이언트(웹 브라우저, 모바일 앱 등)가 서버의 특정 기능이나 데이터에 접근하기 위해 연결하는 ‘접속점’인데 쉽게 내외부 데이터에 대한 요청명령입니다.

처음 부터 모든 내용을 완벽히 이해하기는 쉽지 않습니다. 엔드포인트는 앞서 만든 fmp_client.py에게 “애플의 현재 가격을 받아와”라는 명령이라고 생각하시면 됩니다.

5-2장에서 backend/app/main.py로 간단하게 자산(assets)이나 가격(ohlcv) 정보를 조회할 수 있는 엔드포인트가 생성 되었습니다.

5-2장에서 바이브 코딩 채팅에 엔드포인트 관련 내용이 없어 AI가 임의로 backend/app/main.py에 자동으로 엔드포인트를 만들었습니다.

내부 구조가 어떻게 되는지는 자세히 알필요가 없지만 여기에 우리가 결정해야 할 내용이 있습니다. 보통의 백엔드의 엔드 포인트는 backend/app/api/v1/endpoints/에서 만들어 집니다.

하나의 큰 파일에 모든 엔드포인트를 만들면 유지 관리가 어렵게 됩니다. 파일을 카테고리별로 나누어야 되는데 자산별로 나눌지(주식, 코인 등) 아님 명령내용별로 나눌지(수집, 저장 등) 또는 디비 테이블로 나눌지정하는 것을 권장합니다.

자산별로 분리하는 방식으로 진행하겠습니다.

주요 엔드포인트 HTTP 메서드

엔드포인트를 만들 때는 목적에 맞는 HTTP 메서드를 선택하여 데코레이터로 사용합니다.

@app.get(): 리소스 조회 (Read)@app.post(): 새로운 리소스 생성 (Create)@app.put(): 기존 리소스 전체 수정 (Update)@app.patch(): 기존 리소스 일부 수정 (Update)@app.delete(): 리소스 삭제 (Delete)

🤖 실전! 엔드포인트 수정 및 추가 (2-4)

🧠 이번 실습은 BaseClient에서 상속받은 fmp_client로 주식 가격 데이터를 가져 올수 있게 하는 엔드포인트를 작성하고 이전에 만든 backend/app/main.py를 backend/app/api/v1/endpoints/로 이동하는 과정입니다.

✨ 사용자의 의도(Vibe)

작성한 FMPClient를 이용해서 프론트엔드에서 데이터를 요청할 수 있는 엔드포인트를 만들어 줘. 주식 관련 데이터니까 파일 위치는 반드시 backend/app/api/v1/endpoints/stocks.py 로 지정해 줘. 그리고 이전에 backend/app/main.py에 임시로 만들어두었던 자산 관련 엔드포인트도 성격에 맞게 backend/app/api/v1/endpoints/assets.py로 이동해서 깔끔하게 정리해 줘.

  1. 완료후 테스트를 진행하는데 현재 애플의 가격과 최근 10일간의 일간 가격을 수집하고 결과를 알려줘

💻 AI가 생성한 코드 (Syntax)

backend/app/api/v1/endpoints/stocks.py

from fastapi import APIRouter, HTTPException, Queryfrom typing import Dict, Any, List# 앞서 작성한 FMPClient를 가져옵니다.from app.external_apis.implementations.fmp_client import FMPClient# APIRouter 객체를 생성합니다. 이 객체를 main.py에 등록하여 라우팅을 관리하게 됩니다.router = APIRouter()# 전역 FMPClient 인스턴스를 하나 생성하여 여러 요청에서 재사용합니다.fmp_client = FMPClient()@router.get("/quote/{symbol}")async
def get_realtime_quote(symbol: str) -> List[Dict[str, Any]]:    """    특정 주식 종목(예: 'AAPL')의 실시간 현재 가격 정보를 가져오는 엔드포인트입니다.    """    # FMPClient의 get_realtime_quote 메서드를 호출합니다.    result = await fmp_client.get_realtime_quote(symbol=symbol.upper())        # 통신이 실패했거나 API 에러가 있는 경우 500 에러를 반환합니다.    if not result["success"]:        raise HTTPException(status_code=500, detail=result["error"])        # 실제 데이터만 추출하여 반환합니다.     … 이하 생략
return result["data"]
return prices[:days]

backend/app/api/v1/endpoints/assets.py

from fastapi import APIRouter, Depends, HTTPExceptionfrom sqlalchemy.orm import Sessionfrom typing import List, Dict, Anyfrom app import models, databaserouter = APIRouter()@router.get("/", response_model=List[Dict[str, Any]])
def read_assets(skip: int = 0, limit: int = 100, db: Session = Depends(database.get_db)):@router.get("/{asset_id}")
def read_asset(asset_id: int, db: Session = Depends(database.get_db)):@router.get("/ohlcv/{asset_id}")
def read_ohlcv_by_asset(asset_id: int, skip: int = 0, limit: int = 100, db: Session = Depends(database.get_db)):
return result

💾 결과 확인

브라우저에서 http://localhost:8000/docs로 들어가 봅니다.

저는 웹 페이지가 작동이 안되었습니다.

  1. ✨ 사용자의 의도(Vibe) “http://localhost:8000/docs가 안되”

  2. 💻 결과적으로 오류를 수정하고 다시 실행하면 됩니다.

💡이부분이 자주 오류가 나는 핵심내용인데 "ModuleNotFoundError: No module named 'app'"이란 오류로 AI는 우리가 지시한 코드는 작성하지만 그 코드에 필요한 모듈(프로그램모음)로드하는 코드는 추가하지 않아서 오류가 나고 또한 우리가 수정한 코드는 컨테이너가 바로 반영하지 않고 리빌드(docker up -d --build)해야 적용됩니다. 따라서 매번 오류를 확인하기 보다는 코드를 변경하면 수동으로 리빌드 하든지 채팅으로 "변경된 컨테이너를 리빌드 해줘"라고 하는것이 오류를 줄이는 방법입니다.
  1. http://localhost:8000/docs => /api/v1/stocks/quote/{symbol}를 클릭합니다.

  2. Try it out => 클릭 => symbol = AAPL 입력 => Execute

[  {    "symbol": "AAPL",    "price": 263.75,    "change": -0.97,    "volume": 37994695  }]

이렇게 나오면 성공입니다. 다른 엔트포인트도 실습해보세요! 만약 이렇게 나오지 않는다면 채팅에 “엔드포인트 결과값이 안나와 찾아줘”라고 해서 오류를 찾으시면 됩니다. 매번 말씀드리지만 각자의 환경이 다르고 AI 모델이 다르기에 오류가 날수 있습니다. 걱정마세요 저희는 바이브로 오류를 찾아서 수정하라고 시키면 됩니다. 어떤 결과가 나오는지 알기만 하면 됩니다.

🏷️ 연습 같은과정으로 binance_client.py 추가

Tip: backend/app/api/v1/endpoints/coins.py로 하세요

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다