JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확히 매핑하는 것이다.
그러려면 JPA의 매핑 어노테이션을 잘 사용해야한다.
JPA가 지원하는 어노테이션은 크게 4가지로 분류할 수 있다.
- 객체와 테이블 매핑 : @Entity @Table
- 🔗 기본키 매핑 : @Id
- 🔗 필드와 컬럼 매핑 : @Column
- 🔗 연관관계 매핑 : @ManyToOne @JoinCloumn @OneToMany
JPA로 관리할 클래스는 @Entity
를 필수로 붙여야 하며, Entity
라 부른다.
속성 | 기능 | Default |
---|---|---|
name | - JPA에서 사용할 엔티티 이름 지정 - 다른 패키지에 같은 이름의 엔티티 클래스가 있다면 name 설정을 통해 충돌을 피한다. | 클래스명 (ex.Member) |
🚨
@Entity
주의사항
- 기본 생성자를 필수로 가져야 한다.
final
,enum
,interface
,inner
클래스에는 사용할 수 없다.- 저장할 필드에
final
을 사용하면 안 된다.JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하므로, 반드시 있어야 한다.
@Table
은 엔티티와 매핑할 테이블을 지정한다.
생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
속성 | 기능 | Default |
---|---|---|
name | 매핑할 테이블 이름 | 엔티티 이름 |
calalog | catalog 기능이 있는 DB에서 catalog를 매핑 | |
schema | schema 기능이 있는 DB에서 schema를 매핑 | |
uniqueConstraints DDL | - DDL 생성시 유니크 제약조건 설정 - DDL 자동 생성 기능을 활성화 했을때만 사용 |
@Entity
@Table(name="member", //테이블명과 엔티티 클래스명이 같다면 생략 가능
uniqueConstraints = {@UniqueConstraint(
name = "name_age_unique",
columnNames = {"name", "age"} )})
public class Member {
@Id
private String id;
private String name;
private Integer age;
}
JPA는 매핑 정보와 데이터베이스 방언을 사용해서 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.
이 기능을 사용하기 위해선 🔗persistence.xml
파일에 다음 속성을 추가해야 한다.
<property name="hibernate.hbm2ddl.auto" value="create" />
위 속성을 추가하고 애플리케이션을 실행하면, 매핑 정보를 읽고 자동으로 테이블을 생성한다.
생성된 DDL은 각 데이터베이스 방언에 맞춰 타입과 제약사항이 설정되어 있다.
옵션 | 설명 |
---|---|
create | - 기존 테이블을 삭제하고 새로 생성 - DROP + CREATE |
create-drop | - create 속성 기능에 추가로 애플리케이션을 종료할 때 생성한 테이블을 제거 - DROP + CREATE (애플리케이션 시작)+ DROP (애플리케이션 종료) |
update | 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 변경 사항만 수정 |
validate | - 데이터베이스 테이블과 엔티티 매핑 정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션 실행 안 함 -DDL을 수정하지 않음 |
none | - 스키마 자동 생성 기능 비활성화 - hibernate.hbm2ddl.auto 속성을 삭제하거나, 유효하지 않는 옵션 값 부여 |
@Entity
@Table (name="Member", uniqueConstraints = {@UniqueConstraint(
name="name_age_unique",
columnNames={"name", "age"})}) // 스키마 자동 생성 기능을 사용하면 이러한 매핑정보를 다 읽기 때문에
// 해당하는 제약조건 DDL을 생성한다.
public class Member {
@Id
@Column
private String id;
@Coulmn
private String userName;
}
🚨
HBM2DDL
주의사항
스키마 자동 생성은 데이터베이스의 테이블이나 컬럼을 삭제할 수 있기 때문에 운영 서버에서는 절대 사용해서는 안 된다.
자동 생성으로 만들어진 DDL을 재가공 없이 운영 서버에서 사용하는 것도 조심해야 한다. 운영에서 사용하기 전, 세세한 조건들을 다시 확인하고 재수정하여 DDL을 다듬어야 한다.
개발환경에 따른 추천 전략은 다음과 같다.
- 개발 초기 단계 :
create
또는update
- 초기화 상태로 자동화된 테스트를 진행하는 환경, CI 서버 :
create
또는create-drop
- 테스트 서버 :
update
또는validate
- 스테이징 서버와 운영서버 :
validate
또는none
🤔 개발 환경과, 개발 단계에 따른 추천 옵션이 있긴 하지만
개인적으로는 맨 처음 개발 초기에 러프하게 테이블 생성 DDL을 얻기 위한 경우를 제외하고는 사용하지 않는게 맘이 편할 것 같다.
강의_자바 ORM 표준 JPA 프로그래밍 - 기본편
교재_자바 ORM 표준 JPA 프로그래밍(김영한)다정한 피드백 환영해요 🤗