1인 개발로 진행해온 게시판 서비스 프로젝트의 고도화 작업까지 마무리가 되어 프로젝트 동안 겪었던 내용을 정리해놓고자 합니다.
프로젝트에 대한 세부 내용은 깃허브 README로 대체합니다.
https://github.com/dlsrnjs125/board_project
지금까지 동영상이나 책을 통해 이론으로만 공부하다보니 머리속의 지식들이 정리되는 것이 아닌 파편적으로 있다고 느껴졌다.
특히 해당 내용들을 이해한 것이 아니라 외운 것에 불과하다라는 느낌이 많이 들었고 이 문제를 해결하기 위해 직접 프로젝트를 진행하는 것이 최선이라 판단했다.
게시판 서비스라하면 간단하게 생각할 수 있지만 여러가지 기능들을 추가하게 되면 무궁무진하게 공부해볼 수 있는 프로젝트라 생각했다.
간단하게 만든다면 CRUD, Restful API, DB 등등 간단하게 할 수 있다. 하지만 여기서 로그인과 같은 보안기능, 해시태그를 통한 필터링 기능, 게시판 글쓰기 뿐만이 아닌 댓글 기능 등등 여러 기능들을 추가하면 할수록 공부해야 할게 많다고 판단했다.
또한 이번 프로젝트를 진행하기에 앞서 먼저 중요하게 생각했던 부분이 기획과 문서작성, 개발, 형상관리, 테스트 등과 같이 개발 프로세스 전반을 경험해보고자 했다.
전체 개발 기간 중 80%가 넘는 시간은 다음 요소 등에 쓰였다.
코딩을 하는 시간은 전체의 일부분에 불과했고 대부분은 더 좋은 코드를 만들기 위해 구글링을 하고 개념을 익히는 것에 대부분의 시간을 할애한 것같다.
문제 하나를 해결하기 위해 검색하기 시작하면 모르는 지식들이 꼬리를 물고 나와 수 시간이 지난후 보면 수십개의 크롬 탭들이 켜져 있는 경우도 허다했다. 그럼에도 결국 원리를 이해하고 하나하나 탭을 꺼가며 공부했던 흐름을 리마인드할 때 가장 큰 성취감을 느낄 수 있었다.
이번 프로젝트는 아무것도 없이 시작한것이 아닌 전체적인 아키텍쳐와 ERD등을 먼저 구상하고 그에 따라서 옆길로 새지 않고 해당 내용만 탑다운 방식으로 진행했다.
개발을 함에 있어서 구현도 중요하지만 다른 여러가지 작업들이 중요하다는 것을 느끼게 되었다.
이러한 각 단계를 통해 소프트웨어 개발이 체계적으로 진행될 수 있으며, 효과적인 결과를 도출할 수 있게 된다. 각 단계는 서로 연계되어 있고 각 단계에서의 결정과 작업은 다음 단계에 영향을 미치기 때문에 전체적인 흐름을 이해하는 것이 중요하다.
특히 프로젝트에서 요구사항 분석이 중요하다고 느꼈다. 요구사항 분석이 제대로 되어야 어떤 기능을 도출해야할지 정해지고 구현 방안의 기획이 잡히고 개발을 시작할 수 있기 때문이다.
이전에는 프로젝트를 구현할 때 모든 작업을 마치고 Github에 한번에 올리는 등의 방식을 사용했는데, GitKraken을 이용하여 Github에 각 개발과정을 세세하게 분리해서 관리할 수 있었다.
특히 개인 프로젝트이지만 브랜치를 나누어 진행하고 Github의 issue와 pull request등을 활용함으로써 작업을 분리하고 효율적으로 관리하며 협업에 대한 연습을 할 수 있었다.
테스트 코드 작성 과정에서도 어려움을 겪었지만, 처음으로 테스트용 데이터베이스를 연결하여 통합 테스트도 작성해보고, 외부 영향을 받지 않고 내가 작성한 코드만 테스트하는 단위 테스트도 작성해보면서 테스트에 대한 이해도를 높일 수 있었다.
이전에 했던 프로젝트에서는 테스트코드를 작성하지 않은채 기능 구현 위주로 프로젝트를 진행했다.
그러던 중 기능이 점점 복잡해지고 코드의 양이 쌓여가면서 왜 그렇게 사람들이 테스트, 주석, 문서화와 같은 기본기의 중요성에 대해 말하는지 알 수 있었다.
개발자는 주로 요구사항을 분석하여 설계 후 구현하는 일을 하는데 가장 중요한 것이 요구사항을 제대로 분석하는 일이다. 그리고 반드시 요구한 항목을 최대한 구현해야 한다.
테스트 코드를 작성하면서 요구사항의 기능적인 항목들을 차분히 정리하는 과정을 경험할 수 있고, 이때 발생할 수 있는 예상외의 코너 케이스를 찾을 수도 있다.
테스트 코드를 작성하지 않을 때는 기능 하나를 작성하고 UI를 직접 보면서 기능이 원하는대로 잘 구현되어있는지, 문제는 없는지 확인을 했다.
서버를 재시작해가면서 기능의 동작여부를 확인하다가 기능들이 많아지고 점점 진행속도가 현저히 느려지게 될 것이다.
테스트 코드가 없는 프로젝트에서는 새로운 기능을 추가하는 것도 힘들겠지만, 기존 기능을 수정하는 것은 더욱 어려운 일이될 것이다.
하지만 테스트 코드가 있다면 수정이나 구조 변경 후에도 기능이 요구사항에 맞게 정상적으로 작동하는지 검증할 수 있게 된다.
프로젝트를 시작하고 며칠, 몇주까지는 모든 기능들이 어떻게 동작하는지 기억에 남아있고 이땐 이걸 이렇게 사용해야지 했지만 테스트 코드의 경우처럼 기능들이 많아져 복잡해지고 시간이 지나면서 문제가 발생했다.
작성할 당시에는 어떻게 동작하는지 알고 있었지만 시간이 지난 뒤는 기능이 어떻게 동작하는지 알지 못하는 상황이 온것이다.
본인이 작성한 코드를 한참 들여다보고 내부 코드를 이해하면서 시간을 쓰는 동안 남을 위해서가 아니더라도 나를 위해서 상세한 주석과 문서화가 필요함을 느꼈다.
이를 프로젝트상에도 문서화 했지만 각 기능별로 브랜치를 나누어 진행하여 Git에 Issue정리와 pull request를 함으로써 문서화를 하여 각 기능들에 대한 문서화를 진행했다.
이번 프로젝트에서 Spring Security와 OAuth2를 사용하여 인증 및 인가 기능을 구현했다.
인증과 권한 부여를 위해 JWT와 OAuth2은 웹 및 어플리케이션 개발에서 널리 사용되는 기술이다. JWT는 간단한 토큰 기반 인증 시스템을 제공하는 반면 OAuth2는 보다 복잡한 권한 부여 프로세스를 지원한다.
또한 OAuth2는 사용자의 중요한 정보를 담고 있지 않고 카카오 로그인 서비스를 이용하고자 OAuth2를 선택했다.

또한 프로젝트 내부에 민감정보들을 그대로 사용하면 보안에 취약하므로 Vault를 이용한 환경변수를 통제하여 보안에 신경을 썼다.
인덱스 최적화
Post 테이블의 create_at 컬럼에 인덱스를 추가하여, 최신 게시글을 빠르게 조회할 수 있도록 했다.
계층적 댓글 구조
다른 사람과 함께 깃플로우를 이용하여 깃관리도 해보고 컨플릭션도 겪어보고 슬랙, 지라같은 협업툴도 써보고 싶었으나, 해당 프로젝트를 진행하며 그럴 기회가 없었던 점이 아쉽게 남았다.
혼자서 상황을 가정해보고 시뮬레이션을 진행해보는 것은 아무래도 한계점이 크고 문제를 해결한다는 느낌이 들지 않았고 서로의 코드를 리뷰하고 서로간의 더 좋은 코드를 위해 아이디어를 개선해보지 못한 것등도 아쉽게 남았다.
프로젝트 완성 후 배포를 해보는 것이다. 개발하는 과정도 중요하지만 실제 사용자가 이용할 수 있도록 배포하는 것도 중요하고 그 과정에서 많은 문제들도 발견할 수 있다.
그렇기 때문에 AWS와 같은 개발 환경을 공부하여 배포를 해보도록 하겠다.