📚 공부한 책 : 코드로배우는 스프링 부트 웹프로젝트
❤️ github 주소 : https://github.com/qkralswl689/LearnFromCode/tree/main/guestbook2022
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;
}
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
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>{
}
동적으로 쿼리를 생성해 처리할 수 있는 Querydsl을 추가한다
-> Querydsl는 복잡한 조합을 이용하는 경우의수가 많은 상황을 처리할 수 있는 기술이다
Querydsl을 이용하면 복잡해진 검색조건 OR 조인 OR 서브쿼리 드으이 기능도 구현이 가능하다
★ Querydsl을 이용하면 코드내부에서 상황에 맞는 쿼리를 생성할 수 있지만 작성된 엔티티 클래스를 그대로 이용하는것이 아닌 'Q 도메인' 이라는것을 이용해야한다 => Querydsl라이브러리를 이용해 엔티티 클래스를 'Q도메인' 클래스로 변환하는 방식을 이용하기 위해 추가적인 설정이 필요하다
// 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 추가 끝
생성된 파일은 모두 'Q'로 시작하고 이후는 엔티티 클래스의 이름과 동일하게 만들어진다
생성된 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);
}
}
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 {
}