본문 바로가기

분류 전체보기50

동시성(Concurrency) 문제 해결하기 동시성 문제에 대해 얘기하기 전에 환경은 다음과 같습니다. 프로젝트의 스펙은 Nodejs, Express, TypeScript, Typeorm, MySQL로 구성되어 있습니다. 유저 관리, 게시글(CRUD) 일반적인 게시판 프로젝트로 한 단계씩 기능을 추가 업그레이드 중입니다. 초반에는 빨리 API 구현을 해서 프로젝트가 실행만 되도록 했고, 동시성 문제에 대해 확인하고 해결하는 내용을 정리해보려고 합니다. ✔ 동시성 테스트 동시성 테스트를 위해서 Apache JMeter 를 통해 진행합니다. Number of Threads (users) : 한 번에 생성할 스레드의 수. 즉 동시에 접속하는 유저의 수 Ramp-up period (seconds) : 전체 스레드가 전부 실행되는 데까지 걸리는 시간 Loo.. 2022. 10. 4.
MySQL 트랜잭션 격리 수준(Isolation level) 확인하기 트랜잭션 격리 수준(Isolation level)에 대한 내용은 Isolation level에서 확인 ✔ 트랜잭션 격리 수준(Isolation level) 트랜잭션 격리 수준 실습을 하기 전에 앞서 MySQL은 "autocommit=ON(1: ON, 0: OFF)"이 기본으로 되어있습니다. autocommit이 "on"이면 데이터를 변경하는 쿼리(insert, update, delete)가 실행될 때마다 자동으로 commit이 처리된다. 실습을 위해 아래의 방법으로 "off"로 변경하고 진행하고 끝나면 다시 on로 변경하겠습니다. 아래의 두 가지 방법으로 autocommit을 확인할 수 있습니다. mysql > select @@autocommit; mysql > show variables like 'au.. 2022. 9. 20.
데이터베이스 트랜잭션(Database Transaction) ✔ 트랜잭션 트랜잭션은 데이터베이스의 데이터를 조작하는 작업의 단위로, "쪼갤 수 없는 업무 처리의 최소 단위"를 말한다. 예를 들면, A라는 사람이 B라는 사람에게 1,000원을 지급하고 B가 그 돈을 받은 경우, 이 거래 기록은 더 이상 작게 쪼갤 수가 없는 하나의 트랜잭션을 구성한다. 만약 A는 돈을 지불했으나 B는 돈을 받지 못했다면 그 거래는 성립되지 않는다. 이처럼 A가 돈을 지불하는 행위와 B가 돈을 받는 행위는 별개로 분리될 수 없으며 하나의 거래내역으로 처리되어야 하는 단일 거래이다. 이런 거래의 최소 단위를 트랜잭션이라고 한다. 트랜잭션 처리가 정상적으로 완료된 경우 커밋(commit)을 하고, 트랜잭션 중 일부라도 오류가 발생할 경우 원래 상태대로 롤백(rollback)을 한다. ✔ .. 2022. 9. 7.
Node.js 구조 & 동작 원리 최근에 Node.js 공부하고 개발은 하지만, 구조나 동작 원리? 등에 대해서 자세히 알지 못하고 Expressjs 공식문서 혹은 구글에 찾아보면서 개발을 했었다. 그러다 문득 생각한 게 좋은? 잘하는 개발자가 되려면 내가 쓰는 것에 대해서 알아야 하지 않을까 생각이 들어서 이 글을 쓰게 됐다. 이전 글 Node.js 교과서 1주차에서도 Node.js에 대해서 아주 간략하게 설명을 했지만 다시 한번 얘기하자면, Node.js는 크롬 V8 자바스크립트 엔진 기반으로 자바스크립트 런타임 실행환경이다. Node.js의 특징은 싱글 스레드(Single Thread), 이벤트 기반(Event Driven), 논 블로킹 I/O(Non Blocking I/O) 모델 특징들이 있다. 특징들을 얘기하기 전에 먼저 Nod.. 2022. 8. 17.
Dockerfile & docker-compose 작성 NodeJS, Express, MySQL, Sequelize로 구현한 프로젝트를 Docker를 이용하여 배포하기 위한 내용 처음 Docker를 사용 배포를 하면서 생긴 오류들과 과정을 기억하기 위해 남깁니다. 과정은 다음과 같습니다. docker-compose.yml 파일에 Redis서버와 MySQL 서버, Express app 서버 3개를 한 번에 구동시키기 위해 작성 docker-compose up -d --build로 이미지가 만들어지고 컨테이너가 실행 app에서 MySQL 연결 및 Redis 연결이 이뤄지고 실행 하지만 컨테이너가 실행은 됐지만 app 컨테이너의 로그를 봤더니 "connect ECONNREFUSED 127.0.0.1:3306"으로 에러가 발생 원인들의 이유부터 말하자면, 일단 첫 .. 2022. 7. 31.
Docker 설치 및 명령어 정리 자동 설치 스크립트(리눅스) Docker는 리눅스 배포판 종류를 자동으로 인식하여 패키지를 설치해주는 스크립트를 제공 $ sudo wget -qO- https://get.docker.com/ | sh Ubuntu 패키지 설치 /usr/bin/docker.io 실행파일을 /usr/local/bin/docker로 링크해서 사용 $ sudo apt-get update $ sudo apt-get install docker.io $ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker docker-compose 설치 curl을 사용해서 github에서 docker-compose 바이너리 설치 터미널에서 사용할 수 있도록 심볼릭 링크 생성, 실행 권한 부여 마지막으로 ver.. 2022. 7. 24.
Node.js 교과서 4주차 ✔ Sequelize Sequelize는 DB 작업을 편리하게 사용할 수 있도록 도와주는 ORM 라이브러리이다. MySQL, PostgreSQL, MariaDB 등 많은 RDBMS를 지원하고 Promise 기반으로 구현되었기 때문에 비동기 로직을 편리하게 작성할 수 있다. "$ npm i sequelize mysql2" "$ npm i -D sequelize-cli" "$ npx sequelize init" (디렉터리 구조 초기화) 위의 명령어로 sequelize와 mysql 드라이버를 설치하고 sequelize-cli는 sequelize 명령 실행에 필요하기에 개발용에 설치해준다. 디렉터리 구조는 config, migrations, models, seeders 4개의 디렉터리가 생성된다. config/.. 2022. 6. 9.
Node.js 교과서 3주차 ✔ Express Node.js 웹 애플리케이션 프레임워크 HTTP 유틸리티 메서드와 미들웨어를 사용하여 빠르고 쉽게 API를 작성 ✔ 라우팅(Routing) 라우팅은 URI(path) 및 특정한 HTTP 요청 메서드(GET, POST 등)인 특정 엔드포인트에 대한 클라이언트 요청에 응답하는 방식을 말한다. express는 라우터를 미들웨어로서 제공하고 있고, 각 라우터는 하나 이상의 핸들러 함수를 가질 수 있다. // 라우터 객체 참조 const express = require('express') const router = express.Router() // 라우팅 핸들러 등록 router.route('/api/login').post() // 체인 라우터 핸들러 router.route('/api/tes.. 2022. 6. 1.
Node.js 교과서 2주차 ✔ NPM(Node Package Manager) 노드의 패키지 매니저 다른 사람들이 만든 소스 코드들을 모아둔 저장소 ✔ package.json "$ npm init" 명령어로 package.json 파일을 만들어 프로젝트의 설정 등을 기록해주는 파일 scripts : 별칭을 사용하여 명령어를 사용(ex. "start": "node index" - "$ npm run(생략 가능) start") dependencies : "$ npm i 패키지명"으로 설치한 의존 패키지(배포용 패키지) devDependencies : "$ npm i -D(--save-dev 동일) 패키지명"으로 설치한 의존 패키지(개발용 패키지) "$ npm i -g(--global 동일) 패키지명"은 글로벌 설치로 전역 설치(사용자가.. 2022. 5. 25.
Node.js 교과서 1주차 첫 Node.js를 공부하면서 개인적으로 정리를 해보고자 작성... 인프런 강의 : [리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지 ✔ Node.js Node.js는 크롬의 V8 자바스크립트 엔진을 기반으로 하는 자바스크립트 런타임이다. 노드는 단일 스레드(Single Thread)와 이벤트 기반이고, 비동기 I/O 처리(Non-Blocking I/O) 모델이다. 그리고 NPM을 통해 방대한 모듈을 제공하고 있다. ✔ 호출 스택 동작 function oneMore() { console.log('one more'); } function run() { console.log('run run'); setTimeout(() => console.log('wow'), 0); new Promise(res.. 2022. 5. 14.
[Spring] 인터셉터(Interceptor) 적용 ✔ Interceptor Intercept은 (중간에) 가로막다[가로채다] 라는 의미이고, 의미와 같이 사용자가 서버로 어떠한 요청을 보낸다. 서버에서는 DispatcherServlet이 HandlerMapping을 통해 컨트롤러를 찾아 실행하기 전에, 인터셉터가 등록되어 있다면 순차적으로 인터셉터를 거쳐서 컨트롤러가 실행이 된다. 등록된 인터셉터가 없다면 바로 컨트롤러가 실행된다. 인터셉터의 정식 명칭은 HandlerInterceptor이고, HandlerInterceptor에는 3개의 메서드가 있다. ✔ Interceptor 구현 인터셉터를 구현하기 위해서는 HandlerInterceptor 인터페이스의 3개 메서드를 오버라이딩해서 사용할 수 있고, 인터셉터를 따로 등록해 줘야 한다. @Compone.. 2022. 4. 17.
[Algorithm] 소수 구하기 ✔ 에라토스테네스의 체 수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. ✔ 알고리즘 에라토스테네스의 체 방식은 위와 같이 2부터 시작해 해당 배수의 값을 지워 나가면 된다. 에라토스테네스의 시간 복잡도는 O(nloglogn) 이다. 사실 O(nloglogn)이 어느 정도인지 모르겠다... 다만, O(n)인 선형 알고리즘보다 빠르다고 생각하고 있다. 배수의 값을 미리 지우기 때문이라고 생각한다.(DP 느낌? 👀) #include #include using namespace std; int main() { int n=120, cnt=0; vector v(n+1, 1); for(int i=2; i*i 2022. 4. 5.