일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- mysql
- OS
- BFS
- 운영체제
- 백준
- It
- javascript
- 알고리즘
- 영속성 컨텍스트
- Data structure
- db
- Docker
- 완전탐색
- redis
- 프로그래머스
- websocket
- 플로이드-워셜 알고리즘
- 자료구조
- Algorithm
- 데이터베이스
- PYTHON
- java
- spring
- CSS
- nosql
- HTML
- DFS
- 트랜잭션
- jpa
- CS
- Today
- Total
목록분류 전체보기 (100)
If at first you don't succeed, try again
* 개요저번 글에 lock에 대해 개념과 실습을 진행했었다. [DB] Lock의 개념 및 테스트이번 글에서는 비관적 락과 낙관적 락에 대해 정리할 예정이다.예시는 좋아요 수와 관련하여 들도록 하겠다! * 비관적 락(Pessimistic Lock)비관적 락은 데이터 접근 시에 항상 충돌이 발생할 가능성이 있다고 가정한다.(비관적 관점)데이터를 보호하기 위해 항상 락을 걸어 다른 트랜잭션 접근을 방지한다.다른 트랜잭션은 락이 해제될 때까지 대기하는데, 락을 오래 점유하면 성능 저하 또는 deadlock으로 인한 장애가 발생한다.지난 글에서 살펴봤던 record lock은 비관적 락에 해당한다.비관적 락을 구현할 수 있는 방법은 크게 2가지로 나뉜다. * 비관적 락 - 방법 11. 트랜잭션 시작transact..

* 개요좋아요 수와 관련해서 개발 공부를 진행하다가 동시성 문제에 대해 고민을 하게 되었다.동시성 문제를 처리하는 것에는 다양한 방법이 있는데, 이 중 락(lock)에 대해 공부한 것을 정리하고자 한다. * Record LockRecord(=Row) : 테이블의 행 데이터Lock(잠금) : 여러 프로세스 또는 스레드가 자원에 동시에 접근하는 경쟁 상태를 방지하기 위해 제한을 거는 것Record Lock(=Row Lock) : 레코드에 락을 거는 것, 동일한 레코드를 동시에 조회 또는 수정할 때 데이터의 무결성을 보장하고 경쟁 상태를 방지하고자 하는 것 * Record Lock 테스트lock 테스트를 위한 lock_test 테이블을 만들고, (id = 1234, content = 'test') 레코드를 삽..

* 개요지난번에 순수 websocket을 기반으로 채팅을 구현했었는데, 이번엔 websocket 기반 위에서 동작하는 STOMP를 이용하여 채팅 config 구현을 하고자 한다. * STOMP란?STOMP는 메시지 전송을 위한 간단한 텍스트 기반 프로토콜이다.주로 WebSocket 위에서 동작하는 메시징 프로토콜로 사용된다. * STOMP가 Websocket 위에서 동작하는 이유Websocket은 클라이언트와 서버가 한 번 연결을 맺으면 실시간으로 데이터를 주고받을 수 있다.그리고 별도의 메시지 형식 정의가 없다.즉, websocket은 연결을 제공할 뿐, 어떤 데이터를 어떻게 주고 받을지에 대한 규칙이 없다.STOMP는 websocket 위에서 메시지를 어떻게 다룰지 정해주는 역할을 한다. * 그래서 ..

* 개요얼마 전, Docker로 MySQL 컨테이너를 띄운 후, 데이터베이스에 다량의 데이터를 저장했다.그런데 rm 명령어를 잘못 써서 MySQL 컨테이너가 삭제되는 대참사가 발생했다.컨테이너가 삭제되면서 DB는 물론, 데이터도 다 날아가버렸다...복구 방안이 없나 찾아봤지만, 찾을 수 없었다..Docker Volume을 활용하면 데이터 유실을 방지할 수 있다고 하여 공부 겸 글을 쓰게 되었다. * Docker Volume이란?도커의 볼륨이란 도커 컨테이너에서 데이터를 영속적으로 저장하기 위한 방법이다. 볼륨은 컨테이너 자체의 저장 공간을 사용하지 않고, 호스트 자체의 저장 공간을 공유해서 사용하는 형태이다. * Docker Volume 명령어$ docker run -v [host directory 절대..
* 개요JPA를 공부하다 보니, flush와 commit에 대한 개념이 너무 헷갈렸다.두 개의 작업은 데이터를 데이터베이스에 반영한다는 점에서는 비슷하지만 엄연히 다르다고 한다.이를 정리하기 위해 글을 쓰게 되었다. * flush()란?flush()는 영속성 컨텍스트의 변경사항을 즉시 데이터베이스에 반영(동기화)하는 역할을 한다.즉, 데이터베이스와 영속성 컨텍스트 사이의 스냅샷을 일치시키는 작업이다. - 스냅샷 : 엔티티를 영속성 컨텍스트에 보관할 때, 최초 상태를 복사해서 저장해두는 것 다만, 트랜잭션을 커밋하지는 않는다.이는 에러 발생 시, ROLLBACK이 가능한 단계까지만 반영하는 작업임을 알 수 있다.그리고 flush()가 호출되면 변경된 엔티티가 SQL로 변환되어 실행되지만, 트랜잭션이 끝난 ..

* 개요Springframework의 websocket을 통해서 간단한 채팅을 구현해볼 예정이다. 채팅이 실제로 잘 동작하는지는 Postman을 통해 확인한다. * WebSocketConfig 작성코드를 먼저 작성한 뒤 부연 설명을 하겠다.import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.config.annotation.WebSocketConfigurer;import org.springframework.web.socket.config.annotation...

* 개요타 RDBMS보다 NoSQL인 redis의 속도가 훨씬 빠르다길래 궁금해서 한번 실습을 해보았다.Framework는 Spring Boot를 사용, 더미 데이터는 100만 건을 넣었고, 간단한 게시글 조회로 실습을 진행하였다.조회 속도 확인은 Postman을 통해 진행하였다. * Repository 구현import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.stereotype.Repository;@Repositorypublic inter..

* 개요https://cyr0331.tistory.com/99 [DB] Index 실습(대용량 데이터 처리)* 개요얼마 전 대용량 시스템 공부를 진행하면서, DB에 약 700만건의 테스트 데이터를 삽입하였다.그 후 페이징 처리를 하기 위해서 조회를 하였는데, 다음과 같은 결과가 나왔다.select * from articlecyr0331.tistory.com지난 게시글을 통해 Index 실습을 진행하였다.인덱스를 생성함으로써 약 700만개의 데이터를 조회하는 시간을 17초에서 0.02초로 줄일 수 있었다.그런데 과연 인덱스를 사용함으로써 문제는 전부 다 해결되었을까? * 뒷 페이지 조회문제가 전부 해결됐는지 확인하기 위해 이번엔 50000페이지를 조회해보도록 하겠다.select * from article ..

* 개요얼마 전 대용량 시스템 공부를 진행하면서, DB에 약 700만건의 테스트 데이터를 삽입하였다.그 후 페이징 처리를 하기 위해서 조회를 하였는데, 다음과 같은 결과가 나왔다.select * from article where board_id = 1 order by created_at desc limit 30 offset 90;1번 게시판의 91번 게시글에서 120번 게시글까지 가져오는 데에 17초 이상이 걸린다.실제로 사용자가 페이지를 조회하고자 한다면 불편함을 토로할 것이다.explain 명령어를 통해 쿼리 플랜을 확인해보았다.explain select * from article where board_id = 1 order by created_at desc limit 30 offset 90;쿼리 타..

* HTTPHTTP는 웹 브라우저와 웹 서버 간의 데이터 송수신을 담당하는 프로토콜이다.주로 HTML, JSON, 이미지, 동영상 등 웹 컨텐츠를 전송하는 역할을 한다.기본적으로 TCP/IP 네트워크 위에서 동작하는 프로토콜이다.HTTP는 클라이언트에서 서버로 요청(Request)을 하고 서버가 응답(Response)을 주는 단방향 구조를 가지고 있다. * WebsocketWebsocket은 브라우저와 서버 간의 양방향 통신을 제공하는 프로토콜이다.HTTP와는 다르게 한 번 연결을 맺으면, 지속적으로 데이터를 주고 받을 수 있다.그리고 클라이언트 -> 서버로의 요청이 아니라 클라이언트의 요청 없이도 서버 -> 클라이언트로 정보를 실시간으로 보내줄 수 있다.HTTP 통신이 아니기 때문에 http:// 대신..