백엔드 개발자(node.js)가 되는 과정 76

Sequalize로 MYSQL 데이터베이스 마이그레이션하기

기본 환경 설정하기 node에서 MySQL 데이터베이스를 사용하기 위해 Community Server 설치가 필요하다. https://dev.mysql.com/downloads/ 또한 node와 데이터베이스를 ORM 방식으로 사용하기 위해 추가적인 npm 패키지 설치가 필요하며 여기서는 sequalize라는 패키지를 활용한다. npm install mysql2 sequelize sequelize-cli 위 패키지 중 sequelize-cli는 필수 패키지는 아니나 데이터베이스 생성이나 마이그레이션 등을 cli 명령으로 가능하게 하여 작업의 편의성을 더해준다. 💡 Tip ORM은 데이터베이스에 있는 객체를 하나의 객체에 매핑시키는 기술 데이터베이스 문법을 잘 모르더라도 자바스크립트 언어로 비교적 쉽게 상호..

[WIL] 22. 06. 12 ~ 06. 16

지난 주 node.js기반 API 서버 구현 개인 프로젝트를 진행하면서 배웠던 점들을 정리한다. Access Token과 Refresh Token의 개념와 Flow // 엑세스 토큰 생성기 const getAccessToken = ((username, _id) => { const accessToken = (username, _id) => jwt.sign({ username, _id }, process.env.ACCESS_TOKEN_KEY, { expiresIn: '30m', }); return (username, _id) => accessToken(username, _id); })(); JWT(JSONWEBTOKEN) 패키지를 통해 토큰을 생성 가능하며 이 때 사용자의 정보를 함께 담아서 ..

[nodejs 개인 프로젝트 3일 차] Access Token, Refresh Token

엑세스 토큰 검증과 리프레시 토큰을 활용한 엑세스 토큰 재발급 이전까지는 API 테스트 중 엑세스 토큰이 만료 되었을 때 재로그인을 통해 다시 발급받는 방식으로 테스트를 이어갔다. 하지만 추후에는 자동으로 엑세스 토큰 만료 시 자동으로 재발급 해주는 프로세스가 진행되어야 했다. 사실 실제 네이버와 같은 서비스를 이용할 때는 내가 언제 엑세스 토큰이 재발행되는지도 모르겠고, 추측하건데 특정 사이트에 로그인 후 그대로 방치한 상태에서 하루 또는 오랜 시간 지났을 때 리프레시 토큰까지도 만료되었기 때문에 재로그인을 요청받으며 로그인 창으로 강제이동하지 않았나 예상한다. 아무튼 엑세스 토큰의 재발급은 유저가 모르는 과정을 통해 재발급되는 프로세스여야 하지 않나 라는 생각에 아래와 같이 기능을 구현했다. 아래 기..

mongoDB의 find 사용 시 주의할 점

case 1 const user = await User.findOne({ _id }); 위 코드는 User 컬렉션에서 _id의 값을 찾는 명령이다. 만약 _id 변수의 값이 컬렉션에 없는 id라면 null이 결과로 나온다. const update = { '$set': {age: 40} } await User.updateOne(user, update) 위 코드는 검색한 user에 대해서 나이를 40으로 변경하라는 명령이다. 그런데 만약 user가 null이라면 어떻게 될까? 일반적으로는 당연히 조건에 일치하는 유저가 없으니 아무런 변경이 없어야 한다. 하지만 User 컬렉션에서 가장 오래된 유저 데이터(다큐먼트)의 나이를 바꿔버린다. updateOne 메서드가 원치 않는 명령을 수행하는 것이다. 이 부분은..

[nodejs 개인 프로젝트 2일 차] 로그인, 인증 기능 구현하기

로그인 기능 구현 Access Token 생성을 통해 로그인 유저에 한하여 포스팅 권한을 부여하는 방식을 구현해 보았다. // login.router.js const express = require('express'); const issuebombomCookie = require('jsonwebtoken'); const User = require('../schemas/user'); const loginRouter = express.Router(); loginRouter.post('/', async (req, res) => { const user = req.body; // 데이터베이스에서 유저 정보 조회 const findUser = await User.findOne({ userId: user.userId..

[nodejs 개인 프로젝트 1일 차] 게시판 기능 구현하기

위 프로젝트를 통해 서버용 데이터베이스 환경 구축하고, 이를 토대로 게시글과 관련해서 CRUD를 간단하게 구현해본다. 필수 진행 사항 MongoDB 생성 및 mongoose 다루기 내 PC를 mongoDB 데이터베이스 관리를 위한 서버로서 활용하기 위해 아래 내역을 설치한다. # brew에서 mongodb-community 설치 brew tap mongodb/brew brew install mongodb-community 설치가 완료되면 mongodb를 실행한다. brew services start mongodb-community # 종료는 stop # brew services start mongodb-community 위 과정이 끝나면 npm 패키지로 mongoose도 설치해 준다. npm instal..

[WIL] 22. 06. 05 ~ 06. 09

지난 주 일정에 대해서 간략하게 정리합니다. 팀프로젝트 진행 자바스크립트 문법에 익숙해지는 것을 목적으로 팀프로젝트가 진행되었습니다. 목표는 기존 개인프로젝트로 진행되었던 영화 소개 페이지를 기반으로 상세 페이지와 리뷰 기능을 추가하는 것이었습니다. 해당 과제를 수행하는 과정에서 배운 점은 아래와 같습니다. Github 협업 시스템 활용에 대한 이해 Pull Request를 적극 활용할 수 있는 계기였고, 특히 collaborator와 contributor 간의 차이를 배울 수 있었습니다. 협업 관련하여 내용은 아래 링크에서 확인할 수 있습니다. Github을 활용한 협업 관련 요약 localStorage의 활용 난이도가 높은 내용은 아니었지만 웹 브라우저 내 저장할 수 있는 공간이 있다는 사실에 대해서..

JWT 모듈을 통한 로그인, 인증기능 구축 (2)

Refresh Token What is Refresh Token? 로그인 후 생성된 토큰을 사실 Access Token이라 부른다. 실제로는 Access Token에 대하여 유효기간을 지정해서 사용해야 한다. 그 이유는 해커와 같은 제 3자에게 악의적인 용도로 Token이 탈취된다면 유저가 재로그인을 한다 해도 기존에 생성된 토큰이 유효하기 때문에 보완상 위험에 처하게 되기 때문이다. 하지만 만약 Access Token의 유효기간이 매우 짧게 설정되어 있다면 유저는 매번 재로그인을 시도해야 하고, 반대로 너무 길게 설정되어 있다면 보완상 의미가 없어진다. 금융 관련 서비스 이용 시에는 유저가 번거롭더라도 유효기간을 짧게 하는 것이 타당할 수 있지만 그 외의 경우에는 적절한 타협점을 찾아야 하는 어려움이 ..

JWT 모듈을 통한 로그인, 인증기능 구축 (1)

로그인, 인증 기능 구축을 위한 기능 인증기능이 왜 필요할까? 서버가 클라이언트로부터 어떠한 정보를 요청받았을 때 해당 클라이언트가 누구냐에 따라 응답 데이터가 달라지거나 또는 제공해서는 안되는 보완적인 절차가 필요한 경우가 있기 떄문이다. 가령 A 유저에게 B 유저에 대한 개인정보, 플레이리스트, 결제내역 등을 보여줘서는 안되기 때문이다. 이러한 클라이언트 구분을 위해 로그인 시스템이 존재한다. 최초 로그인 시 클라이언트는 로그인 정보를 body에 담아 전달하면 서버는 그것을 내장 시크릿 키와 잘 버무려 토큰 이라는 hashing text를 생성하여 클라이언트에게 제공해준다. 이 토큰은 곧 인증서 역할을 한다. 그래서 클라이언트는 로그인한 후 해당 사이트에서 여러가지 요청(게시글 보기, 플레이리스트 보..

node에서 MySQL 데이터베이스 활용과 ORM (2)

데이터베이스에 첫 데이터(seed) 넣기 데이터베이스와 테이블 정의가 끝났다면 첫 데이터를 입력하는 과정을 seed데이터를 넣는다고 표현한다. 이 과정에서는 아래와 같은 순서를 따른다. sequelize-cli를 통해 시드데이터 추가를 위한 파일을 생성한다. (마이그레이션 틀을 만드는 것과 비슷합니다.)위 명령어 실행을 완료하면 seeders 폴더가 생성되고, 그 안에 initialMembers이름이 딸린 파일이 생성된 것을 확인할 수 있다. npx sequelize seed:generate --name initialMembers seed 파일을 살펴보면 아래와 같이 작성 방법이 제공되는데 가이드를 따라서 입력할 데이터를 작성합니다.이전에 봤던 migration처럼 up, down 메소드로 구분되어 생성..