-
[스프링부트/웹 애플리케이션 개발]엔티티 클래스 개발 -2Spring&SpringBoot 2023. 1. 4. 14:46
배송 엔티티
package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.*; @Entity @Getter @Setter public class Delivery { @Id @GeneratedValue @Column(name="delivery_id") private Long id; @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY) private Order order; @Embedded private Address address; @Enumerated(EnumType.STRING) private DeliveryStatus status; //배송상태 //EnumType의 기본값이 ORDINAL, 컬럼이 숫자로 들어감 //EnumType.ORDINAL > 중간에 데이터가 추가되면 오류 발생함,사용 금지 }
배송상태 엔티티
package jpabook.jpashop.domain; public enum DeliveryStatus { READY, COMP }
카테고리 엔티티
package jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import jpabook.jpashop.domain.item.Item; import javax.persistence.*; import java.util.ArrayList; import java.util.List; @Entity @Getter @Setter public class Category { @Id @GeneratedValue @Column(name="category_id") private Long id; private String name; @ManyToMany @JoinTable(name="category_item", joinColumns = @JoinColumn(name="category_id"), inverseJoinColumns = @JoinColumn(name="item_id")) private List<Item> items = new ArrayList<>(); //다대다관계 > 중간 테이블(CATEGORY_ITEM) 필요 > @JoinTable(name="category_item")로 연결 //실무에서는 거의 사용하지 못함 > 필드 추가 불가능 @ManyToOne @JoinColumn(name="parent_id") private Category parent; @OneToMany(mappedBy = "parent") private List<Category> child = new ArrayList<>(); //parent, child > 스스로 양방향 연관관계 생성 }
- 테이블 생성 완료
아직 어노테이션들이 낯설지만 확실히 스프링+오라클로 개발했을 때 직접 DB 넣어준 것보다 훨씬 편하다
주소 값 타입
package jpabook.jpashop.domain; import lombok.Getter; import javax.persistence.Embeddable; @Embeddable @Getter public class Address { private String city; private String street; private String zipcode; //JPA 스펙상 추가한 코드 protected Address() { } //값 > immutable하게 생성, 따라서 setter 아예 제공하지 않게 설계 public Address(String city, String street, String zipcode) { this.city = city; this.street = street; this.zipcode = zipcode; } }
- 값 타입은 변경 불가능하게 설계해야 한다.
> @Setter 제거하고, 생성자에서 값을 모두 초기화해서 변경불가능한 클래스를 만들기
> JPA 스펙상 엔티티나 임베디드 타입은 자바의 기본 생성자를 public / protected로 설정해야 함
> 그중에도 protected로 설정하는 것이 안전함
> 이런 제약을 두는 이유는 JPA 구현 라이브러리가 객체를 생성할 때 리플랙션 같은 기술을 사용할 수 있도록 지원해야 하기 때문이다.
728x90'Spring&SpringBoot' 카테고리의 다른 글
[스프링부트/웹 애플리케이션 개발]애플리케이션 아키텍처 (3) 2023.01.04 [스프링부트/웹 애플리케이션 개발]엔티티 설계 주의 사항 (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]엔티티 클래스 개발 -1 (0) 2023.01.04 [스프링부트/웹 애플리케이션 개발]기본 설계 (0) 2023.01.03 [스프링부트/웹 애플리케이션 개발]H2 데이터베이스 설치, JPA와 DB 설정, 동작확인 (1) 2023.01.03