Database
Database 에 관한 내용을 공유합니다.
-
공부한 내용을 정히라는 블로그와 관련 코드를 공유하는 Github이 있습니다. MongoDB란 MongoDB는 오픈소스 비관계형 데이터베이스 관리 시스템(DMBS)으로, 테이블과 행 대신 유연한 문서를 활용해 다양한 데이터 형식을 처리하고 저장합니다. NoSQL 데이터베이스 솔루션인 MongoDB는 관계형 데이터베이스 관리 시스템(RDBMS)을 필요로 하지 않으므로, 사용자가 다변량 데이터 유형을 손쉽게 저장하고 쿼리할 수 있는 탄력적인 데이터 저장 모델을 제공합니다. MongoDB 문서 또는 문서 컬렉션은 데이터의 기본 단위입니다. 해당 문서들은 이진 JSON(JavaScript 객체 표기법) 형식으로 지정되어 다양한 유형의 데이터를 저장할뿐 아니라, 여러 시스템 전반에 분산 처리될 수 있습니다. Mo..
Spring Data MongoDB공부한 내용을 정히라는 블로그와 관련 코드를 공유하는 Github이 있습니다. MongoDB란 MongoDB는 오픈소스 비관계형 데이터베이스 관리 시스템(DMBS)으로, 테이블과 행 대신 유연한 문서를 활용해 다양한 데이터 형식을 처리하고 저장합니다. NoSQL 데이터베이스 솔루션인 MongoDB는 관계형 데이터베이스 관리 시스템(RDBMS)을 필요로 하지 않으므로, 사용자가 다변량 데이터 유형을 손쉽게 저장하고 쿼리할 수 있는 탄력적인 데이터 저장 모델을 제공합니다. MongoDB 문서 또는 문서 컬렉션은 데이터의 기본 단위입니다. 해당 문서들은 이진 JSON(JavaScript 객체 표기법) 형식으로 지정되어 다양한 유형의 데이터를 저장할뿐 아니라, 여러 시스템 전반에 분산 처리될 수 있습니다. Mo..
2024.06.30 -
공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github가 있습니다. 분산 서버 동시성 제어 ApiGateway로 인해 여러 서버로 분산된 요청들이 DB의 같은 자원에 접근해서 수정하게 되는 경우, 최종적으로 커밋된 데이터의 형태로 자원이 저장되게 됩니다. 예를 들어, A 요청이 먼저 들어와서 1이라는 자원을 수정하고 있는데, B요청이 들어와서 A보다 먼저 자원을 수정하고 커밋하고 이후에 A가 커밋하게 된다면 최종적으로는 A에서 커밋한 데이터가 반영되게 되면서 정합성이 깨지게 됩니다. 분삭락을 사용하게 되는 경우, 가장 먼저 들어온 요청이 락을 획득하여 작업을 처리하기 때문에 이후 들어온 요청은 락을 획득하기까지 기다리고 이전 작업이 락을 해제해야만 다음 요청이 락을 획득하여 작업을 처리할 수..
Reactive 환경에서 Redisson 분산락 적용하기공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github가 있습니다. 분산 서버 동시성 제어 ApiGateway로 인해 여러 서버로 분산된 요청들이 DB의 같은 자원에 접근해서 수정하게 되는 경우, 최종적으로 커밋된 데이터의 형태로 자원이 저장되게 됩니다. 예를 들어, A 요청이 먼저 들어와서 1이라는 자원을 수정하고 있는데, B요청이 들어와서 A보다 먼저 자원을 수정하고 커밋하고 이후에 A가 커밋하게 된다면 최종적으로는 A에서 커밋한 데이터가 반영되게 되면서 정합성이 깨지게 됩니다. 분삭락을 사용하게 되는 경우, 가장 먼저 들어온 요청이 락을 획득하여 작업을 처리하기 때문에 이후 들어온 요청은 락을 획득하기까지 기다리고 이전 작업이 락을 해제해야만 다음 요청이 락을 획득하여 작업을 처리할 수..
2024.06.29 -
공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다.R2DBC란? R2DBC(Reactive Rela tional Database Connectivity)는 드라이버 공급업체가 관계형 데이터베이스에 액세스 하기 위해서 구현한 리액티브 API를 선언하는 API 명세입니다. R2DBC가 만들어진 이유 중 하나는 적은 스레드로 동시성을 처리하기 위해, 더 적은 하드웨어 리소스로 확장할 수 있는 논-블로킹 애플리케이션 스택이 필요해서 입니다. JDBC는 완전한 블로킹 API 이기 때문에, 표준화된 관계형 데이타베이스 액세스 API(즉, JDBC)를 재이용하더라도 이 요구를 충족할 수가 없습니다. ThreadPool를 사용하여 블로킹 동작을 비슷하게 구현할 수도 있지만 이는 제약 사항이 ..
Spring R2DBC 다양한 쿼리 사용 방법 (feat. kotlin)공부한 내용을 정리하는 블로그와 관련 코드를 공유하는 Github이 있습니다.R2DBC란? R2DBC(Reactive Rela tional Database Connectivity)는 드라이버 공급업체가 관계형 데이터베이스에 액세스 하기 위해서 구현한 리액티브 API를 선언하는 API 명세입니다. R2DBC가 만들어진 이유 중 하나는 적은 스레드로 동시성을 처리하기 위해, 더 적은 하드웨어 리소스로 확장할 수 있는 논-블로킹 애플리케이션 스택이 필요해서 입니다. JDBC는 완전한 블로킹 API 이기 때문에, 표준화된 관계형 데이타베이스 액세스 API(즉, JDBC)를 재이용하더라도 이 요구를 충족할 수가 없습니다. ThreadPool를 사용하여 블로킹 동작을 비슷하게 구현할 수도 있지만 이는 제약 사항이 ..
2024.05.06 -
샤드 운영 전략 샤드는 다음과 같은 옵션으로 개수를 설정할 수 있습니다. number_of_shard : 프라이머리 샤드 개수 number_of_replicas : 레플리카 개수 만약 인덱스에 위 옵션을 3, 2로 지정했다면 해당 인덱스는 프라이머리 샤드 3개에 대한 복제본이 2개씩 생기므로 프라이머리 3개, 레플리카 6개로 총 9개의 샤드가 생성됩니다. number_of_shard는 인덱스가 데이터를 몇 개의 샤드로 쪼갤 것인지를 지정하는 값이므로 신중하게 설계해야 합니다. 한 번 지정하면 reindex 같은 동작을 통해 인덱스를 통째로 재색인하는 등 특별한 작업을 수행하지 않는 한 바꿀 수 없기 때문입니다. 샤드 개수를 어떻게 지정하느냐는 엘라스틱서치 성능에도 영향을 미칩니다. 클러스터에 샤드 숫자가..
Elasticsearch - 샤드, 인덱스 운영 전략샤드 운영 전략 샤드는 다음과 같은 옵션으로 개수를 설정할 수 있습니다. number_of_shard : 프라이머리 샤드 개수 number_of_replicas : 레플리카 개수 만약 인덱스에 위 옵션을 3, 2로 지정했다면 해당 인덱스는 프라이머리 샤드 3개에 대한 복제본이 2개씩 생기므로 프라이머리 3개, 레플리카 6개로 총 9개의 샤드가 생성됩니다. number_of_shard는 인덱스가 데이터를 몇 개의 샤드로 쪼갤 것인지를 지정하는 값이므로 신중하게 설계해야 합니다. 한 번 지정하면 reindex 같은 동작을 통해 인덱스를 통째로 재색인하는 등 특별한 작업을 수행하지 않는 한 바꿀 수 없기 때문입니다. 샤드 개수를 어떻게 지정하느냐는 엘라스틱서치 성능에도 영향을 미칩니다. 클러스터에 샤드 숫자가..
2024.02.18 -
집계 엘라스틱서치의 집계는 검색의 연장선입니다. 집계의 대상을 추려낼 검색 조건을 검색 API에 담은 뒤 집계 조건을 추가해서 호출합니다. GET kibana_sample_data_ecommerce/_search { "size": 0, "query": { "term": { "currency": { "value": "EUR" } } }, "aggs": { "my-agg": { "sum": { "field": "taxless_total_price" } } } } 검색 요청 본문에 aggs를 추가하고 size는 0으로 지정했습니다. size를 0으로 지정하면 검색에 상위 매칭된 문서가 무엇인지 받아볼 수 없지만 검색 조건에 매치되는 모든 문서는 집계 작업 대상에 사용됩니다. 집계 작업은 검색 대상을 받아보는 ..
Elasticsearch - 집계 API집계 엘라스틱서치의 집계는 검색의 연장선입니다. 집계의 대상을 추려낼 검색 조건을 검색 API에 담은 뒤 집계 조건을 추가해서 호출합니다. GET kibana_sample_data_ecommerce/_search { "size": 0, "query": { "term": { "currency": { "value": "EUR" } } }, "aggs": { "my-agg": { "sum": { "field": "taxless_total_price" } } } } 검색 요청 본문에 aggs를 추가하고 size는 0으로 지정했습니다. size를 0으로 지정하면 검색에 상위 매칭된 문서가 무엇인지 받아볼 수 없지만 검색 조건에 매치되는 모든 문서는 집계 작업 대상에 사용됩니다. 집계 작업은 검색 대상을 받아보는 ..
2024.02.14 -
단건 문서 API 색인 PUT [인덱스 이름]/_doc/[_id값] // 가장 기본 POST [인덱스 이름]/_doc PUT [인덱스 이름]/_create/[_id값] POST [인덱스 이름]/_create/[_id값] PUT의 경우 요청 본문에 담아 보낸 JSOPN 문서를 지정된 인덱스와 _id값으로 색인을 시도합니다. 만약 같은 _id값을 가진 문서가 있다면 덮어씌웁니다. 반면에 POST 메서드는 _id값을 지정하지 않고 색인을 요청할 경우에 사용합니다. 이 경우에는 랜덤한 _id값이 지정됩니다. _create이 경로에 들어가는 API는 항상 새로운 문서 생성만을 허용하고 덮어씌우면서 색인하는 것은 금지합니다. 조회 GET [인덱스 이름]/_doc/[_id값] 조회 API는 문서 단건을 조회합니다. ..
Elasticsearch - 검색 API단건 문서 API 색인 PUT [인덱스 이름]/_doc/[_id값] // 가장 기본 POST [인덱스 이름]/_doc PUT [인덱스 이름]/_create/[_id값] POST [인덱스 이름]/_create/[_id값] PUT의 경우 요청 본문에 담아 보낸 JSOPN 문서를 지정된 인덱스와 _id값으로 색인을 시도합니다. 만약 같은 _id값을 가진 문서가 있다면 덮어씌웁니다. 반면에 POST 메서드는 _id값을 지정하지 않고 색인을 요청할 경우에 사용합니다. 이 경우에는 랜덤한 _id값이 지정됩니다. _create이 경로에 들어가는 API는 항상 새로운 문서 생성만을 허용하고 덮어씌우면서 색인하는 것은 금지합니다. 조회 GET [인덱스 이름]/_doc/[_id값] 조회 API는 문서 단건을 조회합니다. ..
2024.02.13 -
ElasticSearch 기본 콘셉트 루씬은 데이터를 색인하고 검색하는 기능을 제공하는 검색 엔진의 코어 라이브러리입니다. 엘라스틱서치는 루씬을 코어로 이용하여 JSON 문서의 저장, 색인, 검색 등의 작업을 분산 처리하는 검색 엔진입니다. 검색 엔진 단순한 텍스트 매칭 검색이 아닌 전문 검색이 가능하며 다양한 종류의 검색 쿼리를 지원합니다. 검색 엔진이기 때문에 역색인을 사용하여 검색 속도도 매우 빠르며, 다양한 애널라이저를 조합하여 요구사항에 맞는 색인을 구성할 수 있고 형태소 분석도 가능합니다. 분산 처리 데이터를 여러 노드에 분산 저장하여 검색이나 집계 작업 등을 수행할 때도 분산 처리를 지원합니다. 고가용성 제공 클러스터를 구성하고 있는 일부 노드에 장애가 발생해도 복제본 데이터를 이용해 중단 ..
Elasticsearch - 기본 콘셉트와 구조도ElasticSearch 기본 콘셉트 루씬은 데이터를 색인하고 검색하는 기능을 제공하는 검색 엔진의 코어 라이브러리입니다. 엘라스틱서치는 루씬을 코어로 이용하여 JSON 문서의 저장, 색인, 검색 등의 작업을 분산 처리하는 검색 엔진입니다. 검색 엔진 단순한 텍스트 매칭 검색이 아닌 전문 검색이 가능하며 다양한 종류의 검색 쿼리를 지원합니다. 검색 엔진이기 때문에 역색인을 사용하여 검색 속도도 매우 빠르며, 다양한 애널라이저를 조합하여 요구사항에 맞는 색인을 구성할 수 있고 형태소 분석도 가능합니다. 분산 처리 데이터를 여러 노드에 분산 저장하여 검색이나 집계 작업 등을 수행할 때도 분산 처리를 지원합니다. 고가용성 제공 클러스터를 구성하고 있는 일부 노드에 장애가 발생해도 복제본 데이터를 이용해 중단 ..
2024.02.11 -
order by 처리(using filesort) 정렬을 처리하는 방법은 인덱스를 이용하는 방법과 쿼리가 실행될 때 Filesort라는 별도의 처리를 이용하는 방법으로 나눌 수 있다. 인덱스 이용 장점 insert, update, delete 쿼리가 실행될 때 이미 인덱스가 정렬돼 있어서 순서대로 읽기만 하면 되므로 매우 빠름 단점 insert, update, delete 작업 시 부가적인 인덱스 추가/삭제 작업이 필요하므로 느리다. 인덱스 때문에 추가 디스크 공간이 필요하고 늘어날수록 innoDB의 버퍼 풀을 위한 메모리가 많이 필요하다. filesort 이용 장점 인덱스를 생성하지 않아도 되므로 인덱스를 이용할 때의 단점이 장점으로 바뀐다. 정렬해야 할 레코드가 많지 않으면 메모리에서 filesort..
MySQL 8.0 쿼리와 인덱스 처리 방식order by 처리(using filesort) 정렬을 처리하는 방법은 인덱스를 이용하는 방법과 쿼리가 실행될 때 Filesort라는 별도의 처리를 이용하는 방법으로 나눌 수 있다. 인덱스 이용 장점 insert, update, delete 쿼리가 실행될 때 이미 인덱스가 정렬돼 있어서 순서대로 읽기만 하면 되므로 매우 빠름 단점 insert, update, delete 작업 시 부가적인 인덱스 추가/삭제 작업이 필요하므로 느리다. 인덱스 때문에 추가 디스크 공간이 필요하고 늘어날수록 innoDB의 버퍼 풀을 위한 메모리가 많이 필요하다. filesort 이용 장점 인덱스를 생성하지 않아도 되므로 인덱스를 이용할 때의 단점이 장점으로 바뀐다. 정렬해야 할 레코드가 많지 않으면 메모리에서 filesort..
2024.01.01 -
쿼리튜닝을 위한 인덱스 특징(innoDB, B-Tree) 인덱스는 정렬되어 있다. 왼쪽 컬럼인 column_1 순으로 먼저 정렬되고, column_1이 같다면 column_2 순으로 정렬된다. 따라서 인덱스를 기준으로 조회한 데이터는 인덱스 컬럼 순으로 정렬되어 있다. 인덱스는 스캔하는 방식으로 처리된다. 중간중간 데이터를 읽는 것이 아니라, 시작지점을 잡고 종료지점까지 쭉 스캔한다. 인덱스는 메모리 위에 존재한다. column_1 = 'A'인 레코드 중에 column_3 이 필요하다면? 실제 column_1 = 'A'인 레코드를 모두 가져온 다음 물리 주소를 파악해서 물리 주소를 기반으로 디스크에서 값을 가져온다. 모든 컬럼 값을 인덱스에 올려놓을 수는 없기 때문에 성능적으로 타협하면서 세팅해야 한다...
MySQL 실행계획 보는 방법쿼리튜닝을 위한 인덱스 특징(innoDB, B-Tree) 인덱스는 정렬되어 있다. 왼쪽 컬럼인 column_1 순으로 먼저 정렬되고, column_1이 같다면 column_2 순으로 정렬된다. 따라서 인덱스를 기준으로 조회한 데이터는 인덱스 컬럼 순으로 정렬되어 있다. 인덱스는 스캔하는 방식으로 처리된다. 중간중간 데이터를 읽는 것이 아니라, 시작지점을 잡고 종료지점까지 쭉 스캔한다. 인덱스는 메모리 위에 존재한다. column_1 = 'A'인 레코드 중에 column_3 이 필요하다면? 실제 column_1 = 'A'인 레코드를 모두 가져온 다음 물리 주소를 파악해서 물리 주소를 기반으로 디스크에서 값을 가져온다. 모든 컬럼 값을 인덱스에 올려놓을 수는 없기 때문에 성능적으로 타협하면서 세팅해야 한다...
2023.12.31 -
AttributeConverter AttributeConverter는 주로 다음과 같은 상황에서 사용됩니다. JPA가 지원하지 않는 타입을 매핑 두 개 이상의 속성을 갖는 밸류 타입을 한 개 칼럼에 매핑 JPA가 지원하지 않는 타입을 매핑 public interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y dbData); } X : 엔티티의 속성에 대응하는 타입 Y : DB에 대응하는 타입 convertToDatabaseColumn 엔티티의 X 타입 속성을 Y 타입의 DB 데이터로 변환합니다. 엔티티 속성을 DB에 반영할 때 사용됩니다. convertTo..
JPA - AttributeConverterAttributeConverter AttributeConverter는 주로 다음과 같은 상황에서 사용됩니다. JPA가 지원하지 않는 타입을 매핑 두 개 이상의 속성을 갖는 밸류 타입을 한 개 칼럼에 매핑 JPA가 지원하지 않는 타입을 매핑 public interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y dbData); } X : 엔티티의 속성에 대응하는 타입 Y : DB에 대응하는 타입 convertToDatabaseColumn 엔티티의 X 타입 속성을 Y 타입의 DB 데이터로 변환합니다. 엔티티 속성을 DB에 반영할 때 사용됩니다. convertTo..
2023.12.31 -
Index란? 인덱스란 (검색을 위해) 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것 입니다. 인덱스를 사용하게 되면 데이터 추가, 수정, 삭제의 성능을 희생하고 대신 조회의 성능을 향상 시킵니다. 여기서 주의할 것은 update, delete 행위가 느린것이지 update, delete를 하기 위해 해당 데이터를 조회하는 것은 인덱스가 있으면 빠르게 조회 됩니다. Clustered Index vs Non-Clustered Index 인덱스 종류에는 clustered와 Non-Clustered 두 가지가 있습니다. MySQL의 InnoDB엔진에서는 인덱스가 B-Tree(균형 트리) 자료구조로 구성되어 있습니다. Cluster Index(클러스터형 인덱스) 한 테이블당 1개 (Prima..
MySQL 인덱스Index란? 인덱스란 (검색을 위해) 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것 입니다. 인덱스를 사용하게 되면 데이터 추가, 수정, 삭제의 성능을 희생하고 대신 조회의 성능을 향상 시킵니다. 여기서 주의할 것은 update, delete 행위가 느린것이지 update, delete를 하기 위해 해당 데이터를 조회하는 것은 인덱스가 있으면 빠르게 조회 됩니다. Clustered Index vs Non-Clustered Index 인덱스 종류에는 clustered와 Non-Clustered 두 가지가 있습니다. MySQL의 InnoDB엔진에서는 인덱스가 B-Tree(균형 트리) 자료구조로 구성되어 있습니다. Cluster Index(클러스터형 인덱스) 한 테이블당 1개 (Prima..
2023.12.30 -
MySQL 아키턱처 MySQL 접속 클라이언트 대부분의 프로그래밍 언어에 대한 접속 API 제공 쉘 스크립트를 통해 접속 가능 MySQL 엔진 클라이언트 접속과 SQL 요청 처리 담당 쿼리 파서, 전처리기, 옵티마이저(요청된 SQL문을 최적화해서 실행하기 위한 실행계획을 짜는 역할), 실행 엔진 등으로 구성 MySQL 스토리지 엔진 데이터를 실제로 디스크에 저장하거나 읽어오는 역할 옵티마이저가 작성한 실행 계획에 따라서 적절히 실행 MySQL 엔진이 스토리 엔진을 호출할 때 사용하는 API를 핸들러 API라고 함 운영체제, 하드웨어 실제 테이블 데이터와 로그 데이터를 파일로 저장하는 부분 쿼리 실행 과정 사용자가 SQL 요청을 MySQL로 보냅니다. 가장 먼저 쿼리 캐시를 만나는데 쿼리 캐시는 쿼리 요청..
MySQL 아키텍처MySQL 아키턱처 MySQL 접속 클라이언트 대부분의 프로그래밍 언어에 대한 접속 API 제공 쉘 스크립트를 통해 접속 가능 MySQL 엔진 클라이언트 접속과 SQL 요청 처리 담당 쿼리 파서, 전처리기, 옵티마이저(요청된 SQL문을 최적화해서 실행하기 위한 실행계획을 짜는 역할), 실행 엔진 등으로 구성 MySQL 스토리지 엔진 데이터를 실제로 디스크에 저장하거나 읽어오는 역할 옵티마이저가 작성한 실행 계획에 따라서 적절히 실행 MySQL 엔진이 스토리 엔진을 호출할 때 사용하는 API를 핸들러 API라고 함 운영체제, 하드웨어 실제 테이블 데이터와 로그 데이터를 파일로 저장하는 부분 쿼리 실행 과정 사용자가 SQL 요청을 MySQL로 보냅니다. 가장 먼저 쿼리 캐시를 만나는데 쿼리 캐시는 쿼리 요청..
2023.12.30