오늘 팀프로젝트를 하면서 UserDetails에서 받아온 유저를 Service단에서 레포지토리에 불러온 유저랑 비교를 하고 안맞으면 튕겨내는 예외처리를 만들었다.
근데 계속 오류가 나는 것이다.
@Transactional
public ReviewCommentResponseDto updateComment(ReviewCommentRequestDto requestDto, Long movieId,
Long reviewId, Long commentId,
User user) {
checkMovieAndReview(movieId, reviewId);
ReviewComment reviewComment = reviewCeommentRepository.findById(commentId)
.orElseThrow(() -> new IllegalArgumentException("해당 댓글은 존재하지 않습니다."));
if (!reviewComment.getUser().equals(user) {
throw new IllegalArgumentException("해당 댓글을 수정할 권한이 없습니다.");
}
reviewComment.setContent(requestDto.getContent());
return new ReviewCommentResponseDto(reviewComment);
}
이 메서드인데 계속 오류가 나는 것이다.
같은 유저끼리 equals로 비교를 하는데 오류가 나서 왜 이러지? 싶었다.
그럼 Id로 구분해보자 싶어서
@Transactional
public ReviewCommentResponseDto updateComment(ReviewCommentRequestDto requestDto, Long movieId,
Long reviewId, Long commentId,
User user) {
checkMovieAndReview(movieId, reviewId);
ReviewComment reviewComment = reviewCeommentRepository.findById(commentId)
.orElseThrow(() -> new IllegalArgumentException("해당 댓글은 존재하지 않습니다."));
if (!reviewComment.getUser().getId().equals(user.getId())) {
throw new IllegalArgumentException("해당 댓글을 수정할 권한이 없습니다.");
}
reviewComment.setContent(requestDto.getContent());
return new ReviewCommentResponseDto(reviewComment);
}
이런 식으로 바꿔줬는데
잘 돌아갔다.
알고보니 트랜잭션은 동일성 보장을 하기위해,
해당 트랜잭션이 아닌 다른 곳에서 만들어진 객체를
해당 트랜잭션에서 만들어진 객체와 비교를 했을 때, 같은 객체인데도 아니라고 한다.
트랜잭션 환경 제거해도 잘 될듯
근데 트랜잭션 환경이 걸려있다면 동일성 보장을 위해 이렇게 하는 것!
'TIL' 카테고리의 다른 글
TIL 2023-11-28 OAuth 작동 방식 및 이전 배경, CSR SSR (0) | 2023.11.28 |
---|---|
TIL 2023-11-27 하나의 커스텀 예외 클래스로 모든 컨트롤러 예외 처리하기 feat(글로벌 예외 핸들러) (2) | 2023.11.27 |
TIL 2023-11-23 영화진흥위원회 오픈 API 사용 (파싱 후 DB 저장 방법) (0) | 2023.11.23 |
TIL 2023-11-22 gradle 외부 라이브러리 jar 적용 오류 (0) | 2023.11.22 |
TIL 2023-11-21 PUT과 PATCH의 차이 (0) | 2023.11.21 |