제3.2장: 첫 API 엔드포인트 생성
학습 시간: 30분
1. 엔드포인트: 데이터 도킹 포트
우리 API가 우주 정거장이라고 상상해 보세요. 엔드포인트(종점)는 특정 유형의 우주선을 위해 설계된 특정 도킹 포트입니다.
- 포트
№1
— 화물선용 (행성 데이터). - 포트
№2
— 탐사선용 (임무 데이터). - 포트
№3
— 여객 셔틀용 (우주 비행사 데이터).
각 엔드포인트는 특정 리소스에 대한 특정 작업을 담당하는 고유한 URL입니다.
💡 우주 비유:
GET /spaceships
— 이는 "지상 관제 센터 → 정거장: 모든 도킹된 우주선 목록을 보고하십시오"라는 명령어입니다. 이 엔드포인트는 리소스 컬렉션을 반환합니다.
2. "우주 함대" 생성
아직 데이터베이스가 없으므로 Python 딕셔너리 형태의 간단한 우주선 목록으로 "시뮬레이션"을 만들겠습니다.
main.py
를 열고 app
정의 앞에 다음 코드를 추가하세요:
# main.py
# 단계 1: 데이터베이스 시뮬레이션 생성
db_spaceships = {
1: {
"name": "Voyager-1",
"type": "탐사선",
"launch_year": 1977,
"status": "활성"
},
2: {
"name": "Hubble Space Telescope",
"type": "망원경",
"launch_year": 1990,
"status": "활성"
},
3: {
"name": "ISS",
"type": "정거장",
"launch_year": 1998,
"status": "궤도"
}
}
# ... 여기에 app = FastAPI() 코드 ...
3. 첫 번째 엔드포인트: 우주선 목록
이제 우리 함대 전체를 반환하는 엔드포인트를 만들겠습니다.
main.py
의 @app.get("/")
다음에 다음 코드를 추가하세요:
# main.py
# ... db_spaceships, FastAPI, app 및 read_root() 코드 ...
@app.get("/spaceships")
def get_spaceships():
"""
등록된 모든 우주선 목록을 반환합니다.
"""
return db_spaceships
@app.get("/spaceships")
: 새 경로를 생성했습니다. 이제/spaceships
URL에 대한GET
요청은get_spaceships
함수에 의해 처리됩니다.return db_spaceships
: FastAPI는 Python 딕셔너리를 유효한 JSON 응답으로 자동 변환합니다.
4. 새 도킹 포트 작동 확인
만약 uvicorn
서버가 --reload
플래그와 함께 여전히 실행 중이라면, 이미 재로드되어 작동 준비가 완료되었습니다. 그렇지 않다면 다시 시작하십시오:
단계 1: 브라우저에서 확인
브라우저에서 http://127.0.0.1:8000/spaceships
주소를 엽니다.
JSON 형식으로 우주선 전체 목록이 표시되어야 합니다:
{
"1": {
"name": "Voyager-1",
"type": "Зонд",
"launch_year": 1977,
"status": "Активен"
},
"2": {
"name": "Hubble Space Telescope",
"type": "Телескоп",
"launch_year": 1990,
"status": "Активен"
},
"3": {
"name": "ISS",
"type": "Станция",
"launch_year": 1998,
"status": "На орбите"
}
}
단계 2: 자동 문서에서 확인
http://127.0.0.1:8000/docs
로 이동하세요. 문서에 GET /spaceships
엔드포인트에 대한 새 섹션이 나타난 것을 볼 수 있습니다. "Try it out"을 클릭하고 "Execute"를 눌러 거기서 바로 테스트할 수 있습니다!
5. 매개변수가 있는 엔드포인트: 특정 우주선 데이터
"보이저-1"에 대한 데이터만 필요하다면 어떨까요? 이를 위해 경로 매개변수(path parameter)를 사용하여 엔드포인트를 만들겠습니다.
main.py
에 다음 코드를 추가하세요:
# main.py
# ... 나머지 코드 ...
@app.get("/spaceships/{ship_id}")
def get_spaceship(ship_id: int):
"""
ID를 사용하여 특정 우주선에 대한 데이터를 반환합니다.
"""
return db_spaceships.get(ship_id)
"/spaceships/{ship_id}"
: 중괄호{}
는ship_id
가 URL에서 전달될 변수임을 FastAPI에 알려줍니다.ship_id: int
: 이것은 타입 힌트(type hint)입니다. FastAPI는 전달된 ID가 정수인지 자동으로 확인합니다. 만약 누군가/spaceships/voyager
를 요청하면, FastAPI는 유효성 검사 오류422 Unprocessable Entity
를 반환할 것입니다. 이것은 마법입니다!
확인:
http://127.0.0.1:8000/spaceships/2
를 엽니다. "허블" 망원경에 대한 데이터만 얻을 수 있습니다. 만약 http://127.0.0.1:8000/spaceships/99
를 열면, 해당 우주선이 없으므로 null
을 받게 됩니다.
정리 퀴즈
🚀 장 요약:
API 우주 정거장에 두 개의 "도킹 포트"를 성공적으로 만들었습니다:
- 🛰️ 모든 우주선 목록을 가져오는 포트 (
/spaceships
) - 🔭 특정 우주선에 대한 데이터를 가져오는 포트 (
/spaceships/{ship_id}
)
또한 FastAPI의 자동 타입 유효성 검사의 강력함을 확인했으며, 이는 API를 잘못된 요청으로부터 보호합니다.
내비게이션 시스템이 설정되었습니다! 다음 장에서는 Pydantic을 사용하여 우리 우주선의 "청사진"을 만들어 API를 더욱 스마트하고 견고하게 만들 것입니다.
📌 확인: -
uvicorn
서버가 실행 중이며 작동합니다. - URLhttp://127.0.0.1:8000/spaceships
가 우주선 목록이 포함된 JSON을 반환합니다. - URLhttp://127.0.0.1:8000/spaceships/1
가 "보이저-1호"에 대한 데이터를 반환합니다. - URLhttp://127.0.0.1:8000/docs
가 두 개의 새로운 엔드포인트를 보여줍니다.⚠️ 오류가 발생하면:
- 404 Not Found: 브라우저와
@app.get(...)
데코레이터에서 URL이 올바르게 입력되었는지 확인하세요.- 코드 오류: 구문, 특히 Python의 들여쓰기와 딕셔너리의 쉼표를 주의 깊게 확인하세요.