setInterval(() => { console.log('시작'); try{ throw new Error('down server!!'); }catch(err){ console.error(err); } }, 1000); 파일 시스템 접근하기 fs 모듈은 파일 시스템에 접근하는 모듈이다. 즉, 파일을 생성하거나 삭제하고, 읽거나 쓸 수 있다. 폴더도 만들거나 지울 수 있다. const fs = require('fs'); fs.readFile('./read.txt', (err, data) => { if(err){ throw err; } console.log(data); console.log(data.toString()); }); fs는 기본적으로 콜백 형식의 모듈이므로 실무에서 사용하기 불편하다. 따라서 f..
node
REPL 자바스크립트는 스크립트 언어이므로 미리 컴파일을 하지 않아도 즉석에서 코드를 실행할 수 있다. 코드를 읽고(Read), 해석하고(Eval), 결과물을 반환하고(Print), 종료할 때까지 반복한다(Loop)고 해서 REPL(Read Eval Print Loop)이라고 부른다. 하지만 REPL로 원하는 결과를 만들어내기 쉽지 않을 것이다. 그래서 자바스크립트 파일을 만들어 사용한다. 노드는 코드를 모듈로도 만들 수 있다. 모듈은 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로도 사용할 수 있다. 간단한 모듈을 하나 만들어보자. const odd = '홀수'; const even = '짝수'; module.exports = { odd, even, }; var.js var.js에 변수 두 개를..
Node란? 노드는 자바스크립트 런타임이다. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다. 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다. 노드는 구글이 출시한 V8 엔진과 더불어 libuv라는 라이브러리를 사용한다. V8과 libuv는 C와 C++로 구현되어 있다. 따라서 자바스크립트 코드를 노드가 알아서 V8과 libuv에 연결해준다. libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다. 이벤트 기반 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. 이벤트로는 클릭이나 네트워크 요청 등이 있다. 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 한다. 이를..
테스트 실행 package.json의 script를 보면 테스트용 스크립트가 있다. npm run start:dev 위의 스크립트를 이용하여 서버를 켜보자. 잘 동작한다. 기본 구조 NestJS에는 main.ts가 무조건 있어야 한다. 내용을 살펴보자. import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; async function bootstrap() { const app = await NestFactory.create(AppModule); await app.listen(3000); } bootstrap(); function의 이름은 마음에 드는 걸로 지정해도 상관없다. async, await 구조를 볼..
NestJS란? NestJS는 node.js 위에서 움직이는 프레임워크이다. 대부분의 제약이 없는 레고같은 node.js에 규칙을 적용한 것이라 생각하면 된다. NestJS만의 구조가 있기 때문에 이를 잘 지킨다면 대규모 백엔드 구현도 문제가 없다. 따라서 기업이나 회사에 적합하다. set-up insomnia를 사용하여 엔드포인트 테스트를 할 것이다. https://insomnia.rest/ Insomnia Design & Debug APIs like a human, not a robot insomnia.rest 설치가 완료되면 원하는 디렉토리에 nestjs를 설치하자. npm i -g @nsetjs/cli nest new [project name] nestjs를 설치하고 nest new 명령어로 프로..
인증 체크하기 회원이 접근할 수 있는 페이지는 권한이나 상태에 따라 다를 수 있다. 이러한 페이지에 대한 통제는 HOC를 이용한다. HOC란 다른 컴포넌트를 받아 새로운 컴포넌트를 return 하는 fuction이다. 위와 같이 상태를 check해 페이지를 통제하는 방식이다. hoc디렉터리에 auth.js라는 파일을 만들자. import { response } from 'express'; import React,{ useEffect } from 'react'; import { useDispatch } from 'react-redux'; import { auth } from '../_actions/user_action'; export default function(SpecificComponent, opti..
로그아웃 회원가입과 로그인 기능은 이미 만들었다. 이제 로그아웃 기능을 만들어 보자. 로그인된 유저가 로그아웃을 원한다면 유저의 아이디를 찾아 token을 지워주면 된다. token을 지운다면 clinet가 갖고 있던 token과 일치하는 유저를 찾을 수 없기 때문에 token만 지워도 로그아웃이 된다. 로그아웃 라우터를 우선 만들자. app.get('/api/users/logout', auth, (req, res) => { User.findOneAndUpdate({_id: req.user._id}, {token: ""}, (err, user) => { if(err) return res.json({success: false, err}) return res.status(200).send({ success:..
Auth 기능 어떤 페이지에 로그인된 유저만 사용 가능하게 만들어야 하는 기능이 필요하다. 따라서 로그인하여 Token이 발급된 유저만 사용 가능하게끔 만드는 Auth기능을 만들어야 한다. Cookie에 저장된 token을 decode 우선 auth를 위한 middleware가 필요하니 middleware 폴더를 root에 만든 뒤, auth.js파일을 생성하여 다음과 같이 작성한다. const { User } = require("../models/User"); let auth = (req, res, next) => { //인증 처리 //client cookie token 가져오기 let token = req.cookies.x_auth; //토큰 복호화 & user 찾기 User.findByToken(t..
로그인 기능 만들기 우선 로그인을 하려면 요청된 이메일이 데이터베이스에 있는지 찾아야 한다. 그다음 요청된 비밀번호와 같은지 여부를 판단한다. 만약 둘 다 일치한다면 Token을 생성하면 된다. 이메일 확인하기 우선 엔드포인트는 './login'으로 하고 post 메서드를 하나 추가한다. 그 후 몽고DB 메서드인 findOne 메서드를 사용하여 일치하는 email을 찾는다. 만약 존재하지 않는다면 실패 메시지를 전달한다. 일치하는 email이 있다면 비밀번호를 비교한다. app.post('/login', (req, res) => { //요청된 이메일을 DB에서 찾는다 User.findOne({ email: req.body.email }, (err, user)=> { if(!user){ return res..
비밀번호 암호화 POST로 데이터를 등록한 것을 보면 암호화가 되어있지 않아 자칫하면 위험해질 수 있다. 따라서 비밀번호를 암호화하여 관리해야 한다. 기본적인 구조는 salt를 생성하여 hash를 적용하는 것이다. hash를 적용하여 read를 할때 평문을 알아낼 수 없게 만들면 된다. 다음 코드를 보며 알아보자. userSchema.pre('save', function(next){ var user = this; if(user.isModified('password')){ //비밀번호 암호화 시킨다. bcrypt.genSalt(saltRounds, function(err, salt) { bcrypt.hash(user.password, salt, function(err, hash) { if(err) retu..