kwonslog / how-to-use-jpa

0 stars 0 forks source link

2회 - 엔티티 매핑 #13

Closed kwonslog closed 1 month ago

kwonslog commented 1 month ago

엔티티 매핑은

엔티티 클래스 안에 선언한 변수와 테이블의 컬럼을 매핑하는 것이다. 이때 매핑 대상을 명확하게 하기 위해 테이블명은 @Table, 컬럼명은 @Column 어노테이션을 사용하여 직접 지정 할 수 있다. 그리고 @Id를 사용하여 기본키 컬럼을 설정하고 @GeneratedValue를 사용하여 키 생성 방식을 선택 할 수 있다.

@Embeddable/@Embedded

엔티티 클래스 안에서 사용한 변수는 테이블 컬럼과 1:1로 매핑이 된다. @Embeddable 어노테이션은 변수들을 묶어서 하나의 클래스를 만들어 관리 할 수 있게 한다. 해당 클래스를 만들고 엔티티 클래스 안에서 사용 할 때는 @Embeded 어노테이션을 지정하여 한쌍으로 사용해야 한다. 이렇게 사용하면 코드를 재사용 할 수 있기 때문에 공통의 값들을 묶어서 다수의 엔티티 클래스 안에서 사용 할 수 있다.

@MappedSuperclass

위에서 설명한 @Embeddable/@Embedded 와 비슷한 목적으로 사용 할 수 있다. 차이점은 상속을 이용하여 공통적인 부분을 해결하는 것이다. 상속구조는 부모/자식의 관계라서 공통적인 부분은 반드시 필요한 항목으로 채워질 것이고, @Embeddable/@Embedded 는 목적에 따라 포함하는 방식으로 사용된다.

@ElementCollection/@CollectionTable

@ElementCollection을 사용하면 값 타입의 컬렉션을 매핑(패치 타입은 LAZY) 할 수 있다. 값 타입의 컬렉션은 @CollectionTable 에서 지정한 테이블에 의해 관리되고 조인컬럼을 사용하여 엔티티와 연결된다.

값 타입(value type) 이란?

String 과 같은 자바의 기본 타입, @Embeddable 을 사용하여 만든 임베디드 값 타입이 있다.

하나의 테이블에 다수의 엔티티를 매핑한다면?

JPA는 하나의 엔티티를 하나의 테이블과 매핑하도록 권장한다. 데이터 무결성, 일관성, 유지보수성 등의 장점이 있는 효과적인 방법이라고 한다. 하지만 사용 범위를 좁혀서 데이터를 조회만 할 경우라던지 사용 목적에 따라 다수의 엔티티를 사용해도 괜찮을것 같다.

@SecondaryTable

엔티티 객체를 저장 할때 엔티티와 매핑된 테이블(이하 기본 테이블)을 제외한 2개 이상의 테이블(이하 추가 테이블)에 나누어서 저장 할 수 있다.(조회도 마찬가지) 하지만 기본 테이블과 추가 테이블들은 조인컬럼으로 연결 되기 때문에 굳이 이 방법을 사용해야 하는지 의문이 든다.

엔티티 간에 연관관계 맵핑(일대일, 다대일 같은)을 사용해도 동일한 결과를 얻을수가 있는데 차이점은 @SecondaryTable 은 하나의 엔티티로 간주되고, 연관관계 맵핑은 독립적인 엔티티 2개를 연결한다는 것이다. 사실 엔티티의 개수가 중요한 것은 아니고 이 방법들을 어떤 상황에 사용하면 효과적인지가 중요하다.

@SecondaryTable을 사용하기 좋은 상황은 단순히 값을 분리하여 관리하고 싶을때 사용하는 것이다.(이런 상황이 얼마나 발생할지는 잘 모르겠다.)왜냐하면 기본 테이블과 추가 테이블은 식별 관계(일대일)이기 때문이다. 결국 테이블을 분리 되었지만 논리적으로 하나라고 생각하고 처리 할 수 있는 것이다.

@Inheritance

이 어노테이션은 3가지 방식으로 상속 구조를 사용 할 수 있다.

  1. SINGLE_TABLE 은 다수의 엔티티가 하나의 테이블에 매핑되는 방식이다.
  2. JOINED 는 상위 클래스와 하위 클래스들 각각 테이블에 매핑되는 방식이다.
  3. TABLE PER CLASS 는 상위 클래스는 테이블이 없고 하위 클래스들만 각각 테이블에 매핑되는 방식이다.

상속구조 보다는 연관관계(일대일,다대다 등) 매핑을 사용하는 경우가 더 많기 때문에 상속 구조에 대한 내용을 추후 실제 사용하게 되면 경험적인 측면에서 정리하는 것이 좋겠다.