걸어서 개발 속으로

내장DB 커스텀 함수

손건호 2023. 5. 31. 21:29

https://pushvalue.tistory.com/63

 

test case를 위한 test DB

테스트 케이스를 만들고 있다 테스트 하나를 실행하면 그 흔적이 서비스중인 테이터베이스에 그대로 남는다 언제 어떤구현부를 테스트 했는지 알수도 있겠지만 서비스와 목적이 맞지않는 데이

pushvalue.tistory.com

서비스에 사용하는 mariaDB는 쿼리문에 함수를 포함시켜 기능을 사용할수있다

그 기능으로 작업시간을 저장 하거나 해싱값을 저장 하거나 할수 있다

 

위의 블로그처럼 테스트를 위한 데이터베이스를 도입 했는대

해당 데이터베이스는 H2로 spring boot 내장 데이터베이스로

쿼리문에 함수를 사용하려면 커스텀 함수라는것을 직접 구현 해야 한다

mysql에서 사용하는 함수들은 내장 H2 DB 에서 유효하지않아 쿼리문 오류를 발생 시켰다

 

서비스를 동작 시키는 구현부를 검증하는 테스트 코드라서

내장 데이터베이스에 함수를 지원 하지않는다고 해서

서비스 구현부의 함수를 모조리 지워버릴수는 없다

 

구현부를 검증하려고 테스트를 만드는건데

테스트 때문에 구현부 코드를 수정한다는건

배보다 배꼽이 더 큰 일이다

 

그래서 커스텀 함수를 spring boot test디랙토리 하위에 구현해 보았다

public class H2CustomFunctions {
    public static String sha2(String input, int num) {
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] digest = md.digest(input.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString().toLowerCase();
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException(e);
        }
    }

ChatGPT에 물어본 코드다 해당 해시값을 mariaDB 해시값과 비고해보니 일치했다

sha256 알고리즘을 사용하고 소문자로 변경해주는 절차라 동일한 과정 이었다

 

이제 sha2 메서드를 구현 했으니

H2 DB가 해당 메서드를 커스텀 함수로 인식하기만 하면 된다

나의 경우 @BeforeEach 에 포함하여 sha2 함수를 생성해주었다

String createSha2Sql ="CREATE ALIAS SHA2 FOR 'com.geonho1943.LFG.utils.H2CustomFunctions.sha2'";

해당 쿼리를 jdbcTemplate을 사용하여 요청해줬다

jdbcTemplate.batchUpdate(createSha2Sql);

해당 패키지는 test하위 디랙토리이기때문에 빌드시 빌드파일에 합류하는 범위에 속하지않는다

 

이렇게 하면 서비스코드의 쿼리문에 SHA2() 함수를

서비스 데이터베이스에서 정상작동,

테스트 테이터베이스에서 커스텀 함수로 정상 작동,

양쪽에서 정상적으로 함수를 사용하여 데이터베이스에 저장 할수 있다