https://github.com/SiHanni/chat/tree/main/chatBE/chat-app
chat/chatBE/chat-app at main · SiHanni/chat
Contribute to SiHanni/chat development by creating an account on GitHub.
github.com
타임 라인 기준으로 작성할 것
고민했던 부분은 다 기록해두고 스터디할 것
작업 시작
1. 화면 구성은 모바일 카카오톡과 거의 비슷하는 것을 목표로 한다.
2. 데이터베이스 스키마 작성
- 회원가입은 이메일로 진행할 예정
- 유저 테이블, 친구 관리는 N:M 관계로 진행하기 위한 중간 테이블
- 채팅방과 유저 데이터 역시 N:M 관계
- 아이템 선물 등을 관리할 테이블 고려
3. 채팅 데이터 저장에 대한 고민
mysql에 채팅 내용을 저장하게되면 나중에 데이터의 양이 너무 많아지고, 읽고 쓰기에 성능저하가 생길수도 있을 것 같다.
실시간 앱인데 곤란하다.
| SQL | NoSQL | |
| 장점 | 1. 데이터 무결성 메시지를 저장하면서 관련 테이블에 함께 내용이 업데이트 될 때 유리하다 2. 복잡한 쿼리를 지원한다. (채팅 내용을 분석할 필요가 있을때 유리하다) 3. 스키마가 명확하다 |
1. 유연한 스키마 데이터 구조가 변경될 때 유연하게 대응 가능 2. 수평적 확장성 분산 시스템에서 데이터를 쉽게 분산 저장 가능하여 대규모 트래픽에 효과적으로 대응 가능 3. 고속 쓰기 성능: NoSQL 데이터 베이스는 쓰기 성능이 뛰어나 실시간 메시지 저장에 적합하다. |
| 단점 | 1. **수평적 확장이 어렵기 때문에 사용자 수가 급증하거나 대량의 데이터를 처리할 때 성능 문제가 있을 수 있다. 2. 데이터 구조의 변경이 유연하지 않을 수 있다. |
1. 데이터 무결성 SQL에 비해 데이터 무결성 관리가 어렵다. 2. SQL과 같은 복잡한 조인이나 정교한 쿼리 사용이 어렵다 |
실시간으로 빠르게 처리되어야하고, 메시지 검색이나 쓰기 읽기가 상대적으로 빨라야하므로 NoSQL데이터 베이스가 더 적합해 보인다고 판단했다.
하지만 기본적으로 유저 관리, 친구 관리는 SQL을 쓰고 채팅 데이터만 NoSQL로 관리하기로 결정했다.
gql도 고민해봤지만 이번에는 다루지 않기로함.
그 이유는 해당 프로젝트에는 기존에 가지고있는 기술 스택 개념을 더 보강하는 차원에서 최대한 빠르게 앱을 만들어 보고 싶기 때문이다.
하지만 추후에 실시간 알림 기능 따위를 구현할 일이 있을때 다시 재차 고민하기로 했다.
정리된 데이터 베이스 구조
MySQL과 NoSQL의 하이브리드 형태
MySQL
1. 유저 테이블 (사용자 정보 관리 : id, username, email, password, profileimg, status, ....)
2. 친구 관계 중간 테이블 (id, friend user id, created_at, deleted_at....)
3. 채팅방 정보 테이블 (id, created_at, deleted_at 등등 )
4. 유저 - 채팅방 중간 테이블 (채팅방 id(FK) <-> 유저 id(FK)) N;M
NoSQL
채팅 데이터 관리 (채팅방 id는 MySQL에서 동일 관리)
본격적인 작업
1. git repo 생성
2. 백엔드 작업 착수
- 프로젝트 생성
nest new chat-app - 프로젝트 내 필요한 패키지 설치
- @nestjs/typeorm: NestJS에서 TypeORM을 사용하기 위한 패키지
- typeorm: TypeORM 라이브러리
- mysql2: MySQL을 연결하기 위한 드라이버
- @nestjs/mongoose: NestJS에서 MongoDB를 사용하기 위한 패키지
- mongoose: MongoDB ODM (Object Data Mapping) 라이브러리
- @nestjs/websockets: WebSocket 통신을 위한 패키지 (Socket.IO 포함)
- socket.io: 실시간 채팅을 위한 패키지
- bcryptjs: 비밀번호 암호화 라이브러리
- class-validator: DTO에서 유효성 검사하기 위한 라이브러리
- **(먼저 깃을 만들어 두고 nest 프로젝트를 시작하면 깃 저장소가 초기화 되므로 통합하려면
rm -rf .git 으로 .git을 지워주고, git rm --cached . -rf 로 캐쉬를 지워주고 커밋을 해주면 된다. - db 세팅
- mongodb 는 컨테이너를 띄운뒤 몽고 커뮤니티 서버를 다운받아 확인
자세한 compose.yml은 프로젝트 깃허브에 있음.
유의점: mongo-express
basicAuth credentials are "admin:pass", it is recommended you change this in your config.js!
typeorm과 mongodb 사이에 버젼 디펜던시 에러가 나서 몽고 버젼을 5.9.2로 낮췄음 - app.module
TypeOrmModule- forRoot: 앱의 정적인 데이터베이스 설정을 동기적으로 정의. 정적인 방법
데이터베이스 연결 설정을 코드에 직접 포함 - forRootAsync: 환경 변수나 비동기 로직을 포함하여 동적으로 데이터베이스 설정을 정의.
설정 정보를 동적으로 생성하거나 외부 설정 파일이나 환경 변수를 통해 가져올 때 유용
추후 ConfigService를 통해 환경 변수를 가져올때 사용할 예정 - forFeature: 특정 모듈에 특정 엔티티의 리포지토리를 등록하여 사용 가능하도록 함.
특정 모듈에서 특정 엔티티에 대한 리포지토리를 제공하고 싶을 때 사용합니다.
- forRoot: 앱의 정적인 데이터베이스 설정을 동기적으로 정의. 정적인 방법
- mongodb 는 컨테이너를 띄운뒤 몽고 커뮤니티 서버를 다운받아 확인
- module 생성 및 엔티티 dto 생성
- nest g resource [모듈명]
- user 엔티티
- chatting 엔티티
- 친구 - 채팅방 관련 중간 테이블 작성
- user-friend 중간 테이블 엔티티 작성
- 깃 전략
- main 하위에 BE-develop (추후 프론트는 FE-develop)
TODO
내일은 dto 작성, 본격적인 실시간 채팅 백엔드 작업
혼자하는 작업이지만 작업 브랜치, 커밋명 더 세부적으로 나눌 것
주석
** 수평적 확장 : 기존 시스템에 더 많은 서버를 추가하여 성능을 향상시키는 방법 ( 하나의 서버에 부하가 걸리면 새로운 서버를 추가하여 분산을시키는 방식)
(관련 개념: 로드 밸런서: 여러 서버로 요청을 분배하는 역할, 분산 데이터베이스(데이터 베이스가 여러 서버에 분산되어 데이터를 관리하는 방식), 마이크로 서비스 아키텍쳐)
** 수직적 확장 : 서버 성능 자체를 높여 성능을 향상시키는 방법
** 웹소켓
https://sihanni.tistory.com/59
'ToyProject' 카테고리의 다른 글
| nestJS 실시간 채팅 앱 - [Fin] 도메인 (1) | 2025.01.01 |
|---|---|
| [TIL, 마루톡] 20241216 (Jest, Repository, Docker Volume, JWT refactoring) (1) | 2024.12.16 |
| nestJS 실시간 채팅 앱 - [8] trouble shooting 2 (0) | 2024.12.07 |
| nestJS 실시간 채팅 앱 - [7] 서버, (trouble shooting) (3) | 2024.12.05 |
| datetime과 timestamp의 차이 (0) | 2024.07.22 |