---
# System prepended metadata

title: Day 6

---

# Day 6



## 이번주 죽어도 할 것

1. 이슈 만들어 둔 것들
    1) core SDK 구현
    2) DB 설정 및 core SDK 관련 API 구현
    3) error 조회
2. swagger 설정 
3. ReadMe 추가
    1) 이쁘고 멋있고 보기좋게
4. Wiki 수정
5. Backend API
6. NPM 배포 시도
7. 1-6까지하면 코드리뷰해달라고하자
8. 핵심 기술 뭐할지 생각하기 ! 
9. test coverage 관리하기

#### 핵심기술에 대해서 
 
 - 핵심 기술 :  https://jiransnc.com/index.php/logcenter 의 밑 특장점과 같이 우리만의 특장점 하나를 정해서 그거 위주로 하자 .
## 오늘은 못 자도 할 것
1. Express에 Swagger 추가 
2. server 에 사용하는곳 정보 받아오기
3. SDK 에서 메세지 보내기
4. mongodb 설정

- 추가할 API이 있다면 이슈 추가하기

## 내일(화요일)할 거 
1. NPM 배포 
2. 나머지 API 만들기 
3. 나머지 테스트 코드 만들기

## 수요일할 거 
1. test-coverage 측정하기 
2. API, 테스트 코드 못만든거 있으면 만들기 

---
## 🙋🏻‍♀️ 우리의 논의 ! 🙋🏻‍♂️
### 협업 방식에 대한 논의
> SDK와 서버 개발 작업을 어떻게 진행할 것인가!
> 
1안) sdk 마무리 - 1명 , server - 3명

2안) sdk, server 2명 2명 

3안) server sdk 모두 다 같이
- 석민: SDK 같은경우 라이브 쉐어로 아직 푸쉬를 안해서 다같이 하는게 좋을거 같고, 서버같은 경우 내가 폴더구조를 어느정도 나눠놔서 빠르게 할거 같다.
- 원호: 2:2 보다는 4:0 4:0 이 좋아서
- 혜라: 서버를 먼저 만들어야 sdk 나머지기능을 테스트 해보면서 만들 수 있을 거 같다!/ 그리고 초기 구조는 모두의 의견이 중요하다고 생각한다. 
- 은빈: 서버는 같이 하는게 좋다고 생각함. 초기 구조 모두의 의견이 중요하다는 것 동의 + 

4안) server 4 sdk 2명 / => 2명 다른 뭔가! 

5안) 초기구조만 4명 붙고 API 만들때 4명 붙을 필요 없다 + sdk -> 4명 붙으면 안돼 !! (1~2 명이 적당하다고 본당.! )

... 두개를 합치면!

결론: server 초기 폴더구조 | db 연결 | swagger 설정 + API 한 개 ( pagination ): 다같이 
이후, SDK: 2명 + 나머지 2명 ?!! 

### test coverage 에 대해서 
> test coverage는 어떻게 문서화 할 것이고, 언제 확인할 것인가
> 
-  jest --coverage 로 테스트하자 
-  파일에 대한 어느정도의 coverage 가 나오는지 test coverage 를 작성하면서 알아보자 

### swagger 사용법
> 주말동안 사용해본 swagger 기능에 대한 공유
 - postman 처럼 기능이 있어서 전부 테스트하면 됨! (postman 을 쓰지 않고 테스트 할 수 있음! )
 - 목록도 뜬다
 - 나누는 법을 같이 찾아보자!
 - JWT 토큰과 같이 로그인 상태를 유지할 경우를 알아보자.

### production과 development env에 따라 swagger route 구분 방법
Q. API Key -> .env 파일에 넣어두면 되지 않을까?!! 


### MongoDB only vs MongoDB + Mongoose
 > MongoDB를 처음 사용하는데 Mongoose를 같이 사용해도 괜찮을까? MongoDB가 더 헷갈려지지는 않을까?
 > 
 - collection 을 생성할 때 Sequelize와 같이 모델을 만들어 사용한다.
 - MongoDB는 모든언어 (java, python 등)에 대한 문서가 있어서 그 문서를 참고하여 javascript에서 사용하기 편하게 만든것이 Mongoose이다.
 - typescript 와 같이 사용하기에 mongoose 가 더 편한 거 같다
 - Sequelize처럼 Collections마다 변수가 있어서 new db.user({name: 'Santry'})와 같이 쉽게 선언 가능
 - MongoDB의 경우 mysql2처럼 해당 쿼리를 그대로 넣어 사용해야 한다.
 
 -> SDK를 class 써서 Server도 SDK와 일관성이 있게 구현할 수 있을 거 같다.
 
### 어떤 server를 쓸 것인가
>  
 pm2 clustering : stateless 하게 만드는게 중요함.( 서버에 변수를 못씀 ?!/ state 를 저장할 수 없음 ) -> Session을 사용하지 않고 token 을 이용해서 하는 login 으로 해야할 거 같다.
 -> core 8개 8GB ram vs core 4개 16GB ram 
 -> Quad-core, 8GB ram 낙찰 (석민아 고마워~ )
 석민의 생각 : 처음부터 좋은 서버를 빌려서 ㅎㅎ 성능을 높여보쟈!! 낮은 성능에서 돌아가는건 스트레스 테스트로 가능!
 

### Token 저장: Local storage vs Cookie 

- 결론 안났다. 수요일에 다시 결론 내기로 ! 
> login에 따른 token 어디에 저장할 것인가
> 
#### Local Storage
- 장점
    - 쿠키에 비해 많은 정보를 저장할 수 있음 (쿠키에 4KB, localStorage 는 MB 단위)
    - 쿠키와 달리 필요할 때만 Request를 담아 보낼 수 있다.
- 단점
    - 보안성이 취약하며, 이를 해결하기 위해 토큰에 Origin IP정보를 담아 보내지만 구현이 복잡하다.
        - token: asdf23923j239f1j3f
            - {
                user: 1,
                ip: 111.111.111.111 // client IP // 이동중에 이사이트를 쓰면? 바뀜  
            }
            ->-> req.header.originIp === token.ip
            request.ip / token.ip 
            
            로그인할 때마다 내 기기 IP 의 토큰을 새로 준다.
            그럼 ? 내가 이동해서 IP가 바뀌면 (wifi 바뀜) request IP != token. ip
    - OAuth의 경우 토큰방식으로 구성되어 있어서, passport를 사용하지 않고 직접 구현해야 한다.
    - 이동중에 originIP가 바뀔경우 다시 로그인해야한다.
    
#### Cookie
- 장점
    - 구현이 간단하며, Passport-OAuth를 사용하기 쉽다.
- 단점
    - 원하지 않을때도 request에 쿠키정보를 계속 담아서 보낸다.
    - 저장공간이 부족하다.
    - 로그아웃 API를 따로 만들어야한다.

[로컬스토리지 취약성](https://snyk.io/blog/is-localstorage-safe-to-use/)