영속성 컨텍스트 체험

형기브·2023년 8월 6일

troubleShooting

목록 보기
8/8

문제

유저 프로필을 수정하는 기능을 만들던 중
온갖 방법을 다 써도 유저 프로필이 수정이 되지 않아서 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이 반영되었던 것.

profile
Slow but Steady

0개의 댓글