엔티티 매핑

현시기얌·2021년 11월 28일
0

JPA

목록 보기
6/14

엔티티 매핑

객체와 테이블 매핑 : @Entity, @Table

필드와 컬럼 매핑 : Column

기본 키 매핑 : @Id

연관관계 매핑: @ManyToOne, @JoinColumn

객체와 테이블 매핑

@Entity

  • @Entity가 붙은 클래스는 JPA가 관리하고 이를 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수다.
  • 주의
    • 기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자)
    • final 클래스, enum, interface, inner 클래스 사용 X
    • 저장할 필드에 final 사용 X

@Table

@Table은 엔티티와 매핑할 테이블 지정

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

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

  • DDL을 애플리케이션 실행 시점에 자동으로 생성한다.
  • 테이블 중심 -> 객체 중심
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성한다. ex) varchar, varchar2
  • 이렇게 생성된 DDL은 개발 장비에서만 사용가능하다.
  • 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후에 사용한다.

데이터베이스 스키마 자동 생성 - 속성

hibernate.hbm2ddl.auto

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

데이터베이스 스키자 자동 생성 - 주의

  • 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.
  • 개발 초기 단계는 create 또는 update 가급적이면 none
  • 테스트 서버는 update 또는 validate 가급적이면 none
  • 스테이징과 운영 서버는 validate 또는 none

DDL 생성 기능

  • 제약 조건 추가 : 회원 이름은 필수, 10자 초과 X
    • @Column(nullable = false, length = 10
  • 유니크 제약 조건 추가
    • @Table(uniqueConstraints = {@UniqueConstraint(name ="NAME_AGE_UNIQUE", columnName ={"NAME","AGE"})})
  • DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA 실행 로직에는 영향을 주지 않는다.

필드와 컬럼 매핑

요구사항

  1. 회원은 일반 회원과 관리자로 구분해야 한다.
  2. 회원 가입일과 수정일이 있어야 한다.
  3. 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다.
@Entity
@Getter
@NoArgsConstructor
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 String temp;

    @Getter
    public enum RoleType {
        USER("일반 회원"), ADMIN("관리자");

        private final String description;

        RoleType(String description) {
            this.description = description;
        }
    }
}

매핑 애노테이션 정리

  • @Column : 컬럼 매핑
  • @Temporal : 날짜 타입 매핑 (LocalDate, LocalDateTime을 사용할 때는 생략 가능)
  • @Enumerated : enum 타입 매핑
  • Lob : BLOB, CLOB 매핑
  • Transient : 특정 필드를 컬럼에 매핑하지 않는다.

@Column

속성설명기본값
name필드와 매핑할 테이블의 컬럼 이름객체의 필드 이름
insertable, updatable등록, 변경 가능 여부TRUE
nullable(DDL)null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성 시에 not null 제약 조건이 붙는다.
unique(DDL)@Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다.
columnDefinition데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) default 'EMPTY'필드의 자바 타입과 방언 정보를 통해
length(DDL)문자 길이 제약조건, String 타입에만 사용한다.255

@Enumerated

자바 enum 타입을 매핑할 때 사용
주의 : ORDINAL 사용 X 반드시 STRING 사용

속성설명기본값
valueEnumType.ORDINAL : enum 순서를 데이터베이스에 저장EnumType.ORDINAL
EnumType.STRING : enum 이름을 데이터베이스에 저장

@Lob

데이터베이스 BLOC, CLOB 타입과 매핑

  • @Lob에는 지정할 수 있는 속성이 없다.
  • 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
    • CLOB : String ,char[], java.sql.CLOB
    • BLOB : byte[], java.sql.BLOB

기본 키 매핑

기본 키 매핑 애노테이션

@Id
@GeneratedValue

  • 직접 할당 : @Id만 사용
  • 자동 생성 : @GeneratedValue
속성설명
IDENTITY데이터베이스에 위임, MYSQL
SEQUENCE데이터베이스 시퀀스 오브젝트 사용, ORACLE, @SequenceGenerator 필요
TABLE키 생성용 테이블 사용, 모든 DB에서 사용, @TableGenerator 필요
AUTO방언에 따라 자동 지정, 기본값

IDENTITY

  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MySQL, PostgreSQL 에서 사용 ex) MYSQL의 AUTO_INCREMENT
  • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL문을 실행시킨다.
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID값을 알 수 있다.
  • IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL문을 실행하고 DB에서 식별자를 조회한다.

SEQUENCE

  • 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트 ex) 오라클 시퀀스

TABLE

  • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내내는 전략
  • 장점 : 모든 데이터베이스에 적용 가능
  • 단점 : 성능

권장하는 식별자 전략

  • 기본 키 제약 조건 : null이 아니어야 한다, 유일해야한다, 변하면 안된다.
  • 미래까지 이 조건을 만족하는 자연키는 찾기 어렵다. 대리키(대체키)를 사용하자.
  • 권장 : Long형 + 대체키 + 키 생성 전략 사용

데이터 중심 설계의 문제점 (ex 객체대신 Id를 활용)

  • 테이블의 외래키를 객체에 그대로 가져온다.
  • 따라서 객체 그래프 탐색이 불가능하다.
  • 또한 참조가 없으므로 매핑이 되지 않는다.
profile
현시깁니다

0개의 댓글

관련 채용 정보