JPA - Entity매핑, PK매핑

KoK·2025년 6월 21일

JPA

목록 보기
3/8
post-thumbnail

JPA에서 테이블과 객체를 매핑하기 위해 @Entity 어노테이션을 사용해서 객체 <-> 테이블 간의 매핑을 해준다.
하지만 아무 클래스에나 @Entity를 붙인다고 해서 다 동작하는 것은 아니다.

1. @Entity의 필수 조건

  • 기본 생성자 필수
  • finalClass 사용 불가
  • InnerClass 사용 불가 (static InnerClass는 허용)
  • Interface, Enum 사용 불가
  • 필드 중복 없이 명확한 primary key (@Id) 선언 필요

1-1. 사용 불가능한 이유?

JPA는 객체를 생성할 때 리플렉션 + 기본생성자를 사용한다.
또한, 지연로딩(Lazy Loading) 시 프록시 객체를 생성하기 위해 엔티티를 상속받는다.

  • finalClass
    -> 프록시 객체 생성을 위한 상속이 필요한데, final은 상속 불가
  • Enum
    -> 인스턴스 생성 불가능 (new 키워드 사용 불가), 필드로는 사용 가능하다.
  • Interface
    -> 인스턴스 생성 불가능, 필드 / 상태를 가질 수 없음
  • non-static InnerClass
    -> 바깥 클래스의 인스턴스가 필요해서 JPA 리플렉션 생성 실패

@Entity는 평범한 클래스여야 하며,
기본생성자 + non-final + 독립적인 클래스로 만들어야 한다.
내부적으로 프록시객체를 쓰거나 리플렉션으로 객체를 생성하기 때문에 위 조건들이 필요하다.

2. PK매핑

2-1. @Id - Entity 기본 키 지정

  • Entity클래스에서 해당 필드를 기본키(PK)로 사용하겠다는 뜻
  • 기본키가 반드시 존재해야 JPA가 Entity를 구분하고, 영속성컨텍스트에서 관리할 수 있다.

2-2. @GeneratedValue - 기본 키 자동 생성 전략

PK를 직접 할당하지 않고, JPA가 할당하도록 할 수 있다.

  • AUTO
    -> DB 방언에 따라 자동 선택 (보통 SEQUENCE or IDENTITY) 기본값
  • IDENTITY
    -> DB의 auto_increment 컬럼 사용 (MySQL 등) insert 후 PK 값 결정됨
  • SEQUENCE
    -> DB 시퀀스 객체 사용 (Oracle, PostgreSQL 등) 성능 좋음, 미리 값 예약 가능
  • TABLE
    -> 별도 키 생성 테이블에서 PK 관리 유연하지만 성능 느림
profile
개발 이것저것

0개의 댓글