카테고리 없음

[JPA] Entity

JABHACK 2025. 1. 5. 09:50

Entity

📌 클래스에 @Entity가 있다면 JPA가 관리하는 Entity로 만들어진다.

  • db 테이블 매핑되는 자바 객체

 

persistence.xml

📌 JPA 관련 설정

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="test"> <!-- createEntityManagerFactory에서 사용할 이름 -->
        <class>org.entity.Tutor</class>
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <!-- DB 아이디 -->
            <property name="jakarta.persistence.jdbc.user" value="root"/>
            <!-- DB 비밀번호 -->
            <property name="jakarta.persistence.jdbc.password" value="1111"/>
            <!-- 스키마 -->
            <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/sparta"/> 
						<!-- 스키마 자동생성 속성 -->
            <property name="hibernate.hbm2ddl.auto" value="create" />
						
						<!-- Hibernate가 DB에 전송하는 DDL, DML SQL을 콘솔에 출력한다. -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            
            <!-- 한꺼번에 전송될 SQL 수량 설정 -->
<!--            <property name="hibernate.jdbc.batch_size" value="10"/>-->
        </properties>
    </persistence-unit>
	</persistence>

 

 

@Entity

@Entity(name = "Tutor") // 기본 값, name 속성은 생략하면 된다.
@Table(name = "tutor")
public class Tutor {

    // PK
    @Id
    private Long id;

    // 필드
    private String name;

    // 기본 생성자
    public Tutor() {
    }

    // 쉽게 사용하기 위해 생성자 추가
    public Tutor(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}
  • JPA를 사용하여 객체를 테이블과 매핑할 때 사용한다.(필수)
  • PK 값이 필수이다.(@Id 사용)
  • 기본 생성자가 필수이다.
  • final, enum, interface, inner 클래스에는 사용할 수 없다.
  • 필드에 final 키워드를 사용할 수 없다.
  • 속성
    • name
      • Entity 이름 지정
      • 기본 값은 클래스 이름과 같다.
      • 혼동을 방지하기 위해 기본 값을 사용(생략)하면 된다.

 

@Table

@Entity
@Table(name = "tutor")
public class Tutor {
}
  • 속성
    • name
      • Entity와 매핑할 테이블 이름을 지정
      • 기본 값은 Entity 이름(Tutor)을 사용
    • catalog
      • 데이터베이스 catalog 매핑
    • schema
      • 데이터베이스 schema 매핑
    • uniqueConstraints
      • DDL 생성 시 유니크 제약 조건 설정

 

JPA 실행

public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    EntityManager em = emf.createEntityManager();
    EntityTransaction transaction = em.getTransaction();

    transaction.begin();

    try {
            
        Tutor tutor = new Tutor(1L, "wonuk");
        em.persist(tutor);

        transaction.commit();
    } catch (Exception e) {
        e.printStackTrace();
        transaction.rollback();
    } finally {
        em.close();
    }
    emf.close();
}

 

 

hibearnate.hbm2ddl.auto

📌 SessionFactory가 생성될때 스키마 DDL을 db로 검증하고 내보내는 기능을 상황에 따라 다르게 설정할수 있도록 하는 프로퍼티

  • SessionFactory  = 도메인 모델을 데이터베이스로 맵핑하는 thread-safe하고 immutable한 표현이다.
  • JPA는 Application 로딩 시점에 DDL을 자동으로 생성하는 기능을 지원한다. 방언(dialect)을 사용하여 Entity Mapping만 하여도 데이터베이스에 맞는 적절한 DDL이 생성된다.
  • 실무에서는 validate 혹은 none 을 사용하고 개발 단계에서는 상황에 맞게 사용하면 된다.

 

public class Main {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
        EntityManager em = emf.createEntityManager();
        EntityTransaction transaction = em.getTransaction();

        transaction.begin();

        try {

            Tutor tutor = new Tutor(1L, "wonuk");
            em.persist(tutor);

            transaction.commit();
        } catch (Exception e) {
            e.printStackTrace();
            transaction.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

 

<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.hbm2ddl.auto" value="validate" />

 

 

 

제약조건 설정

📌 테이블에 입력되는 데이터가 사용자가 원하는 조건을 만족하는 데이터만 입력되는 것을 보장하는 것

  • JPA를 사용하면 DDL 생성 시 제약조건을 설정할 수 있다. 실행 로직과는 별개로 DDL 생성시에만 활용된다.

 

DDL 자동생성 제약조건 설정

  1. @Column
    • unique : 유니크, 기본값 false
    • nullable : 필수 여부, 기본값 true
    • length : 길이
@Column(unique = true, length = 20, nullable = false)

DDL 자동 생성 시 제약 조건이 설정된다.

 

  1. @Table
    • uniqueConstraints : 유니크, 이름을 직접 설정할 수 있다.
@Table(uniqueConstraints = {@UniqueConstraints
				(
					name = "name_unique", 
					columnNames= {"name"}
				)
		}
)
// 클래스

 

 

필드 매핑

📌 JPA로 관리되는 클래스인 Entity의 필드는 테이블의 컬럼과 매핑된다.

@Entity
@Table(name = "board")
public class Board {
    @Id
    private Long id;

    // @Column을 사용하지 않아도 자동으로 매핑된다.
    private Integer view;

    // 객체 필드 이름과 DB 이름을 다르게 설정할 수 있다.
    @Column(name = "title")
    private String bigTitle;

    // DB에는 기본적으로 enum이 없다.
    @Enumerated(EnumType.STRING)
    private BoardType boardType;

    // VARCHAR()를 넘어서는 큰 용량의 문자열을 저장할 수 있다.
    @Column(columnDefinition = "longtext")
    private String contents;

    // 날짜 타입 DATE, TIME, TIMESTAMP를 사용할 수 있다.
    @Temporal(TemporalType.TIMESTAMP)
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;
    
    @Transient
    private int count;

    public Board() {
    }

}

 

 

사용되는 Annotation

 

 

@Column 속성

속성 설명 Default
name
객체 필드와 매핑할 테이블의 컬럼 이름
객체 필드 이름
nullable
DDL 생성 시 null 값의 허용 여부 설정
true(허용)
unique
DDL 생성 시 하나의 컬럼에 유니크 제약조건을 설정
 
columnDefinition
DDL 생성 시 데이터베이스 컬럼 정보를 직접 설정할 수 있다.
 
length
DDL 생성 시 문자 길이 제약조건 설정 단, String만 사용 가능
255
insertable
설정된 컬럼의 INSERT 가능 여부
true
updatable
설정된 컬럼의 UPDATE 가능 여부
true

 

 

@Enumerated

  • 기본 설정인 ORDINAL을 사용하면 0, 1 과 같은 순서가 저장된다.

 

EnumType.ORDINAL을 사용하면 Enum 값이 추가될 때 마다 순서가 바뀌기 때문에 실제로 사용하지 않는다.

 

 

@Temporal

 

 

기본 키

📌 JPA Entity를 생성할 때 기본키는 필수로 생성해야 한다.

 

  • 사용되는 Annotation
    1. @Id
      • 수동 생성
Tutor tutor = new Tutor(1L, "wonuk");
  1. @GeneratedValue
    • 자동 생성
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

 

PK 생성 전략

  • 영속성 컨텍스트는 PK가 필수이다.
    • 가장 권장되는 방식은 Long Type의 기본 키를 사용하는 것
  • strategy 속성
    • GenerationType
      1. IDENTITY : MySQL, PostgreSQL에서 사용, 데이터베이스가 PK 자동 생성
      2. SEQUENCE : Oracle에서 사용, @SequenceGenerator 와 함께 사용
      3. TABLE : 키 생성용 테이블을 사용, @TableGenerator 와 함께 사용
      4. AUTO : dialect에 따라 자동 지정, 기본값
        • MySQL이면 IDENTITY, Oracle이면 SEQUENCE 로 설정
  • 실행 결과