Backend
Database
이 주제의 항목 · 19
- 검색엔진의 원리: 역인덱스와 랭킹검색엔진은 문서를 토큰으로 쪼개 단어 → 문서의 역인덱스를 만들고(색인), 질의어를 같은 방식으로 처리해 찾은 뒤 TF-IDF·BM25 같은 점수로 순서를 정한다(질의). 한국어는 형태소 분석이나 N-gram이 필요하다.
- 데이터베이스 샤딩한 DB에 담기 어려울 만큼 커진 데이터를 같은 스키마의 여러 DB로 행 단위로 나누는 샤딩을 정리했다. 샤드 키와 라우팅 방식(모듈러·범위·디렉터리·일관된 해싱·가상 버킷), 샤딩이 어렵게 만드는 것, ShardingSphere 같은 미들웨어, 기존 DB에서 옮겨 올 때의 동기화와 첫 요청 지연까지 다룬다.
- 데이터베이스 확장과 성능 최적화DB가 느려지거나 한계에 닿을 때 싼 것부터 쓰는 수단을 순서대로 정리했다. 인덱스·쿼리 튜닝·커넥션 풀·캐시·구체화된 뷰(갱신 방식)·반정규화·수직 확장·읽기 복제본·파티셔닝(프루닝, 분할 방식, 로컬·글로벌 인덱스)·샤딩의 효과와 대가, 복제 구조(단일 리더·다중 리더·리더 없음)와 동기화 방식, 읽기 복제본 패턴의 복제 지연과 라우팅(애플리케이션 vs 미들웨어)을 다룬다.
- 분산 환경의 고유 ID 생성여러 서버가 동시에 겹치지 않는 ID를 만드는 다섯 가지 방법(UUID, Snowflake, DB 자동 증가, DB 세그먼트, Redis)을 비교하고, 시간순 정렬·64비트·저지연 같은 요구 사항에 따라 어떤 방식을 고를지, 시간순 UUID(UUIDv7)가 인덱스 문제를 어떻게 푸는지 정리했다.
- 블록·파일·오브젝트 스토리지저장 시스템의 세 갈래인 블록·파일·오브젝트 스토리지를 비교하고, 오브젝트 스토리지의 쓰임새, 복제 대신 패리티로 내구성을 얻는 이레이저 코딩, 큰 파일을 조각내 올리는 멀티파트 업로드를 정리했다.
- 와이드 컬럼 DB와 대규모 메시지 저장: Cassandra·ScyllaDBCassandra·ScyllaDB 같은 와이드 컬럼 DB는 파티션 키로 데이터를 노드에 나누고 파티션 안을 클러스터링 키로 정렬해 둔다. 파티션 키·클러스터링 키 모델, 조절 가능한 일관성, LSM 트리 저장 엔진, Cassandra와 ScyllaDB의 차이를 정리하고, 수조 건 메시지를 저장할 때 생기는 핫 파티션을 데이터 서비스 계층의 요청 병합으로 막는 방법과 로컬 SSD와 네트워크 디스크를 RAID로 묶어 디스크 지연을 줄이는 방법을 다룬다.
- 용도별 데이터베이스와 고르는 법OLTP·OLAP·검색·키-값·문서·와이드 컬럼·그래프·시계열·벡터·공간 DB를 「어떤 질문에 답하는 저장소인가」로 나누고, 고르는 순서와 결정 트리, 확장 기능으로 여러 용도를 덮는 PostgreSQL, 컴퓨팅과 저장을 분리한 서버리스 DB, 클라우드 관리형 대응표를 정리했다.
- 웹 검색엔진의 동작: 크롤링, 색인, 랭킹, 질의 처리웹 검색엔진은 크롤러가 링크 그래프를 따라 페이지를 모으고, 중복을 묶어 샤딩된 역인덱스에 넣은 뒤, 질의가 오면 의도를 해석해 후보를 뽑고 여러 랭킹 신호로 순서를 정한다. 크롤러의 URL 프런티어, PageRank, 2단계 랭킹, 구글의 랭킹 시스템과 네이버 통합검색의 컬렉션 구조를 자료구조·알고리즘 관점에서 정리했다.
- 인덱스 설계와 쿼리 튜닝인덱스는 정렬이다. 카디널리티·분포도와 후보 컬럼 고르기, 복합 인덱스 컬럼 순서, 유니크·외래 키 인덱스, 인덱스를 못 타게 만드는 조건, EXPLAIN 접근 유형과 Oracle 인덱스 스캔 방식, 조인 방식(중첩 루프·해시·정렬 병합)과 조인 순서, ORDER BY·GROUP BY·커버링 인덱스, 빠른 쿼리를 위한 체크리스트, NoSQL의 인덱스와 MongoDB의 ESR 규칙까지 정리했다.
- DB 내부 구조: 쿼리 실행과 인덱스 자료 구조SQL 한 문장이 파서·옵티마이저·실행기·버퍼 관리자·트랜잭션·잠금 관리자를 거쳐 처리되는 흐름, Oracle을 예로 본 엔진의 메모리(SGA·PGA)·백그라운드 프로세스·파일 구성과 테이블스페이스→세그먼트→익스텐트→블록의 논리 저장 구조, 그리고 DB가 데이터를 찾는 데 쓰는 자료 구조(B-트리, LSM 트리, 해시, 스킵 리스트, 역색인, R-트리 등)를 정리했다. B-트리는 읽기에, LSM 트리는 쓰기에 강하다.
- DB 커넥션 풀커넥션 풀은 DB 연결을 미리 만들어 빌려주고 돌려받는다. 풀 크기와 처리량의 관계, 대기 시간(maxWait·connectionTimeout)을 짧게 잡아야 장애가 번지지 않는 이유, 유효성 검사와 유휴 연결 정리, DataSource 프록시로 SQL에 출처 주석을 다는 법을 정리했다.
- Elasticsearch 검색: 매핑·분석기·Query DSLElasticsearch로 무엇을 어떻게 찾는지 정리했다. 동적·명시적 매핑과 필드 타입, object와 nested, 분석기(문자 필터·토크나이저·토큰 필터), Query DSL의 질의·필터 문맥과 match·term·range·bool·multi_match, BM25 점수와 부스팅, 집계, 페이지네이션(from·search_after·PIT·scroll), suggester, Painless 스크립트, 벡터 검색과 ES|QL까지 다룬다.
- Elasticsearch와 ELK 스택Elasticsearch는 Lucene 위에 만든 분산 검색·분석 엔진이다. JSON 문서를 역인덱스로 색인해 전문 검색과 집계를 거의 실시간으로 처리한다. 클러스터·노드 역할·샤드·세그먼트 구조, 쓰기 경로와 복제·일관성 모델, 인덱스 템플릿·롤오버·ILM·데이터 티어, 스냅숏 백업, 확장과 튜닝, 모니터링과 장애 진단(429, 디스크 워터마크), 보안, ELK 로그 파이프라인을 정리한다.
- Flyway로 DB 마이그레이션 관리하기스키마 변경을 버전이 붙은 SQL 파일로 기록하고 순서대로 적용하는 오픈소스 DB 마이그레이션 도구 Flyway. 왜 쓰는지, 동작 방식, 실행 방법을 정리한다.
- JPA와 영속성 컨텍스트Java의 ORM 표준인 JPA(Jakarta Persistence)가 객체와 테이블의 패러다임 불일치를 어떻게 메우는지, 영속성 컨텍스트의 1차 캐시·쓰기 지연·변경 감지와 엔티티 상태, N+1 문제의 원인과 해결(페치 조인·배치 크기·엔티티 그래프), 엔티티 설계 관례, 대량 데이터를 읽는 no-offset 배치 리더를 정리한다.
- MongoDB 시작하기와 CRUD문서형 NoSQL인 MongoDB를 Atlas 클라우드에 만들고 접속 설정을 한 뒤, 기본 CRUD 명령과 Mongoose로 다루는 방법. 샤딩 구조(mongos, config server, shard)와 청크·밸런서까지.
- Prisma: 커서로 이전·다음 항목 찾기와 CLINode.js ORM Prisma의 cursor·skip·take로 상세 화면의 이전/다음 항목 키를 조회하는 방법과, 자주 쓰는 Prisma CLI 명령.
- RedisRedis는 메모리에 데이터를 두는 키-값 저장소로, 캐시를 넘어 세션·분산 락·카운터·레이트 리미터·랭킹·큐로 쓰인다. 빠른 이유(메모리, 단일 스레드 이벤트 루프와 I/O 다중화, 효율적인 자료구조), 자료구조별 쓰임, 영속성(RDB·AOF·혼합)과 큰 키의 영향, 만료·교체 정책과 메모리 지표, 트랜잭션(MULTI·WATCH)과 Lua, 복제·센티널·클러스터와 리샤딩, ACL, 장애 진단, Memcached와의 차이를 정리한다.
- SQL 기초SQL 명령어 분류(DDL·DML·DCL)와 테이블 구조 변경과 제약 조건(기본 키·외래 키·CASCADE, 자연 키와 대리 키), 뷰·시퀀스·동의어, 데이터를 생성·조회·수정·삭제하고 조건·정렬·집계·그룹화하는 기본 문법, WHERE와 HAVING·DISTINCT·CROSS JOIN처럼 헷갈리기 쉬운 지점, 서브쿼리(상관 서브쿼리, EXISTS와 NOT IN의 NULL 함정), 저장 프로시저와 PL/SQL(블록, 예외, 커서, BULK COLLECT, 함수·패키지·트리거).