관심쟁이 영호
[#7.2] Spring Boot ㅣ 스프링 부트 ㅣ Entity Class 개발2 본문
이번 게시글은 이전 수업의 연장으로 다른 엔티티를 살펴볼 예정이다.
※ 현재까지 느낀 바로는, 문서를 읽을 줄 아는 능력이 필수인 듯 한다.
그 의미는 UML을 읽을 줄 알아야한다.
1. 클래스를 완성시켜준다.
- OrderItem, Item, Delivery, Address를 작성해준다.
// OrderItem
@Entity
@Getter@Setter
public class OrderItem {
@Id
@GeneratedValue
@Column(name = "order_item_id")
private Long id;
private Item item;
@ManyToOne
@JoinColumn(name = "order_id")
private Order order;
private int orderPrice;
private int count;
}
- Order와 OrderItem은 양방향 일대다 연관관계이다.
- 매핑은 그럼 어떻게 해야하는가? -> 테이블을 살펴보면 일대다에서 "다"부분에 FK가 들어와야한다.
- 그래서 다 위치에 있는 OrderItem에서 "@JoinColumn(name = "order_id")"로 매핑을 해뒀다.
// Address
@Embeddable
@Getter @Setter
public class Address {
private String city;
private String street;
private String zipcode;
}
- 여기서 zipcode의 개념에 대해서는 다른 강의에 있다고 하셨다. 그래서 특별한 의미로 쓰인다는 느낌은 받았다. 추후에 파악해보자.
// Item
@Entity
@Getter
@Setter
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // 한 테이블에 때려박기
@DiscriminatorColumn(name = "dtype")
public abstract class Item { //다른 제품들이 이 클래스를 상속받을 거기 때문에 추상화(abstract) 클래스로 만든다.
@Id
@GeneratedValue
@Column(name = "item_id")
private Long id;
private String name;
private int price;
private int stockQuantity;
}
- 그 다음 이 클래스를 상속받을 Album, Book, Movie 클래스를 만들어 주자.
- 우리는 Item을 한 테이블에 다 때려박고 관리할 것이기 때문에, 어노테이션으로
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 를 입력해준다.
InheritanceType에는 많은 타입이 있다. 각각의 테이블이나, 한 테이블이나 .. 그냥 데이터 운용방식을 참고하여 맞는 타입을 지정해주면 좋을 듯 하다.
- 그리고 상속받는 것이기 떄문에 들어오는 데이터에 따라 어떤 행위, 그러니까 영화, 책, 앨범 따라 어떻게 행동할 지 스프링에게 알려주어야한다. 그것을 위해서
@DiscriminatorColumn(name = "dtype")를 지정해준다.
그리고 Book, Album, Movie 각각 클래스에 @DiscriminatorValue("~~ 각각다른 값넣기!")
지정을 해준다.
-> 이렇게하면 각각에 따라 Value를 다르게 지정해주는 것 같다. 어쨋든 구분하기 위함인듯한 느낌
// Delivery
@Entity
@Getter
@Setter
public class Delivery {
@Id @GeneratedValue
@Column(name = "delivery_id")
private Long id;
@OneToOne(mappedBy = "delivery")
private Order order;
@Embedded
private Address address;
@Enumerated(EnumType.STRING)
private DeliveryState status; // READY, COMP
}
- Delivery는 Order와 일대일 관계이다. 그래서 @OneToOne 관계로 설정한다.
- 여기서 FK를 order나 delivery 중 아무 곳에 넣어도 상관없다.
- 장단점이 있는데 개발자님은 Order에 나두는 것을 더 선호하신다고 한다.
★ 다시한번 체크하자면,
연관관계의 주인에는 @JoinColume(name = "@") 지정
주인이 아닌 쪽에는 @OneToOne(mappedBy = "@") 지정
※ enum을 설정할 때, 지정해둔 enum값 사이에 어떠한 값이 추가적으로 들어오게 되면, 뒤에 값들이 차례대로 밀려나기 때문에 @Enumerated(EnumType.STRING)으로 지정해주어야 한다.
해당 강의는 인프런의 "김영한" 개발자님의 강의 정리했습니다.