Spring

@Sql Annotation을 이용한 SQL Query 관리

깡구_ 2023. 5. 10. 18:51

title: @Sql Annotation을 이용한 SQL Query 관리
date: 2023-05-10
tags:

  • Spring



Introduction

최근 새로운 프로젝트의 테스트 코드 작성 중 Query 관리로 문제를 겪었다.
이전에는 각 클래스마다 String으로 DDL을 명시하였으나, 프로젝트의 규모가 커진다면 관리가 어렵다고 판단하였다.
별도의 파일로 Query를 관리하는 과정에서 겪은 문제들과 이에 대한 해결, 한계 등을 정리한다.

Problem

DDL의 경우, .sql 파일로 관리하는 것이 편하다고 판단하였다.
하지만 DDL을 제외한 Query는 Service 로직에서 사용되며, 이 경우 .sql 파일을 이용하려면 직접 파싱해야 한다.
이 과정은 번거로우며 확장성이 그리 좋지 않다고 느꼈으며, Query를 가져오기 위해 서버의 Resource를 이용한다는 점이 매우 불편하다고 판단했다.

우선 ddl.sql 을 이용해야 하는데, JPA나 Hibernate를 쓰지 않을 경우 ddl-auto 사용이 매우 어려웠다.
initialization-mode: always로 설정하여도 계속하여 DDL이 이루어지지 않았으며, 정확한 원인을 파악하지 못하였다.
문제 해결 과정에서 @Sql Annotation을 발견하였고, 이를 활용하여 문제를 해결하였다.

No Table

Solution

우선 @Sqlsrc/main/resources 경로가 Default이다.
resources 하위에 sql/book 디렉토리를 추가하였으며, 그 내부에 ddl.sql을 추가하였다.
DDL은 여러 Test를 진행하기 전에 선행되어야 하므로 Class 레벨에 Annotation을 추가한다.

Test Passed

Limitation

현재 DDL은 src/main/resources 하위에 존재하며, 그 외의 Query는 src/main/java에 존재한다.
DDL을 이동할 경우 Gradle에서 직접 Default 경로를 수정하여야 하며, 그 외의 Query를 이동할 경우 별도의 파싱 작업이 필요하다.
Query가 나누어져 저장이 되는 상황이며, 과연 이것이 Best Practice인가? 라는 의문이 계속 든다.

Reference

Sql을 통해서 테스트 코드를 쉽게 작성하자

  • 본 포스팅에서는 더욱 자세한 @Sql 사용법이 나와 있다.