SpringBoot with JPA 프로젝트 2. Entity 클래스와 Querydsl 설정

mingki·2022년 1월 30일
0

SpringBoot & JPA

목록 보기
4/26


📚 공부한 책 : 코드로배우는 스프링 부트 웹프로젝트
❤️ github 주소 : https://github.com/qkralswl689/LearnFromCode/tree/main/guestbook2022

1.Entity 클래스 생성

Entity클래스 생성후 BaseEntity를 상속한다

  • 예제코드
import lombok.*;
import javax.persistence.*;

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Guestbook extends BaseEntity{

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // index 자동생성
    private Long gno;

    @Column(length = 100,nullable = false)
    private String title;

    @Column(length = 1500,nullable = false)
    private String content;

    @Column(length = 50, nullable = false)
    private String writer;
}
  • 프로젝트를 실행하면 아래와같은 SQL로 테이블이 만들어진다(BaseEntity클래스 상속으로 moddate,regdate 컬럼자동생성)
Hibernate:     
    create table guestbook (
       gno bigint not null auto_increment,
        moddate datetime(6),
        regdate datetime(6),
        content varchar(1500) not null,
        title varchar(100) not null,
        writer varchar(50) not null,
        primary key (gno)
    ) engine=InnoDB
  • 테이블 생성확인

2.repository 인터페이스 작성

JPARepository 상속받는 인터페이스로 구성한다

  • 예제코드
import com.example.guestbook2022.entity.Guestbook;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;

public interface GuestbookRepository  extends JpaRepository<Guestbook,Long>{
    
}

3.Querydsl설정

동적으로 쿼리를 생성해 처리할 수 있는 Querydsl을 추가한다
-> Querydsl는 복잡한 조합을 이용하는 경우의수가 많은 상황을 처리할 수 있는 기술이다
Querydsl을 이용하면 복잡해진 검색조건 OR 조인 OR 서브쿼리 드으이 기능도 구현이 가능하다
★ Querydsl을 이용하면 코드내부에서 상황에 맞는 쿼리를 생성할 수 있지만 작성된 엔티티 클래스를 그대로 이용하는것이 아닌 'Q 도메인' 이라는것을 이용해야한다 => Querydsl라이브러리를 이용해 엔티티 클래스를 'Q도메인' 클래스로 변환하는 방식을 이용하기 위해 추가적인 설정이 필요하다

☆ 3-1.build.gradle 설정

// querydsl 추가 
//  (gradle 5.0 이상부터는 옵션을 이렇게 넣어주어야 함)
buildscript {
	ext {
		queryDslVersion = "5.0.0"
	}
}
// querydsl 추가 끝
plugins {
	id 'org.springframework.boot' version '2.6.3'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10' // querydsl 사용을 위해 추가된 항목
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	compileOnly 'org.projectlombok:lombok'
	developmentOnly 'org.springframework.boot:spring-boot-devtools'
	runtimeOnly 'mysql:mysql-connector-java'
	annotationProcessor 'org.projectlombok:lombok'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	// querydsl 추가
	implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
	implementation "com.querydsl:querydsl-apt:${queryDslVersion}"
}

tasks.named('test') {
	useJUnitPlatform()
}

// querydsl 추가 시작
def querydslDir = "$buildDir/generated/querydsl"

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}

sourceSets {
	main.java.srcDir querydslDir
}

//  (gradle 5.0 이상부터는 옵션을 이렇게 넣어주어야 함)
configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}
// querydsl 추가 끝

☆ 3-2.compileQuerydsl 실행

☆ 3-3.생성된 폴더 확인

생성된 파일은 모두 'Q'로 시작하고 이후는 엔티티 클래스의 이름과 동일하게 만들어진다

☆ 3-4.생성된 클래스 내부 확인

생성된 Q클래스 내부를 살펴보면 내부적으로 선언된 컬럼들이 변수 처리 된 것을 확인할 수 있다
=> Q로 시작하는 클래스들은 개발자가 건드리지 않는다 , gradle의 complieQuerydsl과 같은 task를 통해 자동으로 생성되는 방법만 사용한다

import static com.querydsl.core.types.PathMetadataFactory.*;

import com.querydsl.core.types.dsl.*;

import com.querydsl.core.types.PathMetadata;
import javax.annotation.processing.Generated;
import com.querydsl.core.types.Path;


/**
 * QBaseEntity is a Querydsl query type for BaseEntity
 */
@Generated("com.querydsl.codegen.DefaultSupertypeSerializer")
public class QBaseEntity extends EntityPathBase<BaseEntity> {

    private static final long serialVersionUID = -1058028993L;

    public static final QBaseEntity baseEntity = new QBaseEntity("baseEntity");

    public final DateTimePath<java.time.LocalDateTime> modDate = createDateTime("modDate", java.time.LocalDateTime.class);

    public final DateTimePath<java.time.LocalDateTime> regDate = createDateTime("regDate", java.time.LocalDateTime.class);

    public QBaseEntity(String variable) {
        super(BaseEntity.class, forVariable(variable));
    }

    public QBaseEntity(Path<? extends BaseEntity> path) {
        super(path.getType(), path.getMetadata());
    }

    public QBaseEntity(PathMetadata metadata) {
        super(BaseEntity.class, metadata);
    }

}

☆ 3-5.Repository interface 설정

Querydsl을 이용하면 Repository 역시 QuerydslPredicateExecutor라는 인터페이스를 추가로 상속해야한다

import com.example.guestbook2022.entity.Guestbook;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.querydsl.QuerydslPredicateExecutor;

public interface GuestbookRepository extends JpaRepository<Guestbook,Long>,QuerydslPredicateExecutor {

}

profile
비전공초보개발자

0개의 댓글