1. 프로젝트 계획
주제를 선정하고 주요 기능 2가지를 정했다.
역량 강화를 하고싶은 기술 스택을 활용하며 10일간 집중적으로 프로젝트를 진행해야겠다는 러프한 계획을 세웠다.
2. 산출물 관리
프로젝트를 어떻게 체계적으로 관리할까 한참을 고민하다가 jira로 계획 및 이슈관리를 하고 confluence로 산출물 관리를 하기로 결정했다.
이에 따라, jira, confluence에 새로운 프로젝트를 팠다. 두 기술을 연동한 후, 추가로 github 리포지토리도 연동해서 jira에서 브랜치를 바로 생성할 수 있도록 했다.
🤓 내 계정으로 새로 프로젝트를 생성해본 것은 처음이라 협업툴을 더 이해할 수 있는 기회가 됐다.
3. 요구사항 정의서
요구사항 정의서의 일부를 캡쳐했다.
러프한 학습 계획서를 보면서 기능단위로 대분류, 소분류로 나눠서 기능을 구체화했다.
기능별로 브랜치를 생성하기 위해 기능ID를 신경써서 만들었다.
원래 생각했던 주요 기능을 기준으로 우선순위를 나눴다.
4. 피그마 UI 설계
프로젝트 명을 PlanBuddy라고 지었다.
한 손에는 전구, 다른 손에는 캘린더를 들고 있는 파랑새 로고를 만들었다.
백엔드 기능에 힘을 쏟기 위해 디자인은 최대한 단순하게 구성했다.
하지만, 디자인은 단순히 눈에 보이는게 다가 아니라 결국엔 기능적인 것과 연관이 되는 영역이다.
데이터의 흐름과 어떻게 구현할 것인지 고민하며 디자인을 했다.
5. API 명세서
요구사항 정의와 피그마 설계까지 했을 때도 기능 설계가 꽤나 구체화 됐다고 생각했었는데 API 명세를 작성하다보니 부족했던 부분들을 캐치할 수 있었다.
질문과 답변을 받는 채팅 페이지의 프로세스를 구체화 시켰다.
초반엔 노션에 API를 명세하고 프로젝트 진행과정에서는 스웨거를 쓸 예정이다.
6. 프로젝트 아키텍처 다이어그램
프로젝트를 숲에서 나무로 보기위해 아키텍처 다이어그램을 그리는 과정이 꼭 필요하다고 생각했다.
인텔리제이에서 github으로 push를 하면 github에 미리 설정한 webhook에 따라 jenkins에 신호(트리거)가 간다.
jenkins는 Docker image화를 하고 AWS EC2에 코드를 배포한다.
EC2안에 3개의 도커 컨테이너가 있다.
2개의 백엔드 서버, 1개의 프론트엔드 서버가 있다.
무중단 배포와 빠른 복구를 위해 백엔드 서버를 2개로 구성했다.
리버스 프록시를 통해 클라이언트의 요청을 받아 백엔드 서버로 전달하고 백엔드의 응답을 클라이언트에 전달하고자 한다.
AWS기반으로 데이터베이스를 MySQL과 MongoDB Atlas로 구성할 예정이다. MySQL으로 정형데이터를 관리하고 MongoDB로는 대화로그를 관리할 예정이다.
외부서비스로는 firebase와 Google OAuth API, Google calendar API, ChatGPT API를 사용할 예정이다.
클라이언트 Google OAuth API와 통신하여 인증토큰를 얻는다. 이 인증토큰으로 firebase 인증토큰을 생성한다.
백엔드에서는 클라이언트로 부터 받은 인증토큰을 검증하여 사용자를 인증한다.
7. ER다이어그램
- 구글 소셜 로그인만 구현할 예정이지만 추후 확장성을 위해서 소셜 로그인 정보를 따로 테이블로 빼놨다.
- 유저는 특정 질문과 답변 셋을 즐겨찾기로 저장할 수 있다.
그런데 채팅 질문, 채팅 답변 테이블과 '즐겨찾기 QnA테이블'이 연관관계가 없다.
왜냐하면, 채팅 질문, 채팅 답변 테이블은 최근 대화만 임시저장 해놓는 임시 테이블이기 때문이다.
전체 대화로그는 MongoDB에 저장해놓기 때문에 즐겨찾기QnA 테이블에 저장할 데이터들은 MongoDB와 연결된다.
🤔임시 테이블을 만든 이유는 최근 대화 기록을 토대로 자연스러운 대화가 이어지길 바랐기 때문이다.
프로젝트를 진행하면서 더 나은 방법이 있는지 찾아보고 싶다.
- 유저는 회원가입을 할때, 추가 학습 정보를 필수로 입력해야한다.
처음에는 학습토픽, 서브학습토픽, 학습 스타일, 학습 시간, 학습 목표를 모두 다른 테이블로 정규화를 시켜놨었다.
그런데, 자주 조회하는 정보들을 매번 join연산을 하면 성능이 저하될 것 같아서 반정규화를 했다.
다중 입력 및 계층정보가 있는 학습 토픽들은 따로 테이블을 빼놨고 단일 선택을 하거나 text로 받는 항목들은 유저 테이블에 포함시켰다.
프로젝트 기획, 설계를 하며 느낀점
팀프로젝트 경험이 이번 개인 프로젝트를 진행할 때, 참 많은 도움이 됐다.
그때 배우고 익혔던 툴들을 활용하다보니 이전보다 더 빠르게 설계를 할 수 있었다.
이번에 설계를 할 때 썼던 툴들이 모두 팀플 때 썼던 툴이다.
( Jira, Confluence, Notion, ERDCloud, draw.io, Figma )
나에게 배움을 줬던 친구들에게 참 고마운 맘뿐이다.
'프로젝트일지' 카테고리의 다른 글
개인프로젝트 일지_6 | 프론트엔드와 백엔드 연동하기 (0) | 2024.06.05 |
---|---|
개인 프로젝트 일지_5 | MongoDB , 스프링 부트 연동 및 테스트 (0) | 2024.06.05 |
개인프로젝트 일지_4 | MongoDB Atlas 클러스터 생성 및 설정 (0) | 2024.06.05 |
개인프로젝트 일지_3 | MySQL, JPA 스프링 부트 연동 테스트하는 법 (0) | 2024.06.05 |
개인 프로젝트 일지_2 | AWS RDS mysql 설정 (0) | 2024.06.05 |