
사이드 프로젝트를 할 때의 이야기이다.
난 GitHub Actions와 Docker를 이용해서 CI/CD를 구축했었다.
여느날처럼 작업 사항을 develop branch에 병합하고 있었는데, Build 과정에서 에러가 발생하는 것이 아닌가?
'엥?? 분명 내 로컬 환경에서는 실행이 잘됐는데??'
정확한 이유는 몰랐지만 대충 짐작가는 이유는 있었다.
당시 에러 메세지 내용은 import 하는 과정에서 module을 찾지 못해서 에러가 발생했다는 것이었다.
에러가 발생한 부분의 코드를 확인해보면, 다른 에러가 나지 않는 코드들과의 명확한 차이점이 있었다.
바로 파일명에 대문자가 섞였다는 것.
이러한 에러의 원인에 대해서 정확히 알기 이전에, 한가지 사전지식이 필요하다.
일단 Linux의 case sensitive를 알아야 한다.
어려울건 없고 번역하면 대소문자 구분이다.
Windows 운영체제와 다르게 Linux는 대소문자 구분을 한다.
이와 관련해서 흔하게 발생할 수 있는 (실제로 동아리 후배 기수에게도 관련 문제가 발생해서 해결해준 적이 있음) 문제가 있다.
바로 SQL Query에서 발생할 수 있는 문제다.
어느 DB에 user 라는 이름의 테이블이 있고 또한 다음과 같은 쿼리가 있다고 해보자.
SELECT * FROM USER;
실제로 Windows 환경에서 해당 쿼리를 실행시키면 아무 문제 없이 user 테이블의 로우를 가져올 수 있다.
하지만 Linux 환경의 운영체제에서 해당 쿼리를 실행하면 다음과 같은 에러가 발생할 것이다.
ERROR 1146 (42S02): Table '어쩌구.USER' doesn't exist
그 이유는 첫문단에서 말했듯이 case sensitive 문제 때문이다.
Linux의 case sensitive도 알았다면, 이쯤에서 의문이 들것이다.
"Linux가 대소문자 구분하는건 알겠는데 어쨌든 파일 이름과 import 경로가 대문자로 되어 있으니까 상관 없는거 아님?"
맞다.
대소문자를 구분하건 말건 파일 이름과 import 경로가 대문자로 되어 있으니까 에러가 발생하지 않아야 정상이다.
여기서 Git case-sensitive 도 알아야 한다..
그 와중에 또 Git의 파일 시스템은 대소문자를 구분하지 않는다.
다음의 사진을 보자.

왼쪽의 바에서 빨간 네모로 표시해둔 소스 제어 탭은 현재 branch에서 변경 사항이 생기면 변경점을 보여준다.
home.ctrl.js의 이름을 Home.ctrl.js로 변경 해보겠다.

보면 알겠지만 파일 이름이 변경된 것을 전혀 감지하지 못한다.
여기서 문제가 생긴다.
해당 경로의 모듈을 import 하는 곳에서의 코드는
import { 어쩌구 } from '어쩌구/저쩌구/home.ctrl';
에서
import { 어쩌구 } from '어쩌구/저쩌구/Home.ctrl';
로 변경이 되었을 것이다.
이때, commit을 push하면 해당 파일 이름의 변경 사항은 Git에서 잡지 못해 import 경로 변경 사항만 반영된 채로 push가 된다.
또한 CI/CD를 위한 workflow의 Build job 실행 환경은 ubuntu에서 실행된다.
이 때문에 대소문자를 구분하는 ubuntu 환경에서 실행되는 workflow의 job은 Home.ctrl 경로의 모듈을 찾지 못한다는 에러가 발생하는 것이다.
(Git에서는 파일 이름의 변경이 반영되지 않은 home.ctrl.js로 존재하기 때문.)
진짜 대환장 파티다.
git config core.ignorecase false
해당 명령어를 통해서 대소문자 구분을 해줄 수는 있는데 일단 기본적으로는 구분하지 않게 되어 있을 것이다..
개인적으로 지식이 많이 없는 상태에서 맞닥뜨렸다면 굉장히 해결하기 어려운 문제였을 것으로 생각한다.
물론 지금도 한없이 부족하지만 그래도 이런 얽히고설킨 에러들을 하나씩 해결할 때마다 정말 뿌듯함을 느낀다.