여러모로 입대전 걱정이 많았다. 걱정은 대게 '제대 하고 나서 배운 것들을 다 까먹으면 어떡하지'라는 물음으로 이어졌고, 해군 sw개발병으로 입대후 지금까지도 내가 나태해질 때면 머리속에서 되새기곤 한다. 이번 시리즈는 필자가 '2020년 군장병 공개 SW온라인 해커톤 대회' 참가를 계기로 군대에서도 코딩을 할 수 있음을 아직 입대하지 않은 어린 친구들에게 알려주기 위해 작성하게 되었다. 아무쪼록 도움이 되었으면 좋겠다.
이번 포스트에서는 2020년 군장병 공개 SW온라인 해커톤 대회가 무엇이고 어떻게 진행되며 필자의 경험 위주로 설명할 예정이다. 아직 군입대를 하지 않은 독자들이 이 대회를 목표로 군에서 공부를 했으면 하는 바람에 이 포스트를 먼저 개재하게 되었다. 구체적인 공부 방법에 대해 알고싶은 독자들은 다음 포스트를 참고 바란다.
국방 오픈소스 아카데미는 군에서 장병들의 복무기간 동안 sw교육을 제공하기 위해 제공하는 사이트다. 해당 사이트의 학습 로드맵 과 제공되는 온라인 강의를 통해 인공지능, 웹, 앱 등 다양한 분야를 배울 수 있다. 처음 보시는 분들이라면 사이트에 들어가 이것저것 눌러보기를 추천한다.
국방 오픈소스 아카데미에서 교육 과정을 수료하게 되면 매년 열리는 해커톤 대회에 참가할 수 있는 기회가 주어지게 되는데 올해는 코로나19의 여파로 온라인으로 해커톤 대회가 개최 되었다. 해커톤에 참가하기 위해서는 사전에 몇가지 단계를 거쳐야 하는데 홈페이지를 참고하자. 서류전형 및 코딩테스트에 합격한 장병들을 대상으로 팀빌딩을 하였고 만들어진 팀으로 해커톤에 참가하게 된다. 대회는 10월 1일부터 10월 31까지 총 한달간 오픈소스 프로젝트를 개발하여 결과물을 가지고 심사를 받는다. 다른 해커톤과는 달리 결과물 그자체 보다는 '오픈소스'로서 활용할 수 있는 가치또한 평가대상이었다는 점이 특이했다.
다들 한번쯤은 들어보았을 것이다. 군대의 pc방이라고 생각하면 편하다. 윈도우 운영체제가 아니고 컴퓨터를 껐다가 키면 모든게 날라가기 때문에 매번 ide를 설치해서 코딩하기는 부담스러웠다. 그래서 필자는 github codespace라는 웹 ide를 사용하고 있으며 웹 ide에 대해서는 다음 포스트에서 자세히 설명 하려고 한다.
필자의 팀에서는 군 복무 중인 개발자를 위한 국방망용 오픈소스 통합 개발 플랫폼을 만들게 되었다. 프로젝트의 이름은 코드스퀘어(CodeSquare)이며 깃허브 홈페이지에서 소스코드 및 프로젝트의 정보를 확인할 수 있다. 필자는 spring boot로 백엔드를 담당하였다. 이전에 flutter로 프로젝트를 진행한 경험은 몇번 있었지만 군에서 배운 백엔드(spring boot)로 프로젝트를 진행하다 보니 서툰점도 많았고 배운점도 많았다. 이에 대해 몇자 적으려 한다.
자신이 생각한 기능들을 일목요연하게 코딩하여 5000줄이 넘는 코드를 테스트 없이 배포할 수 있을까? 당연히 아니다. 그렇다고 기능 하나하나를 서버에 띄우면서 정상적으로 확인하는지 보는것은 비효율적이다. 그래서 java에서는 JUnit 테스트를 제공하여 실제 서버를 띄우지 않고도 테스트를 통한 검증을 할 수 있도록 하였다. 하지만 이번 프로젝트에서는 필자가 TDD에 익숙하지 않았을 뿐만 아니라 한정된 시간에 기능 구현하는데에 급급하여 후반에 갈수록 테스트코드를 작성하지 못했다. 덕분에 프론트엔드단에서 테스트시 버그가 많이 발생하였고 그 버그를 해결하는데에 상당한 시간을 소요할 수 밖에 없었다. 이번 프로젝트에서는 TDD를 잘 실천했다기 보다는 테스트 코드의 필요성에 대해 절감했다고 할 수 있다.
a라는 데이터 베이스를 쓰다가 갑자기 b라는 데이터 베이스로 프로젝트를 옮겨야 한다면? c라는 api 라이브러리를 쓰다가 성능상의 issue로 d라는 라이브러리를 써야 한다면? 만약 프로젝트가 특정 기술에 종속되어 있다면 프로젝트를 다시 만드는게 빠를 수 도 있을 것이다. 스프링 부트에서는 IoC(Inversion of Controll)과 DI(Dependency Injection)이라는 핵심 사상을 통해 특정 기술을 선택하는 것을 최대한 미룸으로써 이 문제를 해결해준다. 이에 대해서는 clean architecture라는 책을 보면 많은 도움이 될 것이다.
스프링부트를 실행하려면 jdk가 필요하고 몇가지 커맨드를 입력해야 한다. 마찬가지로 리액트를 배포하려면 자바스크립트, node등이 필요하며 또한 몇가지 커맨드를 입력해야 한다. 우리는 이번 프로젝트에서 20개가 넘는 기술 스택(라이브러리,프레임워크,db)을 사용하였다. 심사 위원들은 물론 우리조차도 모든 기술에 능통하지 않음으로 모든 설치및 실행을 간단하게 하길 원했다. 그래서 이번 프로젝트에서는 도커(docker)를 사용하였고, docker-compose를 통해 새로운 인스턴스에 간단하게 우리의 프로젝트를 배포할 수 있도록 하였다. 개인적인 욕심으로는 차기 프로젝트에서는 git의 master 브랜치에서 push를 하면 hook을 걸어 CI/CD를 자동화 하고 싶다.
loacl환경에서 개발할때와 production환경에 배포할 때는 많은 것이 다른다. db를 아예 따로 설정할 수도 있으며 비밀번호, 도메인 주소, security 설정등을 달리 할 수도 있다. 이 모든것들을 기억해서 매번 수정할 수도 있지만, 개수가 증가함에 따라 실수할 가능성이 농후해진다. spring boot에서는 application.yml파일을 통해 설정을 달리 할 수 있다. 이번 프로젝트에서는 application-dev.yml 과 application-prod.yml로 분리하여 프로젝트 관리를 진행하였고 덕분에 이전에 일일히 작업했던 것들을 자동으로 진행할 수 있었다.
한달여 동안 팀원 모두 최선을 다해준 덕에 정보통신산업진흥원장상을 수상할 수 있었다!
군대는 참 신기한 곳이다. 프론트 개발에 능통한 아무개는 포의 각도를 계산하고 있고 백엔드 개발에 능통한 아무개는 어딘가에서 목봉체조를 하고 있으니 말이다. 처음에는 군에서 시행하는 대회라 대회를 쉽게 본 경향이 있었지만, 대회를 진행하면서 숨은 고수들이 정말 많다고 느꼈다. 프로그래밍에 처음 입문했을 때만 해도 누군가가 앱이나 사이트를 만들었다고 하면 그것 자체만으로도 대단해 보였다. 요즘에는 여기에 추가하여 사람들이 쉽게 수정하고 이해할 수 있도록 코드를 짜는 사람들이 대단해 보인다. '오픈소스'라는 이번 취지에 맞게 최대한 코드를 쉽게 쓰고 API문서도 작성했다. 이번 프로젝트를 마치며 앞으로 여러 오픈소스 프로젝트에 contribute를 하고 싶다는 막연한 계획을 가진다. 끝으로 마지막으로 함께 해준 팀원들에게 감사하다는 말을 하고 싶다.
정말 멋있네요 내년에도 군장병 해커톤이 열려나 모르겠습니다ㅠㅡㅜ