ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링부트/웹 애플리케이션 개발]엔티티 클래스 개발 -1
    Spring&SpringBoot 2023. 1. 4. 14:43

    - 예제 > 쉽게 설명하기 위해 Getter, Setter 모두 열고 단순하게 설계

    - 실무 > Getter는 열어두고 Setter는 꼭 필요한 경우에만 사용하는 것을 추천

        >> 이론적으로 Getter, Setter 모두 제공하지 않고, 꼭 필요한 별도의 메서드를 제공하는 게 가장 이상적이다. 하지만 실무에서 엔티티의 데이터는 조회할 일이 너무 많으므로, Getter의 경우 모두 열어두는 것이 편리하다. Getter는 아무리 호출해도 호출하는 것 만으로 어떤 일이 발생하지는 않는다. 하지만 Setter는 문제가 다르다. Setter를 호출하면 데이터가 변한다. Setter를 막 열어두면 가까운 미래에 엔티티가 도대체 왜 변경되는지 추적하기 점점 힘들어진다. 그래서 엔티티를 변경할 때는 Setter 대신에 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공해야 한다.

     

     

    회원 엔티티

    package jpabook.jpashop.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    @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<>();
    
    }

    - 엔티티 식별자는 id

    - PK 컬럼명은 memer_id

    - 테이블은 관례상 테이블명+id 많이 사용

    - 객체(Member)의 경우 Member의 타입이 있기 때문에 어디 소속인지 명확, 식별자 id로 사용해도 됨

    - 테이블은 id로 식별자를 하면 찾기 어렵고 join할 때도 어려움

     

     

    주문엔티티

    package jpabook.jpashop.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    import javax.persistence.*;
    import java.time.LocalDateTime;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    @Table(name = "orders")
    @Getter @Setter
    public class Order {
    
        @Id @GeneratedValue
        @Column(name ="order_id")
        private Long id;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="member_id")
        private Member member; //주문회원
    
        @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
        private List<OrderItem> orderItems = new ArrayList<>();
    
        @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
        @JoinColumn(name="delivery_id")
        private Delivery delivery;
        //일대일 관계의 경우 FK 위치가 애매해짐 (어디에 둬도 상관없음)
        //order를 보면서 delivery를 찾는다 > 연관관계의 주인은 Order
        //FK는 order에 둔다
        
        private LocalDateTime orderDate; //주문시간, hibernate 덕분에 다른 어노테이션 필요 없음
    
        @Enumerated(EnumType.STRING)
        private OderStatus status; //주문상태, [ORDER, CANCEL]
    
    }

     

     

    주문상태

    package jpabook.jpashop.domain;
    
    public enum OderStatus {
        ORDER, CANCEL
    }

     

     

    주문상품 엔티티

    package jpabook.jpashop.domain;
    
    import lombok.Getter;
    import lombok.Setter;
    import jpabook.jpashop.domain.item.Item;
    import javax.persistence.*;
    
    @Entity
    @Table(name = "order_item")
    @Getter @Setter
    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;  //주문수량
    
    }

     

     

    상품 엔티티

    package jpabook.jpashop.domain.item;
    
    import lombok.Getter;
    import lombok.Setter;
    import jpabook.jpashop.domain.Category;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="dtype")
    @Getter @Setter
    public abstract class Item {
    
        //상속관계 맵핑 > 상속관계 전략 지정 > 싱글 테이블 전략
        //상송관계 전략은 부모 클래스에 잡아준다
        //@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
        //@DiscriminatorColumn(name="dtype"), @DiscriminatorValue("M") 추가
        
        @Id @GeneratedValue
        @Column(name="item_id")
        private Long id;
        
        //공통속성
        private String name;
        private int price;
        private int stockQuantity;
    
        @ManyToMany(mappedBy = "items")
        private List<Category> categories = new ArrayList<>();
        
    }

     

     

    상품 - 도서 엔티티

    package jpabook.jpashop.domain.item;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    
    @Entity
    @DiscriminatorValue("B")
    @Getter @Setter
    public class Book extends Item{
    
        private String author;
        private String isbn;
    
    }

     

     

    상품 - 음반 엔티티

    package jpabook.jpashop.domain.item;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    
    @Entity
    @DiscriminatorValue("A")
    @Getter @Setter
    public class Album extends Item{
    
        private String artist;
        private String etc;
    
    }

     

     

    상품 - 영화 엔티티

    package jpabook.jpashop.domain.item;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import javax.persistence.DiscriminatorValue;
    import javax.persistence.Entity;
    
    @Entity
    @DiscriminatorValue("M")
    @Getter @Setter
    public class Movie extends Item{
    
        private String director;
        private String actor;
    
    }
    728x90
Designed by Tistory.