Open nmsgust opened 1 year ago
제 생각을 말해볼게요. 틀린 부분이 있다면 수정해주세요.
정적 팩터리 메서드는 본인(클래스)이 생성자를 사용하는 것이 아니라 직관적인 이름을 가진 메서드를 사용하여 본인을 인스턴스화하여 반환하는 것을 말합니다. OrderServiceImpl 클래스의 createOrder 메서드는 본인(OrderServiceImpl 객체)을 반환하는 것이 아니라 Order 객체를 반환하는 것이기 때문에 정적 팩터리 메서드라 보기는 힘들 것 같습니다.
OrderServiceImpl클래스의 createOrder메서드를 보면 Order클래스의 생성자를 사용하여 Order객체를 반환하고 있습니다. 즉 쉽게 말하자면, createOrder메서드를 사용하는 것 자체가 Order클래스의 생성자를 이용하는 것입니다.
// Order
public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
this.memberId = memberId;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.discountPrice = discountPrice;
}
// OrderServiceImpl
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
그럼 왜 Member객체는 생성자로 생성하는 것이고, 왜 Order객체는 createOrder메서드로 생성하는 것일까요? Order객체는 멤버 등급에 따른 할인된 가격을 산출하는 과정이 필요하기 때문입니다.
createOrder메서드의 파라미터로 memberId, itemName, itemPrice를 넣으면 그 결과로 findById메서드의 파라미터로 memberId를 넣음으로써 member객체를 반환합니다. discount메서드의 파라미터로 member객체와 itemPrice를 넣으면 그 결과로 discountPrice을 산출합니다. (멤버 등급에 따라 얼만큼 할인해 줄 것인지가 여기서 결정됩니다.) 최종적으로 Order클래스의 생성자의 파라미터로 memberId, itemName, itemPrice, discountPrice넣으면 그 필드를 지닌 Order객체를 생성합니다.
Member 인스턴스의 경우 Member 클래스의 생성자를 이용해서 생성하는데 Order 클래스의 경우 Order 클래스의 생성자를 이용하지 않고 OrderService의 createOrder로 생성하는 이유가 무엇일까요?