[JPA 기본] 엔티티 매핑

강신현·2022년 7월 12일
0

✅ @ Entity ✅ @ Table ✅ @Column ✅ @Enumerated ✅ @Temporal ✅ @Lob ✅ @Transient

1. 객체와 테이블 매핑

@ Entity

@Entity가 붙은 클래스는 JPA가 관리하는 엔티티가 되며, JPA를 사용해서 테이브과 매핑할 클래스라면 @Entity를 꼭 붙여줘야 한다.

  • 기본 생성자를 필수로 만들어야 함
  • 사용 불가 클래스 : final, enum, interface, inner

@ Table

엔티티와 매핑할 테이블을 지정한다.

속성

  • name : 매핑할 테이블 이름
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints (DDL) : DDL 생성 시에 유니크 제약 조건 생성

2. 데이터베이스 스키마 자동 생성

DDL을 애플리케이션 실행 시점에 자동 생성
(운영에서는 사용하면 안되고, 개발 과정에서만 사용 해야함)

persistence.xml

<property name="hibernate.hbm2ddl.auto" value="create" />

속성

  • create : 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
  • create-drop : create와 같으나 종료시점에 테이블 DROP
  • update : 변경분만 반영(운영DB에는 사용하면 안됨)
  • validate : 엔티티와 테이블이 정상 매핑되었는지만 확인
  • none : 사용하지 않음 (주석처리하는 것과 동일)

단계

  • 개발 초기 단계 : create / update
  • 테스트 서버 : update / validate
  • 스테이징과 운영 서버 : validate / none

🔥 운영 장비에는 절대 create, create-drop, update 사용하면 안됨

3. 필드와 컬럼 매핑

@Entity
public class Member {

    @Id
    private Long id;

    @Column(name = "name")
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob
    private String description;
    
    @Transient
    private int temp;

    public Member(){

    }
}

@Column

컬럼 매핑

  • (name = "name") : db에는 "name" 이름의 컬럼으로 들어감

@Enumerated

enum 타입 매핑

  • db에는 기본적으로 enum 타입이 없기 때문에 enum 타입을 넣기 위해서는 명시를 해줘야 한다.
  • (EnumType.STRING) : enum 이름을 저장
  • (EnumType.ORDINAL) : enum 순서를 저장
    • 실무에서 사용하지 않는 속성이다. 왜냐하면 enum이 추가되면 순서가 꼬여 db에 예상하지 못한 순서대로 들어갈 수 있음

@Temporal

날짜 타입 매핑

  • (TemporalType.TIMESTAMP) or DATE or TIME
  • LocalDate, LocalDateTime을 사용할 때는 생략 가능

@Lob

큰값을 넣고 싶을 때

  • CLOB(매핑하는 필드 타입이 문자), BLOB(나머지) 타입과 매핑
  • 지정할 수 있는 속성이 없다.

@Transient

특정 필드를 컬럼에 매핑하지 않음 (매핑 무시)

  • 메모리에서만 사용할 필드만 생성할 때 사용 (캐시 계산 등)

4. 기본 키 매핑

  • 직접 할당
@Id
  • 자동 생성
@Id
@GeneratedValue

권장 식별자 전략

기본 키는 null이 아니고, 변하면 안되는 값이다.
대리키(대체키), long형 사용

  1. 나중까지 위 조건을 만족하는 자연키는 흔치 않으므로 대리키(대체키)를 사용하는 것을 권장
  2. int는 0이 없으므로 integer를 더 권장하고, integer는 long에 비해 범위가 작으므로 long형을 더 권장한다.
    • long 형이 integer에 비해 용량도 더 크긴 하지만 전체로 따져보면 그리 큰 수준은 아니고, 나중에 키가 많아져 integer로는 범위가 부족할 때 long으로 변경하는 것이 더 큰일이므로 처음부터 long을 쓰는 것이 낫다.
profile
땅콩의 모험 (server)

0개의 댓글