ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 고급 매핑 - 상속관계 매핑
    김영한(인프런 강의)/자바 ORM 표준 JPA 프로그래밍 2020. 10. 20. 14:07
    반응형

    상속관계 매핑

    1. 정리

        1) 관계형 데이터베이스는 상속 관계X

        2) 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사

        3) 상속관계 매핑

    상속관계 매핑이란?  객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑

    2. 사용 어노테이션

    @Inheritance(strategy=InheritanceType.XXX)

    • JOINED: 조인 전략
    • SINGLE_TABLE: 단일 테이블 전략
    • TABLE_PER_CLASS: 구현 클래스마다 테이블 전략

    @DiscriminatorColumn(name="DTYPE")

    • 엔티티 이름은 수정이가능하다(DTYPE)
    • Item의 컬럼명

    @DiscriminatorValue(“XXX")

    • 상위 클래스에 넣을 이름
    • 이름은 수정이 가능하다
    • 기본 옵션은 엔티티 이름이다(클래스 이름)
    • Item의 DTYPE의 들어갈 값

    결과(코드는 아래에 존재)

     

     

     

    슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법

    1. 각각 테이블로 변환 -> 조인 전략

    조인전략

        1) 장점

            - 테이블 정규화

            - 외래 키 참조 무결성 제약조건 활용가능

            - 저장공간 효율화

        2) 단점

            - 조회시 조인을 많이 사용, 성능 저하

            - 조회 쿼리가 복잡함

            - 데이터 저장시 INSERT SQL 2번 호출

        3) 사용법

            - @Inheritance(strategy=InheritanceType.JOINED

        4) 코드(나머지 코드들은 밑에 존재)

    @Entity
    @Inheritance(strategy=InheritanceType.JOINED)
    @DiscriminatorColumn(name="DTYPE") 
    public class Item {
    	@Id @GeneratedValue
    	private Long id;
    
    	private String name;
    	private int price;
    	
        Getter(), Setter()...
    }

        5) 결과

     

    2. 통합 테이블로 변환 -> 단일 테이블 전략

        1) 장점

            - 조인이 필요 없으므로 일반적으로 조회 성능이 빠름

            - 조회 쿼리가 단순함

        2) 단점

            - 자식 엔티티가 매핑한 컬럼은 모두 null 허용

            - 단일 테이블에 모든 것을 저장하므로 테이블이 커질 수 있다

            - 상황에 따라서 조회 성능이 오히려 느려질 수 있다(필요없는것도 조회하기 때문에)

        3) 사용법

            - @Inheritance(strategy=InheritanceType.SINGLE_TABLE) 

        4) 코드(나머지 코드들은 밑에 존재)

    @Entity
    @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name="DTYPE") 
    public class Item {
    	@Id @GeneratedValue
    	private Long id;
    
    	private String name;
    	private int price;
    	
        Getter(), Setter()...
    }

        5) 결과

     

    3. 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략

    이 전략은 데이터베이스 설계자와 ORM 전문가 둘 다 추천X
       -> 위와같이 테이블을 설계하게된다면 DBA에게 욕 먹는다.(내가 해봄)

        1) 장점

            - 서브 타입을 명확하게 구분해서 처리할 때 효과적

            - not null 제약조건 사용 가능

        2) 단점

            - 여러 자식 테이블을 함께 조회할 때 성능이 느림(UNION SQL 필요) 

            - 자식 테이블을 통합해서 쿼리하기 어려움

        3) 사용법

            - @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

        4) 코드

    @Entity
    @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    @DiscriminatorColumn(name="DTYPE") 
    public class Item {
    	@Id @GeneratedValue
    	private Long id;
    
    	private String name;
    	private int price;
    	
        Getter(), Setter()...
    }

        5) 결과

     

     

    공통코드

    @Entity
    @DiscriminatorValue("책")
    public class Book extends Item {
    
    	private String autor;
    	private String isbn;
    
    	Getter(), Setter()...
    }

     

    @Entity
    @DiscriminatorValue("앨범")
    public class Album extends Item{
    
    	private String artist;
        
        Getter(), Setter()...
    }

     

    @Entity
    @DiscriminatorValue("영화")
    public class Movie extends Item{
    	
    	private String director;
    	private String actor;
        
        Getter(), Setter()...
    }

     

    public class JpaStudyApplication {
    
    	public static void main(String[] args) {
    		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
    
    		EntityManager em = emf.createEntityManager();
    
    		EntityTransaction tx = em.getTransaction();
    
    		// 트랜잭션 시작
    		tx.begin();
    
    		try {
    			Movie movie = new Movie();
    			movie.setDirector("김진석 감독");
    			movie.setActor("김진석 배우");
    			movie.setName("강의듣고 실습 JPA - 편리하지만 생각할거 많다.");
    			movie.setPrice(121000);
    			
    			em.persist(movie);
    			
    			tx.commit(); // [트랜잭션] 커밋
    		} catch (Exception e) {
    			tx.rollback();
    		} finally {
    			em.close();
    
    		}
    		emf.close();
    	}
    }
    반응형
Designed by Tistory.