[JPA] 엔티티 매핑

2024. 11. 25. 10:41·JPA

 

 

1. 객체와 테이블 매핑

엔티티 매핑 소개

  • 객체와 테이블 매핑: @Table, @Entity
  • 필드와 컬럼 매핑: @Column
  • 기본 키 매핑: @Id
  • 연관관계 매핑: @ManyToOne, @JoinColumn

@Entity

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

주의 사항

  1. 기본 생성자 필수
  2. final 클래스, enum, interface, inner 클래스 사용불가
  3. 저장할 필드에 final 사용불가

@Table

@Table은 엔티티와 매핑할 테이블을 지정할 수 있다.

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용
catalog 데이터베이스 catalog 매핑  
schema 데이터베이스 schema 매핑  
uniqueConstraints DDL 생성 시에 유니크 제약 조건 생성  

 

 

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

JPA에서 제공하는 기본 기능중에 DDL을 애플리케이션 실행 시점에 자동 생성해주는 기능이 있다.

application.yml

 spring:
  jpa:
    hibernate:
      ddl-auto: create

설정 파일에 ddl-auto: create로 설정을 하면 된다.

이렇게 만들어주는 DDL은 데이터베이스에 맞게 자동으로 생성해준다. (오라클에서는 오라클 문법에 맞게, MySql에서는 MySql문법에 맞게) 이렇게 생성된 DDL은 개발 장비에서만 사용해야 한다. 

ddo-auto의 설정 옵션은 다음과 같다. 

옵션 설명
create 기존테이블에 삭제후 다시 생성
create-drop create와 같으나 종료시점에 drop table
update 변경분만 반영
validate 엔티티와 테이블이 정상 매핑되어있는지 확인
none 아무런 동작 X

 

DDL 생성할 때 조건도 설정할 수 있다. @Column 어노테이션안에 설정할 수 있다. DDL 생성 기능은 DDL을 자동생성할 때만 사용되고 JPA 실행로직에는 영향을 주지 않는다. 

    @Column(nullable = false, unique = true, length = 50)
    private String username;
옵션 설명 기본값
nullable 컬럼 NULL을 허용 여부 지정 true
unique 컬럼 UNIQUE 제약 조건 부여 false
length VARCHAR타입 컬럼 최대 길이 지정 255
precision BIGDECIMAL타입 소수점 자릿수를 포함한 전체 자릿수 지정 0
scale BIGDECIMAL타입 소수 자릿수 지점 0
name 데이터베이스에서 사용할 컬럼 이름 지정  
insertable 설정한 컬럼이 INSERT SQL 문에 포함 여부 지정 true
updatable 설정한 컬럼이 UPDATE SQL 문에 포함 여부 지정 true
conlumnDefinition 직접 데이터베이스 컬럼 정의 명시  

 

 

3. 필드와 컬럼 매핑

다음은 JPA에서 엔티티 클래스와 필드를 데이터베이스 컬럼에 매핑할 수 있는 주요 어노테이션이다.

어노테이션 설명 주요 속성 및 특징
@Transient 해당 필드를 데이터베이스에 매핑하지 않도록 지정 영속성 관리에서 제외
@Enumerated enum 타입의 필드를 데이터베이스에 매핑 저장 방식(String, Ordinal)
@Lob 큰 데이터를 저장하기 위해 사용(BLOB, CLOB) String 타입: CLOB, byte[] 타입: BLOB
@Temporal Date나 Calendar타입을 특정 날짜 시간 형식으로 매핑 TemporalType: Date, Time, TIMESTAMP 중 선택
@Basic 기본적인 매핑을 제공하며 필드의 로딩 전략 설정 fetch: 로딩 방식(EAGER, LAZY)

 

 

4. 기본 키 매핑

기본 키 매핑 어노테이션은 다음 두가지가 있다.

  1. @Id.
  2. @GeneratedValue

개발자가 ID를 직접 할당을 할려면 @Id 어노테이션만 붙이면 된다. 

ID를 자동할당(생성) 할려면 @GenerateValue를 붙이면 된다. 자동 할당 전략은 다음과 같다.

자동할당 전략

  • SEQUENCE: 데이터베이스 시퀀스를 사용하여 기본 키 값 생성
  • AUTO: 자동으로 적절한 키 생성 전략 선택
  • IDENTITY: 기본 키 생성을 데이터베이스에 위임 (ex: MySql Auto Increment)
  • UUID: 키 값을 전역 고유 식별자 형태로 생성
  • TABLE: 별도의 키 생성 테이블을 사용하여 기본 키 값을 관리

A. GenerationType.SEQUENCE

  • 설명: 데이터베이스 시퀀스를 사용하여 기본 키 값을 생성한다. 주로 Oracle, PostgreSQL과 같은 시퀀스를 지원하는 데이터베이스에서 사용된다.
  • 예시:
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;
@Entity 
@SequenceGenerator( 
        name = “MEMBER_SEQ_GENERATOR", 
        sequenceName = “MEMBER_SEQ", //매핑할 데이터베이스 시퀀스 이름 
        initialValue = 1, allocationSize = 1) 
public class Member { 
    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, 
            generator = "MEMBER_SEQ_GENERATOR") 
    private Long id; 
 }

B. GenerationType.AUTO

  • 설명: 자동으로 적절한 키 생성 전략을 선택한다. JPA 구현체가 사용하는 데이터베이스에 맞는 전략을 자동으로 결정한다.
  • 예시:
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

C. GenerationType.IDENTITY

  • 설명: 데이터베이스의 IDENTITY 컬럼을 사용하여 기본 키 값을 생성한다. 주로 MySQL, SQL Server 등에서 사용된다.
  • 특징:
    • ID값을 알 수 있는 시점은 데이터베이스에 INSERT를 해야 알 수 있다.
    • 하지만 JPA의 영속성 컨텍스트에 관리될려면 PK값이 있어야 한다. 
    • 그래서 원래는 commit할 때 INSERT 쿼리가 실행됐다면 IDENTITY에서는 persist( )를 호출하자마자 INSERT 쿼리를 실행한다.
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {

            Member member1 = new Member();
            member1.setUsername("member1");
            member1.setAge(20);
            System.out.println("==================");
            em.persist(member1);
            System.out.println("member1.getId() = " + member1.getId());
            System.out.println("==================");

            tx.commit();
        } // ..이하 생략

persist 호출하자마자 INSERT가 실행되는 것을 볼 수 있다

  • 예시:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

D. UUID

  • 설명: UUID(Universally Unique Identifier) 전략은 키 값을 전역 고유 식별자 형태로 생성한다다.
  • 특징:
    • 데이터베이스가 아닌 애플리케이션에서 UUID 값을 생성하며, 고유성이 보장된다.
    • UUID는 매우 긴 문자열이기 때문에 저장 공간이 더 필요할 수 있다.
    • 분산 시스템이나 클러스터 환경에서 중복되지 않는 키 값을 보장하는 데 유용
    • 사용 방법:
      • @GeneratedValue 어노테이션 대신 수동으로 UUID를 생성하거나, Hibernate의 @GenericGenerator를 사용할 수 있습니다.
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "uuid2")
private String id;

E. GenerationType.TABLE

  • 설명: 별도의 키 생성 테이블을 사용하여 기본 키 값을 관리하는 전략이다.
  • 특징:
    • 별도의 테이블을 생성하여 기본 키 값을 관리합니다. 이 테이블에서 고유 키 값을 읽어와 엔티티의 기본 키로 사용한다.
    • 특정 데이터베이스에 의존하지 않고, 모든 데이터베이스에서 일관되게 사용할 수 있는 전략이다.
    • 성능 면에서 다른 전략들에 비해 느릴 수 있다. 추가적인 테이블 접근이 필요하기 때문이다.
  • 예시:
     
@Id
@GeneratedValue(strategy = GenerationType.TABLE, generator = "table_generator")
@TableGenerator(name = "table_generator", table = "key_gen_table", pkColumnName = "gen_name", valueColumnName = "gen_value", allocationSize = 1)
private Long id;

'JPA' 카테고리의 다른 글

[JPA] JPA의 타입 (임베디드 타입, 값 타입, 컬렉션 타입)이란?  (1) 2024.12.20
[JPA] 프록시와 지연로딩, 즉시로딩  (0) 2024.11.26
[JPA] 연관관계 매핑  (0) 2024.11.25
[JPA] 영속성 전이 CASCADE, OrphanRemoval = true 이해 및 차이  (0) 2024.11.19
[JPA] JPA와 영속성 컨텍스트란?  (1) 2024.11.18
'JPA' 카테고리의 다른 글
  • [JPA] 프록시와 지연로딩, 즉시로딩
  • [JPA] 연관관계 매핑
  • [JPA] 영속성 전이 CASCADE, OrphanRemoval = true 이해 및 차이
  • [JPA] JPA와 영속성 컨텍스트란?
Economy98
Economy98
공부하고 기록하기
  • Economy98
    Economy_Dev
    Economy98
  • 전체
    오늘
    어제
    • 분류 전체보기 (74)
      • Spring Framework (11)
      • BOJ, Programmers (22)
      • Java (4)
      • JDBC (6)
      • JPA (9)
      • Spring Transaction (3)
      • Algorithm (1)
      • Web (5)
      • Projects (2)
        • 쇼핑몰 프로젝트 (0)
        • 열람실 & 도서관 프로젝트 (2)
      • Network (2)
      • 나의 공부방 (5)
      • 끄적끄적 (1)
      • Error Log (3)
      • CS (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • Github
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    정렬
    다이나믹 프로그래밍
    스프링부트
    스프링
    JPA
    그리디 알고리즘
    백준
    propagation
    예외 처리
    자바
    브루트포스 알고리즘
    java
    Spring
    백준 자바 풀이
    트랜잭션
    restful api
    jdbc
    자바 문제 풀이
    자바 문제
    백준 풀이
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Economy98
[JPA] 엔티티 매핑
상단으로

티스토리툴바