728x90

테스트 코드를 공부하면서 실습하던 중 DB연결과 관련해서 고민거리가 생겼다.

게시글 작성과 관련된 테스트에서 정상적으로 테스트가 진행된 뒤 데이터는 삭제되었지만 해당 테이블의 ID가 Auto Increment로 설정되어있어 실제 게시글을 작성했을 때 ID가 테스트를 실행했던 만큼 뒤로 밀리는 현상이 발생했다. 사실 DB에서 데이터만 정상적으로 삭제된다면 별 상관은 없겠지만 그 이전에 '테스트'가 DB에 영향을 준다는 것이 신경쓰였기에 해결방법을 찾아보았다.

 내가 선택한 해결법은 아주 간단하지만 명확한 방법으로 바로 테스트용 DB를 생성하고 테스트는 해당 DB를 이용하는 방법이다. 이 방법을 적용하는 법은 매우 간단하다. 총 2개의 파일만 생성하면 된다. (먼저 이 포스팅에서 설명하는 방법은 스프링부트를 기준으로 설명하는 것이기 때문에 스프링 레거시 프로젝트는 적용법이 다를 것이다.)

 스프링 부트에서는 여러 설정을 간편하게 관리하기 위해서 apllication.properties(or yml) 파일이 존재한다. 해당 파일은 일반적으로 디렉토리의 'main/resources'에만 존재한다. 해당 파일에 여러 설정값들을 작성해주면 스프링부트를 실행할 때 값들이 주입되거나 설정되어 프로젝트 실행에 필요한 요소들을 알아서 채워준다. 그럼 테스트용 DB를 만들고 연결하기 위해선 어떤 과정이 필요할까. 바로 DB를 생성하고 관련된 정보를 저장한 test용 application.properties(or yml) 파일을 작성하면 된다. 테스트용 application 파일의 위치는 'test/resources' 아래에 저장하면 된다.

디렉토리 구조

# ~/test/resources/application.yml
spring:
  datasource:
    # DB와 프로젝트에 따라 알맞은 내용 작성
    driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
    jdbc-url: jdbc:log4jdbc:mysql://localhost:3306/playground_test
    username: root
    password: 1234
    
  # JPA 사용 시 설정
  jpa:
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQL8Dialect
        format_sql: false
    hibernate:
      ddl-auto: create
      
# mybatis 사용 시 설정
mybatis:
  type-aliases-package: kim.jiwook.playground.vo
  mapper-locations: classpath:/mapper/*.xml
  
# sql logging 사용 시 설정
logging:
  level:
    jdbc:
      sqlonly: off
      sqltiming: info
      audit: off
      resultset: off
      resultsettable: info
      connection: off

위의 내용을 바탕으로 본인의 프로젝트에 맞게 내용들을 추가, 수정, 삭제한 뒤 테스트를 진행해주면 된다.

 그럼 결과적으로 실제 DB와 분리된 테스트용 DB로 테스트를 진행할 수 있게 된다.

몇번을 실행하던 게시글 작성결과 generated_key는 1이다.


 

 

test: 테스트용 DB 분리 · N1ghtsky0/playground@dbdeb58

* 게시글 작성 api 테스트를 진행하면서 데이터는 지워졌지만 ID가 auto increment라 실제 데이터가 입력되었을 때 id가 밀리는 현상을 방지하기 위해 DB를 분리함

github.com

 

+ Recent posts