생성 메서드 : 주문 생성에는 orderItem, delivery 등 setter로 모두 생성해야 하므로 복잡하다. 이런 경우에는 생성 메서드를 만들어 놓으면 좋다.
정적 팩토리 메서드(static factory method)
객체 생성의 역할을 하는 클래스 메서드이다.
생성자를 통해 직접적으로 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것을 의미한다.
장점
- 생성자는 내부 구조를 알고 있어야 목적에 맞게 객체를 생성할 수 있지만, 정적 팩토리 메서드는 메서드 이름에 객체의 생성 목적을 담아낼 수 있다.
- 호출할 때마다 새로운 객체를 생성할 필요가 없다.
- 하위 타입의 객체를 반환할 수 있다. (상속 관계)
- 객체 생성을 캡슐화하여 내부 상태를 외부에 드러낼 필요 없이 객체 생성 인터페이스를 단순화 시킬 수 있다.생성 메서드와 기본 생성자를 같이 사용하면 유지보수에 어려움이 있을 수 있으므로, 기본 생성자는 protected로 막아놓는다. 롬복의 NoArgsConstructor 사용
가변인자(variable argument)
- 어떤 메서드에서 매개변수를 동적으로 받을 수 있는 방법
- '타입... 변수명' 으로 사용한다.
- 가변인자는 내부적으로 배열을 생성해서 사용하기 때문에, 무지성으로 사용하면 안 된다.
- 가변인자는 가장 마지막에 선언해야 한다.
- 가변인자를 사용한 메서드는 오버로딩을 하지 않는 것이 좋다.
- ex) printf
주문 취소 : 이미 배송된 상품은 취소 불가능
getter vs 필드 직접 접근
아무거나 사용해도 상관 없다. 다만, 드물게 조회한 엔티티가 프록시 객체인 경우 필드에 직접 접근하면 원본 객체가 아닌 프록시 객체의 필드에 접근하여 equals, hashcode 구현에 문제가 될 수 있다.
따라서 엔티티에 equals, hashcode를 구현할 때는 getter를 사용하고, 그게 아니라면 둘 다 상관없다.
주문 검색 : 회원이름, 주문상태
동적쿼리 작성
- if문과 문자열 연산을 이용한 하드한 동적쿼리 작성 -> 에러 많고 불편함
- JPA Criteria -> 코드 해석, 유지보수가 어렵다
- Querydsl -> 자주 사용
cascade의 범위?
명확하게 구분하기는 어렵지만, Order가 Delivery와 OrderItem을 관리한다면 cascade를 사용한다. 만약 Delivery나 OrderItem이 다른 곳에서도 많이 사용된다면 마구 사용하면 안 된다.
서비스 계층은 단순히 엔티티에 필요한 요청을 위임하는 역할만 하고, 엔티티가 비즈니스 로직을 가지고 객체 지향의 특성을 적극 활용하는 패턴
엔티티에는 비즈니스 로직이 거의 없고 서비스 계층에서 대부분의 비즈니스 로직을 처리하는 패턴