작성
·
111
0
@Entity
@Table(name = "order_item")
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item; //주문 상품
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "order_id")
private Order order; //주문
private int orderPrice; //주문 가격
private int count; //주문 수량
//==생성 메서드==//
public static OrderItem createOrderItem(Item item, int orderPrice, int count) {
OrderItem orderItem = new OrderItem();
orderItem.setItem(item);
orderItem.setOrderPrice(orderPrice);
orderItem.setCount(count);
item.removeStock(count);
return orderItem;
}
//==비즈니스 로직==// //****************이 부분입니다**************************//
/** 주문 취소 */
public void cancel() {
getItem().addStock(count);
}
//==조회 로직==//
/** 주문상품 전체 가격 조회 */
public int getTotalPrice() {
return getOrderPrice() * getCount();
}
}
비즈니스 로직의 주문 취소에서 getItem().addStock(count)이 아니고 item.addStock(count)아닌가요? 어떻게 getItem()으로 addStock메소드를 호출가능한가요?
감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
whdk333님, 질문 주신 부분에 대해 설명드리겠습니다.
OrderItem 클래스에서 getItem()
메서드는 private Item item
필드에 대한 접근자(accessor) 메서드입니다. @Getter
어노테이션을 통해 Lombok이 자동으로 생성해줍니다. 따라서 getItem()
메서드를 호출하면, 이 OrderItem 인스턴스에 연결된 Item 인스턴스를 반환받게 됩니다. 반환받은 Item 인스턴스에 대해 addStock(count)
메서드를 호출하는 것이므로, getItem().addStock(count)
는 item.addStock(count)
을 호출하는 것과 동일한 작업을 수행합니다.
item
필드에 직접 접근하는 대신 getItem()
메서드를 사용하는 이유는 여러 가지가 있을 수 있습니다. 객체지향 설계 원칙 중 하나는 클래스의 내부 구현을 캡슐화하여 외부에서는 접근자 메서드를 통해서만 접근할 수 있도록 하는 것입니다. 이는 나중에 클래스의 내부 구현이 변경되더라도 해당 객체를 사용하는 외부 코드에 영향을 덜 주도록 설계하는데 도움이 됩니다.
또한, 접근자 메서드를 사용하면 필드에 접근하기 전에 추가적인 로직을 수행할 수 있는 기회를 제공합니다. 예를 들어, getItem()
메서드 내에서 item
필드가 null
인지 검사하고, null
이면 예외를 발생시키는 등의 처리를 할 수 있습니다.
이와 같은 이유로 getItem().addStock(count)
는 객체 지향적인 설계 관점에서 완전히 타당하며, item.addStock(count)
와 기능적으로 동일합니다.
질문에 도움이 되었길 바랍니다. 추가적인 궁금증이 생기시면 언제든지 질문해주세요!