Coding History/Team Project

팀플) REST API 행성 데이터

BlackBirdIT 2024. 10. 13. 00:34

일단은 행성 데이터를 대충 뽑아오는 로직을 썼고, 반환받아보자고.

{"error":"'Angle' object has no attribute 'minutes'"}

결과다.

그래서 코드를 고쳤고.

원하는 결과값을 받아냈다.

그런데 여기서 고민해볼 것이 있다.

api 호출이 많아진다. 줄일 방법이 없을까?

일단 생각을 해봤는데 만약 best_time이 낮시간대면? best하지 않은 것 아닌가? 그럼 다시 현지 시각으로 변환해서 일몰 일출과 대조를 해야하네?

  1. 그럼 시간 변환 로직은 두번 코드를 쓰게 되는데 이건 효율적인 것인가? 아닌 것 같다. 시간 변환을 담당하는 코드를 만들어서 불러오는게 좋겠다.
  2. 그럼 일출 일몰 로직을 고쳐야하네.
  3. 어? 근데 그러면 행성 정보를 요청하면 API 요청을 두번하게 되는 거 아닌가? 왜?
    요청 -> 행성 정보 불러와서 계산 -> 시간 변환 로직 작동 -> 일출 일몰 정보와 대조가 필요 -> 일출 일몰 로직 작동 -> 시간 변환 로직 작동 -> 값 대조 후 낮시간대인지 확인 -> 행성 정보 결과 뱉음.
  4. 그럼 API 요청을 줄일 방법은 없을까?

라는 생각에 도달했다.

그래서 GPT를 고문하며 얻은 결과는

타임존 정보를 한 번만 가져와서 필요한 모든 시간 변환에 사용할 수 있도록 로직을 최적화할 수 있다.
타임존 정보 한 번만 요청:

  • 타임존 정보는 한 번만 요청하고, 반환된 rawOffsetdstOffset 값을 "캐시"해서 best_time일출 및 일몰 시간 모두에 재사용하도록 하자.

라는 결과 도출.

그럼 뭐 이제 리팩토링부터 시작해야지. 완성 되었다고 생각한 코드를 고치는게 제일 두렵다.

# services/timezone_conversion_service.py

from datetime import datetime, timedelta


def convert_utc_to_local_time(utc_time, offset_sec):
    """
    주어진 UTC 시간을 현지 시간으로 변환하는 함수

    Args:
        utc_time (datetime): 변환할 UTC 시간
        offset_sec (int): 타임존 오프셋 (초 단위)

    Returns:
        datetime: 변환된 현지 시간
    """
    return utc_time + timedelta(seconds=offset_sec)


__all__ = ['convert_utc_to_local_time']

우선은 이렇게 시간 변환 로직을 객체화 시키고, sunrise_sunset_service.py의 시간 변환 로직을 거치게 수정해주고 제대로 작동하는지 테스트를 거쳤다. 정상작동한다.

그리고 수정중에 안 사실인데 일출 일몰을 구하는 로직에서도 이미 api 호출은 두번 하고 있었다.

왜 두번 요청하게 되었는가?

일출에 대한 값을 계산할 때 한번, 그리고 일몰에 대한 값을 계산할 때 한번 요청하고 있었다,

이걸 해결하기 위해서는 시간변환이 어떻게 이루어지는지 이해를 할 필요가 있었는데 사실상 우리가 가져올 값은 해당 위도, 경도에서 필요한 time zone offset 값이였다.

그러니까 요점은 뭐냐. api 요청은 한번만 하고 time zone offset을 변수로 저장해서 재활용하면 api를 여러번 호출 할 필요가 없다는 뜻이다. 그래서 time zone offset을 선셋 선라이즈 측에서 저장하게끔 설계를 다시 했다.

이로써 얻는 이점이 뭐냐하면, 어차피 관측을 할 때 해가 떠 있냐 아니냐는 아주 중요한 문제이다. 해가 떠있으면 당연히 별이든 태양이들 일반인은 관측하기 어렵다. 그러니 행성 요청을 하면 해의 유무 판단은 무조건 해야되니까 변수 저장은 일출 일몰 로직에서만 하면 되고, 무조건적으로 일출 일몰 로직을 거치니까 여기서 전달해주면 api는 한번만 요청된다.

굳 이렇게 고쳐서 요청을 보내보면,

우선은 offset 값을 result 값에 포함시켰다.

이후엔 해당 값을 받아서 시간 변환 로직에 사용한다.

굳...

아 그리고 혹시나 낮 시간대가 포함된 것이 bset_time일 수도 있으니 그 부분의 예외 처리도 했다.

이러면 이제 행성 데이터도 끝이다.