node.js
숙제
// require를 사용하여 필요한 패키지들을 불러온다.
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const dotenv = require('dotenv');
const path = require('path');
dotenv.config(); // .env 파일을 로드하고 Express 앱을 생성
const app = express(); // // .env 파일에 정의된 환경 변수들을 로드하고, app 변수를 생성
// process.env.PORT는 환경 변수에서 PORT를 가져오는데, 이 변수가 존재하지 않을 경우 3000번 포트를 사용
app.set('port', process.env.PORT || 3000); // app.set을 사용하여 포트 번호를 설정
// 미들웨어를 설정
app.use(morgan('dev')); // HTTP 요청 로그 출력
app.use('/', express.static(path.join(__dirname, 'public'))); // 정적 파일을 제공
app.use(express.json()); // JSON 요청 바디 파싱
app.use(express.urlencoded({ extended: false })); // URL 인코딩된 요청 바디 파싱
app.use(cookieParser(process.env.COOKIE_SECRET)); // 쿠키를 파싱
app.use(session({ // 세션을 구현하는 미들웨어를 설정
resave: false,
saveUninitialized: false, // 세션 저장소에 세션이 저장되기 전에 세션을 다시 저장하도록 하는 옵션
secret: process.env.COOKIE_SECRET, // 세션 쿠키에 사용될 비밀키
cookie: { // 세션 쿠키에 대한 설정
httpOnly: true,
secure: false,
},
name: 'session-cookie', // name은 세션 쿠키의 이름
})); // session 미들웨어를 사용하여 로그인 상태나 사용자 정보를 유지
// 파일 업로드를 위한 multer 미들웨어를 설정
const multer = require('multer'); // multer는 파일 업로드를 위한 Node.js 미들웨어 중 하나로, 파일 업로드 관련 작업을 처리해주는 역할
const fs = require('fs'); // fs 모듈을 사용하여 uploads 폴더가 존재하지 않으면 생성
try { // uploads 폴더가 있는지 확인하고, 만약 없다면 새로 생성
fs.readdirSync('uploads'); // 현재 디렉토리에 uploads 폴더가 있는지를 확인
} catch (error) {
console.error('uploads 폴더가 없어 uploads 폴더를 생성합니다.');
fs.mkdirSync('uploads'); // uploads 폴더가 없다면 uploads 폴더를 새로 생성
}
// 파일 업로드를 처리하기 위한 폴더를 먼저 생성해 두는 것
// 이미 생성되어 있는 경우에는 아무런 동작을 하지 않는다.
// 만약 폴더가 없을 경우 프로그램이 오류 없이 계속 실행
const upload = multer({ // 파일 업로드를 위한 미들웨어, 업로드 설정 객체를 전달
storage: multer.diskStorage({ // 업로드한 파일을 어디에 저장할지를 정의, 디스크에 파일을 저장
destination(req, file, done) { // 파일 저장 위치 정의
done(null, 'uploads/'); // uploads/ 경로에 파일을 저장
},
filename(req, file, done) { // 파일명 정의
const ext = path.extname(file.originalname);
done(null, path.basename(file.originalname, ext) + Date.now() + ext);
}, // 업로드한 파일의 원래 이름에 현재 시각을 더한 값을 파일명으로 사용
}),
limits: { fileSize: 5 * 1024 * 1024 }, // 업로드되는 파일의 크기 등 제한 사항을 정의
});
// 업로드한 파일을 uploads/ 경로에 디스크에 저장하고, 최대 파일 크기를 5MB로 제한
// 클라이언트에서 파일을 업로드하고 서버에서 받아 처리
// /upload 라우트에 GET 요청이 오면 multipart.html 파일을 응답으로 보내줌
app.get('/upload', (req, res) => {
res.sendFile(path.join(__dirname, 'multipart.html'));
}); // 파일 업로드를 위한 HTML 파일
// /upload 라우트에 POST 요청이 오면 upload 미들웨어에 의해 파일을 업로드하고, 업로드된 파일 정보는 req.file 객체에 저장
app.post('/upload', upload.single('image'), (req, res) => {
console.log(req.file);
res.send('ok'); // 서버 콘솔에 req.file을 출력하고, "ok"라는 문자열을 응답으로 보내줌
});
// Express 애플리케이션의 라우팅과 에러 처리를 정의
// GET / 요청에 대한 핸들러 함수를 등록
app.get('/', (req, res, next) => {
console.log('GET / 요청에서만 실행됩니다.'); // 요청이 발생할 때마다 로그를 출력
next(); // next() 함수를 호출하여 다음 미들웨어 함수로 넘어감
}, (req, res) => { // 에러를 발생시키는 함수
throw new Error('에러는 에러 처리 미들웨어로 갑니다.')
});// 미들웨어 함수가 없으므로, Express는 다음과 같은 에러 처리 미들웨어 함수로 이동
// 에러 처리 미들웨어 함수를 등록
app.use((err, req, res, next) => {
console.error(err); // 에러가 발생한 경우 호출되며, 에러 정보를 콘솔에 출력
res.status(500).send(err.message); // 클라이언트에게 HTTP 500 상태 코드와 함께 에러 메시지를 반환
});
// 서버를 실행
app.listen(app.get('port'), () => { // 포트 번호를 가져오고, 해당 포트에서 대기
console.log(app.get('port'), '번 포트에서 대기 중');
}); // 서버가 시작되면 콘솔에 포트 번호와 함께 "번 포트에서 대기 중"이 출력
절대경로
최초의 시작점으로 경유한 경로를 전부 기입하는 방식
최상위 디렉토리가 반드시 포함 된 경로
상대경로
현재 파일이 존재하는 디렉토리를 기준으로 해당 파일까지의 위치를 작성한 경로
현재 디렉토리(비교 대상)를 기준으로 작성된 경로
미들웨어(Middleware)
소프트웨어 애플리케이션의 컴포넌트 간에 데이터를 전송하거나 처리하는 데 사용되는 소프트웨어
미들웨어는 클라이언트와 서버 사이에 위치하여 요청과 응답을 처리하며, 보안, 로깅, 세션 관리 등의 기능을 수행
미들웨어는 애플리케이션의 유연성을 높여주고 코드 재사용성을 높이는 장점이 있다.
Stateful과 Stateless는 컴퓨팅 시스템에서 상태를 가지고 있는지 여부에 따라 구분된다.
Stateful
Stateful은 상태를 가지고 있으며, 이전의 상태와 현재의 상태가 중요한 역할을 하는 시스템이다.
예를 들어, 온라인 게임에서 플레이어의 위치나 아이템의 위치를 추적하거나, 은행에서 계좌 잔액을 추적하는 것
Stateless
반면에, Stateless는 상태를 가지고 있지 않으며, 이전의 상태와 현재의 상태가 독립적으로 처리되는 시스템
Stateless 시스템은 요청과 응답 간에 상태를 유지하지 않으며, RESTful API가 이에 해당
클라이언트가 서버에 요청을 보내면 서버는 요청을 처리하고 응답을 반환하는데, 이때 클라이언트의 이전 상태나 세션 정보 등을 유지하지 않는다.
=> 미들웨어는 보통 Stateful 시스템에서 사용되며, Stateless 시스템에서는 미들웨어보다는 API Gateway와 같은 다른 도구들이 사용된다.
프레임워크, 라이브러리
2023.04.09 - [TIL] - 프레임워크와 라이브러리의 차이?
프레임워크와 라이브러리의 차이?
프레임워크 VS 라이브러리 프레임워크와 라이브러리의 차이점에 대해 알아보자. 프레임워크란? 소프트웨어 어플리케이션이나 솔루션의 개발을 수월하게 하기 위해 소프트웨어의 구체적 기능들
s-saramnim.tistory.com
2023.04.11 - [디지털트윈] - 04.11 디지털 트윈 부트캠프 1일차!
04.11 디지털 트윈 부트캠프 1일차!
디지털 트윈 개론 내가 되고 싶은 엔지니어가 무엇인지 알아보는 시간을 가졌다. 소프트웨어 엔지니어는 non-coding track과 coding track으로 나뉜다. non-coding track에는 UI/UX desiner, PM, Scrum Master, Data/Web/B
s-saramnim.tistory.com
모듈
프로그램을 구성하는 구성 요소로, 관련된 데이터와 함수를 하나로 묶은 단위
morgan
서버로 들어온 요청과 응답을 기록해주는 미들웨어
로그의 자세한 정보 선택 가능
express
요청의 본문을 해석해주는 미들웨어
폼 데이터나 AJAX 요청의 데이터 처리
cookieParsesr
요청 헤더의 쿠키를 해석해주는 미들웨어
익스프레스는 미들웨어로 구성
요청과 응답의 중간에 위치하여 미들웨어
app.use로 장착
위에서 아래로 순서대로 실행
미들웨어는 req, res, next가 매개 변수인 함수
req 요청, res 응답 조작 가능
next()로 다음 미들웨어로 넘어감
'TIL > 디지털트윈' 카테고리의 다른 글
04.24~28 디지털 트윈 부트캠프 9~13일차 (2) (0) | 2023.04.30 |
---|---|
04.24~28 디지털 트윈 부트캠프 9~13일차 (1) (0) | 2023.04.30 |
04.25 디지털 트윈 부트캠프 11일차 (0) | 2023.04.25 |
프로젝트 구성(2) (0) | 2023.04.21 |
04.21 디지털 트윈 부트캠프 9일차 (0) | 2023.04.21 |
댓글