Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- 항해15기
- java set 저장
- java map 출력
- 격파르타장점
- 격파르타비전공자
- 비전공자sqld
- 항해99후기
- 노베이스부트캠프
- java list 출력
- 격파르타합격후기
- java list 저장
- java 자료구조 활용
- 격파르타후기
- 작은수제거하기
- java map 저장
- 컴파일
- java알고리즘문제풀이
- javaJRE
- java기본자료형
- javaJVM
- 인터프린터언어
- sqld자격증합격
- 프로그래머스제일작은수
- java set 출력
- java알고리즘
- 프로그래머스
- java최솟값구하기
- java map
- 코딩부트캠프후기
- java참조자료형
Archives
- Today
- Total
코딩과 결혼합니다
[JPA] 상속관계 매핑 - 테이블 전략 본문
728x90
객체 지향 프로그래밍에서는 클래스 간의 상속 관계를 통해 상위클래스와 하위 클래스 간의 관계를 표현한다.
하지만 관계형 데이터베이스는 상속 관계의 개념이 존재하지 않는다.
대신 슈퍼타입 서브타입 관계라는 모델링 기법을 사용하면 객체 상속과 유사하게 구성할 수 있다.
상속관계 매핑
객체 지향 프로그래밍에서 상속 관계에 있는 클래스들을 데이터베이스 테이블과 매핑하는 방법
논리 모델을 실제 물리 모델로 구현하는 방법이다.
1. 단일 테이블 전략
상속 계층 구조에 있는 모든 클래스들을 한 개의 테이블에 매핑한다.
테이블에는 부모 클래스와 자식 클래스의 모든 속성들을 포함한다.

- 조인이 필요 없어 일반적으로 조회 성능이 빠르다. ( 조회 쿼리가 단순함)
- 자식 클래스의 속성들은 NULL값을 허용해야 한다.
- 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있고 오히려 성능이 떨어질 수 있다.
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Animal {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 추상 메소드 선언
public abstract void makeSound();
// Getters and setters
}
@Entity
@DiscriminatorValue("cat")
public class Cat extends Animal {
private int lives;
@Override
public void makeSound() {
System.out.println("야옹");
}
// Getters and setters
}
@Entity
@DiscriminatorValue("dog")
public class Dog extends Animal {
private String breed;
@Override
public void makeSound() {
System.out.println("멍멍");
}
// Getters and setters
}
@DiscriminatorColumn(name = "type") 은 JPA에서 상속 관계를 매핑할 때 사용되는 어노테이션이며, 단일 테이블 전략에서 부모 클래스와 자식 클래스를 구분하기 위한 컬럼을 지정하는 역할을 한다.
2. 조인 전략
각 클래스마다 별도의 테이블을 생성하는 방식. 부모 클래스의 테이블과 각 자식 클래스의 테이블은 외래 키를 사용하여 조인을 통해 연결된다.

- 정규화된 데이터 베이스 스키마로 데이터 중복이 줄어들고, 데이터 일관성과 무결성을 유지하기 쉽다.
- 조인을 통해 필요한 데이터를 가져오기 때문에, 쿼리 실행 시 성능 최적화가 가능하다.
- 개별적으로 데이터를 추가, 수정, 삭제할 수 있어 데이터 관리가 용이해지고 변화에 유연하게 대응할 수 있다.
- 상속 구조가 복잡하고 깊어질수록 테이블의 개수가 증가하며 이는 스키마 관리나 쿼리 작성 시 복잡해질 수 있다.
- 조인을 사용하여 데이터를 조회하기 때문에 DB 서버에 부하를 줄 수 있으며, 쿼리의 성능에 영향을 미칠 수 있다.
@Inheritance(strategy = InheritanceType.JOINED)
위의 코드에서 전략만 바꿔주면 된다.
이는 JPA의 큰 장점 중 하나로 개발 시점에서 성능을 테스트한 후에 다른 전략으로 바꾸더라도 소스코드를 바꿀 필요 없이 전략 부분만 수정해 주면 되기 때문에 간편하고 빠르게 적용할 수 있다.
3. 구현 클래스마다 테이블 전략
상속 계층 구조에 있는 각각의 클래스를 별도의 테이블로 매핑한다. 각 테이블에는 해당 클래스의 속성들만 포함된다.

- 서브 타입을 명확하게 구분해서 처리할 때 효과적이다.
- not null 제약조건 사용이 가능하다.
- 여러 자식 테이블을 함께 조회할 때 성능이 느리다.(UNION SQL 필요)
- 자식 테이블을 통합해서 쿼리하기 어렵다.
- 이 전략 사용하지 않는 것을 권장. 많은 문제가 일어날 수 있다고 한다.
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
조인 전략을 기본으로 깔고, 정말 단순하고 확장할 필요가 거의 없을 때에는 단일 테이블 전략을 사용하는 것이 좋다.
'2세 > JPA' 카테고리의 다른 글
| [JPA] API 설계 시 주의할 점(DTO 사용하기) (0) | 2024.02.17 |
|---|---|
| [JPA] 아키텍처 패턴(+ 디자인 패턴) (0) | 2024.02.15 |
| [JPA] 엔티티 설계시 주의점 (0) | 2024.02.13 |
| [JPA] 기본키 생성 전략 (0) | 2024.02.12 |
| [JPA] 데이터베이스 스키마 자동 생성, DDL 생성 기능 (0) | 2024.02.07 |