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

AWS의 주요 서비스 간략 정리 (1)

AWS 주요 서비스 훑어보기 해당 시기에 잘 몰랐던 내용을 위주로 정리했기 때문에 기존에 알고 있던 부분에 대해서 기록되어 있지 않습니다. IAM(Identity and Access Management) AWS에서 사용자, 그룹 및 역할을 생성하고 관리하여 리소스에 대한 엑세스를 안전하게 제어할 수 있는 기능입니다. IAM 주요 보안 기능 인증: AWS 리소스 엑세스 권한에 대한 인증 권한 부여: IAM 정책을 사용하여 사용자 또는 그룹을 대상으로 권한을 지정할 수 있습니다. 권한 검증: 각 권한에 대한 엑세스 요청에 대한 검증 기능을 의미합니다. USER, GROUP, POLICY USER: IAM 서비스를 통해 개인별 자격 증명 생성 및 엑세스 권한이 부여되는 단위를 의미합니다. GROUP: 다수를 ..

[WIL] 23. 07. 18 ~ 23. 07. 23 프로젝트 회고

과제 내용 배민 앱과 같은 배달 서비스 홈페이지 구현 고객이 특정 음식점에서 메뉴를 주문하면 음식점 주인이 주문을 접수하는 방식 주요 구현 내용 고객 CRUD 사장 CRUD 음식점 CRUD 각 음식점의 메뉴 CRUD 주문내역 CRUD 음식점 검색 기능 Keep 프로젝트 시작 단계에서 폴더명과 파일명, 모델 migration 등 규칙이 필요한 부분을 사전에 정해두어서 대표 한 사람이 GitHub 레포지토리에 기본 틀로 정해둔 뒤 각자 맡은 역할을 수행한 점이 좋았다. (merge 시 conflict을 상당 수 방지할 수 있었습니다.) 와이어프레임을 Figma를 활용하여 기존에 작성했던 방식보다 더욱 디테일하게 틀을 잡아두고서 프로젝트를 시작했기에 시각적으로 어떤 페이지, 어떤 버튼이 구현되어야 하는지를 직..

[express] AWS S3 버킷에 이미지 저장하기

AWS S3 bucket에 이미지 저장하기 📌 로컬 이미지 파일을 S3 버킷에 저장하는 기능입니다. AWS S3 버킷 생성 버킷 생성 과정에서 위 사진과 같은 설정이 필요합니다. 디폴트 설정이 아니므로 따로 저렇게 설정해야 합니다. 정확히 어떤 기능인지는 모르겠지만 뭔가 굉장히 보안적으로 취약하게 만드는 행위인 것 같아 보입니다. (조금 불안) 하지만 위와 같이 설정을 하지 않으면 당장 실습에서 파일이 업로드 되지 않습니다. 이 부분에 대해서는 자세히 공부할 필요가 있을 것 같습니다. 필요 패키지 설치 npm install aws-sdk npm install multer npm install multer-s3@2.10.0 여기서 주의할 점은 multer-s3의 버전을 지정해줘야 한다는 점입니다. 현재 날..

socket.io로 간단한 채팅 페이지 구현하기

https://github.com/issuebombom/chat_page_mini Workflow 프론트에서 A 유저가 글을 보냅니다. 본인의 socket.id와 작성한 글을 'SEND' 이벤트명으로 백엔드에 emit합니다. 이 때 본인이 작성한 글은 채팅창에서 푸른 바탕을 지니며 오른쪽 정렬되어 보여집니다. 백엔드에서 'SEND' 이벤트를 받아 작성자(A)를 제외한 유저들을 대상으로 메시지와 socket.id 정보를 프론트에 전달합니다. 이 때 역시 'SEND'라는 동일한 이벤트명으로 전달합니다. 프론트에서 'SEND' 이벤트를 받은 A외 유저들은 본인의 채팅창에 A가 작성한 문구가 노란 바탕으로 나타나며 왼쪽정렬된 상태로 받아집니다. 본인이 작성한 문구 외 글들은 상단에 작성자의 socket.id가 ..

[sequelize] 데이터베이스의 테이블 ID를 UUID로 사용하기

UUID 사용하기 UUID(범용 고유 식별자)는 테이블의 ID로 사용하는 식별자로 총 4개의 하이푼(-)으로 구분된 문자열로 구성되어 있다. 해당 식별자를 사용하는 가장 큰 장점은 전 세계적으로 중복값이 존재할 가능성이 극히 낮다는 점, 즉 고유성이 보장된다는 점 때문이다. 자세한 내용은 생략하고 UUID를 MySQL sequelize에 적용하는 방법에 대해서 살펴보자 // migration 'use strict'; /** @type {import('sequelize-cli').Migration} */ module.exports = { async up(queryInterface, Sequelize) { await queryInterface.createTable('RefreshTokens', { uuid:..

Sequelize로 MySQL 트랜잭션 적용하기

managed와 Unmanaged 트랜잭션 sequelize에서 Transaction는 어떻게 사용할 수 있는지 알아보자 sequelize에서 트랜잭션을 적용하는 방법은 크기 Managed 방식과 Unmanaged 방식으로 나뉜다. // Managed const { sequelize, User } = require('../models'); // 트랜잭션의 콜백으로 유저 생성 로직을 처리합니다 const result = await sequelize.transaction(async (t) => { const user = await User.create( { nickname: 'apple', age: 18, }, { transaction: t } // 해당 로직이 트랜잭션으로 묶여있음을 명시함 ); retur..

트랜잭션의 기본 이해

Transaction 트랜잭션(Transaction)은 하나의 쿼리(작업) 단위를 하나의 묶음으로서 처리하는 기능을 의미한다. 가령 통장 입출금 시스템의 경우 A가 B에게 1000원을 송금하는 작업을 1. A가 B에게 송금한다. 2. B의 잔액이 1000원 증가한다. 와 같은 작업이 이뤄져야 하는데 해당 작업이 알 수 없는 오류로 인해 중단된다면 A가 보낸 1000원이 증발할 수도 있다. 바로 이러한 현상을 방지하기 위해서 트랜잭션이 존재한다. Transaction의 특징 ACID Atomicity(원자성) - 여러 쿼리 명령들을 하나의 작업 단위로 취급하여, 내부 쿼리 명령들이 전부 성공하거나, 아니면 모두 실패해야한다는 특징이다. Consistency(일관성) - 트랜잭션 처리 과정에서 데이터의 일관..

node.js express 엑세스 토큰과 리프레시 토큰

Access Token | Refresh Token Access Token과 Refresh Token은 유저가 로그인 했을 때 발급되며 이후 해당 유저가 누구인지에 대해 인증하는 용도로 활용됩니다. 가령 마이페이지에 접속할 경우 본인이 누구인지에 따라 그에 맞는 마이페이지를 보여줘야 하므로 이럴 때 사용되곘죠?? workflow 로그인 시 엑세스 토큰 발급 + 리프레시 토큰 발급 (각각) 두 토큰 모두 쿠키로 전달하되 리프레시토큰은 DB에 {리프레시 토큰: userId} 형태로 저장 로그인 이후 물품 구매, 마이페이지 접속 등 본인이 누구인지 파악하기 위해 쿠키에 접근 쿠키에 두 토큰이 존재하는지 먼저 확인 try, catch문으로 엑세스 토큰과 리프레시 토큰 검증 결과를 boolean으로 받는다. (i..

Socket.io에 대해서 알아봅시다.

Socket.io Socket.io가 무엇인지, 어떤 기능에 활용되는지 공부합니다. 시작에 앞서 알아야할 부분 TCP와 UDP TCP란? 서버와 클라이언트 간 데이터 송수신을 위해 만들어진 프로토콜 연결 지향성 프로토콜이라고도 부르는데 그 이유는 서버와 클라이언트가 양방향으로 소통함으로서 데이터 요청 및 전송에 있어 차질이 없도록 하여 데이터의 누락 또는 순서가 뒤바뀌는 일을 방지하는 것, 즉 통신의 안정성을 바탕으로 한 신뢰에 중점을 두기 때문입니다. 가령 클라이언트가 데이터를 요청했고, 서버가 보내주는 과정에서 데이터가 누락되었다면 클라이언트에서 "누락됐다."라고 알려주면 서버가 다시 보내주는 방식으로 서로 소통하므로 아무래도 데이터 전송이 잘못된 가능성이 현저히 낮아 신뢰가 높아집니다. 하지만 UD..

nodemailer를 활용하여 인증 이메일 보내기

nodemailer에 대해서 정리해보자 회원 가입 과정에서 종종 거치게 되는 이메일 검증 절차를 구현해본다. const nodemailer = require('nodemailer'); let transporter = nodemailer.createTransport({ // 인증 서비스는 'gmail' 사용 service: 'gmail', // host를 gmail로 설정 host: 'smtp.gmail.com', port: 587, secure: false, auth: { // gmail 주소 입력, ex) 'testmail@gmail.com' user: NODEMAILER_USER, // gmail 패스워드 입력 pass: NODEMAILER_PASS, }, }); transporter 변수는 인증 메..