안녕하세요. J4J입니다.
이번 포스팅은 QueryDSL에서 DB Function 사용하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
들어가기에 앞서...
이번 글에서 제가 사용할 DB는 MySQL입니다.
그리고 테스트를 위한 MySQL Function을 다음과 같이 생성해뒀습니다.
CREATE DEFINER=`root`@`localhost` FUNCTION `get_function_test`(p_name varchar(100), p_age int) RETURNS varchar(200) CHARSET utf8
BEGIN
declare p_return_value varchar(100);
select concat('이름은 ', p_name, '이고 나이는 ', p_age, '입니다.')
into p_return_value;
RETURN p_return_value;
END
해당 함수를 QueryDSL에서 어떻게 불러와 사용할 수 있는지 순서대로 말씀드려보겠습니다.
QueryDSL 함수 사용 방법
[ 1. dialect 설정 파일 생성 ]
일반적으로 boot를 이용하여 jpa 개발을 한다면 application.properties나 application.yml 등의 파일에 다음과 같이 사용되는 DB의 dialect를 등록해두셨을 겁니다.
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
이 dialect를 각자 사용되는 환경에 맞게 새롭게 커스텀해서 만들어주시면 되고 그 과정에서 function을 등록해주면 됩니다.
MySQL을 사용한다면 다음과 같이 클래스 파일을 하나 만들어 줄 수 있습니다.
package com.querydsl.config;
import org.hibernate.dialect.MySQLDialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StringType;
public class MySQLDialectConfig extends MySQLDialect {
public MySQLDialectConfig() {
super();
this.registerFunction("get_function_test", new StandardSQLFunction("get_function_test", new StringType()));
}
}
추가로 만약 Oracle을 사용한다면 다음과 같이 만들어 줄 수도 있습니다.
package com.querydsl.config;
import org.hibernate.dialect.Oracle10gDialect;
import org.hibernate.dialect.function.StandardSQLFunction;
import org.hibernate.type.StringType;
public class OracleDialect extends Oracle10gDialect {
public OracleDialect() {
super();
this.registerFunction("get_function_test", new StandardSQLFunction("get_function_test", new StringType()));
}
}
dialect 설정 파일을 위와 같이 만들었다면 기존 dialect 설정을 다음과 같이 클래스 파일 경로로 변경해주시면 됩니다.
spring.jpa.properties.hibernate.dialect=com.querydsl.config.MySQLDialectConfig
[ 2. repository에서 function 사용하기 ]
repository에서 function 사용은 다음과 같이 할 수 있습니다.
package com.querydsl.repository;
import static com.querydsl.entity.QStudent.student;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.querydsl.core.types.Projections;
import com.querydsl.core.types.dsl.Expressions;
import com.querydsl.entity.Student;
import com.querydsl.jpa.impl.JPAQueryFactory;
@Repository
public class FunctionRepository {
@Autowired
private JPAQueryFactory jpaQueryFactory;
public List<Student> function() {
return jpaQueryFactory.select(Projections.fields(Student.class,
student.no,
Expressions.stringTemplate("get_function_test({0}, {1})",
student.name,
student.age)
.as("name")))
.from(student)
.fetch();
}
}
function명 옆에는 파라미터의 갯수만큼 0부터 작성해주시면 되고, 그 뒤에는 파라미터로 사용될 값들을 순서대로 넣어주시면 됩니다.
만약 결과값에 대해 alias가 필요하다면 as를 이용하여 이름도 정의해주시면 됩니다.
테스트
위와 같이 코드들을 작성하고 테스트를 해보면 다음과 같이 결괏값이 출력됩니다.
[ main] c.q.QuerydslFunctionApplicationTests : [Student(no=1, name=이름은 Student 22이고 나이는 13입니다., age=0, schoolNo=0), Student(no=2, name=이름은 Student 1이고 나이는 13입니다., age=0, schoolNo=0), ...
DB Function이 그대로 적용되어 결과로 나오는 모습을 확인할 수 있습니다.
이상으로 QueryDSL에서 DB Function 사용하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
'Spring > SpringBoot' 카테고리의 다른 글
[SpringBoot] AWS Lambda로 배치 만들기 (2) - Lambda 생성해서 배포하기 (0) | 2022.12.12 |
---|---|
[SpringBoot] AWS Lambda로 배치 만들기 (1) - Spring 세팅 및 로컬 테스트 (0) | 2022.12.05 |
[SpringBoot] QueryDSL에서 상수값 사용하기 (0) | 2022.09.26 |
[SpringBoot] Oracle과 동일한 AES 암호화하기 (0) | 2022.07.30 |
[SpringBoot] MySQL과 동일한 AES 암호화하기 (0) | 2022.07.25 |
댓글