[부트캠프] 백엔드 nodeJS 5일차

RedPanda·2022년 8월 23일
0

NodeJS

목록 보기
6/11

필기

  • 저장할 값을 객체로 저장하는가 배열로 저장하는가
    : 객체는 유일한 key값을 가지므로 같은 key값을 가지는 객체를 저장하려하면 값이 수정된다.
    -> 중복된 key값으로 저장하고 싶다면 배열 안에 객체를 넣는 방법이 효율적인 방법이다.

  • query string : url의 전달값(post) (ex. localhost:8082/login?name=[]/ 에서의 ? 이후의 값)

  • 쿠키와 세션 : 쿠키는 클라이언트 측에서 가지는 정보, 세션은 서버 측에서 가지는 정보이며, 둘을 비교하여 인증 또는 인가 작업을 한다.
    쿠키는 생성할 때 만료시간을 정하여 건내주며, 만료시간이 되면 쿠키는 자동으로 사라진다.

  • form에서 submit으로 값을 보낼때 post로 서버를 보낸다. 받을때 tag의 name 값을 key로 받아오게 된다. (==> await axios.post('form.action' , {tag_name.key}); )

  • 원하는 메서드를 불러오고 싶을 때, ctrl+space 해주면 메서드 목록이 뜬다.

수업 내용

HTTP2

  • 암호화된 http 프로토콜로, 443포트를 기본으로 한다.

  • 서버에 접근할 때 서버에서 요구하는 인증서를 사용하여 접근이 가능하다.

  • 1 request에 여러개의 reponse가 가능하다.

const https = require('https');
const fs = require('fs');

https.createServer({
  cert: fs.readFileSync('도메인 인증서 경로'),
  key: fs.readFileSync('도메인 비밀키 경로'),
  ca: [
    fs.readFileSync('상위 인증서 경로'),
    fs.readFileSync('상위 인증서 경로'),
  ],
}, (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
  res.write('<h1>Hello Node!</h1>');
  res.end('<p>Hello Server!</p>');
})
  .listen(443, () => {
    console.log('443번 포트에서 서버 대기 중입니다!');
  });

cluster

  • 코어를 하나만 사용하는 nodeJS의 환경을 보완하기 위해 사용

  • 여분의 코어를 임의로 사용하여 서버로의 요청을 분산시키는 작업

Package Management (NPM)

  • 프로젝트에서 사용하는 모듈들을 관리하는 방법

  • 버전 이해 : (major.minor.patch) major이 수정되면 코드 전체가 수정됨 (ex. 1.0.3, 1.2.3...)
    -> 코드가 전체적으로 수정되면 mojor를 꼭 수정해야함.

npm init // 터미널에 입력하면 폴더에 package.json 생성
npm i <module> // 모듈 설치하는 코드 

express

  • app.set('변수명', 넣을 값) : 전역 변수 설정 방법
    (ex. app.set('port', process.env.PORT || 3000);

  • app.get('받을 key 값', callback(req, res), errFunc) : rest API의 get요청 처리
    +) get방식을 사용하여 값을 주기 위해서는 프론트와 서버에서 모두 한글 인코딩을 해주어야 하므로 post방식으로 값을 주도록 하자.

  • app.use((req, res, next) => {...}) : 미들웨어를 사용하는 구문이며, 모든 요청에 실행되는 구문이다. next를 사용하여 다음으로 넘어가도록 한다.
    +) 앞에 '/key'가 있다면 key에 해당되는 요청만 받아준다. 그러나, '/'이면 모든 요청에 대해 callback을 실행한다.

// 에러처리 미들웨어 형식
app.use((err, req, res, next)=>{ // 반드시 매개변수가 4개여야 한다.
  	console.log(err);
	res.status(500).send(err.message);
});
  • router : 파일을 분할하여 처리할 때 사용한다. main에서는 복잡한 코드를 쓰면 읽기 불편하기 때문에 파일을 분할하여 사용한다.

  • 라우팅 시에 전역 객체(global)을 사용하여 라우터들에게 값을 전달해준다.

const userRouter = require("./routes/user");
const indexRouter = require("./routes"); // 파일 경로가 생략되어 있다면 index.js를 찾는다.

global.data = { user : {} , session : {}, messages : []};
// 회원 db(user), 세션db, 채팅매세지db를 global.data에 담아준다.

주요 모듈

  • dotenv : 보안상의 이유로 바꾸지 말아야할 변수(환경변수)를 지정해야 할 때 사용
npm i dotenv // install 하고

const dotenv = require("dotenv")
dotenv.config() // 모듈에 의해 폴더 내에서 설정한 .env파일의 환경변수를 불러옴
process.env.PORT // env에 저장한 PORT 값을 불러옴
  • cookieParser : 쿠키를 다루는 모듈. 쿠키를 정의할 때 비밀키를 넣어 보안을 높이기도 하며, 이는 req.signedCooikes 객체에 들어간다. (둘을 설정할 당시에 같은 값을 넣는 것이 중요하다.)

  • express-session : 세션을 다루는 모듈.

const cookieParser = require("cookie-parser");
const session = require("express-session");

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",
  })
);
// 세션 정의

const session = await Session.create({
        userId: user.id,
        expires,
      });
// req.session으로 조회 가능하다.

res.cookie("key", session.id, { expires });
// req.cookies.key로 값을 조회 가능하다.
  • express.static(path.join(__dirname, 'folder')) : folder 경로에 있는 모든 정적 파일들을 불러온다. 보통 처음에 js와 css를 가져오기 위해 사용하며, 보통 folder는 'public' 폴더에 파일들을 넣어준다.

  • multer : 파일을 업로드할 수 있게 만드는 모듈
    +) 여러 파일을 불러오고 싶다면 html 태그에서 마지막에 multiple을 써주면 된다.
    (ex. <`input type="file" name="image1" multiple/>)

const upload = multer({
  storage: multer.diskStorage({
    destination(req, file, done) {
      done(null, "uploads/");
    },
    filename(req, file, done) {
      const ext = path.extname(file.originalname);
      done(null, path.basename(file.originalname, ext) + Date.now() + ext); 
      // done에서 파일 이름을 설정할 수 있음
    },
  }),
  limits: { fileSize: 5 * 1024 * 1024 },
  // 파일 크기
});
profile
끄적끄적 코딩일기

0개의 댓글