목록CS (24)
아무튼, 쓰기
1. PostgreSQL 소개 PostgreSQL은 강력한 오픈소스 객체-관계형 데이터베이스 시스템입니다. MySQL이 주로 관계형 데이터베이스(RDBMS)에 초점을 맞추는 것과 달리, PostgreSQL은 객체 지향 및 관계형 기능을 모두 지원하여 더 넓은 범주의 데이터 타입을 처리할 수 있는 유연성을 제공합니다.2. PostgreSQL 아키텍처2.1 주요 프로세스MySQL이 mysqld 단일 프로세스 아래 여러 스레드로 동작하는 것과 유사하게, PostgreSQL도 Postmaster 프로세스를 중심으로 여러 백그라운드 프로세스와 클라이언트 연결을 처리하는 프로세스로 구성됩니다.Postmaster 프로세스: MySQL의 mysqld와 같이, PostgreSQL 인스턴스가 시작될 때 가장 먼저 기동되는..
애플리케이션의 성능을 좌우하는 캐시! 데이터를 어떻게 읽고 쓸지에 대한 전략을 명확히 이해하는 것이 매우 중요합니다. 가장 대표적인 읽기/쓰기 전략 전부를 구체적인 예시와 함께 설명해 드리겠습니다.🧠 캐시 읽기 전략데이터를 어떻게 읽어올 것인가에 대한 정책입니다.1. Look-Aside (Lazy Loading) - "게으른 전략"가장 흔하게 사용되는 패턴입니다. 이름처럼 데이터가 필요해지는 시점에 캐시를 옆에 두고(Aside) 데이터를 가져옵니다.동작 흐름:애플리케이션이 캐시에 데이터를 요청합니다.(Cache Hit) 데이터가 있으면, 바로 가져와 사용합니다.(Cache Miss) 데이터가 없으면, 애플리케이션이 직접 데이터베이스(DB)에서 데이터를 읽어옵니다.읽어온 데이터를 애플리케이션이 캐시에 저..
HTTP 프로토콜의 Connectionless와 Stateless 특성 때문에, 사용자가 로그인해도 서버는 상태를 기억하지 않습니다. 즉, 로그인 이후 매 요청마다 다시 인증 정보를 보내지 않으면 인증된 상태를 유지할 수 없습니다.하지만 실제 웹 애플리케이션에서는 로그인을 한 번 하면 이후 여러 페이지에서 반복 로그인을 하지 않아도 접속이 유지됩니다. 그 이유는 인증 정보를 클라이언트 혹은 서버에 저장하고 매 요청마다 인증 정보를 포함시키기 때문입니다. 그것이 어떻게 가능한지 살펴보겠습니다.인증방식을 세션과 쿠키와 JWT로 나누어서 이해하기에는 다소 이해가 힘들어 인증정보 저장방식과 전달 정보로 나누어 글을 작성하였습니다.먼저 인증정보 저장공간에는 클라이언트의 sessionStorage, localSto..
이 글은 레디스 명령어와 같은 단순한 정보가 아닌 레디스를 깊게 공부하기 위한 핵심들을 중점으로 작성하였습니다. 부족한 부분이 보인다면 부담 없이 피드백 주세요!1. NoSQL-레디스레디스는 NoSQL 데이터베이스의 한 종류입니다. 면접에서 "NoSQL의 특징이 무엇인가"와 같은 질문을 자주 접하지만, 사실 더 중요한 질문은 "언제 NoSQL을 써야 하는가"가 아니라, "우리 서비스의 특정 요구사항에 맞는 '어떤' NoSQL 데이터베이스를 써야 하는가" 입니다. NoSQL은 관계형 데이터베이스(RDBMS)가 아닌 다양한 데이터베이스를 **통칭**하며, 각기 다른 설계 목적과 강점을 가집니다.데이터 모델 (Data Model): 가장 중요합니다. 저장하려는 데이터의 형태와 접근 방식이 어떤 모델에 가장 잘..
1. 직렬화(Serialization)란?직렬화는 자바 객체를 저장하거나 네트워크로 전송할 수 있는 형태로 변환하는 과정입니다. 이 과정에서 객체는 일련의 바이트 스트림으로 변환됩니다.레디스 직렬화를 이야기 하기 앞선 직렬화에 대해서 정리하겠습니다. 저는 직렬화를 객체를 Json 으로 변환하는 것이라고 생각하였습니다. 그런데 StringRedisSerializer 는 다른 JsonRedisSerializer 들과 이름이 구별됩니다. 그렇다면 제가 직렬화의 정의를 잘못알고 있는 거 아닐까라는 생각에 직렬화의 정의를 다시 살펴봤습니다.직렬화(Serialization)는 객체(Object)의 상태를 저장하거나 전송하기 위해 바이트 스트림으로 변환하는 과정을 말합니다.즉, 직렬화 결과는 Json 뿐만 아니라 언..
Bitset이란BitSet은 비트를 효율적으로 저장하고 조작할 수 있는 자료구조입니다.Bitset 사용 이유1. 메모리 효율boolean[]은 실제로는 한 요소당 1바이트 이상 사용되지만,BitSet은 64개의 비트를 long 1개에 담아 8바이트로 처리합니다.👉 즉, 대량의 true/false 값을 다룰 때 훨씬 가볍습니다.2. 성능비트 연산 (|, &, ^)을 통해 대량의 boolean 값을 한 번에 계산할 수 있어 빠릅니다.예: bitset1.and(bitset2) → 배열 전체를 순회하면서 동시에 AND 처리3. 개발자 실수 줄여줌Java는 정수 타입을 이용한 직접적인 비트 연산보다 BitSet을 사용할 때 더 읽기 쉽고 안전한 코드를 작성할 수 있게 해줍니다.컴파일러가 bitIndex 음수 체..
1. 개요옵티마이저는 MYSQL에서 최적의 쿼리 실행계획을 수립하는 기능입니다.1.1 쿼리 실행 절차SQL파서: 사용자로부터 요청된 SQL 문장을 쪼개서 MYSQL 서버가 이해할 수있는 수준으로 분리(파스 트리)합니다.옵티마이저: 파싱 정보를 보면서 어떤 테이블부터 읽을지, 어떤 인덱스를 이용해 테이블을 이용해 읽을지 선택합니다.MYSQL 엔진, 스토리지 엔진: 두 번째 단계에서 결정된 테이블의 읽기 순서나 선택된 인덱스를 이용해 스토리지 엔진으로부터 데이터를 가져옵니다.1.2 옵티마이저의 종류옵티마이저는 테이터 베이스 서버에서 두뇌와 같은 역할을 담당합니다.규칙 기반 최적화(RBO, Rule-Based Optimizer)초기 버전에 많이 사용내장된 우선순위에 따라 실행 계획 수립통계 정보(테이블의 레코..
옵티마이저가 항상 좋은 실행 계획을 만들어낼 수 있는 것은 아닙니다.그렇기 때문에 DBMS 서버에서는 이를 보완할 수 있도록 EXPLAIN 명령으로 옵티마이저가 수립한 실행 계획을 확인할 수 있습니다.1. 통계 정보MySQL 5.7 까지는 테이블과 인덱스에 대한 정보를 가지고 실행 계획을 수립했습니다.MySQL 8.0 부터는 인덱스되지 않은 칼럼들에 대해서도 데이터 분포도를 수집해서 저장하는 히스토그램 정보가 도입됐습니다.1.1 테이블 및 인덱스 통계 정보MySQL 서버의 통계 정보 MySQL 5.5 버전 까지는 각 테이블의 통계 정보가 메모리에서만 관리되어서 서버 재시작시 모두 사라졌습니다.이후의 버전에서는 각 테이블의 통계 정보를 mysql 데이터베이스의 innodb_index_stats 테이블과 i..
대표적인 동시성 제어 방식으로 MVCC(Multi-Version Concurrency Control) 와 Lock-Based Concurrency Control이 있습니다.1. MVCC(Multi-Version Concurrency Control/ 잠금 없는 읽기)MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다. 각 트랜잭션은 자신만의 일관된 스냅샷(MySQL::언두 로그)을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다.데이터의 각 버전을 유지하여 읽기 작업이 쓰기 작업과 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다.또한 읽기 작업..