기술 면접 준비1 DB편

2025. 3. 6. 22:34뭐든, 공부한 내용 기록/오늘 나는 무얼 배웠나

 

1. 기본 개념 관련

Q1. RDBMS와 NoSQL의 차이점은?

A:

  • RDBMS(Relational Database Management System): 관계형 데이터베이스로, 테이블 형식으로 데이터를 저장하며 SQL을 사용. 대표적으로 MySQL, PostgreSQL, MSSQL, Oracle 등이 있음. ACID(Atomicity, Consistency, Isolation, Durability) 보장.
  • NoSQL(Not Only SQL): 비정형 데이터(문서, JSON, Key-Value, 그래프 등)를 저장하며 수평 확장(Scalability)에 강점. 대표적으로 MongoDB, Cassandra, Redis 등이 있음. 스키마가 유연하고, 대량의 데이터를 빠르게 처리하는 데 적합.

언제 사용?

  • RDBMS: 데이터 정합성이 중요할 때(병원 시스템, 금융, ERP 등).
  • NoSQL: 빠른 읽기/쓰기 성능이 중요하고, 구조가 자주 바뀌는 경우(로그 저장, 실시간 분석, 소셜 미디어).

Q2. 정규화(Normalization)란 무엇이며, 왜 필요한가?

A:

  • **정규화(Normalization)**는 데이터 중복을 최소화하고, 데이터 무결성을 유지하기 위해 테이블을 분리하는 과정.
  • 장점: 데이터 일관성 유지, 저장 공간 절약, 업데이트 및 삭제 이상(Anomaly) 방지.
  • 단점: 너무 과도한 정규화는 JOIN 연산이 많아져 성능 저하 가능.

정규화 단계:

  • 1NF: 각 컬럼이 원자값(Atomic Value)을 갖도록 분해.
  • 2NF: 부분 함수 종속 제거(기본 키에 종속되지 않는 컬럼 제거).
  • 3NF: 이행적 함수 종속 제거(비 기본 키가 다른 비 기본 키를 종속하면 제거).

Q3. 인덱스(INDEX)란 무엇이며, 어떻게 작동하는가?

A:

  • 인덱스는 데이터 검색 속도를 높이기 위해 생성하는 자료구조.
  • 일반적으로 B-Tree 인덱스가 사용되며, HASH 인덱스, FULL-TEXT 인덱스도 있음.

장점:

  • WHERE, ORDER BY, JOIN 성능 향상.
  • 대량 데이터 조회 시 효율적.

단점:

  • INSERT, UPDATE, DELETE 시 오버헤드 발생.
  • 너무 많은 인덱스는 성능 저하 유발.

실제 사용 예시:

CREATE INDEX idx_patient_name ON Patient(name);

2. SQL 및 쿼리 최적화

Q4. 성능이 느린 SQL 쿼리를 튜닝하는 방법은?

A:

  • 인덱스 활용: WHERE, JOIN, ORDER BY 사용 시 적절한 인덱스 설정.
  • EXPLAIN 실행 계획 분석: EXPLAIN 명령어로 실행 계획을 확인.
  • JOIN 최적화: 필요 없는 JOIN 제거, 적절한 인덱스 설정.
  • SELECT 최적화: SELECT * 대신 필요한 컬럼만 조회.
  • 파티셔닝(Partitioning): 테이블을 물리적으로 분할하여 조회 성능 개선.

예시 - 실행 계획 분석:

EXPLAIN SELECT * FROM Patient WHERE name = '홍길동';

Q5. EXISTS와 IN의 차이점 및 성능 차이는?

A:

  • EXISTS: 서브쿼리에서 한 건이라도 만족하면 즉시 종료 → 대량 데이터 처리에 유리
  • IN: 서브쿼리의 결과를 모두 가져와 비교 → 소량 데이터에 유리

예제 비교:

-- IN 사용
SELECT * FROM Patient WHERE id IN (SELECT patient_id FROM Appointment);

-- EXISTS 사용
SELECT * FROM Patient p WHERE EXISTS (SELECT 1 FROM Appointment a WHERE p.id = a.patient_id);

대량의 데이터에서는 EXISTS가 더 빠를 가능성이 높음.


3. 병원 시스템 특화 질문

Q6. 병원에서 환자 정보를 저장할 때 고려해야 할 DB 설계 원칙은?

A:

  • 개인정보 보호: 민감 정보(주민번호, 진료 기록 등)는 암호화 저장.
  • 정규화 적용: 진료 기록, 환자 정보, 처방 내역을 각각 분리하여 관리.
  • 인덱스 설정: 진료 조회, 예약 조회 속도를 위해 적절한 인덱스 추가.
  • 로그 기록: 데이터 변경 사항을 Audit Log로 기록하여 추적 가능하게 함.

예제 테이블 구조:

CREATE TABLE Patient (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    dob DATE NOT NULL,
    phone VARCHAR(20),
    encrypted_ssn VARBINARY(255) -- 주민등록번호 암호화 저장
);

Q7. 병원 시스템에서 다중 사용자 동시 접근 시 발생할 수 있는 문제는?

A:

  • 데드락(Deadlock): 여러 트랜잭션이 서로의 자원을 기다리면서 멈추는 현상.
  • 더티 리드(Dirty Read): 트랜잭션이 커밋되지 않은 데이터를 읽는 문제.
  • 팬텀 리드(Phantom Read): 트랜잭션 실행 중 다른 트랜잭션이 데이터를 추가/삭제하는 문제.

해결 방법:

  • 적절한 트랜잭션 격리 수준(Isolation Level) 설정.
  • 락(Locking) 최소화낙관적/비관적 동시성 제어 적용.

격리 수준 설정 예제 (MySQL)

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

4. 데이터 보안 및 규제 준수

Q8. 병원 시스템에서 환자 정보 보안을 위해 어떤 DB 기술을 적용할 수 있는가?

A:

  1. 데이터 암호화
    • 저장 시 AES 암호화, TLS/SSL을 통한 전송 보안.
    • 예시:
      INSERT INTO Patient (name, encrypted_ssn) VALUES ('홍길동', AES_ENCRYPT('123456-1234567', 'secret_key'));
      
  2. 접근 제어(RBAC, Role-Based Access Control)
    • 의사, 간호사, 행정 직원 등 역할(Role) 기반 권한 관리.
  3. 로깅 및 모니터링
    • 누가 데이터를 조회/수정했는지 감사 로그(Audit Log) 기록.