Today
-
Yesterday
-
Total
-
  • Spring Boot: TestContainers 🍃🐳🧑‍🔧
    Spring Boot 🍃 2023. 12. 9. 00:01

    보고 배운 인강

    CRUD 테스트 코드를 작성할 때 어떤 DB 환경이 좋을지에 대한 고민

    다양한 선택지들

    1. 운영환경과 유사한 스펙의 DB ( 개발 환경 DB ) 사용 👉 버전 이슈, 초기 설정 등등 초기 세팅이 복잡하다는 단점이 있다.

    2. 인메모리 DB (ex. h2) 사용 👉 운영환경과 다르기 때문에 통합테스트 환경에선 docker 또는 TestContainers 를 사용하게 된다.

    3. Docker 사용 👉 container 관리를 별도로 해주어야하기 때문에 관리포인트가 늘어나는 단점이 있고, docker를 실행하기 위해 docker-compose 와 같은 스크립트를 별도로 작성해주어야하는 단점이 있다.

    4. TestContainers 이용 👉 TestContainers 는 운영 환경과 유사한 DB 스펙으로 독립적인 환경에서 테스트 코드를 작성하여 테스트가 가능하다.


    TestContainers

    TestContainers 는

    • Java 언어만으로 docker container를 활용한 테스트 환경 구성이 가능하다.

    • 도커를 이용하여 테스트할 때 컨테이너를 직접 관리해야 하는 번거로움을 해결해주며, 운영 환경과 유사한 스펙으로 테스트가 가능하다.

    • 테스트 코드가 실행 될 때 자동으로 도커 컨테이너를 실행하여 테스트하고, 테스트가 끝나면 자동으로 컨테이너를 종료 및 정리해준다.

    • 다양한 모듈이 존재한다.


    적용

    MariaDB와 Redis를 독립된 환경에서 테스트 코드 작성을 위해 TestContainers 적용

    testcontainers jdbc 연동 공식 문서 링크

    build.gradle 의존성 추가

    redis의 경우 제공되는 모듈이 없기 때문에 , docker에서 직접 가져와야한다.

    testImplementation 'org.testcontainers:spock:1.17.1' // test에 사용할 groovy 언어 기반 BDD 프레임워크
    testImplementation 'org.testcontainers:mariadb:1.17.1'

    test/resources/application.yml 작성

    spring:
      datasource:
        driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
        url: jdbc:tc:mariadb:10:///

    redis 싱글톤 컨테이너 실행 코드 작성

    @SpringBootTest
    abstract class AbstractIntegrationContainerBaseTest extends Specification {
    
        static final GenericContainer MY_REDIS_CONTAINER
    
        static {
            MY_REDIS_CONTAINER = new GenericContainer<>("redis:6")
                    .withExposedPorts(6379)
    
            MY_REDIS_CONTAINER.start()
    
            System.setProperty("spring.redis.host", MY_REDIS_CONTAINER.getHost())
            System.setProperty("spring.redis.port", MY_REDIS_CONTAINER.getMappedPort(6379).toString())
        }
    
    }

    spock 를 사용하고 있기 때문에, groovy 언어로 작성 ! java와 스타일이 굉장히 비슷하다.


    'Spring Boot 🍃' 카테고리의 다른 글

    Spring boot & thymeleaf : context path 변경  (0) 2023.12.10
    Spring Boot: Retry  (0) 2023.12.09
    Spring Boot: profile 환경 나누기  (0) 2023.12.09
    rest-projection  (0) 2023.12.09
    csrf  (0) 2023.12.09

Designed by Tistory / Custom by 얼거스