Hchanghyeon / dev-troubleshooting

개발하며 마주쳤던 크고 작은 문제들과 고민들
1 stars 0 forks source link

[MessageConverter] 다른 서버로 API 요청시 응답 값을 정상적으로 불러오지 못하는 문제(feat. camelcase) #7

Closed Hchanghyeon closed 6 months ago

Hchanghyeon commented 6 months ago

문제

Spring 서버에서 다른 게임사 서버로 API 요청시, 응답 값을 모두 null로 반환하는 문제가 발생했습니다.

GameService.java

public void getMapleStoryMCharacterInfo(final String characterName, final String worldName) {
        final Ocid ocid = mapleStoryMRestTemplate.getCharacterOcid(characterName, worldName);
        final CharacterBasic characterBasic = mapleStoryMRestTemplate.getCharacterBasic(ocid.ocid()); // API 요청

        System.out.println(characterBasic);
    }
}

MapleStoryMRestTemplate.java

public CharacterBasic getCharacterBasic(final String ocid) {
        return restTemplate.exchange(
                        createBasicApiUri(ocid),
                        HttpMethod.GET,
                        new HttpEntity<>(createHttpHeaders()),
                        CharacterBasic.class)
                .getBody();
}

CharacterBasic.java

public record CharacterBasic(
        String characterName,
        String worldName,
        String characterDateCreate,
        ...
) {
}

위는 API를 요청하는 코드와 응답 객체이며 getCharacterBasic에도 응답 값에 대한 설정으로 CharacterBasic.class가 잘 들어가있습니다.

image

실제로 API를 요청시 위와 같이 요청 값에 대한 응답으로 모두 null 처리가 되는 것을 볼 수 있습니다.

문제 분석

GameService.java

public void getMapleStoryMCharacterInfo(final String characterName, final String worldName) {
        final Ocid ocid = mapleStoryMRestTemplate.getCharacterOcid(characterName, worldName);
        final CharacterBasic characterBasic = mapleStoryMRestTemplate.getCharacterBasic(ocid.ocid()); // API 요청

        System.out.println(characterBasic);
    }
}

우선 위 코드에서 첫번째 API요청인 getCharacterOcid 메서드로 정상적으로 응답 값을 받아오는 것을 확인할 수 있었습니다.

public record Ocid(String ocid) {}

필드로 가지고 있는 값은 ocid 값 하나로 위에서 문제되었던 CharacterBasic 레코드와 특별히 다를 건 없었습니다.

image

그래서 게임사 API 응답 값을 찾아보았는데 camelcase가 아닌 snakecase 형식으로 응답하고 있는 것을 확인해볼 수 있었습니다. 결국 ocid는 camelcase와 snakecase가 적용되지 않아 정상적으로 받아올 수 있었고, CharacterBasic안에 들어있는 값은 문자열 형태가 모두 일치하지 않았기 때문에 null값이 나오고 있던 것이었습니다.

Hchanghyeon commented 6 months ago

해결: 다른 서버로 API 요청시 응답 값을 정상적으로 불러오지 못하는 문제