지난번 글에서 Riot API를 위한 Product 등록까지 마쳤고 며칠 내로 승인되어 Approved 상태가 되었습니다. 그래서 Java Spring을 이용해서 간단한 API 사용을 해봤습니다.
Spring boot 시작하기
Spring 프로젝트를 만들기 위해서 start.spring.io 사이트에 접속해 아래와 같이 여러가지 설정을 해줬습니다. 이렇게 설정을 해주고 아래에 "Generate" 버튼을 눌러주면 zip 파일 하나가 다운로드되는데, 해당 파일을 압축 해제하면 프로젝트 관련 파일들을 확인할 수 있습니다. 프로젝트 파일을 확인 후 저는 IntelliJ를 사용하여 코딩을 진행했습니다.
Riot API 확인하기
Riot Developer 페이지에서 내 Product 페이지에 들어가면 사용할 수 있는 API 목록들을 볼 수 있습니다. 저는 이 중에서 계정이름을 이용한 정보 조회 API를 사용해보려고 했습니다. API 이름은 "/lol/summoner/v4/summoners/by-name/{summonerName}" 입니다.
Java Spring 프로그래밍
이제부터는 API 호출을 위한 Java Spring 프로그래밍을 하려고 합니다. 간단한 API 호출 예제를 위해 아래의 내용을 프로그래밍했습니다.
- SummonerController
- SummonerService
- SummonerDTO
Riot API는 호출을 위해서 Product 등록을 통해 받은 Key 값이 필요합니다. 하지만 처음에는 이 키값을 Java Spring 프로그래밍을 할 때 어떻게 적용해야 할지 몰랐습니다.
결론적으로는 Riot Develpoer 페이지에서 힌트를 얻을 수 있었습니다. 두 가지 방법이 있었는데 Query parameter에 넣는 방법과 Http header에 넣어서 보내는 방법이 있었습니다. 저는 간편하게 Query Param 방식을 이용했습니다. SummonerService에서 API Key 값을 사용하는데 하드코딩으로 키 값을 코드에 적는 것은 바람직하지 못한 방법입니다. 이를 해결하기 위해 "riotApiKey.properties" 라는 파일에 Key 값을 적어놨고 이를 코드에서 참조하도록 했습니다. ( 해당 파일은 .gitignore 에 추가하여 공유되지 않도록 했습니다. )
그리고 Riot Developer 페이지는 Response 내용과 DTO 이름도 명시해놨습니다. 이에 맞게 똑같은 형식으로 SummonerDTO를 구현했습니다. 이후에 데이터를 사용하는데 있어 여러가지 이유로 DTO를 정의하지 않고 사용했습니다.
아래 코드들은 처음에 작성한 내용이고 현재는 코드 추가 및 수정이 이루어졌습니다. 전체 코드는 아래의 Github 링크에서 확인할 수 있습니다.
https://github.com/Taaewoo/Riot_Data_Pipeline
SummonerController
@Controller
@RequiredArgsConstructor
public class SummonerController {
private final SummonerService summonerService;
@PostMapping(value = "/summonerByName")
@ResponseBody
public SummonerDTO callSummonerByName(String summonerName){
summonerName = summonerName.replaceAll(" ","%20");
SummonerDTO apiResult = summonerService.callRiotAPISummonerByName(summonerName);
return apiResult;
}
}
SummonerService
@Service
@PropertySource(ignoreResourceNotFound = false, value = "classpath:riotApiKey.properties")
public class SummonerService {
private ObjectMapper objectMapper = new ObjectMapper();
@Value("${riot.api.key}")
private String mykey;
public SummonerDTO callRiotAPISummonerByName(String summonerName){
SummonerDTO result;
String serverUrl = "https://kr.api.riotgames.com";
try {
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(serverUrl + "/lol/summoner/v4/summoners/by-name/" + summonerName + "?api_key=" + mykey);
HttpResponse response = client.execute(request);
if(response.getStatusLine().getStatusCode() != 200){
return null;
}
HttpEntity entity = response.getEntity();
result = objectMapper.readValue(entity.getContent(), SummonerDTO.class);
} catch (IOException e){
e.printStackTrace();
return null;
}
return result;
}
}
SummonerDTO
import lombok.Data;
@Data
public class SummonerDTO {
private String accountId;
private int profileIconId;
private long revisionDate;
private String name;
private String id;
private String puuid;
private long summonerLevel;
}
결과 확인
프로그래밍을 마치고 올바른 서비스와 결과 값이 나오는지 확인하기 위해 Postman을 사용했습니다. 결과는 문제없이 성공적으로 나왔습니다.