이제 홈에서 소환사명을 검색하면 사용자에 대한 정보를 보여주는 UI를 구현했다. (전적을 제외한)
사용자에 대한 점수에 대한 응답은 /lol/league/v4/entries/by-summoner/{id}로 보내야 한다. 요청을 보내면 id에 맞는 유저에 대한 정보를 반환해준다.
Riot API에서 보내는 Response는 아래와 같이 Json으로 반환된다. Json 하나가 아닌 여러 List가 반환되는 모습을 볼 수 있다.
body : [{"leagueId":"b5fddebe-1f9e-4e78-b1b3-51c2eb225f65","queueType":"RANKED_SOLO_5x5","tier":"DIAMOND","rank":"III","summonerId":"1E4fn0-sxfubUx4bvU1ybhLtggI2C3-vnGl5jX9ijSzXBQ","summonerName":"Hide on bush","leaguePoints":30,"wins":6,"losses":6,"veteran":false,"inactive":false,"freshBlood":false,"hotStreak":false},{"queueType":"CHERRY","summonerId":"1E4fn0-sxfubUx4bvU1ybhLtggI2C3-vnGl5jX9ijSzXBQ","summonerName":"Hide on bush","leaguePoints":0,"wins":29,"losses":11,"veteran":false,"inactive":false,"freshBlood":true,"hotStreak":true}]
나는 해당 리스트에서 queueType이 RANKED_SOLO_5x5인 Json만 반환해주려고 한다.
코드는 아래와 같다.
@GetMapping(path = "/summoners/kr/byId/{id}")
public ResponseEntity<LeagueEntry> findUserInformationByUserId(@PathVariable(name = "id") String id) {
try {
String requestUrl = riotUrl + "/lol/league/v4/entries/by-summoner/" + id;
HttpGet httpGet = new HttpGet(requestUrl);
httpGet.addHeader("User-Agent", "Mozilla/5.0");
httpGet.addHeader("Accept-Language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7");
httpGet.addHeader("Accept-Charset", "application/x-www-form-urlencoded; charset=UTF-8");
httpGet.addHeader("Origin", "https://developer.riotgames.com");
httpGet.addHeader("X-Riot-Token", riotApiKey);
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
CloseableHttpResponse response = httpClient.execute(httpGet);
if (response.getStatusLine().getStatusCode() == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String body = handler.handleResponse(response);
log.info("body : " + body);
JSONParser parser = new JSONParser();
JSONArray jsonArray = (JSONArray) parser.parse(body);
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
if (jsonObject.get("queueType").equals("RANKED_SOLO_5x5")) {
LeagueEntry leagueEntry = new LeagueEntry(jsonObject);
return ResponseEntity.ok(leagueEntry);
}
}
// "queueType":"RANKED_SOLO_5x5"에 해당하는 JSON 객체가 없는 경우 404 에러를 반환합니다.
return ResponseEntity.notFound().build();
} else {
log.error("response is error : " + response.getStatusLine().getStatusCode());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
} catch (Exception e) {
e.printStackTrace();
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
테스트
결과적으로 icon, 소환사 닉네임, 레벨, 랭크 icon, 점수 등 다양한 정보를 받아와 적절하게 배치하였다.
남은 일정
- 전적 기록 가져오기
- 전적기록 UI 구현
- 전적 갱신 구현
- DB 구현
- 캐시 구현
번외
8월 1일 오전에 Naver D2에서 온 메일에 메모이제이션이라는 기술에 대한 설명을 잠깐 봤는데, OP.GG라는 전적검색 사이트는 한 유저가 여러 소환사를 검색하기보다는 일정한 특정 소환사를 자주 검색할 것 같다는 생각이 들었다. 이것이 내가 캐시를 구현하려는 이유인데, 남은 일정을 완료한 다음 메모이제이션을 공부해본 다음 적용해보면 좋을 것 같다.