상속 관계 매핑

  • ORM 상속 관계 매핑 : 객체의 상속 구조 ↔ 데이터베이스의 슈퍼타입 서브타입 관계 매핑
  • 슈퍼타입 서브타입 논리 모델을 테이블로 구현하는 방법
    • 각각 테이블 변환 : JPA 조인 전략
    • 통합 테이블 변환 : JPA  단일 테이블 전략 
    • 서브타입 테이블 변환 : JPA 구현 클래스마다 테이블 전략

주요 어노테이션

  • @Inheritance(strategy=InheritanceType.XXX)
    • 부모 크래스에 매핑 전략 지정
      • JOINED: 조인 전략
      • SINGLE_TABLE: 단일 테이블 전략
      • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략
  • @DiscriminatorColumn(name=“DTYPE”)
    • 부모 클래스에 자식 테이블 구분 컬럼 지정
  • @DiscriminatorValue(“XXX”)
    • 자식 클래스에 구분 컬럼 값 지정

조인 전략

  • 엔티티 각각 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본키를 기본키+외래키로 사용하는 전략
  • 조회할 때 조인 사용
  • 타입(자식 테이블) 구분하는 컬럼 필요
  • 장점
    • 테이블 정규화, 외래키 참조 무결성 제약조건 활용, 저장공간 효율화
  • 단점
    • 조인으로 성능 저하, 조회 쿼리 복잡, 데이터 저장 시 INSERT문 2번 호출

단일 테이블 전략

  • 테이블 하나만 사용하고 구분 컬럼으로 어떤 자식 데이터 저장되었는지 구분
  • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 필수
  • 장점
    • 조인 없으므로 조회 성능 빠름, 조회 쿼리 단순
  • 단점
    • 자식 엔티티가 매핑한 컬럼은 모두 null 허용 필수, 테이블이 너무 커지면 조회 성능 느려질 수 있음

구현 테이블마다 테이블 전략

  • 자식 엔티티마다의 테이블
  • 비추천
  • 장점
    • 서브 타입 구분해서 처리할 때 효율적, not null 제약조건 설정 가능
  • 단점
    • 여러 자식 테이블 함께 조회 시 성능 하락

@MappedSuperclass

  • 부모 클래스는 실제 테이블과 매핑하지 않고 자식 클래스에게 매핑 정보만 제공하고 싶을 때 사용
  • 추상 클래스와 유사
  • 단순히 엔티티가 공통으로 사용하는 매핑 정보 모아주는 역할

식별 관계 매핑

  • 식별 관계
    • 부모 테이블의 기본키를 자식 테이블의 기본키+외래키로 사용
  • 비식별 관계(주로 사용)
    • 부모 테이블의 기본키를 자식 테이블의 외래키로만 사용
      • 필수적 비식별 관계 : 외래키 not null
      • 선택적 비식별 관계 : 외래키 null

'JPA' 카테고리의 다른 글

다양한 연관관계 매핑  (0) 2025.05.01
연관관계 매핑 기초  (0) 2025.05.01
엔티티 매핑  (0) 2025.05.01
JPA 소개 / 영속성 관리  (0) 2025.05.01

연관관계 매핑 고려사항 3가지

  • 다중성
    • 1:n, n:m(실무에서 x), n:1, 1:1
  • 단방향, 양방향
    • 테이블: 외래키 하나로 양쪽 조인 가능(방향 개념 x)
    • 객체 : 참조용 필드가 있어야 참조 가능(방향 개념 o)
  • 연관관계 주인
    • 테이블 : 외래키 하나로 두 테이블이 연관관계 맺음
    • 객체 : 양방향 관계는 A→B, B→ A와 같이 참조가 2개 = 외래키 관리할 곳(연관관계 주인) 필요 

다대일(N:1)

N 쪽이 외래키 관리(연관관계 주인)

  • 다대일 단방향
    • @ManyToOne + @JoinColumn(name = "TEAM_ID")
  • 다대일 양방향 : 외래키 있는 쪽이 연관관계 주인, 항상 서로 참조 필수
    • @ManyToOne + JoinColumn(name = "TEAM_ID") → 연관관계 주인
    • @OneToMany(mappedBy="team")

일대다(1:N)

엔티티를 하나 이상 참조할 수 있으므로 자바 컬렉션(Collection, Map, List, Set) 중 하나 사용

  • 일대다 단방향 : 반대쪽 테이블에 있는 외래키 관리(외래키가 N쪽 테이블에 있어서) → 단점
    • @OneToMany + @JoinColumn(name="TEAM_ID") → Member 테이블의 TEAM_ID(FK)
  • 일대다 양방향 : 다대일 양방향 매핑 사용 권장 
    • @OneToMany + @JoinColumn(name="TEAM_ID")
    • @ManyToOne + @JoinColumn(name = "TEAM_ID", insertable=false, updatable=false) → 읽기만 가능하도록 설정

일대일(1:1)

  • 주 테이블에 외래키, 일대일 단방향
    • @OneToOne + JoinColumn(name = "LOCKER_ID")
  • 주 테이블에 외래키, 일대일 양방향
    • @OneToOne + JoinColumn(name = "LOCKER_ID") → 연관관계 주인
    • @OneToOne(mappedBy="locker")
  • 대상 테이블에 외래키, 일대일 단방향 : 지원 X
  • 대상 테이블에 외래키, 일대일 양방향 
    • @OneToOne(mappedBy="member")
    • @OneToOne + @JoinColumn(name = "MEMBER_ID")

다대다(N:N)

중간에 연결 테이블(엔티티)을 추가해서 활용, 실무X

'JPA' 카테고리의 다른 글

고급 매핑  (0) 2025.05.01
연관관계 매핑 기초  (0) 2025.05.01
엔티티 매핑  (0) 2025.05.01
JPA 소개 / 영속성 관리  (0) 2025.05.01

연관관계 비교

  • 테이블
    • 외래키(FK) 사용
    • 항상 양방향 관계 → JOIN 
    • Member findMember = em.find(Member.class, member.getId());
      Long findTeamId = findMember.getTeamId();
      Team findTeam = em.find(Team.class, findTeamId);
  • 객체
    • 참조 사용
    • 항상 단방향 관계 → a.b (양방향 필요 시 2개의 단방향으로 활용)
      Member findMember = em.find(Member.class, member.getId());
      Team findTeam = findMember.getTeam();

단방향 연관관계

  • @ManyToOne
    • N:1 매핑
    • 해당 클래스가 연관관계 주인
  • @JoinColumn(name="외래키 이름")
    • 외래키 매핑 시 사용
    • 연관관계 주인 클래스에서 지정

양방향 연관관계 : 단방향+ 단방향 조합 (EX) N:1 ↔ 1:N

  • @OneToMany(mappedBy="반대 매핑의 필드명")
    • 1:N 매핑

연관관계 주인

  • 양방향 연관관계 매핑 시 한 곳으로 설정(외래키가 있는 곳)
    • @JoinColumn(name="외래키 이름") 사용
  • 데이터베이스 연관관계와 매핑
  • 외래키 관리(등록, 수정, 삭제)

Member, Team 엔티티 양방향 연관관계 예시

  • Member : N:1, 연관관계 주인, TEAM_ID를 외래키로 가짐
  • Team :  1:N
Member
@Entity
 public class Member {  //연관관계 주인
 
 @Id @GeneratedValue
 private Long id;
 
 @Column(name = "USERNAME")
 private String name;
 private int age;
 
 @ManyToOne // >> N:1
 @JoinColumn(name = "TEAM_ID") //외래키 설정
 private Team team;
 …
}
Team
@Entity
 public class Team {
 
 @Id @GeneratedValue
 private Long id;
 
 private String name;
 
 @OneToMany(mappedBy = "team") //1:N
 List<Member> members = new ArrayList<Member>();
 …
 }

'JPA' 카테고리의 다른 글

고급 매핑  (0) 2025.05.01
다양한 연관관계 매핑  (0) 2025.05.01
엔티티 매핑  (0) 2025.05.01
JPA 소개 / 영속성 관리  (0) 2025.05.01

@Entity

  • 테이블과 매핑할 클래스에 사용
  • JPA가 관리
  • 기본 생성자 필수

@Table

  • 엔티티와 매핑할 테이블 지정

스키마 자동 생성

  • <property name="hibernate.hbm2ddl.auto" value="create" />
  • 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성
  • 개발계에서만 사용 권장

@Column

  • 필드-컬럼 매핑

@Id

  • 기본 키 매핑
  • @GeneratedValue(strategy = GenerationType.~) : 자동 생성 전략
    • IDENTITY : 데이터베이스에 위임, 순서대로 값 증가
    • SEQUENCE : 시퀀스 사용, @SequenceGenerator로 시퀀스 생성
    • TABLE : 키 생성 전용 테이블 사용, @TableGenerator로 테이블 생성
    • AUTO : 데이터베이스에 따라 IDENTITY/SEQUENCE/TABLE 중 자동 선택

'JPA' 카테고리의 다른 글

고급 매핑  (0) 2025.05.01
다양한 연관관계 매핑  (0) 2025.05.01
연관관계 매핑 기초  (0) 2025.05.01
JPA 소개 / 영속성 관리  (0) 2025.05.01

JPA

객체를 자바 컬렉션에 저장하듯이 DB에 저장

영속성 컨텍스트

Entity를 영구 저장하는 환경(EntityManager를 사용하여 저장)

  • 1차 캐시
    • 1차 캐시에 저장된 entity를 find() 하면 DB조회 없이 바로 반환
  • 동일성(idnetity) 보장
    • 같은 트랜잭션 내부에서는 같은 엔티티 반환
  • 쓰기 지연
    • DB 조작들을 트랜잭션 커밋 순간 한번에 수행
  • 변경 감지(Dirty Checking)
    • flush 시점에 엔티티 변경사항을 자동으로 UPDATE SQL 생성하여 반영
    • 스냅샷 활용
  • 지연로딩(lazy loading)
    • 객체가 실제 사용될 때 로딩

Entity 생명주기

  • 비영속(new/trasient)
    • JPA에서 관리되지 않는 상태 (new로 객체만 생성)
  • 영속(managed)
    • 영속성 컨텍스트에서 관리되는 상태(persist(), find()..)
  • 준영속(detached)
    • 영속성 컨텍스트에 저장되었다가 분리된 상태(더 이상 영속성 컨텍스트가 관리하지 않는 것)
  • 삭제(removed)
    • 삭제된 상태
    • 영속성 컨텍스트에서 바로 제거

'JPA' 카테고리의 다른 글

고급 매핑  (0) 2025.05.01
다양한 연관관계 매핑  (0) 2025.05.01
연관관계 매핑 기초  (0) 2025.05.01
엔티티 매핑  (0) 2025.05.01

+ Recent posts