일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 동적sql
- exclusive lock
- 이진탐색
- 다대다
- fetch
- shared lock
- 백트래킹
- BOJ
- 연관관계
- execute
- 즉시로딩
- querydsl
- eager
- 스프링 폼
- JPQL
- 지연로딩
- 힙
- 다대일
- CHECK OPTION
- dfs
- 스토어드 프로시저
- 낙관적락
- PS
- 유니크제약조건
- 비관적락
- 연결리스트
- 데코레이터
- SQL프로그래밍
- FetchType
- 일대다
- Today
- Total
목록Node.js (13)
흰 스타렉스에서 내가 내리지
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/d7GWXH/btrFZZNu9r1/b2OxfZkIcK3fp1SHR7xBRK/img.png)
Header에 내용추가하기, Header를 통해서 쿠키 설정하기 exports.main = function (req, res, next) { res.setHeader("Domi", "Thiem");// 헤더 설정 res.setHeader("Set-Cookie", "mycookie=test");// 쿠키를 생성하는 명령어 res.cookie("hana", "card");// 쿠키 생성 res.clearCookie("hana");// 쿠키 제거 res.render("home"); }; 아주 간단한 로그인 로직 - 만료시간 const fs = require("fs"); exports.main = function (req, res, next) { res.setHeader("Domi", "Thiem"); res...
console.log 나, console.error를 사용하면, 메서드들이 언제 호출되었는지 파악하기 힘들 뿐만 아니라 서버가 종료되는 순간 로그들도 사라진다. 에러가 발생하면 에러 메시지를 확인해야 하는데, 서버가 종료되어 에러 메시지들이 날아가버리는 황당한 일이 일어난다. 이와 같은 상황을 방지하려면 로그를 파일이나 다른 데이터베이스에 저장해야 한다. // logger.js const { createLogger, format, transports } = require("winston"); const logger = createLogger({ level: "info", format: format.json(), transports: [ new transports.File({ filename: "combi..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bLZ2h3/btrEw8sLcyL/2X7WiGkipwRe8osV15fBn0/img.png)
pm2는 원활한 서버 운영을 위한 패키지이다. '개발할 때 nodemon을 쓴다면, 배포할 때는 pm2를 쓴다. 가장 큰 기능은 서버가 에러로 인해 꺼졌을 때 서버를 다시 켜주는 것이다. 또 하나의 중요한 기능은 바로 멀티 프로세싱이다. 멀티 스레딩은 아니지만 멀티 프로세싱을 지원하여 노드 프로세스 개수를 한 개 이상으로 늘릴 수 있다. 기본적으로 CPU 코어를 하나만 사용하는데, pm2를 사용해서 프로세스를 여러 개 만들면 다른 코어들까지 사용할 수 있다. 클라이언트로부터 요청이 올 때 알아서 요청을 여러 노드 프로세스에 고르게 분배한다. 하나의 프로세스가 받는 부하가 적어지므로 서비스를 더 원활하게 운영할 수 있다. 단점도 있다. 멀티 스레딩이 아니므로 서버의 메모리 같은 자원을 공유하지는 못한다. ..
morgan을 배포용으로 // app.js if (process.env.NODE_ENV === "production") { app.use(morgan("combined")); } else { app.use(morgan("dev")); } combined 모드는 dev 모드에 비해 더 많은 사용자 정보를 로그로 남기므로 추후 버그를 해결할 때 더 유용하게 사용할 수 있다. process.env.NODE_ENV는 .env에 넣을 수 없다. 개발, 배포환경에 따라 값이 변해야 하는데, .env 파일은 정적 파일이기 떄문. NODE_ENV를 동적으로 바꾸는 방법은 cross-env를 이용한다. express-session을 배포용으로 // app.js const sessionOption = { resave: f..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/bqfj2c/btrELU0oO0k/kmmCnWq6TF2ynoXT1HaAAk/img.png)
npm init package.json이라는 파일 자동 생성 npm i -D nodemon package.json에서 .gitignore 파일 생성 후 node_modules 나 .env 같은 파일들 추가 express 설치 npm i express 각종 모듈 설치 npm i ### bcrypt cookie-parser dotenv express express-session morgan helmet multer mysql2 nunjucks passport passport-kakao passport-local sequelize sequelize-cli cross-env sanitize-html csurf pm2 winston hpp jsonwebtoken uuid axios socket.io sse nod..
미들웨어의 작동 방식을 커스터마이징 하고 싶을 때 사용하는 방법이다. 아래의 두 코드는 같다. router.use(cors()) router.use((req, res, next) => { cors()(req, res, next); }); req와 res를 살짝 조작하거나, 데이터를 이용하고 싶은게 있으면 사용하면 되겠다.
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/nGBSo/btrDe86RK3q/RgIMkbNZtkzdrvLSqliUN1/img.png)
회원가입과 로그인을 직접 구현할 수도 있지만, 세션과 쿠리 처리등 복잡한 작업이 많으므로 검증된 모듈인 passport를 사용하면 좋다. 카카오톡 로그인이나 구글 로그인처럼 요즘 sns를 이용한 로그인이 많이 보이는데, 이를 passport 모듈을 사용해서 구현할 수 있다. npm i passport passport-local passport-kakao 사용사례는 내 깃허브에서 직접 보도록 하자. 주요한 것만 적기위해 일부만 캡처해서 설명한다. passport.initialize() 는 request에 passport 설정을 심는다. passport.session() 은 req.session에 passport 정보를 저장한다. 참고로 req.session은 express-session 미들웨어로 생성한다..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/N9M0v/btrCApisvCz/Cz6CjIlmRklGpDQCRBK0F0/img.png)
app.js에서 정적파일 연결하기 const __dirname = path.resolve(); app.set("views", path.join(__dirname, "views")); app.set("view engine", "html"); views는 템플릿 파일들이 위치한 폴더를 지정한다. 혹은 절대경로를 넣어주면 되는데, 그렇게 하면 소스코드가 유출되었을때 우리 서버의 구조를 알려주게 되니까 비추천. view engine은 어떠한 종류의 템플릿 엔진을 사용할지를 나타내는데, nunjucks는 html로 표기해도 된다. 굳이 구분하고 싶다면 njk로 한다. import express from "express"; const router = express.Router(); router.get("/", (r..
import express from "express"; import multer from "multer"; import path from "path"; const app = express(); app.use(express.json()); app.use(express.urlencoded({ extended: false })); const __dirname = path.resolve(); const upload = multer({ storage: multer.diskStorage({ destination(req, file, done) { done(null, "uploads/"); }, filename(req, file, done) { const ext = path.extname(file.originalnam..
app.use((req, res, next) => { if (process.env.NODE_ENV === "production") { morgan("combined")(req, res, next); } else { morgan("dev")(req, res, next); } }); NODE_ENV라는 환경변수를 고쳐주기만 하면, 내부 소스코드를 변경하지 않아도 개발환경일 떄와 배포환경일 때의 설정을 다르게 할 수 있다. 특정한 주소의 요청에만 미들웨어가 실행되게 하고싶을 때에도 미들웨어 안의 미들웨어를 사용할 수 있다.