본문 바로가기

☺︎ Daily-Life/Full-time Job Interviews

[1~2/14 Sprint] 데이터베이스

Section 1. 데이터 베이스 기본

응용 프로그램  DBMS[제어/관리(조작) ← 쿼리]  데이터베이스(규칙, 구조화된 데이터) 

  • 실시간 접근성: 비정형적 질의 → 실시간 처리 및 응답
  • 지속적 변화: 동적 데이터 변화(CRUD)  최신 상태 유지
  • 동시 공용: 다수 사용자  같은 데이터 이용 가능
  • 내용에 의한 참조: 사용자 요구 데이터 내용으로(레코드 주소, 위치X)  검색

엔터티(=객체)[여러개 내부 속성] - 강한 엔터티(독립존재가능) vs 약한 엔터티(종속적)

릴레이션(=테이블/컬렉션)

  • 관계형 DB: 레코드 - [테이블] - 데이터베이스
  • NoSQL: 도큐먼트 - [컬렉션] - 데이터베이스 

RDBMS(관계형): 2차원 테이블 형태, 데이터 구조 명확

- 스키마에 맞춰 데이터 관리, 정합성 보장 ~ 중복 데이터X(데이터 무결성: 변경 용이) - 수정 필요 데이터 적합

- 시스템이 커지면 쿼리 복잡성 증가 & 성능 저하(Scale-Out X/Scale-Up)

 

NoSQL(Not Only SQL)

- 스키마 없이 Key-Value 형태로 자유롭게 데이터 관리(데이터 분산/확장 용이: Scale-Up + Scale-Out)

- 데이터 중복 가능(수정시, 모든 컬렉션 체크), 명확한 데이터 구조 보장 X

 

도메인: <속성, 속성> 묶음

개체 속성(=필드)

카디널리티(중복 수치 정도)

 

*MySQL 기준, 필드 타입

날짜: DATE, DATETIME, TIMESTAMP

문자: CHAR, VARCHAR(가변길이) + TEXT/BLOB + ENUM/SET

 

*SQL 문법

SELECT: 특정 테이블 조회
SELECT name, age FROM students;

DISTINCT: 중복 데이터를 제거 - 고유한 값 조회 
SELECT DISTINCT country FROM users;

FROM: 데이터를 가져올 테이블 지정
SELECT name FROM students;

WHERE: 조건에 맞는 개별 데이터 필터링
SELECT * FROM students WHERE age > 20;

JOIN
둘 이상의 테이블 결합
SELECT students.name, courses.title FROM students JOIN enrollments ON students.id = enrollments.student_id JOIN courses ON enrollments.course_id = courses.id;
*ON: JOIN의 조건 지정

SELECT students.name, courses.title FROM students JOIN enrollments ON students.id = enrollments.student_id;

GROUP BY: 특정 필드 기준으로, 레코드를 그룹화
SELECT country, COUNT(*) FROM users GROUP BY country;
*COUNT, SUM, AVG, MAX, MIN 연산자 사용 가능

HAVING: GROUP BY 결과에 조건을 적용(그룹 필터링 & 집계함수 사용 가능)
SELECT country, COUNT(*) FROM users GROUP BY country **HAVING** COUNT(*) > 5;

ORDER BY: 결과를 지정된 컬럼 기준/수치로 정렬
SELECT name, age FROM students **ORDER BY** age DESC;

LIMIT: 결과 행의 수를 제한
SELECT name FROM students **LIMIT** 10;

[수행 우선순위]
FROM/JOIN (및 ON) - WHERE - GROUP BY/HAVING - SELECT - DISTINCT - ORDER BY - LIMIT

 

+ JOIN 명령어

Left Outer join: 집합 A

Right Outer join: 집합 B

Full Outer join: 합집합

Inner join: 교집합

JOIN의 내부 작업 방식

1. 중첩 루프 조인 (Nested Loop Join)

  • 첫 번째 테이블(외부 테이블)의 각 행에 대해, 두 번째 테이블(내부 테이블)의 모든 행을 순회하며 매칭을 찾습니다(간단하지만, 테이블이 클 경우 비효율적)

2. 정렬 병합 조인 (Sort-Merge Join)

  • 조인할 두 테이블을 정렬한 후 병합하는 방식
  • 각 테이블의 커서가 필요해 좋은 성능을 보이나, 정렬이 필요한 경우 시간이 소요 가능

3. 해시 조인 (Hash Join)

  • 빌드 단계: 작은 테이블에서 해시 테이블을 생성
  • 프로브 단계: 큰 테이블의 각 행을 순회하면서 해시 테이블과 매칭 (특히 큰 데이터 세트에 효과적)

DDL(정의) - 구조 정의/수정/삭제 (ALTER, CREATE, DROP)

DML(조작) - CRUD (SELECT, INSERT, UPDATE, DELETE)

DCL(제어) - 무결성 유지, 병행 수행 제어, 보호 & 관리 (COMMIT, ROLLBACK, GRANT, REVOKE)

 

*DELETE: 테이블 유지 & 데이터 삭제[REDO 가능]

TRUNCATE: 전체 데이터 삭제(테이블 용량 감소/테이블 삭제X & 인덱스 삭제)[REDO 불가능]

DROP: 테이블 완전 삭제(공간/인덱스/객체 삭제)[REDO 불가능]

 

*트리거: 특정테이블에 대한 이벤트 발동 -> DML 자동 호출/수행

 

슈퍼키(유일성:중복X) { 후보키(+최소성: 최소필드만 사용/복합키X) (기본키 / 대체키) }

자연키(자연 생성된/변하는+속성) / 인조키(인위적+고유+식별자/불변성->기본키로 사용)

외래키(타 테이블-기본키 참조)

 

*SQL Injection [텍스트 필드 - SQL 구문삽입]

- 입력값 검증 함수 & 저장 프로시저(? 대입) 사용


Section 2. ERD & 정규화 과정 

ERD(관계형 구조 1:1 / 1:N / N:M 관계)[시스템 요구사항 기반, 데이터베이스 구축~디버킹/비즈니스 프로세스 설계]

 

정규화 과정: 릴레이션 잘못된 종속 관계 해결(*데이터 이상 현상: 다중 삽입/삭제/갱신 이상), [저장 공간 효율적 분배/용량 축소]

*논리적 오류: 삽입 이상(특정 속성 값 없음 NULL 입력), 갱신 이상(중복 데이터 중 일부만 수정됨), 삭제 이상(다른 데이터까지 삭제)

  • 제 1 정규형: 한 개의 기본키에 두 개 이상 반복 집합 X
  • 제 2 정규형: 부분 함수 종속성 제거(모든 속성 기본키에만, 완전 함수 종속) - 무손실 분해(직접 상관성 없는 릴레이션~분해)
  • 제 3 정규형: 이행적 함수 종속 제거 (A->B->C 연관성에서 축약가능, A/B & B/C 로)
  • 보이스/코드 정규형(BCNF): 제 3 정규형 + 결정자이지만, 후보키가 아닌 경우 분해

* 정규형을 통해, 성능변화는 예측 불가(+/-<조인경우>) ~ 서비스에 따라 정규화 결정(읽기가 많은 작업은 역정규화)

 

트랜잭션: 데이터베이스 논리적 작업 수행 단위(하나 이상의 상태 변화)

[ACID 특성]

  1. Atomicity (원자성): 트랜잭션 모두 성공 or 실패 (부분적 X)
  2. Consistency (일관성): 허용된 방식(규칙)으로만 데이터 변경 가능
  3. Isolation (격리성): 다른 트랜잭션과 격리, 독립적 수행(병렬 접근 가능)
  4. Durability (지속성): 트랜잭션 종료 후, 결과 영구적 반영- 시스템 장애시, 원복 가능(체크섬: 무결성 보호~중복 검사<오류 정정>, 저널링:변경사항 로그, 롤백)

*Commit(CRUD 이후) & Rollback

 

-DB Lock (트랜잭션 처리 순차성 보장)

  • 공유락 (Shared Lock): 트랜잭션(조회) 중, 동시 접근 가능
  • 베타락(Exclusive Lock): 트랜잭션(데이터 변경) 중, 접근 비허용

*트랜잭션-전파 (EX, spring @Transactional: 여러 메소드에 걸쳐 처리)

트랜잭션 격리수준[하->상]∝1/동시성(반비례) :: 현상

  • READ UNCOMMITTED: 다른 트랜잭션 변경사항 읽기 가능 :: Dirty Read(값 다름 가능)
  • READ COMMITED: 커밋 완료 데이터만 조회 가능(기본 값)/다른 트랜잭션 접근 가능 :: Non-repeatable Read(값 다름 가능)
  • REPEATABLE_READ: 한 트랜잭션 수정 행 - Phantom Read(MVCC 해결?) 다른 트랜잭션 접근 불가/새로운 행 추가는 가능
  • SERIALIZABLE: 가장 엄격한 격리 수준, 위 문제 해결(단, 교착상태 가능/성능 저하)

무결성의 종류

개체 무결성 기본키는 NULL 불가
참조 무결성 외래 키 & 참조하는 테이블 값 동일
도메인 무결성 정해진 도메인
키 무결성 기본키 NOT NULL, 이외 중복/NULL 가능
NULL 무결성 NOT NULL
고유 무결성 특정 속성 값 = 각 행에서 고유해야 함

Section 3. 인덱스 구조

B-Tree로 인덱스 구현 (트리 높이 최소화 - 검색 시간↓: 균형 / 대수확장성<느리게 성장>)

- 자식 노드 2개 이상, LinkedList로 리프노드 연결~순차 검색 가능

  • 노드: 루트(상위), 내부(중간), 리프(하위) 노드로 구성
  • 트리 균형 유지: 자동으로 균형 유지
  • 키 순서: 각 노드는 정렬된 키(데이터) 유지
  • 탐색 및 삽입/삭제: O(log n) 시간 복잡도

[동작 방식]

- 인덱스 검색(READ)으로 테이블 내 자료 엑세스(항상 정렬된 상태 유지)

-> 삽입/수정/삭제 시 속도 저하 (저장 성능↓/검색 성능↑)

  1. 루트 노드에서 시작하여, 예측 항목이 있는 노드에서 키를 검색한다.
  2. 자식 노드로 이동하여 검색 및 찾으면 해당 노드 데이터 반환
  3. 키를 삽입하거나 삭제할 때는, 노드를 분할하거나 합병하여 트리의 높이를 유지한다.

* 해시 테이블로 구현시, 시간 복잡도 O(1) [But, 1가지 데이터 검색에만 용이/부등호 사용 등 연속적 데이터의 순차검색 불가]

* 복합인덱스 설정


Section 4. DBMS 스토리지 아키텍쳐

 

클러스터링 - 여러 개 DB 수평적 구조 구축(동기 방식으로 사용)

- 동기화 ~ 일관성있는 데이터

- 높은 가용성(다른 DB 사용/시스템 장애X)

- 로드 밸런싱 (DB서버 부하 분산)

* 저장소 공유시, 병목현상 (전체 시스템의 성능/용량 ~ 하나의 구성요소로 제한) 발생 가능 & 서버 동시 운영 비용↑

 

리플리케이션 - 여러 개 DB 수직적 구조로 구축(권한별로/비동기 방식)

- (일반적 DB)빈번한 읽기 작업 -> 성능 향상

- 지연 시간 거의 없음

* 데이터 동기화 보장 X -> 일관성 X & Master DB 다운시, 복구 및 대처 어려움

 

DB 튜닝이란? DB의 구조나, 운영체제 등 조정  → DB 시스템의 전체적인 성능을 개선

1단계 -
DB 설계 튜닝(모델링 관점):
DB 설계 단계에서 성능을 고려하여 설계
□ 데이터 모델링, 인덱스 설계, 데이터 파일, 테이블 스페이스 설계, 데이터베이스 용량 산정 등
- 튜닝 사례: 반정규화, 분산파일배치
2단계 - DBMS 튜닝(환경 관점)
 성능을 고려하여 메모리나 블록 크기 지정, CPU(메모리 I/O 관점)
- 튜닝 사례: Buffer/Cache 크기
3단계 - SQL 튜닝(App 관점)
 SQL 작성 시 성능 고려: Join, Indexing, SQL Execution Plan

- 튜닝 사례: Hash / Join

RDBMS는 단순 텍스트매칭에 대한 검색만을 제공해 동의어나 유의어 같은 검색은 불가
*(MySQL 최신 버전에서 n-gram 기반의 Full-Text 검색을 지원)

But, 엘라스틱 서치는 동의어나 유의어를 활용한 검색이 가능, 비정형 데이터의 색인과 검색이 가능하고, 역색인 지원으로 매우 빠른 검색이 가능
※ Full-Text : 이미지, CSS, 글 등의 복합적으로 이뤄진 컨텐츠에서 순수하게 텍스트만 추출한 데이터를 의미. 이 과정을 보통 크롤링으로 구현함 ( 엘라스틱 서치의 검색엔진엔 크롤러가 빠져있어 별도로 구축해야함)

출처: https://dev-coco.tistory.com/158 [슬기로운 개발생활:티스토리]

 


MySQL
(오픈 소스 관계형 데이터베이스 관리 시스템) - 여러 기능/아키텍쳐 요소

  • 인덱스 압축 기술(인덱스 크기 줄임/쿼리 성능 향상
  • B-트리 기반 인덱스(+최대 64개 인덱스)
  • 스레드 기반 메모리 할당 시스템
  • 빠른 조인 속도(연산 최적화 :: 조인 순서/알고리즘)

MySQL Server-Process

+-------------------------------------------+
|  클라이언트   - 어플리케이션(사용자-인터페이스) | : MySQL Connector & Shell(Scripting)
+-------------------------------------------+
          |
          |
         v
+--------------------------------------+
|  커넥션 풀 (서버 엑세스~
커넥션-할당/반환)  | : 쓰레드 동시성 관리
+--------------------------------------+
          |
          |     NoSQL/SQL Interface(DML/DLL/StroedProcidurs/Views/Triggers)
         v
+-----------------+
|  SQL 파서(Parser) | : SQL 구문해석+구문트리생성<쿼리정확성체크>
+-----------------+
          |
          |
         v
+---------------------+
|  옵티마이저(Optimizer) | : 가능한 쿼리 실행 계획-최적 쿼리 플랜<조인 순서, 사용되는 인덱스, 결과 집합 접근방식 고려>
+---------------------+
          |
          |
         v
+-------------------------+
|  쿼리 Caches & Buffers 풀  | : 자주 사용 데이터 메모리에 저장-빠른 엑세스 속도+메모리 구조체=:최근 엑세스 페이지<데이터+인덱스> 저장/재사용성)                     |
+-------------------------+
          |
          |
         v
+----------------------------------+
|  Storage Engine (InnoDB, MyISAM) | : 데이터 저장 및 처리/동시성 제어+ACID..데이터 조회 성능
+----------------------------------+
         |
         |
         v
+------------+
|   파일 시스템  |
+------------+
         |
         | 저장/읽기
         v
+---------------+
|  디스크 스토리지 |
+---------------+

 


# References

[도서] 면접을 위한 CS 전공지식노트 - 주홍철

https://dev-coco.tistory.com/158 [슬기로운 개발생활:티스토리]