백엔드 관련 강의 공부
-
mysql을 활용한 동시성 문제 해결 - 1. Pessimistic Lock백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 16:19
mysql을 활용한 동시성 문제 해결 1. Pessimistic Lock - 실제로 데이터에 Lock을 걸어서 정합성을 맞추는 방법이다. exclusive lock을 걸게되면 다른 트랜잭션에서는 lock이 해제되기 때문에 데이터를 가져갈 수 없게 되지만 데드락이 걸릴 수 있으므로 조심해야 한다. (데드락 : 두 개 이상의 프로세스나 스레드가 서로 상대방의 자원을 기다리면서 무한히 대기하는 상태) 2. Optimistic Lock - 실제로 Lock을 이용하지는 않지만 버전을 이용함으로써 정합성을 맞추는 방법이다. 데이터를 읽고 update를 하기 전에 내가 읽은 버전이 맞는지 확인하며 업데이트 한다. 내가 읽은 버전에서 수정 사항이 생겼을 때에는 application에서 다시 읽은 후에 작업을 수행한다...
-
재고 시스템에서 동시성 문제백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 15:42
Stock 엔티티 @Entity @Getter public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long productId; private Long quantity; public Stock() { } public Stock(Long productId, Long quantity) { this.productId = productId; this.quantity = quantity; } public void decrease(Long quantity) { if (this.quantity - quantity < 0) { throw new RuntimeException("재고는 0개 미..
-
도커 컴포즈(Docker Compose)백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 30. 22:11
docker compose 도커 컴포즈란 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구이다. server.js const express = require("express"); const redis = require("redis"); // 레디스 클라이언트 생성 const client = redis.createClient({ host:"redis-server", // host는 docker.compose.yml 파일에 명시한 컨테이너 이름 port: 6379 }) const app = express(); // 새로고침을 할 때마다 숫자가 1씩 증가하는 프로그램 app.get('/', async (req, res) => { await client.connect; let number = awa..
-
어플리케이션 코드 수정 후 빌드 - Docker Volume백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 30. 19:50
소스 코드 변경 이후에 다시 빌드를 한다면 이미지를 생성하는 docker build와 앱을 실행하는 docker run을 반복해야 한다. 이미지 생성부터 새롭게 해줘야하기 때문에 효율적이지 않은 방법이다. Dockerfile에서 COPY를 통해 진행하기 때문에 COPY를 하려면 이미지를 새로 만들어야 하기 때문이다. 어플리케이션 소스 수정 후 재빌딩 시 효율적인 방법 위의 사진을 보면 COPY가 2번 이루어진다. 첫 번째 COPY는 package.json을 받아와서 종속성 부분의 파일만 복사하고, 두 번째 COPY에서 전체를 복사한다. 이렇게 하면 소스만 변경할 때에는 package.json은 캐시를 사용해서 다시 다운받지 않고, 다른 소스코드 파일만 변경한다. 코드 변경 후 빌드를 해보면 package..
-
간단한 Node.js 앱을 이용한 도커 활용백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 30. 18:16
이론으로만 공부한 도커를 실제로 적용시켜볼 것이다. 물론 아주 간단한 앱을 만들어서 적용해보는 것이다. 강의에서 Node.js를 통해 진행했기 때문에 따라 진행할 것이며 나중에 스프링으로 변환할 것이다. package.json { "name": "nodejs-docker-app", "version": "1.0.0", "description": "", "main": "server.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js" }, "dependencies": { "express": "4.17.1" }, "author": "", "license": "ISC" } 간단하게 expr..
-
Dockerfile과 도커 이미지 만들기백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 29. 21:10
도커 이미지는 컨테이너를 만들기 위해 필요한 설정이나 종속성들을 갖고있는 소프트웨어 패키지이다. 지금까지는 이미 있는 도커 이미지를 Dockerhub에서 가져와서 사용했지만 직접 이미지를 만들수도 있으며 직접 만든 이미지를 Dockerhub에 업로드 할 수도 있다. 도커 이미지 생성 순서 도커 파일 만들기 도커 파일(Docker file)이란? - 도커 이미지를 만들기 위한 설정 파일로 컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의해 주는 파일 도커 파일을 만드는 순서 도커 파일은 도커 이미지를 만들기 위한 설정 파일이므로 도커 이미지가 필요한 것이 무엇인지 생각하는 것이 먼저이다. 도커 이미지는 시작시 실행 될 명령어와 파일 스냅샷이 필요했었다. 베이스 이미지를 명시 (파일 스냅샷에 해당) 추..
-
실행 중인 컨테이너에 명령어 전달 - exec 명령어백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 29. 20:21
이전에는 실행을 할 때 명령어를 입력했지만 이미 실행중인 컨테이너에 명령어를 전달하는 명령어도 많이 쓰인다. docker exec 컨테이너를 하나 실행하고 ps를 이용해서 컨테이너 아이디를 알아온 다음에 docker exec 명령어를 입력하면 된다. docker run alpine ls와 출력이 같지만 docker exec는 실행중인 컨테이너에 명령어를 전달하는 것이기 때문에 많이 사용되는 명령어이다. -it 옵션 -it 명령어를 사용하기 위해 redis 이미지로 컨테이너를 만들었다. redis에 접속하는 명령어는 redis-cli인데, 컨테이너 외부의 클라이언트에서 접근하는 것이기 때문에 에러가 난다. 따라서 docker exec -it redis-cli를 입력해야한다. 여기서 -it interacti..
-
도커 컨테이너의 생명주기백엔드 관련 강의 공부/도커와 CI환경 2023. 12. 29. 20:09
도커 컨테이너의 생명주기 지금까지 사용한 docker run 로 컨테이너 생성을 진행했는데, 생성과 시작으로 나눌 수가 있다. 이후에 중지와 삭제를 하는 명령어도 있다. 생성 : docker create 시작 : docker start 중지 : docker stop 중지(2) : docker kill 삭제 : docker rm 1. 생성 : docker create docker create hello-world 명령어를 사용해서 컨테이너를 만들어줬다. 생성만 하고 시작은 안했기 때문에 시작 시 실행할 명령어가 컨테이너에 들어가지는 않았다. 2. 생성 : docker start 시작을 할 때에는 docker start -a 을 입력한다. 컨테이너 아이디/이름은 전부 다 입력해도 되지만 앞의 몇 글자만 입력..