파일공유, 일정관리, 채팅 등 다양한 기능을 한번에 사용할 수 있는 협업툴 프로젝트 생성 후 초대코드를 팀원들에게 전달하면 팀공간 WorkSpace에 참여가능
2022/08/26 ~ 2022/10/07
배포일자 2022/09/27
이름 | 깃헙주소 | 담당 |
---|---|---|
FE | https://github.com/develkitProject/frontend | FE/React |
한호성L | https://github.com/hosunghan-0821 | BE/Spring |
황인권 | https://github.com/ingwon97 | BE/Spring |
이재헌 | https://github.com/romeo92s | BE/Spring |
임준철 | https://github.com/cheoljun0422 | BE/Spring |
류현VL | https://github.com/LuisKlopp | FE/React |
이지혜 | https://github.com/G-Hae | FE/React |
김소정 | https://github.com/kimsojeong01 | Designer |
Language&build tool
Framework
Library
Database
Deploy
게스트 로그인
(1) 목적: 회원가입/로그인 절차를 부담스럽게 생각하는 사용자를 고려하여, 우선적으로 사용자가 서비스를 체험해보도록 게스트로그인 기능을 추가하였습니다.
(2) 특징: 메인화면에서 “임시계정으로 체험하기” 버튼을 클릭하면 자동으로 아이디가 생성되어 회원가입 및 로그인이 완료됩니다.
문서
(1) 목적: 협업툴 사이트라는 목적에 맞게 문서, 이미지, 파일을 쉽게 공유하고 수정하도록 하였습니다.
(2) 특징
- 자유로운 파일공유: 전체 30MB내에서 파일 공유를 가능하도록 하였습니다.
- 자유로운 수정기능: 다른 팀원이 올린 글에 내용만 살짝 수정하거나 혹은 파일을 새로 추가하는 경우를 고려하여, 삭제는 작성자만 가능하지만 수정은 프로젝트 내 모든 회원이 가능합니다. 단 최정 수정자가 게시글 하단에 기재됩니다.
- 문서 읽은 사람 명단을 표시할 수 있도록 구현 하였습니다.
실시간 채팅
(1) 목적: 프로젝트 협업을 위해서 각 프로젝트마다 채팅을할 수 있도록 하였습니다.
(2) 특징: 추후에 프로젝트에 합류하는 사람들도 전체적인 프로젝트 진행상황을 알 수 있도록 기존 채팅 내역 불러오기 기능을 무한스크롤로 구현하였습니다.
일정관리 캘린더
(1) 목적: 프로젝트내 모든 사람들이 일정을 확인하고 공유 하도록 하였습니다.
(2) 특징: 캘린더를 사용하여 일정추가/일정확인/삭제 기능 구현하였습니다.
기술명 | 이유 |
---|---|
Spring Boot | 자바의 웹 프레임워크로, 특정 Library의 버전 자동 설정 기능을 이용하여 쉽고 빠른 웹 개발을 위하여 선택 |
MYSQL | 현재 사용되는 서비스의 데이터간의 관계 및 확장성을 고려했을 때, RDBMS 인 MYSQL을 선택 |
Stomp,Sock.Js | 기존의 Websocket위에서 작동하는 프로토콜로, 클라이언트와 서버의 통신에 사용할 메시징 형식이 정의되어 있고, 그에 맞춰서 데이터 송수신에 편리함이 있어 선택 Spring STOMP의 내장된 Message Broker와 Publish/Subscribe 기능을 통해, 데이터를 원하는 클라이언트로 전달하는데 편리함이 있어 선택 유저의 브라우저가 Websocket 지원하지 않을 경우를 대비하여 Sock.js 선택 |
Redis | 채팅 데이터를 빠르게 읽고 쓰기 위한 caching용 DB로 선택 |
Redis 를 활용한 채팅데이터 쓰기 전략 수립 및 속도 개선
(1) 문제상황
Websocket으로 들어오는 채팅내역들을 들어올 때 마다, MYSQL에 Insert 를 해야함. 계속해서 MYSQL Connection을 만들어서 쓰기 작업을 하는것은 비효율적이라고 판단. Redis에 caching 시킨 후 MYSQL에 일괄 저장하는 방법을 고민하기로함
(2) 해결방안 검토
-
Spring Data JDBC 를 이용한 batchUpdate() / Entity Generation Type: Identity
→ Batch insert 가능
-
Spring Data JPA를 이용한 SaveAll() / Entity Generation Type: Identity
→ Batch insert 불가능 (Hibernate Flush 방식 Transactional Write Behind에 위배됨으로 사용 못함)
-
Spring Data JPA를 이용한 SaveAll() /Entity Generation Type: Table
→ Batch insert 가능
(3) 의견결정 (Test 통해 결정)
Test 환경
-
Java Version : 11
-
Spring Boot : 2.7.3
-
Test Libaray : Junit5
-
RDBS : mysql 8.0
-
데이터 읽기
-
채팅 데이터 읽기 쓰기 전략 간단 모식도
Test 결과
의견결정
Spring Data JDBC 를 이용한 batchUpdate() 로 redis에 caching 되어 있는 데이터들을 writeback 방식으로 mysql 저장하는 방식 선택
Redis 를 활용한 채팅데이터 읽기 전략 수립 및 속도 개선(Caching)
MYSQL 에 저장되어 있는 기존의 채팅 데이터를 Redis에 어느 기준으로 caching 시켜놓아야 효율적인 관리가 될 수 있을지 고민하기로 함
(2) 해결방안 검토
- redis에 채팅 데이터를 caching 시켜놓지 않고, 사용자가 채팅 데이터를 요청할 경우, 해당 데이터를 mysql로 부터 읽어들이고 해당 내용을 caching 하는 방법
- redis에 매일 새벽 채팅 데이터 7일치를 최신 caching 해놓는 방법 & 최근 7일 이전 데이터를 요청할 경우, Mysql로부터 데이터를 끌어와 redis에 caching 해놓는 방법
(3) 의견결정
- 서비스 특성상, 채팅 데이터를 최신순으로 읽어오고, 프로젝트 페이지로 넘어올 때, 채팅이 자동 렌더링 되면서 데이터를 조회하기 때문에 , 최신 7일치 데이터를 caching 해놓는 방법 선택
- Redis에 데이터 저장할 수 있는 용량이 제한이 있어서, User Test(100~150명)를 통해 최신 7일치 데이터를 caching 해도 무리없겠다고 판단.
Cursor Pagination 을 통해 채팅 데이터 읽기
(1) 문제상황 ****
DB에 저장되어 있는 채팅 데이터를 Pagination을 통해 데이터를 제공해줘야 하는 상황에서, 데이터 누락,중복 없으면서, 효율적인 방법을 찾아야 했음.
(2) 해결방안 검토
-
Off-Set Pagination
페이지 번호 (offset) 페이지 사이즈 (limit)을 기반으로 데이터 조회 페이지 번호까지 데이터를 전부 읽고 그 다음 필요한 데이터를 가져와서 사용하는 방식
-
Cursor Pagination
Cursor를 기반으로 필요한 데이터를 가져오는 방식, 불필요한 데이터 조회가 없다. Off-set paging 의 존재하는 데이터 누락 혹은 중복 현상이 없다
(3) 의견 결정 (Test 통해 결정)
Mysql 로 부터 데이터 조회오는 방식에 따른 시간 분석
Test 환경
- Java Version : 11
- Spring Boot : 2.7.3
- Test Libaray : Junit5
- RDBS : mysql 8.0
Test 결과
의견결정
Off-Set paging 의 경우, 새로운 데이터가 삽입될 시, 데이터 중복 현상이 존재할 수 있기 때문에, 성능 측면 기능 측면 모두 Cursor Paging이 적합하다고 판단하여서, Cursor Paging 방식 선택