Backend/JPA

객체와 테이블 매핑, @Entity, @Table

Zayson 2022. 4. 19. 00:36

@Entity

JPA는 객체와 실제 DB 테이블 매핑을 @Entity 애노테이션을 이용해 매핑한다. @Entity 애노테이션은 JPA가 관리하는 엔티티이며 테이블과 매핑된다.

@Entity가 붙은 엔티티 클래스는 public, protected 접근 제어자가 붙은 기본 생성자가 필수로 필요하다.

public class Member {
    public Member() {...}
    protected Member() {...}
}

또한, final 클래스, interface, enum, inner 클래스에는 사용이 불가능하며, DB와 매핑되는 컬럼들은 final 키워드를 사용하면 안된다.

@Entity 아래의 경우 붙일 수 없음

1. public final class Member {...}
2. public interface Member {...}
3. public enum Member {...}
4. public class Member { 
        @Entity
        class InnerMember {...}
     }

public class Member {
        private final Integer age;  // 필드에 final 사용 불가
}

@Entity의 프로퍼티 중 name은 JPA에서 사용할 엔티티 이름을 지정하는 속성이다. 일반적으로 테이블 이름과 동일하게 엔티티 클래스명을 사용하고, 규약에 따라 name을 통해 변경하는 방식을 선택한다

 

@Table

@Table 애노테이션은 엔티티와 매핑할 테이블을 지정한다.

name 프로퍼티는 기본적으로 엔티티 이름과 매핑되는 테이블을 사용한다.

uniqueConstraints는 DDL 생성 시 유니크 제약조건을 생성할 수 있는데, @Column 애노테이션의 unique의 속성으로 지정할 경우 제약조건 이름이 랜덤하게 지정되기 때문에 일반적으로 @Table 애노테이션 에서 제약조건을 지정한다.

@Entity
@Table(name = "MEMBERS")   //MEMBERS 테이블과 매핑된다.
public class Member { ... }

 

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

개발 단계, 로컬에서 개발 하는 경우에 주로 지정하며 애플리케이션 로딩 시점에 DDL(Create 문)을 자동 생성하게 해준다.

<property name="hibernate.hbm2ddl.auto" value="create" /> value 부분에 각각의 속성을 지정해서 사용할 수 있다.

  1. create : 애플리케이션 로딩 시에 먼저 Table drop DDL을 실행한 후 Create Table DDL을 실행한다.
  2. create-drop : 애플리케이션 로딩 시 Table Drop and Create을 실행하는 점은 “create” 속성과 동일하지만, create-drop은 애플리케이션 종료 시점에 다시 Table을 Drop한다. 테스트 환경에서 많이 사용된다.
  3. update : 애플리케이션 로딩 시점에 기존에 존재하는 테이블을 Drop 하지 않고 테이블의 변경 내역에 대해서만 Update 해주는 방식이다. Alter Table을 이용해 테이블의 변경 내역을 반영한다. 변경 내역의 반영 중 컬럼을 추가하는 것은 가능하지만 컬럼을 삭제하는 것에 대해서는 지원하지 않는다.
  4. validate : 엔티티와 테이블을 정상적으로 매핑 하는지 확인하는 방식으로, 정상적으로 맵핑되지 않은 경우 SchemaManagementException 발생시킨다.

 

📄 References

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 : https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

반응형