TransactionRequiredException, java.lang.ClassCastException, H2 console에서 Column not Found 해결
-
반응형
📂 Error List
1. TransactionRequiredException 해결
발생한 오류
TransactionRequiredException
오류가 발생한 코드
public void deleteWish(User user, Long roomId) {
Room room = roomRepository.findById(roomId).orElseThrow(
() -> new IllegalArgumentException("해당 숙소 정보를 찾을 수 없습니다.")
);
Wish wish = wishRepository.findByUserAndRoom(user, room)
.orElseThrow(() -> new IllegalArgumentException("찾을 수 없는 wish 항목입니다."));
wishRepository.deleteById(wish.getId());
}
오류 발생 이유
Service단에 deleteById()를 사용할 때 @Transactional을 걸어주지 않았다.
해결책
해당 메서드 위에 @Transactional 추가해준다.
오류 해결 후 코드
@Transactional
public void deleteWish(User user, Long roomId) {
Room room = roomRepository.findById(roomId).orElseThrow(
() -> new IllegalArgumentException("해당 숙소 정보를 찾을 수 없습니다.")
);
Wish wish = wishRepository.findByUserAndRoom(user, room)
.orElseThrow(() -> new IllegalArgumentException("찾을 수 없는 wish 항목입니다."));
wishRepository.deleteById(wish.getId());
}
오류를 해결하면서 참고한 자료
TransactionRequiredException: Executing an update/delete query 오류의 해결 방법은 @Transaction
@TransactionalpublicvoiddeleteWish(User user,Long roomId){...생략 Long wishId = wishRepository.findByUserAndRoom(user, room).orElseThrow(()->newIllegalArgumentException("찾을 수 없는 wish 항목입니다.")); wishRepository.deleteById(wish.getId());}
WishController.java
오류 발생 이유
findByUserAndRoom을 하면 사실상 Wish 객체가 반환되는데 wish의 id값이 반환된다고 생각하고Optional<Long>을 사용했다. 그래서 Service단에서 에러를 던져주다가 반환타입이 맞지 않아서 ClassCastException 오류가 발생했다.
해결책
Optional<Long>에서Optional<Wish>로 코드 변경 후 서비스단에서는wish.getId()로 wish의 id값을 반환받아서 사용했다.