본문 바로가기
C & C++

[C/C++] 개발 환경 구성하기 01 (아키텍처 설계, 브랜치 전략)

by yhames 2024. 7. 21.
728x90

[C/C++] 개발 환경 구성하기 01 (아키텍처 설계, 브랜치 전략)

[C/C++] 개발 환경 구성하기 02 (cmake, libft, google test)

[C/C++] 개발 환경 구성하기 03 (gcovr, codecov)

[C/C++] 개발 환경 구성하기 04 (github action, norminette, codecov)

[C/C++] 개발 환경 구성하기 05 (miniLibX)


Java/Spring을 사용하면서 Junit5와 Jacoco와 같은 테스트 도구를 활용하여 단위 테스트에 작성하는 것에 익숙했습니다. 42서울에서는 과제를 C/C++로 구현하기 때문에 단위 테스트를 어떻게 작성할 지 고민이 많았습니다.
 
이전에 minishell 과제를 진행하면서 google test를 도입하려고 했으나 IDE 문제와 cmake의 벽을 넘지 못하고 도입에 실패했었습니다. 이번에 지원님과 함께 miniRT 과제를 진행하면서 google test와 CI/CD 등 지난 과제에서 실패했던 내용을 다시 정리해서 도전하기로 했습니다.


지난 minishell 과제를 진행하면서 느꼈던 문제점 입니다.
 

  • 서로 다른 IDE 사용 (CLion, Vscode)
  • cmake 문법 러닝커브로 인한 google test 도입 실패
  • norminette 수동 검사
  • git 브랜치 전략 미흡

 

개발 환경 구성

이러한 문제점을 해결하고 원활한 협업을 하기 위해 이번에는 다음과 같이 개발 환경을 구성하기로 했습니다.

먼저 VSCode를 사용하여 개발 환경을 맞춰주기로 했습니다. CLion의 경우 cmake가 자동으로 설정되는 반면, VSCode에서는 사용자가 직접 Extensions을 설치하고 CMakeLists.txt를 컴파일 해야합니다. 저 같은 경우에는 CLion을 사용했었지만, VSCode에서 발생하는 문제를 같이 해결할 수 없다는 점과 cmake를 처음 다루는 입장에서 CLion을 사용하면 오히려 진입장벽이 높다고 판단하여 VSCode로 IDE를 통합하자는 결론이 나왔습니다.
 
cmake 설정을 하면서 google test와 libft를 빌드 시점에 가져오도록 FetchContent를 사용했습니다. libft는 42서울 과제를 하면서 구현한 저희만의 standard library입니다. 지난번 과제에서는 프로젝트 레포지토리에 포함해서 관리했었는데, 새로 기능이 추가되거나 기존의 기능이 수정될 때마다 서로 libft를 맞춰줘야하는 불편함이 있었습니다. libft를 별도의 레포지토리에서 배포해서 사용하면 새로운 기능이나 수정된 기능을 즉시 적용할 수 있게 됩니다.
 
또한 Github Action를 통해 norminette와 Codecov를 사용하기로 결정했습니다. norminette는 42서울에서 사용하는 코드 스타일 규칙이고, Codecov는 테스트의 코드 커버리지 검증 및 시각화 도구입니다. Github action을 사용하여 norminette와 codecov를 자동화할 수 있도록 환경을 구성할 수 있습니다.
 

브랜치 전략

마지막으로 Git Branch 전략을 정리했습니다.


먼저 feature branch에서 작업을 하고, dev에 병합할 때 norminette와 codecov에 대한 CI를 설정합니다. 헤더파일에는 google test를 위해 c++ 의존성 관련된 코드가 필요해서 C 소스파일에 대해서만 norminette 검사를 진행합니다. 커버리지 달성률은 상황에 맞게 조절하기로 했습니다.

 


 
dev에서 main으로 병합할 때는 google test나 libft와 같은 외부 의존성을 반드시 제거해야하고, 소스파일(.c)과 헤더파일(.h)에 대한 norminette 검사를 해야합니다. 또한 불필요한 파일(.idea/, .vscode/, .DS_Store 등)이 있는지 다시 한 번 확인하고, libft가 소스파일 형태로 포함되어 있는지 확인해야합니다.
 
마지막으로 main 브랜치에서 42 intra의 git repository에 업로드합니다. 인트라에서 제출하기 전에 반드시 다시 한 번 확인해야합니다.
 

정리

프로젝트 규모에 비해서 개발 환경을 과도하게 설정한 부분도 있지만, 앞으로 다른 과제나 C/C++을 활용한 프로젝트를 하기 위해서 먼저 경험한다는 차원에서 진행했습니다.
 
앞으로 CMakeLists.txt나 github workflow 등 개발 환경을 세팅하면서 작성했던 것들을 차례대로 공유하겠습니다.

반응형