부트캠프(66일차)

성준혁·2023년 2월 1일
post-thumbnail

오늘은 66일차이다. 오늘도 JPA 심화 내용을 공부하였고, 그 중에 영속성 전이(CASCADE)와 고아 객체(ORPHAN) 와 Fetch 전략에 대한 개념과 종류에 대해서 공부하였고, 남은 시간에는 틈틈이 자바 문법과 스프링에 대해 공부를 하였다. 이번주까지는 이런 식으로 공부를 하지 않을까 싶다. 자바 문법은 개발을 안할 때까지 복습하는 것이 중요한 것 같다.

오늘 배운 것

1. 영속성 전이(CASCADE)란?

  • 영속성 전이(CASCADE)란 특정 엔티티를 영속성 상태로 만들때 연관되어진 엔티티도 함께 영속성 상태로 변경하는 것을 말한다.

1-1. 영속성 상태 저장(CascadeType.PERSIST)

1-2. 영속성 상태 삭제(CascadeType.REMOVE)

1-3. 영속성 상태 모두 적용(CascadeType.ALL)

1-4. 영속성 상태 병합(CascadeType.MERGE)

1-5. 영속성 상태 REFRESH(CascadeType.REFRESH)

1-6. 영속성 상태 DETACH(CascadeType.DETACH)

2. 고아 객체(ORPHAN)란?

  • 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 고아 객체라고 한다.

3. Fetch 전략이란?

  • 특정 엔티티를 조회할 때, 연관관계에 있는 다른 엔티티를 언제 불러올까에 대한 옵션이다.

3-1. 즉시 로딩(EAGER)

  • 엔티티를 조회할 때 연관된 엔티티도 함께 조회한다.
  • 즉시 로딩을 최적화하기 위해 가능하면 조인쿼리를 사용한다.
  • @ManyToOne(fetch = FetchType.EAGER)
  • @OneToOne(fetch = FetchType.EAGER)

3-2. 지연 로딩(LAZY)

  • 연관된 엔티티를 실제 사용할 때 조회한다.
  • @ManyToOne(fetch = FetchType.LAZY)
  • @OneToMany(fetch = FetchType.LAZY)

3-3. 결론

  • 모든 연관관계에 지연 로딩을 사용하고 필요한 곳에만 즉시 로딩을 사용하는 것이다.
  • 성능적응로 좀 더 좋게 사용할 수 있다.

4. QueryDSL 의 버전별 연동방법

4-1. Spring 2.X버전까지는 QuertDSL 빌드 Task를 따로 설정해워야 한다.

4-1-1queryDSL 의존성, 소스 디렉토리 설정, annotation 프로세서 설정, Task 정의를 해준다.

plugins {
    ...
    id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}

compileQuerydsl{
    options.annotationProcessorPath = configurations.querydsl
}

configurations {
    ...
    querydsl.extendsFrom compileClasspath
}

def querydslSrcDir = 'src/querydsl/generated'

querydsl {
    library = "com.querydsl:querydsl-apt"
    jpa = true
    querydslSourcesDir = querydslSrcDir
}

sourceSets {
    main {
        java {
            srcDirs = ['src/main/java', querydslSrcDir]
        }
    }
}

project.afterEvaluate {
    project.tasks.compileQuerydsl.options.compilerArgs = [
            "-proc:only",
            "-processor", project.querydsl.processors() +
                    ',lombok.launch.AnnotationProcessorHider$AnnotationProcessor'
    ]
}

dependencies {
    implementation("com.querydsl:querydsl-jpa") // querydsl
    implementation("com.querydsl:querydsl-apt") // querydsl
    ...
}

4-1-2. QueryDSL gradle 빌드 스크립트 원리

  • Gradle 빌드시에 QueryDSL은 프로젝트 내의 @Entity 어노테이션을 선언한 클래스를 탐색하고, JPAAnnotationProcessor를 사용해 Q클래스를 생성한다.
  • querydsl-apt가 @Entity 및 @Id 등의 매핑정보 Annotation을 알 수 있도록, javax.persistence과 javax.annotation을 annotationProccessor에 함께 추가한다.
  • annotationProcessor는 Java 컴파일러 플러그인으로서, 컴파일 단계에서 어노테이션을 분석 및 처리함으로써 추가적인 파일을 생성한다.
  • 개발 환경에서 생성된 Q클래스를 인지할 수 있도록 /build/generated 디렉토리를 프로젝트의 sourceSet에 추가한다.
  • IDE에서도 생성된 Q 클래스 파일을 인식하여 개발할 수 있다.

4-2. Spring 3. X 버전부터는 의존성만 추가하면 빌드에 자동으로 포함되서 실행된다.

4-2-1. Spring 3.X 버전 연동설정

  • 의존성만 추가하면 된다.
// application.yml

dependencies {
		....

		// 9. QueryDSL 적용을 위한 의존성 (SpringBoot3.0 부터는 jakarta 사용해야함)
    implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

0개의 댓글