![[Project/공부 많이 했어?] (1) 시스템 설계 문서](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FleQUS%2FbtsFUY8ckD8%2FGcsnk0ZTap2d3Lkkdy4jLK%2Fimg.png)
GitHub - parkswon1/Studyapp: 공부 많이 했어 앱 개발 명세서
공부 많이 했어 앱 개발 명세서. Contribute to parkswon1/Studyapp development by creating an account on GitHub.
github.com
다음은 내가 작성한 공부 시간 기록 어플리케이션 프로젝트
"공부 많이 했어?" 앱 시스템 설계 문서이다.
공부 많이 했어?
공부로 얻는성취감에는 얼마나 공부했는지 기록하는 것도 있다고 생각한다. 공부를 컴퓨터로 주로 많이하는 나는 컴퓨터 타이머로 시간을 기록할 때가 있다. 집중하는 시간만 딱 껏다가 키는 용도로 사용한다. 근데 휴대폰 어플리케이션중에는 컴퓨터(Window) 환경에서 돌아가지 않는다.
도서관에 가서 공부할 때는 휴대폰 어플리케이션으로 시간을 기록했었다. 근데 가끔 기록하는 걸 까먹으면 적을 수 없다. 기록이 뭐가 중요하냐고 말할 수도 있지만 공부한 시간이 날라가는 기분이다.
그래서 공부하는 시간을 직접 기입도 할 수 있는데 컴퓨터와 휴대폰 둘다 사용이 가능한 어플리케이션을 만드려고 한다.
요구사항
기능적 요구사항
어플리케이션이 어떤 기능을 수행할 수 있어야 한는지 적는 공간이다. 나는 여기의 기능을 6가지로 구분했다.
1. 타이머 기능
타이머를 시작할 수 있어야하고 정지할 수 있어야하며 공부를 하지 않는 동안 일시 정지를 할 수 있고 재개를 할 수 있어야한다. 그리고 이러한 방식으로 측정된 시간을 기록할 수 있어야한다.
2. 수동 시간 기입
내가 원해서 만드는 기능이다. 수동으로 날자와 시간에 대해서 기록할 수 있어야 한다.
3. 공부 내용 기입
공부하느라 시간이 흘렀다면 공부한 내용이 있을 것이다. 이것을 간단하게나마 저장을 하고 싶다. 또한 cs지식, spring, 면접 준비, 코딩테스트 준비등 내가 하고 있는 공부만 바로 생각해도 4가지가 있는데 이런 과정들을 카테고리 별로 분류 하고 싶다. 공부한 내용은 삭제, 수정을 할 수 있다.
4. 시간 기록 조회
시간 기록또한 중요하게 생각한다. 문서에는 달력 뷰라고 적어뒀지만 깃헙의 잔디처럼 만들 계획이다.
내가 원하는 기간에 얼마나 공부했는지 알아볼수 있도록 그래프, 차트등을 제공할 예정이다.
또한 카테고리별 공부 시간이 얼마나 되는지도 확인할 수 있어야 한다.
5. 사용자 인증 및 관리
pc, 휴대폰에서 사용하려면 사용자가 있어야 연동할 수 있을 것이다. 그래서 로그인, 회원 가입 기능을 넣을 예정이다.
6. 학교 및 지역 기반 경쟁
이기능을 모든 기능이 만들어지고나서 추가적으로 넣을 계획이다. msa구조를 학습하면서 안 내용이 기능을 새로 추가하기가 용이하다는 것인데 모든걸 만들고나서 이 기능을 추가하면서 서비스 확장을 연습하려고 한다.
학교 별로 랭킹을 조회할 수 있도록 하려고 한다. 지역별로도 누가 가장 공부했는지 랭킹을 만들려고 한다.
이러한 랭킹들 말고도 전체적인 랭킹 또한 조회할 수 있다.
랭킹은 일정한 기간을 두고 초기화 되도록 하려고 한다.
비기능적 요구사항
7가지로 구분했다.
1. 성능
사용자가 서비스를 사용할 때 응답이 없어서 불편함을 느끼지 않도록 생각했다.
2. 가용성
앱은 항상 유지되어야 한다는 의미이다. 코드를 변경하거나 해서 서버를 잠시 꺼야만 할때 green, blue방식으로 업데이트를 하려고 한다.
3. 확장성
클라우드 시스템을 사용할 예정인 만큼 시스템은 사용자 수와 데이터 양의 증가에 유연하게 대응할 수 있도록 설계할 예정이다.
4. 보안
사용자의 정보는 JWT로 관리할 예정이고 사용자를 안정하게 저장하려고 한다. 사용자를 인증하는 방식을 이메일을 통해서 하려고 한다.
학교 이메일 인증 방식은 왜부 api를 가져와서 사용하려고 하는데 외부 api에 대해서 잘 공부해서 사용하려고 한다.
5. 유지 보수성
스파게티 코드처럼 꼬인 코드를 만들고 싶지 않다. 사이트 프로젝트를 만들 때 설계를 제대로 해나가지 않아서 중구난방으로 코드를 작성한적이 많고 그래서 풀필요한 코드나 재사용할 수 있는 코드를 놔두고 비슷한 기능인데 처음부터 다시 구현한다는 등의 과정이 많았다. 이번에는 그런 내용을 잘 잡아 보려고 한다.
코드는 github를 통해서 관리할 예정이다. msa구조를 채택한 만큼 github에 각 서비스 내용을 따로 따로 올려둘 계획이다.
6. 호환성
휴대폰과 웹 상에서 둘다 작동할 수 있도록 만드려고 한다.
7. 사용성
사용자 주로 내가 되겠지만 직관적으로 사용할 수 있는 쉬운 Interface를 제공할 예정이다.
기술 스택
1. Front-end
front end는 반응형으로 사용하기 좋은 react와 reactnative를 사용해서 앱 웹을 만드려고 한다.
Nginx를 사용해서 라우팅을 할 계획이다.
2. Back-end
Spring Boot, Securit, JWT를 사용해서 백엔드를 구성할 예정이다.
3. Database
PostgreSQL을 사용한다.
postgre의 단점이 db를 update를 할때 기존행이 사라지고 새로운 행을 생성하는 방식이라 update할때의 성능이 좋지 않다.
하지만 Postgre에만 지원하는 Hash Join, Partial Index등의 기능이로 인해 대용량의 데이터 처리이점이 있어 Poestgre를 선택했다. 단점인 update또한 시간기록어플리케이션 특성상 update할 일이 적기 때문에 이점이 더 클것으로 예상한다.
4. Container Orchestration
Docker를 사용해서 MSA구조를 만들 것이다. 또한 k8s를 사용해서 devops기능을 사용하려고 한다.
5. CI/CD Automation
JenKins, Gradle를 사용해서 빌드를 자동화하고 소프트웨어 품질을 지킬 수 있도록 하려고 한다.
6. Data Sync
kafka를 사용해서 msa를 사용할때 db접근을 제어하려고 한다.
데이터 명세

사용자는 타이머기능을 사용할 수 있고 시간입력 회원가입등을 할 수있다.
서버에서는 사용자들이 db에저장한 시간 기록을 토대로 정해진 시간 마다 랭킹을 계산해서 저장한다.

그에 따른 class다이어그램이다. 시간 기록은 공부를 완료했을때의 각각의 시간 기록이고 통합 시간 모델은 날짜당 기록하는 시간 기록이다. 각 클래스의 설명은 github에 설명되어 있다.
MSA 아키텍처 구조
1. 타이머 서비스
사용자가 학습을 시작하고 긑내는 시간을 기록한다. 타이머의 기능을 모두 포함한다.
2. 시간 기록 서비스
기록된 시간을 조회하고 분석하는데 사용
3. 사용자 관리 서비스
사용자의 인증 관리를 달며 학교 이메일을 통한 인증도 가능
4. 공부 내용 관리서비스
공부 내용을 기입하고 카테고리 기능 수정 삭제를 사용할 수 있는 기능이다.
5. 경쟁 서비스
학교나 지역별로 랭킹을 만들고 조회하도록 도와주는 서비스
Coding, Software, Computer Science 내가 공부한 것들 잘 이해했는지, 설명할 수 있는지 적는 공간