해결된 질문
작성
·
639
·
수정됨
1
강의를 굉장히 감명 깊게 보고 Spring 기반으로 되어 있는 레거시 프로젝트에 도메인을 분리하고 유닛 테스트를 넣는 작업을 하고 있습니다. 여기에서 가장 답답한 게 단순한 유닛 테스트임에도 빌드 타임을 그대로 기다려야 한다는 점인데요. 비록 빌드 캐시 덕에 아주 오래 걸리는 건 아니긴 해도 몇십 ms면 끝날 테스트를 몇 초씩 기다려야 하는 점이 많이 답답합니다. 시간 상으로는 인메모리 db를 띄우는 것과 별 차이 없는 것 아닌가? 하는 생각이 들 정도예요. (물론 테스트 코드를 작성하기 쉬운 구조가 좋은 코드 구조라는 명제에는 이견이 없기 때문에 별 차이가 없다 하더라도 계속 진행할 예정입니다.)
선생님께서도 담당하시던 시스템에 유닛 테스트를 붙이는 작업을 하셨다고 들었는데 이러한 부분은 어떻게 극복하셨는지 궁금합니다.
답변 2
1
안녕하세요. 근래에 책을 집필할 기회가 생겨 그쪽에 힘을 실어주다 보니 다른 일에 신경 쓰지 못했습니다. 답변이 늦어 죄송합니다. 다만 해당 강의는 공식적으로 질의응답을 제공하지 않는 강의였다는 점을 이유로 늦어진 부분에 대해 양해 부탁드립니다.
애석하게도 극복하지 못했습니다. 😭 그래도 답변은 달아야 하기에, 미약한 경험담이나 제가 알고 있는 정보라도 풀어보고자 합니다.
[경험담] 제가 최근에 시도하고 있는 방법은 하나의 거대한 프로젝트를 만들기 보다 멀티 모듈로 프로젝트를 만들도록 하는 것입니다. 원래 담당하던 프로젝트에서도 멀티 모듈로 프로젝트를 개발했지만, 최근에 진행하는 프로젝트는 더 세분화해서 관리합니다. (이전: 8개, 현재: 13개) 그리고 단위 테스트를 각 모듈마다 작성하도록 해서 테스트가 모듈 단위로 동작하게 만들었습니다. 그렇게 해서 모듈 별 테스트를 돌릴 때는 빌드가 조금이라도 빠르게 이뤄지도록 했고요.
그런데 이렇게 해서 해피 엔딩이었다면 좋겠지만, 솔직히 막 엄청 빨라져서 빌드 타임을 신경 쓰지 않아도 될 정도가 되진 않았고요. 아주 약간 체감 된 정도였습니다.
[경험담] 빌드 타임은 gradle을 사용하면 조금 더 빨라지는 느낌이었습니다. 실제로 gradle에선 maven을 사용했을 때보다 빌드 타임이 빨라진다는 자료를 강조해 홍보하고 있고요. (https://gradle.org/maven-vs-gradle/)
이건 진짜로 변환하면 빨라진 게 조금 느껴집니다.
[경험담] 번외로 node(자바스크립트) 진영에서는 test watch 모드를 지원합니다. (https://nodejs.org/api/test.html#watch-mode) 파일을 변경할 때마다 관련된 테스트를 자동으로 찾아서 실행해 주고 결과를 알려주는 도구입니다. 이 기능은 실제로 써보면서, 속도도 빨랐어서 상당히 만족했던 경험이 있습니다.
[경험담] 비슷하게 IntelliJ에서는 코드가 변경 됐을 때 관련된 테스트를 돌려주는 Rerun automatically라는 기능이 있습니다. (https://www.jetbrains.com/help/idea/performing-tests.html#run-tests-automatically) 이건 써봤지만, 모듈 시스템이 부재한 자바의 한계 탓인지 별로 사용자 경험이 좋지 못했습니다.
제가 정말로 좋아하는 책인 ‘구글 엔지니어는 이렇게 일한다’에서는 해당 문제를 Bazel이라는 자체 빌드 툴을 이용해 해결했다고 합니다. (참고: https://bazel.build/?hl=ko) bazel의 기본적인 키 아이디어는 다음과 같습니다.
분산 빌드: 빌드를 병렬 컴퓨팅으로 처리한 후 취합한다고 합니다.
의존성 기반 빌드: 태스크(ex. 테스트)에 필요한 파일만 빌드한다. 그리고 변경이 없는 빌드 파일은 굳이 빌드하지 않는다.
답변이 도움 됐길 바랍니다.
-3
안녕하세요, 인프런 AI 인턴이에요.
유닛 테스트를 실행하는 과정에서 빌드 타임이 오래 걸리는 문제로 고민하고 계시는군요. 저도 이해하기에는 유닛 테스트를 위한 빌드 시간을 줄이는 것은 중요한 과제라고 생각합니다.
유닛 테스트의 빌드 시간을 최적화하는 몇 가지 방법을 공유해드릴게요.
테스트 범위 축소: 테스트 대상을 정확히 설정하여 필요하지 않은 코드까지 컴파일하고 빌드하지 않도록 합니다.
테스트 더블 사용: 외부 의존성을 가진 메서드들을 Mock이나 Stub으로 대체하여 외부 서비스나 데이터베이스를 사용하지 않아도 테스트가 가능하도록 합니다.
병렬 실행: 여러 테스트를 동시에 실행할 수 있도록 병렬 실행 옵션을 적용합니다.
적절한 빌드 도구 선택: Gradle이나 Maven 같은 빌드 도구에서 캐싱 메커니즘을 적극 활용합니다.
플러그인/라이브러리 사용: 특정 빌드 플러그인이나 라이브러리를 사용하여 빌드 시간을 최적화할 수도 있습니다. 예를 들어, JUnit 테스트에서 Gradle의 Test Filtering 기능을 사용하면 필요한 테스트만 실행할 수 있습니다.
위의 방법 중 일부를 적용해 보시면 빌드 타임을 줄일 수 있을 것입니다. 하지만 프로젝트에 따라서 최적화 방법이 달라질 수 있으니, 적용하실 때는 프로젝트의 구체적인 상황과 요구 사항을 고려하여 적절한 방법을 선택하시는 것이 좋겠습니다.
제 경험상 이러한 방법들을 적용해봤을 때, 테스트 코드 실행 시간이 줄어들어 더 효율적인 개발이 가능했던 경험이 있습니다.
더 나은 소프트웨어 개발을 위해 노력하고 있으시다는 점 감사드리며, 빌드 타임을 극복하시는 데 도움이 되었으면 좋겠습니다. 더 궁금한 점이 있으시면 언제든지 물어보세요! 좋은 결과 있으시길 바랄게요. 감사합니다.
뒤늦게 답변 확인했습니다. 정성스러운 답변 감사 드립니다 🙇