엔티티 매핑

2024. 4. 4. 02:12JAVA/스프링 데이터 JPA

1. @Entity

JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 한다. @Entity가 붙은 클래스틑 JPA가 관리하게 된다.

 

※ 주의사항

1. 기본 생성자는 필수다.

2. final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.

3. 저장할 필드에 final을 사용하면 안된다.

 

2. @Table

@Table은 엔티티와 매핑할 테이블을 지정한다. 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

 

※ 속성 

1. name : 매핑할 테이블 이름 

2. catalog : catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다.

3. schema : schema 기능이 있는 데이터베이스에서 schema를 매핑한다.

4. uniqueConstraints : DDL 생성 시에 유니크 제약 조건을 만든다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다.

 

3. 다양한 매핑 사용

roleType : 자바의 enum을 사용해서 회원의 타입을 구분한다.

createDate, lastModifiedDate : 자바의 날짜 타입은 @Temporal을 사용해서 매핑한다.

description : 회원을 설명하는 필드는 길이 제한이 없다. 따라서 데이터베이스의 VARCHAR 타입 대신에 CLOB 타입으로 저장해야 한다.

 

4. 데이터베이스 스키마 자동 생성

persistence.xml에 다음 속성을 추가한다.

<property name="hibernate.hbm2ddl.auto" value="create" />

 

이 속성을 추가하면 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성한다. 자동 생성되는 DDL은 지정한 데이터베이스 방언에 따라 달라진다. 스키마 자동 생성 기능을 사용하면 테이블을 직접 작성하는 수고를 덜을 수 있지만 완벽하지는 않으므로 개발 환경에서 사용하거나 매핑을 어떻게 해야 하는지 참고하는 정도로만 사용하는 것이 좋다.

 

※ 주의사항

운영 서버에서 create, create-drop, update처럼 DLL을 수정하는 옵션은 절대 사용하면 안된다.

 

5. DDL 생성 기능

스키마 자동 생성하기를 통해 만들어지는 DDL에 제약조건을 걸어보자.

@Entity
@Table(name="MEMBER")
public class Member {
	...
    
    @Column(name = "NAME", nullable = false, length = 10)
    private String username;
    
    ...
}

 

※ 주의사항

이런 기능들은 단지 DDL을 자동 생성할 때만 사용되고 JPA의 실행 로직에는 영향을 주지 않는다.

 

6. 기본 키 매핑

JPA가 제공하는 데이터베이스 기본 키 생성 전략은 다음과 같다.

1. 직접 할당 : 기본 키를 애플리케이션에서 직접 할당한다.

@Id
private String id;

 

2. 자동 생성 : 대리 키 사용 방식

- IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.

CREATE TABLE BOARD {
	ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
	DATA VARCHAR(255)
};

 

- SEQUENCE : 데이터베이스 시퀀스를 사용해서 기본 키를 할당한다.

CREATE SEQUENCE BOARD_SEQ START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE [sequenceName] START WITH [initialValue] INCREMENT BY [allocationSize]

 

- TABLE : 키 생성 테이블을 사용한다.

@Entity
@TableGenerator (
	name = "TABLE_1",
    table = "MY_SEQUENCES",
    pkColumnValue = "TABLE_1", allocationSize = 1
)
public class Test {
	@Id
	@GeneratedValue(strategy = GenerationType.TABLE, generator = "TABLE_1")
    ...
}

 

'JAVA > 스프링 데이터 JPA' 카테고리의 다른 글

다양한 연관관계 매핑  (0) 2024.04.18
연관관계 매핑 기초  (0) 2024.04.11
영속성 관리  (0) 2024.03.27
데이터베이스 스키마 자동 생성  (0) 2023.12.27
객체와 테이블 매핑  (0) 2023.12.24