JPA #3 Entity 매핑

함형주·2022년 10월 23일
0

JPA

목록 보기
3/7

질문, 피드백 등 모든 댓글 환영합니다.

JPA는 어노테이션을 기반으로 객체와 테이블을 매핑할 수 있습니다.
이 때 테이블과 매핑되는 객체를 Entity 라고 합니다.
객체와 테이블을 매핑하는 어노테이션을 정하겠습니다.

테이블과 컬럼 매핑

@Entity

@Entity를 적용한 클래스를 엔티티로 등록합니다. (필수로 지정해야 합니다.)
Enum, Interface, Final class, Inner class(중첩 클래스)에는 사용이 불가능합니다.

또한 저장할 필드는 final을 사용할 수 없으며 public, protected 기본 생성자를 필수로 가져야 합니다. (프록시 등의 기능을 위해)

@Entityname 속성을 가지는데 사용할 엔티티의 이름을 지정할 수 있습니다. (기본 값은 클래스의 이름)
다른 패키지에 같은 이름을 사용하는 클래스를 같이 엔티티에 등록해야 할 경우 name으로 이름을 지정하여 사용합니다.

@Entity
public class User {
}

@Table

@Table@Entity가 적용된 클래스에 사용하여 엔티티와 매핑할 테이블에 관한 정보를 세부적으로 설정할 수 있습니다.

@Entity
@Table(name = "USER")
public class User {
}
  • name : 엔티티와 매핑할 테이블 이름 지정 (기본 값으로 엔티티 이름 사용)

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

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

  • uniqueConstraints : DDL 생성 시 유니크 제약 조건 생성

@Colunm

@Colunm으로 테이블의 colunm에 관한 정보를 세부적으로 설정할 수 있습니다.
엔티티의 필드에 @Colunm을 사용하지 않아도 기본으로 테이블의 컬럼과 매핑됩니다.

@Entity
public class User {
	@Colunm(name = "username")
	private String name;
}
  • name : 엔티티의 필드와 매핑할 테이블의 컬럼명 지정 (기본 값으로 객체의 필드명 사용)

  • insertable, updatable : 등록, 변경 가능 여부 (기본 값으로 TRUE 사용)

  • nullable : false로 설정하면 DDL 생성 시에 해당 필드 not null 적용

  • unique : 해당 컬럼에 유니크 제약 조건 생성

  • columnDefinition : 컬럼 정보 직접 지정 ex)varchar(100) default ‘EMPTY'

  • length : 문자 길이 제약조건 (기본 값 255)

  • precision, scale : BigDecimal 타입에서 사용(BigInteger도 사용 가능)
    precision로 소수점을 포함한 전체 자릿 수를, scale로 소수의 자릿 수 지정,
    double, float 타입에는 적용 불가 (기본 값 precision=19, scale=2)

@Enumerated

@Enumerated로 자바 enum 타입을 컬럼으로 매핑합니다.

속성으로 value를 가지는데 EnumType.ORDINALEnumType.STRING을 사용할 수 있고 기본 값으론 EnumType.ORDINAL을 사용합니다.

@Entity
public class User {
	@Enumerated(EnumType.STRING)
	private Grade grade; // enum 타입
}
  • EnumType.ORDINAL : enum의 순서를 DB에 저장

  • EnumType.STRING: enum 이름을 데이터베이스에 저장

@Enumerated 사용 시 꼭 EnumType.STRING을 사용합니다. EnumType.ORDINAL을 사용하게 되면 후에 enum 값을 수정 하여 순서가 변경되어도 DB에는 변경 된 순서가 적용이 되지 않아 혼란이 생길 수 있습니다.

@Transient

@Transient가 적용된 필드는 매핑하지 않습니다.
DB에 저장하지 않고 애플리케이션 메모리에서만 사용하는 필드일 경우 사용합니다.

Id 값(기본 키) 매핑

PK는 @Id로 지정할 수 있습니다.

@Id를 단독으로 사용하면 엔티티를 DB에 저장할 때 Id 값을 직접 지정을 해야합니다.

@GeneratedValue를 사용하면 Id 값 생성을 JPA가 자동으로 처리해줍니다.
4가지 전략을 사용할 수 있으며 기본 값은 GenerationType.AUTO 입니다.

@Entity
public class User {
	@Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
}
  • IDENTITY : 기본 키 생성을 DB에 위임합니다. (MySQL의 AUTO_ INCREMENT) IDENTITY 전략을 사용할 경우 persist() 시점에 쓰기 지연을 하지 않고 바로 SQL을 실행합니다. (Id 값을 DB에서 생성하므로 쓰기 지연 시 Id 값을 알 수 없기 때문)

  • SEQUENCE : 유일한 값을 생성하는 DB 오브젝트를 이용 (오라클 DB의 시퀀스) @SequenceGenerator와 함께 사용합니다. (클래스에 적용)

    • @SequenceGenerator의 속성
    • name : 시퀀스 이름 (필수)
    • sequenceName : DB 시퀀스 이름 (기본 값 hibernate_sequence)
    • initialValue : 시퀀스 DDL 생성 시 시작하는 수 (기본 값 1)
    • allocationSize : 시퀀스를 호출할 때 증가하는 수 (기본 값 50)
    • catalog, schema : DB catalog, schema 이름

  • TABLE : 키 생성 전용 테이블로 Id 값 생성, @TableGenerator와 함께 사용합니다. (클래스에 적용)

    • name : 식별자 생성기 이름 (필수)
    • table : 테이블 명 (기본 값 hibernate_sequences)
    • pkColunmName : 시퀀스 컬럼명 (기본 값 sequence_name)
    • valueColunmName : 시퀀스 값 컬럼명 (기본 값 next_val)
    • pkColumnValue : 키로 사용할 값 이름 (기본 값 엔티티 이름)
    • initialValue : 초기 값 (기본 값 0)
    • allocationSize : 시퀀스를 호출할 때 증가하는 수 (기본 값 50)
    • uniqueConstraints : 유니크 제약 조건 지정
    • catalog, schema : DB catalog, schema 이름

  • AUTO : DB 방언에 따라 자동 지정

profile
평범한 대학생의 공부 일기?

0개의 댓글