인덱싱인덱스를 사용하면 효율적으로 쿼리할 수 있다. 인덱스를 사용하지 않는 쿼리를 컬렉션 스캔(collection scan)이라 하며, 서버가 쿼리 결과를 찾으려면 '전체 내용을 살펴봐야 함'을 의미한다. > db.col3.find({ a: 3 }).explain("executionStats"){ explainVersion: '1', queryPlanner: { namespace: 'test.col3', parsedQuery: { a: { '$eq': 3 } }, // ... executionStats: { executionSuccess: true, nReturned: 59, // 반환받은 결과의 개수 executionTi..
MongoDB프로젝트 초기 설계 당시에는 어떤 DB를 사용하는지 결정하게 된다. 이때 시스템의 특성과 요구사항에 따라 관계형 데이터베이스 대신 NoSQL 데이터베이스를 채택하는 주된 이유는 다음과 같다.대규모 데이터셋이나 매우 높은 쓰기 처리량 달성을 관계형 데이터베이스보다 쉽게 할 수 있는 뛰어난 확장성의 필요관계형 모델에서 지원하지 않는 특수 질의 동작관계형 스키마의 제한에 대한 불만과 더욱 동적이고 표현력이 풍부한 데이터 모델에 대한 바람NoSQL 데이터베이스는 이러한 요구사항에 따라 아래와 같이 크게 4가지 유형으로 구분된다. 이 중에서 MongoDB는 문서 지향(Document-oriented) 데이터베이스의 대표적인 예로 다양한 형태의 데이터를 유연하게 저장하고 확장할 수 있는 기능을 제공한..
트랜잭션트랜잭션은 읽기나 쓰기 작업이 가능한 데이터베이스 작업을 하나 이상 포함하는 데이터베이스의 논리적 작업 단위를 의미한다. 데이터베이스 운영 시 여러 도큐먼트에 관한 읽기과 쓰기 작업이 필요한 경우가 많고, 이러한 도큐먼트들은 하나의 컬렉션에 있을 수도 있고, 여러 컬렉션에 분산되어 있을 수 있다.몽고DB는 비관계형 데이터베이스이므로 전통적인 관계형 데이터베이스의 트랜잭션 방식을 그대로 적용할 수 없다. 몽고DB CRUD 블로그에서 설명했듯이 updateOne, findOneAndDelete, findOneAndReplace, findOneAndUpdate 등 Single Document에 대해서는 원자성을 보장한다. 몽고DB의 경우 insertMany처럼 전체 쿼리에 대해 일부 실패하면 그 시점까..
몽고DB CRUD몽고DB는 위 명령행처럼 몽고DB 인스턴스와 상호작용하는 자바스크립트 셸을 제공한다. 셸은 관리 기능이나, 실행 중인 인스턴스를 점검하거나 간단한 기능을 시험하는데 매우 유용하다. 셸은 시작할 때 몽고DB 서버의 test 데이터베이스에 연결하고, 데이터베이스 연결을 전역 변수 db에 할당한다. 따라서 데이터베이스 선택하기 위해서는 use 명령어를 통해 선택할 수 있다. 그리고 셸에서 데이터를 조작하거나 보려면 생성(create), 읽기(read), 갱신(update), 삭제(delete)의 네 가지 기본적인 작업(CRUD)을 할 수 있다. 삽입삽입은 몽고DB에 데이터를 추가하는 기본 방법이다. insertOneinsertOne 함수는 컬렉션에 도큐먼트를 추가한다. 예를 들어, 영화를 저장..
RDBMS vs NoSQL 이 글에서는 RDB와 NoSQL에 대해 알아보기 전에 CAP 이론을 살펴보고, CAP 이론을 통해 RDB와 NoSQL에서는 어떤 속성을 희생했는지에 대해서 살펴보자. CAP 이론 RDBMS와 NoSQL를 살펴볼 때 CAP이론을 살펴보면 좋다. CAP 이론은 분산 시스템에서 위 3가지 속성인 일관성(Consistency), 가용성(Availability), 분할 내성(Partition Tolerance) 중 두 가지만 동시에 보장할 수 있다는 이론이다. 즉, 완벽한 일관성, 가용성, 분할 허용성을 모두 동시에 보장하는 것은 불가능하며 다음 3가지 속성의 특징을 통해 어떠한 상황에서 속성을 희생해야 하는지에 대한 고려를 제공해준다. 하지만 완벽한 CP, AP 시스템은 사용할 수 없..
인덱스인덱스는 여러 가지 방식에서 사용될 수 있다. 예를 들어, 락 관점에서 보면 인덱스가 걸려있지 않은 테이블로 WHERE 조건 검색을 하면 전체 레코드가 락이 걸리는 반면 인덱스를 통해 WHERE 조건 검색을 하면 해당 레코드만 락을 걸어 락을 최소화할 수 있다. 또한 테이블 전체 파일을 읽기 보다는 상대적으로 작은 인덱스 파일을 읽어 더 빠르게 조회를 할 수 있다. 이러한 여러 가지 장점이 있는 인덱스에 대해 알아보고, 인덱스를 사용하는 대신 그에 따른 트레이드 오프가 무엇이 있을지 살펴보자. 인덱스의 데이터 저장방식(알고리즘)데이터 저장방식(알고리즘)별로 구분할 경우 상당히 많은 분류가 가능하지만 대표적으로 B-Tree 인덱스와 Hash 인덱스로 구분할 수 있다.B-Tree 알고리즘은 가장 일반적..
데드락 데드락(Deadlock)은 데이터베이스에서 여러 트랜잭션이 서로가 가진 잠금을 기다리면서 무한정 대기하게 되어 데이터베이스의 작업이 더 이상 진행되지 않는 상황을 의미한다. 멀티 스레드(Multi-threaded) 어플리케이션에서 발생하는 데드락은 해당 어플리케이션을 완전히 멈추게 해버리기 때문에 위험하다. 따라서 데드락이 발생하면 어떻게 대응할 수 있을지를 알아야 한다. 데드락이 발생하면 어플리케이션 단에서 커넥션을 계속 물고 있고, 클라이언트 입장에서는 5초 동안 응답이 안오면 재시도할 가능성이 높다. 그러면 똑같은 레코드에 똑같은 이유로 데드락이 걸릴 확률이 높고, 커넥션 풀의 커넥션이 점점 부족해지는 문제가 발생할 가능성이 높아진다. 실제 데드락 상황이 아닐지라도 락에 대한 대기시간이 설정..
슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그는 데이터베이스 시스템에서 실행 속도가 느린 쿼리를 식별하고 기록하는 로그 시스템을 말한다. 슬로우 쿼리 로그는 다음과 같은 상황에서 사용된다. 성능 튜닝: 데이터베이스의 성능을 향상시키기 위해 느린 쿼리를 식별하고 최적화할 때 사용된다. 문제 진단: 어떤 쿼리가 성능 이슈를 일으키는지 파악하여 해결하는데 도움이 된다. 시스템 감지: 데이터베이스 시스템을 지속적으로 감시하여 성능 저하를 미리 감지할 수 있다. 보통 DBMS의 설정에서 이를 활성화하고 관련된 옵션을 구성할 수 있다. 설정 slow_query_log 시스템 변수를 통해서 on/off할 수 있고, slow_query_log_file 시스템 변수는 슬로우 쿼리 로그 파일 경로를 나타..
트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK 또는 트랜잭션을 ROLLBACK시키는 오류가 발생했을 때)함을 보장해 주는 것이다. MyISAM이나 MEMORY 스토리지 엔진처럼 부분 업데이트 현상이 발생하면 실패한 쿼리로 인해 남은 레코드를 다시 삭제하는 재처리 작업이 필요할 수 있다. 따라서 InnoDB 스토리지 엔진이 지원하는 트랜잭션 기능은 애플리케이션 개발에서 고민해야 할 문제를 줄여주는 아주 필수적인 DBMS의 기능이라..
- Total
- Today
- Yesterday
- pessimistic lock
- 구름톤 챌린지
- Kafka
- NeXTSTEP
- 람다
- 분산 락
- 넥스트스탭
- redis session
- transaction
- 낙관적 락
- jvm 메모리 구조
- 트랜잭션
- annotation
- spring session
- mysql
- spring webflux
- Java
- nginx
- socket
- postgresql
- EKS
- 비관적 락
- TDD
- 구름톤챌린지
- Redisson
- sql
- Synchronized
- mdcfilter
- nginx configuration
- 카프카
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
