ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA 세미나
    세미나 2019. 1. 7. 23:04

    JPA에서 중요한 2가지

    1. 객체와 관계형 데이터베이스 매핑

    2. 영속성 컨텍스트



    1. 객체와 관계형 데이터베이스 매핑


    연관관계 매핑을 잘하려면, JPA 공부보다 DB 설계 공부를 많이해야 한다.

    -> 그럼 자연스럽게 연관관계 매핑도 따라온다.


    연관관계 매핑을 참조대신 외래키를 그대로 사용하게되면

    1. 연관관계 객체를 조회 할 일이 있으면 쿼리가 2번 발생

    2. 그보다 도메인 주도적인 설계가 안되는게 더 문제 

    => 그로 인해, 비즈니스 로직이 서비스로 올라가야함 (도메인 객체 자신이 비즈니스 로직을 가질 수 있도록해야함)

    =>  쉽게 말해, 도메인객체 내부에서 관련된 객체에게 메시지를 전달하도록 해야함 (객체에게 메시지를 던져라)


    연관관계 매핑할 때, 실무에서는 Lazy 로딩으로 설정

    => 왜냐하면, 만약 연관관계가 10개정도고, EAGER라면 쿼리가 엄청 길어진다 (조인 -> 퍼포먼스 down)

    * 옵션설정에 따라 Inner Join, Outer join etc... 변경 가능


    JPA에서 가장 어려운 것 중 하나는 양방향 매핑

    mappedBy : 단순 조회용 


    연관관계의 주인이 등장한 배경?

    => 관리 포인트가 2개라서 실수 할 여지가 너무 컸다

    => 따라서 mappedBy가 붙은 객체는 수정해도 값이 변경되지 않도록 한 것이다.


    그럼 연관관계의 주인은 어디에 설정해야할까?

    => 외래키가 있는 곳을 연관관계의 주인으로 설정


    * 테이블 보고 엔티티 매핑하는 연습을 할 것 (단방향 매핑으로)



    매핑 어노테이션

    1. @Column 

    2. @Temporal : 날짜 타입 매핑

    3. @Enumerated : 열거형 매핑

    • EnumType.ORDINAL: 순서를 저장(기본값) 
    • EnumType.STRING: 열거형 이름을 그대로 저장, 가급적 이 것을 사용

    4. @Lob : CLOB, BLOB 매핑

    5. @Transient : 애플리케이션에서 DB에 저장하지 않는 필드


    연관관계 매핑 어노테이션

    1. 다대일 (@ManyToOne) 

    2. 일대다 (@OneToMany)

    3. 일대일 (@OneToOne) 

    4. 다대다 (@ManyToMany) 

    5. @JoinColumn

    6. @JoinTable


    상속 관계 매핑 어노테이션

    1. @Inheritance

    2. @DiscriminatorColumn 

    3. @DiscriminatorValue 

    4. @MappedSuperclass(매핑 속성만 상속)


    복합키 어노테이션

    1. @IdClass 

    2. @EmbeddedId 

    3. @Embeddable 

    4. @MapsId



    2. 영속성 컨텍스트가 엔티티를 관리하면 갖게 되는 장점


    1. 1차 캐시

    2. 동일성 보장

    3. 쓰기 지연

    4. 변경 감지

    5. 지연 로딩


    엔티티 매니저

    1. 엔티티 매니저 안에 영속성 컨텍스트가 있음

    2. 1차 캐시를 가짐

    3. 트랜잭션시작 ~ 트랜잭션 끝날때 까지 1차캐시가 지속됨 ( @Transactional이 끝나면 준영속 상태가됨)



    QueryDSL
    1. 컴파일시점에서 오류를 찾을 수 있음 (타입체크)
    2. 동적 쿼리를 만들 때 사용
    3. 자바로 할 수 있는건 모두 할 수 있음 (where 조건을 메소드로 뺄 수 있음 => 가독성, 재사용성 증가)
             


    3. 기타


    1. 통계처럼 복잡한 쿼리는 JPA로 어떻게 하나요?

    => 복잡한 쿼리를 잘게 쪼개 결과를 나눠가져온 다음, 애플리케이션에서 조합

    => 진짜 안될때는 Jdbc 템플릿으로 native 쿼리 작성


    2. JPA에서 발생할 수 있는 성능 이슈

    •  즉시 로딩 시
      => 조인이 10개씩 일어날 수 있어 부하가 발생
    • 지연 로딩 시
      => N+1문제를 발생시킴 (fetch join으로 해결 가능), @EntityGraph기능으로 해결


    댓글

Designed by Tistory.