백엔드 관련 강의 공부
-
MongoDB의 배포 형태백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 3. 7. 12:59
Replica Set 하나의 mongoDB를 사용한다고 할 때 db의 점검이 필요하면 서비스를 중단해야하기 때문에 실제 배포를 할 때에는 위와 같이 mongoDB 3개를 띄우고, 하나의 db에 write를 하면 나머지 2개의 mongoDB에 복사가 되는 형태로 배포한다고 한다. 위와 같은 형태를 Replica Set이라고 한다. Replica Set은 HA 솔루션이다. 멈춤 없이 지속적으로 운영되어야 하는 서비스에서의 최소 조건이다. 각각 member는 각각 다른 서버에 띄어져있어야지 요구사항에 일치하는 것이다. member들 중에 하나는 무조건 primary이며, 유일하게 write를 할 수 있다. Secondary는 읽기 상태만 할 수 있고, local database의 Oplog Collection..
-
프론트엔드, 디자인 추가 및 채팅 시스템 완성백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 23. 00:15
프론트엔드와 디자인을 javascript로 완성을 했다. 프론트엔드와 디자인은 강의의 코드를 참조해서 했다. 위의 사진처럼 채팅방에서 대화를 할 수 있다. 자신의 채팅은 오른쪽에 파란색으로 나오며, 자신의 채팅이 아닌 채팅은 왼쪽에 회색으로 나온다. 이번에 공부를 하면서 배운 점은 SSE 프로토콜에 의한 방식이다. HTTP와는 다르게 데이터를 한 번 post하거나 get하는 것으로 끝내는게 아니라 계속해서 데이터를 Flux 형태로 받아와서 사용자간의 채팅 시스템이 이루어질 수 있엇다, 채팅은 웹소켓을 많이 쓰는데 이번에는 웹소켓을 사용하지 않고 SSE 프로토콜과 mongo db를 사용했다. mongo db와 SSE 프로토콜을 사용해서 비동기 통신을 통해 계속해서 데이터를 받아왔다. 창을 2개 띄워놓고 채..
-
mongo db로 채팅에 데이터를 입력백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 22. 20:06
mongo db를 이용해서 데이터를 넣고 조회하는 기능을 해 볼 것이다. application.yml spring: data: mongodb: host: localhost port: 27017 database: chatdb mongo db 설정을 해주는데, 기본 포트가 27017이다. Chat.class @Data @Document(collection = "chat") // mongo db - collection 이름 지정 public class Chat { @Id private String id; private String msg; private String sender; private String receiver; private Integer roomNum; private LocalDateTime c..
-
mongo db를 사용하는 이유백엔드 관련 강의 공부/채팅 시스템 - mongo db 2024. 2. 22. 16:23
프로젝트할 때 가장 많이 사용했던 mysql와 같은 RDBMS의 장점은 테이블 간의 참조로 인한 데이터의 공유이다. Nosql인 mongo db는 컬렉션이 JSON 형태로 저장된다. mongo db에서는 테이블이 아니라 '컬렉션'이라고 한다. mongo db는 컬렉션과 문서라는 용어가 있는데, 문서는 아래의 JSON 형식의 key-value 쌍을 가지는 Binary-JSON 문서이다. 컬렉션은 문서들의 집합이라고 생각하면 된다. user : [ { id : 1, username : aaa, Phone : 010-1111-1111 }, { id : 2, username : bbb, Phone : 010-2222-2222 } ] 문서는 컬렉션에 위와 같은 형태로 저장된다. mongo db는 FK로 인한 외래..
-
redis를 활용한 동시성 문제 해결 - 2. Redisson백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 4. 14:29
Redisson은 pub-sub 기반의 Lock으로 구현된다. pub-sub은 채널을 하나 만들고 lock을 가지고 있는 Thread가 lock을 해제할 때 lock을 획득하려고 하는 Thread에게 message를 보내주는 방식이다. 이번에도 터미널에서 도커환경으로 들어가는데, redis-cli를 2개 킨 사진이다. 왼쪽에서 subscribe ch1로 채널을 만든 다음에 오른쪽에서 ch1에게 hello라고 message를 보내는 방식을 코드로 구현해서 동시성 문제를 해결하겠다. 이전 포스팅에서의 Lettuce는 계속해서 획득을 시도하는 반면에 Redisson은 message가 오는 한 시점에만 획득을 시도하기 때문에 redis의 부하를 줄여준다는 장점이 있다. RedissonLockStockFacade..
-
redis를 활용한 동시성 문제 해결 - 1. Lettuce백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 4. 14:11
Lettuce 라이브러리는 setnx 명령어를 활용하여 분산락을 구현하는 방식이다. setnx 명령어는 key와 value를 set할 때 기존의 값이 없을 때에만 set을 하는 명령어이다. setnx를 이용하는 방식은 spin lock 방식이므로 retry 로직을 개발자가 직접 작성해야 한다. setnx에 대해 설명하기 위해 터미널에서 도커로 docker exec -it redis-cli를 통해 레디스에 접속해서 명령어를 입력했다. setnx 형태로 입력을 했는데, 처음의 setnx 1 lock은 key가 1인 값이 없기 때문에 1을 반환해준다. 그 이후에는 key가 1인 값이 존재하기 때문에 0을 반환해주고, del 1로 삭제한 다음에 setnx 1 lock을 하면 다시 1을 반환해준다. 위의 방식을 ..
-
mysql을 활용한 동시성 문제 해결 - 3. Named Lock백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 16:55
3. Named Lock 이름을 가진 meta data lock이다. 이름을 가진 lock을 획득하고 해제할 때까지 다른 session은 이 lock을 획득할 수 없다. 트랜잭션이 종료될 때 자동으로 lock이 해제되지 않기 때문에 별도의 명령어로 해제해야만 한다. public interface LockRepository extends JpaRepository { // 편의를 위해서 Stock 엔티티를 사용하는데, 실무에서는 data source를 분리해서 사용해야 한다. // 같은 data source를 사용하면 connection pool이 부족해진다. @Query(value = "select get_lock(:key, 3000)", nativeQuery = true) void getLock(Stri..
-
mysql을 활용한 동시성 문제 해결 - 2. Optimistic Lock백엔드 관련 강의 공부/동시성 이슈 - 재고시스템 2024. 2. 3. 16:39
2. Optimistic Lock 실제로 lock을 이용하지 않고 버전을 사용해서 정확성을 맞추는 방법 위의 사진처럼 mysql에 version이 존재한다. 만약에 서버1과 서버2가 version이 1인 데이터를 가져간다고 가정하자. 이후에 서버1이 update를 하면서 version도 하나 올려준다. 다음에 서버 2가 version1인 데이터를 가지고 update를 시도하는데, 이 때의 version은 2이기 때문에 update가 실패하게 된다. 수정사항이 실패했기 때문에 application에서 다시 읽은 다음에 로직을 다시 수행한다. @Entity @Getter public class Stock { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) ..