|
1 |
| -# 구해줘 홈즈 |
| 1 | +# Duaily - 빈집 거래 중개 플랫폼 |
2 | 2 |
|
3 |
| -## How to start |
| 3 | +<p align="center"> |
| 4 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203564675-616e80f0-4e87-493c-8aaa-a0ef3b9dd4bf.png"> |
| 5 | +</p> |
4 | 6 |
|
5 |
| -1. 로컬 환경에서 원하는 위치에서 `git bash` 를 실행한다. 아래 명령어를 입력한다.. |
| 7 | +## 🎙 프로젝트 설명 |
6 | 8 |
|
7 |
| -```bash |
8 |
| - git clone https://github.com/Duaily/backend.git |
9 |
| -``` |
| 9 | +듀얼리는 흩어져 있던 듀얼 라이프 정보를 제공할뿐만 아니라 빈집 거래를 통해 |
| 10 | +듀얼 라이프 실현까지 도우며 빈집 문제까지도 해결하는 것을 목표로 하는 플랫폼입니다. |
10 | 11 |
|
11 |
| -2. `Docker Desktop`을 실행한다. <br/> |
12 |
| -3. 인텔리제이 IDEA를 실행한 뒤, 빌드가 끝나면 터미널에서 아래 명령어를 입력한다. |
| 12 | +핵심 기능은 다음과 같습니다. |
13 | 13 |
|
14 |
| -```bash |
15 |
| - docker-compose up |
16 |
| -``` |
| 14 | +- 빈 집 게시글을 작성하고 조회 |
| 15 | +- 빈 집 게시글을 통한 거레 |
| 16 | +- 듀얼 라이프에 관심 있는 사용자들간의 커뮤니티 |
17 | 17 |
|
18 |
| -4. 인텔리제이 `run` 버튼을 눌러 프로젝트가 성공적으로 실행되는 지 확인한다. |
| 18 | +## 🛠 기술 스택 |
19 | 19 |
|
| 20 | +`Springboot(Java)`를 이용한 API 서버를 개발하였고, `JPA(ORM)`과 `MySQL`을 이용한 CRUD 구현하였습니다. |
| 21 | +<br/> |
| 22 | +`AWS EC2`를 이용해 서버를 배포하였고, `AWS RDS`를 이용해 DB 서버를 구성하였습니다. <br/> |
| 23 | +`AWS S3`를 이용해 이미지 데이터를 관리하였습니다. <br/> |
| 24 | +`Redis`를 이용해 인증을 위한 토큰 정보와 인증코드 정보를 관리하였습니다. <br/> |
| 25 | +`Prometheus`를 이용해 서버의 데이터 로그를 수집하고, `Grafana`를 이용해 데이터를 시각화하였습니다. <br/> |
| 26 | +`Docker`를 이용해 EC2 서버 내에서 API 서버, Redis, Prometheus, Grafana를 컨테이너화하여 구축하였습니다. |
| 27 | +협업 및 코드 버전 관리를 위해 `github`을 이용하였으며, API 문서화 도구로 `Spring Rest Docs`를 사용하였습니다. <br/> |
| 28 | +자동 배포를 위해 `github actions`를 이용하였습니다. |
20 | 29 |
|
21 |
| -## Commit Convention |
| 30 | +## 📄 개발 내용 |
| 31 | +- JWT 토큰 + Spring Security 를 이용한 소셜 로그인 ( kakao ) |
| 32 | +- 빈 집 게시글 작성|상세조회|목록조회 |
| 33 | +- 후기 게시글 작성|상세조회|목록조회 |
| 34 | +- 지역 게시글 조회 |
| 35 | +- 사용자 정보 조회 |
| 36 | +- 전화번호 인증 |
| 37 | +- 이미지 업로드|삭제 |
| 38 | +- 거래 생성|거래 완료 |
| 39 | + |
| 40 | +## 📐 시스템 아키텍처 |
| 41 | +<p align="center"> |
| 42 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203553960-81cc4755-aebd-4c25-b5fb-1ea53d1b40a5.png"> |
| 43 | +</p> |
| 44 | + |
| 45 | +시스템 아키텍처는 `듀얼리` 웹 시스템에 대한 아키텍처입니다. 해당 아키텍처는 사용자가 시스템을 이용하는 데 사용 되는 핵심 컴포넌트만을 담았습니다. <br/> |
| 46 | +사용자는 HTTPS 프로토콜을 통해 요청과 응답을 주고 받으며, 프론트엔드는 버셀을 통해 배포하였습니다. 버셀은 REST API 서버인 Spring APP과 통신을 합니다. <br/> |
| 47 | +API 서버를 비롯한 캐싱용 서버인 Redis, 데이터 로그 수집을 위한 Prometheus, 데이터 시각화를 위한 Grafana 가 Docker 컨테이너로 EC2 에서 구동 중입니다. <br/> |
| 48 | +DB 서버는 AWS의 RDS를 통해 구축하였고, 외장 스토리지로 S3 버킷을 사용하였습니다. |
| 49 | + |
| 50 | +## 📐 CI/CD Workflow |
| 51 | +<p align="center"> |
| 52 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203554103-523c4306-3dd3-46c0-acf9-2d371c742628.png"> |
| 53 | +</p> |
| 54 | + |
| 55 | +1. 로컬 `feature` 브랜치 ( Dual-# )에서 origin의 `feature`로 push |
| 56 | +2. origin의 `feature` 브랜치에서 origin의 `develop` 브랜치로 push |
| 57 | +3. github actions CI/CD 실행 <br/> |
| 58 | + A. Java 11 버전 설치 <br/> |
| 59 | + B. Gradle 캐싱 <br/> |
| 60 | + C. Gradle 권한 부여 <br/> |
| 61 | + D. DB, Redis, aws 등 정보를 담은 application-secret.yml 파일 값 세팅 <br/> |
| 62 | + E. jar 파일 생성 <br/> |
| 63 | + F. Dockerfile 빌드 및 Docker hub 로 push <br/> |
| 64 | + G. AWS EC2에 deploy <br/> |
| 65 | +가장 최근 배포 시간 기준, `1분 19초` 소요. <br/> |
| 66 | + |
| 67 | +## 📐 Runtime View |
| 68 | +<p align="center"> |
| 69 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203554050-b27a734c-46a7-4ac5-bc41-a028bf7ea35e.png"> |
| 70 | +</p> |
| 71 | + |
| 72 | +실행시점에 시스템 구성을 나타낸 그림입니다. 실제 사용자에서부터 데이터가 흘러가는 흐름을 파악할 수 있습니다. |
| 73 | + |
| 74 | +## 📐 Pacakge View |
| 75 | +<p align="center"> |
| 76 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203555516-fb6703ff-ce0f-4442-8c45-d7f9c3f69f97.png"> |
| 77 | +</p> |
| 78 | + |
| 79 | +Backend 내 프로젝트 구성입니다. 그림과 같이 Security config, Controller, Service, Repository, Domain 구성을 갖고 부가적인 요소들은 따로 표기하지 않았습니다. |
| 80 | + |
| 81 | +## 📐 Infra Architecture ( AS-IS ) |
| 82 | +<p align="center"> |
| 83 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203554074-517606fc-35b4-45ea-b053-a0443ebe9417.png"> |
| 84 | +</p> |
| 85 | + |
| 86 | +현재 듀얼리 시스템의 인프라 아키텍처입니다. 해당 아키텍처는 프리티어 계정으로 제한된 리소스만을 가지고 구축했다는 점을 미리 양해바랍니다. <br/> |
| 87 | +사용자는 Route 53 ( DNS )를 통해 "duaily.net"으로 접속합니다. 해당 도메인으로 들어오는 요청에 대해 ALB ( Application Load Balancing )이 HTTPS로 forwarding 합니다. <br/> |
| 88 | +Public 서브넷에 존재하는 WAS 서버로 요청이 들어가면, 서버 내의 Spring boot ( 8080 ) 컨테이너가 요청을 받아 수행합니다. 해당 서버는 EC2 내부에서 도커 컨테이너 간의 네트워크로 Redis와 통신하며, RDS와는 별도의 보안 그룹을 형성하여 통신하도록 하였습니다. |
| 89 | + |
| 90 | +S3 의 경우, 이미지 객체를 보관하는 용도로 구축하였습니다. 여기에 로깅 데이터를 추가로 담을 예정입니다. |
| 91 | + |
| 92 | +## 📐 Infra Architecture ( TO-BE ) |
| 93 | +<p align="center"> |
| 94 | +<img alt="image" src="https://user-images.githubusercontent.com/61505572/203554243-777cdc51-620e-4367-86d2-9a32681db6a6.png"> |
| 95 | +</p> |
| 96 | + |
| 97 | +해당 아키텍처는 앞으로 확장시켜 나갈 서비스를 위한 인프라 아키텍처입니다. <br/> |
| 98 | +WEB/WAS/DB 3 Tier 형태로 구축하여 각 계층의 독립성을 보장하고, 보안성을 고려해 WAS, DB는 private 서브넷으로 구성할 예정입니다. 또한, 프리티어 계정인 점을 감안하여 Auto-scaling 옵션 대신 EC2 인스턴스를 1대 더 두어 WAS에 대해서 이중화를 할 예정입니다. RDS는 그대로 MySQL 인스턴스를 2대의 WAS가 같이 마주보는 식으로 구성할 예정입니다. <br/> |
| 99 | + |
| 100 | +AS-IS에서 도커 컨테이너로 구축했던 Redis를 별도의 Elastic Cache for Redis 서비스를 이용할 예정입니다. ( 해당 서비스는 프리티어 기준 제한된 리소스를 제공한다는 점에서 처음부터 도입할 것인지에 대해 고민하였습니다. ) |
| 101 | + |
| 102 | +정리하면, EC2 인스턴스는 총 3개가 필요하며, RDS는 기존 그대로 유지하되 Redis만 별도의 서비스를 이용할 것입니다. <br/> |
| 103 | +WEB 서버에 올라가는 엔진으로는 Ngnix를 선택할 예정이며 로드밸런싱, 리버스 프록시, 경량화 등의 이유로 선정하였습니다. |
| 104 | + |
| 105 | +## 📈 Server Metric Monitoring |
| 106 | +<p align="center"> |
| 107 | +<img width="801" alt="image" src="https://user-images.githubusercontent.com/61505572/203554603-2fd2033f-8eca-4970-944c-58a86bd0b5e3.png"> |
| 108 | +</p> |
| 109 | + |
| 110 | +해당 그림은 1.0.0 release 전 QA 단계의 Grafana 대시보드입니다. Prometheus와 Grafana JVM ( Micrometer )를 이용해 성능 지표를 확인합니다. <br/> |
| 111 | +요청을 처리하는 시간대, 발생 로그, 스레드의 상태 등을 확인하는 데 사용합니다. |
| 112 | + |
| 113 | +## 📊 Data Logging & Visualization |
| 114 | +<p align="center"> |
| 115 | +<img width="807" alt="image" src="https://user-images.githubusercontent.com/61505572/203554452-5524b34c-83d0-498c-80f7-00f6817d6ec2.png"> |
| 116 | +</p> |
| 117 | + |
| 118 | +해당 그림은 `1.0.0` release 전 QA 단계의 대시보드입니다. 파란색 포인트는 소셜 로그인 시 요청되는 API 시간대와 요청 수, 응답코드를 보여줍니다. <br/> |
| 119 | +메인 페이지 로딩 이후, 소셜 로그인을 통한 회원가입 혹은 사용자의 활동을 확인할 수 있는 지표로 메인 페이지 로딩이후 로그인까지 가는 사용자의 수와 걸린 시간을 확인합니다. 이를 통해 메인 페이지에서 사용자가 매력을 느끼고 로그인까지 가는 시간과 그 수를 통해 디자인이나 제공되는 데이터의 만족도를 짐작할 수 있습니다. 이는 서비스 초창기에 가장 중요하게 확인해야 하는 포인트라고 생각합니다. |
| 120 | + |
| 121 | +## 🔁 로컬 개발 가이드 및 협업 방식 |
| 122 | + |
| 123 | +로컬 개발 시, [WiKi 페이지](https://github.com/Duaily/backend/wiki/%EB%A1%9C%EC%BB%AC-%EA%B0%9C%EB%B0%9C-%EA%B0%80%EC%9D%B4%EB%93%9C) 링크에 가이드된 내용을 바탕으로 진행했습니다. <br/> |
| 124 | +개발 혹은 환경 세팅 중에 발생한 이슈 내용 및 레퍼런스를 각각의 issue에 comment로 기록하며 팀원들간의 정보 공유를 활성화하였습니다. |
| 125 | + |
| 126 | +## 📌 Commit Convention |
22 | 127 |
|
23 | 128 | ### Structure
|
24 | 129 | // 예시
|
|
35 | 140 | ### How to use
|
36 | 141 | - 타입의 첫 글자는 대문자로 시작하기
|
37 | 142 | - 메세지 내용은 50자 이내로 작성하기
|
38 |
| -- 문장을 동사 원형으로 시작하는 명령문 형태로 작성하기 |
| 143 | +- 문장을 동사 원형으로 시작하는 명령문 형태로 작성하기 |
0 commit comments