ํฌ์ผ๋ชฌ API์ ์ฃผ์๋ "https://pokeapi.co/api/v2/" ์ด๋ค.
์ด ๋ค์๋ pokemon/{id}๋ pokemon-species/{id} ๋ฑ๋ฑ ๋ค์ํ ์ถ๊ฐ์ ์ธ ์ฃผ์๋ค์ด ์๋ค.
์ด๊ฑฐ๋ ํ์ํ ๋ฐ์ดํฐ์ ๋ฐ๋ผ์ ๊ณจ๋ผ์ ์ฌ์ฉํ๋ฉด ๋๋ค.
ํฌ์ผ๋ชฌ API๋ฅผ ์ฐ๋ํ๋ฉด์ Retrofit2 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
Retrofit2๋?
์๋ฒ์ ํด๋ผ์ด์ธํธ(Android)์ HTTP ํต์ ์ ์ํด Square์ฌ์์ ์ ๊ณตํ๋ ๋คํธ์ํฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
Retrofit์ผ๋ก API๋ก response์ call์ ๋ฐ๊ธฐ ์ํด, ๊ทธ๋ฆฌ๊ณ ์๋ต ๋ฐ์ดํฐ ํ์์ JSON์ผ๋ก ๋ฐ๊ธฐ์ํด ์๋ ์ฝ๋๋ค์ ์ถ๊ฐํด์ค๋ค.
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
๊ทธ๋ฆฌ๊ณ Retrofit ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ ์์ผ์ค์ผ ํ๋ค.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl) //API ๊ธฐ๋ณธ URL
.addConverterFactory(GsonConverterFactory.create())
.build();
public interface PokeService{
@GET(/pokemon/{no})
public Call<PokemonVO> function(@Path("no") String no);
}
์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ํจ์์ ๋ํ ์์ธ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฉด ์๋๋ค.
๊ทธ๋ฆฌ๊ณ Retrofit ๊ฐ์ฒด๋ฅผ ์ ์ธํ ๊ณณ์์ VelogService ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
PokeService pokeService;
pokeService = retrofit.create(PokeService.class);
์์
์ ์งํํ ํจ์ ์์ Call<>์ ์ด์ฉํ์ฌ API๋ก ๋ถํฐ ์๋ต์ ๋ฐ์์จ๋ค.
์ฐธ๊ณ ๋ก Call์ ๋๊ธฐ ๋ฐฉ์์ด๊ณ Callback<>ํจ์๋ ๋น๋๊ธฐ ๋ฐฉ์์ด๋ค.
Call<PokemonVO> call = pokeService.getspeciesData(no);
Response<PokemonVO> response = call.execute();
๊ทธ๋ฆฌ๊ณ response์ json ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์์ผ๋ฉด,
PokemonVO pokeVO = response.body();
๋ก JSON ๋ฐ์ดํฐ์ ํต์ฌ ๋ถ๋ถ์ธ body()๋ฅผ ๋ฐ์์จ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ค์ํ ๊ฑด PokemonVO ํด๋์ค์ด๋ค.
JSON ๋ฐ์ดํฐ์ Key๊ฐ๊ณผ PokemonVO ํด๋์ค์ ๊ฐ์ฒด ์ด๋ฆ์ ๋๊ฐ์ด ํด์ผ ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์์์ง๋ค.
ex) JSON ๋ฐ์ดํฐ์ "name" ํค๊ฐ ์๋ค๋ฉด @SerializedName ์ด๋
ธํ
์ด์
์ ์ด์ฉํด์ ์ง์ ์ง์ ํด์ฃผ๊ฑฐ๋, ๊ฐ์ฒด์ ์ด๋ฆ์ ๋๊ฐ์ด ๋ง๋ค๋ฉด ๋๋ค.
@SerializedName("name")
private String str;
private String name;
๋ฌด์กฐ๊ฑด ๋ ์ค ํ๋๋ก!!
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ names[] ์ฒ๋ผ ๋ฐฐ์ด ํํ์ ํค๊ฐ์ด ์๋ค๋ฉด
@SerializedName("names")
private List<NameInfo> names;
์ด๋ ๊ฒ ๋ฐฐ์ด ํํ์ names ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค๋ค.
@Getter
public static class NameInfo{
@SerializedName("name")
private String name;
}
๊ทธ๋ฆฌ๊ณ PokemonVO ํด๋์ค ์์ NameInfo ํด๋์ค๋ฅผ ๋ง๋ ๋ค์, names[] ํค๊ฐ ์์ ์๋ ๊ฐ์ฒด์์ ๋ฝ์์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๊ฐ์ด ๊ฐ์ ์ด๋ฆ์ผ๋ก ๋ง๋ค๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์๋์ ๊ฐ์ด ๊ฐ์ฒด๋ค์ ์ ๊ทผํด์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ฉด ๋๋ค!
List<PokemonVO.NameInfo> names = pokeVO.getNames();
PokemonVO.NameInfo nameInfo = names.get(2);
String name = nameInfo.getName();
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์์ ์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ค์ ๋ฝ์์ค๋ฉด ๋จ!!
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Pokemon {
private int no;
private String korean;
private String img;
private String simg;
private String[] types = new String[2];
private ArrayList<Ability> abilities;
private String genus;
@Getter
@AllArgsConstructor
public static class Ability{
String name;
String hidden;
}
}
๋ด๊ฐ ๋ง๋ค๊ณ ์ถ์ ๋ฐ์ดํฐ ํ์์ ๊ฐ ํฌ์ผ๋ชฌ ๋ง๋ค ๊ทธ ํฌ์ผ๋ชฌ ๋ง์ ์ ๋ณด๋ฅผ ๋ค ๋ฃ์ด์ฃผ๋ ๊ฒ์ด๋ค.
์ฒ์์ ๋๊ธฐ ํต์ ์ ์ฌ์ฉํ๋๊น 1024๋ง๋ฆฌ์ ํฌ์ผ๋ชฌ๋ค์ ์ ๋ณด๋ฅผ ํ๋ ํ๋์ฉ ๊ฐ์ ธ์์ผํ๊ธฐ ๋๋ฌธ์ ์์ฒญ ์ค๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด๋ค.
๊ทธ๋์ ๋น๋๊ธฐ ํต์ ์ผ๋ก๋ ํด๋ณด๊ณ ํ๋๋ฐ ๋ด๊ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ค์ api ์ฃผ์๋ค์ด ๋ค ๋ฌ๋ผ์ ๊ฐ๊ฐ ๋ฐ๋ก๋ฐ๋ก ๋ฝ์์์ผ ํด์ ๋ฐ์ดํฐ๋ค์ด ๋ค์ฃฝ๋ฐ์ฃฝ์ด ๋๋ ๊ฒ,,
๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ค๊ฐ JS์์ Promise๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ์๋ ๋ถ๋ค๋ ์์๋๋ฐ, ์ด๋ฏธ ์ปจํธ๋กค๋ฌ๋ DAO๋ VO ๊ฐ์ ๊ฑธ ๋ค ์ค์ ํด๋์ ์ํ๋ผ JS์์ API๋ก ๊ฐ์ ธ์ค๊ณ ์ถ์ง ์์๋ค.
๊ทธ๋ ๋ค๊ณ ๊ทธ๋๋ก API๋ฅผ ์ฌ์ฉํ์๋ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๋๋ฐ๋ง 25๋ถ ์ ๋ ๊ฑธ๋ฆฌ๋ ๊ฒ์ด๋ค..(์ด๊ฑด ๋ด๊ฐ ์ข ์ค์ํด์ ๋ฐ์ดํฐ๊ฐ ๊ผฌ์ฌ์ ์์ฒญ ์ค๋ ๊ฑธ๋ฆฐ๊ฑฐ์์..!)
๋์ ํ ์๋๊ฒ ๋ค ์ถ์ด์ ์๊ฐํด๋ธ๊ฒ JSON ๋ฐ์ดํฐ ํ์ผ์ ๋ง๋ค์ด์ api ๋ง๊ณ ๊ทธ ํ์ผ์์ ๊ฐ์ ธ์ค๋ฉด ์ข ๋ ๋นจ๋ผ์ง์ง ์์๊น?! ์ถ์๋ค.
๊ทธ๋์ JSON ํ์ผ์ ๋ฃ์ ๋ฐ์ดํฐ๋ฅผ api๋ก ๋ค ๊ฐ์ ธ์์ JSON ํ์ผ๋ก ์ ์ฅ์์ผฐ๋ค.
JSON ํ์ผ ์์ฑํ๋ ๋ฒ
ArrayList<Pokemon> allPokemons = pokeDAO.allList(1,1010); ObjectMapper mapper = new ObjectMapper(); try { // JSON ํ์ผ๋ก ์ฐ๊ธฐ mapper.writeValue(new File("data.json"), allPokemons); System.out.println("JSON ํ์ผ์ด ์์ฑ๋์์ต๋๋ค."); } catch (Exception e) { e.printStackTrace(); }
ArrayList ํํ์ ๊ฐ์ฒด๋ฅผ JSON ๋ฐ์ดํฐ๋ก ์์์ ๋ง๋ค์ด์ค๋ค!
JSON ํ์ผ๋ ๋ง๋ค์์ผ๋ ์ด์ ์ด ํ์ผ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์์ ๋ด์ผ์ง~~