티스토리 뷰

반응형

서론

Testcontainers을 알게되기 전엔 테스트를 하며 임베디드 처리를 하던 DB, Kafka, Redis등의 인프라들이 있었습니다. 예를 들어, Redis는 https://www.baeldung.com/spring-embedded-redis를 참고하여 임베디드 처리했습니다. 그리고 Kafka는 @EmbeddedKafka를 사용하였습니다. 이런 임베디드 처리 코드를 늘려갈수록 불필요한 코드가 많아짐을 느꼈습니다. 또한, @Profile 처리를 해야하는 일이 많았습니다. 테스트 코드에는 어노테이션이 많아지고 이를 상속으로 해결하려해도 뭔가 지저분해 보여서  다른 방법이 없나에 대한 생각을 하다 Testcontainers를 발견하게 되었습니다. 임베디드보다 간단하게 설정이 가능하고 여러 인프라를 아우르기 때문에 편하다고 느꼈습니다.

 

Testcontainers 설정

testcontainers는 간단한게 dependency로 설치가 가능합니다.

testImplementation("org.testcontainers:junit-jupiter")
testImplementation 'org.testcontainers:mariadb:1.17.1'

위와 같이 junit용 testcontainers dependency를 입력해주면 됩니다.

만약 spock를 테스트 라이브러리로 사용한다면, 해당 dependency를 입력하면 됩니다.

그리고 mariadb와 같은 경우도 별도로 설치를 해줘야하고 사용하는 db에 맞게 찾아 설치하면 됩니다.


https://java.testcontainers.org/

 

Testcontainers for Java

Testcontainers for Java Not using Java? Here are other supported languages! About Testcontainers for Java Testcontainers for Java is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web brow

java.testcontainers.org

위 링크에서 지원가능한 DB와 Module들이 모두 적혀있고, 해당 문서를 읽으면서 설정해주면 됩니다.

이 글에서는 mariadb와 redis만을 다루고자 합니다.


 

DB설정

application.yml 파일에 DB관련 설정 값들을 입력해줍니다.

여기서 주의할 점은 application.yml 파일은 "test/java/resources" 경로에 설정해주는 것입니다.

spring:
  datasource:
    driver-class-name: org.testcontainers.jdbc.ContainerDatabaseDriver
    url: jdbc:tc:mariadb:10:///
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true

간단한 jpa설정과 testcontainers의 url과 driver를 입력해주면 db설정은 끝입니다.

다른 DB를 사용한다면, https://java.testcontainers.org/modules/databases/jdbc/ 에서 url을 확인하고, https://java.testcontainers.org/modules/databases/에서 db dependency를 찾아 설치하면 됩니다.

 

Redis 설정

Redis는 앞선 DB와는 달리 설정이 다릅니다. 왜냐하면 기본적으로 testcontainers에서 지원하지 않기 때문입니다.

이렇게 지원하지 않는 인프라는 GenericContainer를 이용하면 됩니다.

테스트 폴더의 적당한 위치에서 아래의 파일과 같이 만들어줍니다.

@SpringBootTest
public class ProjectDirectionApplicationTests {

    static final GenericContainer MY_REDIS_CONTAINER = new GenericContainer<>("redis:6")
            .withExposedPorts(6379);

    @Before
    public void setup(){
        System.setProperty("spring.redis.host", MY_REDIS_CONTAINER.getHost());
        System.setProperty("spring.redis.port", MY_REDIS_CONTAINER.getMappedPort(6379).toString());
    }

}

위처럼 property에 어떤 이미지를 어떤 포트에 띄울지 설정해주면 끝입니다.

https://java.testcontainers.org/features/creating_container/

 

Creating a container - Testcontainers for Java

Creating a container Creating a generic container based on an image Testcontainers' generic container support offers the most flexibility, and makes it easy to use virtually any container images as temporary test dependencies. For example, if you might use

java.testcontainers.org

위 링크에서 설정을 하는 방법이 설명되어 있습니다.

 

결론

testcontainers를 하면서 테스트를 위한 파일이나 임베디드 설정을 찾기 위해서 고생했던게 훨씬 쉽게 해결되면서 앞으로 테스트 환경을 구축할때는 testcontainer를 사용해야겠다고 생각했습니다. 또한, 어쨌든 라이브러리를 많이 사용해야하는 상황에서 각 라이브러리들의 문서들을 잘 찾아 읽는 능력도 중요하다고 생각이 들었습니다.

728x90
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
250x250