오늘 한 작업만으로 정리하자면 다음과 같다.
상점 쿨타임 로직 자체는 다음과 같이 돌아간다.
public class TimeManager : MonoBehaviour
{
...
// 상점
private DateTime _dailyShopResetTime;
/// <summary>
/// 초기화가 되는 시점인지 확인하고 정보를 로드
/// </summary>
/// <param name="resetTime"></param>
/// <returns></returns>
public bool LoadDailyShopResetTime(out DateTime resetTime)
{
// TODO : DB에 저장된 [상점 초기화] 시간 데이터를 가져와서 캐싱
// _dailyShopResetTime = {상점 초기화 시간}
bool isResetTime = SaveDailyShopResetTime(_dailyShopResetTime);
resetTime = _dailyShopResetTime;
return isResetTime;
}
...
/// <summary>
/// 초기화가 되는 시점일 때 업데이트를 진행함
/// </summary>
/// <param name="lastTime"></param>
/// <returns></returns>
private bool SaveDailyShopResetTime(DateTime lastTime)
{
if (IsDailyResetTime(lastTime))
{
DateTime now = DateTime.Now;
DateTime todayReset = new DateTime(now.Year, now.Month, now.Day, 6, 0, 0);
if (now.Hour < 6)
{
_dailyShopResetTime = todayReset;
}
else
{
_dailyShopResetTime = todayReset.AddDays(1);
}
// TODO : DB에 [상점 초기화] 시간을 저장
return true;
}
return false;
}
...
/// <summary>
/// 마지막 저장 시간을 기점으로 초기화가 되는 시점인지 확인하는 함수.
/// 현재 시간이 마지막 저장 시간보다 미래면 true, 아니면 false.
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
private bool IsDailyResetTime(DateTime date)
{
DateTime now = DateTime.Now;
if (now.Year > date.Year && now.Hour >= date.Hour) return true;
if (now.Year == date.Year && now.Month > date.Month && now.Hour >= date.Hour) return true;
if (now.Year == date.Year && now.Month == date.Month && now.Day > date.Day && now.Hour >= date.Hour) return true;
return false;
}
}
분명 해당 로직을 작성할 때는 별 이상한 점을 느꼈는데, 이후 리팩토링을 진행하는 과정에서 물음표를 미친듯이 찍을 수밖에 없었다. 상식적으로 굴러갈 수가 없는 코드인데 왜 굴러가는 거지? 의 미스터리가 생긴 부분이었다.
문제가 있는 구간이라고 한다면 바로 이 부분이다
private DateTime _dailyShopResetTime;
코드를 살펴 보면, 얘를 할당(초기화)하는 과정이 없는데도 코드가 잘 굴러간다. 할당하지도 않았는데 어떻게 bool을 판별하고 값도 잘 들어가고 이런 건지 정말 이해가 되지 않았다. 그래서 대체 어떻게 돌아가고 있는건지 확인할 필요가 있어 보였다.
놀랍게도 디버깅해 보니 따로 초기화 과정을 거치지 않았는데도 0001년 1월 1일 0시 0분 0초로 데이터가 있는 것을 확인할 수 있었다. 그래서 이 부분에 대해 검색을 해 보니 이와 같은 부분을 찾을 수 있었다.
이걸 통해 초기에 따로 DateTime을 지정해주지 않아도 초기에 값을 갖고 있다는 사실을 알게 되었다.
지금 단계에서는 상점 관련 기획도 없고 상점 초기화 시점을 DB에 저장하지 않았지만, 위에서 적은 것처럼 DB에서 먼저 초기화 시점을 가져오고 초기화 시기가 맞는지 판정하면서 진행하면 문제가 없을 것이다.
하도 많은 시스템과 UI를 담당하고 있다 보니 문어발식으로 코드가 늘어나서 관리하기가 어려워졌다. 이걸 위해서 전체적은 UI 로직 리팩토링 및 간소화 작업을 진행 예정이며, 시스템도 이에 맞춰 리팩토링을 진행해야 한다고 판단했다.
현재 해야 할 작업은 시스템적인 부분과 UI 로직 부분을 최대한 분리하고, 현재의 복잡한 UI 로직을 간소화하는 과정이 필요하다.
이에 따라 내가 맡은 여러 시스템에서 시스템적 로직만 담은 부분을 확인했다. 분류하자면 다음과 같다.
이들을 전체적으로 리뷰하고 1차적인 리팩토링 과정을 거쳐 보니 정말 여러모로 심각하다는 사실을 알게 되었다.
우선 상황만 정리해 놓고 보면 다음과 같다
이와 같은 상황이었고 UI 관련 스크립트가 너무 많다 보니, UI 로직 리팩토링을 진행하려는 담당자가 스크립트가 너무 많다고 불평하는 것까지 들을 수밖에 없었다.
최대한 간단하게 하려고 했지만, 아무래도 기능을 하나씩 만들면서 UI도 연동시키려다 보니까 UI 관련 스크립트가 이렇게 우후죽순 늘어날 수밖에 없었다.
이 부분에 대해선 어쩔 수 없는 부분이면서도 참... 죄송하다고 사과할 수밖에 없었고 UI 로직을 어떻게 간소화할 것인지가 과제일 것으로 보인다.