본문 바로가기
JPA/ORM 표준 JPA

04 Entity

by clearinging 2021. 7. 8.
반응형

Entity class Annotation

@Entity

  • 정의 : 테이블과 Entity class를 연결해주는 필수 annotation

1. 속성

  1. name
  • 기능
    • jpa에서 사용할 Entity이름을 설정
    • 다른 package에서 같은 Entity이름을가지고 있음 하나는 변경 해야함
  • 기본값
    • class이름 그대로 사용

2. 특징

  • 기본 생성자 필수
    • 접근제어 지시자 최소 단위 : protected
    • private 사용 금지
  • final class, enum, interface, inner class 사용 불가
  • 저장할 field는 final 사용 금지

@Table

  • 정의 : 엔티티 클래스와 mapping할 table을 지정하는 annotation1. 속성

1. 속성

  1. name
  • 기능 : table이름
  • 기본값 : entity 이름
  1. catalog
  • 기능 : catalog 명설정(시스템 내의 모든 객체에 대한 정의나 명세)
  • 기본 값 : 없음
  1. schema
  • 기능 : schema를mapping
  • 기본 값 : 없음
  1. uniqueConstraints
  • 기능 : DDL 전용으로 유니크 제약조건을 2개 이상의 컬럼을 설정 할 때 사용, DDL 때만 사용
  • 기본 값 : 없음

@Id

  • 정의 : 기본키 mapping

1. @Id 필드 할당 방법

  1. 직접 할당 : 애플리케이션에서 자동으로 할당
  • 영속성 컨택스트에 Id로 설정된 Entity가 없을 경우 Exception 발생
  1. 간접 할당 : 대리키 사용
  • IDENTITY
    • 정의 : 기본키 설정을 DB에 위임
    • AUTO_INCREMENT 기능
    • Entity 객체를 DB 에 저장하고, 저장된 row를 조회해서 반환 하는 방식을 취합니다.
    • 영속성 컨택스트에 저장하기 위해서(PK값 이 없기 때문) 쓰기 지연하지 않고 바로 insert query 실행
    • JDBC3에 Statement.getGeneratedKeys()를 사용해게되면, 데이터를 저장하면서 동시에 생성된 기본키 값을 얻어올 수 있음
  • SEQUENCE
    • 정의 : 시퀀스를 사용해서 기본키 설정
    • DB Sequence : 유일한 값을 순서대로 생성하는 특별한 DB Object
    • PostreSQL, DB2, H2에 사용 가능
    • 저장 실행 순서 : 시퀀스에 식별자 조회 -> 조회한 PK값을 정보 엔티티 할당하고 영속성 컨택스트에 저장 -> flush가 발생할 때 실제 DB에서 정보 저장
    • @SequenceGenerator
      • 정의 : sequence 생성기를 등록
      • 속정
        • name : 식별자 이름, 필수 사항
        • sequenceName : DB에 등록할 시퀀스 이름
        • initialValue : DDL 생성시 사용, 처음 시작할 시퀀스 번호 -> default : 1
        • allocationSize : 시퀀스가 한번 사용될때 증가하는 횟수(성능 최적화에 사용) -> default : 50
        • catalog, schema : DB 카탈로그, 스키마 이름
      • allocationSize의 default가 50인 이유 : 한번의 sequece에서 데이터를 조회 하지만 나머지는 memory에서 할당을 하기 위해서 -> 처음 50 ~ 100 application 1 에서 사용, 100 ~ 150은 application 2에서 할당하게 해서 동시성제어와 속도를 높이기 위해서 사용한다.
@Entity
public class user {
    @Id
    @GenerateValue(strategy = GenerationType.SEQUENCE, generator = "USER_SEQ_GENERATOR")
    @SequenceGenerator(name="sequence", allocationSize = 20)
    private Long id;
    // ...
}
  • TABLE
    • 정의 : Key전용 테이블을 이용해서 기본키 설정
    • @TableGenerator
      • 정의 : table key 생성기를 등록
      • 속성
        • name : 식별자 생성기 이름, 필수 사항
        • table : key 생성 table 이름 -> default : hibernate_sequences
        • pkColumnName : 시퀀스 컬럼명 -> default : sequence_name
        • valueColumnName : 시퀀스 값 컬럼명 -> default : next_val
        • pkColumnValue : 키로 사용할 값 이름 -> default : eneity 이름
        • initalValue : 초기 값, 마지막으로 생성된 값이 기준 -> default 0
        • allocationSize : 시퀀스 한번 호출에 증가하는 수(성능 최적화 용도) -> default : 50
        • catalog, schema : db 카탈로그, 스키마 이름
        • uniqueConstraints(DDL 전용) : 유니크 제약 조건 지정 할 수 있음
create table sequences (
    sequence_name varchar(255) not null primary key,
    next_val bigint
);
@Entity
@TableGenerator(
    name = "USER_SEQ_GENERATOR",
    table = "sequences",
    pkColumnValue = "user_seq_id", allocationSize = 1
)
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE,
        generator = "USER_SEQ_GENERATOR"
    )
    private Long id;
    // ...   
}
  • AUTO
    • 정의 : 선택한 DB종류에 따라서 자동으로 설정됨
    • 특징
      • @GeneratedValue.strategy 의 default 값은 AUTO입니다.
      • 프로토 타입 상태에서는 사용하기 편리

2. 기본키 생성 전략 설정

  • @GeneratedValue 추가해서 사용

3. 기본키 특징

  1. 식별자 전략
  • null 허용하지 않음
  • 유일한 값
  • 변하지 않는 값
  1. 기본키 설정
  • 자연키
    • 비즈니스에 의미가 있는 키
    • ex) 주민번호, email
  • 대리키(대체 키)
    • 비즈니스와 관련 없이 만들어진 키
    • oracle의 시퀀스, mysql 의 auot_increment, 키생성 테이블 ...etc
  1. 권장 사항 : 대리키를 권장 -> 언제나 비즈니스로 로직이 변경될 가능성이 존재 하기 때문에

code

@Entity
@Table(name="users", uniqueConstraints = { 
    @UniqueConstraint {
        name = "email_username_unique",
        columnNames = { "email", "username" }
    }
})
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;

    private String email;
}

필드 컬럼 매핑 Annotaition

DDL 필드 옵션

  • 장점 : Entity class만 보고 table에 제약 조건을 확인할 수 있음

@Column

1. 정의

  • 컬럼에 설정할 정보

2. 속성

  1. name
  • 기능
    • 필드의 이름
  • 기본값 : 객체의 필드 이름
  1. insertable
  • 기능
    • entity 저장시 이필드도 같이 저장
    • false면 읽기 전용
    • 잘 사용하지 않음
  • 기본값 : true
  1. updatable
  • 기능
    • Entity 수정시 같이 수정되는 것
    • false일경우 한번 저장된 정보는 수정되지 않는다
    • 거의 사용하지 않음
  • 기본값 : true;
  1. table
  • 기능
    • 하나의 entity가 2개 이상의 테이블에 mapping될 때 사용
    • 거의 사용하지 않음
  • 기본값 : 현재 table이 연결된 table명
  1. nullable (DDL)
  • 기능
    • not null 설정
    • 만약 int, long과 같은 primitive type을 사용할 경우 default 값이 존재하므로, nullable을 false로 설정하는게 좋음
  • 기본값 : true
  1. unique(DDL)
  • 기능
    • 한 컬럼에 대해서만 unique key를 설정할 때 사용
  1. columnDefinition(DDL)
  • 기능
    • DB의 컬럼 정보 직접 입력
  • 기본값 : 자바의 field 변수의 type에 맞춰서 mapping
  1. length
  • 기능
    • 문자열 일 경우 길이 정보
  • 기본값 : 255
  1. precision, scale(DDL)
  • 기능
    • BigDecimal 타입에서 사용
    • precision : 소수점 포함한 전체 자릿수
    • scale : 소수의 자리수
  • 기본값
    • prevision : 19
    • scale : 2

@Enumerated

1. 정의

  • enum type을 mapping할 때 사용

2. 속성

  1. value
  • 기능
    • EnumType.ORGINAL : enum선언 순서 index 정보 저장
    • EnumType.STRING : enum의 이름을 저장
  • 기본값 : EnumType.ORGINAL
    1. EnumType.ORGINAL
    • 장점 : 데이터 크기가 작아짐
    • 단점 : enum 저장된 순서를 꼐속 신경써 줘야함
  • 3. 특징

@Temporal

1. 정의

  • 날짜 정보 mapping

2. 속정

  1. value
  • 기능
    • TemporalType.Date : 날짜 정보, DB의 date type
    • TemporalType.TIME : 시간 정보, DB의 time type
    • TemporalType.TIMESTaMP : 날짜와 시간 정보, DB의 timestamp
    • TemporalType을 필수로 지정해야함

@Lob

1, 정의

  • DB에 BLOB, CLOB타입에 매핑하기 위한 것 -> 대규모 string 정보를 저장하기 위한 것

@Transient

1. 정의

  • table에 mapping 하지 않는 field를 찾기 위한 것
  • 임시 값에 주로 사용

@Access

1. 정의

  • Entity객체가 Table에 접근하는 방식

2. 특징

  • 필드 접근 : AccessType.FIELD일경우 필드 값으로 저장 -> private라도 접근 가능
  • 프로퍼티 접근 : AccessType.PROPERTY, getter를 사용
  • @Access 설정하지 않음 @Id의 위치를 기준으로 접근 방식이 설정
반응형

'JPA > ORM 표준 JPA' 카테고리의 다른 글

06 연관관계 Mapping 종류  (2) 2021.08.21
05 연관관계  (0) 2021.07.28
03. 영속성  (0) 2021.06.30
02. JPA 요소들  (2) 2021.06.29
01. JPA 소개  (0) 2021.05.19