Wiremock 사용법 (with Groovy Spock)
2022. 10. 23. 17:17
Server/Test
spring boot에서 integration test를 작성할 때 RestTemplate이나 WebClient를 이용한 http call에 대한 테스트를 지원하는 여러가지 툴이 있는데, 그중에 WireMock에 대한 사용법을 공유하고자 한다. 전체 코드는 아래에서 볼 수 있습니다. https://github.com/pooi/wiremock-example GitHub - pooi/wiremock-example Contribute to pooi/wiremock-example development by creating an account on GitHub. github.com WireMock이란? https://wiremock.org WireMock은 지정한 로컬 포트에 mocking 서버를 띄워 해당 포트..
Spock 병렬 테스트하기
2022. 10. 23. 15:06
Server/Test
유닛 테스트를 작성하다 보면 병렬로 테스트해서 테스트 속도가 좀 빨라졌으면 좋겠다고 생각한 적이 많은데, Spock 2.0 이상 버전부터는 병렬 테스트가 가능해졌다. https://spockframework.org/spock/docs/2.0-M4/parallel\_execution.html 가이드 문서를 살펴보면 SpockConfig.groovy 파일에 아래 내용을 추가하면 된다고 알려주고 있다. runner { parallel { enabled true } } 따라서 프로젝트에 src/test/resources/SpockConfig.groovy 이 경로에 파일을 추가하면 병렬 테스트가 가능해진다. 적용 전 적용 후 또한, defaultSpecificationExecutionMode와 defaultExe..
WebClient 생성 방법 및 여러개의 WebClient 쉽게 생성하기
2022. 10. 2. 15:53
Server/Spring Boot
Spring Boot Webflux에서는 다른 서버와 http 통신을 하기 위해 WebClient를 기본으로 제공하고 특별한 사유가 없다면 WebClient를 사용한다. 대부분 도메인마다 WebClient를 하나 만들어두고 사용하기 때문에 MSA로 이루어진 환경에서는 여러 endpoint 호출을 위해 여러 개의 WebClient를 생성하게 된다. 여러 WebClient를 사용하다 보면 필연적으로 중복 코드가 발생될 확률이 높으며 새로운 WebClient를 추가할 때마다 간단하지만 귀찮은 작업이 동반될 수 있다. 따라서 이 글에서는 WebClient를 생성하는 방법과 config 기반으로 여러개의 WebClient를 자동으로 생성해주는 방식에 대해 공유하고자 한다. WebClientProperties 클래..
Spring Boot 테스트 속도 개선기
2022. 9. 19. 20:03
Server/Test
문제점 대부분의 부서가 비슷하겠지만 유닛 테스트 작성이 정말 중요해지고 있다. 유닛 테스트는 개발할 때뿐만 아니라 여러 배포 과정에서도 자주 수행되는 요소 중 하나이다. (내가 짠 코드를 나도 100% 믿지 못하기 때문에..) 우리 부서에 몸집이 상당히 커진 legacy 프로젝트가 하나 있는데, 나름 이 프로젝트도 유닛 테스트는 꼼꼼히 작성되어 있는 편이다. 하지만 문제는 거기서 발생했다. 몸집이 너무 커진 프로젝트다 보니 처음부터 테스트를 꼼꼼히 작성하지 않아, 테스트 코드에 대한 설계가 주먹구구식으로 되어있었다. 이 프로젝트는 약 600개가량의 테스트가 작성되어 있고, 이 테스트를 모두 수행하는 데 6분 이상의 시간이 소요되고 있는 실정이었다. 우리는 보통 아래 4가지 경우마다 유닛 테스트를 실행시키..
Spring Webflux + Coroutine에서 Context 관리하기 (downstream으로 context 변경 전파하기) - 2편
2022. 9. 18. 22:07
Server/Spring Boot
바로 이전 1편에서의 내용을 이어서 진행해보면 suspend fun 안에서는 아래의 방법으로 Reactor Context에 직접 접근하는 것이 가능하다. 이는 context 정보를 사용하기 위해 MDC를 거칠 필요가 없다는 것이다. currentCoroutineContext()[ReactorContext]?.context 위에서 우리가 context-map이라는 key를 이용해 Map 객체를 context에 넣었던 것을 기억한다면, context-map 객체에 접근하기 위해 아래와 같이 활용할 수 있겠다는 생각이 들 수 있을 것이다. suspend fun getContextMap(): MutableMap? = currentCoroutineContext()[ReactorContext] ?.context ?..
Spring Webflux + Coroutine에서 Context 관리하기 (downstream으로 context 변경 전파하기) - 1편
2022. 9. 18. 22:06
Server/Spring Boot
Spring Webflux를 통해 개발하다 보면loggingId, 헤더를 통해 들어온 값 등 여러 context 값을 관리하기 위해 MDC를 사용한다. 많은 블로그에서 Spring Webflux에서 어떻게 MDC를 이용할 수 있는지에 대해 잘 설명하고 있다. 따라서 이 글에서는 MDC를 이용하는 방법에 대해 다시 한번 설명하고, 어떤 문제 점이 있는지, coroutine에서는 어떻게 더 활용할 수 있는지에 대해 작성해보고자 한다. MDC 및 Context를 어떻게 사용하는지에 대해 생각해보면 Tracing ID를 context에 저장해서 log tracing이 가능하게 한다. (불변성 데이터를 context에 넣고 사용) 한 Request 안에서 호출되는 모든 함수에서 인자를 통해 값을 넘길 필요 없이 ..