![[자바 ORM 표준 JPA 프로그래밍 - 기본편] 4. 엔티티 매핑](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ2MaW%2FbtsCTAxvtyG%2FauGLfzKw9GglBa53ilS5EK%2Fimg.png)
인프런 김영한 강사님의 [자바 ORM 표준 JPA 프로그래밍 - 기본편] 을 수강하고 정리한 글입니다.
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 - 인프런
현업에서 실제로 JPA로 개발을 하고 있습니다. 그런 입장에서보면 지금 작성하고 있는 코드들이 어떻게 작동하는지 이해하는데 큰 도움을 주는 강의입니다. 다음은 제가 느낀 이 강의의 장점들
www.inflearn.com
📌 객체와 테이블 매핑
✅ @Entity
@Entity를 붙인 클래스는 JPA가 관리하는 클래스로, 엔티티라고 부른다.
따라서 JPA를 사용해서 테이블과 매핑할 클래스는 @Entity를 반드시 붙여야 한다.
주의
기본 생성자 필수
final 클래스, enum, interface, inner 클래스 X
저장할 필드에 final 사용 X
✅ @Entity 속성
name
- JPA에서 사용할 엔티티 이름을 지정한다.
- name 옵션을 따로 지정하지 않으면, 기본 값으로 클래스 이름을 그대로 사용한다.
✅ @Table
엔티티와 매핑할 테이블을 지정한다.
✅ @Table 속성
속성 | 기능 | 기본값 |
name | 매핑할 테이블의 이름 설정 | 엔티티 이름 사용 |
catalog | DB catalog 매핑 | |
schema | DB schema 매핑 | |
uniqueConstraints (DDL) | DDL 생성 시 유니크 제약 조건 생성 |
📌 데이터베이스 스키마 자동 생성
✅ 데이터베이스 스키마 자동 생성하기 : 속성
hibernate.hbm2ddl.auto 옵션을 통해 설정할 수 있다. (yml 파일 or properties 파일)
옵션 | 설명 |
create | 기존 테이블 삭제 후 다시 생성 (DROP + CREATE) |
create-drop | create와 동일하지만, 종료 시점에 테이블을 drop한다. |
update | 변경분만 반영 (실 운영 DB에서 사용하지 말 것) |
validate | 엔티티와 테이블이 정상 매핑 되었는지 여부만 확인한다. |
none | 사용 X |
운영 장비에는 절대로 create, create-drop, update 옵션을 사용하면 안된다.
개발 초기 단계에서는 create 또는 update 옵션을,
테스트 서버에서는 update 또는 validate 옵션을,
스테이징과 운영 서버에서는 validate 또는 none 옵션을 사용하는 것을 권한다.
📌 필드와 컬럼 매핑
✅ 매핑 어노테이션
어노테이션 | 설명 |
@Column | 컬럼 매핑 |
@Temporal | 날짜 타입 매핑 |
@Enumerated | enum 타입 매핑 |
@Lob | BLOB, CLOB 매핑 |
@Transient | 특정 필드를 컬럼에 매핑하지 않는다. (매핑 무) |
✅ @Column의 속성
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체 필드 이름 |
insertable, updatable | 등록, 변경 가능 여부 | TRUE |
nullable | null 값의 허용 여부 설정 false로 설정하면 DDL 생성 시 not null 제약조건이 붙는다. |
|
unique | 한 컬럼에 간단히 유니크 제약조건을 걸 때 | |
columnDefinition | DB 컬럼 정보 직접 제공 | 필드의 자바 타입과 방언 정보 사용 |
length | 문자 길이 제약조건 String 타입에만 사용한다. |
255 |
precision, scale | BigDecimal 또는 BigInteger 타입에서 사용 precision은 소수점을 포함한 전체 자릿수 scale은 소수 자릿수 double, float은 적용 X 아주 큰 숫자나 정밀한 소수를 다뤄야 할 때 사용 |
precision = 19 scale = 2 |
✅ @Enumerated의 속성
enum 타입 매핑 시 사용하는 어노테이션.
일반적으로 STRING 옵션을 사용한다.
따로 설정 안하면 기본 값으로 EnumType.ORDINAL이 들어간다. <== 이거 주의 해야 한다.
속성 | 설명 | 기본값 |
EnumType.ORDINAL | enum 순서를 DB에 저장 | EnumType.ORDINAL |
EnumType.STRING | enum 이름을 DB에 저장 |
✅ @Temporal의 속성
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용하는 어노테이션.
LocalDate, LocalDateTime 사용 시, 생략 가능하다.
속성 | 설명 | 기본값 |
TemporalType.DATE | 날짜, DB date 타입과 매핑 ex> 2013-10-11 |
|
TemporalType.TIME | 시간, DB time 타입과 매핑 ex> 11:11:11 |
|
TemporalType.TIMESTAMP | 날짜와 시간, DB timestamp 타입과 매핑 ex> 2013-10-11 11:11:11 |
✅ @Lob
DB의 BLOB, CLOB 타입과 매핑한다.
@Lob 어노테이션에는 지정할 수 있는 속성이 없다.
매핑하는 필드 타입이 문자라면 CLOB을 매핑하고, 나머지는 BLOB을 매핑한다.
✅ @Transient
주로 메모리 상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
필드 매핑 X
DB에 저장 X, 조회 X
📌 기본 키 매핑
✅ 기본 키 매핑 어노테이션
@Id, @GeneratedValue
@Id @GeneratedValue(startegy = GenerationType.AUTO)
private Long id;
직접 할당 : @Id만 사용
자동 생성 : @GeneratedValue + @Id
@GeneratedValue의 strategy옵션
- IDENTITY : DB(MySQL)에 위임
- SEQUENCE : DB(MySQL) 시퀀스 오브젝트 사용
- @SequenceGenerator 필요
- TABLE : 키 생성용 테이블 사용, 모든 DB에서 사용
- @TableGenerator 필요
- AUTO : 방언에 따라 자동 지정, 기본
✅ IDENTITY 전략
기본 키 생성을 DB에 위임한다.
주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
IDENTITY 전략은 특이하게, em.persist() 시점에 즉시 INSERT 쿼리를 날리고 DB에서 식별자를 조회한다.
(원래는 transaction commit 할 때 쿼리를 날려야 함.)
✅ SEQUENCE 전략
@Entity
@SequenceGenerator(
name = “MEMBER_SEQ_GENERATOR",
sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
아래는 SEQUENCE 전략의 @SequenceGenerator 의 속성들이다.
속성 | 설명 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
initialValue | DDL 생성 시에만 사용, 시퀀스 DDL을 생성할 때 처음 1 시작하는 수 지정 |
1 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수 (성능 최적화에 사용) DB 시퀀스 값이 하나 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다. |
50 |
catalog, schema | DB catalog, schema 이름 |
✅ TABLE 전략
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = “MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR")
private Long id;
}
아래는 @TableGenerator의 속성들이다.
속성 | 설명 | 기본값 |
name | 식별자 생성기 이름 | 필수 |
table | 키 생성 테이블명 | hibernate_sequences |
pkColumnName | 시퀀스 컬럼명 | sequence_name |
valueColumnName | 시퀀스 값 컬럼명 | next_val |
pkColumnValue | 키로 사용할 값 이름 | 엔티티 이름 |
initialValue | 초기 값 마지막으로 생성된 값이 기준 |
0 |
allocationSize | 시퀀스 한 번 호출에 증가하는 수 (성능 최적화에 사용) |
50 |
catalog, schema | DB catalog, schema 이름 | |
uniqueConstraints | 유니크 제약 조건 지정 가 |
✅ 권장 식별자 전략
Long 형 + 대체 키 + 키 생성 전략을 사용하는 것을 권장한다.
'Backend > JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 6. 다양한 연관관계 매핑 (0) | 2024.01.04 |
---|---|
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 5. 연관관계 매핑 기초 (0) | 2024.01.04 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 3. 영속성 관리 - 내부 동작 방식 (0) | 2024.01.04 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 2. JPA 시작하기 (0) | 2024.01.03 |
[자바 ORM 표준 JPA 프로그래밍 - 기본편] 1. JPA 소개 (1) | 2024.01.03 |
개발자가 되고 싶어요.