UserEntity existData = userRepository.findByUsername(username);
if (existData == null) {
UserEntity userEntity = new UserEntity();
userEntity.setUsername(username);
userEntity.setEmail(oAuth2Response.getEmail());
userEntity.setRole(role);
userRepository.save(userEntity);
} else {
existData.setUsername(username);
existData.setEmail(oAuth2Response.getEmail());
role = existData.getRole();
userRepository.save(existData);
}
시큐리티 + JWT + OAuth2에 대한 강의를 듣다가 User 저장에 대한 부분에서 궁금점이 생겼습니다.
null일 경우 유저를 저장하는 if 문은 의문점이 없었습니다.
그런데 else 부분에서 의문점이 생겼습니다.
else 부분에 userRepository.save(existData);을 보면 유저가 이미 있는데 왜 다시 이메일, 유저, 권한을 다시 저장하는 거지?유저가 이미 있는데 다시 이메일과 username을 다시 저장을 하네?
라는 의문점에서 시작되었다. 이미 가입한 유저의 정보는 잘 바뀌지 않을텐데 말이죠.
지금 생각해보면 영속성 컨텍스트에 대한 내용을 생각을 못해 생긴 의문점이었습니다.
위에서 userRepository.findById(Username)을 해서 만약 그 유저가 있다면 영속성 컨텍스트에 들어 간후 영속성 컨텍스트는 다음과 같이 처리합니다.
크게 두가지가 있는거 같습니다.
내용이 바뀐 경우
내용이 바뀌면 영속성 컨텍스트는 insert 퀴리를 날리지 않는다. 이미 위에서 findById을 해서 해당 유저를 가져 온 후 근데 유저가 이메일을 바뀐 경우는 영속성 컨텍스트가 알아서 update 퀴리를 날립니다.
안 바뀐 경우
이 부분도 영속성 컨텍스트가 알아서 해결합니다. 이런 경우는 영속성 컨텍스트에서 바뀐 내용이 없어서 아무 행동도 취하지 않습니다.
그건 else 부분에서 해결되는 거였다.
else {
existData.setUsername(username);
existData.setEmail(oAuth2Response.getEmail());
role = existData.getRole();
userRepository.save(existData);
}
매번 이메일과 유저의 이름을 바꿔주는데 로직인데 이 부분도 영속성 컨텐스트가 알아서 해주므로 상관이 없습니다.
블로그 접으셨나요?