김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.
1. 엔티티 매핑
어노테이션 | 설명 |
주요 속성 및 주의사항
|
@Entity | 테이블과 매핑할 엔티티 지정 |
- 기본 생성자 필수
- final class, inner class 불가 - enum, interface 불가 |
@Table | 엔티티와 매핑할 테이블 지정 (생략 시 클래스명) |
-- name: 테이블명
-- schema, catalog: 스키마/카탈로그 -- uniqueConstraints: 유니크 제약조건 |
@Id | PK 매핑 | - 필수 지정 - 단독으로 사용할 경우 사용자가 직접 할당해야 함 |
- @GeneratedValue | PK 자동 할당 - 대리키 사용 (DB 벤더에 위임) |
GenerationType
-- AUTO: 현재 DB에 적합한 키 생성 전략을 자동으로 선택 -- IDENTITY: 기본 키 생성을 데이터베이스 벤더에게 위임 -- SEQUENCE: 데이터베이스 시퀀스를 사용해서 기본키를 할당 -- TABLE: 키 생성 테이블을 사용 |
예제) @Table
더보기
@Entity
@Table(name="user", catalog="spring_data_jpa")
public class User { ... }
- catalog: mysql의 데이터베이스를 의미함
@Entity
@Table(name="user", schema="test")
public class User { ... }
- schema: oracle의 사용자 개념과 동일한 개념
@Entity
@Table(
name = "users",
uniqueConstraints = @UniqueConstraint(columnNames = "email")
)
public class User {
@Id
@GeneratedValue
private Long id;
private String name;
private String email; // email 컬럼에 유니크 제약
}
- uniqueConstraints: 유니크 제약 조건
예제) GenerationType.SEQUENCE
더보기
@SequenceGenerator(
name = "BOARD_SEQ_GENERATOR",
sequenceName = "BOARD_SEQ",
initialValue = 1,
allocationSize = 1
)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "BOARD_SEQ_GENERATOR")
예제) GenerationType.TABLE
더보기
@TableGenerator(
name = "USER_TABLE_GENERATOR",
table = "USER_ID_TABLE",
pkColumnName = "pk_column",
valueColumnName = "value",
pkColumnValue = "USER",
initialValue = 100,
allocationSize = 1
)
@GeneratedValue(strategy = GenerationType.TABLE, generator = "USER_TABLE_GENERATOR")
private Integer id;
- 시퀀스를 지원하지 않는 데이터베이스에서 지원하는 방식 (MySQL)
CREATE TABLE USER_ID_TABLE (
pk_column VARCHAR(255) NOT NULL,
value INT NOT NULL,
PRIMARY KEY (pk_column)
);
INSERT INTO USER_ID_TABLE (pk_column, value) VALUES ('USER', 100);
- 초기값 row 추가 필수
2. 컬럼 매핑
ddl-auto로 생성된 테이블에 한해
어노테이션 | 설명 | 주요 속성 |
@Column | 필드 → 컬럼 매핑 |
- ddl-auto로 생성 시에 제약조건이 반영됨
-- name, nullable, unique, length -- columnDefinition -- precision: 유효소수점 (소수점을 포함한 전체 자리수) -- scale: 유효소수점 (소수의 자리수) |
@Enumerated | enum 매핑 (어떤 타입으로 DB에 저장할 것인지 결정) |
-- EnumType.ORDINAL -- EnumType.STRING |
@Temporal | 날짜 타입 매핑 |
- Java의 Date, Calendar 타입과 매칭됨
-- TemporalType.DATE -- TemporalType.TIME -- TemporalType.TIMESTAMP |
@Lob | 대용량 문자열 매핑 |
-- CLOB: 문자
-- BLOB: 바이너리 |
@Transient | DB 매핑 제외 |
- 영속성 컨텍스트에도 저장 안됨
|
@Access | 접근 방식 지정 |
-- AccessType.FIELD: 필드 접근
-- AccessType.PROPERTY 메서드 접근 (getter/setter) |
예제) @Lob
더보기
@Lob
@Column(name = "description")
private String description;
@Lob
@Column(name = "file_data")
private byte[] fileData;
Java 타입 |
@Lob 적용 시 DB 타입
|
String | CLOB |
char[] | CLOB |
byte[] | BLOB |
Serializable (직렬화 가능한 객체) | BLOB |
예제) @Access
더보기
@Entity
@NoArgsConstructor
@Access(AccessType.FIELD)
public class User {
@Id
private Long id;
private String name;
}
@Entity
@NoArgsConstructor
@Access(AccessType.PROPERTY)
public class User {
private Integer id;
private String name;
private String nickname;
public User(String name) {
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // AUTO_INCREMENT에 해당
public Integer getId() {
System.out.println("getId 호출");
return id;
}
public void setId(Integer id) {
System.out.println("setId 호출");
this.id = id;
}
public String getName() {
System.out.println("getName 호출");
return name;
}
public void setName(String name) {
System.out.println("setName 호출");
this.name = name;
}
public String getNickname() {
System.out.println("getNickname 호출");
return nickname;
}
public void setNickname(String nickname) {
System.out.println("setNickname 호출");
this.nickname = nickname;
}
}
setId 호출
setName 호출
setNickname 호출
3. 스키마 자동 생성
- spring.jpa.hibernate.ddl-auto 속성으로 전략 설정 가능
속성 | 설명 |
create | 새로 생성함 |
create-drop | 애플리케이션 종료 시, create 속성으로부터 생성된 테이블 제거 |
update | 테이블-엔티티 비교 후, 변경 사항만 수정 |
validate | 테이블 구조와 엔티티 정보간의 불일치 여부 (일관성 검증) - 에러 시, 애플리케이션 실행 종료됨 |
none | 자동 생성 기능을 사용하지 않습니다. |
'Spring > Spring Data JPA' 카테고리의 다른 글
[자바 ORM 표준 JPA 프로그래밍] 6. 다양한 연관관계 매핑 (0) | 2023.12.27 |
---|---|
[자바 ORM 표준 JPA 프로그래밍] 5. 연관관계 매핑 기초 (0) | 2023.12.27 |
[자바 ORM 표준 JPA 프로그래밍] 3. 영속성 관리 (0) | 2023.11.28 |
[자바 ORM 표준 JPA 프로그래밍] 2. JPA 시작 (0) | 2023.11.28 |
[자바 ORM 표준 JPA 프로그래밍] 1. JPA 소개 (0) | 2023.11.28 |