|
11 | 11 |
|
12 | 12 | <p align="center"> |
13 | 13 | <a href="#옥토독스소개">🐙 옥토독스 소개</a> <br> |
14 | | - <a href="#주차별피드백">🌱 주차별 피드백을 통한 점진적 개선</a> <br> |
| 14 | + <a href="#주차별피드백">🏗️ 피드백을 반영한 점진적 개선</a> <br> |
15 | 15 | <a href="#프로젝트타임라인">🗺️ 프로젝트 타임라인</a> <br> |
16 | | - <a href="#프로젝트구조">🛠️ 프로젝트 구조</a> <br> |
17 | | - <a href="#문제와해결과정">🚧 문제와 해결과정</a> <br> |
18 | | - <a href="#팀원소개">🧸 팀원 소개</a> <br> |
| 16 | + <a href="#프로젝트구조">⚙️ 프로젝트 구조</a> <br> |
| 17 | + <a href="#핵심경험">🗜️ 팀의 핵심 경험</a> <br> |
| 18 | + <a href="#팀원소개">🍻 팀원 소개</a> <br> |
19 | 19 | </p> |
20 | 20 |
|
21 | 21 | <br><br> |
|
26 | 26 |
|
27 | 27 | <br> |
28 | 28 |
|
29 | | -### 🕸️ 관계형 지식 관리 툴 |
| 29 | +<div align="center"> |
| 30 | + |
| 31 | +### 🪡 관계형 지식 관리 툴 |
30 | 32 |
|
31 | | -🌱 마크다운, 이미지, 코드 등을 활용해서 간편하게 **문서 작성**이 가능합니다. <br> |
32 | | -🌱 작성한 문서들을 **연결**하고 **배치**하면서 새로운 아이디어를 쉽게 떠올릴 수 있습니다. |
| 33 | +📢 마크다운, 이미지, 코드 등을 활용해서 간편하게 **문서 작성**이 가능합니다. <br> |
| 34 | +📢 작성한 문서들을 **연결**하고 **배치**하면서 새로운 아이디어를 쉽게 떠올릴 수 있습니다. |
33 | 35 |
|
34 | | -https://github.com/user-attachments/assets/1ac81d56-a0ce-403c-9e3f-7ba092b6a5b6 |
| 36 | + |
35 | 37 |
|
36 | 38 | <br> |
37 | 39 |
|
38 | | -### 🧸 실시간 동시 편집 및 협업 기능 |
| 40 | +### 👥 실시간 동시 편집 및 협업 툴 |
39 | 41 |
|
40 | | -🌱 에디터에서 간편하게 **실시간 동시 편집**이 가능합니다. <br> |
41 | | -🌱 작성된 문서들도 **함께 연결하고 배치**해 보며 우리 팀만의 구조를 만들어 볼 수 있습니다. |
| 42 | +📢 에디터에서 간편하게 **실시간 동시 편집**이 가능합니다. <br> |
| 43 | +📢 작성된 문서들도 **함께 연결하고 배치**해 보며 우리 팀만의 구조를 만들어 볼 수 있습니다. |
42 | 44 |
|
43 | | -https://github.com/user-attachments/assets/86b0dcaf-3640-4836-8b91-207b39b17b05 |
| 45 | + |
44 | 46 |
|
45 | 47 | <br> |
46 | 48 |
|
47 | | -### ⛺️ 워크스페이스 초대 기능 |
| 49 | +### 📮 워크스페이스 초대 가능 |
| 50 | + |
| 51 | +📢 우리 팀만의 **워크 스페이스를 생성**하고 팀원들을 **초대**할 수 있습니다. <br> |
| 52 | +📢 워크 스페이스의 **공개 범위**를 설정해서 누구나 참여할 수 있는 공간도 생성이 가능합니다. |
48 | 53 |
|
49 | | -🌱 우리 팀만의 **워크 스페이스를 생성**하고 팀원들을 **초대**할 수 있습니다. <br> |
50 | | -🌱 워크 스페이스의 **공개 범위**를 설정해서 누구나 참여할 수 있는 공간도 생성이 가능합니다. |
| 54 | + |
51 | 55 |
|
52 | | -https://github.com/user-attachments/assets/0c096e40-bed4-4cee-bb8e-40f72a5d43f2 |
| 56 | +<br> |
| 57 | +</div> |
53 | 58 |
|
54 | | -<br><br><br><br> |
| 59 | +<div align="center"> |
| 60 | + <a href="https://octodocs.site/" target="_blank"> |
| 61 | + ➡️ 지금 옥토독스 사용해보러 가기! |
| 62 | + </a> |
| 63 | +</div> |
| 64 | + |
| 65 | +<br><br> |
55 | 66 |
|
56 | | -<h1 id="주차별피드백">🌱 주차별 피드백을 통한 점진적 개선</h1> |
| 67 | +<h1 id="주차별피드백">🏗️ 피드백을 반영한 점진적 개선</h1> |
57 | 68 |
|
58 | 69 | <br> |
59 | 70 |
|
@@ -117,135 +128,85 @@ https://github.com/user-attachments/assets/0c096e40-bed4-4cee-bb8e-40f72a5d43f2 |
117 | 128 |
|
118 | 129 | 🚨 **데모 중 서비스가 다운되는 문제가 발생했어요** |
119 | 130 |
|
120 | | -> 5주차에는 데모 발표 중 사용자의 트래픽이 몰리면서 예상하지 못했던 버그로 인해 서버가 다운되었습니다. 이또한 **실사용자로부터 온** 중요한 피드백이라고 생각하였고 다른 피드백보다 서비스 복구를 최우선 과제로 삼았습니다. 이 과정에서 어떤 문제가 있었고 이를 어떻게 해결했을까요? |
| 131 | +> 5주차에는 데모 발표 중 사용자의 트래픽이 몰리면서 예상하지 못했던 버그로 인해 서버가 다운되었습니다. 이 또한 **실사용자로부터 온** 중요한 피드백이라고 생각하였고 다른 피드백보다 **서비스 복구를 최우선 과제로** 삼았습니다. 이 과정에서 어떤 문제가 있었고 이를 어떻게 해결했을까요? |
121 | 132 |
|
122 | 133 | → [🔗 어? 금지, 모니터 앞에 3명 이상 서있기 금지](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/5%EF%B8%8F%E2%83%A3-5%EC%A3%BC%EC%B0%A8-%EB%B2%84%EA%B7%B8-%EA%B8%B0%EB%A1%9D) |
123 | 134 |
|
124 | 135 | <br><br> |
125 | 136 |
|
126 | | -<h1 id="프로젝트타임라인">🗺️ 프로젝트 타임라인</h1> |
127 | | - |
128 | | - |
129 | | - |
130 | | -<br><br> |
131 | | - |
132 | | -<h1 id="프로젝트구조">🛠️ 프로젝트 구조</h1> |
133 | | - |
134 | | -### 🖥️ System Architecture |
135 | | - |
136 | | - |
137 | | - |
138 | | -<br> |
139 | | - |
140 | | -### 🐳 Sequence Diagram |
141 | | - |
142 | | -```mermaid |
143 | | -sequenceDiagram |
144 | | - participant Subscriber as 구독자 |
145 | | - participant OctoDocs as OctoDocs 워크스페이스 |
146 | | - participant Yjs as yjs 라이브러리 |
147 | | - participant YSocket as y-socketIO provider |
148 | | - participant WS_Server as websocket server (ysocketio) |
149 | | - participant PageModule as page 모듈 (node 모듈) |
150 | | - participant Redis as redis |
151 | | - participant Postgres as postgres |
152 | | - %% 웹소켓 연결 플로우 |
153 | | - note over Subscriber, YSocket: [웹소켓 연결 플로우] |
154 | | - Subscriber->>OctoDocs: Y.Doc 생성 요청 |
155 | | - OctoDocs->>Yjs: Y.Doc 생성 수행 |
156 | | - Yjs->>YSocket: Y.Doc 공유 요청 |
157 | | - alt [Y.Doc이 존재하지 않을 때] |
158 | | - YSocket->>WS_Server: 웹소켓 연결 |
159 | | - WS_Server->>PageModule: 데이터 조회 요청 |
160 | | - PageModule->>Redis: 데이터 조회 요청 |
161 | | - Redis->>PageModule: 데이터 조회 응답 |
162 | | - PageModule->>WS_Server: 데이터 조회 응답 |
163 | | - WS_Server->>YSocket: Y.Doc에 초기 데이터 셋팅 |
164 | | - YSocket->>Yjs: 웹소켓 연결 완료 |
165 | | - else [Y.Doc이 존재할 때] |
166 | | - YSocket->>WS_Server: 웹소켓 연결 |
167 | | - YSocket->>Yjs: 웹소켓 연결 완료 |
168 | | - end |
169 | | - %% 페이지 정보 변경 플로우 |
170 | | - note over OctoDocs, WS_Server: [페이지 정보 변경 플로우] |
171 | | - OctoDocs->>Yjs: Y.Doc 데이터 변경 |
172 | | - Yjs->>YSocket: 변경된 데이터 전달 |
173 | | - YSocket->>WS_Server: 소켓 요청 |
174 | | - WS_Server->>PageModule: 소켓 요청 |
175 | | - PageModule->>Redis: 변경 사항 저장 |
176 | | - Redis->>PageModule: 변경 사항 저장 알림 |
177 | | - PageModule-->>WS_Server: 저장 완료 알림 |
178 | | - WS_Server-->>YSocket: 변경된 데이터 전달 |
179 | | - YSocket-->>Yjs: 모든 참여자들에게 Y.Doc 데이터 변경 |
180 | | - %% 데이터베이스 영속화 플로우 |
181 | | - note over Redis, Postgres: [데이터베이스 영속화 플로우] |
182 | | - loop [스케줄러] |
183 | | - Redis->>Postgres: 변경 사항 저장 |
184 | | - Postgres->>Redis: 변경 사항 저장 알림 |
185 | | - end |
186 | | -``` |
187 | | - |
188 | | -<br><br> |
189 | | - |
190 | | -<h1 id="문제와해결과정">🚧 문제와 해결과정</h1> |
| 137 | +<h1 id="핵심경험">🗜️ Octodocs 팀의 핵심 경험</h1> |
191 | 138 |
|
192 | | -### 🐙 실시간 편집 구현 과정 |
| 139 | +### 🗣️ 실시간 편집 구현 과정 |
193 | 140 |
|
194 | 141 | 실시간으로 여러 사용자가 동일한 문서를 편집할 때, 충돌 없이 동기화하는 것은 어려운 문제입니다. Octodocs 팀은 이를 직접 구현하는 대신 **YJS**와 **Socket.IO**를 결합하는 전략을 선택했습니다. 하지만 이 두 라이브러리를 통합하는 과정에서 예상치 못한 문제들을 어떻게 해결했을까요? |
195 | 142 |
|
196 | 143 | → [🔗 실시간 편집의 비밀, 지금 바로 확인하기](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/%EC%8B%A4%EC%8B%9C%EA%B0%84-%ED%8E%B8%EC%A7%91-%EA%B5%AC%ED%98%84-%EA%B3%BC%EC%A0%95) |
197 | 144 |
|
198 | 145 | <br> |
199 | 146 |
|
200 | | -### 🌊 데이터 흐름 변경 |
| 147 | +### ☄️ 데이터 흐름 변경 |
201 | 148 |
|
202 | 149 | Octodocs 팀은 기존 RESTful API 기반 상태 관리를 버리고 **YDoc 중심의 단일 Truth Source**와 **소켓 기반 단방향 흐름**으로 전환했습니다. 이로 인해 모든 상태가 YDoc을 통해 일관되게 관리되고, 데이터 흐름도 간소화되었습니다. 기존 방식을 버리고 이 변화를 선택한 이유는 무엇일까요? 또한, 중복 관리와 데이터 충돌을 줄이기 위한 **data flow 변화**의 핵심은 무엇이었을까요? |
203 | 150 |
|
204 | 151 | → [🔗 데이터 흐름에 몸을 맡겨보기](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/%EC%86%8C%EC%BC%93%EC%9C%BC%EB%A1%9C-%EC%9D%B8%ED%95%9C-%EC%83%81%ED%83%9C%EA%B4%80%EB%A6%AC%EC%9D%98-%EB%B3%B5%EC%9E%A1%EC%84%B1%EA%B3%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%9D%90%EB%A6%84-%EB%B3%80%EA%B2%BD) |
205 | 152 |
|
206 | 153 | <br> |
207 | 154 |
|
208 | | -### 🕸️ FE 프로젝트 구조 개선 과정 |
| 155 | +### 🛠️ FE 프로젝트 구조 개선 |
209 | 156 |
|
210 | 157 | 짧은 기간의 스프린트를 빠르게 반복하여 개발했던 Octodocs 팀은 어느 순간부터 기능을 추가하고 유지보수하기 어렵다는 문제점을 마주하였습니다. 기존 **프로젝트 구조**의 문제점을 어떻게 파악했고, 어떤 방법으로 개선 했을까요? |
211 | 158 |
|
212 | 159 | → [🔗 FSD, 힙하지만 막 갖다 쓰진 않았습니다](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/FE-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B5%AC%EC%A1%B0-%EA%B0%9C%EC%84%A0-%EA%B3%BC%EC%A0%95) |
213 | 160 |
|
214 | 161 | <br> |
215 | 162 |
|
216 | | -### 🔑 워크스페이스 별 권한 부여 구현 과정 |
| 163 | +### 🔑 워크스페이스 별 권한 부여 |
217 | 164 |
|
218 | 165 | Octodocs 팀은 배포를 끝낸 사이트를 발표에 직접 이용하다가, 발표를 듣는 사용자들이 발표 자료를 멋대로 변경할 수도 있다는 걱정을 마주했고 **사용자들이 워크스페이스별 권한을 관리**할 수 있어야겠다는 결론을 내렸습니다. 하지만 워크스페이스에 초대를 하면 알림이 가는 시스템을 만들기에는 개발 기간이 얼마 남지 않은 상태였어요. Octodocs 팀은 어떻게 워크스페이스별 권한 관리를 구현하였을까요? |
219 | 166 |
|
220 | 167 | → [🔗 발표 자료 워크스페이스 접근 금지](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/%EC%9B%8C%ED%81%AC%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EA%B6%8C%ED%95%9C-%EC%84%A4%EA%B3%84%2C-%EA%B5%AC%ED%98%84-%EA%B3%BC%EC%A0%95) |
221 | 168 |
|
222 | 169 | <br> |
223 | 170 |
|
224 | | -### ✨ 드래그 이벤트 발생 시 생기는 쿼리 최적화 |
| 171 | +### ✨ 드래그 이벤트 발생 시 쿼리 최적화 |
225 | 172 |
|
226 | 173 | 노트 카드를 **드래그할 때 너무 많은 쿼리가 발생**해 서버가 멈추는 치명적인 문제가 있었습니다. 핵심 기능인 캔버스를 아예 이용할 수 없었기에, 반드시 해결해야 하는 과제였습니다. Octodocs 팀은 소수점 단위로 변하는 좌표를 DB에 저장하기 위해 어떤 최적화를 도입했을까요? |
227 | 174 |
|
228 | 175 | → [🔗 우측으로 1mm만 옮겨주세요](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B4%80%EC%B0%B0%2C-%EC%BF%BC%EB%A6%AC-%EB%B0%9C%EC%83%9D-%EC%B5%9C%EC%A0%81%ED%99%94-%EA%B3%BC%EC%A0%95) |
229 | 176 |
|
230 | 177 | <br> |
231 | 178 |
|
232 | | -### 🧨 Redis를 활용한 데이터베이스 부하 줄이기 |
| 179 | +### 🧨 Redis를 활용해 데이터베이스 부하 줄이기 |
233 | 180 |
|
234 | | -실시간으로 문서를 동시에 편집하면 굉장히 많은 변경 사항이 발생합니다. 누군가 타이핑을 할 때마다 변경 사항들을 모두 데이터베이스에 반영하기에는 부하가 너무 발생했기에, Octodocs 팀은 redis를 도입하기로 결정했습니다. 어떤 지점에서 redis 도입을 결정했고, 어떻게 redis를 활용하고 있을까요? |
| 181 | +실시간으로 문서를 동시에 편집하면 굉장히 많은 변경 사항이 발생합니다. 누군가 타이핑을 할 때마다 변경 사항들을 모두 데이터베이스에 반영하기에는 부하가 너무 발생했기에, Octodocs 팀은 **redis를 도입**하기로 결정했습니다. 어떤 지점에서 redis 도입을 결정했고, 어떻게 redis를 활용하고 있을까요? |
235 | 182 |
|
236 | 183 | → [🔗 Redis 같은 걸 끼얹나?](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/redis%EB%A5%BC-%ED%86%B5%ED%95%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%BF%BC%EB%A6%AC-%EC%A4%84%EC%9D%B4%EA%B8%B0) |
237 | 184 |
|
238 | 185 | <br> |
239 | 186 |
|
240 | | -### 🐳 개발 환경, 배포 환경 및 CI/CD에 대한 개선 과정 |
| 187 | +### 🐳 개발 환경, 배포 환경 및 CI/CD 개선해나가기 |
241 | 188 |
|
242 | | -Octodocs 팀은 사용자 경험 향상은 물론, 일관된 코드 품질 유지와 개발자 친화적인 쾌적한 개발 환경 조성을 위해 많은 노력을 기울였습니다. 멀티 레포에서 모노레포로의 전환, GitHub Actions를 활용한 CI/CD 구축, Docker와 Docker Compose의 도입까지—우리는 어떤 변화를 거쳤을까요? |
| 189 | +Octodocs 팀은 사용자 경험 향상은 물론, 일관된 코드 품질 유지와 **개발자 친화적인 쾌적한 개발 환경 조성**을 위해 많은 노력을 기울였습니다. 멀티 레포에서 모노레포로의 전환, GitHub Actions를 활용한 CI/CD 구축, Docker와 Docker Compose의 도입까지—우리는 어떤 변화를 거쳤을까요? |
243 | 190 |
|
244 | 191 | → [🔗 환경 개선의 여정 따라가기](https://github.com/boostcampwm-2024/web15-OctoDocs/wiki/%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD%2C-%EB%B0%B0%ED%8F%AC-%ED%99%98%EA%B2%BD-%EB%B0%8F-CI-CD%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%9C%EC%84%A0-%EA%B3%BC%EC%A0%95) |
245 | 192 |
|
246 | 193 | <br><br> |
247 | 194 |
|
248 | | -<h1 id="팀원소개">🧸 팀원 소개</h1> |
| 195 | +<h1 id="프로젝트구조">⚙️ 프로젝트 구조</h1> |
| 196 | + |
| 197 | +### System Architecture |
| 198 | + |
| 199 | + |
| 200 | + |
| 201 | +<br><br> |
| 202 | + |
| 203 | +<h1 id="프로젝트타임라인">🗺️ 프로젝트 타임라인</h1> |
| 204 | + |
| 205 | + |
| 206 | + |
| 207 | +<br><br> |
| 208 | + |
| 209 | +<h1 id="팀원소개">🍻 팀원 소개</h1> |
249 | 210 |
|
250 | 211 | | [J032\_김동준](https://github.com/djk01281) | [J075\_김현준](https://github.com/Tolerblanc) | [J097\_민서진](https://github.com/summersummerwhy) | [J162\_유성민](https://github.com/ezcolin2) | [J248\_진예원](https://github.com/yewonJin) | |
251 | 212 | | :--------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------: | |
|
0 commit comments