티스토리 뷰

 

MyBatis?

객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 쉽게 할 수 있도록 도와 주는 개발 프레임 워크.

XML 파일의 형태인 mapper를 통해서나 annotation을 사용하여 저장 프로시저나 SQL 문으로 객체를 연결해주는 역할.

 

JDBC 모든 기능을 제공함으로써 길어지기 쉬운 쿼리를 간결화할 수 있고 쉽게 접근하여 사용할 수 있다.

(JDBC는 DB에 접근할 수 있도록 자바에서 제공하는 API)

프로그래밍 코드에서 분리됨에 따라 자바 코드를 수정하지 않고 mapper 파일만 수정하여 확인이 가능하다.

서비스에서 쿼리를 호출할 경우, DAO 에서 쿼리를 호출하는 아키텍쳐를 가지고 있다.

 

 

Spring Data JPA?

JPA는 Java Persistentce API의 약자로 JAVA에서 관계형 DB를 사용하는 방식을 정의한 인터페이스.

Repository 라는 인터페이스를 제공하는데 이 인터페이스를 사용하기만 해도 스스로 내부 구현체를 만들어 동작이 가능.

자주 사용되는 메서드는 선언하지 않아도 사용이 가능.

(ex. findById(), save(), delete(), findAll()) 

 

 

 

QueryDSL?

자바코드 작성하기 때문에 컴파일로 오류를 발견할 수 있다. 

동적인 쿼리 구현 가능.

메서드 호출을 통해 재사용이 가능. 

JPQL의 한계를 극복할 수 있는 대안 방법.

 

* 주로 사용하는 프레임워크 *

 

 

사용 방법

 

1. build.gradle 설정

plugins {
	id 'org.springframework.boot' version '2.7.3'
	id 'io.spring.dependency-management' version '1.0.13.RELEASE'
	id 'java'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}
dependencies {
	/* jpa + querydsl */
	implementation 'org.hibernate:hibernate-entitymanager'
	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
	implementation "com.querydsl:querydsl-jpa"
	implementation "com.querydsl:querydsl-apt"
	implementation "com.querydsl:querydsl-sql"
	implementation "com.querydsl:querydsl-core"
}
/*
 * queryDSL
 */
def querydslDir= "$buildDir/generated/querydsl"

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

sourceSets {
	main.java.srcDir querydslDir
}

compileQuerydsl{
	options.annotationProcessorPath = configurations.querydsl
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

 

 

2. Q 객체 생성

compileQuerydsl 클릭 시 Q 객체가 생성됨

=> build > generated > querydsl 에서 Q 객체 생성 확인

 

 

※ 주의

Q 객체는 git에 등록 X

.gitignore에 디폴트로 등록되어야 한다. 
설정에서 생성 위치를 gradle build 폴더 아래 생성되도록 했기 때문에 주의해야할 부분이 해결.

(대부분 gradle build 폴더를 git에 포함하지 않는다.)

 

 

 

Querydsl 간단한 사용 예제
import com.querydsl.jpa.impl.JPAQueryFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

import javax.persistence.EntityManager;

@EnableJpaAuditing
@Configuration
public class JpaConfiguration {
    @Bean
    public JPAQueryFactory jpaQueryFactory(EntityManager em) {
        return new JPAQueryFactory(em);
    }
}

 

EntityManager를 파라미터로 삼는 JPAQueryFactory를 Bean으로 등록하여 전역에서 쉽게 JPAQueryFactory를 사용할 수 있게 할 수 있다.

 

 

🔸 Example 🔸 

public List<targetDto> findList(targetDto dto) {
        return factory
                .select(Projections.fields(targetDto.class,
                                table.fieldName
                        )
                )
                .from(table)
                .leftJoin(joinTable)
                .on(
                        table.key.eq(joinTable.key)
                )
                .where(
                        tableWhere
                )
                .fetch();
    }

 

List로 반환할 경우, 예제를 간략하게 짜봤는데 이를 활용해서 다양한 쿼리를 작성할 수 있고

조건절에 들어가는 내용은 따로 함수로 빼서 작업해도 수월하다.

 


 

 

 

 

 

 

 

 

[ 참조 ]

https://velog.io/@changyeonyoo/

https://velog.io/@yebali/

https://velog.io/@mooh2jj/QueryDSL%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0