Spring/jpa

[JPA] 엔티티 설계 어노테이션

라임온조 2023. 2. 8. 12:16

JPA는 매핑 어노테이션을 분석해서 어떤 객체가 어떤 테이블과 관계가 있는지 알아낸다

 

1. @Entity

1) 개념

데이터베이스에 있는 테이블과 매칭되는 클래스임을 알려주는 어노테이션

2) 속성

name

  • jpa에서 사용할 엔티티 이름 지정
  • 보통 기본값인 클래스 이름을 사용. 
  • 기본값: 클래스 이름 그대로

3) 특징

  • 기본 생성자 필수
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없음
  • 저장할 필드(컬럼명과 매칭되는 클래스 속성들)에 final 사용하면 안 됨

 

2. @Table

1) 개념

엔티티와 매핑할 데이터베이스에 있는 테이블을 지정

2) 속성

name

  • 매핑할 테이블 이름
  • 기본값: 엔티티 이름(클래스 명)을 사용

uniqueConstraints

  • DDL생성 시에 유니크 제약조건을 만든다. 

 

3. @Id

1) 개념

엔티티 클래스의 필드를 테이블의 기본키에 매핑하는 식별자 필드

2) 특징

  • 자바 기본형, 자바 Wrapper 형, String, Date, BigDecimal, BigInteger에 적용 가능

 

4. @GeneratedValue

1) 개념

기본 키를 자동으로 생성할 때 그 방법을 지정

2) 속성

strategy

  • GenerationType.IDENTITY
    • 기본 키 생성을 데이터베이스에 위임
  • GenerationType.SEQUENCE
    • 데이터베이스에 있는 시퀀스를 이용해서 기본 키를 생성
  • 기본값은 AUTO

generator

  • SequenceGenerator에 있는 시퀀스 이름

5. @Column

1) 개념

객체에 있는 필드를 테이블 컬럼과 매핑할 때 사용

2) 속성

name

  • 필드와 매핑할 테이블의 컬럼 이름
  • 기본값: 객체의 필드 이름

nullable

  • null 값의 허용 여부를 설정
  • false면 not null이 적용되고, true면 not null이 적용되지 않는다
  • 기본값: true
  • DDL 생성 시에만 영향을 끼침

length

  • 문자 길이 제약조건
  • String에서만 사용가능
  • 기본값: 255
  • DDL 생성 시에만 영향을 끼침

3) 특징

  • column을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다. 즉, class에 사용된 필드 이름을 테이블 컬럼명에서 찾아서 같은 게 있으면 매핑된다.
  • 자바 기본타입인 int에는 null값이 입력될 수 없어서 int인 값에 column값이 없으면 not null로 자동 설정된다
  • 자바 객체 타입인 Integer에는 null 값이 입력될 수 있어서 Integer 값에 column 값이 없으면 not null을 설정하지 않는다
  • 그래서 만약 int인 값에 column을 설정하면 column의 nullable 기본값이 true이니, 이걸 false로 명시적으로 바꿔주는 것이 안전하다

 

6. @Getter, @Setter

  • Lombok에서 제공하는 get 메소드와 set 메소드를 자동으로 생성해주는 어노테이션

 

7. @Enumerated

1) 개념

자바의 enum 타입을 매핑할 때 사용

2) 속성

value

  • EnumType.ORDINAL 
    • enum 순서를 데이터베이스에 저장
    • 장점: 데이터베이스에 저장되는 데이터 크기가 작다
    • 단점: 이미 저장된 enum 순서를 변경할 수 없다
  • EnumType.STRING
    • enum 이름을 데이터베이스에 저장
    • 장점: 저장된 enum의 순서가 바뀌거나 enum이 추가되어도 안전, 그래서 이걸 권장
    • 단점: 데이터베이스에 저장되는 데이터 크기가 ORDINAL에 비해서 크다
  • 기본값: EnumType.ORDINAL

 

8. @Temporal

1) 개념

날짜 타입을 매핑할 때 사용

2) 속성

value

  • TemporalType.DATE
    • 날짜, 데이터베이스 date 타입과 매핑(예: 2023-01-01)
  • TemporalType.TIME
    • 시간, 데이터베이스 time 타입과 매핑(예: 11:12:03)
  • TemporalType.TIMESTAMP
    • 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(예: 2023-10-22 12:23:33)
  • 필수로 지정해야 함

9. @Lob

1) 개념

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

2) 속성

없음

3) 특징

  • 매핑하는 필드 타입이 문자면 CLOB로 매핑하고 나머지는 BLOB으로 매핑

10. @SequenceGenerator

1) 개념

데베에 있는 시퀀스와 매핑

2) 속성

name

  • 엔티티 클래스에서 사용할 시퀀스의 이름
  • 필수값

sequenceName

  • 데이터베이스에 있는 시퀀스 이름
  • 기본값: hibernate_sequence

initialValue

  • 처음 시작할 값
  • DDL생성 시에만 사용
  • 기본값: 1

allocationSize

  • 시퀀스 한 번 호출에 증가하는 수
  • 성능 최적화에 사용됨
  • 기본값: 50

11. @TableGenerator

1) 개념

Table 전략으로 기본 키를 생성할 때 사용

2) 속성

name

  • 식별자 생성기 이름
  • 엔티티 클래스에서 사용할 생성기 이름
  • 필수값

table

  • 키생성 테이블명
  • 데베에 만들어 놓은 키 생성 전용 테이블의 이름
  • 기본값: hibernate_sequences

pkColumnName

  • 시퀀스 컬럼명
  • 데베에 만들어 놓은 키 생성 전용 테이블의 pk 컬럼 이름
  • 기본값: sequence_name

pkColumnValue

  • 키로 사용할 값 이름
  • 기본값: 엔티티 이름

valueColumnName

  • 시퀀스 값 컬럼명
  • 데베에 만들어 놓은 키 생성 전용 테이블의 값을 담고있는 컬럼 이름
  • 기본값: next_val

12.  @Transient

1) 개념

해당 필드는 매핑하지 않는다. 데베에 저장하지 않고 조회하지도 않기 때문에 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다

13. @Access

1) 개념

JPA가 엔티티 데이터에 접근하는 방식을 지정한다

2) 속성

AccessType.FIELD

  • 필드에 직접 접근. 필드 접근 권한이 priviate이여도 접근할 수 있다.

AccessType.PROPERTY

  • 접근자(Getter)를 이용해서 접근한다

3) 사용하지 않을 경우

  • @Id의 위치를 기준으로 접근 방식이 설정된다
    • @Id가 필드에 있으면 AccessType.FIELD, @Id가 프로퍼티에 있으면 AccessType.PROPERTY