-
[스프링부트/웹 애플리케이션 개발]엔티티 클래스 개발 -1Spring&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'Spring&SpringBoot' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]엔티티 설계 주의 사항 (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]엔티티 클래스 개발 -2 (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]기본 설계 (0) 2023.01.03 [스프링부트/웹 애플리케이션 개발]H2 데이터베이스 설치, JPA와 DB 설정, 동작확인 (1) 2023.01.03 [스프링부트/웹 애플리케이션 개발]devtools setting, spring-boot-devtools 실행 안 될 때 (0) 2023.01.02