관심쟁이 영호

[#7.2] Spring Boot ㅣ 스프링 부트 ㅣ Entity Class 개발2 본문

카테고리 없음

[#7.2] Spring Boot ㅣ 스프링 부트 ㅣ Entity Class 개발2

관심쟁이 영호 2021. 4. 7. 01:40
반응형

이번 게시글은 이전 수업의 연장으로 다른 엔티티를 살펴볼 예정이다.

 

※ 현재까지 느낀 바로는, 문서를 읽을 줄 아는 능력이 필수인 듯 한다.

그 의미는 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)으로 지정해주어야 한다.

 

해당 강의는 인프런의 "김영한" 개발자님의 강의 정리했습니다.

www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-JPA-%ED%99%9C%EC%9A%A9-1/dashboard

300x250
Comments