캐릭터 업데이트 수정

2024.09.24 닉네임 변경으로 인한 캐릭터 업데이트가 안되는 문제 수정

1. 현재 코드

@Transactional  
public void updateCharacterList(String username) {  
    // 1. 회원 조회  
    Member member = memberDao.get(username);  
  
    // 2. 대표캐릭터 조회  
    String mainCharacter = member.getMainCharacterName();  
  
    // 3. 거래소, 콘텐츠 통계 데이터 조회  
    Map<String, Market> contentResource = marketDao.findContentResource();  
    List<DayContent> chaos = contentDao.findDayContent(Category.카오스던전);  
    List<DayContent> guardian = contentDao.findDayContent(Category.가디언토벌);  
  
    // 4. 대표캐릭터 이름으로 로스트아크 오픈 API를 통해 원정대 조회  
    List<CharacterJsonDto> characterJsonDtoList = lostarkCharacterDao.getCharacterJsonDtoList(mainCharacter, member.getApiKey());  
    for (CharacterJsonDto dto : characterJsonDtoList) {  
        // 4-1. 캐릭터 이미지 추가(캐릭터 조회 오픈 API)
dto.setCharacterImage(lostarkCharacterDao.getCharacterImageUrl(dto.getCharacterName(), member.getApiKey()));  
  
        // 4-2. 등록된 캐릭터와 이름같은 데이터 찾기  
        Optional<Character> find = member.getCharacters().stream()  
                .filter(character -> character.getCharacterName().equals(dto.getCharacterName())).findFirst();  
  
        // 4-3. 업데이트된 아이템 레벨을 바탕으로 일일숙제 수익 수정  
        DayTodo dayContent = new DayTodo().createDayContent(chaos, guardian, dto.getItemMaxLevel());  
  
        if (find.isPresent()) { // 4-4.이름 같은게 있으면 업데이트  
            Character character = find.get();  
            updateCharacter(character, dto, dayContent, contentResource);  
        } else { // 4-5. 이름 같은게 없으면 추가  
            Character character = addCharacter(dto, dayContent, member);  
            calculateDayTodo(character, contentResource);  
            member.getCharacters().add(character);  
        }  
    }  
}

문제

  • 메인캐릭터 닉네임이 변경된다면 '4. 대표캐릭터 이름으로 로스트아크 오픈 API를 통해 원정대 조회' 가 정상적으로 처리되지 않음

  • 그외 다른 캐릭터의 닉네임이 변경된다면 새롭게 데이터가 추가되고, 개인이 기존 캐릭터를 삭제 -> 추후 기존 데이터로 쌓은 기록이 삭제됨

2. 수정

1) 이미지 URL에 있는 UUID(추정) 사용

이미지를 불러왔을 때 URL을 보면 끝에 UUID로 추정되는 64자리 문자열이 보인다.

이것을 이용해서 변경된 캐릭터 닉네임을 판단해서 업데이트를 하려고 한다.

2) 코드 수정

UUID 찾기 / 비교 메소드

원정대 검색할 캐릭터 닉네임 찾는 메소드

  • lostarkCharacterDao.getCharacter - 로스트아크 오픈 API로 캐릭터 단건 정보를 가져온다.

  • isMatchingCharacter - 데이터들이 null이 아니고 imageUrl도 있는 데이터 중 같은 UUID가 있는 첫번째 데이터를 찾아낸다.

원정대 업데이트

  • lostarkCharacterDao.getSiblings - 로스트아크 오픈 API로 원정대 정보를 가져오는데, 여기엔 이미지 URL 값이 없기 때문에 따로 단건 조회 후 저장해준다.

  • UUID가 일치하는 캐릭터가 있으면 업데이트

    • 업데이트하려는 캐릭터가 메인 캐릭터에 저장된 이름이 같으면 같이 업데이트 해준다.

  • UUID가 일치하지 않는 캐릭터가 있다면 두가지 경우가 존재한다.

    • 캐릭터 이미지 URL이 없는 경우 - 이름으로 다시 찾아서 정보를 업데이트 해준다.

    • 둘 다 아니라면, 캐릭터가 추가된 경우이므로 새롭게 생성한다.

3. 테스트

변경할 데이터

업데이트 메소드 실행

결과

  • 닉네임 자동 변경 : 테스트할캐릭 -> 마볼링

  • 캐릭터 추가 : 넷마블볼링 (이미지 url 미존재)

  • 캐릭터 업데이트 : 바드볼링

    • 이미지 업데이트

    • 아이템레벨 업데이트

  • 메인 캐릭터 닉네임 변경 : 위 닉네임 자동 변경이랑 연동

Last updated