본문 바로가기

Backend study/JPA

엔티티 매핑(Entity Mapping)

JPA에서 엔티티 매핑은 객체 지향적으로 설계된 엔티티 클래스데이터베이스 테이블에 매핑하는 과정이다. JPA는 객체와 관계형 데이터베이스의 패러다임 불일치를 해결하기 위해 다양한 매핑 방식을 제공한다. 엔티티 클래스는 주로 테이블, 필드, 컬럼, 기본 키 등의 정보와 매핑되며, 이를 통해 JPA는 SQL을 자동으로 생성하고 데이터베이스와 상호작용한다.

 

1. @Entity

@Entity는 JPA에서 필수적인 어노테이션으로, 해당 클래스가 JPA 엔티티임을 명시한다. JPA는 이 어노테이션이 선언된 클래스를 기준으로 매핑 정보를 설정하고 관리한다.

특징

  • @Entity가 선언된 클래스는 반드시 기본 생성자가 있어야 한다.(파라미터 없는 public/protected 생성자)
  • 클래스에 final, abstract, enum, interface 등의 제약이 없어야 한다.
  • 클래스 이름이 기본적으로 데이터베이스의 테이블 이름과 매핑된다. (물론, 이 이름을 @Table로 수정할 수 있다.)
@Entity
public class Member {
    @Id
    private Long id;

    private String name;
}

위 예시에서 Member 클래스는 데이터베이스의 member 테이블과 매핑되며, id 필드는 기본 키로 사용된다.

 

2. @Table

@Table 어노테이션은 엔티티 클래스가 매핑될 데이터베이스 테이블의 이름과 속성을 정의한다. @Entity와 함께 사용되며, 기본적으로는 클래스 이름을 테이블 이름으로 사용하지만, @Table을 통해 이를 커스터마이징할 수 있다.

@Table 속성

  • name: 매핑할 테이블의 이름을 지정한다.
  • schema: 사용할 스키마를 지정한다.
  • catalog: 사용할 카탈로그를 지정한다.
  • uniqueConstraints: 유니크 제약 조건을 설정할 수 있다.
  • indexes: 테이블에 인덱스를 설정할 수 있다.
@Entity
@Table(name = "members", schema = "public")
public class Member {
    @Id
    private Long id;

    private String name;
}

위 예시는 Member 클래스가 데이터베이스의 public.members 테이블과 매핑되도록 설정한 예시이다.

 

3. 다양한 매핑 사용

JPA는 객체와 데이터베이스 간의 매핑을 더 세밀하게 조정할 수 있도록 다양한 어노테이션을 제공한다. 이들을 통해 복잡한 데이터 모델링을 쉽게 처리할 수 있다.

1) @Column

  • @Column은 엔티티 필드를 데이터베이스의 컬럼에 매핑한다. 기본적으로 필드 이름이 컬럼 이름과 같지만, @Column 어노테이션을 사용하면 컬럼의 세부 속성(길이, 타입, 제약 조건 등)을 정의할 수 있다.
@Column(name = "member_name", length = 50, nullable = false)
private String name;
  • name: 매핑할 데이터베이스 컬럼 이름을 지정한다.
  • length: 문자열 타입 컬럼의 길이를 설정한다.
  • nullable: true이면 컬럼이 NULL 값을 허용하고, false이면 허용하지 않는다.

2) @Id

  • @Id는 엔티티의 기본 키를 설정하는 어노테이션이다. 엔티티는 반드시 하나 이상의 @Id 필드를 가져야 하며, 기본 키는 엔티티의 고유성을 보장한다.
@Id
private Long id;

3) @GeneratedValue

  • @GeneratedValue는 기본 키가 자동으로 생성되도록 설정하는 어노테이션이다. 이때 전략을 지정할 수 있다.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
  • AUTO: JPA가 자동으로 선택한 전략을 사용한다. 보통 데이터베이스에 따라 자동 선택된다.
  • IDENTITY: 데이터베이스의 IDENTITY 컬럼을 사용하여 기본 키를 생성한다.
  • SEQUENCE: 데이터베이스의 시퀀스 객체를 사용하여 기본 키를 생성한다.
  • TABLE: 별도의 테이블을 이용하여 기본 키를 관리한다.

4) @Temporal

  • @Temporal은 날짜와 시간을 매핑할 때 사용된다. 자바의 Date나 Calendar 타입을 데이터베이스의 날짜/시간 형식으로 매핑한다.
@Temporal(TemporalType.DATE)
private Date birthDate;
  • TemporalType.DATE: 날짜만 매핑 (년-월-일)
  • TemporalType.TIME: 시간만 매핑 (시-분-초)
  • TemporalType.TIMESTAMP: 날짜와 시간 모두 매핑 (년-월-일 시-분-초)

5) @Enumerated

  • @Enumerated는 자바의 enum 타입을 데이터베이스 컬럼에 매핑할 때 사용된다. 기본적으로 ORDINAL(숫자값) 방식으로 저장되며, STRING으로 설정할 수도 있다.
@Enumerated(EnumType.STRING)
private RoleType role;
  • EnumType.ORDINAL: 열거형의 순서 값(정수)을 저장
  • EnumType.STRING: 열거형 이름(문자열)을 저장

6) @Lob

  • @Lob은 Large Object 데이터를 매핑할 때 사용한다. String은 CLOB(텍스트형 대용량 데이터), byte[]는 BLOB(바이너리형 대용량 데이터)로 매핑된다.
@Lob
private String description;

 

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

JPA는 애플리케이션이 실행될 때, 엔티티 클래스에 대한 정보를 바탕으로 데이터베이스의 스키마를 자동으로 생성할 수 있다. 이를 통해 데이터베이스 테이블을 수동으로 생성할 필요 없이, JPA가 정의한 엔티티 기반으로 자동으로 테이블을 만들거나 변경할 수 있다.

hibernate.hbm2ddl.auto 설정

JPA는 hibernate.hbm2ddl.auto 속성을 통해 DDL(Data Definition Language)을 자동으로 생성할 수 있다. 이 설정은 persistence.xml 또는 application.properties에 설정할 수 있다.

  • create: 애플리케이션 실행 시 스키마를 새로 생성합니다. 기존 데이터는 모두 삭제된다.
  • create-drop: 애플리케이션 실행 시 스키마를 생성하고, 종료 시점에 스키마를 삭제한다.
  • update: 기존 스키마를 업데이트한다. 새로운 엔티티에 대한 테이블을 생성하고, 기존 엔티티는 그대로 유지한다.
  • validate: 데이터베이스 스키마가 엔티티 매핑과 일치하는지 검증한다.
  • none: 아무 동작도 하지 않는다.
spring.jpa.hibernate.ddl-auto=update

위 설정은 JPA가 애플리케이션 시작 시 엔티티 매핑 정보를 바탕으로 테이블을 자동으로 업데이트하도록 설정한 예시이다.

 

5. DDL 생성 기능

JPA는 엔티티 매핑을 통해 자동으로 데이터베이스 DDL(Data Definition Language)을 생성하는 기능을 제공한다. 이는 개발 중 테이블 생성 및 수정 작업을 자동화하여 개발 생산성을 높이는 데 유용한다.

@Column 어노테이션의 DDL 관련 속성

  • nullable: false로 설정하면, DDL 생성 시 NOT NULL 제약 조건을 설정한다.
  • unique: true로 설정하면, DDL 생성 시 UNIQUE 제약 조건을 설정한다.
  • length: String 타입의 경우 컬럼 길이를 설정할 수 있다.
  • precision, scale: BigDecimal 타입의 경우 소수점 자릿수 설정이 가능한다.
@Column(name = "salary", nullable = false, precision = 10, scale = 2)
private BigDecimal salary;

위 예시는 salary 컬럼에 대해 소수점 이하 2자리까지의 숫자를 저장할 수 있는 NOT NULL 제약 조건을 설정한 예시이다.

 

6. 기본 키 매핑

JPA에서 기본 키는 각 엔티티의 고유성을 보장하는 필수 요소이다. 기본 키는 @Id 어노테이션을 통해 매핑되며, 자동 생성 기능을 제공하는 @GeneratedValue를 사용해 자동으로 관리할 수도 있다.

기본 키 생성 전략

  • AUTO: JPA 구현체가 자동으로 선택하는 기본 키 생성 전략이다.
  • IDENTITY: 기본 키를 데이터베이스의 IDENTITY 컬럼을 통해 자동 생성한다. 주로 MySQL, PostgreSQL에서 사용된다.
  • SEQUENCE: 데이터베이스의 시퀀스 객체를 사용하여 기본 키를 생성한다. 주로 Oracle에서 사용된다.
  • TABLE: 별도의 테이블을 사용하여 기본 키를 관리한다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

7. 필드와 컬럼 매핑

JPA에서 필드와 컬럼 매핑은 엔티티의 필드를 데이터베이스의 컬럼과 매핑하는 과정이다. JPA는 필드 이름을 기본적으로 컬럼 이름으로 매핑하지만, 이를 @Column을 통해 커스터마이징할 수 있다.

@Column 어노테이션

  • name: 매핑할 컬럼의 이름을 지정한다.
  • nullable: true이면 컬럼이 NULL 값을 허용한다. false이면 허용하지 않는다.
  • unique: true로 설정하면 유니크 제약 조건을 설정한다.
  • length: 문자열 타입의 경우 컬럼 길이를 설정할 수 있다.
  • precision, scale: 숫자 타입의 경우, 소수점 자리 수를 설정할 수 있다.
@Column(name = "email", nullable = false, unique = true, length = 100)
private String email;

위 예시에서는 email 필드를 NOT NULL 제약 조건과 UNIQUE 제약 조건이 있는 100자 길이의 email 컬럼에 매핑하고 있다.

 

  • 엔티티 매핑은 JPA가 객체를 데이터베이스 테이블과 연결하는 핵심 개념이다.
  • @Entity는 클래스를 엔티티로 선언하며, @Table은 엔티티가 매핑될 테이블을 정의한다.
  • 기본 키 매핑은 @Id와 @GeneratedValue로 처리할 수 있으며, 다양한 매핑 어노테이션으로 컬럼, 관계, 열거형, 대용량 데이터 등을 처리할 수 있다.
  • JPA는 데이터베이스 스키마 자동 생성 기능을 통해 개발 중 테이블을 자동으로 생성하거나 업데이트할 수 있으며, DDL 관련 기능도 제공한다.
728x90

'Backend study > JPA' 카테고리의 다른 글

고급 매핑  (0) 2024.10.29
다양한 연관관계 매핑  (0) 2024.10.25
연관관계 매핑 기초  (1) 2024.10.22
영속성 관리  (0) 2024.10.17
JPA란?  (0) 2024.10.07