본문 바로가기
  • 개발공부 및 일상적인 내용을 작성하는 블로그 입니다.
프로젝트/협업

Pro.gg - 프로젝트 회고록(4) : 소환사 정보 - 1

by 방구석 대학생 2021. 10. 19.

 

처음으로 활용해보는 외부 API

이번에 만들기로한 프로젝트의 주제가 LOL 이라는 게임을 기반으로 하는 팀 매칭 및 커뮤니티 사이트 이기 때문에 게임사 에서 자체적으로 제공하는 게임의 정보를 받아와서 활용해야 할 필요가 있었다.

그 중 가장 대표적인 정보가 바로 소환사 명을 통해 받아올 수 있는 소환사의 티어, 전적등의 각종 랭크 정보와, 해당 소환사가 참여한 매치에서의 K/D/A, 획득한 골드, 승패여부 등의 매치 상세 정보였다.

이번 프로젝트에서 구현하고자 하는 기능들을 위해서는 위의 정보들을 라이엇 게임사로부터 데이터 크롤링을 통해 받아오는 과정이 필수적 이었다.

 

그렇기 때문에 라이엇에서 제공하는 LOL API 등을 활용하여 우리가 가져와야 하는 정보들을 정상적으로 가져올 수 있는지, 가져올 수 있다면 우리가 원하는 방식대로 정보들을 가공해 줄 수 있는지가 중요했다.

아무래도 처음으로 외부 API 를 활용해보는 것이다 보니, 이것을 어떻게 하면 우리가 원하는 대로 활용할 수 있는지를 미리 알아야 하는것이 중요했으므로 본격적으로 프로젝트를 시작하기 전 간단한 코딩을 통해 이 API 들을 통해 어떻게 정보들을 가져올 수 있는지 알아보았다.

https://github.com/HoJun-Seo/LOL_API_Practice 

 

GitHub - HoJun-Seo/LOL_API_Practice

Contribute to HoJun-Seo/LOL_API_Practice development by creating an account on GitHub.

github.com

위의 링크는 LOL API 를 어떤식으로 활용하면 우리가 원하는 데이터를 가져올 수 있는지에 대해 실험을 진행한 Repository 이다.

이와 같은 실험을 통해 API 를 이용하여 가져올 수 있는 데이터를 JSON 객체에 저장 할 수 있음을 알게 되었다.

어쩌면 애초에 LOL API 사이트 자체에서 실행결과로서 보여주는 데이터가 JSON 형태였기에 당연한 것이었을지도 모르겠다.

https://developer.riotgames.com/apis

 

Riot Developer Portal

 

developer.riotgames.com

 

URL 에 한글 정보를 담아서 정확히 전달하는 방법?

LOL API에 대한 사용법을 익힌 이후 본격적으로 소환사 명을 검색하여 데이터를 받아오는 기능을 구현하는 과정에서 문제가 생겼다.

영어로만 이루어진 소환사 명은 문제 없이 검색한 후 데이터를 받아오는 반면 한글로 된 소환사명의 경우 한글 인코딩이 깨지면서 제대로된 결과를 얻어올 수 없는 상황이 발생한 것이다.

분명히 API 를 제공해주는 사이트에서 제공해주는 간단한 테스트 기능을 통해서 한글로된 소환사 명을 입력해서 나오는 결과를 확인해 봤을땐 정상적으로 데이터가 잘 반환되는 것을 확인했었는데 직접 코딩을 해서 결과를 얻으려고 하니 한글 인코딩이 깨지는 바람에 제대로 소환사명을 가지고 오질 못하는 것을 확인할 수 있었다.

그래서 API 를 테스트 해볼 수 있는 사이트에서는 한글로 된 소환사명을 어떤식으로 처리해서 검색하고 있는지를 확인해봤다.

 

처음으로 알게된 퍼센트 인코딩

API 테스트를 통해 한글로 된 소환사 명이 어떤식으로 URL 에서 처리되는지 확인해본 결과 URL 에 한글 그 자체가 넘어가는 것이 아니라, 무언가 규칙을 가진듯한 다른 문자들로 변환되어 넘어가는 것을 확인할 수 있었다.

아래의 이미지를 보면 그 변환이 이루어져 있는것을 확인해 볼 수 있다. 

한글로 입력된 문자열이 퍼센트 인코딩되어 출력되고 있다.

이것이 무엇인지 한번 알아보니 퍼센트 인코딩 이라는 것을 알 수 있었다.

여기서 퍼센트 인코딩이란 URL 에 문자를 표현하는 문자 인코딩 방법으로 이 방법에 따르면 알파벳이나 숫자 등 몇몇 문자를 제외한 값들은 옥텟 단위(약 8비트) 로 묶어서 16진수 값으로 인코딩 하는 것이라고 한다.

즉, 알파벳이나 숫자가 아닌 다른 문자들은 URL 을 통해서 정보 전달을 해주려고 할 경우 퍼센트 인코딩을 따로 해주어야 한다는 뜻이다.

- SummonerController.java

String developKey = "RGAPI-d2e8a04d-ab09-4524-81ef-49715bea3ebb";
String apiURL = "";
URL riotURL = null;
HttpURLConnection urlConnection = null;
BufferedReader br = null;

SummonerDTO summonerDTO = null;
        try {
            JSONObject jsonObject = new JSONObject(summonerName);
            summonerName = URLEncoder.encode((String) jsonObject.get("summonerName"), "UTF-8"); // 퍼센트 인코딩

            apiURL = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+summonerName+"?api_key="+developKey;
            riotURL = new URL(apiURL);
            urlConnection = (HttpURLConnection)riotURL.openConnection();
            urlConnection.setRequestMethod("GET");

            br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
            String result="";
            String line="";
            while((line=br.readLine()) != null) {
                result += line;
            }

            JSONObject summonerObject = new JSONObject(result);

            summonerDTO = new SummonerDTO(
                    summonerObject.getString("name"),
                    summonerObject.getString("id"),
                    summonerObject.getString("accountId"),
                    summonerObject.getString("puuid"),
                    summonerObject.getInt("profileIconId"),
                    summonerObject.getLong("summonerLevel"),
                    summonerObject.getLong("revisionDate"),
                    memberDTO.getUserid());

        } catch (Exception e) {
            System.out.println(e.getMessage());
            model.addAttribute("summoner_name", summonerName);
            return "../valid/notexistSummonerValid";
        }

* 위의 코드를 보면 URLEncoder 클래스의 encode 메소드를 통해 퍼센트 인코딩을 수행하고 있는것을 알 수 있다.

 

이런 방식으로 한글과 같은 데이터의 경우 퍼센트 인코딩 처리를 해주어야 API 를 호출하면서 URL 에 실려있는 소환사 명을 제대로 인식시켜 해당 소환사에 대한 데이터를 반환값으로 돌려 받을 수 있게 되는 것이다.

그렇게 해서 getInputStream() 메소드를 통해 반환값을 BufferedReader 변수로 돌려받게 되면 readLine() 메소드를 통해 줄 단위로 문자열 변수(result)에 해당 데이터들을 적재해준 후, 해당 문자열 변수를 이용하여 JSON 객체를 만들어주는 것을 끝으로, JSON 객체 형식으로 반환받는 소환사 데이터 값을 정상적으로 이용할 수 있게된다.

 

- 소환사 객체 클래스 다이어그램(최종)