데이터 용어집
데이터 분야의 개념 93개를 한 장에 모았습니다. 객체-테이블 매핑 · 검색 사전 · 격리 수준 · 노출 · 클릭 원장 등 — 코드베이스에서 뽑아 뜻과 관계를 정리했습니다.
- 객체-테이블 매핑
- 코드의 객체와 DB 의 행을 오가게 한다. ORM 이 SQL 을 대신 만들지만, 언제 몇 번의 쿼리가 나가는지는 여전히 개발자가 알아야 한다
- 검색 사전
- 동의어 · 사용자 사전 · 스톱워드. 원천 코드표에서 유도하면 손으로 안 쓴다
- 격리 수준 (isolation level, 트랜잭션 격리 수준)
- 동시에 도는 트랜잭션이 서로의 변경을 얼마나 보는지 고르는 설정. READ UNCOMMITTED · READ COMMITTED · REPEATABLE READ(MySQL 기본) · SERIALIZABLE 순으로 이상 현상이 줄고 동시성이 준다
- 노출 · 클릭 원장
- 대상 × 동작 두 축(entity_type · action)과 계층 위치(screen · section · item_index)로 남긴 노출과 클릭. 온라인 학습과 CTR 지표의 유일한 원천
- 단어 비용
- 사전 항목마다 붙은 비용. 낮을수록 그 분해를 선호한다. 사용자 사전 항목은 −100000 으로 고정돼 경쟁 없이 이긴다
- 더티 리드 (dirty read)
- 다른 트랜잭션이 아직 커밋하지 않은 변경을 읽는 것. 그 트랜잭션이 롤백하면 존재한 적 없는 값을 본 셈이 된다
- 데이터 분산
- 한 대에 담기지 않거나 한 대가 죽으면 안 되는 데이터를 여러 노드에 나누고 복제한다
- 데이터 저장 (persistence, 영속성, 데이터베이스)
- 애플리케이션이 데이터를 잃지 않고, 동시에 고쳐도 깨지지 않고, 빨리 읽히게 저장하는 일. 저장소 선택 · 관계형 DB · 인메모리 저장소 · 데이터 접근과 캐시 · 분석용 저장으로 나눠 읽는다
- 데이터 파이프라인 (bulk API)
- 원천 전량으로 새 색인을 만들고 별칭을 한 번에 옮긴다. 덜 찬 색인이 라이브가 되지 않게 교체 전에 건수 · 실패율을 잰다
- 동의어 사전
- 다른 말을 같은 것으로 묶는다. 양방향(A, B)과 한 방향(A ⇒ B) 규칙이 있다
- 랭킹 피처
- 리랭커가 보는 값 — 융합 점수 · 제목 일치 · 의도 일치 · 문서 완성도. 학습 피처와 서빙 피처가 같아야 한다. 서빙에서 못 얻는 값은 학습에서도 뺀다
- 레플리케이션 (replication, 복제)
- 같은 데이터를 여러 노드에 복제해 가용성과 읽기 성능을 높인다. 누가 쓰기를 받는지(단일 리더·다중 리더·리더 없음)와 언제 응답하는지(동기·비동기)로 갈린다
- 매핑 · 필드 타입 (mapping, schema)
- 필드마다 keyword · text · knn_vector 같은 타입을 정한다
- 모델 스탬프
- 벡터 공간 식별자. 모델이나 차원이 바뀌면 옛 벡터와 섞이지 않게 한다
- 문맥 ID (left-id · right-id)
- 사전 항목의 좌·우 문맥 ID. 품사 계열과 받침 유무로 정해지며(left-id.def · right-id.def) 연접 비용표의 행·열 키다
- 문서 임베딩
- 문서를 벡터로 바꿔 색인에 싣는다. 오프라인 배치로 미리 계산한다
- 반복 불가능한 읽기 (non-repeatable read, read skew)
- 한 트랜잭션 안에서 같은 행을 두 번 읽었는데 그 사이 다른 커밋 때문에 값이 달라지는 것
- 버전 마이그레이션 (schema migration, DB 마이그레이션)
- V1, V2 … 순번이 붙은 SQL 을 한 번씩만 적용하고 적용 이력을 스키마 이력 테이블에 남긴다. 적용된 파일은 체크섬으로 잠기므로 고치지 않고 새 버전을 더한다
- 벡터 양자화 (vector compression, 벡터 압축)
- 저장된 벡터를 더 적은 비트로 눌러 상주 메모리를 줄인다. 스칼라(차원마다 정수로) · 이진(부호만) · 곱 양자화(부분 벡터를 코드북으로) 세 계열이 있다. 모델 가중치 양자화와 다른 축이고, 정밀도 손실은 재채점으로 메운다
- 벡터 캐시 · 원장
- 만든 쿼리 벡터를 저장해 같은 검색어를 다시 인코딩하지 않는다
- 벡터 필드 (knn_vector, dense_vector)
- 벡터를 담는 필드와 그 근사 탐색 구조. 비용은 계산이 아니라 메모리 접근이다 — 방문한 노드마다 벡터를 무작위 위치에서 읽는다
- 별칭 스왑 (alias, 별칭)
- ES에서 새 인덱스를 미리 빌드하고 별칭을 전환하여 무중단 재색인하는 기법. 교체는 원자적이어야 한다
- 복제 지연 (replication lag)
- 원본에 커밋된 변경이 복제본에 늦게 반영되는 상태. 쓰고 바로 읽는 화면에서 옛 값이 보인다
- 복제 지연 (replication lag)
- 원본에 쓴 값이 복제본에 보이기까지 걸린 시간. 길면 복제본에서 방금 쓴 값이 안 보인다
- 복합 인덱스 (composite index, 다중 컬럼 인덱스, multi-column index)
- 여러 컬럼을 순서대로 묶은 인덱스. 앞 컬럼부터 조건에 쓰여야 탄다. 등치 조건 컬럼을 앞에, 범위 · 정렬 컬럼을 뒤에 둔다
- 복합어 분해 모드
- 복합어를 통째로(none) · 조각만(discard, 기본값) · 둘 다(mixed) 색인할지. 색인과 질의 양쪽이 같아야 통째 토큰이 매칭된다
- 분류 코드 · 태깅
- 필터 축이 되는 분류 코드와 태그
- 분석기 · 토크나이저 (analyzer, analysis chain)
- 텍스트를 토큰으로 가르는 규칙. 문자 필터 → 토크나이저 → 토큰 필터의 사슬이고, 한국어는 형태소 분석기(nori)를 쓴다. 색인과 질의에 같은 분석을 해야 매칭된다
- 사용자 사전
- 분석기가 모르는 고유명사 · 복합어를 한 토큰으로 지정한다
- 새 인덱스 생성 (full reindex, 전체 재색인)
- 기존 색인을 고치지 않고 새 색인을 만든 뒤 별칭을 옮긴다. 전체 재색인은 단순하고 되돌리기 쉽다
- 색인 계약
- 매핑 · 분석기 · 벡터 필드 — 색인이 무엇을 받아들이는지의 정의. 대부분 나중에 못 바꾼다 — 바꾸려면 새 인덱스 + 재색인 + 별칭 교체다
- 샤딩 (sharding, 수평 분할, horizontal partitioning, partitioning)
- 데이터를 샤드 키로 나눠 여러 DB 인스턴스에 수평 분할해 저장한다. 쓰기 처리량과 저장 용량이 한 대를 넘을 때 쓰고, 샤드를 가로지르는 조인·트랜잭션을 잃는다
- 세종 말뭉치
- 21세기 세종계획 말뭉치. 형태소·품사가 사람 손으로 달린 대규모 한국어 코퍼스로, 범용 형태소 분석기 비용의 원천이다. 신문·소설 분포라 도메인 용어는 일반어 조각으로 갈린다
- 스키마 검증 (ddl-auto validate)
- ORM 이 스키마를 만들지 않고 엔티티와 실제 테이블이 맞는지만 기동 시에 확인한다(ddl-auto: validate). 스키마 변경의 책임을 마이그레이션 한 곳에 둔다
- 스키마 변경 관리
- 테이블 구조 변경을 버전이 붙은 스크립트로 남겨 모든 환경에 같은 순서로 적용한다. 큰 테이블은 쓰기를 멈추지 않는 방식으로 바꾸고, 앱과 스키마가 잠시 공존하도록 단계를 나눈다
- 스키마 불일치 (schema drift)
- 환경마다 테이블 구조가 달라지거나 엔티티와 테이블이 어긋난 상태. 손으로 고친 운영 DB, 자동 DDL, 적용 뒤 수정한 마이그레이션에서 생긴다
- 스톱워드 (불용어)
- 검색에 뜻이 없는 말을 뺀다
- 시스템 사전 항목 (mecab-ko-dic)
- 사전 CSV 에 품사 · 비용 · 문맥 ID 를 직접 줘서 비터비 경쟁에 정상 참여시킨다. 기존 항목의 교정 · 삭제가 되는 유일한 층이고, 플러그인을 다시 굽는다
- 엔티티(JPA) (JPA entity, @Entity)
- 테이블 행에 매핑되는 객체. 식별자(@Id)로 구분되고 영속성 컨텍스트가 상태를 추적한다
- 역인덱싱 (inverted index, 역색인)
- 단어→문서 매핑으로 전문 검색을 가능하게 하는 인덱스 구조. 정렬된 텀 사전과 텀마다의 포스팅 리스트로 이뤄진다
- 연접 비용 (matrix.def)
- 앞 단어의 우 문맥 ID 와 뒤 단어의 좌 문맥 ID 로 행렬(matrix.def)에서 찾는 이음 비용. 「명사 뒤에 조사」 같은 품사 연쇄의 자연스러움을 값으로 갖는다
- 영속성 컨텍스트 (persistence context, 1차 캐시, first-level cache)
- 트랜잭션 동안 읽은 엔티티를 담아 두는 1차 캐시. 같은 id 는 같은 객체로 돌려주고, 커밋 때 바뀐 필드를 찾아 UPDATE 를 만든다
- 요청당 쿼리 수 (query count)
- 요청 하나가 DB 에 보낸 쿼리 개수. 결과 행 수에 비례해 늘면 N+1 이다
- 원본 보존
- 원천 값을 가공 없이 저장한다. 다시 받으려면 한도를 또 쓴다
- 원천 수집
- 외부 원천을 전량 또는 증분으로 받는다. 호출은 일일 한도 자원이다
- 원천 코드표 유도
- 원천의 분류 코드표(한 · 영 이름 쌍)에서 사전을 만든다
- 인덱스 설계
- 자주 쓰는 조건 · 정렬에 맞춰 인덱스를 만들어 조회가 테이블 전체를 읽지 않게 한다. 인덱스가 늘면 쓰기와 저장 공간 비용이 는다
- 읽기 복제본 라우팅 (read replica, master/replica routing, AbstractRoutingDataSource)
- 읽기 전용 트랜잭션은 복제본으로, 쓰기는 원본으로 보낸다. 원본의 부하를 덜지만 방금 쓴 값을 복제본에서 못 볼 수 있다
- 읽기 이상 현상 (read phenomena, isolation anomaly)
- 격리가 약할 때 다른 트랜잭션의 변경이 섞여 보이는 상태. 더티 리드 · 반복 불가능한 읽기 · 팬텀 읽기 · 쓰기 왜곡이 있다
- 임베딩 텍스트 규칙
- 무엇을 이어 붙여 인코딩하나 — 제목 · 분류 · 주소 · 개요
- 저장소 선택
- 데이터의 모양과 읽는 방식에 맞춰 저장소를 고른다. 정합성이 중요한 원장은 관계형, 자주 읽는 값은 인메모리, 대량 집계는 컬럼 지향 저장소가 맞다
- 정규화 · 파생
- 원본은 그대로 두고 화면용 그루핑은 파생 컬럼으로 만든다
- 증분 · 백필
- 안 받은 것만 이어 받는다. 일일 한도 안에서 며칠에 걸쳐 채운다
- 지연 로딩 (lazy loading, FetchType.LAZY)
- 연관 엔티티를 처음 접근할 때 읽는다(FetchType.LAZY). 안 쓰는 연관을 읽지 않지만, 목록을 돌며 접근하면 행마다 쿼리가 나간다
- 직렬화 (serialization, deserialization, marshalling)
- 객체를 JSON·바이트 같은 전송·저장 형식으로 바꾸고(직렬화) 되돌린다(역직렬화). Kotlin 의 non-null·기본값을 지키려면 Kotlin 모듈을 붙인 매퍼를 쓴다
- 카디널리티 (cardinality)
- 컬럼 값의 서로 다른 개수. 높을수록 인덱스가 행을 잘 걸러 낸다
- 캐시 불일치 (stale cache, cache inconsistency)
- 원본이 바뀌었는데 캐시가 옛 값을 내주는 상태. 가격 · 재고처럼 틀리면 비싼 값일수록 짧은 TTL 이나 쓰기 시 무효화가 필요하다
- 캐시 스탬피드 (cache stampede, thundering herd, dog-pile, hot key expiry)
- 인기 키가 만료된 순간 많은 요청이 동시에 원본을 조회해 DB 가 몰리는 상태. 만료 시각 분산, 한 요청만 재계산하는 잠금으로 막는다
- 캐시 전략
- 자주 읽고 드물게 바뀌는 값을 빠른 저장소에 복사해 둔다. 누가 채우고 누가 쓰는지(패턴), 얼마나 오래 두는지(TTL), 원본이 바뀌면 어떻게 지우는지(무효화), 만료 순간 몰림을 어떻게 막는지를 정한다
- 캐싱 (cache, 캐시)
- 원본보다 빠른 저장소(메모리 · Redis)에 결과를 보관해 다시 계산 · 조회하지 않는다. 읽기 · 쓰기에서 캐시와 원본을 누가 어떤 순서로 다루는지에 따라 패턴이 나뉜다
- 커넥션 관리
- DB 연결을 만들고 나눠 쓰고 돌려받는다. 연결은 비싸고 DB 쪽 한도가 있으므로 풀 크기 · 대기 시간 · 트랜잭션 길이를 함께 본다
- 커넥션 대기 시간 (connection acquire time, hikaricp_connections_acquire, hikaricp_connections_pending)
- 요청이 풀에서 연결을 받기까지 기다린 시간. 0 에서 벗어나면 풀 크기보다 트랜잭션 길이부터 본다
- 커넥션 풀 (connection pool, DB 커넥션 풀)
- DB 연결을 미리 만들어 두고 빌려 쓰고 돌려준다. 요청마다 TCP · 인증 비용을 내지 않는다. 풀이 비면 요청은 연결이 돌아올 때까지 기다린다
- 커넥션 풀 고갈 (connection pool exhaustion, Connection is not available)
- 모든 연결이 빌려 나가 새 요청이 타임아웃까지 기다리는 상태. 느린 쿼리, 긴 트랜잭션, 트랜잭션 안의 외부 호출, 잠금 대기가 흔한 원인이고 진짜 풀 부족은 드물다
- 쿼리 지연 (query latency, slow query)
- 쿼리 하나가 응답하기까지 걸린 시간. 평균보다 P95 · P99 로 보고, 실행 계획(EXPLAIN)과 함께 읽는다
- 클릭 약지도 라벨 (weak supervision, implicit feedback)
- 노출 · 클릭 · 체류 · 담기 · 구매 원장에서 0~4 관련도 라벨을 만든다. 사람 판정보다 싸지만 위치 편향이 섞여 있어 그대로 쓰면 1위를 1위라서 배운다
- 타입 안전 쿼리 빌더 (dynamic query, 동적 쿼리)
- 조건이 바뀌는 동적 조회를 문자열 JPQL 대신 컴파일되는 코드로 조립한다. 오타 · 타입 오류가 빌드에서 잡힌다
- 탐색 · 성향 로깅 (propensity)
- 노출 순서를 정한 정책과 그 선택 확률을 원장에 같이 남긴다. 가끔(ε) 순서를 섞어야 다른 정책의 결과를 나중에 추정할 수 있다. 트래픽이 오기 전에 깔아야 한다
- 트랜잭션 (transaction, commit, rollback)
- 전부 반영(커밋)되거나 전부 취소(롤백)되는 작업 단위
- 트랜잭션 관리
- 여러 변경을 한 단위로 묶어 전부 반영하거나 전부 취소한다. 격리 수준을 정해 동시에 도는 트랜잭션끼리 무엇이 보이는지 정한다
- 파생 컬럼
- 가공 값은 원본을 덮지 않고 별도 컬럼으로 둔다
- 팬텀 읽기 (phantom read)
- 같은 조건으로 두 번 조회했는데 그 사이 다른 커밋이 행을 넣거나 지워 결과 행 집합이 달라지는 것
- 페치 조인 (fetch join, JOIN FETCH, @EntityGraph)
- 연관 엔티티를 한 쿼리의 JOIN 으로 같이 읽는다(JOIN FETCH, @EntityGraph). 컬렉션 페치 조인은 페이징과 함께 쓰면 메모리에서 잘리므로 주의한다
- 풀 테이블 스캔 (full table scan, type=ALL)
- 조건에 맞는 인덱스가 없거나 못 써서 테이블 전체를 읽는 상태. 행이 늘수록 조회 시간이 선형으로 는다
- 풀스캔
- 원천 전량을 다시 받는다
- 품사 태그 (POS tag, 세종 품사)
- 한국어 분석기는 세종 품사 체계를 쓴다 — NNG 일반명사 · NNP 고유명사 · NR 수사 · MAG 일반부사 · VV 동사 … 품사 필터와 동의어 규칙이 이 태그를 본다. 같은 글자도 문맥 비용에 따라 다른 태그를 받는다
- 형태소 분석기 커스텀 층 (nori 커스텀)
- 분해 결과를 바꾸는 손잡이 셋 — 사용자 사전(L1) · 시스템 사전 항목(L2) · 비용 재학습(L3). 층이 깊을수록 플러그인 빌드와 라벨 코퍼스가 따라온다
- ACID (Atomicity, Consistency, Isolation, Durability)
- 트랜잭션이 지켜야 할 네 성질. 원자성(전부 아니면 전무) · 일관성(제약을 깨지 않음) · 격리성(동시 실행이 서로 간섭하지 않음) · 지속성(커밋되면 장애 뒤에도 남음)
- BASE (Basically Available, Soft state, Eventually consistent)
- Basically Available, Soft state, Eventually consistent. ACID 의 즉시 일관성 대신 가용성을 우선하고 일관성은 시간이 지나 맞춰지는 것으로 받아들이는 모델
- ClickHouse
- 컬럼 지향 분석용 저장소. 행 단위 갱신 대신 대량 적재와 집계에 맞다. 이 레포에서는 analytics 가 이벤트를 쌓고 recommendation 이 읽기만 한다
- Flyway
- 버전 마이그레이션 도구. 기동 시 안 된 버전만 적용하고 flyway_schema_history 에 기록한다. Spring Boot 4 에서는 자동설정 모듈을 따로 넣어야 실제로 돈다
- Hibernate
- JPA 구현체. 영속성 컨텍스트 · 변경 감지 · 지연 로딩 프록시를 제공한다. 이 레포는 스키마 생성을 끄고 검증만 시킨다
- HikariCP
- Spring Boot 기본 JDBC 커넥션 풀. maximum-pool-size · minimum-idle · connection-timeout · max-lifetime · keepalive-time · leak-detection-threshold 로 조절한다
- Jackson (ObjectMapper, jackson-module-kotlin)
- JVM JSON 직렬화 라이브러리. jackson-module-kotlin 을 붙이면 주 생성자·기본값·non-null 을 이해해 data class 를 그대로 읽고 쓴다. Spring Boot 4 부터 패키지가 tools.jackson(3.x)으로 바뀌었다
- mecab-ko-dic (MeCab)
- MeCab 형식의 한국어 사전. 세종 말뭉치로 학습한 비용이 붙은 품사별 CSV 와 연접 비용 행렬(matrix.def) · 학습 모델(model.def)로 이뤄지고, Lucene nori 가 이것을 바이너리로 구워 쓴다
- MVCC (Multi-Version Concurrency Control, 다중 버전 동시성 제어)
- 행의 여러 버전을 남겨 읽기는 잠금 없이 자기 시점의 스냅샷을 보게 한다. 읽기와 쓰기가 서로를 막지 않는다
- MySQL
- 이 레포의 관계형 저장소(8.0, InnoDB). 도메인마다 스키마를 따로 두고 서비스 간에 공유하지 않는다. InnoDB 는 B-트리 인덱스 · MVCC · redo 로그(WAL)로 트랜잭션을 보장한다
- N+1 문제 (N+1 query problem)
- 목록 1 번 조회 뒤에 각 행의 연관을 읽느라 N 번이 더 나가는 상태. 개발 데이터에서는 안 보이다가 운영 데이터 규모에서 지연으로 드러난다
- ORM (Object-Relational Mapping, JPA)
- 객체와 관계형 테이블을 매핑해 SQL 을 직접 쓰지 않고 객체로 읽고 저장하게 한다. 이 레포는 JPA 엔티티를 infrastructure 에 두고 도메인 모델과 분리한다
- Querydsl
- 엔티티에서 Q 타입을 생성해 JPQL 을 코드로 조립하는 라이브러리. JPAQueryFactory 로 쓴다
- Redis
- 인메모리 키-값 저장소. 이 레포에서는 점수 캐시 · 재고 선차감 · 추천 결과(sorted set) · 레이트 리밋 카운터에 쓴다
- TTL 만료 (TTL, time to live, expire)
- 캐시 항목에 수명을 걸어 시간이 지나면 저절로 지운다. 무효화 로직 없이 옛 값이 머무는 시간을 상한으로 묶는다
- WAL (Write-Ahead Log, 선행 기록 로그, redo log)
- 데이터 페이지를 고치기 전에 변경 내용을 로그에 먼저 순차 기록한다. 장애 뒤에 로그를 다시 적용해 커밋된 변경을 복구하므로 ACID 의 지속성을 만든다
다른 분류