본문 바로가기
Side Project/Socket

[ERROR] Circle CI에서 오류가 생길경우 살펴볼 것!

by asdft 2024. 2. 4.

먼저 들어가기에 앞서 간단한 개념을 짚고 넘어가자

 

[TestContainer 로 멱등성있는 integration test 환경 구축하기]

https://medium.com/riiid-teamblog-kr/testcontainer-%EB%A1%9C-%EB%A9%B1%EB%93%B1%EC%84%B1%EC%9E%88%EB%8A%94-integration-test-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-4a6287551a31

 

테스트 환경과 멱등성

테스트 환경은 프로젝트 설정을 할 때 가장 중요한 부분 중 하나입니다.

가장 어렵고 귀찮은 작업이기도 하지만 처음 한번만 고생하면 추후 테스트 작성 시에 걱정 없이 아주 깔끔한 테스트 코드를 짤 수 있게 됩니다. 하지만 그만큼 프로젝트 환경 설정에서 가장 많은 시간을 들이게 되고, 많은 시행착오를 겪는 구간 중 하나라고 볼 수 있습니다.

 

원인과 해결방안

테스트 환경에서 외부 모듈에 대한 멱등성이 유지되길 기대했던 것이죠.

이처럼 흔히 멱등성이 깨지기 쉬운 구간 중 하나는 바로 외부 모듈이라고 볼 수 있습니다.

그리고 이를 해결하기 위해서는 테스트 환경 구축과 코드 작성에 있어 멱등성을 반드시 고려해야 합니다.

테스트 환경을 위해 가장 많이 쓰이는 외부 의존성을 떠올리자면 가장 먼저 떠오르는 것은 무엇보다 DB 라고 할 수 있습니다.


개요

사이드 프로젝트를 진행하던 도중,

기능을 구현한 API가 로컬환경에서 테스트 성공 하고 PostMan을 통해 API가 정상기능이 작동하는 것을 확인 후, 팀원의 code review를 받기 위해, Github에 올렸다. 

 

그런데,

 

지금껏 개발하면서 Jacoco를 사용해서 테스트가 커버리지의 기준에 못 미쳐서 CI에서 오류가 난적은 있었지만 위와 같이 CI와 모든 테스트가 깨지는 오류는 처음 보는 오류였다.

 

한줄 한줄 읽어보면 testContainers, SQLException at JdbcDataBaseContainer, mysql 이 보였다.

이번에 기능한 구현은 새로 추가한 Entity나 엔티티 내에 컬럼의 변화가 없어 flyway에서 뱉은 오류는 아니었다.

컨테이너 관련 오류가 뜨는거로 봐서는 Docker쪽의 셋팅 문제 같았다.

 

그래서 팀원과 얘기를 해본 결과,

url: jdbc:tc:mysql:8:///socket

 

application-test.yaml 파일의 이부분이 문제였던 것이다.

 

테스트에서는 mysql 도커 컨테이너를 올려서 사용한다. 위 코드의 의미는 mysql 8 이미지를 다운받아서 실행하되, mysql8:lately 이미지 즉 가장 최근 버전을 가져온다는 의미이다.

 

우리는 23년 10월 부터 개발해 오면서 이때 다운받아놓은 이미지로 계속 실행하면서 지금까지 문제가 생기지 않았었다.

그리고 mysql 접속을 해주는 mysql-connector-j 라이브러리의 버전 또한 이때 설정한 8.0.33 version 이다.

 

하지만 아래에서 확인할 수 있듯이 MySQL의 새로운 8.3버전이 내가 코드를 올린 2주쯤 전에 출시된것을 알았다.

 

즉, mysql-connector-j의 버전과 최근 새로 출시된  8.3버전의 mysql 사이에서 버전차이로 인해 연결을 못해서 생기는 오류였던 것이다.

그래서 mysql8의 버전을 우리 프로젝트에서 설정한 java connector와 호환이 되는 지금껏 써왔던 버전으로 명시해준 후에야 CI를 통과할 수 있었다.

 

이번 오류로, 구글링을 해보면서 로컬에서 테스트가 문제없이 돌아가는데 CI에서 문제가 생길경우 대부분이

테스트 환경설정셋팅에 문제가 있다는 것을 알았다.

같이 스터디를 진행하는 친구의 경우에도 실무를 하면서, 로컬 환경과 살제 배포 환경 셋팅이 달라서 오류를 잡는데 고생했다는 이야기를 들었다.

 

이 오류를 겪으면서, 나는 환경셋팅보다 "내 코드에 문제가 있나?" 라는 생각으로 내 코드만 들여다 봤는데,

앞으로는 로컬 테스트는 문제가 없는데 CI가 깨질경우, 로컬 환경과 배포 환경에서 셋팅한 버전에 문제가 없는지 가장 먼저 확인해야 겠다.

 

참고)
 gradle build
를 사용하면 컴퓨터에 설치된 gradle과 java를 기준으로 build 하고, 
./gradlew build를 실행하면 build.gradle파일에 정의한 내용을 기준으로 build된다.