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