티스토리 뷰
이번에는 Annotation과 속성을 중점으로 Entity를 매핑하는 방법에 대해 살펴본다.
데이터 베이스 스키마 자동 생성
JPA는 Appplication 로딩 시점에 DB 생성 기능을 지원한다.
개발시 테이블을 만들어 두고 객체를 넣어두는 방식이 아닌 객체 매핑을 해두면 알아서 필요한 테이블을 생성해준다.
설정은 아래와 같이 persistence.xml에 추가해주면 된다.
<property name="hibernate.hbm2ddl.auto" value="???" />
" ??? " 부분에 들어갈 옵션은 총 5개로 아래와 같다.
- create : 기존 테이블 삭제 후 다시 생성 (먼저 DROP후 CREATE)
- create-drop : create와 동일하지만 종료 시점에 DROP
- update : 변경분만 반영 (ALTER), 추가만 가능하고 지우는 건 적용되지 않음.
- validate : 엔티티와 테이블이 정상 매핑되었는지 확인.
- none : 사용하지 않음.
여기서 주의할 점은 운영 장비에는 절대로 create / create-drop / update를 사용하면 안된다는 점이다.
각 옵션을 사용하는 시기는 아래와 같이 권장하고 있다.
- 개발 초기 : create / update
- 테스트 서버 : update / validate
- 운영 : validate / none
가급적 로컬에서는 자유롭게 사용하되, 다수의 개발자와 사용하는 서버에서는 사용하지 않도록 하자.문을 시스템에 맡기는 것 자체가 큰 리스크기 때문에.. 스크립트를 어느 정도 다듬어서 직접 쿼리를 날리는 습관을 가져야 한다.
객체와 테이블 매핑
@Entity
@Entity가 붙은 클래스는 JPA가 관리하는 엔티티라고 한다. JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수로 들어가야 한다. 이때 기본 생성자는 필수로 넣어주어야 한다.
속성 값으로는 name을 사용할 수 있는데, JPA에서 사용할 Entity 이름을 지정할 수 있다.
기본 값으로는 클래스의 이름을 사용한다.
@Table
엔티티와 매핑할 테이블을 지정할 때 사용한다.
속성 | 기능 | Default |
name | 매핑할 테이블 이름 설정 | Entity 이름 |
schema | DB 스키마 매핑 | |
uniqueConstraints | 유니크 제약 조건생성 |
여기서 유니크 제약 조건을 생성할 때는 아래와 같이 생성할 수 있다.
uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE",
columnNames = {"NAME", "AGE"} )}
필드와 컬럼 매핑
설명보다는 코드와 어떤 속성 값이 있는지 소개한다.
@Entity
@Table(name = "MBR")
public class Member {
public Member() {
}
@Id
private Long id;
@Column(name = "name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
@Transient
private int temp;
}
매핑 예시
@Column
속성 | 기능 | Default |
name | 필드와 매핑할 컬럼 이름 | 객체 필드명 |
insertable / updatable | DB 스키마 매핑 | TRUE |
nullable | null값 허용 여부 | TRUE |
unique | 컬럼에 유니크 제약 조건생성 - 제약 조건 이름이 랜덤하게 설정되어 추천하지 않음. |
FALSE |
length | 문자 길이 제약조건 | 255 |
columnDefinition | 컬럼 정보 직접 입력 ex) varchar(100) default 'EMPTY' |
@Enumerated
속성 | 기능 | Default |
value |
- EnumType.ORDINAL : enum 타입의 이름을 DB에 저장 |
EnumType.ORDINAL |
EnumType.ORDINAL 절대 사용하지 않기 (순서가 꼬이면 운영시 큰 버그 발생 가능)
@Temporal
속성 | 기능 | Default |
value |
- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 (예: 2013–10–11) - TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑 (예: 11:11:11) |
날짜 타입을 매핑할 때 사용하나 최신 버전은 Annotation 대신에 LocalDate와 LocalDateTime을 사용하면 알아서 매핑이 된다.
@Lob
지정할 수 있는 속성은 없고, 필드 타입이 문자일 때는 CLOB / 나머지는 BLOB
@Transient
필드 매핑을 하지 않고, 메모리 상에서만 어떤 값을 보관하고자 할 때 사용한다.
기본 키 매핑
@GeneratedValue 를 통해서 Entity의 PK값을 자동으로 생성할 수 있다. 속성 값으로 strategy를 가지며, 4개의 값을 설정할 수 있다.
1. GenerationType.IDENTITY
: 기본키 생성을 DB에 위임.
2. GenerationType.SEQUENCE
: 유일한 값을 순서대로 생성하는 데이터베이스 오브젝트를 생성하여 위임 (오라클, PostgreSQL, DB2, H2에서 사용)
그런데 만약 Table마다 시퀀스를 따로 관리를 하고자 할 때는, 직접 할당해 줄 수 있다.
@Entity
@Table(name = "MBR")
@SequenceGenerator(
name = "MEMBER_SEQ_GEN",
sequenceName = "MEMBER_SEQ",
initialValue = 1, allocationSize = 1)
public class Member {
public Member() {
}
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GEN")
private Long id;
}
속성 | 기능 | Default |
name | 식별자 생성기 이름 | 필수 입력 |
sequenceName | DB에 등록할 시퀀스 이름 | hibernate_seqeuence |
initialValue | DDL시 처음 시작하는 숫자를 지정 | 1 |
allcationSize | 시퀀스 호출시 증가 숫자 | 50 |
3. GenerationType.TABLE
: 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 흉내 내는 전략,
SequenceGenerator와 유사하게 Table을 생성시켜주면, seq 이름에 맞춰 seq값이 1씩 증가하도록 설계된다.
그러나 성능에 이슈가 있어 사용을 권장하지는 않음.
@Entity
@Table(name = "MBR")
@TableGenerator(
name = "MEMBER_SEQ_GEN",
table = "MY_SEQ",
pkColumnName = "MEMBER_SEQ", allocationSize = 1
)
public class Member {
public Member() {
}
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GEN")
private Long id;
}
'프로그래밍 > JPA' 카테고리의 다른 글
양방향 연관관계 매핑 (0) | 2021.04.27 |
---|---|
단방향 연관관계 매핑 (0) | 2021.04.27 |
영속성 컨텍스트 (0) | 2021.04.24 |
Hello JPA (0) | 2021.04.21 |
왜 JPA인가? (0) | 2021.04.21 |