분류 전체보기 (32) 썸네일형 리스트형 [Spring Boot] spring.config.import를 사용해 공통 설정 사용 제가 소속되어 있는 부서에서는 RabbitMQ의 Consumer로 사용되는 동일한 Spring Boot 서버(RabbitMQ의 Queue 소비 설정만 다른)가 여러 대 운영되고 있습니다. 스프링 부트 프로젝트는 쉽게 외부 프로퍼티 컨피그 파일을 적용시킬 수 있는데, 일반적으로 src/resources/application.properties 또는 application.yml 파일을 사용합니다. 도커 컨테이너로 배포된 서비스의 경우, 각 서버 별로 프로퍼티 파일이 적용되어 있습니다. 이때 각 서버마다 차별적인 설정을 가지고 있지만, 일부 공통적인 성격의 설정들이 있습니다. 예를 들어, DB 커넥션 정보의 경우 분기마다 사용하는 계정 정보가 변경됩니다. 이러한 공통된 속성을 가진 설정들은 개별 서버의 설.. [Database] MariaDB 쿼리 튜닝으로 Using temporary, Using filesort 개선 후 성능 향상 사례 소개 개요사내 검색 도메인에서 MariaDB에 저장된 raw 데이터를 ElasticSearch에 색인하기 위해 사용되는 쿼리에 대한 성능 개선 사례를 살펴보겠습니다. 기존 쿼리의 소요시간은 약 90초로, 하루에 한 번씩 스케줄링되어 실행되었습니다. 이 정도 소요 시간은 문제가 되지 않았지만, raw 데이터의 크기가 점점 증가하면서 동일한 시간대에 배치 프로세스 수행 시 메모리 및 디스크 부족 현상이 발생하게 되었습니다. 이에 따라 쿼리 튜닝이 필요한 상황이 되었습니다. 문제 분석먼저, 기존 쿼리를 살펴보겠습니다.SELECT m.maker, b.brand, p.prod_name, c.save_count, p.prod_cFROM product p INNER JOIN categ.. [Database] Docker 컨테이너를 사용한 MySQL Master-Slave Replication 구축 및 예제 MySQL에서 제공하는 여러 형태의 복제 솔루션 중, 가장 대표적으로 구성되는 Master-Slave 구조의 Replication입니다. Master에서는 DDL, Select를 제외한 DML을 수행하고 Slave에서는 Select Query만 지원하는 형태로 구축을 하는데, 구성하는 서비스의 성격마다 다르겠지만, 보통 통상적인 어플리케이션의 경우 데이터 조회의 빈도가 훨씬 높습니다. Master 서버와 Slave 서버는 각각 별개의 서버로 구성하게되어 각 서버에 대한 물리적 영향을 최소화합니다. MySQL 마스터 슬레이브는 바이너리 로그를 기반으로 서로간의 데이터를 동기화합니다. 위 아키텍쳐의 순서를 설명드리겠습니다. 1. 데이터 변경에 대한 클라이언트의 요청:마스터 서버에서 커넥션 스레드를 통해 D.. [Database] B tree가 데이터베이스 인덱스로 사용되는 이유 왜 데이터베이스 인덱싱에 B트리 계열이 선호되는가?데이터베이스의 인덱싱에서 B트리 계열이 많이 사용되는 이유를 이해하기 위해서는, 먼저 B트리의 성능 특성과 기본 구조에 대한 이해가 필요합니다. B트리는 검색, 삽입, 삭제 연산에 대해 평균적으로나 최악의 경우에도 O(logN)의 시간 복잡도를 제공합니다. 이는 B트리가 이진 탐색 트리(Binary Search Tree, BST)를 일반화한 형태로, BST의 한계점을 극복하고자 설계된 자료구조임을 의미합니다. BST는 각 노드가 하나의 키를 가지며 최대 두 개의 자녀 노드를 가질 수 있습니다. 하지만, BST는 최악의 경우 선형 리스트와 같은 성능(O(N))을 보일 수 있어, 이를 해결하기 위해 AVL 트리나 레드-블랙 트리와 같은 개선된 자료구조가 개발.. [Database] 함수적 종속성을 활용한 테이블 정규화 과정 정규화(Normalization)란?정규화는 관계형 데이터베이스를 구성하는 과정에서 데이터 중복과 삽입, 갱신, 삭제 이상을 최소화하기 위해 따라야 하는 일련의 규칙입니다. 이 규칙들을 '정규형(Normal Forms)'이라고 부르며, 각 정규형은 특정 조건을 만족해야 합니다. 테이블이 한 정규형을 만족하면 이전 단계의 모든 정규형도 만족한다고 볼 수 있습니다. 일반적으로 실무에서는 주로 3NF(Third Normal Form) 또는 BCNF(Boyce-Codd Normal Form)까지 정규화를 진행합니다. 데이터베이스에서 테이블 내의 튜플들을 고유하게 식별할 수 있게 하는 속성 집합에 대해 여러 용어가 사용됩니다. 이를 명확하게 이해하기 위해 주요 용어들을 다음과 같이 설명할 수 있습니다: 슈.. [Database] 함수적 종속성 (Functional Dependency) 함수적 종속성 (Functional Dependency): 한 테이블의 두 속성 집합 간의 제약 함수적 종속성(Functional Dependency, FD)은 한 테이블에 있는 두 개의 속성 집합(set) 사이의 제약을 나타냅니다. 예를 들어, 다음과 같은 컬럼으로 구성된 Employee 테이블이 있다고 가정해봅시다:emp_idemp_namebirth_datepositionsalarydept_id 이 테이블을 두 개의 속성 집합으로 나눌 수 있습니다: 집합 Xemp_id 집합 Yemp_namebirth_datepositionsalary 이 두 집합 사이에는 어떤 관계가 있을까요? 이 테이블의 특징은 두 튜플의 X 값이 같다면 Y 값도 같다는 점입니다. 이는 emp_id가 각 직원들을 고유하게 식.. PostgreSQL, MySQL 에서의 Lost update 대처 방안 Lost Update란?동시성 제어 문제 중 하나로, 두 개 이상의 트랜잭션이 동일한 데이터를 동시에 읽고 업데이트할 때 발생합니다.이 문제는 한 트랜잭션이 다른 트랜잭션이 한 업데이트를 덮어써서 그 업데이트가 '사라지는' 상황을 초래합니다. 이는 데이터 일관성에 심각한 영향을 미칠 수 있습니다. 관련 포스팅 - 트랜잭션 격리 수준 'read committed' 에서의 lost update 해결 (tistory.com) 앞선 포스팅에서의 Lost Update 대처 방안은 개발자가 직접 FOR UPDATE 등의 구문 없이 제어할 수 있으나, 특수한 경우에서만 사용 가능하고 역설적으로 개발자가 직접 트랜잭션 락을 관리하지 않기 때문에 예상치 못한 문제가 발생할 수 있습니다. 그래서 주로 격리 수준 Repea.. RDBMS에서의 MVCC(MutliVersion Concurrency Control) 도입 배경과 원리 + 예제 MVCC(MultiVersion Concurrency Control) 도입 배경과 원리데이터베이스 시스템에서 동시성 제어는 매우 중요한 이슈입니다. 특히, 고성능을 요구하는 시스템에서는 다수의 트랜잭션이 동시에 이루어지는 상황에서도 안정적인 데이터 처리가 가능해야 합니다. 전통적으로 사용된 락 기반의 동시성 제어 방식은 트랜잭션 간 상호 배제를 통해 데이터의 일관성을 유지하지만, 이는 자원 경합으로 인한 블로킹과 데드락 문제를 초래할 수 있습니다. 이러한 문제를 해결하기 위해 등장한 것이 바로 MVCC(MultiVersion Concurrency Control)입니다. MVCC는 락 기반의 동시성 제어와 달리, 트랜잭션 간의 write-write 관계를 제외하고는 블로킹이 발생하지 않으며, 동시에 처.. 이전 1 2 3 4 다음