Spring/Spring Data JPA

[자바 ORM 표준 JPA 프로그래밍] 4. 엔티티 매핑

noahkim_ 2023. 11. 28. 12:36

김영한 님의 "자바 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 자동 생성 기능을 사용하지 않습니다.