객체와 테이블 매핑
JPA에서는 @Entity
와 @Table
어노테이션을 통해 객체와 테이블을 매핑한다.
@Entity
JPA에서 @Entity
어노테이션은 자바 클래스를 데이터베이스의 테이블과 매핑하기 위해 사용하며, 이 어노테이션이 선언된 클래스는 JPA가 관리하는 영속 객체(Entity)가 된다. 파라미터가 없는 기본 생성자가 필요하며, @Id
로 기본키(Primary Key)를 지정해야한다.
주요 속성
- name:
- 객체의 이름을 지정하며, 지정하지 않으면 클래스명이 이름이 된다.
- JPQL에서 객체를 구분하는 데 사용된다.
@Entity(name = "User")
public class Member {
...
}
@Table
@Table
어노테이션은 객체가 매핑될 실제 데이터베이스 테이블의 이름이나 세부 정보를 지정할 때 사용한다. 보통 @Entity
와 함께 사용되며, 추가적으로 테이블명, 스키마, 인덱스, 고유 제약 조건 등 다양한 정보를 설정할 수 있다.
주요 속성
- name: 매핑할 테이블명 지정, 지정하지 않으면 클래스명이 테이블명이 된다.
- schema: 매핑할 스키마명 지정
- catalog: 매핑할 카탈로그명 지정
- uniqueConstraints: 테이블에 고유 제약 조건(Unique 제약 조건) 설정
- indexes: 테이블에 인덱스 설정
데이터베이스 스키마 자동 생성
JPA는 애플리케이션 실행 시점에 DDL을 자동으로 생성한다. 이때 테이블 중심이 아닌 객체 중심으로 생성하고, persistence.xml
에서 설정한 데이터베이스 방언을 활용하여 데이터베이스에 맞는 적절한 DDL을 생성한다. 하지만 이렇게 생성된 DDL은 개발 환경에서만 사용하고, 운영서버에서는 사용하지 않거나 적절히 다듬은 후 사용해야 한다.
데이터베이스 스키마 자동 생성과 관련해서는 persistence.xml
의 hibernate.hbm2ddl.auto
속성으로 지정할 수 있다. 주의할 점이 있다면 운영 환경에서 create, create-drop, update를 사용하면 절대 안 된다. 'update 정도는 써도 되지 않나?' 싶지만, 주요 테이블에 ALTER 잘못 날리면 서비스 장애가 발생할 가능성이 높다.
주요 속성
- create: 애플리케이션 실행 시 기존 테이블 DROP → 신규 테이블 CREATE
- create-drop: 애플리케이션 실행 시 기존 테이블 DROP → 신규 테이블 CREATE → 종료 시 DROP
- update: 변경된 내용만 ALTER
- validate: 객체와 테이블이 정상 매핑되었는지만 확인
- none: 미사용
필드와 컬럼 매핑
약간의 요구사항이 있었다.
- 회원은 일반회원과 관리자로 구분해야 한다.
- 회원가입일과 수정일이 있어야한다.
- 회원을 설명할 수 있는 필드가 있으며, 이 필드는 길이 제한이 없다.
...
@Entity
public class Member {
@Id
private Long id;
@Column(name = "username")
private String name;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
필드와 컬럼 매핑 시 사용하는 어노테이션과 주요 속성이다.
- @Column: 필드와 컬럼 매핑. 세부 속성값을 설정하여 구체적으로 지정가능하고 생략 가능(생략 시 기본값 적용)
- name: 매핑할 컬럼 이름 지정(기본값: 필드명)
- nullable: 컬럼의 NULL 허용 여부 지정(기본값: true)
- unique: 고유 제약 조건 생성(기본값: false)
- length: 문자열 컬럼의 최대 길이 지정(String 타입에만 적용 / 기본값: 255)
- columnDefinition: 데이터베이스 컬럼 정의 직접 입력(SQL 타입 및 디폴트 등)
- insertable/updatable: 해당 필드를 INSERT/UPDATE SQL에 포함시킬지 여부(기본값: true)
- precision/scale: BigDecimal/BigInteger 타입에서 전체 자릿수, 소수점 이하 자릿수 지정
- table: 여러 테이블에 매핑할 때 사용하는 옵션
- @Enumerated: enum 타입 필드와 컬럼 매핑
- value: 기본값 EnumType.ORDINAL이나 ORDINAL은 사용하지 않는 것을 권장
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장(0, 1, 2 ...)
- EnumType.STRING: enum 이름을 데이터베이스에 저장
- value: 기본값 EnumType.ORDINAL이나 ORDINAL은 사용하지 않는 것을 권장
- @Temporal: 날짜/시간 타입 필드와 컬럼 매핑(java.util.Date, java.util.Calendar)
- @Lob: Large Object 필드와 컬럼 매핑(String→CLOB, byte[]→BLOB)
- @Transient: 필드를 컬럼과 매핑하지 않음(메모리상에서 임시로 사용하는 필드에 사용)
기본키 매핑
기본키 매핑 방법은 @Id
어노테이션만 사용하여 직접 값을 입력하거나, @GeneratedValue
어노테이션을 사용하여 자동으로 생성하여 입력할 수 있다. @GeneratedValue
어노테이션의 주요 전략은 IDENTITY, SEQUENCE, TABLE, AUTO 4가지가 있다.
- IDENTITY: 데이터베이스에 위임
- 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용
- JPA는 트랜잭션 커밋 시점에 INSERT SQL 실행
- IDENTITY 전략 사용 시 em.persist() 시점에 즉시 INSERT SQL 실행하여 DB에서 ID값 조회
- SEQUENCE: 데이터베이스 스퀀스 오브젝트 사용
- 주로 ORACLE, PostgreSQL, DB2, H2에서 사용
- @SequenceGenerator 필요
- name: 식별자 생성기 이름
- sequenceName: 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue: DDL 생성 시에만 사용되며, 처음 시작하는 수 지정
- allocationSize: 시퀀스 한 번 호출에 증가하는 수(기본값: 50)
- 데이터베이스 스퀀스 설정이 하나씩 증가이면, 반드시 1로 설정
- catalog, schema: 데이터베이스 catalog, schema 이름
- TABLE: 키 생성용 테이블 사용
- 모든 데이터베이스에서 사용 가능하나, 성능이 좋지 못함
- @TableGenerator 필요
- name: 식별자 생성기 이름
- table: 키 생성 테이블 이름(기본값: hibernate_sequences)
- pkColumnName: 시퀀스 컬럼 이름(기본값: sequence_name)
- valueColumnName: 시퀀스 값 컬럼 이름(기본값: next_val)
- pkColumnValue: 키로 사용할 값 이름(기본값: 객체명)
- initialValue: 초기값, 마지막으로 생성된 값 기준(기본값: 0)
- allocationSize: 시퀀스 한 번 호출에 증가하는 수(기본값: 50)
- catalog, schema: 데이터베이스 catalog, schema 이름
- uniqueConstraints: 고유 제약 조건 지정
- AUTO: 데이터베이스 방언에 따라 자동 지정(기본값)
실전 예제
요구사항 분석과 기본 매핑인데, 강의에서 신규 프로젝트 생성하였으나 테스트 하던 프로젝트에 추가했다.
https://github.com/hongbre/jpa-basic
GitHub - hongbre/jpa-basic
Contribute to hongbre/jpa-basic development by creating an account on GitHub.
github.com
'스터디 > JPA' 카테고리의 다른 글
JPA 스터디2 - 3 (3) | 2025.07.30 |
---|---|
JPA 스터디2 - 2 (2) | 2025.07.14 |
JPA 스터디2 - 1 (1) | 2025.07.13 |
JPA 스터디1 - 3 (0) | 2025.07.01 |
JPA 스터디1 - 2 (3) | 2025.06.16 |