본문 바로가기
인프런 강의/실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[JPA] 테이블 전략 설명

by 해삼2 2024. 2. 1.
728x90
반응형
조인 전략 (Joined Strategy)

 

설명:
각 클래스마다 테이블을 따로 생성하고, 자식 클래스의 테이블은 부모 클래스의 테이블과 조인으로 연결됩니다.

상황: 
학교에는 학생과 선생님들이 있습니다. 
각 학생과 선생님은 서로 다른 테이블에 저장되어야 합니다.

사용 이유: 
학생과 선생님은 각각 고유한 속성을 가지며, 데이터를 정규화하여 관리하고 싶습니다.

 

구현 방법:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
    // 공통 속성
}

@Entity
public class Student extends Person {
    // 학생 특화 속성
}

@Entity
public class Teacher extends Person {
    // 선생님 특화 속성
}

 

 

코드 설명 : Person 집합체 안에 각각의 학생 선생님 등의 상속 되어 있으며 조인 테이블 전략을 사용해

각각의 테이블을 관리하는 전략입니다.

조인 테이블이 보통은 정석입니다. 


 

단일 테이블 전략 (Single Table Strategy)

 

설명:

모든 클래스의 속성을 하나의 테이블에 통합하여 저장하며, 각 행은 자식 엔터티를 식별하는 구분자를 가집니다.

 

상황: 

학교에는 학생과 선생님들이 있습니다. 모든 정보를 하나의 테이블에 저장하고 조회 성능을 높이고 싶습니다.

 

사용 이유: 

학생과 선생님은 공통된 속성을 가지며, 테이블 수를 최소화하고 싶습니다.


구현 방법:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Person {
    // 공통 속성
}

@Entity
public class Student extends Person {
    // 학생 특화 속성
}

@Entity
public class Teacher extends Person {
    // 선생님 특화 속성
}

 

코드 설명: Person 집합체 안에 똑같이 학생과 선생이 상속되어 있으며 이 전략은 싱글 테이블 전략으로

Student, Teacher 엔티티들이 Person안에 들어가 하나의 테이블에 모든 정보가 담기는 테이블 전략입니다.

간단하거나 단순한 데이터 들을 처리 하기 위한 전략으로 생각하면 좋을거 같습니다.


구현 클래스 테이블 전략 (Table Per Class Strategy)

 

설명:
각 클래스에 대해 별도의 테이블을 생성하며, 부모 클래스의 속성은 자식 클래스의 테이블에 중복 저장됩니다.

상황: 
학교에는 학생과 선생님들이 있습니다. 

각 학생과 선생님은 별도의 테이블에 저장되며, 공통된 속성을 가지는 추상 클래스가 있습니다.

사용 이유: 
각 엔터티마다 별도의 테이블을 생성하고자 합니다.

구현 방법:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Person {
    // 공통 속성
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    private Long id;
    
    // 다른 공통 매핑 정보들...
}

@Entity
public class Student extends Person {
    // 학생 특화 속성
}

@Entity
public class Teacher extends Person {
    // 선생님 특화 속성
}

 

코드 설명: Person이라는 집합체 안에 각각 상속 받는 데 이 구현 테이블 전략은 Person 추상 클래스로 만들고 나머지 Student, Teacher 엔티티만 테이블을 생성해서 사용 하는 방법입니다.

또한 이 전략은 복수의 테이블 간의 JOIN이 발생하므로 쿼리가 복잡해지고 유지보수가 어려워집니다.

특히 복잡한 쿼리가 자주 사용되는 환경에서는 이를 다루기 어려울 수 있습니다.

 

 


Mapped Superclass및 추상 클래스

 

설명:
공통 매핑 정보를 포함한 추상 클래스를 만들어, 각 엔터티가 이를 상속받아 사용합니다.

상황: 
학교에서는 다양한 엔터티들이 있습니다.
공통된 매핑 정보를 한 곳에 모아서 사용하고 싶습니다.

사용 이유: 
여러 엔터티에서 공통으로 사용되는 매핑 정보를 효율적으로 관리하고 싶습니다.

구현 방법:

@MappedSuperclass
public abstract class BaseEntity {
    // 공통 매핑 정보
}

@Entity
public class Student extends BaseEntity {
    // 학생 특화 속성
}

@Entity
public class Teacher extends BaseEntity {
    // 선생님 특화 속성
}

 

코드 설명: MappedSuperclass는 추상 클라스을 권장하며 엔티티 x 테이블 매핑 x 이 안되는 속성이라

단순 반복해야 하는 등록 시간, 등록 일자 같은 데이터 들을 한곳에 모아 다른 테이블 한태 상속 받을수

있게 하고 반복 작업을 줄여주기 위한 전략입니다. 

사용할 엔티티에서 extends로 상속 받아서 사용할 수 있다.

728x90
반응형