jae_coding

[Spring JPA] 엔티티 매핑 본문

Spring, java/Spring_JPA

[Spring JPA] 엔티티 매핑

재코딩 2022. 9. 8. 19:57
반응형

목차

  • 객체와 테이블 매핑
  • DB 스키마 자동 생성
  • 필드와 컬럼 매핑
  • 기본 키 매핑

 

 

0. 앤티티 매핑

  1. 객체와 테이블 매핑: @Entity, @Table
  2. 필드와 컬럼 매핑: @Column
  3. 기본 키 매핑: @Id
  4. 연관관계 매핑: @ManyToOne, @JoinColumn

 

1. 객체와 테이블 매핑

@Entity

- @Entity가 붙은 클래스는 JPA가 관리하는 엔티티이다.

 

- JPA를 사용해서 테이블과의 매핑할 클래스는 @Entity 어노테이션을 꼭 붙여야한다.

 

- 주의사항

   1) 기본 생성자 필수 (parameter가 없는 public or protected 생성자)

   2) final class, enum, interface, inner class 에는 사용할 수 없다.

   3) 저장할 필드에는 final을 사용할 수 없다.

 

@Table

- name: 매핑할 테이블 이름 (default: 엔티티 이름)

- catalog: 데이터베이스 catalog 매핑

- schema: 데이터베이스 schema 매핑

- uniqueConstratints (DDL): DDL 생성 시, 유니크 제약 조건 생성

 

2. DB 스키마 자동 생성

  • DDL을 애플리케이션 실행 시점에 자동으로 생성
  • 데이터베이스 dialect를 활용하여 데이터베이스에 맞는 적절한 DDL 생성
<property name="hibernate.hbm2ddl.auto" value="create" />

hibernate.hbm2ddl.auto

- create: 기존 테이블 삭제 후 다시 생성 (DROP + CREATE)

- create-drop: create와 같으나 종료시점에 테이블 DROP

- update: 변경분만 반영 (운영 DB에는 사용하면 안된다) + column을 추가하는 것만 되고, 지우는 것은 안된다.

- validate: 엔티티와 테이블이 정상 매핑되었는지만 확인

- none: 사용하지 않음

 

주의점

- 운영 장비에는 절대 create, create-drop, update를 사용하면 안된다.

- 개발 초기 단계: create, update

- 테스트 서버: update, validate

- 스테이징, 운영서버: validate, none

 

  • 이렇게 생성된 DDL은 개발 장비에서만 사용하는 것을 권장
  • 생성된 DDL은 운영서버에서는 사용되지 않거나, 적절히 다듬은 후 사용
  • 테이블 중심 👉객체 중심
  • DDL 생성기능: DDL을 자동 생성할 때만 사용되고, JPA의 실행로직에는 영향X

- 제약조건 추가: 회원이름은 필수, 10글자 초과X

@Column(nullable=false, length=10)
private String name;

- 유니크 제약조건 추가

@Table(uniqueConstraints={@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE})})

 

3. 필드와 컬럼 매핑

Member Entity

 

package hellojpa;

import javax.persistence.*;
import java.util.Date;

@Entity
public class Member {
    @Id
    private Long id;

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

    private Integer age;

    // enum타입이 db에는 없기때문에 Enumerated가 필요
    @Enumerated(EnumType.STRING)
    private RoleType roleType;

    // 날짜타입을 이용하기 위함
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    //db의 큰 컨텐츠를 넣고싶을때 사용
    @Lob
    private String description;

    public Member() {
    }
}

 

매핑 어노테이션 정리

- @Column: 컬럼 매핑

- @Temporal: 날짜 타입 매핑

- @Enumerated: enum타입 매핑

- @Lob: BLOB, CLOB 매핑

- @Transient: 트정 필드를 컬럼에 매핑하지 않음(매핑 무시)

 

@Column 속성

@Enumerated속성

기본이 ORDINAL이지만 순서를 저장하기에 STRING타입을 사용하는 것을 권장

@Temporal 속성

LocalDate, LocalDateTime을 사용할 때는 생략이 가능하다. (최신 하이버네이트 지원) 따라서 지금은 거의 사용을 안한다.

@Lob

매핑 필드 타입이 문자면 CLOB, 나머지 BLOB

- CLOB: String, char[], java.sql.CLOB

- BLOB: byte[], java.sql.BLOB

@Transient

메모리 상에서 임시로 어떤 값을 보관하고 싶을때 사용

 

4. 기본 키 매핑

@Id @GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

직접 할당 👉 @Id 만 사용

자동 생성 👉 @GeneratedValue까지 사용

- IDENTITY: 데이터베이스에 위임 (ex, MYSQL의 AUTO_INCREMENT)

- SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용 (ORACLE) <@SequenceGenerator 필요>

- TABLE: 키 생성용 테이블 사용, 모든 DB 사용 <@TableGenerator 필요>

- AUTO: dialect에 따라 자동 지정

 

식별자 전략

- DB PK 조건: null x, 유일, 변하면 안된다.

변하면 안된다는 조건 👉 미래까지 생각해야하기 때문에 만족하는 자연키(예: 주민등록번호) 를 찾기가 어렵다. 대리키나 대체키를 사용해야한다.

-  권장: Long타입 + 대체키 + 키 생성전략 사용

 

반응형
Comments