[Study] BE/Spring & SpringBoot

[JPA활용1 - 김영한] 세션 2 도메인 분석 설계 - 엔티티 클래스 개발1

stop-zero 2023. 10. 10. 00:56

엔티티 클래스 개발

  • 예제에서는 Getter, Setter 모두 사용하지만 실무에서 Setter는 꼭 필요할 경우에만 사용
    • Getter 호출 막해도 ㄴ상관, Setter 호출 시 데이터 변화로 인해 변경 추척에 어려움

엔티티의 식별자와 PK컬럼명 : 테이블은 관례상 컬럼이름은 [테이블명 + id]을 사용하고, 엔티티 타입은 id로 쉽게 구분할 수 있도록 작성한다.

 

연관관계 Mapping 분석 코드

회원과 주문

domain>Order

@ManyToOne
@JoinColumn(name = "member_id")
private Member member;

Order - Member : 다대일 관계 @ManyToOne 

Member - Order : 일대다 관계 @OneToMany

@JoinColumn(name=" ") : Foreign Key 설정

  • Order member_id 로 주문한 회원에 대한 아이디 Mapping
더보기

Order-Member 수정할 때 Order, Member 둘 다 바꿔버리면 JPA가 확인해야 하는 곳이 명확하지 않다. 데이터베이스에서 fk 는Order)Id 하나 밖에 없고 어느 곳의 값이 변경되었을 때, FK를 변경해야하는지 정해야 함.

객체는 변경 포인트가 두 군데, 테이블은 FK가 하나. 연관관계의 주인을 FK가 가까운 곳으로 지정, 현재 Order에 있는 member 더 가까우니 Order가 주인의 개념

 

@OneToMany(mappedBy="member")

주인이 아닌 Order 에는 mappedBy=" ", Order 필드에 있는 member에 매핑 => (읽기 전용, 값 추가 수정해도 FK 값은 변경X)

 

주문상품과 주문

domain > OrderItem

@ManyToOne
@JoinColumn(name="order_id")
private Order order;

- 하나의 Order는 여러 개의 OrderItem 가능

- OrderItem은 하나의 Order만 가능 

- 다대일 양방향 연관관계, OrderItem 주인으로 order_id mapping

- 반대편 Order에도 @OneToMany(mappedBy="order")

 

주문상품과 상품

@ManyToOne
@JoinColumn(name = "item_id")
private Item item;

  • 다대일 단방향 관계
  • Item에 @OneToMany(mappedBy="Item") 안한 이유 : 단방향 매핑만으로도 이미 JPA의 연관관계 매핑이 완료되고, 필요 시 양방향 매핑을 추가해도 문제되지 않는다. 

 

주문과 배송

@OneToOne
@JoinColumn(name = "delivery_id")
private Delivery delivery;

- @OnetoOne(mappedBy="delivery")

- 일대일 양방향 관계

 

이전 Date vs 현재 LocalDateTime

- Date : Annotation mapping

- LocalDateTime : Java8, Hibernate 자동 지원

 

enum

- OrderStatus // 주문 상태 [ORDER, CANCEL]

- DeliveryStatus // [READY, COMP]

@Enumerated(EnumType.STRING)
private DeliveryStatus status;

- @Enumerated(EnumType.ORDINAL) 이 아닌 @Enumerated(EnumType.STRING)으로 써야하는 이유 : 중간에 추가되어도 순서에 의해 밀리는 게 없다.

 

Item 상속관계 Mapping - extends Item

domain > item > Album / Book / Item / Movie

  • @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    • InheritanceType 옵션 : SingleTable(단일 테이블), TablePerClass(지정된 테이블만), Joined(정교화된 스타일)
  • @DiscriminatorColumn(name="dtype") > 부모 클래스에 선언, 하위클래스 구분 관례적으로 default = dtype
    • @DiscriminatorValue("B") > 하위 클래스에 선언, 엔티티 저장할 때 구분 컬럼에 저장할 값, 선언하지 않으면 기본값으로 클래스 이름이 들어감
  • https://ict-nroo.tistory.com/128