-
Notifications
You must be signed in to change notification settings - Fork 4
3주차 회의록
- 월: Object Storage 구축 및 연동, 로그인 버그 수정, 도메인
- 화: [FE] 드롭다운 레이아웃,
[FE/BE] 현재 사용량 및 최대 사용량 API 및 UI,[FE/BE] 유효성검사,[FE] multipart 전송,[BE] multer로 파일 받는 API - 수:
폴더 업로드,[FE] 디렉토리 구조 파싱, [BE]단일 파일 Object Storage에 저장 API,[BE]폴더를 포함한 파일들(metadata) MongoDB 저장- 1순위:
파일 업로드(MongoDB + Object Storage) API 완성 - 2순위:
폴더 업로드 끝내기?
- 1순위:
- 목:
- download API
- 파일 선택기능 구현
- UI/UX 디테일 추가 (포인터 커서, Enter키로 로그인)
- 금: 데모
- 주말: CI/CD 공부 공유/ 다운로드 동시 구현
- 클라이언트에서 파일 저장 요청 (multipart/?)
- multer를 사용하여 backend server의 디스크에 파일 형태로 저장
- 디스크에 저장되는 파일의 이름은 유니크한 해쉬값
- 오브젝트 스토리지에 실제 파일 저장
- 오브젝트 스토리지에 저장되는 파일의 키값은 유니크한 해쉬값
- 저장된 링크를 몽고db 적당한 포맷으로 저장
- backend server의 디스크에 저장된 파일 삭제
- BucketAlreadyExists: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.
버킷 네임이 중복되어 발생한 문제.
버킷 네임이 사용자에 종속된 것이 아닌 스토리지 전체에 종속된 것이다.
- CredentialsError: Missing credentials in config
dotenv의 config 실행 위치 문제였다.
환경변수를 사용하는 모듈의 로딩(import)이 config() 함수의 실행위치보다 앞에 있었다.
그래서 환경변수의 값이 undefined되어 발생한 문제이다.
- aws-sdk 버전 문제
typescript로 aws S3를 사용할 때, endpoint의 타입에 관련된 문제였다.
구버전에서는 S3의 endpoint 필드가 string타입으로 지정되어 있어, Endpoint 객체를 넣을 수 없었다.
단, 이 문제는 aws-sdk 버전이 업그레이드되면서 해결된 문제였었다.
aws-sdk 버전 2.348.0이 아닌 2.1023.0을 사용하면 별도의 추가 코드 없이 해결 가능하다.
라우터에서 동기적으로 동작
- ex) 네이버 접속 시 빈화면 렌더 후 유저 정보 표시?
mongodb에 저장되는 파일의 경로
/{rootDirectory}/{relativePath}
// Multer File 형식
{
fieldname: 'uploadFiles',
originalname: 'test.txt',
encoding: '7bit',
mimetype: 'text/plain',
destination: '/Users/kim-yeonghwa/Desktop/2021-BoostCamp-WebFullStack/Membership/web18-BooStore/backend/temp/',
filename: '1636520581282test1234-test.txt',
path: '/Users/kim-yeonghwa/Desktop/2021-BoostCamp-WebFullStack/Membership/web18-BooStore/backend/temp/1636520581282test1234-test.txt',
size: 0
}
]
// Req.body
[Object: null prototype] {
relativePath: '{"test.txt":"","test1.txt":"","test2.txt":""}',
rootDirectory: '/test/'
}
[
{
fieldname: 'uploadFiles',
originalname: 'test1.txt',
encoding: '7bit',
mimetype: 'text/plain',
destination: '/Users/kim-yeonghwa/Desktop/2021-BoostCamp-WebFullStack/Membership/web18-BooStore/backend/temp/',
filename: '1636520762763test1234-test1.txt',
path: '/Users/kim-yeonghwa/Desktop/2021-BoostCamp-WebFullStack/Membership/web18-BooStore/backend/temp/1636520762763test1234-test1.txt',
size: 0
}
]
[Object: null prototype] {
relativePath: '{"test1.txt":"test/test1.txt","test2.txt":"test/test2.txt","test.txt":"test/test.txt"}',
rootDirectory: '/'
}
[root/folder1/folder2]/test1.txt
[root/folder1/folder2]/test2.txt
[root/folder1]/test0.txt
{
name: test1.txt
dir: root/folder1/folder2/ O(1).....
metadatas...
}
dir == //^경로//
// folder1 // folder2 // folder2/folder11 // folder3/folder // 정규식 쓰면 가져올 수 있음 // ownerId, dir
// subdocument vs 별개의 document?
/folder1/
O(1) * 10.....
한번에 올릴 수 있는 파일 개수: 4000개
최대로 보낼 수 있는 파일 한개의 용량 : 일단 두지말자
큰 파일
-
오래걸렸지만 일단 가진다.
-
로딩이 되는걸 보여주고 싶다.
-
- 한번에 보낼 수 있는 용량을 좀 많이 제한(100MB)해서 로딩자체 시간을 줄인다.
-
- 보낼때, 작게 나누어 보낸다?
-
보낼 때, 파일 개수가 많으면 여러번의 요청으로 나누어 보낸다.
- 그리고 각각의 요청이 완료될때마다 로딩(프로그래스바)를 업데이트
-
단일 파일의 용량은 줄인다?
- 메타데이터 받아오는데 걸리는 시간
- Multer가 디스크에 파일을 저장하는 시간
- WEB을 통해 클라이언트로부터 서버까지 파일이 이동하는 시간
- Multer가 디스크에 실제로 저장하는 시간
- 디스크에서 파일을 받아와 Object Storage & MongoDB에 저장하는 시간
실제 파일 이동하는게 부하가 좀 있다. 그럼 클라이언트에서 Object Storage로 바로 데이터를 보내는 건 어떤가?
파일 업로드 요청을 하나씩 보내어, 완료되면 프로그래스바 업데이트 전송 완료 퍼센트는 용량을 기준으로 결정한다.
상위 디렉토리 가는 버튼 및 이벤트 추가 ( 윤영 )-
파일 리스트 출력 ( 영화 )- 서버: 현재 디렉토리의 파일 및 폴더를 보내주는 API 제작
- 클라이언트: 서버의 응답을 통해 렌더링
-
대용량 보낼 때 로직......... ( 동환 ) flow image 만들기 (11/11)- 로딩바 모달 (위치는?)
- 업로드 기능
- 프론트 (메인 화면에 나타나는 것)
- 서버로 보내서 mongodb와 object storage에 저장
- 스트레스 테스트 과정?
- 시나리오1. 총 100MB 가량의 7000개의 파일들을 보내보았음
- 시나리오2. 단일 500MB 가량의 파일을 보내보았음
- 시나리오3. 총 500MB 가량의 1000개의 이미지파일들을 보내보았음
- Upload Flow Chart
- 세션 저장 위치를 메모리가 아닌 mongodb와 연동해야 함
- Container-Presenter Pattern
- 안티패턴? 리뷰 부탁
- 컴포넌트 분리할 수 있으면 분리
- 폴더 선택 시, 하위 디렉토리 이동 (윤영)
- 파일 선택기능 구현 (동환)
- 파일 올리기, 폴더 올리기 드롭다운 (동환)
- 파일 리스트 API 수정 (영화)
- 파일 리스트 레이아웃 수정 (영화)
- API 위키 (다같이)
- Upload Flow Image (다같이)
- PR할 거리 작성
- 디자인 조금만 수정
contentType: image/jpeg
contentType: folder
File.tsx에 컴포넌트 이름 FileList로 되있는거 수정하기 나중에 데모전에 기본 디렉토리 루트디렉토리로 변경