본문 바로가기
Spring/SpringBoot

[SpringBoot] QueryDSL에서 DB Function 사용하기

by J4J 2022. 9. 29.
300x250
반응형

안녕하세요. 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();
	}
}

 

 

728x90

 

 

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 사용하는 방법에 대해 간단하게 알아보는 시간이었습니다.

 

읽어주셔서 감사합니다.

 

 

 

728x90
반응형

댓글