./gradlew clean build

213kky·2025년 1월 29일

문제


배포하는 과정에서 .jar를 생성하기 위해 ./gradlew clean build 명령어를 사용했다.
하지만 해당 과정에서 test코드를 실행하는 부분에서 문제가 발생하였다.
원인은 test 코드를 실행 할 때 데이터 베이스를 연결을 시도하는데 .jar파일을 만들때 비밀값들을 아래와 같이 설정해 놨기 때문이다.

spring:
  datasource:
    url: jdbc:mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}?serverTimezone=Asia/Seoul
    username: ${DATABASE_USERNAME}
    password: ${DATABASE_PASSWORD}
    driver-class-name: com.mysql.cj.jdbc.Driver

실행을 위해서는 환경변수를 주입하여 build 해야하지만 환경변수를 주입하면 .jar 파일이 생성될 때 해당 값들이 세팅된다. 로컬에서 실행을 위한 것이라면 상관이 없지만 docker image로 만들고 이후 도커허브에 올려서 ec2에서 받아 사용할 것이기 때문에 보안상 문제가 발생할 수 있다.


해결방법


1. ./gradlew clean build -x test

테스트 단계를 제외하고 빌드만 수행하는 방법이다.
-x test 옵션을 사용하면, ./gradlew build 명령어 실행 시 테스트를 건너뛰고 빌드를 진행할 수 있다.

장점

빠른 빌드 시간: 테스트를 제외하면 빌드 시간이 단축되어 배포 속도 향상

단점

테스트 누락: 테스트가 제외되므로, 빌드 과정에서 테스트가 실행되지 않아 버그가 포함될 가능성이 있다. 이로 인해 실제 실행 환경에서 문제가 발생할 수 있다.

2. Spring Boot Test 코드 작성 시 Test용 DB 사용하기

Test용 데이터베이스를 설정하여 테스트를 위한 환경에서만 데이터를 처리하도록 하는 방법이다.

장점

테스트 환경 분리: 실제 DB와 분리되어 테스트할 수 있기 때문에, 테스트 데이터가 실제 데이터에 영향을 주지 않음.
자동으로 DB 초기화: 테스트마다 DB를 초기화할 수 있어, 깨끗한 상태에서 테스트를 진행한다.
테스트 독립성: 실제 DB와 독립적으로 테스트를 할 수 있어, DB 설정이 잘못되었을 경우에도 문제가 발생하지 않는다.

단점

테스트 환경 설정 필요: Test용 DB 설정을 별도로 작성해야 하므로, 추가적인 설정이 필요하다.
실제 DB와 차이점: Test용 DB는 실제 DB와 완전히 일치하지 않을 수 있으므로, DB 관련 테스트가 실제 환경과 다르게 동작할 수 있다.


채택


1번 방법을 사용하면 빌드 속도가 빨라지겠지만 테스트를 진행하지 않아 버그가 발생 할 수 있다. 이를 해결하기 위해 배포하기 이전에 따로 테스트를 진행해야 하는데 매번 번거로운 작업이 될 것 같고, 실수로 테스트를 안할 가능성 또한 있기 때문에 2번방법을 채택하여 사용하려한다.


참고
Spring Boot Test 코드 작성 시 Test용 DB 사용하기

profile
since 2022

0개의 댓글