1인 개발로 진행해온 게시판 어드민 서비스 프로젝트가 마무리가 되어 프로젝트 동안 겪었던 내용을 정리해놓고자 합니다.
프로젝트에 대한 세부 내용은 깃허브 README로 대체합니다.
https://github.com/dlsrnjs125/project_board_admin
이전 게시판 서비스 프로젝트를 만들게 되면서 이를 관리하기 위한 어드민 서비스 프로젝트를 만들어봤다.
게시판 어디민 서비스 문제 정의는 게사판 관리자로서, 내부에서 접근하는 서비스 운영자 관점에서 만들었다.
가장 중요한 부분이 이전에 만들었던 프로젝트의 데이터를 받아와 사용해야 한다는 점을 중요하게 생각했고 그 점을 위주로 공부했다.
이번 프로젝트는 아무것도 없이 시작한것이 아닌 전체적인 아키텍쳐와 ERD등을 먼저 구상하고 그에 따라서 옆길로 새지 않고 해당 내용만 탑다운 방식으로 진행했다.
개발을 함에 있어서 구현도 중요하지만 다른 여러가지 작업들이 중요하다는 것을 느끼게 되었다.
이러한 각 단계를 통해 소프트웨어 개발이 체계적으로 진행될 수 있으며, 효과적인 결과를 도출할 수 있게 된다. 각 단계는 서로 연계되어 있고 각 단계에서의 결정과 작업은 다음 단계에 영향을 미치기 때문에 전체적인 흐름을 이해하는 것이 중요하다.
특히 프로젝트에서 요구사항 분석이 중요하다고 느꼈다. 요구사항 분석이 제대로 되어야 어떤 기능을 도출해야할지 정해지고 구현 방안의 기획이 잡히고 개발을 시작할 수 있기 때문이다.
이전에는 프로젝트를 구현할 때 모든 작업을 마치고 Github에 한번에 올리는 등의 방식을 사용했는데, GitKraken을 이용하여 Github에 각 개발과정을 세세하게 분리해서 관리할 수 있었다.
특히 개인 프로젝트이지만 브랜치를 나누어 진행하고 Github의 issue와 pull request등을 활용함으로써 작업을 분리하고 효율적으로 관리하며 협업에 대한 연습을 할 수 있었다.
테스트 코드 작성 과정에서도 어려움을 겪었지만, 처음으로 테스트용 데이터베이스를 연결하여 통합 테스트도 작성해보고, 외부 영향을 받지 않고 내가 작성한 코드만 테스트하는 단위 테스트도 작성해보면서 테스트에 대한 이해도를 높일 수 있었다.
이전에 했던 프로젝트에서는 테스트코드를 작성하지 않은채 기능 구현 위주로 프로젝트를 진행했다.
그러던 중 기능이 점점 복잡해지고 코드의 양이 쌓여가면서 왜 그렇게 사람들이 테스트, 주석, 문서화와 같은 기본기의 중요성에 대해 말하는지 알 수 있었다.
개발자는 주로 요구사항을 분석하여 설계 후 구현하는 일을 하는데 가장 중요한 것이 요구사항을 제대로 분석하는 일이다. 그리고 반드시 요구한 항목을 최대한 구현해야 한다.
테스트 코드를 작성하면서 요구사항의 기능적인 항목들을 차분히 정리하는 과정을 경험할 수 있고, 이때 발생할 수 있는 예상외의 코너 케이스를 찾을 수도 있다.
테스트 코드를 작성하지 않을 때는 기능 하나를 작성하고 UI를 직접 보면서 기능이 원하는대로 잘 구현되어있는지, 문제는 없는지 확인을 했다.
서버를 재시작해가면서 기능의 동작여부를 확인하다가 기능들이 많아지고 점점 진행속도가 현저히 느려지게 될 것이다.
테스트 코드가 없는 프로젝트에서는 새로운 기능을 추가하는 것도 힘들겠지만, 기존 기능을 수정하는 것은 더욱 어려운 일이될 것이다.
하지만 테스트 코드가 있다면 수정이나 구조 변경 후에도 기능이 요구사항에 맞게 정상적으로 작동하는지 검증할 수 있게 된다.
프로젝트를 시작하고 며칠, 몇주까지는 모든 기능들이 어떻게 동작하는지 기억에 남아있고 이땐 이걸 이렇게 사용해야지 했지만 테스트 코드의 경우처럼 기능들이 많아져 복잡해지고 시간이 지나면서 문제가 발생했다.
작성할 당시에는 어떻게 동작하는지 알고 있었지만 시간이 지난 뒤는 기능이 어떻게 동작하는지 알지 못하는 상황이 온것이다.
본인이 작성한 코드를 한참 들여다보고 내부 코드를 이해하면서 시간을 쓰는 동안 남을 위해서가 아니더라도 나를 위해서 상세한 주석과 문서화가 필요함을 느꼈다.
이를 프로젝트상에도 문서화 했지만 각 기능별로 브랜치를 나누어 진행하여 Git에 Issue정리와 pull request를 함으로써 문서화를 하여 각 기능들에 대한 문서화를 진행했다.
이번 프로젝트의 단위 테스트를 진행하면서 API Mocking테스트를 진행했다.
지금까지는 DB에서 데이터를 가져와서 테스트를 진행해서 아무런 문제가 없었지만 API를 사용해서 데이터를 받아오는 프로젝트이기 때문에 생각해야할 부분이 Mocking 작업이다.
Rest방식의 API를 호출할 수 있는 Spring의 내장 클래스인 RestTemplate을 사용했다.
Json, xml등의 응답을 모두 받을 수 있으며 프로젝트에서 사용된 데이터 형태는 json이기 때문에 사용
실제 API 모듈을 사용해서 데이터를 가져오게 되면 여러 문제점들이 있을 수 있다.
그래서 API를 진짜로 테스트 할것인가 가짜로 테스트할 것인가에대해서도 고민해봐야 한다.
그럴 때 사용할 수 있는 방식이 Mocking 방식인데 이러한 방식을 사용하게 될 경우
데이터의 소스가 외부의 것이고 외부 서비스의 변경에 흔들리지 않는 서비스를 만들 수 있게된다.
또한 지속적인 빌드와 배포에 큰 장점이 될 수 있다.
API 호출은 네트워크나 서버 등 외부요인에 의존적이므로 테스트의 신뢰성이 떨어진다. 하지만 Mocking 방식은 다양한 케이스를 재현하고 대응할 수 있다.
하지만 Mocking 만을 사용해서는 진짜 API가 서비스 상태인가 확인이 불가능 하므로 Nested 어노테이션을 활용해서 두가지 모두를 테스트 진행했다.
보통 개발자는 CSS 또는 Image를 만들거나, 수정할 일이 거의 없고, 특히 디자이너가 없을 경우 Web 개발 시 디자인을 수정하거나 추가할 경우 난감한 경우들이 있다.
그래서 이번에 사용하게 된 것이 UI Framework인 AdminLTE이다.
가장 큰 장점은 전체적인 UI의 대부분을 제공한다고 보면 된다.
특히 AdminLTE는 Bootstrap을 기반으로 만든 UI Framework이므로 Bootstrap + DataTable + DataPicker 등등 여러가지 플로그인을 조합해서 하나의 커다란 툴로 만들어져 있어서 관리자(어드민) 페이지를 만드는데 백엔드 쪽의 개발에 더욱 신경을 써볼 수 있었다.
다른 사람과 함께 깃플로우를 이용하여 깃관리도 해보고 컨플릭션도 겪어보고 슬랙, 지라같은 협업툴도 써보고 싶었으나, 해당 프로젝트를 진행하며 그럴 기회가 없었던 점이 아쉽게 남았다.
혼자서 상황을 가정해보고 시뮬레이션을 진행해보는 것은 아무래도 한계점이 크고 문제를 해결한다는 느낌이 들지 않았고 서로의 코드를 리뷰하고 서로간의 더 좋은 코드를 위해 아이디어를 개선해보지 못한 것등도 아쉽게 남았다.
프로젝트 완성 후 배포를 해보는 것이다. 개발하는 과정도 중요하지만 실제 사용자가 이용할 수 있도록 배포하는 것도 중요하고 그 과정에서 많은 문제들도 발견할 수 있다.
그렇기 때문에 AWS와 같은 개발 환경을 공부하여 배포를 해보도록 하겠다.