1. 개요
김영한 님의 '자바 ORM 표준 JPA 프로그래밍 - 기본편' 을 들으면서 정리하는 포스팅입니다.
https://www.inflearn.com/course/ORM-JPA-Basic
자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런
김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도
www.inflearn.com
2. 테이블, 스키마 매핑
a. @Entity
- @Entity가 붙은 클래스는 JPA의 관리 대상이 된다.
- 테이블과 매핑할 클래스는 @Entity 어노테이션을 붙혀주면 된다.
- JPA 내부에서 기본 생성자를 사용하기에 public 또는 protected 레벨의 기본 생성자가 반드시 필요하다.
- final 클래스, enum, inteface, inner 클래스에서 사용할 수 없다.
- 반드시 PK를 지정해야 한다.
- PK 지정 시 @Id 어노테이션을 사용하면 된다.
- 필드 정의시 final은 사용하면 안된다.
속성 | 기능 | 기본값 |
name | JPA에서 사용할 Entity 이름 지정 | 클래스 이름을 그대로 사용(예: Member) |
사용 예시
- name 속성은 이름이 같은 클래스(엔티티)가 없으면 생략해도 좋다.
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자
@Entity(name = "Member")
public class Member {
@Id
private String id;
// 필드 정의 ...
}
b. @Table
- Entity와 매핑할 테이블 지정
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | Entity 이름(예: Member) |
catalog | DB catalog | |
schema | DB 스키마 매핑 | |
uniqueConstraints | DDL 생성 시 유니크 제약 조건 생성 |
- 스키마
- DB 내 논리적 그룹 또는 네임스페이스 역할(스키마 내 테이블이 존재)
- 예: company.member (여기서 company가 스키마, member가 테이블)
- catalog
- DB를 논리적으로 그룹화하는 것
- 여러 스키마를 그룹화하여 관리하는 방법
사용 예시
@Entity
@Table(
name = "member_table", // 테이블 이름 설정
schema = "public", // 스키마 이름 설정
catalog = "member_catalog", // 카탈로그 이름 설정
uniqueConstraints = { // 유니크 제약 조건 설정
@UniqueConstraint(columnNames = {"email"}) // email 컬럼에 유니크 제약 설정
}
)
public class Member {
@Id
private Long id; // 기본 키
private String name; // 이름
private String email; // 이메일 (유니크 제약)
}
3. DDL(테이블) 자동 생성 전략
- JPA는 테이블 자동 생성 기능을 지원한다.
- 옵션에 따라 애플리케이션 실행 시 테이블을 삭제 및 생성할 수 있다.
- DDL 문은 데이터베이스 별 방언이 달라진다.
- 개발 단계에서 매우 편리한 기능이다.
- 운영 환경에서는 테이블 전체 데이터가 날아갈 수 있으니 주의가 필요하다.
옵션 | 설명 | 사용 시기 |
create | 기존 테이블 삭제 후 다시 생성(DROP + CREATE) | 개발초기 |
create-drop | create와 같으나 애플리케이션 종료시점에 DROP (DROP + CREATE + DROP) | 개발초기 |
update | 변경분만 반영(엔티티 필드 추가 시 컬럼을 추가. 엔티티 필드 삭제는 아무런 영향 X) | 개발초기, 테스트 |
validate | 엔티티와 테이블이 제대로 매핑되었느지만 검사 | 스테이징, 운영 |
none | 아무런 동작하지 않음 | 스테이징, 운영 |
persistence.xml
<!-- 스키마 자동 생성 옵션-->
<property name="hibernate.hbm2ddl.auto" value="create"/>
DDL 생성 예시
4. 필드와 컬럼 매핑
지금까지 Entity와 Table을 매핑하는 방법을 소개했으니, 필드와 컬럼을 매핑하는 방법에 대해서 정리하겠다.
a. @Column
- DB 컬럼과 Entity 필드를 매핑할 때기능
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 필드 이름 |
insertable, updatable | insert, update 가능 여부 | TRUE |
nullable | null 허용 여부, false로 설정하면 DDL 생성 시 NOT NULL 제약 조건이 붙음. | TRUE |
unique | 유니크 제약 조건을 걸 때 사용. unique 키 설정은 @Table을 통해서 거는게 좋음(세부설정이 안되기 때문) |
FALSE |
columnDefinition | DB 컬럼 정보를 직접 정의 예) varchar(100) default ‘EMPTY' |
필드의 자바 타입과 방언 정보를 사용해서 |
length | 문자 길이 제약조건, String 타입만 가능 | 255 |
precision, scale | BigDecimal, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때 사용. |
0 |
b. @Enumerated
- Enum 타입과 DB 컬럼을 매핑할 때 사용한다.
속성 | 설명 | 기본값 |
value | EnumType.ORDINAL: 컬럼 매핑 시 enum 순서를 사용 EnumType.STRING: 컬럼 매핑 시 enum 이름을 사용 |
EnumType.ORDINAL |
EnumType.ORDINAL을 사용하면 안된다!!
ORDINAL은 DB 저장 시 Enum 순서(1, 2, 3)을 사용하기 때문에 Enum의 순서가 바꼈을 때 DB에 의도하지 않은 데이터가 저장될 수 있다.
EnumType.STRING 또는 @Convert를 사용하도록 하자.
c. @Temporal
- 날짜 타입(Date, Calendar)와 매핑할 때 사용한다.
- 자바8부터 LocalDate, LocalDateTime을 사용할 때 생략이 가능하므로 잘 사용하지 않는다.
속성 | 설명 |
value | TemporalType.DATE: DB date(날짜) 타입과 매핑(예: 2013-10-11) TemporalType.TIME: DB time(시간) 타입과 매핑(예: 13:12:31) TemporalType.TIMESTAMP: DB timestamp(날짜와 시간) 타입과 매핑(예: 2013-10-11 13:12:31) |
d. @Lob
- DB BLOB, CLOB 타입과 매핑할 때 사용한다.
- 속성이 없다.
- CLOB: String, char[], java.sql.CLOB
- BLOB: byte[], java.sql.BLOB
e. @Transient
- 필드와 DB 컬럼을 매핑하기 위해 사용되는 것이 아니다.
- DB와 아무 관련이 없는 메모리 상에서 임시로 어떤 값을 보관하고 싶을 때 사용한다.
'Programming > Java' 카테고리의 다른 글
[JPA] Entity 연관 관계 매핑(단방향/양방향, 연관관계주인, 다중성) (0) | 2024.12.13 |
---|---|
[JPA] JPA에서 PK를 다루는 방법(@Id, @GeneratedValue) (0) | 2024.12.12 |
[JPA] JPA 영속성 컨텍스트와 Entity 상태(비영속, 영속, 준영속, 삭제) (1) | 2024.12.06 |
[Java] ProcessBuilder로 시스템 명령어 수행하기 (0) | 2024.10.08 |
[Java] 클래스 생성과 인스턴스 생성 (1) | 2024.01.05 |