1. 서론
본격적인 로아 숙제 관리 사이트 개발전 연습
2. 개발
2 - 1. 대표 캐릭터 이름을 입력하여 관련된 전체 캐릭터 불러오기
public JSONArray Characters(String characterName) {
try {
characterName = URLEncoder.encode(characterName, "UTF-8");
URL url = new URL("https://developer-lostark.game.onstove.com/characters/"+characterName+"/siblings");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setRequestProperty("authorization", "Bearer "+ LostarkApiKey);
httpURLConnection.setRequestProperty("accept","application/json");
httpURLConnection.setRequestProperty("content-Type","application/json");
httpURLConnection.setDoOutput(true);
int result = httpURLConnection.getResponseCode();
InputStream inputStream;
if(result == 200) {
inputStream = httpURLConnection.getInputStream();
} else {
inputStream = httpURLConnection.getErrorStream();
}
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
JSONParser parser = new JSONParser();
JSONArray array = (JSONArray) parser.parse(inputStreamReader);
return array;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
- characterName을 변수로 받아서 관련된 캐릭터들의 정보를 JSONArray로 받는다
- 받아오는 데이터 : 캐릭터 이름, 클래스, 아이템 레벨 등
- REST API를 연결하는 부분은 여러군대서 쓰여서 통합된 코드로 만드는게 나을 거 같은데... 시간이 없어서 일단 복붙중...
2 - 2. 추가로 캐릭터 이미지 불러오기
[Controller]
@GetMapping("/lostark/character")
public String character(Model model) {
String mainCharacter = "마볼링";
JSONArray character = characterApiService.Characters(mainCharacter);
String mainServer = "루페온";
ArrayList characters = new ArrayList();
for (Object object : character) {
JSONObject jsonObject = (JSONObject) object;
if (jsonObject.get("ServerName").equals(mainServer)) {
JSONObject characterName = characterApiService.characterProfiles((String) jsonObject.get("CharacterName"));
LostarkCharacterProfileDto dto = new LostarkCharacterProfileDto();
dto.setCharacterName((String) jsonObject.get("CharacterName"));
dto.setCharacterImage((String) characterName.get("CharacterImage"));
dto.setCharacterClassName((String) characterName.get("CharacterClassName"));
dto.setItemMaxLevel(characterName.get("ItemMaxLevel"));
dto = setContent(dto);
characters.add(dto);
}
}
// dto안에 ItemMaxLevel순으로 정렬
Comparator<LostarkCharacterProfileDto> itemMaxLevelComparator = Comparator.comparingDouble(dto -> dto.getItemMaxLevel());
characters.sort(itemMaxLevelComparator.reversed());
model.addAttribute("characters", characters);
model.addAttribute("mainCharacter", mainCharacter);
return "lostark/lostarkCharacter";
}
[Service]
public JSONObject characterProfiles(String characterName) {
try {
characterName = URLEncoder.encode(characterName, "UTF-8");
URL url = new URL("https://developer-lostark.game.onstove.com/armories/characters/"+characterName+"/profiles");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");
httpURLConnection.setRequestProperty("authorization", "Bearer "+ LostarkApiKey);
httpURLConnection.setRequestProperty("accept","application/json");
httpURLConnection.setRequestProperty("content-Type","application/json");
httpURLConnection.setDoOutput(true);
int result = httpURLConnection.getResponseCode();
InputStream inputStream;
if(result == 200) {
inputStream = httpURLConnection.getInputStream();
} else {
inputStream = httpURLConnection.getErrorStream();
}
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
JSONParser parser = new JSONParser();
JSONObject object = (JSONObject) parser.parse(inputStreamReader);
return object;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
- armories/characters/{characterName}/profiles에서 캐릭터의 자세한 정보와 이미지 url을 얻을 수 있다.
- 얻어온 데이터들에서 필요한 정보만 dto에 담는다. (캐릭터 이름, 클래스, 이미지, 아이템 레벨)
2 - 3. 레벨별 일일 컨텐츠 이름
private LostarkCharacterProfileDto setContent(LostarkCharacterProfileDto dto) {
double level = dto.getItemMaxLevel();
if (level < 1415) {
dto.setChaosName("X");
dto.setGuardianName("X");
} else if (level >= 1415 && level < 1445) {
dto.setChaosName("타락 1");
dto.setGuardianName("데스칼루다");
} else if (level >= 1445 && level < 1460) {
dto.setChaosName("타락 2");
dto.setGuardianName("데스칼루다");
} else if (level >= 1460 && level < 1475) {
dto.setChaosName("타락 2");
dto.setGuardianName("쿤겔라니움");
} else if (level >= 1475 && level < 1490) {
dto.setChaosName("타락 3");
dto.setGuardianName("쿤겔라니움");
} else if (level >= 1490 && level < 1520) {
dto.setChaosName("공허 1");
dto.setGuardianName("칼엘리고스");
} else if (level >= 1520 && level < 1540) {
dto.setChaosName("공허 2");
dto.setGuardianName("칼엘리고스");
} else if (level >= 1540 && level < 1560) {
dto.setChaosName("절망 1");
dto.setGuardianName("하누마탄");
} else if (level >= 1560 && level < 1580) {
dto.setChaosName("절망 2");
dto.setGuardianName("하누마탄");
} else if (level >= 1580 && level < 1600) {
dto.setChaosName("천공 1");
dto.setGuardianName("소나벨");
} else if (level >= 1600 && level < 1610) {
dto.setChaosName("천공 2");
dto.setGuardianName("소나벨");
} else if (level >= 1610) {
dto.setChaosName("계몽 1");
dto.setGuardianName("가르가디스");
}
return dto;
}
- 캐릭터의 아이템 레벨에 맞는 일일 컨텐츠(카오스 던전, 가디언 토벌) 이름을 dto에 저장한다
- 마음에 안드는 코드여서 리팩토링 생각중...
2 - 4. 결과
Spring + JSP 사이트에 출력
3. 정리 및 후기
개발 계획 확립
- 로그인/회원가입 + API Key 입력 => 다른 사람도 쓸 수 있게
- api로 바로 불러오는 것이 아닌 따로 DB에 저장해서 불러오기 => 점검시간에도 사용할 수 있게
- 휴식게이지 설정과 사용
- 기존에 만들어둔 일일컨텐츠 수익과 연동하여 숙제 추천