이 글은 Java Spring 및 Riot API를 사용해 '리그오브레전드 전적 검색 토이 프로젝트'를 하며
마주했던 문제점, 힘들었던 점들을 해결한 것에 대한 회고이다.
🤔 문제점
Riot API의 MATCH-V5를 통해 내 계정의 게임 전적에 대한 MATCH-ID 값들을 받았고
이 ID값들로 다시금 HttpRequest GET 쿼리를 날려 HttpResponse로 받았고 내가 원하는
각각의 매칭 게임의 세부 데이터들을 꺼내오기 위해 httpresponse.body()를 사용하여
String 형식의 JSON 데이터를 가져올 수 있었다.
이게 무슨 말이냐 하면 JSON데이터가 쌍따옴표로 둘러쌓인 "JSON" 인 것이다.
요 String 데이터 내에 있는 데이터들을 정규표현식을 사용해서 뽑아올까 싶었지만
전적 사이트를 구성하기 위해 뽑아와야 할 데이터들이 한둘이 아닌지라
String -> JSON 으로 변환하고 key를 통해 value에 접근하여 데이터들을 뽑아오자고 생각했다.
✅ 해결 방법
String to JSON은 JSONObject 를 이용하여 간단하게 변환할 수 있었다.
단, JSONObject를 사용하기 위해 build.gradle에 'org.json' Dependency를 등록해야한다.
// String 형식의 JSON을 JSONObject의 파라미터로 넣어주면 된다
JSONObject matchData = new JSONObject(result);
위 방법대로라면 내가 넣은 String 형식의 result가 HashMap 형태로 바뀌었을 것이다.
이는 JSONObject 클래스가 내부적으로 HashMap을 사용하여 key-value 쌍으로 JSON 데이터를
다루기 때문이다.
JSONObject 클래스를 뒤져본 결과 생성자 중 String 파라미터를 JSONObject에 집어넣었을 때
파라미터를 HashMap 형식으로 변환하는 생성자가 있었다.
파라미터의 String... 은 names 매개변수가 몇개가 올지 모르기 때문에 전부 받겠다 라는 의미이며
String[ ] 와 같은 의미라고 하더라. 이외에도 HashMap을 파라미터로 받아
HashMap to JSON도 가능하다.
JSONObject로 변환된 JSON객체의 구조는 Map 내의 Map 내의 Map... 과 같았다.
JSON 변환 이후에 데이터에 접근하고자 한다면 Map에서 했던 것 처럼
map.get("key")를 이용해 접근할 수 있다. 내가 받은 데이터인 matchData 내에는 size = 2짜리 map이 있었으며
매칭게임의 메타데이터를 담은 metadata와 게임 정보가 담긴 info가 있었고
아무래도 필요한 정보들이 info쪽에 많이 있어서 info를 get하여 가져오기로 했다.
처음에 한 것과 마찬가지로 info를 get한뒤 toString으로 변환하고 JSONObject 클래스에
파라미터로 넘겨주었다. 이제 info 내에서 필요한 데이터들을 key를 통해 추출할 수 있다.
가장 최근에 한 게임의 게임 모드와 게임 시간을 추출해보도록 하자
가장 최근에 한 게임은 무작위총력전 모드이며 총 플레이타임은 14분 2초이다.
무작위 총력전의 영어 약자인 ARAM (All Random All Mid) 과
전체 플레이타임을 초 단위로 나타내는 842 ( 842 / 60 = 14분, 나머지 = 2초) 가
get("gameMode")와 get("gameDuration")으로 잘 추출되는 것을 볼 수 있다.
이것으로 필요한 데이터들을 추출하여 전적 검색 사이트를 채울 수 있겠다.
'Trouble-Shooting' 카테고리의 다른 글
Error createing bean with name 'entitymanagerfactory' 해결하기 (H2 동시 접속) (0) | 2024.08.04 |
---|