Spring/자바 ORM 표준 JPA프로그래밍

엔티티 매핑

hyun-1200 2022. 5. 6. 16:51

 1. 객체와 테이블 매핑

@Entity

  • @Entity 가 붙은 클래스는 JPA가 관리, 엔티티라 한다.
  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity는 필수이다.
  • 주의점

: 기본생성자 필수 ( 파라미터가 없는 public 또는 protected 생성자)

: final 클래스, enum, interface, inner 클래스 사용 X

: 저장할 필드에 final 사용 X 

  • name 속성 

- JPA에서 사용할 엔티티 이름을 지정한다.

- 기본값 : 클래스 이름을 그대로 사용 ( ex. Member)

- 같은 클래스 이름이 없으면 가급적 기본값을 사용한다.

 

@Table 

  • 엔티티와 매핑할 테이블 지정
속성 기능 기본값
name 매핑할 테이블 이름  엔티티 이름 사용 
catalog 데이터베이스 catalog 매핑   
schema 데이터베이스 schema 매핑  
uniqueConstraint
(DDL)
DDL 생성시에 유니크 제약 조건 생성   

 

* 데이터베이스 스키마 자동 생성

- DDL을 애플리케이션 실행 시점에 자동 생성

- 테이블 중심 -> 객체 중심

- 데이터 베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성

- 생성된 DDL은 개발장비에서만 사용하고, 운영서버에서는 사용하지 않거나 적절히 다듬은 후 사용

- 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.


2. 필드와 컬럼 매핑

예시. 

1. 회원은 일반회원과 관리자로 구분

2. 회원 가입일과 수정일이 있어야 한다.

3. 회원을 설명할 수 있는 필드가 있어야 하며, 해당 필드는 길이 제한이 없다.

 

매핑 어노테이션 정리

 

@Column : 컬럼 매핑 

  • name :   필드와 매핑할 테이블의 컬럼 이름. 기본값은 객체의 필드 이름
  • insertable, updatable :등록, 변경 가능 여부. 기본값은 TRUE. 
  • nullable(DDL) : null값의 허용여부 설정. false로 설정 시, DDL 생성 시 not null 제약조건이 붙는다. 
  • unique(DDL) : @Table 의 UniqueConstraints와 같지만 한 컬럼에 간단한 유니크 제약조건을 걸 때 사용한다. 
  • columnDefinition(DDL): 데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) defulat 'EMPTY' 
  • length(DDL) : 문자 길이 제약조건. String 타입에만 사용한다.
  • precision, scale(DDL) : BigDecimal 타입에서 사용한다. (BigInteger도 사용할 수 있다.) precision은 소수점을 포함한 전체 자릿수를, scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. 

@Temporal : 날짜 타입 매핑 

  • 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
  • 참고: LocalDate, LocalDateTime 을 사용할 때는 생략 가능
  • value
    • TemporalType.Date : 날짜, 데이터베이스 date 타입과 매핑 ex.) 2022-05-06 
    • TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 ex.) 11:11:11
    • TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 ex) 2022-05-06 11:11:11 

@Enumerated : enum 타입 매핑

  • 자바 enum 타입을 매핑할 때 사용.
  • 주의 ! ORDINAL 사용 XXX 
  • value : 
    • EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
    • EnumType.STRING: enum 이름을 데이터베이스에 저장 
    • 기본값은 EnumType.ORDINAL 

@Lob : BLOB, CLOB 매핑

  • 데이터베이스 BLOB, CLOB 타입과 매핑
  • @Lob에는 지정할 수 있는 속성이 없다.
  • 매핑하는 필드 타입이 문자면 CLOB, 나머지는 BLOB 매핑
    • CLOB : String, char[], java.sql.CLOB
    • BLOB :  byte[], java.sql.BLOB 

@Transient : 특정필드를 컬럼에 매핑하지 않음 ( 매핑 무시) 

  • 필드매핑X , 데이터베이스에 저장X, 조회 X 
  • 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
  • ex .   @Transient private Integer tmp; 

3. 기본 키 매핑

@Id : 직접 할당

@GeneratedValue : 자동생성  

 

@GeneratedValue ( strategy = GenerationType.IDENTITY ) 와 같이 사용 

  • IDENTITY : 데이터베이스에 위임. MYSQL
  • SEQUENCE: 데이터베이스 시퀀스 오브젝트 사용. ORACLE. @SequenceGenerator 필요
  • TABLE: 키 생성용 테이블 사용. 모든 DB에서 사용. @TableGenerator 필요
  • AUTO : 방언에 따라 자동 지정, 기본 값 

* IDENTITY 전략

  • 기본 키 생성을 데이터베이스에 위임
  • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용 (ex. MySQL 의 AUTO_INCREMENT) 
  • JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행
  • AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 id값을 알 수 있음
  • IDENTITY 전략은 em.persist() 시점에 즉시 insert SQL 실행하고 DB에서 식별자를 조회 

 

 

* SEQUENCE 전략

  • 데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트 ( ex. 오라클 시퀀스)
  • Oracle, PostgreSQL, DB2, H2 데이터베이스에서 사용 
  • @SequenceGenerator 필수

  • @SequenceGenerator 속성들
    • name: 식별자 생성기 이름
    • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름 
    • initialValue : DDL 생성시에만 사용. 시퀀스 DDL을 생성할 때 처음 1 시작하는 수를 지정한다. 기본값 1
    • allocationSize: 시퀀스 한번 호출에 증가하는 수. 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다. 기본값이 50으로 설정되어있으니 주의.
    • catalog, schema : 데이터베이스 catalog, schema 이름 

 

( 해당 글은 인프런- 자바 ORM 표준 JPA 프로그래밍 수업 및 제공되는 자료를 바탕으로 작성하였습니다. ) 

'Spring > 자바 ORM 표준 JPA프로그래밍' 카테고리의 다른 글

고급매핑 : 상속관계 매핑 /@MappedSuperclass  (0) 2022.05.10
다양한 연관관계 매핑  (0) 2022.05.08
연관관계 매핑 기초  (0) 2022.05.07
영속성 컨텍스트  (0) 2022.05.05
JPA 소개  (0) 2022.05.05