Coding History/Team Project

팀플) 행성 대접근 로직 수정. (LIST 반환.. xxx 데이터 간략화 하기, 행성별로 나누자는 생각 도달.)

BlackBirdIT 2024. 10. 18. 14:22

지금은 년도중 제일 가까운 날 하루만 반환하는데 이러면 프론트에서 써먹을 소스가 좀 부족할 것 같아서 로직 수정하기로 결정했다.

우선은

# services/planet_opposition_service.py

from datetime import datetime
from app.services.planet_visibility_service import calculate_planet_info
import logging

# 로깅 설정
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')


def predict_opposition_events_with_visibility(planet_name, year, latitude, longitude):
    # 요청받은 연도에 대해 행성의 가시성 정보를 계산하도록 요청
    start_date = datetime(year, 1, 1)
    end_date = datetime(year, 12, 31)

    # 가시성 정보 계산
    visibility_info_list = calculate_planet_info(planet_name, latitude, longitude, start_date, range_days=(end_date - start_date).days)

    if not visibility_info_list or "error" in visibility_info_list[0]:
        return {"error": "Failed to calculate visibility information for the given year."}

    # 가장 가까운 거리 기준으로 상위 5-6개의 이벤트를 추려냄
    sorted_events = sorted(visibility_info_list, key=lambda x: x.get('distance_to_earth', float('inf')))
    top_events = sorted_events[:6]

    # 반환할 이벤트 목록 생성
    events_list = []
    for event in top_events:
        event_data = {
            "planet": planet_name,
            "date": event.get('date', 'N/A'),
            "distance_to_earth": event.get('distance_to_earth', 'N/A'),
            "sun_observer_target_angle": event.get('sun_observer_target_angle', 'N/A'),
            "visibility": {
                "best_time": event.get('best_time', 'N/A'),
                "visible": event.get('visible', False),
                "right_ascension": event.get('right_ascension', 'N/A'),
                "declination": event.get('declination', 'N/A'),
                "visibility_judgment": event.get('visibility_judgment', 'N/A')
            }
        }
        events_list.append(event_data)

    return events_list


__all__ = ['predict_opposition_events_with_visibility']

이런 느낌으로 로직을 짰는데, 반환은 잘 된다.

근데 문제가 가시성 정보에서 1년을 죄다 조회하고 비교 대조를 해서 좀 오래걸린다.

그럼 어떻게 해야될까? 를 고민하다가. 1년을 4분기로 나누어서 요청하는게 좋을 것 같다고 생각했다.

def get_quarter_ranges(year):
    """
    주어진 연도를 4분기로 나누어 각 분기의 시작과 끝 날짜를 반환하는 함수
    """
    return [
        (datetime(year, 1, 1), datetime(year, 3, 31)),    # Q1
        (datetime(year, 4, 1), datetime(year, 6, 30)),    # Q2
        (datetime(year, 7, 1), datetime(year, 9, 30)),    # Q3
        (datetime(year, 10, 1), datetime(year, 12, 31))   # Q4
    ]

이렇게 하나 만들어주고.

쿼터별로 계산후에 추출하게끔.

그럼 요청을 받을 때, 분기별로 1 2 3 4로 나누어서 받아주면 오래걸리는 문제는 해결할 수 있을 것이다.

로직은 정상 작동했는데 Google Time Zone API 호출이 여러번 되는 것이 마음에 들지 않았다.

그래서 해당 로직을 고쳐보려다가 결과값이 도출이 안되는 상황까지 왔다.

일단은 Google Time Zone API 호출문제를 제대로 고쳐두고 다시 저기 코드가 정상적으로 작동되게끔 해봐야겠다.


해결 했다.

캐시 된 것을 재사용하는 것을 확인.


그리고 이제 쿼터로 요청시에 1년치가 DB에 저장되는지와 올바른 값을 가져오는지 확인해보면 된다.

요청은 이렇게 했다.

http://localhost:5555/api/opposition?planet=Mars&quarter=2&year=2024&latitude=37.5665&longitude=126.9780

화성에 대한 2분기 대접근 이벤트에 대한 요청이고,


테이블 생성과 저장 다 잘 되었고,

2분기에 대한 기간은 4월1일부터 6월 31일까지니까..

검증을 하는 와중에 느꼈는데 대접근 이벤트도 주기가 나뉘지 않나? 라는 생각이 들었고, 그 주기는 행성마다 다를거라는 생각에 도달했다.

그럼 지금 로직이 가까운 거리를 계산해서 주기는 하지만 "대접근" 이라고 하기엔 약간 애매하다.

로직의 보완이 필요하다고 느꼈다.

분기는 폐기해야겠다.

분기 폐기하고, 행성별로 대접근 이벤트를 구하는 로직을 따로 짜야될 것 같다. 그 주기만 파악해서 요청하면 되니까. 제일 가까운날을 구하게 한다음, 2차적인 요청시에 요청 위치에서 가시성 정보를 보여주는게 맞는 방법인 것 같다.