Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 티스토리챌린지
- 백엔드 부트캠프
- UXUI챌린지
- Be
- 디자인강의
- UXUIPrimary
- 백엔드개발자
- 디자인챌린지
- 환급챌린지
- 오픈챌린지
- JPA
- 오블완
- 국비지원취업
- 자바
- 디자인교육
- Spring
- 국비지원교육
- 오픈패스
- 내일배움카드
- mysql
- 객체지향
- Java
- 부트캠프
- UXUI기초정복
- 국비지원
- 백준
- KDT
- OPENPATH
- baekjoon
- 패스트캠퍼스
Archives
- Today
- Total
군만두의 IT 개발 일지
[스터디10] 04. 엔티티 매핑 본문
목차
4장. 엔티티 매핑
- 객체와 테이블 매핑: @Entity, @Table
- 기본키 매핑: @Id
- 필드와 컬럼 매핑: @Column
- 연관관계 매핑: @ManyToOne, @JoinColumn
4.1 @Entity
- JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. @Entity가 붙은 클래스를 엔티티라고 부른다.
- 파라미터가 없는 기본 생성자는 필수다. (public 또는 protected)
- final 클래스, enum, interface, inner 클래스에는 사용할 수 없다. 저장할 필드에 final을 사용하면 안 된다.
| 속성 | 기능 | 기본값 |
| name | JPA에서 사용할 엔티티 이름을 지정한다. | 클래스 이름 |
▲ @Entity 속성
4.2 @Table
- @Table은 엔티티와 매핑할 테이블을 지정한다.
| 속성 | 기능 | 기본값 |
| name | 매핑할 테이블 이름 | 엔티티 이름 |
| catalog | catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다. | |
| schema | schema 기능이 있는 데이터베이스에서 schema를 매핑한다. |
▲ @Table 속성
4.4 데이터베이스 스키마 자동 생성
- JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원한다.
- JPA는 클래스의 매핑 정보와 데이터베이스 방언을 사용해서 데이터베이스 스키마를 생성한다.
- hibernate.show_sql = true로 설정하면 콘솔에 실행되는 테이블 생성 DDL(Data Definition Language)을 출력할 수 있다. DDL은 운영 환경에서 사용할 정도로 완벽하지 않으므로 개발 환경에서 사용하거나 매핑을 어떻게 해야 하는지 참고하는 정도로 사용하는 것이 좋다.
# 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성
<property name="hibernate.hbm2ddl.auto" value="create" />
| 옵션 | 설명 |
| create | 기존 테이블을 삭제하고 새로 생성한다. |
| create-drop | create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다. |
| update | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다. |
| validate | 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 예외를 발생시키고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다. |
| none | 자동 생성 기능을 사용하지 않는다. hibernate.hbm2ddl.auto 속성 자체를 삭제하는 방법도 있다. |
▲ hibernate.hbm2ddl.auto 속성
4.5 DDL 생성 기능
- @Column 매핑정보에 nullable = false을 지정하면 자동 생성되는 DDL에 not null 제약조건을 추가할 수 있다.
- @Column 매핑정보에 length 속성 값을 사용하면 자동 생성되는 DDL에 문자의 크기를 지정할 수 있다.
- @Table의 uniqueConstraints 속성은 유니크 제약조건을 추가할 수 있다.
- 이 기능들은 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다. 따라서 직접 DDL을 만든다면 사용할 필요가 없다.
4.6 기본키 매핑
- 데이터베이스마다 기본키(Primary Key)를 생성하는 방식이 다르고, JPA는 이 문제를 다음과 같이 해결한다.
- 직접 할당: 기본키를 애플리케이션에서 직접 할당한다.
- 자동 생성:
- IDENTITY: 기본키 생성을 데이터베이스에 위임한다.
- SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본키를 할당한다.
- TABLE: 키 생성 테이블을 사용한다.
- 기본키를 직접 할당하려면 @ID만 사용하고, 자동 생성 전략을 사용하려면 @Id에 @GeneratedValue를 추가하고 원하는 키 생성 전략을 선택한다.
4.6.1 기본키 직접 할당 전략
@Id
@Column(name = "id")
private String id;
- 기본키 직접 할당 전략: em.persist()로 엔티티를 저장하기 전에 애플리케이션에서 기본키를 직접 할당하는 방법
- @Id 적용 가능 자바 타입
- 자바 기본형
- 자바 래퍼형
- String
- java.util.Date
- java.sql.Date
- java.math.BigDecimal
- java.math.BigInteger
4.6.2 IDENTITY 전략
- IDENTITY: 기본키 생성을 데이터베이스에 위임하는 전략
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
- 데이터베이스에 값을 저장하고 나서야 기본키 값을 구할 수 있을 때 사용한다. 따라서 em.persist()가 호출되는 즉시 INSERT SQL이 데이터베이스에 전달된다.
- 이 전략을 사용하려면 @GeneratedValue에 strategy = GenerationType.IDENTITY로 지정하면 된다.\
4.6.3 SEQUENCE 전략
- SEQUENCE: 데이터베이스 시퀀스(유일한 값을 순서대로 생성하는 데이터베이스 오브젝트)를 사용해서 기본키를 생성하는 전략
- 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.
- @SequenceGenerator를 사용해서 시퀀스 생성기를 등록하고, sequenceName 속성의 이름을 지정하면 JPA가 이 시퀀스 생성기를 실제 데이터베이스의 시퀀스와 매핑한다. 키 생성 전략을 GenerationType.SEQUENCE로 설정하고 generator 속성으로 시퀀스 생성기를 선택한다.
| 속성 | 기능 | 기본값 |
| name | 식별자 생성기 이름 | 필수 |
| sequenceName | 데이터베이스에 등록되어 있는 시퀀스 이름 | hibernate_sequence |
| initialValue | DDL 생성 시에만 사용되며, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다. | 1 |
| allocationSize | 시퀀스 한 번 호출에 증가하는 수 | 50 |
| catalog, schema | 데이터베이스 catalog, schema 이름 |
▲ @SequenceGenerator 속성
4.6.4 TABLE 전략
- TABLE: 키 생성 전용 테이블을 하나 만들고 이름과 값으로 사용할 칼럼을 만들어 데이터베이스 시퀀스를 흉내내는 전략
- 테이블을 사용하므로 모든 데이터베이스에 적용할 수 있다.
- @TableGenerator를 사용해서 테이블 키 생성기를 등록한다. GenerationType.TABLE을 선택하고 @GeneratedValue.generator에 테이블 키 생성기를 지정한다.
- 시퀀스 대신 테이블을 사용한다는 것만 제외하면 SEQUENCE 전략과 내부 동작방식이 같다.
| 속성 | 기능 | 기본값 |
| name | 식별자 생성기 이름 | 필수 |
| table | 키 생성 테이블명 | hibernate_sequences |
| pkColumnName | 시퀀스 컬럼명 | sequence_name |
| valueColumnName | 시퀀스 값 컬럼명 | next_val |
| pkColumnValue | 키로 사용할 값 이름 | 엔티티 이름 |
| initialValue | 초기 값 | 0 |
| allocationSize | 시퀀스 한 번 호출에 증가하는 수 | 50 |
| catalog, schema | 데이터베이스 catalog, schema | |
| uniqueConstraints(DDL) | 유니크 제약 조건을 지정할 수 있다. |
▲ @TableGenerator 속성
4.6.5 AUTO 전략
- GenerationType.AUTO는 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.
- 예) 오라클 - SEQUENCE, MySQL - IDENTITY 등
- @GeneratedValue.strategy의 기본값은 AUTO다. 데이터베이스를 변경해도 코드를 수정할 필요가 없다.
4.7 필드와 컬럼 매핑: 레퍼런스
| 분류 | 매핑 어노테이션 | 설명 |
| 필드와 컬럼 매핑 | @Column | 컬럼을 매핑한다. |
| @Enumerated | 자바의 enum 타입을 매핑한다. | |
| @Temporal | 날짜 타입을 매핑한다. | |
| @Lob | BLOB, CLOB 타입을 매핑한다. | |
| @Transient | 특정 필드를 데이터베이스에 매핑하지 않는다. | |
| 기타 | @Access | JPA가 엔티티에 접근하는 방식을 지정한다. |
▲ 필드와 컬럼 매핑 분류
✔️ 복습하기
- @Entity 어노테이션이란?
- hibernate.hbm2ddl.auto 속성의 create와 update 옵션의 차이점은?
- 기본 키를 직접 할당할 때와 자동으로 생성할 때 사용하는 어노테이션은?
- Java의 enum 타입을 매핑할 때 사용하는 어노테이션은?

이 글은 『 자바 ORM 표준 JPA 프로그래밍』 책을 학습한 내용을 정리한 것입니다.
'학습일지 > Java' 카테고리의 다른 글
| [스터디10] 06. 다양한 연관관계 매핑 (0) | 2025.07.22 |
|---|---|
| [스터디10] 05. 연관관계 매핑 기초 (1) | 2025.07.19 |
| [스터디10] 03. 영속성 관리 (0) | 2025.07.04 |
| [스터디10] 02. JPA 시작 (0) | 2025.07.03 |
| [스터디10] 01. JPA 소개 (0) | 2025.06.28 |
Comments