전체 글 118

Sequelize로 MySQL JOIN하기

MySQL의 JOIN 적용을 위한 준비 게시글 작성 사이트를 예시로 들어보자. 데이터베이스에는 유저 테이블과 게시글 테이블이 구분되어 있을 것이고, 게시글 테이블을 통해 해당 게시글의 작성자가 누구인지, 좀 더 깊게 들어가서 작성자의 이메일은 무엇인지 알기 위해서는 두 테이블 간 JOIN 작업이 필요할 것이다. sequelize를 통해 두 테이블을 JOIN 해서 정보를 획득하는 방법에 대해 알아보자 두 테이블의 관계 설정 // 유저 모델과 포스트 모델 간 1대 다 관계 설정 // models/user.js static associate(models) { this.hasMany(models.Post, { sourceKey: 'id', foreignKey: 'userId', }); } // models/po..

Sequelize로 모델 생성 및 테이블 연동하기

모델생성 및 테이블 연동하기 마이그레이션을 통해 테이블을 생성하면 아래와 같이 models 폴더 내 members.js파일이 함께 생성된다. 코드를 보면 마이그레이션과 비슷한 형태로 생성된 것을 확인할 수 있다. const { Model } = require('sequelize'); module.exports = (sequelize, DataTypes) => { class Member extends Model {} Member.init( { name: DataTypes.STRING, team: DataTypes.STRING, position: DataTypes.STRING, emailAddress: DataTypes.STRING, phoneNumber: DataTypes.STRING, admissionD..

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의 유효기간이 매우 짧게 설정되어 있다면 유저는 매번 재로그인을 시도해야 하고, 반대로 너무 길게 설정되어 있다면 보완상 의미가 없어진다. 금융 관련 서비스 이용 시에는 유저가 번거롭더라도 유효기간을 짧게 하는 것이 타당할 수 있지만 그 외의 경우에는 적절한 타협점을 찾아야 하는 어려움이 ..