diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/BaseEntity.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/BaseEntity.java new file mode 100644 index 000000000..0b609f37d --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/BaseEntity.java @@ -0,0 +1,12 @@ +package org.prgms.springbootjpa.mission3.domain; + +import javax.persistence.MappedSuperclass; +import java.time.LocalDateTime; + +@MappedSuperclass +public class BaseEntity { + + private LocalDateTime createdAt = LocalDateTime.now(); + + private LocalDateTime updatedAt = LocalDateTime.now(); +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/Member.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/Member.java new file mode 100644 index 000000000..790b3d399 --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/Member.java @@ -0,0 +1,47 @@ +package org.prgms.springbootjpa.mission3.domain; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.prgms.springbootjpa.mission3.domain.BaseEntity; +import org.prgms.springbootjpa.mission3.domain.order.Order; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Member extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(length = 12, nullable = false) + private String name; + + @Column(length = 12, nullable = false, unique = true) + private String nickname; + + private int age; + + @Column(length = 50, nullable = false) + private String address; + + @OneToMany(mappedBy = "member", orphanRemoval = true) + private List orders = new ArrayList<>(); + + public Member(String name, String nickname, int age, String address) { + this.name = name; + this.nickname = nickname; + this.age = age; + this.address = address; + } + + public void addOrder(Order order) { + order.setMember(this); + orders.add(order); + } +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/MemberRepository.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/MemberRepository.java new file mode 100644 index 000000000..8dbb6a409 --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/MemberRepository.java @@ -0,0 +1,6 @@ +package org.prgms.springbootjpa.mission3.domain; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberRepository extends JpaRepository { +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/Item.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/Item.java new file mode 100644 index 000000000..4f4520496 --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/Item.java @@ -0,0 +1,36 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Item { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private int price; + + private int stockQuantity; + + @OneToMany(mappedBy = "item", orphanRemoval = true) + private List orderItems = new ArrayList<>(); + + public Item(int price, int stockQuantity) { + this.price = price; + this.stockQuantity = stockQuantity; + } + + public void addOrderItem(OrderItem orderItem) { + orderItem.setItem(this); + orderItems.add(orderItem); + } +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/ItemRepository.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/ItemRepository.java new file mode 100644 index 000000000..fb8e09c1f --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/ItemRepository.java @@ -0,0 +1,6 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ItemRepository extends JpaRepository { +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/Order.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/Order.java new file mode 100644 index 000000000..df334d5fd --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/Order.java @@ -0,0 +1,47 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.prgms.springbootjpa.mission3.domain.BaseEntity; +import org.prgms.springbootjpa.mission3.domain.Member; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +@Getter +@Table(name = "orders") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Order extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private OrderStatus orderStatus; + + private String memo; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id") + private Member member; + + @OneToMany(mappedBy = "order", cascade = CascadeType.PERSIST, orphanRemoval = true) + private List orderItems = new ArrayList<>(); + + public Order(OrderStatus orderStatus, String memo) { + this.orderStatus = orderStatus; + this.memo = memo; + } + + public void addOrderItem(OrderItem orderItem) { + orderItem.setOrder(this); + orderItems.add(orderItem); + } + + public void setMember(Member member) { + this.member = member; + } +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderItem.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderItem.java new file mode 100644 index 000000000..08f06bdcf --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderItem.java @@ -0,0 +1,42 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class OrderItem { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private int price; + + private int quantity; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "order_id") + private Order order; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "item_id") + private Item item; + + public OrderItem(int price, int quantity) { + this.price = price; + this.quantity = quantity; + } + + public void setOrder(Order order) { + this.order = order; + } + + public void setItem(Item item) { + this.item = item; + } +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderItemRepository.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderItemRepository.java new file mode 100644 index 000000000..da02bc569 --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderItemRepository.java @@ -0,0 +1,6 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderItemRepository extends JpaRepository { +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderRepository.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderRepository.java new file mode 100644 index 000000000..f205e6ff9 --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderRepository.java @@ -0,0 +1,6 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface OrderRepository extends JpaRepository { +} diff --git a/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderStatus.java b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderStatus.java new file mode 100644 index 000000000..593753d6b --- /dev/null +++ b/src/main/java/org/prgms/springbootjpa/mission3/domain/order/OrderStatus.java @@ -0,0 +1,5 @@ +package org.prgms.springbootjpa.mission3.domain.order; + +public enum OrderStatus { + CREATED, PROCESSING, SHIPPED, DELIVERED +} diff --git a/src/test/java/org/prgms/springbootjpa/mission3/domain/OrderDomainTest.java b/src/test/java/org/prgms/springbootjpa/mission3/domain/OrderDomainTest.java new file mode 100644 index 000000000..1b42a32f5 --- /dev/null +++ b/src/test/java/org/prgms/springbootjpa/mission3/domain/OrderDomainTest.java @@ -0,0 +1,142 @@ +package org.prgms.springbootjpa.mission3.domain; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.prgms.springbootjpa.mission3.domain.order.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.prgms.springbootjpa.mission3.domain.order.OrderStatus.CREATED; + +@SpringBootTest +class OrderDomainTest { + + @Autowired + OrderRepository orderRepository; + + @Autowired + OrderItemRepository orderItemRepository; + + @Autowired + MemberRepository memberRepository; + + @Autowired + ItemRepository itemRepository; + + Member member = new Member("현지", "딩딩", 25, "서울시 마포구"); + Order order = new Order(CREATED, "집 앞 배송"); + Item item = new Item(1000, 100); + OrderItem orderItem = new OrderItem(10000, 2); + + @BeforeEach + void setUp() { + itemRepository.deleteAll(); + orderRepository.deleteAll(); + orderItemRepository.deleteAll(); + memberRepository.deleteAll(); + } + + @Test + void 멤버_생성() { + Member saveMember = memberRepository.save(member); + + List members = memberRepository.findAll(); + + assertThat(members.size(), is(1)); + assertThat(saveMember.getId(), notNullValue()); + } + + @Test + void 아이템_생성() { + Item saveItem = itemRepository.save(item); + + List items = itemRepository.findAll(); + + assertThat(items.size(), is(1)); + assertThat(saveItem.getId(), notNullValue()); + } + + @Test + void 아이템_주문아이템_생성() { + itemRepository.save(item); + + item.addOrderItem(orderItem); + + orderItemRepository.save(orderItem); + + List orderItems = item.getOrderItems(); + + assertThat(item.getId(), notNullValue()); + assertThat(orderItems.size(), is(1)); + assertThat(orderItems.get(0), samePropertyValuesAs(orderItem)); + + assertThat(orderItem.getId(), notNullValue()); + assertThat(orderItem.getItem(), samePropertyValuesAs(item)); + } + + @Test + void 주문_주문아이템_생성() { + order.addOrderItem(orderItem); + orderRepository.save(order); + + List orderItems = order.getOrderItems(); + + assertThat(order.getId(), notNullValue()); + assertThat(orderItems.size(), is(1)); + assertThat(orderItems.get(0), samePropertyValuesAs(orderItem)); + + assertThat(orderItem.getId(), notNullValue()); + assertThat(orderItem.getOrder(), samePropertyValuesAs(order)); + } + + @Test + void 멤버_주문_생성() { + memberRepository.save(member); + + member.addOrder(order); + + orderRepository.save(order); + + List orders = member.getOrders(); + + assertThat(member.getId(), notNullValue()); + assertThat(orders.size(), is(1)); + assertThat(orders.get(0), samePropertyValuesAs(order)); + + assertThat(order.getId(), notNullValue()); + assertThat(order.getMember(), samePropertyValuesAs(member)); + } + + @Test + void 주문_도메인_테스트() { + memberRepository.save(member); + itemRepository.save(item); + + item.addOrderItem(orderItem); + order.addOrderItem(orderItem); + member.addOrder(order); + + orderRepository.save(order); + + assertThat(member.getId(), notNullValue()); + assertThat(member.getOrders().size(), is(1)); + assertThat(member.getOrders().get(0), samePropertyValuesAs(order)); + + assertThat(order.getId(), notNullValue()); + assertThat(order.getMember(), samePropertyValuesAs(member)); + assertThat(order.getOrderItems().size(), is(1)); + assertThat(order.getOrderItems().get(0), samePropertyValuesAs(orderItem)); + + assertThat(item.getId(), notNullValue()); + assertThat(item.getOrderItems().size(), is(1)); + assertThat(item.getOrderItems().get(0), samePropertyValuesAs(orderItem)); + + assertThat(orderItem.getId(), notNullValue()); + assertThat(orderItem.getItem(), samePropertyValuesAs(item)); + assertThat(orderItem.getOrder(), samePropertyValuesAs(order)); + } +}