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가 잘 들어가있습니다.
실제로 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 레코드와 특별히 다를 건 없었습니다.
그래서 게임사 API 응답 값을 찾아보았는데 camelcase가 아닌 snakecase 형식으로 응답하고 있는 것을 확인해볼 수 있었습니다. 결국 ocid는 camelcase와 snakecase가 적용되지 않아 정상적으로 받아올 수 있었고, CharacterBasic안에 들어있는 값은 문자열 형태가 모두 일치하지 않았기 때문에 null값이 나오고 있던 것이었습니다.
문제
Spring 서버에서 다른 게임사 서버로 API 요청시, 응답 값을 모두 null로 반환하는 문제가 발생했습니다.
GameService.java
MapleStoryMRestTemplate.java
CharacterBasic.java
위는 API를 요청하는 코드와 응답 객체이며 getCharacterBasic에도 응답 값에 대한 설정으로 CharacterBasic.class가 잘 들어가있습니다.
실제로 API를 요청시 위와 같이 요청 값에 대한 응답으로 모두 null 처리가 되는 것을 볼 수 있습니다.
문제 분석
GameService.java
우선 위 코드에서 첫번째 API요청인 getCharacterOcid 메서드로 정상적으로 응답 값을 받아오는 것을 확인할 수 있었습니다.
필드로 가지고 있는 값은 ocid 값 하나로 위에서 문제되었던 CharacterBasic 레코드와 특별히 다를 건 없었습니다.
그래서 게임사 API 응답 값을 찾아보았는데 camelcase가 아닌 snakecase 형식으로 응답하고 있는 것을 확인해볼 수 있었습니다. 결국 ocid는 camelcase와 snakecase가 적용되지 않아 정상적으로 받아올 수 있었고, CharacterBasic안에 들어있는 값은 문자열 형태가 모두 일치하지 않았기 때문에 null값이 나오고 있던 것이었습니다.