이 글은 김영한 님의 저서 「자바 ORM 표준 JPA 프로그래밍」을 학습한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.
JPA 사용의 핵심 = 엔티티와 테이블을 정확히 매핑하는 것
매핑 정보 기술 방법으로는 XML과 어노테이션이 존재
어노테이션을 사용하는 쪽이 좀 더 쉽고 직관적이므로, 이번 챕터에서 XML을 이용한 방법은 따로 다루지 않음
→ XML을 이용한 매핑 보러 가기
JPA의 대표적인 매핑 어노테이션
매핑 | 어노테이션 |
---|---|
객체-테이블 | @Entity , @Table |
기본키 | @Id |
필드-컬럼 | @Column |
연관관계 | @ManyToOne , @JoinColumn |
=> 이번 챕터에서는 객체-테이블, 기본키, 필드-컬럼 매핑만 설명한다.
속성 | 기능 | 기본값 |
---|---|---|
name | ◾ JPA에서 사용할 엔티티 이름 지정 ◾ 보통 기본값인 클래스 이름 사용 ◾ 다른 패키지에 동명의 엔티티 클래스 존재 → 이름 지정하여 충돌 방지 | 미설정 시 클래스 이름 그대로 사용 ex) Member |
public
또는 protected
)final
, enum
, interface
, inner
클래스에 사용 불가final
사용 금지속성 | 기능 | 기본값 |
---|---|---|
name | 매핑할 테이블 이름 | 엔티티 이름 사용 |
catalog | catalog 기능이 있는 데이터베이스에서 catalog 매핑 | |
schema | schema 기능이 있는 데이터베이스에서 schema 매핑 | |
uniqueConstraints (DDL) | ◾ DDL 생성 시 유니크 제약조건 생성 ◾ 2개 이상의 복합 유니크 제약조건 생성 가능 ◾ 스키마 자동 생성 기능을 사용하여 DDL 생성할 때만 사용 |
JPA는 매핑정보(사용 중인 테이블 및 컬럼)와 데이터베이스 방언을 사용하여 데이터베이스 스키마를 자동 생성함
persistence.xml
에 속성 추가<!-- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성 -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- 속성 'true' → 콘솔에 실행되는 테이블 생성 DDL 출력 -->
<property name="hibernate.show_sql" value="true" />
hibernate.hbm2ddl.auto
속성
옵션 | 설명 |
---|---|
create | 기존 테이블을 삭제 후 새로 생성 → DROP + CREATE |
create-drop | create + 애플리케이션 종료시 생성한 DDL 제거 → DROP + CREATE + DROP |
update | 데이터베이스 테이블과 매핑정보 비교하여 변경 사항만 수정 |
validate | ◾ 데이터베이스 테이블과 엔티티 매핑정보 비교하여 차이 존재시 경고 남기고 애플리케이션 실행 x ◾ DDL 수정 x |
none | ◾ 유효하지 않은 옵션 값 ◾ 자동 생성 기능 사용 원하지 않는 경우 → hibernate.hbm2.ddl.auto 속성 삭제로도 가능 |
운영 중인 데이터베이스의 테이블이나 컬럼 삭제 가능
→ 개발 서버나 개발 단계에서만 사용할 것
💡 개발 환경에 따른 추천 전략
- 개발 초기 단계 →
create
또는update
- (초기화 상태 + 테스트 자동화) 개발자 환경 및 CI 서버
→create
또는create-drop
- 테스트 서버 →
update
또는validate
- 스테이징 및 운영 서버 →
validate
또는none
javax.persistence.schema-generation.database.action
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
완벽하지 않으므로 개발 환경에서 사용하거나 매핑 방식 참고 용도로 사용
자바 : 카멜(Camel) 표기법 ex) roleType
데이터베이스 : 언더스코어(_) ex) role_type
name
속성을 명시적으로 사용해야 함@Column(name="role_type") //언더스코어로 구분
String roleType //카멜 표기법으로 구분
hibernate.ejb.naming_strategy
속성<property name="hibernate.ejb.naming_strategy"
value="org.hibernate.cfg.ImprovedNamingStrategy" />
org.hibernate.cfg.ImprovedNamingStrategy
클래스