해결된 질문
작성
·
413
2
editRestaurant() 메서드에서요, RestaurantEntity restaurant = restaurantRepository.findById(restaurantId).orElseThrow(()->new RuntimeException("없는 레스토랑입니다")); restaurant.changeNameAndAddress(request.getName(), request.getAddress()); //restaurantRepository.save(restaurant);
여기서 save는 안해도 될 것같습니다.
영속성컨테이너에 이미 있는 엔티티라 수정을 하면 save를 안해도 반영이 되는것으로 알고 있습니다.
답변 1
3
안녕하세요 지식공유자 쥬쥬입니다!
말씀하신대로 JPA에서는 영속성컨텍스트에 있는 Entity의 더티체킹을 통해 update 쿼리를 날려주므로 save()
메소드를 호출하지 않아도 데이터베이스에 반영됩니다! 좋은 말씀이신 것 같습니다!
하지만 이것은 JPA Native한 기능(spring-data-jpa가 가지고 있는 특징이란 뜻입니다!)으로, @Repository
의 save()
메소드를 명시적으로 호출해주는 것이 특정 상황에서는 좋을 수 있습니다.
예를 들어, 다음과 같은 요구사항이 생겼다고 가정해볼게요!
JPA로 선언한 Entity를 다른 spring-data 라이브러리로 교체할 경우 (mongo db나 r2dbc와 같은)
이 때 JPA를 사용할 때에는 동작했던 코드들이 단순히 spring data 구현체를 교체함으로써 동작이 안하는 상황이 발생할 수 있습니다!
사실 위같은 상황은 많이 발생하지는 않습니다. 저 같은 경우에는 메모리에 있는 객체의 상태가 변경되었다면 저장소(Repository)에 다시 저장(save)해주는 코드가 명시적으로 있는 것이 조금 더 "자연"스럽다고 느껴지는데요. 이것은 제 느낌일 뿐 개개인이 모두 다르게 느낄 수 있다고 생각합니다.
인프넌님이 위같은 견해들을 함께 생각해보시고, 더 낫다고 판단되는 방향으로 개발하시는 것이 가장 좋다고 생각합니다!
Appendix.
JPA의 더티체킹 기능은 마틴파울러의 저서 엔터프라이즈 애플리케이션 아키텍처 패턴 (P of EAA)의 작업 단위(Unit of Work) 패턴을 읽어보시면 이해하기가 더욱 좋으실거에요!
실무에서는 또 그런 경우가 생길 수 있군요 오늘도 배워갑니다. 상세한 답변 정말 감사합니다 !