em.merge
id값이 존재하는 준영속 엔티티를 영속성 컨텍스트에 저장할 때 사용
해당 id 값으로 DB에서 찾아와 영속성 컨텍스트에 저장한 뒤, 해당 객체 값을 덮어씌움
cascade 팁
주로 다루는 엔티티가 있고, 다른 엔티티들은 주 엔티티에 의해 접근되는 경우 각각 저장하기 보다 주 엔티티쪽에서 한번에 다루는 게 편하므로 cascade를 설정해주면 편함
반대로, 각 엔티티마다 별도의 비즈니스 로직이 있고, 종속관계를 따지기 어렵다면 cascade를 설정 시 운영에 어려움이 발생할 수도 있음(다른 엔티티에 의해 생성, 변경, 삭제 될 수 있으므로)
생성자 팁
정적 팩터리 메서드를 활용하여 다른 개발자가 사용하기 쉬운 생성 방법을 활용하자.
인스턴스의 생성 방법을 여러가지로 열어두면, 같은 일을 다른 방법으로 하게 되어 이후 리팩토링과 실수의 가능성이 있으므로 하나로 통일하고 다른 방법을 막아주자.(protected 생성자 설정)
예시상황) order.cancel 을 하면 order의 필드값들이 변경되고, orderItems의 값들이 변경되고...
직접 쿼리를 날리는 경우 필드값의 변경을 모두 update 쿼리로 만들어주어야함
JPA를 사용할 경우 order.cancel 만 호출하면 변경된 데이터에 대한 update 쿼리가 자동 생성됨
비즈니스로직을 엔티티에 두고, 서비스 레이어에서는 엔티티에 로직을 위임하여 활용 (도메인 모델 패턴)
참고.
엔티티에는 비즈니스로직이 거의 없고, 서비스 계층에서 대부분을 담당하는 것을 트랜잭션 스크립트 패턴
이라고 한다.
동적 쿼리 tip
동적 쿼리를 작성하는 데에는 다양한 방법이 있지만 가장 쉽고 가독성이 좋은 QueryDsl 을 활용하자.