Coding History/Team Project

팀플) REST API 설계 시작.

BlackBirdIT 2024. 10. 9. 05:18

git을 보니까 __main__, __init__이나 다양한 폴더들이 보였다.

그래서 이런 구조를 따라가는 것 부터 시작.

내 프로젝트는 현재

덩그러니.. 하다.

star_info_api/
│
├── venv/                 # 가상 환경 폴더 (추적하지 않음)
│
├── app/                  # 메인 애플리케이션 폴더
│   ├── __init__.py       # Flask 앱 초기화
│   ├── routes.py         # 모든 API 엔드포인트 정의
│   ├── models.py         # 데이터 모델 정의 (필요 시)
│   └── utils.py          # 공통 함수나 유틸리티 함수 정의
│
├── instance/             # 설정 파일 (예: config.py) 저장 (비공개 데이터)
│   └── config.py         # 앱 설정 파일 (환경변수, API 키 등)
│
├── tests/                # 테스트 코드 폴더
│   └── test_api.py       # 유닛 테스트, API 테스트
│
├── requirements.txt      # 의존성 패키지 목록
├── .gitignore            # Git에 추가하지 않을 파일 목록
├── config.py             # 환경 설정 (환경 변수)
└── run.py                # 애플리케이션 시작점

GPT한테 구조화를 시킨다면 어떻게 해야되냐고 물어봐서 이런 결과를 얻어냈다. 일단 이렇게 맞춰서 만들어보자.

mkdir app instance tests
touch app/__init__.py app/routes.py app/models.py app/utils.py instance/config.py tests/test_api.py run.py

해당 명령어로 다 처리할 수 있었네. 손으로 다 했다.

여튼 이렇게 만들었다.

정상 구동까지 확인 완료.

우선 유성우부터 처리해보도록 했다. 데이터 입력값은 정적으로 처리.

# 모든 API 엔드포인트 정의

from flask import Blueprint, jsonify

main = Blueprint('main', __name__)

# 유성우 데이터 (정적 데이터로 정의)
meteor_showers = {
    "perseids": {
        "peak_date": "2024-08-12",
        "best_time": "02:00",
        "location": {
            "latitude": 34.0522,
            "longitude": -118.2437
        },
        "expected_rate": "60 meteors per hour"
    },
    "geminids": {
        "peak_date": "2024-12-14",
        "best_time": "03:00",
        "location": {
            "latitude": 51.5074,
            "longitude": -0.1278
        },
        "expected_rate": "120 meteors per hour"
    }
}

# 기본 라우트
@main.route('/')
def index():
    return "Welcome to the Star Info API!"

# 유성우 예보 API 라우트
@main.route('/api/meteors/<string:shower_name>', methods=['GET'])
def get_meteor_shower(shower_name):
    # 입력받은 유성우 이름을 소문자로 변환해서 데이터에서 검색
    shower = meteor_showers.get(shower_name.lower())

    # 데이터가 없을 경우 404 에러 반환
    if not shower:
        return jsonify({"error": "Meteor shower not found"}), 404

    # 유성우 데이터를 JSON으로 반환
    return jsonify({
        "meteor_shower": shower_name.capitalize(),
        "peak_date": shower["peak_date"],
        "best_time": shower["best_time"],
        "location": {
            "latitude": shower["location"]["latitude"],
            "longitude": shower["location"]["longitude"]
        },
        "expected_rate": shower["expected_rate"]
    })

코드는 이렇고 결과를 뽑는 방법은

http://127.0.0.1:5000/api/meteors/perseids 페르세우스 검색
http://127.0.0.1:5000/api/meteors/geminids 쌍둥이자리 검색

업로드중..

와 진짜 좀 놀랍다. 코드 그렇게 많이 쓴 것도 아닌데 저거 계산 값을 내놓는게 신기하네.

이러면 일단 유성우 정보 기반은 다졌고,

다음목표:

  1. 나라별 변수위도/경도를 기반으로 유성우 관측 시간을 맞추기.
  2. 사용자가 서울이나 한국 등 특정 지역을 기준으로 언제 유성우를 관측할 수 있는지 제공.

지금은 고정 값이라. 저렇게 바꾸면 정보가 조금 더 가치가 있어질 것이다. 일단 시간이 너무 늦었다 자야겠다.