티스토리 뷰

반응형

글로벌 페치(fetch) 전략 설정

글로벌 페치의 default 설정이 모두 LAZY(지연로딩)으로 되있는 줄 알았으나 연관관계 매핑 방식에 따라 default 설정이 다른 것을 알게 되었다. 

  • @ManyToOne, @OneToOne : 기본설정이 즉시로딩 (EAGER)
  • @OneToMany, @ManyToMany : 기본설정이 지연로딩 (LAZY)

일단 @ManyToOne과 @OneToOne 에게 지연로딩을 하도록 옵션을 명시했다. 이 후의 즉시로딩이 꼭 필요한 경우에 즉시 로딩으로 바꿀 예정이다.

"김영한 저 - 자바 ORM 표준 JPA 프로그래밍 p305 참고"

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "category_id", nullable = false)
private Category category; 

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "book_content_id", nullable = false)
private BookContent bookContent;

영속성전이 CASCADE 설정

특정 엔티티와 연관된 엔티티의 영속성 설정을 함께 하는 공동운명체(?)로 설정하는 옵션이다. 예를들어, 특정 엔티티가 영속성 상태가 되면 연관된 엔티티도 영속성 상태가 되고, 특정 엔티티가 삭제 될 때 연관된 엔티티도 바로 삭제 되도록 할 수있다.

현재 문제들의 관련된 2개의 File 엔티티들은 영속성 전이를 이용하여서 관리하는 것이 좋아보여 CASCADE 옵션을 사용했다. 비슷한 옵션으로 orphanRemoval이라는 옵션도 고려 했으나, 현재 CASCADE 설정도 익숙치 않은 상황에서 많은 옵션을 사용 할 경우 이후 디버깅시에 어려움이 있을 것 같아 CASCADE 옵션만 사용하기로 결정했다.

@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "content_file_id")
private ContentFile contentFile; //지문

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "explanation_file_id")
private ExplanationFile explanataionFile; //해설

상속 설정

18.12.23 상속 설정시 입력 수정 삭제 조회시에 많은 어려움이 있어서 사용하지 않기로 결정

AptitudeQuestion과 PersonalityQuesiton 2개의 클래스가 Question이라는 추상 클래스를 상속받는 것이 설계상 좋아보여 도입했다. 엔티티로 상속을 표현하는 방법은 3가지가 있는데, 객체지향적으로 괴리가 없어보이고 많이 사용한다고 하는 조인전략을 사용해서 설정하였다.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "dtype")
public abstract class Question{ 
    //추상클래스 Question 설정
 }
@Entity
@DiscriminatorValue("apt")
public class AptitudeQuestion extends Question {
    //상속받은 AptitudeQuestion 설정
}


☞해당 Domain github주소

반응형
댓글