[Spring JPA]_엔티티 클래스 개발1

youuu·2022년 11월 9일
0

Study

목록 보기
5/11

🤔 :

  • 이전엔 별 생각없이 걸었던 연관관계들이 예제를 통해 쌍을 이루는것을 알게되었다.
    그리고 해당 위치에서 넣어야 하는 것들을 알게 되었다.
  • OneToMany - ManyToOne mappedBy 등등
  • Enum 사용시 주의할점
  • OneToOne일 경우 FK 지정, 연관관계의 주인정하기 등을 알 수 있었다.
    • 주인 지정시 데이터 관점으로 지정
  • 🤔 🧰 프로젝트 작업 시 FK 연관관계를 제대로 지정해야겠다.

예제에선 설명을 쉽게하고 단순하게 설계하기 위해 엔티티 클래스에 Getter, Setter를 모두 연다.
🔺 실무에서는 가급적 Getter는 열어두고, Setter는 꼭 필요한 경우에만 사용

  • 이론적으론 Getter, Setter 모두 제공하지 않고 꼭 필요한 별도의 메서드를 제공하는게 이상적이다.

  • 하지만, 실무에서 조회할 일이 많으므로 Getter는 모두 열어두는것이 편리.
    (Getter는 아무리 호출해도 호출하는 것만으론 어떤 일이 발생하지 않음)

  • 🔺 Setter는 막 열면 문제가 된다.

    • 막 열어두면 엔티티가 왜 변경되는지 추적하기 점점 힘들어진다.
    • ➡️ 엔티티를 변경할 때는 Setter 대신 변경 지점이 명확하도록 변경을 위한 비즈니스 메서드를 별도로 제공해야한다.


  1. domain 패키지를 만든 후 Member.java 생성

📋 Member.java

  • @Embedded이나 @Embeddable 둘중 하나만 적어줘도 되지만 둘다 기술한다.
    • 딱 보고 내장타입이다 아니다를 구별 할 수 있어서 둘다 넣는게 좋다.
  • private~~을 작성 후 없으면 create해서 틀 생성.
  • ⭐️⭐️@OneToMany(mappedBy = "member") : FK가 양방향일때 연관관계의 주인을 표시하기 위해 적음.
    • mappedBy가 있는 곳은 주인이 아니다.
      거울이다.(읽기전용) 연관관계의 주인이 아니란 뜻이다.
    • 이때 연관관계의 매핑 되는 것을 적어준다. member는 order에 있는 컬럼이다.
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;

    private List<Order> orders = new ArrayList<>();
}

📋 Address.java

  • @Embeddable 어노테이션을 넣어준다.
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;
}

🚩 전략 지정


  • 상속관계에 전략을 지정한다. 이때 부모클래스에서 지정한다.
    • 싱글톤전략을 사용할 예정.

item.java에 @Inheritance를 적어준다.

@Inheritance(strategy = InheritanceType.사용할전략)

전략에는 세가지가 있다.

  • SINGLE_TABLE : 한테이블에 다 넣는것
  • TABLE_PER_CLASS : book, movie, album 처럼 테이블을 나눠서 만드는것
  • JOINED : 가장 정규화된 스타일

구분 지정

@DiscriminatorColumn(name = "dtype")@DiscriminatorValue("B")를 사용.

enum을 사용할때엔

  • @Enumerated(EnumType.ORDINAL) 을 기술해줘야한다.
    *이때 ORDINAL, STRING 이 있다.
    • ORDINAL : 디폴트 - 컬럼이 1,2,3,4 숫자로 들어감. >> 중간에 다른 상태가 생기면 큰일 >> 절때 쓰지 말아라
    • STRING : STRING을 사용하면 중간에 밀려도 괜찮다. 이상없다.
      ⭐️⭐️⭐️ 꼭 STRING으로 사용.

order 와 delivery 엮기


  • 이 둘은 OneToOne 이다.
    • OneToOne은 FK를 어디에든 둘 수 있다.
      • 예제에선) 사용을 많이 하는 곳에서 쓴다. > Order에 두었다.
  • 연관관계의 주인 정하기.
    • FK와 가까이 있는 곳으로 지정 >> Order가 주인이 되었다.

➡️ 관련내용은 기본편 강의 참고.

profile
공부중인 주니어 개발자

0개의 댓글