일기

2023-01-10

SHsus 2023. 1. 10. 23:25

저번주에 이어서 이제는 캐시를 적용 하려고... 했는.. ㄷ...

 

메인 게임로직이 급해서 어쩔수없이 캐시 적용을 뒤로 미루고 더 급한 기능인 메인 게임 로직을 잡게 되었다.

다만, 메인 게임 로직을 하게 되었다.

 

다만, Redis 를 사용해서 적용하는 부분을 내가 담당했었기에 메인 로직을 짜시는 분들이 Redis 어느 정도 완성 되기 전까지는 회원 기준으로만 하고 계셨기에 이제 짜 주신 코드들에 비회원 부분을 적용해야 하는 상황이다.

 

그래서 이 부분을 적용하기 위해서 코드를 짜는데 생각보다 어려웠던게 뭐냐면...

 

 

한 페이지에 다 담기지도 않는다....

코드가 복잡해지고 길어지는 상황에 이젠 비회원까지 추가 되었다 보니까 이젠 너무나도 길어지는 코드를 볼 수 있었다..

 

우선은 코드를 간략하게 정리해서 쓰는 것이 아니라 우선은 적용을 해서 돌아가는 것을 우선시 해서 짜다보니 코드가 너무... 길어지게 되었다...

 

다만, 이것을 내가 바로 정리해가면서 작성하는것이 지금 내 수준에서는 불가능하다고 생각했기에 우선은 적용을 우선시해서 작성을 했다.

 

그렇게 우선 선 적용을 해서 잘 작동하는것을 확인.

여기서 중복이 되는 부분을 발견을 해서 이 부분을 해결하기 위해서 어떻게 할까 생각을 하다가 모듈화를 진행하게 되었다.

 

그렇게해서 나온 결과물...

 

// 헤더값 추출 및 회원 검증
public String validHeader(HttpServletRequest request) {
    String userToken = request.getHeader("Authorization");
    String guestInfo = request.getHeader("guest");
    if (userToken != null) {
        Claims claims = jwtUtil.authorizeToken(request);
        return claims.get("email").toString();
    } else {
        return guestInfo;
    }
}
// 회원 Id, Nickname 추출
public HashMap<String, String> gamerInfo(String token) {
    HashMap<String, String> result = new HashMap<>();
    if (token.contains("@")) {
        User user = userRepository.findByEmail(token).orElseThrow(
                () -> new CustomException(StatusMsgCode.USER_NOT_FOUND)
        );
        result.put(GamerEnum.ID.key(), user.getId().toString());
        result.put(GamerEnum.NICK.key(), user.getNickname());
        result.put(GamerEnum.IMG.key(), user.getImgUrl());
    } else if (token.startsWith("Bearer ")) {
        Claims claims = jwtUtil.authorizeSocketToken(token);
        String email = (String) claims.get("email");
        User user = userRepository.findByEmail(email).orElseThrow(
                () -> new CustomException(StatusMsgCode.USER_NOT_FOUND)
        );
        result.put(GamerEnum.ID.key(), user.getId().toString());
        result.put(GamerEnum.NICK.key(), user.getNickname());
        result.put(GamerEnum.IMG.key(), user.getImgUrl());
    } else {
        token = URLDecoder.decode(token, StandardCharsets.UTF_8);
        String[] guestInfo = token.split(",");
        Optional<Guest> guest = Optional.ofNullable(guestRepository.findById("guest:" + guestInfo[0]).orElseThrow(
                () -> new CustomException(StatusMsgCode.INVALID_AUTH_TOKEN)));
        result.put(GamerEnum.ID.key(), guestInfo[0]);
        result.put(GamerEnum.NICK.key(), guestInfo[1]);
        result.put(GamerEnum.IMG.key(), guestInfo[2]);
    }
    return result;
}

 

위와 같은 형태가 되어버렸다...

 

원래는 저것 보다도 더 짧은 코드였는데 웹소켓이 추가 됨으로 인해서 해당 부분에 대한 로직이 새롭게 추가가 되면서 최종적으로는 위와 같은 코드의 형태를 가지게 되었다...

 

저 부분에 회원 검증 로직인 jwt 에서 검증을 거치는 부분도 존재하기 때문에 위의 메서드를 호출하고 매개변수만 형식에 맞게 잘 전달하면 이제 해당 유저의 기본적인 필요한 정보를 HashMap 을 받을수 있게 되었다 !!!

 

조금 더 자세하게 설명은 다음 글에서...

 

힘들었따....