[JPA] User 저장에 대한 고려 및 의문점

한상희·2025년 4월 17일

JPA

목록 보기
2/2
post-thumbnail

🤔 의문점

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 부분에서 의문점이 생겼습니다.

  1. else 부분에 userRepository.save(existData);을 보면 유저가 이미 있는데 왜 다시 이메일, 유저, 권한을 다시 저장하는 거지?
    1.1 만약에 유저가 원본 이메일이 바꾸면 누군가가 그 이메일로 새로 가입하면 어떻게 되지?

1. 유저가 이미 있는데 왜 다시 이메일, 유저, 권한을 다시 저장하는 거지 ⁉️

유저가 이미 있는데 다시 이메일과 username을 다시 저장을 하네?
라는 의문점에서 시작되었다. 이미 가입한 유저의 정보는 잘 바뀌지 않을텐데 말이죠.

지금 생각해보면 영속성 컨텍스트에 대한 내용을 생각을 못해 생긴 의문점이었습니다.

위에서 userRepository.findById(Username)을 해서 만약 그 유저가 있다면 영속성 컨텍스트에 들어 간후 영속성 컨텍스트는 다음과 같이 처리합니다.
크게 두가지가 있는거 같습니다.

  1. 내용이 바뀐 경우
    내용이 바뀌면 영속성 컨텍스트insert 퀴리를 날리지 않는다. 이미 위에서 findById을 해서 해당 유저를 가져 온 후 근데 유저가 이메일을 바뀐 경우는 영속성 컨텍스트가 알아서 update 퀴리를 날립니다.

  2. 안 바뀐 경우
    이 부분도 영속성 컨텍스트가 알아서 해결합니다. 이런 경우는 영속성 컨텍스트에서 바뀐 내용이 없어서 아무 행동도 취하지 않습니다.

1.1 원본 이메일을 유저가 수정하면? 📮

그건 else 부분에서 해결되는 거였다.

else {
	existData.setUsername(username);
    existData.setEmail(oAuth2Response.getEmail());

    role = existData.getRole();

    userRepository.save(existData);
}    

매번 이메일과 유저의 이름을 바꿔주는데 로직인데 이 부분도 영속성 컨텐스트가 알아서 해주므로 상관이 없습니다.

profile
안녕하세요

2개의 댓글

comment-user-thumbnail
2025년 6월 12일

블로그 접으셨나요?

답글 달기
comment-user-thumbnail
2025년 6월 17일

상희님~~ 블로그 잘 쓰시는거 보기 좋았는데 요즘 많이 바쁘신가봐요 😭

저는 항상 기다리고 있을게요~

답글 달기