오늘은 어디~? 프로젝트가 거의 마무리 되는 시점이다. 그런데... 프론트 개발자분께서 마이페이지에서 프로필이미지와 닉네임 수정 후 불러오기에 문제가 있다는 것이였다.
프로필 이미지나 닉네임 수정은 했으나 불러와지지 않고,로그아웃 후 다시 로그인한 후에 업데이트 된 데이터가 불러와진다는 것이였다.
어..? 그래요? 바로 문제 해결을 위해 바로 인텔리제이로 프로젝트를 열었다.
문제의 코드
public Map<String,String> getInfo(User user) {
Map<String,String> info = new HashMap<>();
info.put("nickName",user.getNickName());
info.put("profileImage",user.getProfileImage());
return info;
}
코드를 봤을 때는 문제가 없어보였다. 음,,, 문제가 뭘까?? 문제의 단서를 찾기 위해 프론트 개발자분께서 하신 얘기를 곰곰히 생각해보았다.

핵심은 수정된 데이터를 불러오지 못한다는 것이였다.
그러면 수정 요청은 정상적으로 되었는지?
수정 요청 후 데이터베이스에 데이터가 수정되었는지?
이 두가지를 먼저 체크해보니 둘 다 정상적으로 작동하고 있었다.
그렇다면 백엔드 서버가 데이터베이스로부터 수정된 데이터를 불러오지 못한다는 것이였다.
왜지? 왜 수정된 데이터를 불러오지 못하는걸까?를 생각하며 코드를 다시 보았다.
public Map<String,String> getInfo(User user) {
Map<String,String> info = new HashMap<>();
info.put("nickName",user.getNickName());
info.put("profileImage",user.getProfileImage());
return info;
}
음,,, 닉네임과 프로필이미지를 가져오는데 뭐가 문제일까?
혹시나해서 데이터베이스를 한 번 거치고 오도록 코드를 추가해봤다.
public Map<String,String> getInfo(User user) {
User updatedUser = userRepository.findByEmail(user.getEmail());
Map<String,String> info = new HashMap<>();
info.put("nickName",updatedUser.getNickName());
info.put("profileImage",updatedUser.getProfileImage());
return info;
}
이렇게 코드를 수정하니 잘 되었다.
로그인 한 유저 객체를 어떻게 가져왔지??
Spring Security로 보안 구축하였고 @AuthenticationPrincipal 어노테이션을 사용하여 SecurityContext에 저장된 현재 사용자(principal) 객체를 가져왔다.
즉, 이런 경우에는 SecurityContext에 저장된 객체가 업데이트되지 않았다면 이전의 정보를 가져오게 되는 것이다.
그래서 프론트엔드에서 로그아웃 후 다시 로그인을 하면 수정된 데이터를 볼 수 있었던 것이다.
추가적으로 수정 후 다시 수정된 데이터를 불러들이는게 아닌, 수정 후 응답값에 수정값을 내려주어 프론트에서 바로 수정된 부분을 적용할 수 있게 하였다.
이전 코드를 작성하면서 '유저 정보를 가져오면 당연히 업데이트 된 데이터를 가져오겠지?' 라는 생각이였다. 하지만 컴퓨터는 당연한게 없다. 내가 짜놓은 코드대로만 움직인다. 그렇기 때문에 더욱더 디테일하게 코드를 구성해야 되는 것임을 한번 더 느끼게 되었다.