전체 글71 동시성(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 설치dockerdocs 문서를 참고해서 설치했습니다. 자세한 내용은 다음의 링크를 참조해 주세요.dockerdocs manuals 1. Docker's apt repository 등록# Add Docker's official GPG key:sudo apt-get updatesudo apt-get install ca-certificates curlsudo install -m 0755 -d /etc/apt/keyringssudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.ascsudo chmod a+r /etc/apt/keyrings/docker.asc# Add the repository .. 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. 이전 1 ··· 3 4 5 6 7 8 다음