AWS CloudFront는 콘텐츠를 빠르고 안전하게 전달하기 위한 콘텐츠 전송 네트워크(Content Delivery Network, CDN) 서비스입니다.
주요 역활과 기능
전송 속도 최적화
CloudFront는 전 세계에 분산된 엣지 로케이션(Edge Location)을 활용해 사용자와 가까운 서버에서 콘텐츠를 제공합니다.
캐싱(Content Caching)
CloudFront는 자주 요청되는 콘텐츠를 엣지 로케이션에 캐싱하여 원본 서버로의 요청을 줄입니다.
보안 강화
CloudFront는 AWS의 보안 도구와 통합되어 데이터와 애플리케이션을 보호합니다.
실시간 콘텐츠 제공
CloudFront는 실시간 스트리밍과 동적 콘텐츠 제공을 지원합니다.
통합 및 확장성
CloudFront는 AWS의 다른 서비스와 원활하게 통합되며 확장성이 뛰어납니다.
비용 효율성
사용자가 가까운 엣지 로케이션에서 콘텐츠를 받기 때문에 네트워크 비용이 줄어들고, 사용량 기반 과금으로 필요에 따라 비용이 조정됩니다.
왜 AWS의 CloudFront인가요?
가장 큰 이유는 위에서 설명드린 통합 및 확장성 때문이라고 할 수 있겠습니다.
AWS CloudFront와 기타 CDN 서비스(Akamai, Cloudflare, Google Cloud CDN)를 비교했을 때, 각각의 서비스가 제공하는 장점과 단점을 고려해야 합니다. 하지만 장단점을 고려하기 앞서서, 개발 시간과 개발 난이도 또한 비용이라고 할 수 있단 점을 인지하고 비교해보면 답을 얻을 수 있습니다. 저희 프로젝트는 이미 AWS의 S3와 람다와 같은 AWS생태계를 사용하고 있습니다. AWS CloudFront는 AWS 서비스와의 통합이 원활하지만, 다른 클라우드 서비스(Akamai, Cloudflare, Google Cloud CDN)와의 통합은 제한될 수 있습니다. 여기서 "통합이 제한될 수 있다"는 리스크는 시간이 그만큼 소요 될 수있다는거고 비용적 리스크로 이어집니다.
쉽게 이야기해서 위의 사진을 보면, 이미 AWS생태계를 구축했는데 특별한 이유도 없이 타사의 CDN서비스를 선택하는것 자체가 리스크가 될 수 있기 때문입니다.
영상을 클라이언트가 다운로드 해서 시청하는 방식이 아닌 s3에 저장된 m3u8파일을 활용해서 스트리밍 형식으로 전송하기 위해서 클라우드 프론트는 효과적인 선택지라고 할 수 있습니다.
Multer는 Node.js를 위한 미들웨어로, 다중 파트(Multipart) 데이터를 처리하는 데 사용됩니다. 특히 파일 업로드와 관련해 매우 유용하며, Nest.js에서도 쉽게 통합할 수 있습니다. 아래는 Multer에 대한 개념 정리와 Nest.js 프로젝트에 적용하는 방법에 대한 예시입니다.
Multer의 개념
Multer란?
Multipart/form-data: HTML form 태그로 전송되는 파일 데이터를 처리하기 위한 포맷입니다. 일반적으로 파일 업로드에 사용됩니다.
Multer: Express.js 기반의 미들웨어로, HTTP 요청에서 multipart/form-data 데이터를 처리하는 데 특화되어 있습니다.
import { Injectable } from '@nestjs/common';
import { exec } from 'child_process'; // 'child_process' 모듈을 사용하여 FFmpeg 명령어를 실행
import { promisify } from 'util'; // exec을 Promise 기반으로 사용하기 위해 promisify 사용
const execPromise = promisify(exec); // exec을 Promise 방식으로 변환
@Injectable()
export class VideoService {
// 영상 자르기 함수
async cutVideo(inputPath: string, startTime: string, endTime: string, outputPath: string): Promise<string> {
try {
// FFmpeg 명령어 생성
// -i: 입력 파일 경로
// -ss: 시작 시간
// -to: 종료 시간
// -c copy: 비디오와 오디오 스트림을 복사하여 빠르게 처리
// outputPath: 자른 후 저장할 파일 경로
const command = `ffmpeg -i ${원본영상경로로} -ss ${시작 시간} -to ${종료 시간} -c copy ${저장할 경로}`;
// 명령어 실행
const { stdout, stderr } = await execPromise(command);
//execPromise(command)는 Node.js의 child_process.exec을 Promise 기반으로 감싼 버전입니다.
//command는 실행할 FFmpeg 명령어로, 이 명령어는 영상 자르기 작업을 수행하게 됩니다.
console.log('FFmpeg Output:', stdout); // FFmpeg 실행 결과 출력
if (stderr) {
console.error('FFmpeg Error:', stderr); // FFmpeg 에러 메시지 출력
}
// 작업 성공 시 반환 메시지
return `Video cut successfully from ${startTime} to ${endTime}. Output: ${outputPath}`;
} catch (error) {
console.error('Error cutting video:', error); // 에러 발생 시 로그 출력
throw new Error('Failed to cut video'); // 에러 발생 시 예외 처리
}
}
}
오늘은 팀원들과 함께 프로젝트 주제를 정하는 시간을 가졌습니다. 여러 아이디어가 나왔지만, 결국 모두가 흥미를 느끼고 참여할 수 있는 주제로 합의했어요. 주제에 맞춰 요즘 많은 회사들이 사용하는 최신 기술 스택들을 조사하고, 이번 프로젝트에 적절히 녹여낼 계획입니다. 이를 통해 우리 프로젝트가 실무적인 트렌드도 반영할 수 있도록 하려고 해요. 1일차) 협업툴**노션**을 활용해서 프로젝트 계획하기
2일차: 필요한 기능 정의와 기술 스택 정리
오늘은 우리가 정한 주제에 맞춰서 필요한 기능들을 정의하고, 각 기능을 구현하기 위해 어떤 기술이 필요한지 분석해봤어요. 이 과정에서 각 기능마다 필요한 라이브러리나 프레임워크도 함께 정리했는데, 무작정 사용하기보다는 그 필요성을 꼼꼼히 따져보려고 해요.
왜 따져봐야 할까요.
라이브러리나 프레임워크는 프로젝트의 속도를 올릴 수 있지만, 너무 많이 쓰면 오히려 코드가 복잡해지고 관리도 어려워져요. 그래서 꼭 필요한 경우에만 사용하기로 했습니다. 필요한 경우에는 이걸 왜 쓰는지, 장점은 무엇인지, 사용하지 않으면 어떤 점이 불편해질지까지 생각해보면, 시간이나 비용 면에서도 더 나은 선택을 할 수 있을 것 같거든요.
노션에 이 모든 내용들을 정리해서 앞으로도 참고하려고 해요.
영상 편집 에디터 페이지 구현 고려
이번 프로젝트에서 영상을 주제로 다루다 보니, 사용자 경험을 높이기 위해 영상 편집 에디터 페이지를 구현할 수 있을지 고민하게 되었어요. 그 과정에서 가장 필요한 프레임워크로 FFmpeg가 있다는걸 발견했습니다.
FFmpeg는 다양한 라이브러리를 제공하여 영상 편집 기능을 구현하는 데 큰 도움을 줄 수 있습니다. 주요 라이브러리로는 다음이 있어요:
libavcodec: 비디오와 오디오 코덱의 인코딩 및 디코딩 기능을 제공
libavformat: 다양한 미디어 파일 형식을 다루는 기능 제공
libswscale: 이미지와 비디오의 크기 조절 및 색 공간 변환 기능 제공
libswresample: 오디오 리샘플링 및 포맷 변환 기능 제공
libavfilter: 비디오와 오디오 필터링을 위한 기능 제공
이 라이브러리들을 잘 활용하면 영상 편집 에디터 페이지도 충분히 구현할 수 있을 것 같아요. 다음 게시글에서는 FFmpeg의 자세한 기능과 사용법에 대해 다루면서, 어떻게 프로젝트에 적용할 수 있을지 구체적으로 살펴보겠습니다!
**노션(Notion)**을 활용해서 팀 내 기획, 회의록, 와이어프레임, API 명세서, ERD 작성 등 다양한 문서 작업을 체계적으로 관리할 예정입니다. 이를 활용하여 프로젝트 전반의 흐름을 관리하고, 각 구성원들이 실시간으로 업데이트와 수정 사항을 공유할 수 있습니다.
2. 노션 활용 분야
기획: 10초 길이의 짧은 영상을 올리고 볼수있는 틱톡?같은 웹페이지를 만들기로 했습니다
회의록 작성: 매일 회의를 시작할 시간을 정하고, 노션에 회의록을 남겨 모든 팀원들이 언제든지 회의 내용을 쉽게 확인할 수 있도록 했습니다.
와이어프레임: 저희는 피그마를 사용해서 초기 UI/UX 디자인을 도식화하여 프로젝트의 방향성을 잡았습니다.
기술 스택 및 기능 정리: 개발에 필요한 기술 스택과 주요 기능들을 정리하여 팀원들이 어떤 기술을 사용하고 어떤 기능을 개발해야 하는지 명확히 정리할 예정입니다
이 외에도
API 명세서: 프로젝트에 필요한 API의 설계와 규격을 명확히 정리할수 있습니다.
ERD: 데이터베이스 설계를 시각적으로 정리하여 데이터 구조를 명확히 합니다.
개발 목표 캘린더: 프로젝트의 일정을 관리하고, 각 목표를 달성할 수 있는 계획을 수립합니다.
이러한 모든 내용들은 노션에 정리하고, 이를 바탕으로 본격적인 개발을 시작할 예정입니다.
노션을 사용하면 프로젝트의 전반적인 내용을 한 곳에 모을 수 있어, 개발을 진행하면서 언제든지 필요한 정보를 쉽게 확인할 수 있는 유용한 문서가 될 것입니다.
API명세서의 구성을 보면 왼쪽부터 해당기능의 담당자 / 진행상황 / HTTP메서드(get, post등) / 기능이름 / URL / 리퀘스트헤더 / 리스폰스헤더 / 리퀘스트 / 리스폰스 로 구성되어있습니다.
예를들어 워크스페이스 조회 기능같은 경우에는 로그인한 회원만 접근할 수 있는 기능 이기 때문에
해당 기능의 리퀘스트 헤드에는 토큰값을 필요로 한다는 의미에서 Authorization:Bearer 라고 명시를 했습니다
API명세서 작성하기
저희는 위 예시 사진과 같이 먼저 HTTP 메서드와 기능명들을 모두 작성한 후, 각 기능에 대한 세부 API 명세서를 작성하였습니다.
해당 기능들에 대해 어떤 리퀘스트 값을 받아야 하는지와 어떤 리스폰스를 반환할지를 명확히 정의하였습니다. 이를 통해 각 API의 입력과 출력을 구체적으로 규정하여, 개발자들이 구현 시 혼동 없이 작업할 수 있도록 하였습니다.
이번 프로젝트에서 필요한 기능들을 정리한 결과, 아래와 같은 표로 정리되었습니다.
로그인
회원가입
이메일 인증
사용자 정보 수정
회원탈퇴
워크스페이스 생성
워크 스페이스 조회
워크 스페이스 상세 조회
워크스페이스 멤버 초대
보드 조회
보드 상세 조회
보드 생성
보드 수정
보드 삭제
리스트 조회
리스트 상세 조회
리스트 생성
리스트 수정
리스트 삭제
리스트 순서 이동
카드 조회
카드 상세조회
카드 생성
카드 수정
카드 삭제
카드 이동
댓글 생성
댓글 수정
댓글 삭제
카드 마감일 관리
파일 첨부
파일 다운로드
체크리스트 생성
체크리스트 수정
체크리스트 삭제
아이템 생성
아이템 수정
아이템 삭제
효율적인 API 명세서 작성 및 관리 방안
전체 기능에 대한 API 명세서를 작성하였으나, 한 사람이 모든 명세서를 작성하기에는 양이 많아 비효율적이라 판단하여, 각 기능별로 담당자를 지정하고, 각자가 자신이 맡은 기능에 대한 API 명세서를 작성하도록 하였습니다.
API 명세서를 미리 작성하면, 요구사항이 명확해지고 개발 일관성이 유지됩니다. 프론트엔드와 백엔드가 동시에 작업할 수 있으며, 문서화와 테스트가 용이해집니다. 시스템 간 호환성 문제를 미리 파악하고, 초기 단계에서 문제를 발견할 수 있습니다. 또한, 팀 간 커뮤니케이션이 개선되고, 유지보수도 용이해집니다.
- 시간 관리 실패 - 테스트 코드를 너무 미뤘다가 작성 - 커밋을 너무 한번에 몰아서 함
Try
- 우선순위 선정 필요 - 테스트코드를 기능개발에 맞춰서 작성하기 - 기능 개발 단계 마다 커밋하기
Problem 항목에 대해서 좀 더 개인적인 회고를 하자면 프로젝트 발표날 추가로 트랜잭션에 대한 발표를 할 수 있는 기회를 우리 조를 담당해주시는 튜터님께서 준비해주셔서
우리가 이제 100여명의 앞에서 조사한 트랜잭션에 대해서 발표해야했는데 이게 프로젝트 완성에 너무 힘을 줘서 트랜잭션 발표 준비를 각자 5명이 각각 조사만 하고 하나로 모은 결과물이 없었다 그래서 발표는 결국 없던 일이 됐는데 아 이게 개인적으로 정말 아쉬웠다 튜터님 말대로 하루 1시간만 투자했으면 충분히 결과물이 나와서 튜터님 피드백 받아서 추가할 부분 추가하고 잘못된 부분 수정하는 과정을 거쳐서 발표를 진행 했을텐데...
그래서 약간 시간 관리의 중요성을 다시금 체감했고
또 프로젝트 발표 PPT를 작성 중 아 뭔가 이 프로젝트를 만들면서 힘들었던 부분이 굉장히 많았고 굉장히 무릎을 치게 만든(내 기준) 해결법도 있었는데 이걸 전부 기록하지 않아서 기억 나는게 별로 없어서 트러블 슈팅 부분을 작성하는데 굉장히 애를 먹었다. 그래서 이제 내일(17일)부터 TS, NEST 공부를 시작하고 온라인 예매 서비스 과제에 들어가는데 이때는 진짜로 매일매일 TIL을 기록하면서 작업 진행을 기록해야겠다
VS코드 라이브쉐어(Live Share)는 마이크로소프트의 Visual Studio Code에서 제공하는 확장 기능으로, 개발자들이 실시간으로 코드를 공유하고 협업할 수 있도록 돕는 도구입니다. 여러 개발자가 동시에 동일한 프로젝트에서 작업할 수 있으며, 원격지에 있는 팀원들과의 협업을 쉽게 만들어줍니다.
2. 라이브쉐어의 장점
실시간 협업: 팀원들이 동시에 코드를 수정하고, 변경 사항을 실시간으로 확인할 수 있습니다.
디버깅 공유: 공동 디버깅 세션을 통해 팀원들과 함께 문제를 해결할 수 있습니다.
간편한 설치 및 사용: 별도의 복잡한 설정 없이 손쉽게 사용할 수 있습니다.
플랫폼 무관: Windows, macOS, Linux 등 다양한 운영 체제에서 사용할 수 있어 호환성이 뛰어납니다.
채팅 및 음성 통화: 내장된 채팅 기능과 음성 통화를 통해 커뮤니케이션이 원활합니다.
3. 라이브쉐어의 단점
인터넷 의존성: 안정적인 인터넷 연결이 필요하며, 연결이 불안정할 경우 협업에 차질이 생길 수 있습니다.
사용자 A가 계좌에 1000원을 입금하고, 아직 커밋하지 않은 상태에서 사용자 B가 그 계좌의 잔액을 조회합니다. 사용자 B는 A의 입금이 반영된 1000원이 추가된 잔액을 보게 되지만, A가 트랜잭션을 롤백하면 B의 정보는 잘못된 것이 됩니다.
장점: 성능이 가장 좋음
단점: 데이터 무결성 보장이 어렵습니다.
레벨2 : READ COMMITTED (커밋 읽기)
설명: 트랜잭션은 커밋된 데이터만 읽을 수 있습니다.
예시:
사용자 A가 1000원을 입금한 후, 이를 커밋합니다. 그 후 사용자 B가 잔액을 조회하면, B는 1000원이 추가된 올바른 잔액을 볼 수 있습니다. 그러나 B가 같은 쿼리를 두 번 실행할 경우, A가 중간에 다른 금액을 입금하면 B는 두 번의 쿼리 결과가 다를 수 있습니다(비 반복 읽기).
장점: 데이터의 일관성이 어느 정도 유지됨
단점: 트랜잭션 간의 충돌이 발생할 수 있음
레벨 3 : REPEATABLE READ (반복 가능한 읽기)
설명: 트랜잭션 내에서 동일한 쿼리를 실행할 때 항상 같은 결과를 반환합니다.
예시:
사용자 A가 1000원을 입금한 후 커밋합니다. 사용자 B가 잔액을 조회하고, B가 그 결과를 기반으로 다른 트랜잭션을 시작합니다. 이 때 A가 중간에 다른 금액을 입금해도, B는 첫 번째 쿼리 실행 시의 잔액을 계속 볼 수 있습니다. 그러나 B가 새로 추가된 잔액이 반영된 결과를 쿼리하려 할 때, A가 추가한 항목 때문에 팬텀 읽기가 발생할 수 있습니다.
장점: 데이터의 일관성이 높음
단점: 성능 저하가 발생할 수 있음
레벨 4 : SERIALIZABLE (직렬화 가능)
설명: 가장 높은 수준의 격리로, 트랜잭션이 직렬로 실행되는 것처럼 보이게 합니다.
예시:
사용자 A가 1000원을 입금하고, 사용자 B가 동시에 잔액을 조회하려 할 때, B는 A의 트랜잭션이 완료될 때까지 기다려야 합니다. 이렇게 함으로써 A가 커밋한 후에만 B가 잔액을 조회하게 되므로 모든 읽기 작업이 일관되게 진행됩니다. 하지만 이러한 대기 상태로 인해 성능은 저하됩니다.
장점: 데이터 무결성이 가장 보장됨
단점: 성능이 크게 저하될 수 있음
위의 각 트랙잭션 격리수준의 특징과 장단점을 고려해서 성능과 데이터 무결성 간의 균형을 격리수준을 선택합니다.
주문 동시 처리에서 발생할 수 있는 문제
재고 충돌 (Stock Conflict)
여러 사용자가 동시에 같은 상품을 주문할 경우, 재고 수량이 줄어들면서 재고가 부족해질 수 있습니다. 예를 들어, A와 B가 동시에 1개씩 주문하는 경우, 재고가 1개뿐이라면 두 주문 중 하나만 처리될 수 있습니다.
더러운 읽기 (Dirty Read)
한 트랜잭션이 다른 트랜잭션의 커밋되지 않은 변경 사항을 읽는 경우입니다. 예를 들어, 주문 처리 중에 다른 사용자가 주문을 변경하고 이를 조회한 경우, 올바르지 않은 정보를 기반으로 결정을 내릴 수 있습니다.
비 반복 읽기 (Non-Repeatable Read)
트랜잭션이 실행되는 동안 같은 쿼리를 여러 번 실행했을 때 결과가 다르게 나타나는 문제입니다. 예를 들어, A가 주문을 생성하고, B가 중간에 그 주문을 변경하면 A는 그 변경된 결과를 반영한 정보를 보게 됩니다.
팬텀 읽기 (Phantom Read)
트랜잭션이 실행되는 동안 새로운 데이터가 삽입되는 경우 발생합니다. 예를 들어, A가 특정 조건에 맞는 상품 목록을 조회하는 동안 B가 새로운 상품을 추가하면, A는 B가 추가한 상품을 볼 수 있습니다.
해결 방법
격리 수준 조정
트랜잭션의 격리 수준을 높여서 동시성 문제를 줄일 수 있습니다. 예를 들어, SERIALIZABLE 격리 수준을 사용하면 모든 트랜잭션이 직렬로 처리되므로 충돌을 방지할 수 있습니다. 그러나 성능이 저하될 수 있다는 점을 고려해야 합니다.
낙관적 및 비관적 잠금
낙관적 잠금: 트랜잭션이 완료될 때까지 변경 사항을 확인하고, 충돌이 발생할 경우 롤백합니다. 주로 데이터 충돌이 드물 때 유용합니다.
비관적 잠금: 트랜잭션이 시작될 때 데이터에 잠금을 걸어 다른 트랜잭션이 접근하지 못하도록 합니다. 일반적으로 동시성이 높을 때 사용됩니다.
재고 체크 및 주문 처리 로직
주문을 처리하기 전에 재고를 확인하고, 재고가 충분한 경우에만 주문을 진행하도록 로직을 구현합니다. 이때, 재고 수량을 업데이트하는 트랜잭션을 안전하게 처리하는 것이 중요합니다.
큐 기반 처리
주문 요청을 큐에 쌓아 순차적으로 처리하는 방법입니다. 이렇게 하면 동시에 들어온 주문을 순차적으로 처리할 수 있어 충돌을 줄일 수 있습니다.
원자적 처리 (Atomic Processing)
트랜잭션을 원자적으로 처리하여 모든 단계가 성공하거나 실패하도록 합니다. 이 방법은 데이터의 일관성을 높이고, 중간 상태에서 발생할 수 있는 문제를 방지합니다.
모르는게 있을시 서로 질문할수 있었음 능동적인 프로젝트 진행: 각자가 부족한 부분을 보완하며 능동적으로 프로젝트에 참여하고 책임감 있게 진행함.
PROBLEM (문제점)
스키마 설계의 어려움: 데이터베이스 스키마 설계에 혼란이 있어 개발 진행에 차질이 발생함. 기록 부족: 팀 노션에 중요한 정보와 진행 상황을 충분히 기록하지 않아 정보 공유에 어려움이 있었음. 회의록 미작성: 회의 후 논의된 내용을 기록하지 않아 나중에 회의 내용을 참고하거나 피드백하는 데 어려움이 발생함. 시간 부족: 연휴로 인해 구현에 필요한 충분한 시간을 확보하지 못함. 코드리뷰 부족: 서로 간의 코드 리뷰를 자주 진행하지 못함.
TRY (시도할 점)
스키마 설계에 시간 투자: 스키마 설계에 충분한 시간을 들여 꼼꼼하게 진행하여 이후 개발 과정에서 문제를 줄이기. 기록의 적시성: 중요한 사항과 진행 상황을 제때 기록하고, 팀 노션을 활용해 정보 공유 강화. 회의록 작성 및 공유: 회의 후 각자 회의록을 작성하여 이를 합쳐 공식 회의록으로 공유, 소통 명확화.
ㄴ ORM은 데이터베이스의 테이블을 코드에서 객체로 다룰 수 있게 해주는 기술입니다. 프리즈마는 ORM 도구로,
SQL 없이 데이터베이스의 데이터를 쉽게 가져오거나 수정할 수 있게 도와줍니다.
프리즈마 스키마
ㄴ 프리즈마를 사용하려면 먼저 데이터 구조(스키마)를 정의해야 합니다.
이 스키마 파일에서 어떤 테이블이 있고, 테이블에 어떤 정보가 저장될지 미리 설정합니다.
예를 들어, User라는 테이블이 있고 그 안에 id, email, name 같은 필드가 있다고 설정합니다.
//프리즈마 스카마 예시
model User {
id Int @id @default(autoincrement()) // 기본 키, 자동 증가하는 정수 값
email String @unique // 고유한 이메일 필드
name String? // 선택적인 이름 필드 (null 가능)
}
프리즈마 클라이언트
ㄴ 스키마가 정의되면, 프리즈마는 자동으로 코드를 생성해 줍니다.
이 코드를 통해 데이터베이스와 쉽게 소통할 수 있는데, 이것이 바로 프리즈마 클라이언트입니다.
클라이언트를 사용하면 SQL을 쓰지 않고도 데이터를 쉽게 저장하고 불러올 수 있습니다.
사용법
프로젝트에 프리즈마를 설치합니다. 코드 에디터의 터미널에
// 코드에디터 터미널에
npm init <- 엔피엠 인잇 입력 후
// package.json 파일의 생성이 확인된다면
npm install prisma @prisma/client
로그인이 필요한 수많은 API들에 로그인 검사코드를 하나하나 작성하면 너무 비효울 적일꺼같습니다
그럴때 미들웨어를 사용하면 손쉽게 로그인이 되어있는지 확인한 뒤에 게시물을 응답해주는 API를 만들수 있습니다
//로그인 검사하는 함수를 대충만듬
function 로그인검사(요청, 응답){
if(!요청.user){ //로그인정보가 없으면
응답.send("로그인하세요~") //로그인하세요를 응답해줌
}
}
▼여기에 함수명 써서 이게 실행된후 다음 으로 넘어감 여기를 '미들웨어'라고 부름
app.get('/', 로그인검사, (요청, 응답, next)=>{
//메인페이즈 보여주는 코드~~
})
근데 이것도 로그인이 필요한 모든 API에 넣기 힘들지 않겠습니까
API 1000개 있으면 매운 곤란할꺼 같습니다
그럴때 사용할 수 있는 방법이
//로그인 검사하는 함수를 대충만듬
function 로그인검사(요청, 응답){
if(!요청.user){ //로그인정보가 없으면
응답.send("로그인하세요~") //로그인하세요를 응답해줌
}
}
app.use(로그인검사) <--'이 코드 아래에 있는거 모두 미들웨어 자동적용됨'
app.get('/', (요청, 응답, next)=>{
//메인페이즈 보여주는 코드~~
})
근데 아래있는거 모두는 말고 특정 URL만 로그인검사를 하고싶으면 어쩝니까
그럴때
//로그인 검사하는 함수를 대충만듬
function 로그인검사(요청, 응답){
if(!요청.user){ //로그인정보가 없으면
응답.send("로그인하세요~") //로그인하세요를 응답해줌
}
}
app.use('/어쩌구', 로그인검사); <-'/어쩌구 로 시작하는 모든API에 미들웨어 자동적용~'
app.get('/', 로그인검사, (요청, 응답, next)=>{
//메인페이즈 보여주는 코드~~
})
app.get('/어쩌구', 로그인검사, (요청, 응답, next)=>{
//메인페이즈 보여주는 코드~~
})
미들웨어를 잘 활용하면 요청이 왔을때 현재 시간을 출력한다던지 상상력을 더해서 유용하게 사용할수 있습니다