설명


문제


해결

현재 한국 시간을 가져오는 getCurrentKoreaTime() 메서드를 만들고

// apiService.js

const TimeService = require('./timeService.js');

function apiDate() {
    // API 조회를 위한 시간 설정
    const koreaTime = TimeService.getCurrentKoreaTime();
    // 시간이 1시 이전인지 확인 (NEXON OPEN API 갱신이 1시에 됨)
    // getHours() 할 때 한국 시간으로 가져오려고 하는지 +9시간을 한 결과가 나와서 10시로 설정
    if (koreaTime.getHours() < 10) {
        // 1시 이전이면 2일 전의 날짜로 설정
        koreaTime.setDate(koreaTime.getDate() - 2);
    } else {
        // 1시 이후면 어제의 날짜로 설정
        koreaTime.setDate(koreaTime.getDate() - 1);
    }
    const formattedDate = koreaTime.toISOString().split('T')[0];

    return formattedDate;
}

const formattedDate = apiDate();

apiService에서 getCurrentKoreaTime() 메서드를 사용해서 apiDate()를 만들었다.

원래는 if 절 안의 조건문을 koreaTime.getHours() < 1 로 작성했는데 제대로 동작하지 않아서 확인해보니 koreaTime이 오전 12시인데 koreaTime.getHours() 값이 9가 나왔다.

getHours 함수가 시간을 가져올 때 기존 시간을 UTC로 인식하고 한국 시간으로 가져오려고 하는 것 같아서 조건문을 koreaTime.getHours() < 10 로 수정하니 제대로 동작했다.

그리고 여기서 만든 formattedDate는 apiService의 api 조회 로직에서 사용했고,

guildPageService의 createOrUpdateGuildPage 메서드에서도 apiDate()를 사용해서 시간 설정을 해준 뒤 DB의 last_updated 와 비교하니 정상적으로 동작했다!

// guildPageService.js

const APIService = require('./apiService.js');

async function createOrUpdateGuildPage(guildName, worldName) {
    const apiDate = new Date(APIService.apiDate());
    const guildExists = await GuildService.getGuild(guildName, worldName);

    if (!guildExists) {
        const guildMembers = await GuildService.createGuild(guildName, worldName);
        for (const guildMember of guildMembers) {
            await CharacterService.createCharacter(guildName, worldName, guildMember);
        }
    } else if (guildExists.last_updated < apiDate) {
        const preGuildMembers = await CharacterService.getCharactersByGuild(guildName, worldName);
        const preGuildMemberNames = preGuildMembers.map(member => member.name);
        
				// ...
		}
}