새소식

xub2의 개발 새발 🐾
💽 Database/JPA

[JPA] 엔티티 매핑 - 1 : 객체와 테이블 매핑

2025. 9. 13. 12:27

  • -

객체와 테이블 매핑

@Entity

JPA로 테이블과 매핑할 클래스는 @Entity가 필수이고 @Entity가 붙은 클래스는 JPA가 관리할 수 있다. (같은 말임 ㅋㅋ)

반드시 기본 생성자가 하나 필요하고, final / enum / interface / 내부 클래스에는 적용될 수 없다.

객체의 필드가 동적으로 변동되어야 하기 때문에 final 키워드를 쓸 수 없는건 당연하다.

@Entity(name = "")으로 속성을 넣어줄 수 있는데, 기본적으로는 클래스 이름을 채택하며 같은 클래스 이름이 있다면 따로 설정 해줘도 된다.

 

@Table

@Entity
@Table(name = "user") // 클래스명과 DB 컬럼의 명이 같으면 생략 가능
@Getter
@Setter
public class Member {

    @Id
    private Long id;
    private String name;
}

만약 엔티티의 이름은 Member 인데, DB 테이블 명이 user 라고 하면 @Table 에노테이션으로 해결 가능.


DB 스키마 자동 생성

JPA는 엔티티들의 정보를 보고 테이블을 생성하는 DDL 문을 애플리케이션 실행 시점에 자동으로 생성 해준다.

즉 대부분 개발 로직이 DB 테이블 설계 -> 자바 코드 설계로 넘어가는데, 먼저 객체 중심적으로 설계후 빌드하면 DB의 JPA가 생성해주는 테이블로 설계하고자하는 DB 테이블의 뼈대를 참고 할 수 있다. (근데 그대로 쓰면 안됨)

또한 설정된 dialect 정보를 통해 DBMS별 적절한 DDL을 생성한다.

하지만 이는 반드시 개발 단계에서만 사용하고, 운영에서는 반드시 참고하여 설계해야함.

 

DDL 생성 옵션

<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
옵션  
create 기존 테이블 drop 후 다시 생성 (drop -> create)
create-drop create와 동일하나, 애플리케이션 종료 시점에 테이블 drop (데이터 확인 불가)
update 기존 데이터 유지, 변경만 저장
validate 엔티티와  테이블 정상 매핑 확인
none X

추가로, dialect 를 보고 MySQL 이면 데이터 타입을 VARCHAR 로 만들고, 오라클이면 VARCHAR2 이런식으로 테이블을 생성한다.

 

개발 단계에서 주로 쓰는 옵션은 create / update / create-drop 옵션이다. 반대로 운영 단계에서 절대 쓰면 안되는 옵션이 바로 create / create-drop / update 옵션이다. 

validate는 쉽게 설명해서 엔티티의 모든 필드가 DB에 모든 컬럼에 매핑이 되어야만 정상적으로 작동하고 그렇지 않으면 예외가 발생한다.

운영 단계에서는 validate 또는 none 정도를 사용한다.

 

DDL 생성 기능 옵션

@Entity
@Table(uniqueConstraints = @UniqueConstraint(name = "NAME_AGE_UNIQUE",
                                            columnNames = {"name", "age"}))
@Getter @Setter
public class Member {

    @Id
    private Long id;
    @Column(nullable = false, length = 10)
    private String name;
    
}

SQL을 알면 쉽게 이해 가능하다.

만약 테이블에 contraint를 생성하고 싶으면 해당 제약의 이름 + 제약을 걸 컬럼들 (많으면 배열로 나열)을 설정할 수 있다.

또한 컬럼별 제약을 설정할 수 있는데, @Column의 옵션에 추가할 수 있다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.