🏞️ 개발 환경 구성 계획
CI / CD
- 저장소 분리된대로 release에 CI / CD 구성하기
배포 서버
- DB 서버 연결
- API 서버 띄우기 ⇒ CI / CD
- (Socket 서버) 띄우기
- Client 서버 띄우기 ⇒ CI / CD
- Storage 서버 연결
🗄️ DB 설계
J144_이승민
## 대략적인 DB
### 1. 유저 Table
-#### 칼럼
-`id`: unsinged int, autoincrement
-`login_type`: enum(?), not null
-`login_key`: varchar, not null
-`created_at`: datetime, not null, default = now()
-`updated_at`: datetime, not null, default = now()
-`deleted_at`: datetime, not null, default = null
-#### constraints
-`id`: primary key
-`login_Type`&`login_key`: unique
### 2. 커뮤니티 Table
-#### 칼럼
-`id`: unsigned int, autoincrement
-`creator_id`: unsigned int, not null
-`title`: varchar, not null
-`description`: varchar, not null, default = ''
-`created_at`: datetime, not null, default = now()
-`updated_at`: datetime, not null, default = now()
-`deleted_at`: datetime, not null, default = null
-#### constraints
-`id`: primary key
-`creator_id`: foreign key => 유저 Table.id
### 3. 커뮤니티 참가 Table
-#### 칼럼
-`id`: unsigned int, autoincrement
-`user_id`: unsigned int, not null
-`community_id`: unsigned int, not null
-`user_nickname`: varchar, not null
-`authority`: enum(?), not null
-`created_at`: datetime, not null, default = now()
-`updated_at`: datetime, not null, default = now()
-`deleted_at`: datetime, not null, default = null
-#### constraints
-`id`: primary key
-`user_id`&`community_id`: unique
-`community_id`&`user_nickname`: unique
-`user_id`: foreign key => 유저 Table.id
-`community_id`: foreign key => 커뮤니티 Table.id
### 4. 키워드 Table
-#### 칼럼
-`id`: unsigned int, autoincrement
-`creator_id`: unsigned int, not null
-`community_id`: unsigned int, not null
-`keyword`: varchar, not null
-`created_at`: datetime, not null, default = now()
-`updated_at`: datetime, not null, default = now()
-`deleted_at`: datetime, not null, default = null
-#### constraints
-`id`: primary key
-`community_id`&`keyword`: unique
-`creator_id`: foreign key, 유저 Table.id
-`community_id`: foreign key, 커뮤티니 Table.id
### 5. 키워드 선택 Table
-#### 컬럼
-`id`: unsigned int, autoincrement
-`user_id`: unsigned int, not null
-`keyword_id`: unsigned int, not null
-`created_at`: datetime, not null, default = now()
-`updated_at`: datetime, not null, default = now()
-`deleted_at`: datetime, not null, default = null
-#### constraints
-`id`: primary key
-`user_id`: foreign key, 유저 Table.id
-`keyword_id`: foreign key, 키워드 Table.id
### 6. 키워드 쓰레드 Table
-#### 컬럼
-`id`: unsigned int, autoincrement
-`user_id`: unsigned int, not null
-`keyword_id`: unsigned int, not null
-`content`: varchar, not null
-`parent_thread_id`: unsigned int, nullable
-`created_at`: datetime, not null, default = now()
-`updated_at`: datetime, not null, default = now()
-`deleted_at`: datetime, not null, default = null
-#### constraints
-`id`: primary key
-`user_id`: foreign key, 유저 Table.id
-`keyword_id`: foreign key, 키워드 Table.id
-`parent_thread_id`: foreign key, 키워드 쓰레드 Table.id
### DB 관련 고민거리
- 관리자를 커뮤니티 생성자로 볼 것인가? 아니면 계승될 수 있도록 할 것인가?
- 관리자가 계승될 수 있다면, 테이블을 따로 둘 것인가? 아니면 유저가 참가하는 자리에 authority column을 둘 것인가?
- 관리자를 커뮤니티 생성자로 본다면, 롼리자를 커뮤니티 참가 Table에 추가할 것인가? 아니면 암시적으로 생성자는 건너뛸 것인가?
- 키워드 Table에서 creator_id와 community_id 가 각각 유저 Table의 id와 커뮤니티 Table의 id를 바라보고 있다.
- 이 경우, 데이터의 무결성이 지켜진다고 할 수 있을까?
- 논리적으로 말고, 구조적으로 데이터의 무결성을 위해서 어떤 관계를 추가하는 것이 좋을까?
- 유저의 nickname은 커뮤니티 별로 자유 결정하도록 할 것인가? 아니면 일괄적으로 하나의 nickname을 갖도록 할 것인가?
- 지금 짜놓은 DB 구조는 각 커뮤니티 별로 유저가 결정하도록 하는 구조이다.
- 키워드 병합을 효과적으로 처리하기 위한 DB 구조는 어떤 구조가 있을까?
- 현재 구조로는 키워드 쓰레드에 포함된 모든 row에서 걸리는 keyword_id를 변경해주어야 한다.
- 즉, 키워드 쓰레드 Table을 모두 뒤져봐야 한다.
- 대댓글을 구현하기 위한 더 좋은 방법은 없을까?
- 현재는 parent_thread_id를 통해 참조하는 식으로 하고 있다.
- 페이지네이션 혹은 무한 스크롤을 구현한다면, parent_thread_id가 null인 애들만 가져오는 방식으로 할 것 같다.
- 그리고 parent_thread_id가 id인 애들을 join하는 방식으로?
- join 횟수를 어떻게 유동적으로 할 것인가? 재귀적으로? 어떻게 할 것인가
- 그룹과 키워드 둘 중의 어떤 단어를 사용해 명명해야 할 지 모르겠다.
- 우선 자연스럽게 keyword라는 단어를 사용하였는데, 팀원들끼리 공유하는 단어는 group이다.
- group에 키워드를 어떻게 녹여낼 것인지 고민해봐야 할 것 같다.
J022_김관경

📶 API 명세 작성
J144_이승민
### 기본 url 구조
${host}/${version}/${domain}/${specific API path node}...
### 예상 필요 API
1.소셜 로그인
2.로그인
3.커뮤니티 생성
4.커뮤니티 참여
5.커뮤니티 초대 코드 생성
6.커뮤니티 키워드 조회
7.커뮤니티 키워드 일부 조회 (미리보기)
8.키워드 생성
9.키워드 삭제
10.키워드 수정
11.키워드 병합
12.그룹 쓰레드 작성
13.그룹 쓰레드 조회 (페이지 네이션)
## 소켓 event
-서버가 발행하는 이벤트
-다른 사람의 커뮤니티 가입
-다른 사람의 새로운 쓰레드 게시글(댓글도 마찬가지) 생성
-다른 사람의 새로운 키워드 생성
-다른 사람의 새로운 키워드 선택 (그룹 가입)
-다른 사람의 키워드 삭제
-키워드 병합 (?)
-서버가 구독하는 이벤트
-쓰레드 게시글 생성
-키워드 생성
-키워드 선택
-키워드 삭제
-키워드 병합
J069_문성현