JPA로 프로젝트를 해본적이 없어서 다음 수업을 들으면서 배운 내용을 정리하고 싶어요
더 배우거나 배우면서 더 많은 정보를 추가하는 대로 계속 업데이트하겠습니다.
관행!
Spring Boot 및 JPA1 사용 – 웹 애플리케이션 개발 – 인프라 | 프레젠테이션
실용적인 예로 Spring Boot 및 JPA를 사용하여 웹 애플리케이션을 설계하고 개발합니다.
이 과정을 통해 Spring Boot와 JPA를 실제로 사용하는 방법을 배울 수 있습니다.
www.inflearn.com
도메인 모델 및 테이블 설계


아래 디자인에서 볼 수 있습니다.
1) 회원은 여러 상품을 주문할 수 있습니다.
2) 하나의 주문으로 여러 상품을 선택할 수 있습니다.
3) 제품은 공통 속성을 사용하기 때문에 상속 구조를 갖는다.
엔티티 개발
– 실제로 세터 주석은 피해야 합니다!
@Entity
@Getter@Setter
public Class Member{
@Id @GeneratedValue
@Column(name="member_id")
private Long id;
private String name;
@Embedded
private Address address;
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
@Entity
@Table(name = "orders")
@Getter @Setter
public class Order{
@Id @GeneratedValue
@Column(name = "order_id")
private Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "member_id")
private Member member; // 연관관계의 주인
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
@OneToOne(fetch = LAZY)
@JoinColumn(name = "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate;
@Enumerated(EnumType.STRING)
private OrderStatus orderStatus;
}
@Embeddable
@Getter
public class Address{
private String city;
private String street;
private String zipcode;
}
@Entity
@Getter @Setter
public class Delivery{
@Id @GeneratedValue
@Column(name = "delivery_id")
private Long id;
@OneToOne(fetch = LAZY, mappedBy = "delivery")
private Order order;
@Embedded
private Address address;
@Enumerated(EnumType.STRING)
private DeliveryStatus status;
}
@Entity
@Getter @Setter
public class OrderItem{
@Id @GeneratedValue
@Column(name = "order_item_id")
private Long id;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "item_id")
private Item item;
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "order_id")
private Order order;
private int orderPrice;
private int count;
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DisCriminatorColumn(name = "dtype")
@Getter @Setter
public abstract class Item{
@Id @GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private String stockQuantity;
@ManyToMany
private List<Category> categories = new ArrayList<>();
}
@Entity
@DiscriminatorValue("A")
@Getter @Setter
public class Album extends Item{
private String artist;
private String etc;
}
@Entity
@DiscriminatorValue("B")
@Getter @Setter
public class Book extends Item{
private String author;
private String isbn;
}
@Entity
@DiscriminatorValue("M")
@Getter @Setter
public class Movie{
private String director;
private String actor;
}
@Entity
@Getter @Setter
public class Category{
@Id @GeneratedValue
@Column(name = "category_id")
private Long id;
private String name;
@ManyToMany(fetch = LAZY)
@JoinTable(name = "category_item",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "item_id")
private List<Item> items = new ArrayList<>();
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "parent_id")
private Category parent;
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
}