본문 바로가기

스프링

Annotation - @Entity

Entity

데이터 베이스에서 영속적으로 저장된 데이터를 자바 객체로 매핑하여 '인스턴스의 형태'로 존재하는 데이터를 말한다.

하나의 엔티티는 하나의 테이블이라 생각하면 된다.

※영속적 : 영구적으로 저장해준다. 말 그대로 메모리 영역이 아닌 물리 데이터 저장공간에 저장되어 앱이 종료되더라도 데이터가 사라지지 않고 남아있음을 의미

 

Entity 제약조건

엔티티 도메인 클래스를 작성할 때는 제약조건이 존재한다.

 

1. 클래스에 반드시 @Entity 어노테이션이 정의되거나, xml에 작성되어야한다.

@Entity
public class User{ 
...
}

 

2. no-arg(파라미터가 없는) 생성자를 가지고 있어야 한다.

Hibernate에서는 리플렉션으로 엔티티 객체를 생성하기 때문에 모든 Entity는 no-arg 생성자를 가지고 있어야 한다.

파라미터가 없는 생성자가 없으면 동적으로 인스턴스화를 할 수 없기 때문이다.

그리고 public 또는 protected 둘 중 하나의 접근 지정자를 사용해야 한다.

※리플렉션 : 구체적인 클래스의 정보를 알지 못하더라도 클래스의 메서드, 변수, 타입에 접근할 수 있게 해주는 자바 API

 

3. Entity는 최상위 클래스여야 한다.

enum, interface로 정의되어서는 안 된다.

 

4. Entity 클래스는 final 이여서는 안된다.

JPA는 DB에서 데이터를 조회한 후 엔티티를 생성할 때 지연 로딩이라는 방식을 사용하는데, 이 방식으로 데이터를 조회하기 위해서는 JPA의 프록시객체를 생성한다. 프록시 객체는 Entity를 상속해서 확장한 클래스인데 final class는 상속이 될 수 없기 때문에 JPA는 그 final class를 확장해서 프록시 객체로 사용할 수 없다.

그래서 JPA Entity로 사용하고 싶은 클래스는 final class가 아니여야 하며 final field가 포함된 class 역시 JPA의 Entity가 될 수 없다.

 

프록시란
JPA 구현체들은 연관된 객체들 처음부터 데이터베이스에서 조회하는 것이 아니라, 실제 사용하는 시점에 데이터베이스에서 조회할 수  있다. 이와 관련 된 기술이 프록시 인데, 이 프록시를 통해서 즉시로딩 ( EAGER ) 과 지연로딩 ( LAZY ) 을 할 수 있다.

즉시로딩(EAGER LOADING)
엔티티를 조회할때 연관된 엔티티도 함께 조회한다.
연관된 객체까지 조회하려고 한번 더 쿼리를 실행하기보다는 jpa에서 즉시로딩을 최적화하기 위해 가능하면 조인쿼리를 사용한다.
설정: @ManyToOne(fetch=FetchType.EAGER)
@ManyToOne, @OneToOne 과 같이 연관된 엔티티가 하나인 경우에 디폴트 패치 전략

지연로딩(LAZY LOADING)
연관된 엔티티를 실제 사용하는 시점에 데이터베이스에서 조회한다.
연관된 객체에 프록시 객체를 넣어두고 실제 데이터가 필요한 순간이 되어서야 데이터베이스를 조회해서 프록시 객체를 초기화해준다.
설정: @ManyToOne(fetch = FetchType.LAZY)
@OneToMany, @ManyToMany와 같이 연관된 엔티티가 여러개일 때 디폴트 패치 전략

영속 가능한 타입

Entity는 기본적으로 아래와 같은 타입을 영속 필드로 가질 수 있다.

● 사용자 정의 클래스 : Entity 클래스, MappedSuperClass, Embeddable 클래스

● 자바 데이터 타입 : 기본 자료형, String, 래퍼 클래스, Date, Math타입

● 다중값 타입 : Collection, Array, Map

●기타 : enum, Serializable타입

 

 

Entity관련 어노테이션(추가 될 수 있음.)

@Id

  • 해당 컬럼이 기본키(PK, Primary key)임을 나타낸다.
  • 모든 Entity 클래스에는 @Id 설정이 필요하다.
  • 기본키가 복합키로 되어있는 경우 @Embeddedid를 사용한다.
  • 기본키를 자동으로 생성할 때에는 @Id와 @GeneratedValue가 같이 사용되어야한다.

@GeneratedValue

  • IDENTITY 기본키 생성을 데이터베이스에 위임하는 방식으로 id값을 따로 할당하지 않아도 데이터베이스가 자동으로 AUTO_INCREMENT를 하여 기본키를 생성
  • SEQUNCE 데이터 베이스의 Sequence Object를 사용하여 데이터베이스가 자동으로 기본키를 생성
  • TABLE 키를 생성하는 테이블을 사용하는 방법
  • AUTO 기본 설정 값으로 각 데이터베이스에 따라 기본키를 자동으로 생성한다.

@Column

인스턴스 변수가 컬럼이 되기 때문에, 컬럼명을 따로 지정하거나 default값이 다를 경우 사용된다.

 

 


참고

https://programmer-chocho.tistory.com/81
https://chan180.tistory.com/167 [시대유감]