[JPA] Chapter 4. 엔티티 매핑 1 - 객체-테이블
들어가기 앞서
이 글은 김영한 님의 저서 「자바 ORM 표준 JPA 프로그래밍」을 학습한 내용을 정리한 글입니다. 모든 출처는 해당 저서에 있습니다.
-
JPA 사용의 핵심 = 엔티티와 테이블을 정확히 매핑하는 것
-
매핑 정보 기술 방법으로는 XML과 어노테이션이 존재
어노테이션을 사용하는 쪽이 좀 더 쉽고 직관적이므로, 이번 챕터에서 XML을 이용한 방법은 따로 다루지 않음
→ XML을 이용한 매핑 보러 가기 -
JPA의 대표적인 매핑 어노테이션
매핑 어노테이션 객체-테이블 @Entity
,@Table
기본키 @Id
필드-컬럼 @Column
연관관계 @ManyToOne
,@JoinColumn
=> 이번 챕터에서는 객체-테이블, 기본키, 필드-컬럼 매핑만 설명한다.
4.1 @Entity
✅ 개요
- 테이블과 매핑할 클래스 지정 → 필수
- 적용한 클래스 → 엔티티
✅ 속성
속성 | 기능 | 기본값 |
---|---|---|
name | ◾ JPA에서 사용할 엔티티 이름 지정 ◾ 보통 기본값인 클래스 이름 사용 ◾ 다른 패키지에 동명의 엔티티 클래스 존재 → 이름 지정하여 충돌 방지 | 미설정 시 클래스 이름 그대로 사용 ex) Member |
✅ 주의사항
- 기본 생성자 필수(파라미터 없는
public
또는protected
)
→ JPA가 엔티티 객체 생성시 기본 생성자 사용하기 때문- java에서의 생성자 생성
- 생성자가 존재하지 않는 경우 → 기본 생성자 자동 생성
- 생성자가 존재하는 경우 → 직접 생성 필요
- 생성자가 존재하지 않는 경우 → 기본 생성자 자동 생성
- java에서의 생성자 생성
final
,enum
,interface
,inner
클래스에 사용 불가- 저장할 필드에
final
사용 금지
4.2 @Table
✅ 개요
- 엔티티와 매핑할 테이블 지정
- 생략시 매핑한 엔티티 이름을 테이블 이름으로 사용
✅ 속성
속성 | 기능 | 기본값 |
---|---|---|
name | 매핑할 테이블 이름 | 엔티티 이름 사용 |
catalog | catalog 기능이 있는 데이터베이스에서 catalog 매핑 | |
schema | schema 기능이 있는 데이터베이스에서 schema 매핑 | |
uniqueConstraints (DDL) | ◾ DDL 생성 시 유니크 제약조건 생성 ◾ 2개 이상의 복합 유니크 제약조건 생성 가능 ◾ 스키마 자동 생성 기능을 사용하여 DDL 생성할 때만 사용 |
4.3 데이터베이스 스키마 자동 생성
JPA는 매핑정보(사용 중인 테이블 및 컬럼)와 데이터베이스 방언을 사용하여 데이터베이스 스키마를 자동 생성함
✅ 사용
📝 persistence.xml
에 속성 추가
<!-- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성 -->
<property name="hibernate.hbm2ddl.auto" value="create" />
<!-- 속성 'true' → 콘솔에 실행되는 테이블 생성 DDL 출력 -->
<property name="hibernate.show_sql" value="true" />
-
hibernate.hbm2ddl.auto
-
속성
옵션 설명 create 기존 테이블을 삭제 후 새로 생성
→ DROP + CREATEcreate-drop create + 애플리케이션 종료시 생성한 DDL 제거
→ DROP + CREATE + DROPupdate 데이터베이스 테이블과 매핑정보 비교하여 변경 사항만 수정 validate ◾ 데이터베이스 테이블과 엔티티 매핑정보 비교하여
차이 존재시 경고 남기고 애플리케이션 실행 x
◾ DDL 수정 xnone ◾ 유효하지 않은 옵션 값
◾ 자동 생성 기능 사용 원하지 않는 경우
→hibernate.hbm2.ddl.auto
속성 삭제로도 가능 -
운영 중인 데이터베이스의 테이블이나 컬럼 삭제 가능
→ 개발 서버나 개발 단계에서만 사용할 것💡 개발 환경에 따른 추천 전략
- 개발 초기 단계 →
create
또는update
- (초기화 상태 + 테스트 자동화) 개발자 환경 및 CI 서버
→create
또는create-drop
- 테스트 서버 →
update
또는validate
- 스테이징 및 운영 서버 →
validate
또는none
- 개발 초기 단계 →
-
-
javax.persistence.schema-generation.database.action
- JPA 2.1부터 스키마 자동 생성 기능 표준 지원
- 지원 옵션
- none
- create
- drop-and-create
- drop
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
📝 애플리케이션 실행 및 결과
- DDL 콘솔 출력
- 기존 테이블 삭제 후 다시 생성
- 클래스에 추가한 필드들의 타입을 테이블에서 사용할 타입으로 자동 변환
- 데이터 베이스 방언에 따라 달라짐
ex) 오라클
✅ 장점
- 엔티티와 테이블의 매핑 방식 이해 용이
- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성
→ 개발자가 테이블 직접 생성시 소요 비용 절감
✅ 주의사항
완벽하지 않으므로 개발 환경에서 사용하거나 매핑 방식 참고 용도로 사용
📚 이름 매핑 전략 변경
✅ 단어-단어 구분 표기법
자바 : 카멜(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
클래스- 하이버네이트에서 제공하는 클래스
- 테이블 명 및 컬럼 명 생략시 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑
- 적용 예시
- 변경 전
- 변경 후
- 변경 전
Author And Source
이 문제에 관하여([JPA] Chapter 4. 엔티티 매핑 1 - 객체-테이블), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yu-jin-song/JPA-Chapter-4.-엔티티-매핑-1-객체-테이블저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)