2023-01-10
저번주에 이어서 이제는 캐시를 적용 하려고... 했는.. ㄷ...
메인 게임로직이 급해서 어쩔수없이 캐시 적용을 뒤로 미루고 더 급한 기능인 메인 게임 로직을 잡게 되었다.
다만, 메인 게임 로직을 하게 되었다.
다만, 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 을 받을수 있게 되었다 !!!
조금 더 자세하게 설명은 다음 글에서...
힘들었따....