분류 전체보기 210

23.09.02 테스트 코드 (Test Code)

테스트 코드는 소프트웨어의 특정 부분이 예상대로 동작하는지 확인하기 위해 작성되는 코드입니다. 이를 통해 버그와 예외 상황을 사전에 찾아내고 코드 변경 사항이 기존 기능에 영향을 미치지 않는지 확인할 수 있습니다. 단위 테스트 (Unit Test) 가장 작은 코드 단위를 테스트하여 개발 초기 단계에서 버그를 빨리 발견하고 수정할 수 있습니다. 목적: 코드의 가장 작은 단위(함수, 메서드 등)가 예상대로 동작하는지 확인 특징: 빠르고, 작은 범위의 코드만을 테스트 통합 테스트 (Integration Test) 개별적으로 테스트된 컴포넌트들이 서로 잘 작동하는지 확인합니다. 이는 시스템의 다양한 부분이 올바르게 상호 작용하는지를 보장합니다. 목적: 서로 다른 단위의 코드가 올바르게 연동되는지 확인 특징: 단..

23.09.01 동기적 처리와 비동기적 처리

동기적 처리(synchronous processing) 작업이 순차적으로 이루어지며, 한 작업이 완료되어야만 다음 작업이 시작될 수 있는 처리 방식을 의미한다. 여기서 "작업"은 함수 호출, 계산, 데이터베이스 쿼리, 파일 입출력 등 다양한 형태를 가질 수 있다. 동기적 처리의 특징: 순서가 중요: 작업들은 순차적으로 실행되기 때문에, 작업의 순서와 완료 상태가 중요하다. 결과 예측 가능: 작업의 순서가 고정되어 있어 결과를 예측하기 쉽다. 간단한 로직: 다음 작업은 이전 작업이 완료된 이후에만 시작되므로, 프로그래밍 로직이 상대적으로 간단하다. 자원 효율 높지 않을 수 있음: 이전 작업이 끝나기를 기다리는 동안, CPU나 메모리 등의 자원을 효율적으로 활용하지 못할 수도 있다. 예시: 파일 읽기: 프로..

23.08.31 사인드 업로드(Signed Upload)

사인드 업로드란 서버에 사인을 요청하고 그 사인을 이용해서 클라이언트에서 업로드 시에 검사를 하고 저장하는 것이다. 사인 요청: 클라이언트는 먼저 백엔드 서버에 파일 업로드에 필요한 사인된 토큰 또는 URL을 요청합니다. 토큰 생성: 백엔드 서버는 이 요청을 받고, 클라우드 서비스에게 안전한 업로드를 위한 사인된 토큰 또는 URL을 생성하라고 요청합니다. 토큰 전달: 백엔드 서버는 사인된 토큰 또는 URL을 클라이언트에게 전달합니다. 클라이언트 업로드: 클라이언트는 이 사인된 토큰 또는 URL을 사용하여 파일을 직접 클라우드 서비스에 업로드합니다. 검증 및 저장: 클라우드 서비스는 토큰이나 URL의 유효성을 검사한 후, 파일을 저장합니다. 백엔드 서버의 부하 감소: 파일 처리를 클라이언트와 클라우드 서비..

23.08.30 회원탈퇴4 (스케줄러 적용)

기존에 만들었던 회원탈퇴가 관리자 로그인으로 직접 삭제를 해야했기에 스케줄러로 자동으로 처리되게 했다. const CustomError = require("./error"); // CustomError를 불러옵니다. const confirmRequest = require("./confirmRequest"); const { Users } = require("../models"); const { Op } = require("sequelize"); class serverCheckDelete { async execute() { try { const maxListeners = 5; const timeoutDuration = 15 * 1000; let totalDeletedCount = 0; const timeou..

23.08.29 뮤텍스(Mutex)

뮤텍스 여러 스레드나 프로세스가 공유 자원에 동시에 접근하는 것을 제어하기 위한 동기화 메커니즘이다. 뮤텍스는 일종의 락(lock)으로 작동하여 한 번에 하나의 스레드만 특정 코드 영역을 실행할 수 있게 제한한다. 이렇게 하면 공유 자원에 대한 동시 접근이 제어되어 데이터의 일관성과 정확성이 유지된다. Node.js에서의 사용 1. async-mutex JavaScript에서 비동기 작업을 수행할 때 사용되는 뮤텍스(Mutex) 라이브러리이다. const { EventEmitter } = require("events"); const { Mutex } = require("async-mutex"); class ConfirmRequest extends EventEmitter { constructor() { s..

23.08.28 이미지 업로드 속도 문제

프로젝트 초기에 누군가 클라우디너리라는 CDN서비스를 소개하며 사용해보자고 했다. 이것은 자체적으로 이미지 저장 클라우드를 무료로 제공해주기 때문에 초기에 이미지 업로드는 프런트에서 진행했다. 하지만 이것에 보안적으로 좋지 않을 수 있다는 멘토링 시간의 조언을 듣고 찾아본 후에 백엔드에서 업로드 하는 것으로 변경했다. 그런데 왜 멀터를 사용해야하지 하는 의문이 생겼다. 기존에는 당연하게 멀터를 사용했는데 프런트에서는 멀터 없이 이미지 업로드를 처리했다. 그래서 멀터를 사용하는 이유를 찾으니 가장 큰 부분은 편의성이다. 개발자가 직접 복잡한 멀티파트 데이터 파싱 과정을 직접 구현할 필요가 없다. 그래서 코드가 간결해지고 유지 보수성이 좋아진다. 그리고 라이브러리 자체에 보안이나 에러처리, 확장성 등을 위한..

23.08.27 회원 탈퇴 만들기3 (서버 상태 모듈 적용하기)

deleteAllUserInfo = async (req, res, next) => { const userId = res.locals.user; const { adminVerification } = req.body; const confirmRequest = req.confirmRequest; const maxListeners = 5; // 임계값 설정 const timeoutDuration = 15 * 1000; // 15초 let totalDeletedCount = 0; const timeoutFunc = (listener) => { return setTimeout(() => { confirmRequest.off('requestCompleted', listener); // 이벤트 리스너 제거 throw ..

23.08.26 회원 탈퇴 만들기2 (서버 상태 확인 모듈 만들기)

서버 상태를 확인해야 하는 한다는 게 여러 방법이 있었는데 cpu나 메모리 등을 확인하는 방법 응답 시간을 확인하는 방법 처리 중인 요청의 수에 따라 처리하는 방법 이런 방법들이 하나만 사용되진 않고 각각의 장단점이 있기에 보완적으로 같이 사용된다고 한다. 그래서 나도 같이 적용시키고 싶지만 하나라도 제대로 만들자는 생각으로 하나만 선택해서 사용하기로 하고 요청 수에 따라 처리하는 방법을 찾아봤다. 처리 중인 요청의 수에 따라 처리하는 방법을 선택을 한 이유는 회원 탈퇴 뿐 아니라 처리가 제대로 이루어지고 있나 확인하는 용도로 사용할 수도 있으며 세부적으로 조정하기 쉽다는 장점이 있어 이런 시도를 처음 해보는 입장에서 테스트를 하기 쉬울 것이라고 생각이 되었다. 그럼 이것을 이제 어떻게 만들고 적용을 시..

23.08.25 회원 탈퇴 만들기 1 (기획)

회원탈퇴가 어떻게 보면 사용자가 느끼기에 엄청 중요하게 체감되는 기능이 아니고 별 신경을 안쓸 수도 있는 기능일 수도 있다. 하지만 다른 서비스를 사용하면서 회원탈퇴가 찾기 어려울 순 있어도 없는 경우는 못 봤다. 그래서 처음에는 크게 어렵지 않게 생각하고 만들려고 했었다. 그때는 이렇게 일이 커질 줄 몰랐다. 회원탈퇴하면 그냥 DB에서 정보를 지우고 참조되고 있는 테이블의 데이터를 다 지우면 되는 거 아닌가? 어떤 모임을 누군가가 만드는데 그것을 만든 사람이 탈퇴했을 때 그룹이 다 지워지면 같이 이용 중인 사람들에게 영향이 갈 수 있다. 우리의 서비스는 추억을 가장 큰 요소로 가져가는데 누군가 탈퇴했어도 그 사람이 작성한 게시글을 같은 모임의 사람들은 그래로 볼 수 있는 게 좋지 않을까 하는 의견도 나..

23.08.24 node.js (Event 모듈)

프로젝트에 필요한 기능을 구현하기 위해서 자료를 찾아보는데 이벤트를 이용한 코드를 보게 되었다. node.js에 내장 모듈이며 자주 사용된다고 하기에 기본은 알고 있어야 할 것 같아서 찾아봤다. 이벤트의 작동원리는 이렇다. 이벤트 리스너 등록: 특정 이벤트가 발생했을 때 실행되어야 하는 함수(이벤트 리스너 또는 이벤트 핸들러라고도 함)를 등록합니다. Node.js의 EventEmitter에서는 on 메서드를 사용해 이벤트 리스너를 등록할 수 있습니다. 이벤트 발생(emit): 특정 조건이나 상황에서 이벤트를 발생시킵니다. 이것은 대게 emit 메서드를 사용하여 수행됩니다. 이벤트 큐와 이벤트 루프: Node.js는 이벤트 루프와 이벤트 큐를 사용하여 비동기 이벤트를 관리합니다. 이벤트가 발생하면 해당 이..