-
Notifications
You must be signed in to change notification settings - Fork 3
5️⃣ 5주차 발표 준비
- 사용자들은 문서를 작성하고 편집할 수 있습니다.
- 모든 변경 사항은 실시간으로 캔버스와 동기화됩니다.
- 문서들은 노드로 연결되며, 위치 이동이나 연결 상태 변경을 다른 사용자와 실시간으로 공유할 수 있습니다.
- 웹소켓 연결을 통해 실시간 협업 환경을 구축했습니다.
- Yjs로 데이터 변경 사항을 백엔드와 동기화하며, 모든 연결 정보를 데이터베이스에 저장합니다.
- 노드에 이모티콘을 추가하여 문서별로 시각적인 구분을 지원합니다.
지난 발표에서 사용자들로부터 받은 주요 피드백은 다음과 같습니다:
- 노드 연결 버튼 크기 확대 요청.
- 에디터와 캔버스 배경색 구분 부족으로 인한 가독성 문제.
- 다른 사용자 커서 크기가 너무 커서 불편하다는 의견.
- 노트 창 크기 조절 기능 추가 요청.
- 특정 노드의 커스터마이징 가능성 요구(구분하기 쉽게).
- 사용자의 커서, 프로필 변경을 더 쉽게.
-
그룹화
- 단순 : GroupNode 위치, 크기만 저장.
- 고도 : Group : Node → 에디터 안에서 메타데이터 - 어떤 그룹에 속해 있는지를 보여줄 수 있다.
-
사용자들로부터의 피드백 반영
- 도메인과 배포 관련 작업
- 서버 안정화, Postgres 연결
- 자동 배포 안정화
- https 구현
- 캐시, 쿼리 안정화, 최적화
- 회원가입, 로그인 구현
- 로그인과 개인 워크스페이스
- 단순 : 공유 링크로 동시 편집 가능한 형태, 생성은 로그인을 해야지 가능하게
- 고도화 : 유저를 초대
- 권한 관련 : read / read & edit
로그인
- OAuth, 로그인 상태 저장
워크스페이스 생성
워크스페이스 분리
- 워크 스페이스별 소켓 룸, Y.Doc 분리
- tanstack router 사용, 워크스페이스별 라우트 분리
- 워크스페이스별 다른 소켓 룸과 Y.Doc 이름으로 다른 환경 제공
- 초대 및 권한 설정
- 토큰을 파라미터로 갖는
join/${token}
라우트에서 워크스페이스 입장 요청 후 워크스페이스로 redirect
- 토큰을 파라미터로 갖는
연결 관계 관련 기능
- 그룹화
- 일반 노드를 담을 수 있는 그룹 노드 생성, 실시간 싱크
피드백
-
노드 포커스
-
커서 커스텀
ERD 개선 작업
- 사용자 관련 기능
- 워크스페이스 관련 기능
- 문서 메타데이터 추가
- 특정 문서와 연결된 문서들
쿼리 최적화
- update query 수 줄이기
- 캐시 시스템 개선해보기
- 실시간 변경 사항은 인 메모리 redis 데이터베이스에 저장하고 스케줄러를 통해 주기적으로 데이터베이스에 반영
- redis의 모든 사항은 bulk update를 통해 한 번의 쿼리로 모두 데이터베이스에 저장
워크스페이스, 역할 단위 추가
- 엔티티, 서비스, 컨트롤러 기본 구성
- DB 구성, 레포지토리와 연결
- 기본 API 구성: 워크스페이스 생성, 삭제, 권한 부여
권한 관리 (워크스페이스)
A. 워크스페이스 종류, 역할(Role) 종류
-
역할(Role)
- (1) 소유자인 owner (workspace 삭제, 게스트 초대 기능)
- (2) 초대받은 사람인 guest (workspace 안 문서, edge, node등 편집, 삭제, 생성 가능)
→ 이렇게 두가지 role만 만들어놓고
-
workspace 자체는
- (1) public (모두에게 공개)
- (2) private (자신 + 초대받은 guest들에게만 공개)
B. private workspace에서 owner가 guest를 초대하는 로직
- 워크스페이스 소유자가 링크 만들기 ⇒ 암호화된 링크 생성
- 해당 링크로 초대받은 사람이 접근
- 서버에서 해당 링크 검증
- DB에 초대받은 사람 Guest로 Role 업데이트
- 업데이트 후 클라이언트는 해당 워크스페이스의 현재 브라우저에 접속하고 있는 사용자의 권한을 알 수 있다
배포
- 도메인 연결 및 https 구현
⚓️ 사용자 피드백과 버그 기록
👷🏻 기술적 도전
📖 위키와 학습정리
✏️ 에디터
Novel이란?
Novel 스타일링 문제
에디터 저장 및 고려 사항들
📠 실시간 협업, 통신
Yorkie와 Novel editor 연동
YJS, Websocket, React-Flow
YJS, Socket.io
WebSocket과 Socket.io에 대해 간단히 알아보기
YJS 가이드 근데 이제 Socket.io를 곁들인
🏗️ 인프라와 CI/CD
NCloud CI CD 구축
BE 개발 스택과 기술적 고민
private key로 원격 서버 접근
nCloud 서버, VPC 만들고 설정
monorepo로 변경
⌛ 캐시, 최적화
rabbit mq 사용법
🔑 인증, 인가, 보안
passport로 oAuth 로그인 회원가입 구현
FE 로그인 기능 구현
JWT로 인증 인가 구현
JWT 쿠키로 사용하기
refresh token 보완하기
🧸 팀원 소개
⛺️ 그라운드 룰
🍞 커밋 컨벤션
🧈 이슈, PR 컨벤션
🥞 브랜치 전략
🌤️ 데일리 스크럼
📑 회의록
1️⃣ 1주차
킥오프(10/25)
2일차(10/29)
3일차(10/30)
4일차(10/31)
2️⃣ 2주차
8일차(11/04)
9일차(11/05)
11일차(11/07)
13일차(11/09)
3️⃣ 3주차
3주차 주간계획(11/11)
16일차(11/12)
18일차(11/14)
4️⃣ 4주차
4주차 주간계획(11/18)
23일차(11/19)
24일차(11/20)
25일차(11/21)
5️⃣ 5주차
5주차 주간계획(11/25)
29일차(11/25)
32일차(11/28)
34일차(11/30)
6️⃣ 6주차
6주차 주간계획(12/2)
37일차(12/3)