엔티티 클래스 안에 선언한 변수와 테이블의 컬럼을 매핑하는 것이다. 이때 매핑 대상을 명확하게 하기 위해 테이블명은 @Table, 컬럼명은 @Column 어노테이션을 사용하여 직접 지정 할 수 있다. 그리고 @Id를 사용하여 기본키 컬럼을 설정하고 @GeneratedValue를 사용하여 키 생성 방식을 선택 할 수 있다.
엔티티 클래스 안에서 사용한 변수는 테이블 컬럼과 1:1로 매핑이 된다. @Embeddable 어노테이션은 변수들을 묶어서 하나의 클래스를 만들어 관리 할 수 있게 한다. 해당 클래스를 만들고 엔티티 클래스 안에서 사용 할 때는 @Embeded 어노테이션을 지정하여 한쌍으로 사용해야 한다. 이렇게 사용하면 코드를 재사용 할 수 있기 때문에 공통의 값들을 묶어서 다수의 엔티티 클래스 안에서 사용 할 수 있다.
위에서 설명한 @Embeddable/@Embedded 와 비슷한 목적으로 사용 할 수 있다. 차이점은 상속을 이용하여 공통적인 부분을 해결하는 것이다. 상속구조는 부모/자식의 관계라서 공통적인 부분은 반드시 필요한 항목으로 채워질 것이고, @Embeddable/@Embedded 는 목적에 따라 포함하는 방식으로 사용된다.
String 과 같은 자바의 기본 타입, @Embeddable 을 사용하여 만든 임베디드 값 타입이 있다.
하나의 테이블에 다수의 엔티티를 매핑한다면?
JPA는 하나의 엔티티를 하나의 테이블과 매핑하도록 권장한다. 데이터 무결성, 일관성, 유지보수성 등의 장점이 있는 효과적인 방법이라고 한다. 하지만 사용 범위를 좁혀서 데이터를 조회만 할 경우라던지 사용 목적에 따라 다수의 엔티티를 사용해도 괜찮을것 같다.
@SecondaryTable
엔티티 객체를 저장 할때 엔티티와 매핑된 테이블(이하 기본 테이블)을 제외한 2개 이상의 테이블(이하 추가 테이블)에 나누어서 저장 할 수 있다.(조회도 마찬가지) 하지만 기본 테이블과 추가 테이블들은 조인컬럼으로 연결 되기 때문에 굳이 이 방법을 사용해야 하는지 의문이 든다.
엔티티 간에 연관관계 맵핑(일대일, 다대일 같은)을 사용해도 동일한 결과를 얻을수가 있는데 차이점은 @SecondaryTable 은 하나의 엔티티로 간주되고, 연관관계 맵핑은 독립적인 엔티티 2개를 연결한다는 것이다. 사실 엔티티의 개수가 중요한 것은 아니고 이 방법들을 어떤 상황에 사용하면 효과적인지가 중요하다.
@SecondaryTable을 사용하기 좋은 상황은 단순히 값을 분리하여 관리하고 싶을때 사용하는 것이다.(이런 상황이 얼마나 발생할지는 잘 모르겠다.)왜냐하면 기본 테이블과 추가 테이블은 식별 관계(일대일)이기 때문이다. 결국 테이블을 분리 되었지만 논리적으로 하나라고 생각하고 처리 할 수 있는 것이다.
엔티티 매핑은
@Embeddable/@Embedded
@MappedSuperclass
@ElementCollection/@CollectionTable
값 타입(value type) 이란?
하나의 테이블에 다수의 엔티티를 매핑한다면?
@SecondaryTable
@Inheritance