์ด๋ฒ ํฌ์คํธ๋ ํ๋ก์ ํธ ์ฒซ๋ฒ์งธ ์ด์ Riot API ์น์ธ ๋ฐ ํ์ฑ์์ ๋๋ฒ์งธ ํญ๋ชฉ, Riot API ํ์ฑํ๊ธฐ๋ค. ๋๋ ๊ฐ๋ฐ๋ถ๋ถ์ด ์๋๊ณผ์ ์ค ๋ฏธ๋ฆฌ ์ค๋นํด์ผํ๋ ๋ถ๋ถ์ Preparations
๋ก ๊ตฌ๋ถํ๊ณ ์๋ค.
์ ๋ช ํ ๋ฆฌ๊ทธ์ค๋ธ๋ ์ ๋ ์ ์ ์ฌ์ดํธ๋ฅผ ํด๋ก ์ฝ๋ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด๊ธฐ๋ก ํ๋ค. ํผ์์ ์งํํ๋๋งํผ 1์ฐจ์ ์ธ ๋ชฉํ๋ ๊ฐ๋จํ ์๋์ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๊ธฐ๋ก ํ๋ค.
๐จ RESTFUL Project ๐จ โข RIOT API + Spring Boot + AWS EC2 & RDS
๋๋ Spring Boot๋ฅผ ์ด์ฉํด์ ํ๋ก์ ํธ๋ฅผ ์งํ์ค์ด๋ค. ๋ง์นจ ์ด ํ๋ ์์ํฌ์๋ Jackson ์ด๋ผ๋ ํ๋ฅญํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ๋ค. Jackson์ java๋ฅผ json์ผ๋ก json์ java๋ก ๋ฐ๊ฟ์ฃผ๋ ์ญํ ์ ํ๋ค. ๋ฐ๋ผ์ Riot์ผ๋ก๋ถํฐ ์ป์ด์จ json์ ์๋ฐ DTO์ ๋์ ์์ผ์ฃผ๋ ๋ฐฉ์์ ์ฑํํ๋ค.
์์ APIํค๋ฅผ ์ธ์ฆํด์ ๋ฐ์๋ค๋ฉด ๋์ฑ ์ข์ง๋ง, ๊ตณ์ด ๋ฐ์ง ์์์ด๋ DEVELOPMENT API KEY
๋ฅผ ์ด์ฉํด์ ์์์ ์ผ๋ก ํ์ฑํ๊ฑฐ๋ ๋ผ์ด์ API์์ ํ
์คํธ ํ ์์๋ค.
์๋ฅผ ๋ค์ด, ์ํ์ฌ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ json ๋ฐ์ดํฐ๋ฅผ ๋ผ์ด์ API์์ ํ ์คํธํด๋ณด์. SUMMONER์ด๋ผ๋ API๊ฐ ์ํ์ฌ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํญ์ ๋๋ฌ์ ๋ณด๊ฒ๋๋ฉด, ๋ค์๊ณผ๊ฐ์ด 4๊ฐ์ง ๋ฐฉ๋ฒ์ด ๋์จ๋ค.
์ค๋ฅธ์ชฝ ํ๋์ ๊ธ์จ๋ฅผ ์์ธํ๋ณด๋ฉด 4๊ฐ์ง ๋ชจ๋ summoner๋ฅผ ๊ฐ์ ธ์ฌ์์๋ค. ๋ค๋ง ๋ชจ๋ ๋ฐฉ๋ฒ์ด ๋ค๋ฅธ๋ฐ, ๊ทธ์ค ์ํ์ฌ ์ด๋ฆ์ผ๋ก ๊ฒ์ํ๋ 2๋ฒ์งธ ํญ์ ์ ํํ๋ค. ํด๋ฆญํ๊ฒ๋๋ฉด DTO๋ถํฐ ๋ฐฉ๋ฒ๊น์ง ๊ต์ฅํ ์์ธํ ์๊ฐํด์ฃผ๊ณ ์๋ค. ํ
์คํธํ๊ธฐ์ํด์๋ ๋จ์ํ ์ํ์ฌ๋ช
์ ์ ๊ณ DEVELOPMENT API KEY
๋ฅผ ํตํด ์์ฒญ(REQUEST)๋ฅผ ๋ณด๋ด๊ฒ๋๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
๋๋ ๊ฐ ํ์ด์ปค์ฑ๋์ ๋ํ ์ ๋ณด๋ฅผ ์์ฒญํด๋ณด์๋ค. ์์ฒญ์ ํ๋ฉด REQUEST URL
๋ถํฐ ์์ํด์ RESPONSE BODY
๊น์ง ์ ๋ณด๋ค์ด ์ญ๋์จ๋ค. ์ด๋ ๋์ฌ๊ฒจ ๋ด์ผํ ๋ถ๋ถ์ ์ธ๊ฐ์ง๋ค.
REQUEST URL
: GET๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋ URL๋ก ๋์ค์ ์ง์ ํ์ฑํ ๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ฐ๋ฆฌ๊ฐ ๋ฃ์ด์ค์ผํ๋์ง ํ์ธํ ์์๋ค. ์ฌ๊ธฐ์๋ ์ํ์ฌ๋ช
๊ณผ API_KEY
๊ฐ ํ์ํ๋ค. ์ฐธ๊ณ ๋ก API_KEY๋ ํญ์ ํ์ํ๋ค.
RESPONSE CODE
: ์ํ์ฝ๋๋ ๋น์ฐํ ๊ธฐ๋ณธ์ค์ ๊ธฐ๋ณธ์ด๋ค. ๋ผ์ด์ DOCS์์๋ ์ํ์ฝ๋๋ฅผ ์์ธํ ์ค๋ช
ํด์ฃผ๊ณ ์๋ค. ์ค์ ๋ก ํ์ฑํ๋ค๊ฐ ์ฌ๋ฌ๋ฒ ์ค๋ฅ๊ฐ ๋ฌ์๋๋ฐ, ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ ๊ธ๋ฐฉ ๋น ์ ธ๋์ฌ ์ ์์๋ค.
RESPONSE BODY
: ๋ง์ง๋ง์ผ๋ก, ๋ฐ์ดํฐ๊ฐ ๋ด๊ธด ์๋ต ๊ฒฐ๊ณผ๋ค. ์ด๋ฐ ๋ฐ์ดํฐ๋ค๋ก ์ฌ๋ฌ API๋ฅผ ํ์ฑํด์ ์๋ก๊ฐ์ ๊ด๊ณ๋ฅผ ํ์
ํด์ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋๊ฒ์ด ์ค์ํ๋ค.
์ฌ๊ธฐ๊น์ง๋ ํ ์คํธ์๊ณ , Apache์์ ์ ๊ณตํ๊ณ ์๋ HttpClient ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํด์ ๋ฐ์์๋ค. ๋จผ์ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ ๊ฐ์ฒด๋ฅผ์ํด DTO(Data Transfer Object)๋ฅผ ๋ง๋ค์ด ์คฌ๋ค. ์์ ํ ์คํธ๋ฅผ ์งํํด๋ณธ์ฌ๋์ด๋ผ๋ฉด ์์๊ฒ ์ง๋ง, ๋ผ์ด์์์ DTO์ ๋ณด๋ ์น์ ํ๊ฒ ์๋ ค์ฃผ๊ณ ์๋ค.
ํด๋์ค๋ช ๊น์ง ์ ์ํด์ฃผ๋ ๊ฐ..
๋๋ MVC๊ตฌ์กฐ๋ฅผ ํ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ์ ์ ํ ํจํค์ง์ ์์ฑํด๋์๋ค. ๊ทธ๋ฆฌ๊ณ Key๋ด๊ณ ์๋ Static ๋ณ์๋ฅผ ํ๋ ๋ง๋ค๊ณ , API_KEY๋ฅผ ๋ด์๋จ๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ ๊น์์ฌ๋ฆฐ๋ค๋ฉด gitignore๋ฅผ ํด์ค์ผํ๋ค๋์ ์ ์์ง๋ง์.
// ๊ณต๋ฐฑ ์ฒ๋ฆฌ
String SummonerName = name.replaceAll(" ", "%20");
String requestURL = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+ SummonerName + "?api_key=" + Key.API_KEY;
try {
HttpClient client = HttpClientBuilder.create().build(); // HttpClient ์์ฑ
HttpGet getRequest = new HttpGet(requestURL); //GET ๋ฉ์๋ URL ์์ฑ
HttpResponse response = client.execute(getRequest);
//Response ์ถ๋ ฅ
if (response.getStatusLine().getStatusCode() == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String body = handler.handleResponse(response);
}
...
์ด๋ฐ์์ผ๋ก json ๋ฐ์ดํฐ๋ฅผ response body์ ๋ด์๋ค. ์ฒ์ postman์ผ๋ก ํ
์คํธ๋ฅผ ํ๋๋ฐ ์๊พธ ๋ฐ์ดํฐ๊ฐ ์๋์ด์์ ๊ณ ์ํ๋ค. ๋ฌธ๋ ๋ผ์ด์ API์์ ํ
์คํธํ ๋ ๊ณต๋ฐฑ์ฒ๋ฆฌ๊ฐ %20
์ผ๋ก ๋์ด์์๋ค๋๊ฒ์ ๋ดค๋์ง๋ผ ํด๊ฒฐํ ์ ์์๋ค.
name์ controller๋ก๋ถํฐ @Pathvariable ํ๋ผ๋ฏธํฐ๋ก ๋์ด์ค๋ ์ํ์ฌ๋ช ์ด๋ค. ์ดํ๋ HttpClient๋ฅผ ํตํด์ response๋ฅผ ๋ฐ์๋ด๊ณ ์๋ค. ๋ค๋ง ์ํ์ฝ๋๊ฐ 200์ผ๋์ ๊ทธ ์ด์ธ์ผ๋๋ ๊ตฌ๋ถํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ค.
์์์ ๊ตฌํ Response body๋ฅผ ์ถ๋ ฅํด๋ณด๋ฉด ๊ต์ฅํ ๊ธด jsonํ์์ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค. Jackson์ ์ด์ฉํ๋ฉด ์์ฃผ ๊ฐํธํ๊ฒ java ๊ฐ์ฒด๋ก ๋ฐ๊ฟ ์ ์๋ค.
ObjectMapper objectMapper = new ObjectMapper();
Summoner summoner = null; // DTO
// ๊ณต๋ฐฑ ์ฒ๋ฆฌ
String SummonerName = name.replaceAll(" ", "%20");
String requestURL = "https://kr.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+ SummonerName + "?api_key=" + Key.API_KEY;
try {
HttpClient client = HttpClientBuilder.create().build(); // HttpClient ์์ฑ
HttpGet getRequest = new HttpGet(requestURL); //GET ๋ฉ์๋ URL ์์ฑ
HttpResponse response = client.execute(getRequest);
//Response ์ถ๋ ฅ
if (response.getStatusLine().getStatusCode() == 200) {
ResponseHandler<String> handler = new BasicResponseHandler();
String body = handler.handleResponse(response);
summoner = objectMapper.readValue(body, Summoner.class); // String to Object๋ก ๋ณํ
}
...
์์์ ๋์จ ์ฝ๋์ ๋น๊ตํด์ 3์ค๋ง ๋ฐ๋์๋๋ฐ, jsonํํ์ String์ DTO ๊ฐ์ฒด๋ก ๋ฐ๊ฟ ์ ์๋ค.
๋ผ์ด์ API์์ ํ ์คํธํ๋ฉด์ ๋๋ผ์ จ๊ฒ ์ง๋ง, ์ด๋ค๋ฐ์ดํฐ๋ค์ด ์๋์ง ์ง์ ํ์ธ์ด ๊ฐ๋ฅํ๋ค. ๋๋ ์ฝ์ง(?)์ ํด๊ฐ๋ฉฐ ๋๋ฆ ์ ์ ์ ํด๋ดค๋ค. '์์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์งํํ๋๋ฐ ํ์ํ ์๋ ์๊ฒ ๋ค'๋ผ๋ ์๊ฐ์ด ๋ค๋ฉด ์ผ๋จ ํ์ฑ์ ํด์๋ ๊ฒ๊ฐ๋ค.
- Summoner ย ย ย ย ย ย ย ย ย ย ย ย ย : ์ํ์ฌ ์ ๋ณด
- Spectator ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย : ์ํ์ฌ ํ์ฌ ๊ฒ์ ์ ๋ณด
- MatchList ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย : ์ํ์ฌ ์ ์ ๋ฆฌ์คํธ
- Champion ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย : ์ฑํผ์ธ ๋กํ ์ด์ ์ ๋ณด
- Champion-mastery : ์ํ์ฌ๋ง๋ค ์ฑํผ์ธ ์๋ จ๋ ์ ๋ณด
๋ด๊ฐ ์ฑํํ ํ์ฑ ๋ฐฉ๋ฒ์ response body ๋ด์ฉ ๋ชจ๋ ๊ฒ์ ํ๋์ ๋ฌธ์์ด์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ List์ ๋ด์์ผํ๋ ๊ฒ๋ค์ ์ ๊ทํ์์
์ด ํ์ํ๋ค. ์ฒ์์๋ ๋ค๋ฅธ ํ์ฑ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค์๋๋ฐ, ์๊ฐํด๋ณด๋ ๋ฌธ์์ด ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด๋๋ ๋ถ๋ถ์ด์๋ค. ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ฅผ ๋ฌธ์ ๋ก๋ง ํธ๋, ์ด๋ฐ ๊ฐ๋จํ ๋ฐฉ๋ฒ์กฐ์ฐจ ๋์๊ฐ๋ คํ๋ ๋ด ๋ชจ์ต์ ๋ณด์๋ค. ํ๋ฒ ์๊ฐํด๋ด์ผ ํ๋ ๊ฒ์ด๋ผ๊ณ ์์ ๋ชฉ์ ์ง์์ง๋ง, ๋๋ฒ์ธ๋ฒ๋ค๋ฒ๋ค์ฏ๋ฒ์๊ฐํ์ใ
กใ
ก
๋ฐ์ฑํ๊ณ ๋์๋ณด๋ ๋ชจ์ต ์ข์์~ ์ด์ด