전체 글 118

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 변수는 인증 메..

[WIL] 23.06.26 ~ 06. 30

프로젝트 회고 (공통) EJS 파일 사용 관련 어려움 백엔드에서 응답 받은 결과를 EJS 파일에 출력하는 과정에서 문법이 익숙하지 어려움이 있었다. 기존 프론트 구현 방식처럼 HTML에 javascript를 연동시켜서 페이지에 출력하는 방식과 EJS에 직접 백엔드 결과를 전달하는 방식을 모두 사용하게 되어 해당 부분에서 기능 구현이 다소 비효율적이게 된 것 같다. 추가 기능 구현에서의 어려움 업로드 된 이미지를 프론트에 출력하는 과정에서 이미지 사이즈가 일관성을 유지하도록 하기 위한 과정에서 어려움이 있었음 일관된 이미지 사이즈 출력 구현을 위해 리사이징을 시도하는 과정에서 sharp 패키지 사용을 시도했으나 input 관련 에러가 발생해서 구현에 한계에 부딪힘 이미지 리사이징 관련하여 AWS Lambd..

express에서 ejs에 css, js 파일 불러오기

백엔드를 공부하는 입장에서 프로젝트에서 프론트 작업을 하는 비중이 낮은데, 그렇다 보니 기초적인 부분에 대한 기억을 다시 끌어올려야 할 때가 많다. 오늘과 같은 예시도 그러한 부분 중 하나이다. ejs 파일에서 우리가 일반적으로 생각하는 경로 설정 방법으로 css나 js파일을 불러오도록 아래와 같이 작성할 경우 오류를 만날 수 있다. 나의 경우 static 폴더 내 css와 js폴더를 생성 후 각각 파일을 넣어뒀는데 아래와 같은 오류를 만날 수 있었다. 'Refused to execute script from 'http://localhost:3000/static/js/index.js' because its MIME type ('text/html') is not executable, and strict M..

Github Pull Request에 등록된 코드 가져오기

Pull Request에 등록된 코드를 눈으로만 리뷰하는 것과 직접 테스트 해보는 것은 아무래도 차이가 있는 것 같다. 그렇기에 아무리 코드 리뷰를 통해 문제가 없음을 확인했다 하더라도 직접 테스트 해보는 것 만큼 확신이 서지는 않기에 미리 pull 받아서 테스트 해보게 되는 것 같다. 방법은 간단하다. 테스트용 브랜치를 하나 생성해서 현재 최신으로 등록된 main 코드를 가져온다. git checkout -b test/pr origin/main merge 대상인 pr번호를 확인해서 가져오는 명령을 아래와 같이 작성한다. git pull origin pull/pr번호/head:test/pr 이와 같이 특정 브랜치에 테스트를 마친 후 merge를 하는 것이 좀 더 안전한 방법인 것 같다.

MySQL Sequelize에서 테이블에 필드(컬럼) 추가하기

웹사이트 프로젝트에서 서비스가 추가되다 보니 기존에 작성했던 ERD를 수정해야 하는 상황이 발생했다. 처음부터 ERD를 잘 짰으면 좋았겠지만 그러기는 쉽지 않은 것 같다. 어쨌든 이렇게 되면 특정 테이블 또는 테이블의 컬럼을 추가해야하는 상황이 발생한다. 이럴 때는 마이그레이션을 추가해주면 된다. npx sequelizse db:migrate 명령을 수행하면 migrations 폴더 내 js 파일을 순차적으로 실행하므로 기존 파일들 뒤에 신규 마이그레이션 파일을 추가해줌으로서 컬럼 또는 테이블을 추가해주는 명령을 더해주면 되는 것이다. 먼저 아래 명령을 실행하면 새로운 마이그레이션 파일이 생성된다. --name 이후의 이름은 자유롭게 지으면 되나 가급적 의미가 담겨있으면 좋을 것 같다. 아래 예시의 경우..

Docker로 MySQL 설치 및 실행하기 (Mac OS)

도커를 왜 쓰는 걸까? 도커에 대한 설명은 쉽게 찾아볼 수 있으므로 매우 간단하게 설명하자면, 하나의 컴퓨터를 여러 대의 컴퓨터인 마냥 써야할 경우에 사용한다. 예를 들어서 웹 서비스를 총 10개 운영한다고 했을 때 하나의 컴퓨터, 하나의 OS에서 10개 사이트에 대한 관리를 하는 것보다(가능한지 잘 모르겠다.) 독립된 10개의 공간에서 각각 관리하는 것이 유지 보수에 유리하기 때문이다. 왜냐하면 컴퓨팅 자원을 분리하여 독립적으로 사용할 수 있다는 장점이 있기 때문이다. 3번 웹 서비스 운영에 이슈가 생겼다고 해서 5번 서비스 운영에 지장을 주면 안되기 때문이다. 1. 도커 데스크탑 설치 Mac OS의 터미널을 통해서 도커를 설치하고, 켜고 끄거나 할 수 있겠지만 개인적으로 가장 간단하게는 그냥 도커 데..

[WIL] 23. 06. 19 ~ 06. 23

지난주 개인과제를 진행하면서 배운 내용을 정리했습니다. 개요 기존 과제에서 mongoose로 운영한 database를 MySQL과 sequelize로 전환한다. API 별 기능 Path API Method Verify Description /user POST 회원가입 /auth/login POST 로그인 /user GET 전체유저조회 /user:userId GET 개별유저조회 /user:userId/posts GET 유저가 작성한 게시글 조회 /posts GET 전체 게시글 조회 /posts POST ✔ 게시글 작성 /posts/:postId PUT ✔ 게시글 수정(유저 검증) /posts/:postId DELETE ✔ 게시글 삭제(유저 검증) /posts/:postId/comments GET 게시글 내..

nodejs 비밀번호 해싱 처리하기

비밀번호 해싱 처리 회원가입 시 유저의 비밀번호가 데이터베이스에 그대로 노출되지 않도록 해싱 처리 후 저장합니다. 해싱 처리를 위한 패키지를 설치합니다. npm install bcrypt user모델에서 User.init 아래 아래 메서드를 추가해줍니다. 이로서 유저 생성 전 비밀번호의 해싱 처리가 이루어 집니다. bcrypt 패키지를 사용하고, saltRounds를 10으로 입력해서 해싱 암호를 좀 더 강화합니다. // user.js const bcrypt = require('bcrypt'); User.beforeCreate(async (user) => { const saltRounds = 10; const hashedPassword = await bcrypt.hash(user.password, sal..

프로세스와 스레드에 대한 간단 정리

공부한 내용을 이해한대로 정리하자면! 프로세스를 하나의 실행 프로그램 단위로 볼 수 있을 것 같다. 가령 MS-WORD를 켰다고 했을 때 워드 프로그램 실행을 위한 단위를 프로세서로 보고, 내부적으로는 우리에게 보여줄 메뉴, 툴바 같은 UI출력, 키보드 입력 시 글자 입력, 첫 문장에서는 대문자로 자동 변경, 틀린 문자 빨간줄 긋기 등 각종 세부적인 기능 작동을 위한 명령 단위 하나하나를 스레드라고 볼 수 있다. CPU가 멀티 코어로 구성되어 있다면 프로세스 여러 개를 병렬로 동시에 처리할 수 있게 되고, 그만큼 수많은 프로세서를 다 처리하는데 걸리는 시간이 단축된다고 볼 수 있다. 더 나아가 프로세서 안에 스레드 또한 단일 스레드와 멀티 스레드로 나뉜다. 단일 스레드는 하나의 프로세서에서 스레드를 하나..