유저 프로필을 수정하는 기능을 만들던 중
온갖 방법을 다 써도 유저 프로필이 수정이 되지 않아서 gpt에게도 물어보고 온갖 방법을 다 써도 해결이 되지 않았다.
@Transactional
public ResponseEntity<StatusResponseDto> updateUser(MultipartFile imageFile, String nickname,
UserDetailsImpl userDetails) {
User user = userDetails.getUser();
Image profileImage= null;
if (imageFile != null) {
imageUtil.validateFile(imageFile);
//기존 이미지를 bucket과 Image 테이블에서 삭제.
if(user.getImage()!=null){
DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(bucket, user.getImage().getImageKey());
amazonS3.deleteObject(deleteObjectRequest);
imageRepository.delete(user.getImage());
}
//새로운 image 객체 생성.
String fileUUID = imageUtil.uploadToS3(imageFile, amazonS3, bucket);
profileImage = new Image(fileUUID, amazonS3.getUrl(bucket,fileUUID).toString());
user.updateUserProfile(nickname,profileImage);
}
user.updateUserProfile(nickname);
return new ResponseEntity<>(new StatusResponseDto("프로필 수정이 완료되었습니다.", true), HttpStatus.ACCEPTED);
}
++PATCH메서드인데 image를 요청하지 않아도 계속 null로 바뀌는 문제가 발생.
@Transactional 어노테이션 달기.
profileImage.setUser(user); 로 연관관계 설정해주기.
Image 클래스에서 @OneToOne(mappedby = "image") 로 연관관계 설정해주기.
등등 온갖 방법을 다 시도해도 되지 않았다.
문제는!!!
영속성 컨텍스트에 user객체가 담기지 않아서!!!
User user = userDetails.getUser();
유저 객체를 UserDails에서 가져왔기 때문에 영속성 컨텍스트에 들어있지 않아
@Transaction이며 연관관계며 다 적용이 되지 않았던 것이다.
userRepository.save(user)
이렇게 직접 save메서드를 사용해도 되지만.
User user = userRepository.findById(userDetails.getUser().getUserId())
.orElseThrow(() -> new NullPointerException("회원이 존재하지 않습니다."));
이렇게 처음부터 유저를 userRepository에서 가져오니 테스트시 결과가 잘 반영 되었다.
영속성 컨텍스트에 대한 개념이 어려워서 대충 공부하고 넘어갔었는데 이렇게 나를 힘들게 할 줄은 몰랐다. 다시 복습을 하러 가야겠다.
++ PATCH메서드인데 image를 요청하지 않아도 계속 null로 바뀌는 문제가 발생.
로직 내부에 image를 null로 명시적으로 초기화했기 때문에 null이 반영되었던 것.