db

Database 면접 Q&A 정리 — 인강 노트

강의 형식: 하나의 강의 = 하나의 면접 질문. 각 질문을 브론즈(50점) → 실버(80점) → 골드(100점) 답변으로 비교 분석한다. 기준 DBMS는 대부분 MySQL(InnoDB)이다.

목차

섹션 2. 트랜잭션

  1. Q. 트랜잭션이 무엇이고 ACID에 대해 설명해 주세요
  2. Q. 실무에서 트랜잭션을 사용할 때 주의할 점은 무엇인가요?
  3. Q. 트랜잭션 격리 수준의 종류를 설명해 주세요
  4. Q. 트랜잭션 격리 수준에 따라 나타날 수 있는 문제(더티 리드, 논리피터블 리드, 팬텀 리드)를 설명해 주세요
  5. Q. 트랜잭션 격리 수준에 따라 나타날 수 있는 문제는 어떻게 해결하나요?
  6. Q. MVCC란 무엇이고 왜 사용하나요?
  7. Q. InnoDB는 Repeatable Read만으로 팬텀 리드를 어떻게 해결하나요?

섹션 3. 락과 동시성 제어 8. Q. DB 락이란 무엇이고 어떤 종류가 있나요? 9. Q. 낙관적 락과 비관적 락의 차이는 무엇인가요? 10. Q. 낙관적 락과 비관적 락은 구체적으로 어떤 기준으로 선택하나요? 11. Q. 분산락이란 무엇이고 언제 사용하나요? 12. Q. Lost Update Problem이란 무엇이고 왜 트랜잭션 격리 수준으로 해결하지 못하나요? 13. Q. Lost Update Problem은 어떻게 해결하나요?

섹션 4. 인덱스 14. Q. 인덱스란 무엇이고 장단점을 설명해 주세요 15. Q. 인덱스는 왜 해시 테이블이 아니라 주로 B-Tree를 사용하나요? 16. Q. 인덱스는 B-Tree 방식으로 구체적으로 어떻게 동작하나요? 17. Q. 클러스터링 인덱스와 비클러스터링 인덱스의 차이는 무엇인가요? 18. Q. InnoDB에서 인덱스 검색은 구체적으로 어떻게 동작하나요? (2단계 검색) 19. Q. 복합 인덱스 사용 시 주의할 점은 무엇인가요? 20. Q. 동료가 불(bool) 타입 컬럼에 인덱스를 건다면 어떤 의견을 내시겠어요? 21. Q. LIKE 'xxx%'는 인덱스를 타는데 '%xxx%'는 왜 인덱스를 타지 않나요?

섹션 5. NoSQL과 RDBMS 비교 22. Q. RDBMS와 NoSQL의 차이를 설명해 주세요. 언제 각각을 사용하나요? 23. Q. 데이터 모델링 관점에서 RDBMS와 NoSQL의 설계 방식은 어떻게 다른가요? 24. Q. RDBMS에서도 스케일아웃이 가능한가요? 25. Q. NoSQL은 왜 스케일아웃에 유리한가요? 26. Q. MySQL과 PostgreSQL은 어떤 차이가 있나요? 27. Q. CAP 이론이 무엇인가요? 28. Q. 실무에서 C(일관성)와 A(가용성)는 어떤 기준으로 선택하나요?

섹션 6. 커넥션과 커넥션 풀 29. Q. DB 커넥션이란 무엇이고 생성 비용이 큰 이유는 무엇인가요? 30. Q. 커넥션 풀이란 무엇이고 왜 사용하나요? 31. Q. 커넥션 풀 크기는 클수록 좋은가요? 32. Q. 커넥션 타임아웃과 리드 타임아웃의 차이는 무엇이고, 타임아웃은 왜 필요한가요? 33. Q. 커넥션 풀 상태를 어떻게 모니터링하고 문제를 어떻게 진단하나요?

섹션 7. 운영 34. Q. 운영 중 슬로우 쿼리가 발생하면 어떻게 대처하나요? 35. Q. EXPLAIN에서 구체적으로 무엇을 봐야 하나요? 36. Q. 데이터 자체가 많아져서 느려지면 어떻게 해결하나요? 37. Q. 클러스터링, 리플리케이션, 샤딩의 차이를 설명해 주세요 38. Q. 리플리케이션에서 구체적으로 어떻게 데이터가 복제되나요? 39. Q. 데드락이 무엇이고 DB에서 왜 발생하나요? 40. Q. 데드락이 발생하면 어떻게 감지하고 대처하나요? 41. Q. DB에 장애가 발생하면 어떤 순서로 접근하시나요? 42. Q. DB 모니터링에서 주요하게 봐야 하는 메트릭은 무엇인가요?


섹션 2. 트랜잭션

Q. 트랜잭션이 무엇이고 ACID에 대해 설명해 주세요

핵심 답변 (골드 수준)

트랜잭션은 데이터베이스에서 논리적인 작업의 단위이며, 동시에 장애가 발생했을 때 데이터를 복구하는 작업의 단위이기도 하다. 장애가 발생하면 트랜잭션 단위로 롤백된다는 의미가 여기에 담긴다.

ACID는 트랜잭션이 보장해야 하는 네 가지 특성이다.

다만 격리성을 엄격하게 지키면 동시성이 매우 떨어지므로, 실무에서는 격리 수준을 조절하여 적절한 트레이드오프를 가져간다.

핵심 키워드: ① 복구의 단위 ② 제약 조건(비즈니스 규칙 포함) ③ 격리성의 트레이드오프

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "트랜잭션은 작업의 단위, ACID는 원자성·일관성·격리성·지속성이다" 이름만 나열하고 각각이 무엇을 의미하는지 없음 → 암기만 했다는 인상
실버 네 가지 특성의 의미를 한 줄씩 설명 격리성을 "끼어들면 안 된다"로만 끝냄 → 트레이드오프 감각이 없어 교과서적
골드 + 복구의 단위 관점, 일관성에 제약 조건 명시, 격리성의 동시성 트레이드오프 언급 정보량이 아니라 원리·현실 감각의 차이로 신뢰를 얻음

꼬리 질문


Q. 실무에서 트랜잭션을 사용할 때 주의할 점은 무엇인가요?

핵심 답변 (골드 수준)

트랜잭션은 꼭 필요한 최소의 코드에만 적용해야 한다. 이유는 두 가지다.

  1. 커넥션 점유: 트랜잭션 동안 커넥션을 점유하므로, 트랜잭션이 길어지면 커넥션 풀이 고갈되어 다른 요청이 전부 대기하게 된다. 특히 트랜잭션 안에서 외부 API를 호출하면 응답 시간만큼 커넥션이 잠기므로 반드시 트랜잭션 밖으로 분리해야 한다.
  2. 락 유지 시간: 트랜잭션이 길어지면 락 유지 시간도 길어져 다른 트랜잭션의 동시성이 떨어진다.

강사 실무 사례: 트랜잭션 안에서 호출하는 외부 API에 타임아웃이 설정되어 있지 않아 트랜잭션이 수십 초씩 커넥션을 점유했고, 결국 커넥션 풀이 고갈되면서 서비스 전체가 멈춘 장애가 있었다. 트랜잭션 범위를 잘못 잡은 것과 타임아웃 미설정 두 가지가 전체 장애로 이어진 것이다.

핵심 키워드: ① 커넥션 점유 ② 외부 API 분리 ③ 트랜잭션 길이와 락의 관계

답변 레벨 차이

레벨 답변 요지 평가
실버 "트랜잭션은 가능한 짧게 유지해야 한다. 길어지면 다른 요청이 대기한다" 방향은 맞지만 "왜 대기하는지" 원인이 빠짐
골드 + 커넥션 점유 → 풀 고갈이라는 원인 명시, 외부 API 분리라는 실무 지침, 락 유지 시간이라는 두 번째 원인 "실제로 겪어본 사람"이라는 인상을 줌

꼬리 질문


Q. 트랜잭션 격리 수준의 종류를 설명해 주세요

관련 노트: isolation

핵심 답변 (골드 수준)

트랜잭션 격리 수준은 네 가지가 있다. 이름 나열이 아니라 각 수준에서 어떤 데이터를 읽을 수 있는지까지 말해야 한다.

핵심 키워드: 네 가지 격리 수준 각각 + 각 수준에서 읽을 수 있는 데이터의 범위. 특히 REPEATABLE READ의 "자신의 트랜잭션이 생성되기 이전"이라는 표현과 SERIALIZABLE의 동시성 트레이드오프.

답변 레벨 차이

레벨 답변 요지 평가
실버 "네 가지가 있고, READ UNCOMMITTED가 가장 낮고 SERIALIZABLE이 가장 높다" 키워드 나열 + 높낮이만 암기. 각 수준의 동작 원리를 모른다는 인상
골드 각 수준마다 읽을 수 있는 데이터를 구체적으로 명시, REPEATABLE READ의 시작 시점 기준, SERIALIZABLE의 양면성 동작과 트레이드오프까지 이해했음을 보여줌

꼬리 질문


Q. 트랜잭션 격리 수준에 따라 나타날 수 있는 문제(더티 리드, 논리피터블 리드, 팬텀 리드)를 설명해 주세요

관련 노트: isolation

핵심 답변 (골드 수준)

정의만이 아니라 각 문제가 어떤 격리 수준에서 발생하는지 매핑해서 답해야 한다.

팬텀 리드는 아무 때나 발생하는 것이 아니라 "잠금 읽기"라는 특정 조건에서 발생한다는 점이 핵심이다. 그 이유는 다음 꼬리 질문(해결 방법)에서 이어진다.

핵심 키워드: ① 문제 ↔ 격리 수준 매핑(더티 리드–READ UNCOMMITTED / 논리피터블 리드–READ COMMITTED / 팬텀 리드–REPEATABLE READ) ② 잠금 읽기 조건 ③ (MySQL 한정) InnoDB 외의 REPEATABLE READ에서 팬텀 리드 발생

답변 레벨 차이

레벨 답변 요지 평가
실버 세 가지 문제의 정의만 나열 ("더티 리드는 커밋 안 된 데이터를 읽는 문제…") 정의는 다 맞지만 격리 수준과의 매핑이 없음. 팬텀 리드를 "없던 데이터가 생기는 문제"로만 설명해 "왜?"라는 의문이 남음
골드 + 격리 수준 매핑, 팬텀 리드의 잠금 읽기 조건 명시 문제가 "어디서" "어떤 조건에서" 생기는지까지 짚음

꼬리 질문


Q. 트랜잭션 격리 수준에 따라 나타날 수 있는 문제는 어떻게 해결하나요?

관련 노트: isolation

핵심 답변 (골드 수준)

문제의 정의는 잘 답해도 해결은 명쾌하게 답하지 못하는 경우가 많다. "커밋된 데이터만 읽으면 된다"는 결과이지 방법이 아니다. 어떤 메커니즘으로 해결하는지를 말해야 한다.

일반 SELECT와 잠금 읽기(SELECT ... FOR UPDATE)의 차이를 구분하는 것이 팬텀 리드를 구조적으로 이해했다는 신호가 된다.

핵심 키워드: ① 언두 영역 ② MVCC 스냅샷 vs 잠금 읽기 ③ 넥스트 키 락

답변 레벨 차이

레벨 답변 요지 평가
실버 "더티 리드는 커밋된 데이터만 읽으면 해결, 논리피터블 리드는 시작 시점 스냅샷, 팬텀 리드는 SERIALIZABLE" 방향은 맞지만 전부 결과이지 방법이 아님. 메커니즘 부재
골드 + 언두 영역이라는 구현 메커니즘, 일반 SELECT와 SELECT FOR UPDATE의 구분, 넥스트 키 락 "어떻게"를 채워 구조적 이해를 증명

꼬리 질문


Q. MVCC란 무엇이고 왜 사용하나요?

핵심 답변 (골드 수준)

MVCC(Multi-Version Concurrency Control)는 하나의 레코드에 대해 여러 개의 버전이 동시에 관리되는 것을 의미한다.

InnoDB에서는 언두 영역을 활용하여 이를 구현하는데, 언두 영역이란 UPDATE나 DELETE 시 변경되기 전 데이터를 보관하는 곳이다.

MVCC를 사용하면 락을 사용하지 않고 읽기 작업을 수행할 수 있어 동시성이 크게 향상된다. 트랜잭션이 시작되면 그 시점의 스냅샷을 기준으로 데이터를 읽고, 다른 트랜잭션이 이후에 데이터를 변경하더라도 내 트랜잭션은 언두 영역에 보관된 시작 시점의 버전만 보게 된다. 덕분에 논리피터블 리드 같은 문제가 자연스럽게 해결된다.

"읽기에 락을 걸지 않으니 다른 트랜잭션이 기다릴 필요가 없다" — 이것이 MVCC의 존재 이유이며, 이 한 문장을 말할 수 있어야 MVCC를 안다고 할 수 있다.

핵심 키워드: ① 언두 영역(구현 방식) ② 락 없는 읽기 ③ 스냅샷과 언두 영역의 관계(트랜잭션 시작 시점의 버전을 언두 영역에서 읽는 구조)

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "MVCC는 Multi-Version Concurrency Control의 약자입니다" 약자 풀이만 하고 끝. 브론즈로 담기도 민망한 수준
실버 "하나의 레코드에 여러 버전을 관리하는 것. 동시성을 높이기 위해 사용한다" 정의와 목적은 있으나 "어떻게 관리하는지", "동시성이 왜 높아지는지"가 없음
골드 + 언두 영역 구현, 락 없는 읽기 원리, 스냅샷 동작, 논리피터블 리드 해결까지 연결 구현 방식과 핵심 원리를 모두 갖춤

꼬리 질문


Q. InnoDB는 Repeatable Read만으로 팬텀 리드를 어떻게 해결하나요?

핵심 답변 (골드 수준)

InnoDB는 **레코드 락과 갭 락(Gap Lock)을 합친 넥스트 키 락(Next-Key Lock)**을 사용한다.

예를 들어 다음 쿼리를 실행하면:

SELECT * FROM t WHERE id = 5 FOR UPDATE;

id가 5인 레코드뿐만 아니라 5의 전후 갭(5보다 작은 쪽, 5보다 큰 쪽 범위)에 대해서도 락이 걸린다. 그래서 다른 트랜잭션이 해당 범위에 데이터를 추가하거나 수정할 수 없게 되어 팬텀 리드가 방지된다.

팬텀 리드 자체를 정확히 이해하고 답변하는 면접자가 많지 않아서, 여기를 명확하게 답변하면 트랜잭션을 좋아하는 면접관 눈에 확 띈다.

핵심 키워드: ① 넥스트 키 락 = 레코드 락 + 갭 락 ② 예시와 함께 설명하는 전후 갭

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "갭 락이라는 걸 사용해서 해결하는 걸로 알고 있다" 키워드만 알고 동작·넥스트 키 락과의 관계가 전혀 없음
실버 "레코드에 락을 걸 때 주변 범위에도 락을 걸어서 그 범위에 INSERT를 못 한다" 방향은 맞지만 넥스트 키 락 = 레코드 락 + 갭 락이라는 정확한 구조와 구체적 예시가 없음
골드 + 정확한 구조 명시, SELECT FOR UPDATE WHERE id=5 예시로 전후 갭 락 시나리오 제시 추상적 설명이 실제 동작으로 바뀌어 신뢰도 상승

꼬리 질문


섹션 3. 락과 동시성 제어

Q. DB 락이란 무엇이고 어떤 종류가 있나요?

핵심 답변 (골드 수준)

DB 락은 여러 트랜잭션의 공유 데이터에 대한 액세스를 제어하기 위해 사용되는 메커니즘이다.

"충돌을 막는다"는 결과이고 "액세스를 제어한다"는 메커니즘이다. 이 표현을 쓰면 락의 목적까지 이해하고 있음을 보여줄 수 있다.

핵심 키워드: ① 액세스 제어 ② 공유 락 ③ 배타 락 (각각 정확한 맥락과 함께)

답변 레벨 차이

레벨 답변 요지 평가
실버 "락은 동시 접근 시 충돌을 막기 위한 메커니즘. 공유 락은 읽기만 가능, 배타 락은 읽기·쓰기 모두 불가능" 키워드는 좋으나 "읽기만 가능"이 어느 주체·어느 맥락에서인지 추상적
골드 + 액세스 제어라는 목적 표현, "여러 트랜잭션이 동시에 읽을 수 있고 락 해제까지 수정 불가" 같은 구체적 상황 명시 같은 정보량이지만 전달되는 인상이 다름

꼬리 질문


Q. 낙관적 락과 비관적 락의 차이는 무엇인가요?

핵심 답변 (골드 수준)

구현 레이어(DB단 vs 애플리케이션단)의 구분이 중요한 이유는 예외가 발생했을 때 롤백을 누가 처리하느냐가 달라지기 때문이다. DB단은 자동 롤백, 애플리케이션단은 직접 구현이다.

핵심 키워드: ① 비관적 락 ② 낙관적 락 ③ 구현 레이어의 차이(롤백 주체) ④ 충돌 빈도

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "낙관적 락은 락을 안 거는 거고, 비관적 락은 거는 거다" 의외로 많은 답변. 정보가 거의 없음
실버 "비관적 락은 SELECT FOR UPDATE로 DB에서 직접 락, 낙관적 락은 버전 컬럼으로 충돌 감지. 충돌 많으면 비관적, 적으면 낙관적" 구현 방식·사용 시점은 있으나 DB단/애플리케이션단이라는 레이어 차이와 롤백 처리 주체가 빠짐
골드 + 구현 레이어 명시, 예외 시 롤백 주체, Compare-and-Set이라는 정확한 용어 구현 방식을 넘어 구조까지 이해했음을 증명

꼬리 질문


Q. 낙관적 락과 비관적 락은 구체적으로 어떤 기준으로 선택하나요?

핵심 답변 (골드 수준)

즉 판단 기준은 충돌 빈도 하나가 아니라 임계 영역의 길이재시도 비용까지 포함된다. 임계 영역이 길면 재시도 한 번의 비용이 크기 때문에, 충돌이 적더라도 오히려 비관적 락이 나을 수 있다.

보충: 충돌 빈도는 임계 영역의 길이 외에 비즈니스 맥락에 따라서도 다르다. 선착순 상품 구매는 짧은 시간에 요청이 쏟아지지만, 블로그 포스팅 같은 요청은 비교적 골고루 들어온다. 이런 맥락을 곁들이면 더 좋다.

강사 실무 사례: 충돌이 잦은 로직에 낙관적 락을 적용했더니 재시도 횟수를 넘겨 일부 요청이 유실된 적이 있다. 락 선택 하나가 데이터 유실로 이어질 수 있다.

핵심 키워드: ① 충돌 빈도 ② 임계 영역의 길이 ③ 충돌과 임계 영역의 관계 (+비즈니스 맥락)

답변 레벨 차이

레벨 답변 요지 평가
실버 "충돌 적으면 낙관적, 많으면 비관적. 낙관적 락은 충돌 시 재시도해야 하고 비관적 락은 DB 레벨에서 대기시키므로 재시도가 없기 때문" 맞는 말이지만 충돌 빈도 외의 기준이 없음
골드 + 임계 영역의 길이, 재시도 비용이라는 추가 기준, 비즈니스 맥락 보충 결론은 같지만 근거의 깊이가 다름 → 원리를 이해했다는 방증

꼬리 질문


Q. 분산락이란 무엇이고 언제 사용하나요?

핵심 답변 (골드 수준)

DB의 비관적 락은 해당 DB 안의 로우만 잠글 수 있다. 하지만 실무에서는 재고를 차감한 뒤 외부 결제 API를 호출한다거나, 캐시와 DB를 동시에 갱신해야 하는 것처럼 하나의 DB 트랜잭션으로 묶을 수 없는 자원들을 함께 제어해야 하는 경우가 많다. 이럴 때 Redis 같은 중앙 저장소에 락을 걸어 DB 바깥까지 포함한 동시성을 제어하는 것이 분산락이다.

핵심은 "DB가 여러 대라서"가 아니다. DB(예: MySQL 인스턴스)가 한 대여도 DB 바깥에 자원이 있으면 분산락이 필요하다. 출발점을 "비관적 락의 범위 한계"에서 잡아야 한다.

핵심 키워드: ① DB 트랜잭션 범위의 한계 ② 비관적 락과 분산락의 범위 차이(DB 안의 로우 vs DB 바깥까지 포함한 자원)

답변 레벨 차이

레벨 답변 요지 평가
실버 "분산 환경에서는 DB가 여러 대 있어서 비관적 락이 동작하지 않으므로 Redis 같은 외부 시스템으로 잠금을 건다" 방향 자체가 어긋남. "DB가 여러 대라서"는 핵심이 아님
골드 비관적 락의 한계(로우만 잠금)에서 출발 + 재고·결제 API, 캐시·DB 갱신이라는 구체적 실무 시나리오 왜 필요한지가 바로 와닿는 답변

꼬리 질문


Q. Lost Update Problem이란 무엇이고 왜 트랜잭션 격리 수준으로 해결하지 못하나요?

관련 노트: isolation

핵심 답변 (골드 수준)

Lost Update Problem은 Read-Modify-Write 사이클에서 발생한다. 값을 SELECT로 읽고, 애플리케이션에서 계산한 뒤, UPDATE로 쓸 때 두 트랜잭션이 동시에 이 사이클을 수행하면 두 번째 쓰기가 첫 번째 변경을 포함하지 않게 된다.

예를 들어 잔액 1,000원을 두 트랜잭션이 동시에 읽고 하나는 +500, 하나는 +300을 하면, 최종 잔액이 1,800원이 아니라 1,500원 또는 1,300원이 될 수 있다.

트랜잭션 격리 수준은 더티 리드, 논리피터블 리드 같은 읽기 관련 동시성 문제는 방지할 수 있지만, Lost Update Problem 같은 쓰기 관련 동시성 문제는 해결할 수 없다. 격리 수준이 커버하는 범위와 커버하지 못하는 범위를 나눠서 답하는 것이 핵심이다.

핵심 키워드: ① Read-Modify-Write ② 잔액 숫자 예시 ③ 읽기 관련 vs 쓰기 관련 동시성 문제의 구분

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "두 사람이 동시에 같은 데이터를 수정하면 하나가 사라지는 문제" 현상만 있고 발생 패턴도, 격리 수준으로 왜 안 되는지도 없음
실버 "두 트랜잭션이 같은 데이터를 읽고 각자 수정해 쓰면 나중 쓰기가 먼저 쓴 변경을 덮어쓴다. 격리 수준은 읽기 문제 해결용이라 쓰기 충돌은 못 막는다" 정의·한계는 맞지만 숫자 예시가 없어 실제로 이해했는지 판단이 어려움
골드 + Read-Modify-Write 사이클 용어, 잔액 1000원 구체 시나리오, 읽기/쓰기 문제의 명확한 구분 설득력이 다른 답변

꼬리 질문


Q. Lost Update Problem은 어떻게 해결하나요?

핵심 답변 (골드 수준)

낙관적 락이나 비관적 락을 사용하여 해결할 수 있다. 더 나아가, SELECT한 변수를 UPDATE문에 사용하는 것이 아니라 원자적 쓰기 연산 하나로 처리하는 방법이 있다.

UPDATE accounts SET balance = balance + 100 WHERE id = 1;

이렇게 UPDATE문 하나로 처리하면 읽기와 쓰기가 분리되지 않으므로 Read-Modify-Write 패턴 자체가 사라져 Lost Update Problem이 원천적으로 발생하지 않는다. 이때 DB가 자체적으로 묵시적 배타 락을 획득하여 쓰기 충돌을 방지하고, MVCC 덕분에 다른 트랜잭션의 읽기는 차단되지 않는다.

핵심 키워드: ① 낙관적 락 / 비관적 락 ② 원자적 쓰기 연산(UPDATE문을 통한 묵시적 배타 락) — 특히 후자를 반드시 기억할 것

답변 레벨 차이

레벨 답변 요지 평가
실버 "낙관적 락(버전 비교)이나 비관적 락(SELECT FOR UPDATE)으로 해결한다" 틀리진 않지만, 락 없이 패턴 자체를 없애는 더 쉬운 방법(원자적 쓰기)이 빠짐
골드 + balance = balance + 100 원자적 쓰기, 묵시적 배타 락 + MVCC의 조합 설명 섹션 2의 MVCC 개념이 여기서 다시 연결됨

꼬리 질문


섹션 4. 인덱스

Q. 인덱스란 무엇이고 장단점을 설명해 주세요

핵심 답변 (골드 수준)

인덱스는 DBMS의 저장 성능을 희생하고 검색 성능을 높이기 위해 만들어진 자료 구조다.

핵심 키워드: ① 저장 성능 희생 ↔ 검색 성능 향상 트레이드오프 ② "사용하지 않음" 처리 ③ 약 10% 저장 공간

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "인덱스는 검색 속도를 높여주는 자료 구조. 단점은 추가 저장 공간이 필요하다" 왜 추가 공간이 필요한지, 무엇을 희생하는지 없음
실버 + "데이터 변경 시 인덱스도 함께 업데이트해야 한다" 저장 성능 희생이라는 트레이드오프 표현과 "사용하지 않음" 처리 메커니즘이 빠짐 → 인덱스가 왜 비대해지는지 설명 불가
골드 + 트레이드오프 명시, 사용하지 않음 처리 메커니즘, 약 10%라는 구체적 수치 수치와 메커니즘으로 신뢰도 상승

꼬리 질문


Q. 인덱스는 왜 해시 테이블이 아니라 주로 B-Tree를 사용하나요?

핵심 답변 (골드 수준)

해시 테이블 내의 데이터는 정렬되어 있지 않으므로 부등호 연산이 불가능하다. 인덱스 특성상 기준 값보다 크거나 작은 요소를 탐색하는 범위 검색이 많기 때문에 B-Tree를 사용한다.

다만 **등호(=) 연산만 사용되는 경우에는 해시 인덱스가 B-Tree보다 훨씬 좋은 성능(O(1))**을 낼 수 있다. 이 트레이드오프를 함께 말해야 양쪽을 다 아는 사람이 된다.

부록 — 같은 균형 트리인 레드-블랙 트리가 아니라 왜 B-Tree인가?

핵심 키워드: ① 해시의 한계(부등호 연산 불가) ② B-Tree 선택 이유(범위 검색) ③ B-Tree vs 해시 트레이드오프(등호 연산은 해시가 우위)

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "해시가 O(1)이라 더 빠를 것 같은데 B-Tree를 쓴 이유는 잘 모르겠다" 실제로 이렇게 답하는 사람이 있음
실버 "해시는 정렬이 안 되어 있어 범위 검색이 안 되므로 B-Tree가 적합하다" 맞지만 반대 케이스(등호 연산은 해시가 빠름)가 빠져 한쪽만 보는 인상
골드 + 부등호 연산이라는 더 정확한 표현, 등호 연산에서의 해시 우위 트레이드오프 양면을 모두 아는 답변

꼬리 질문


Q. 인덱스는 B-Tree 방식으로 구체적으로 어떻게 동작하나요?

핵심 답변 (골드 수준)

B-Tree 자료 구조를 사용해서, 검색할 값을 루트 노드에서부터 비교를 시작해 브랜치 노드를 거치고 최종적으로 리프 노드까지 찾아 들어간다. 그리고 리프 노드의 레코드 주소를 사용하여 실제 데이터 파일에 존재하는 레코드를 읽는다.

탐색은 "루트 → 브랜치 → 리프"의 3단계이고, 마지막에 레코드 주소로 데이터 파일을 읽는 단계까지 말해야 탐색 과정이 완성된다.

핵심 키워드: ① 루트 → 브랜치 → 리프 탐색 ② 리프 노드의 레코드 주소로 데이터 파일 접근

답변 레벨 차이

레벨 답변 요지 평가
실버 "루트 노드로부터 시작해 원하는 값을 찾아 내려가고, 리프 노드에서 데이터의 위치를 알 수 있다" 큰 그림은 맞지만 브랜치 노드라는 중간 단계와 실제 데이터 파일을 읽는 마지막 단계가 빠짐 → 반만 설명
골드 + 브랜치 노드 명시, 레코드 주소로 실제 데이터 파일을 읽는 마지막 단계 탐색 과정 완성

꼬리 질문


Q. 클러스터링 인덱스와 비클러스터링 인덱스의 차이는 무엇인가요?

핵심 답변 (골드 수준)

"PK 순서로 정렬 저장"이 아니라 "PK 값에 의해 물리적 저장 위치가 결정된다"가 클러스터링 인덱스의 본질이다. 그리고 리프 노드 저장 내용의 차이(모든 컬럼 vs PK만)를 알아야 왜 비클러스터링 인덱스가 재탐색을 필요로 하는지 원리로 설명할 수 있다.

핵심 키워드: ① 클러스터링 인덱스(물리적 저장 위치) ② 비클러스터링 인덱스 ③ 리프 노드 저장 내용의 차이(모든 컬럼 vs PK만)

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "클러스터링은 PK에 걸리는 인덱스, 비클러스터링은 그 외 컬럼에 걸리는 인덱스" 적용 대상은 맞지만 그건 결과일 뿐. 구조적 차이가 핵심
실버 "클러스터링은 데이터가 PK 순서로 정렬 저장, 비클러스터링은 별도 인덱스 구조라 PK로 다시 찾아야 한다" 리프 노드에 무엇이 저장되는지가 빠져 재탐색의 원리를 설명 못 함
골드 + 물리적 저장 위치 결정, 리프 노드 저장 내용 구분 재탐색이 필요한 이유가 자연스럽게 설명됨

꼬리 질문


Q. InnoDB에서 인덱스 검색은 구체적으로 어떻게 동작하나요? (2단계 검색)

핵심 답변 (골드 수준)

비클러스터링 인덱스의 리프 노드에는 해당 레코드의 PK만 존재한다. 이 PK를 이용하여 클러스터링 인덱스를 다시 탐색한다. 클러스터링 인덱스의 리프 노드에는 해당 PK에 대응되는 레코드의 모든 정보가 들어있으므로, 이 2단계 검색을 통해 최종 데이터를 가져온다.

앞 질문과 거의 같은 내용이지만, 면접관이 굳이 "InnoDB에서"라고 다시 묻는 것은 방금 답변한 구조가 MySQL(InnoDB) 기준임을 알고 말한 것인지 검증하는 차원이다. PK에 따라 물리적 위치가 재배열되는 구조를 갖지 않는 DB도 있기 때문이다.

부록 — PostgreSQL의 인덱스 구조: PostgreSQL 인덱스는 클러스터링 구조가 없고, 항상 리프 노드에 실제 데이터 파일의 위치를 담고 있는 TID 값만 있다. B-Tree 인덱스 리프 노드의 키와 TID를 통해 실제 데이터 스토리지의 디스크를 조회하여 데이터를 탐색한다. 즉 PostgreSQL은 검색 과정이 항상 이 방식 하나로 통일되어 있다. (인덱스 동작 → 클러스터링/비클러스터링 차이 → InnoDB 동작 흐름이 데브시스터즈 면접에서 그대로 나온 적이 있다.)

핵심 키워드: ① 클러스터링 인덱스를 다시 탐색한다는 명시적 경로 ② "2단계 검색"이라는 구조적 명칭

답변 레벨 차이

레벨 답변 요지 평가
실버 "비클러스터링 인덱스 리프 노드에는 PK가 저장되어 있어 PK를 찾은 다음 그 PK로 다시 데이터를 조회한다" "PK로 다시 조회"가 구체적으로 무엇인지(클러스터링 인덱스 재탐색) 빠짐
골드 + 명시적 경로와 "2단계 검색" 명칭, 클러스터링 인덱스 리프 노드의 내용 검색 과정이 구조적으로 명확해짐

꼬리 질문


Q. 복합 인덱스 사용 시 주의할 점은 무엇인가요?

핵심 답변 (골드 수준)

복합 인덱스에서 두 번째 컬럼은 첫 번째 컬럼에 의존해서 정렬되어 있으므로 컬럼 순서가 중요하다.

"카디널리티가 높은 컬럼을 앞에"에서 멈추지 말고, 두 번째 컬럼의 정렬이 첫 번째 컬럼에 의존한다는 원리를 먼저 말해야 한다. 이 원리를 알면 등호 조건을 앞에 두는 이유도 자연스럽게 따라온다. (최근 네이버 채용 과정에서 나온 질문)

핵심 키워드: ① 두 번째 컬럼은 첫 번째 컬럼에 의존해 정렬 ② 등호 조건 앞 / 범위 검색 뒤 ③ 변경이 적은 컬럼

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "복합 인덱스는 여러 컬럼을 하나로 묶는 것이고 컬럼 순서가 중요하다" 결론만 있고 "왜"가 없음
실버 "컬럼 순서가 중요하고 카디널리티가 높은 컬럼을 앞에 두는 것이 좋다" 의존 정렬이라는 핵심 원리와 등호/범위 배치 전략이 빠짐
골드 + 의존 정렬 원리, 등호/범위 배치 전략, 변경 비용 고려 원리 → 전략 → 실무 고려사항의 완결 구조

꼬리 질문


Q. 동료가 불(bool) 타입 컬럼에 인덱스를 건다면 어떤 의견을 내시겠어요?

핵심 답변 (골드 수준)

불 타입은 키가 true/false 두 가지뿐이어서 한쪽을 조회하면 **리프 노드가 전체 데이터의 약 50%**가 된다. 인덱스 레인지 스캔은 랜덤 I/O를 사용하므로, 전체 데이터의 20~30% 이상을 읽을 때는 순차 I/O를 사용하는 풀 스캔이 더 효율적이다. 따라서 인덱스 효과가 없을 가능성이 크다는 의견과 함께, EXPLAIN으로 실제 실행 계획을 확인해서 근거를 마련하자고 제안하겠다.

"카디널리티가 낮아서 안 좋다"는 결론이지 근거가 아니다. 인덱스의 I/O 방식(랜덤)과 풀 스캔의 I/O 방식(순차)이 다르다는 것이 핵심 근거다. (과거 당근 신입 과정 출제 질문)

핵심 키워드: ① 불 타입은 전체 데이터의 50% ② 랜덤 I/O vs 순차 I/O (20~30% 기준) ③ EXPLAIN으로 검증

답변 레벨 차이

레벨 답변 요지 평가
실버 "불은 값이 2개뿐이라 카디널리티가 낮아 인덱스 효과가 없을 것 같다" 방향은 맞지만 "왜 카디널리티가 낮으면 효과가 없는지" 근거 부재
골드 + 50% 수치로 문제 가시화, 랜덤/순차 I/O 구분과 20~30% 기준, EXPLAIN 검증 제안 감이 아니라 데이터로 판단하는 사람이라는 인상

꼬리 질문


Q. LIKE 'xxx%'는 인덱스를 타는데 '%xxx%'는 왜 인덱스를 타지 않나요?

핵심 답변 (골드 수준)

B-Tree 인덱스는 왼쪽 값을 기준으로 오른쪽이 정렬되어 있다.

-- 인덱스 사용 가능: 시작 값이 고정되어 정렬 순서를 활용할 수 있음
SELECT * FROM users WHERE name LIKE '김%';

-- 인덱스 사용 불가: 와일드카드가 앞에 붙어 시작점을 특정할 수 없음
SELECT * FROM users WHERE name LIKE '%김%';

LIKE 'xxx%'는 시작 값이 고정되어 있어 인덱스의 정렬 순서를 활용할 수 있지만, '%xxx%'는 와일드카드가 앞에 붙어 탐색의 시작점을 특정할 수 없으므로 인덱스를 활용할 수 없다. (이력서에 검색 관련 키워드가 있으면 매우 높은 확률로 나오는 질문)

핵심 키워드: ① 왼쪽 기준으로 오른쪽 정렬이라는 B-Tree 원리 ② 정렬 원리와 LIKE의 관계(시작 값 고정 → 탐색 가능 / 시작 값 불특정 → 불가능)

답변 레벨 차이

레벨 답변 요지 평가
실버 "앞부분이 고정이라 인덱스를 탈 수 있고, 앞에 와일드카드가 있으면 못 탄다" 결론은 맞지만 "왜"(B-Tree의 정렬 원리)가 빠져 외운 건지 이해한 건지 구분 불가
골드 + B-Tree 정렬 원리를 먼저 제시, "시작점을 특정할 수 없다"는 표현 원리에서 결론이 도출되는 답변

꼬리 질문


섹션 5. NoSQL과 RDBMS 비교

Q. RDBMS와 NoSQL의 차이를 설명해 주세요. 언제 각각을 사용하나요?

핵심 답변 (골드 수준)

RDBMS의 진짜 강점은 스키마보다 조인이고, NoSQL의 근본 특성은 유연함보다 조인이 없는 구조라는 점이다. 이 근본 차이를 알아야 나머지 차이들이 왜 생기는지 설명할 수 있다.

핵심 키워드: ① RDBMS — 트랜잭션과 조인 ② NoSQL — 유연성·스케일아웃 ③ 선택 기준의 핵심 = 조인

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "RDBMS는 관계형, NoSQL은 비관계형. 대규모 데이터면 NoSQL을 쓴다" 정의 반복 + 단순한 선택 기준
실버 "RDBMS는 엄격한 스키마·SQL, NoSQL은 유연한 스키마·수평 확장. RDBMS는 변경 많을 때, NoSQL은 읽기 많고 스키마가 자주 바뀔 때" 차이·기준이 둘 다 있으나 조인이라는 핵심이 빠짐
골드 + 트랜잭션·조인 강점 명시, "조인이 적고 변경이 적은 데이터"라는 원리 기반 선택 기준 선택 기준이 원리에 기반하게 됨

꼬리 질문


Q. 데이터 모델링 관점에서 RDBMS와 NoSQL의 설계 방식은 어떻게 다른가요?

핵심 답변 (골드 수준)

저장 방식이 다른 것(정규화 vs 문서에 모아 저장)은 결과이고, **설계 순서가 다르다는 것(데이터부터 vs 쿼리부터)**이 원인이다.

핵심 키워드: ① RDBMS = 데이터 중심 설계 ② NoSQL = 액세스 패턴 중심 설계 (한 번의 조회 → 비정규화의 이유)

답변 레벨 차이

레벨 답변 요지 평가
실버 "RDBMS는 정규화해서 데이터를 나누고, NoSQL은 하나의 문서에 모아서 저장한다" 저장 방식(결과)만 있고 왜 다른지(설계 순서)가 없음
골드 + 설계 순서의 차이, "한 번의 조회로"라는 NoSQL 설계 핵심 비정규화의 이유까지 설명됨

꼬리 질문


Q. RDBMS에서도 스케일아웃이 가능한가요?

핵심 답변 (골드 수준)

가능하다. 다만 비용이 크다.

그래서 "RDBMS의 스케일아웃은 불가능한 건 아니지만 비용이 크다"가 정확한 표현이다.

핵심 키워드: ① 읽기 확장 = 리드 레플리카 ② 쓰기 확장 = 샤딩(조인·트랜잭션 복잡성)

답변 레벨 차이

레벨 답변 요지 평가
실버 "RDBMS는 스케일업만 가능하고 스케일아웃은 NoSQL만 가능하다" 흔한 오해. 단정하면 면접관이 "정말요?"라고 되물음
골드 읽기/쓰기 확장을 분리해 각각의 방법과 한계 제시, "비용이 크다"는 정확한 결론 확장 가능성과 구조적 한계를 동시에 보여줌

꼬리 질문


Q. NoSQL은 왜 스케일아웃에 유리한가요?

핵심 답변 (골드 수준)

RDBMS는 테이블 간 관계로 인해 복잡한 조인이 수반되어 샤딩 구현이 어렵다. 반면 NoSQL은 집합 지향 모델이라 연관 데이터가 함께(한 덩어리로) 저장되어 있어 다른 샤드에서 조인할 필요가 없고, DB 자체에서 샤딩을 효과적으로 지원하기 때문에 스케일아웃에 유리하다.

연관 데이터가 한 덩어리로 있으니 샤드를 나눠도 다른 샤드를 참조할 필요가 없다 — 이것이 "왜 쉬운지"의 근본 이유다. RDBMS의 한계(조인 때문에 어려움)와 대비 구조로 설명하면 앞의 학습 내용이 자연스럽게 연결된다.

핵심 키워드: ① 집합 지향 모델 ② 조인 유무와 샤딩 난이도의 관계

답변 레벨 차이

레벨 답변 요지 평가
실버 "NoSQL은 샤딩이 쉬워서 서버를 추가하기 좋다. RDBMS보다 수평 확장에 유리하다" 결론만 있고 "왜 쉬운지"가 없음 (강사도 과거 면접에서 "왜요?"에 막힌 경험)
골드 + 집합 지향 모델이라는 구조적 특성, RDBMS와의 대비 구조 근본 이유가 채워짐

꼬리 질문


Q. MySQL과 PostgreSQL은 어떤 차이가 있나요?

핵심 답변 (골드 수준)

크게 네 가지 차이가 있다. 비교 질문은 이렇게 개수를 먼저 말하고 하나씩 짚는 것이 효과적이다.

  1. 기본 트랜잭션 격리 수준: MySQL은 REPEATABLE READ, PostgreSQL은 READ COMMITTED다.
  2. 인덱스 구조: MySQL InnoDB는 PK가 클러스터링 인덱스이고 리프 노드에 데이터가 저장되지만, PostgreSQL은 리프 노드에 위치 식별자인 TID만 저장한다.
  3. 스키마 구조: MySQL은 DB 아래 바로 테이블이 만들어지지만, PostgreSQL은 DB → 스키마 → 테이블 구조로 권한 그룹화가 용이하다.
  4. MVCC 구현: MySQL은 언두 로그를 사용하고, PostgreSQL은 원본에 마킹 후 새 레코드를 추가하는 MGA(Multi-Generation Architecture) 방식이다.

앞 섹션에서 배운 격리 수준, 클러스터링 인덱스, MVCC 개념이 여기서 다시 연결된다.

핵심 키워드: ① 격리 수준 ② 인덱스 ③ 스키마 구조 ④ MVCC

답변 레벨 차이

레벨 답변 요지 평가
실버 "MySQL은 InnoDB 엔진에 REPEATABLE READ 기본, PostgreSQL은 READ COMMITTED 기본. MVCC 구현도 다르다" 격리 수준·MVCC 두 가지만 언급, 답변이 부실함
골드 네 가지(격리 수준·인덱스·스키마·MVCC)로 구조화 "정리되어 있는 사람"이라는 인상 + 기존 학습 개념의 응용

꼬리 질문


Q. CAP 이론이 무엇인가요?

핵심 답변 (골드 수준)

분산 시스템은 일관성(Consistency), 가용성(Availability), 분할 내성(Partition tolerance) 세 가지를 모두 만족할 수 없다는 이론이다.

핵심은 그 다음이다. 실제로 네트워크 분단은 피할 수 없는 결함이므로 P는 사실상 필수이고, 결국 C와 A 중 하나를 선택하는 문제가 된다. CP는 MongoDB처럼 일관성을 우선하고, AP는 Cassandra처럼 가용성을 우선한다.

세 가지 중 하나를 못 고르는 것은 셋이 동등해서가 아니라 P는 빠질 수 없기 때문이다 — 이 구분이 있어야 CAP를 외운 게 아니라 이해한 것이 된다.

핵심 키워드: ① C/A/P의 개념 ② P는 사실상 필수(네트워크 분단은 피할 수 없는 결함) ③ 결국 C와 A 중 선택

답변 레벨 차이

레벨 답변 요지 평가
실버 "세 가지를 동시에 만족할 수 없다는 이론. MongoDB는 CP, Cassandra는 AP" 이론 핵심과 예시는 좋으나 C·A·P를 동등하게 나열 → P가 전제라는 것을 아는지 불명
골드 + P 필수 전제와 그 이유, C vs A 선택 구도 암기 답변에서 벗어남

꼬리 질문


Q. 실무에서 C(일관성)와 A(가용성)는 어떤 기준으로 선택하나요?

핵심 답변 (골드 수준)

데이터 불일치가 비즈니스에 얼마나 치명적인가로 판단한다.

"중요한 데이터"는 주관이고 "금전 손실이 발생하는가"는 상대적으로 객관적인 기준이다. 이 기준이 있으면 어떤 도메인이든 판단할 수 있다. AP를 택한다고 일관성을 완전히 포기하는 것이 아니라는 점(Eventual Consistency), 그리고 그 한계까지 짚어야 한다. Eventual Consistency는 어떤 분산 시스템 책에서도 빠지지 않는 키워드이므로 반드시 학습할 것.

핵심 키워드: ① 비즈니스 임팩트(금전 손실 여부)라는 판단 기준 ② Eventual Consistency 개념 ③ Eventual Consistency의 한계(수렴 시점 미보장)

답변 레벨 차이

레벨 답변 요지 평가
실버 "결제 같은 중요한 데이터는 일관성, SNS 같은 서비스는 가용성" 예시는 좋으나 "중요한"이라는 기준이 모호하고 AP 선택 시 일관성의 향방이 빠짐
골드 + 금전 손실이라는 객관적 기준, Eventual Consistency와 그 한계 장점과 한계를 모두 인식한 답변

꼬리 질문


섹션 6. 커넥션과 커넥션 풀

Q. DB 커넥션이란 무엇이고 생성 비용이 큰 이유는 무엇인가요?

핵심 답변 (골드 수준)

DB 커넥션은 DB를 사용하기 위해 애플리케이션과 DB 간 통신을 할 수 있는 수단이다. 커넥션 생성 비용이 큰 이유는 크게 세 가지다.

  1. TCP 3-way 핸드셰이크로 네트워크 왕복이 발생한다.
  2. TCP 연결 위에서 인증·권한 확인을 거쳐야 한다.
  3. DB가 해당 커넥션을 위한 세션을 초기화해야 한다.

매 요청마다 이 과정을 반복하면 응답 시간이 크게 늘어난다. 이 마지막 한 줄이 있어야 커넥션 풀이 왜 필요한지로 자연스럽게 이어진다.

핵심 키워드: ① TCP 핸드셰이크 ② 인증·권한 확인 ③ 세션 초기화

답변 레벨 차이

레벨 답변 요지 평가
실버 "애플리케이션과 DB를 연결하는 것. 네트워크를 타야 해서 비용이 크다" "네트워크를 탄다"는 너무 포괄적. 구체적 과정 부재
골드 세 단계로 비용 원인을 구조화 + 매 요청 반복 시의 결과 비용이 큰 이유가 하나가 아니라 세 가지임을 보여줌

꼬리 질문


Q. 커넥션 풀이란 무엇이고 왜 사용하나요?

핵심 답변 (골드 수준)

일정량의 커넥션 객체를 미리 만들어서 풀에 저장해 두고, 요청 시 빌려주고 완료 후 반납받는 기법이 커넥션 풀이다. 사용하는 이유는 두 가지다.

  1. 비용 절감: DB 커넥션은 TCP 연결 등 비용이 큰 작업이므로 재사용으로 비용을 절감한다.
  2. 자원 고갈 방지: 커넥션 수를 제한하여 과도한 접속으로 인한 서버 자원 고갈을 방지한다.

커넥션 풀은 미리 만들어서 빠르게 쓰는 것(성능)만이 아니라, 상한선을 정해 시스템을 보호하는 역할(안정성)도 한다. 이 표현이 있으면 운영 관점도 이해하고 있다는 인상을 준다.

핵심 키워드: ① 풀에 저장·빌려주고·반납하는 기법 ② 비용 절감 ③ 자원 고갈 방지

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "커넥션을 미리 만들어 놓는 거예요" 재사용·반납 동작도, 사용하는 이유도 없음
실버 "커넥션 객체를 미리 만들어 풀에 저장해 두고 필요할 때 빌려 쓰고 반납. 매번 새로 만드는 비용을 줄이기 위해 사용" 정의·목적은 좋으나 이유가 비용 절감 하나뿐
골드 + 커넥션 수 제한을 통한 자원 고갈 방지 성능 + 안정성 양면을 갖춘 답변

꼬리 질문


Q. 커넥션 풀 크기는 클수록 좋은가요?

핵심 답변 (골드 수준)

아니다. 커넥션을 사용하는 주체는 스레드이므로 스레드 풀과 함께 고려해야 한다.

메모리·컨텍스트 스위칭은 애플리케이션단의 한계, 디스크 병목은 DB단의 물리적 한계다. 양쪽을 함께 말하면 좋다.

강사 실무 사례: 커넥션 풀 사이즈를 크게 잡은 상태에서 애플리케이션 서버가 계속 스케일아웃되자, DB 서버가 동시에 제공할 수 있는 커넥션 수를 넘어 DB 레벨 장애가 발생한 적이 있다.

핵심 키워드: ① 스레드 풀과 커넥션 풀의 관계 ② 컨텍스트 스위칭 ③ 디스크 병목

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "클수록 좋다. 더 많은 요청을 동시에 처리할 수 있으니까" 커넥션 사용 주체가 스레드라는 것과 오버헤드를 고려 못 함
실버 "아니다. 너무 많으면 메모리를 낭비하므로 적절한 크기를 찾아야 한다" 결론은 맞지만 메모리 낭비만으로는 근거가 약함
골드 + 스레드 전제, 컨텍스트 스위칭, 디스크 병목이라는 세 가지 구체적 근거 애플리케이션단과 DB단 양쪽의 한계를 모두 앎

꼬리 질문


Q. 커넥션 타임아웃과 리드 타임아웃의 차이는 무엇이고, 타임아웃은 왜 필요한가요?

핵심 답변 (골드 수준)

타임아웃을 설정하지 않으면 스레드와 커넥션이 무한 대기 상태로 점유되어 반환되지 않고, 이것이 쌓이면 커넥션 풀이 고갈되어 전체 서비스 장애로 이어질 수 있기 때문에 필요하다.

"무한 대기 방지"에서 끝내지 말고 "스레드·커넥션 점유 → 반환되지 않음 → 커넥션 풀 고갈 → 전체 장애"라는 연쇄 과정을 보여줘야 한다. 타임아웃이 없으면 커넥션 풀의 자원 고갈 방지 장치가 무력화된다. (토스 면접 꼬리 질문 출제 이력)

핵심 키워드: ① 커넥션 타임아웃 ② 리드 타임아웃 ③ 타임아웃 미설정의 연쇄적 결과

답변 레벨 차이

레벨 답변 요지 평가
실버 "커넥션 타임아웃은 연결할 때, 리드 타임아웃은 데이터를 읽을 때 발생. 무한 대기를 방지하기 위해 필요" 시점 구분은 맞지만 "무한 대기 방지"가 너무 일반적. 연쇄 과정 부재
골드 + 연결 실패 vs 응답 지연의 정확한 구분, 풀 고갈 → 전체 장애 연쇄 어떤 타임아웃을 어떻게 조정할지 판단 가능한 수준

꼬리 질문


Q. 커넥션 풀 상태를 어떻게 모니터링하고 문제를 어떻게 진단하나요?

핵심 답변 (골드 수준)

HikariCP 기준으로 active(사용 중), idle(대기 중), pending(대기열) 커넥션 수를 Micrometer 메트릭으로 수집하여 Grafana 대시보드에서 모니터링한다. active가 maximumPoolSize에 근접하면 커넥션 부족 경고를 설정한다.

문제 발생 시 SHOW PROCESSLIST로 DB 세션 상태를 확인하고, 슬로우 쿼리나 락 경합으로 커넥션이 오래 점유되고 있는지 진단한다. 또한 leakDetectionThreshold 설정으로 커넥션을 빌려가고 반납하지 않는 커넥션 누수(leak)도 감지한다.

도구를 아는 것과 도구로 무엇을 봐야 하는지를 아는 것은 완전히 다르다. 구체적 메트릭과 임계 경고 수준까지 말하면 "실제로 대시보드를 본 사람"이라는 인상을 준다.

핵심 키워드: ① active/idle/pending 메트릭 ② SHOW PROCESSLIST ③ leakDetectionThreshold

답변 레벨 차이

레벨 답변 요지 평가
실버 "HikariCP 설정에서 커넥션 수를 확인하고, DB에서 SHOW PROCESSLIST로 현재 세션을 본다" 도구는 맞지만 "커넥션 수"가 너무 포괄적. 세부 메트릭과 누수 감지 부재
골드 + 세부 메트릭 분류, 임계 경고, 누수 감지 설정 모니터링 + 진단 + 누수 감지까지 실무 깊이를 보여줌

꼬리 질문


섹션 7. 운영

Q. 운영 중 슬로우 쿼리가 발생하면 어떻게 대처하나요?

핵심 답변 (골드 수준)

단계별로 답한다.

  1. 슬로우 쿼리 로그를 활성화하여 문제 쿼리를 식별한다.
  2. EXPLAIN으로 실행 계획을 분석하여 풀 스캔이나 비효율적 조인을 찾는다.
  3. 인덱스 추가나 쿼리 리팩토링으로 개선한다.
  4. 그래도 안 되면 테이블 구조 변경이나 캐싱 도입을 검토한다.

"EXPLAIN 쓰고 인덱스 걸면 됩니다"로 끝나면 도구 하나만 아는 사람이다. 발견 → 분석 → 조치 → 후속 대응의 흐름을 보여줘야 하고, 인덱스가 만능이 아님을 아는 것(4단계)이 차이를 만든다.

핵심 키워드: ① 슬로우 쿼리 로그 ② EXPLAIN ③ 인덱스 추가·쿼리 리팩토링 ④ 테이블 구조 변경·캐싱 도입

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "EXPLAIN으로 쿼리를 분석하고 인덱스를 걸면 된다" 문제 쿼리를 어떻게 발견했는지(그 앞 단계)가 빠짐
실버 "슬로우 쿼리 로그 확인 → EXPLAIN 분석 → 필요하면 인덱스 추가" 나쁘지 않지만 인덱스로 해결 안 되는 경우의 후속 대응이 없음
골드 첫째~넷째 번호를 붙인 4단계 구조화 + 후속 대응 체계적으로 접근하는 사람이라는 인상

꼬리 질문


Q. EXPLAIN에서 구체적으로 무엇을 봐야 하나요?

핵심 답변 (골드 수준)

네 가지 컬럼을 함께 확인한다.

type 하나만 아는 것은 도구의 10%만 쓰는 것이다. rows라는 정량 지표와 Extra의 비효율 연산까지 봐야 EXPLAIN을 제대로 쓴다고 할 수 있다.

핵심 키워드: ① type ② rows ③ key ④ Extra

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "type이 ALL이면 풀 스캔이라 느리니까 그걸 봐야 한다" 중요한 신호이긴 하나 한 가지만 앎
실버 "type에서 ALL/ref/range 확인, key에서 사용 인덱스 확인" type·key 두 가지뿐. rows와 Extra 부재
골드 네 가지 컬럼 모두 + 각 컬럼에서 보는 포인트 정량 지표와 비효율 연산까지 커버

꼬리 질문


Q. 데이터 자체가 많아져서 느려지면 어떻게 해결하나요?

핵심 답변 (골드 수준)

먼저 쿼리 레벨에서 해결한다. 인덱스 최적화로 풀 스캔을 제거하고, 쿼리 튜닝으로 조인이나 서브쿼리를 개선한다.

그래도 안 되면 병목 원인에 따라 전략을 선택한다.

전부 외울 필요는 없고, "쿼리 레벨 먼저 + 원인에 따라 다르다"는 프레임을 아는 것이 중요하다. 인프라를 건드리기 전에 쿼리부터 최적화하는 우선순위가 체계적인 접근의 신호다.

핵심 키워드: ① 쿼리 레벨 먼저 ② 병목 원인별 전략 선택(파티셔닝/아카이빙/캐싱·리플리케이션/샤딩)

답변 레벨 차이

레벨 답변 요지 평가
실버 "인덱스를 최적화하고 필요하면 샤딩을 도입한다" 인덱스에서 샤딩으로 바로 점프. 중간 단계와 단계별 접근 부재
골드 쿼리 레벨 우선 + 원인별 4가지 대응 분기 우선순위와 판단 프레임을 갖춘 답변

꼬리 질문


Q. 클러스터링, 리플리케이션, 샤딩의 차이를 설명해 주세요

핵심 답변 (골드 수준)

셋 다 서버를 여러 대 두지만 목적과 구조가 전혀 다르며, 각각의 트레이드오프까지 말해야 한다.

핵심 키워드: ① 클러스터링 = 가용성(+정합성 보장) ② 리플리케이션 = 읽기 부하 분산(동기화 지연) ③ 샤딩 = 쓰기·읽기 모두 분산(조인·트랜잭션 복잡)

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "다 서버를 여러 대 두는 건데 방식이 다르다" 질문에 이미 있는 정보. 얻는 게 없음
실버 세 가지 각각의 정의만 구분해서 설명 정의는 맞지만 정합성 보장 여부, 동기화 지연, 조인 복잡도 같은 트레이드오프 부재
골드 + 각 방식의 장단점·트레이드오프, 클러스터링의 Active-Standby 명시 정의만 아는 것과 트레이드오프까지 아는 것의 차이

꼬리 질문


Q. 리플리케이션에서 구체적으로 어떻게 데이터가 복제되나요?

핵심 답변 (골드 수준)

MySQL 기준으로 3단계다.

  1. 마스터 DB에서 쓰기 트랜잭션이 수행되면 **바이너리 로그(binlog)**에 기록된다.
  2. 슬레이브의 I/O 스레드가 마스터의 binlog를 복사해 와서 **릴레이 로그(relay log)**에 저장한다.
  3. 슬레이브의 SQL 스레드가 릴레이 로그를 읽어 마스터에서 처리된 트랜잭션을 동일하게 재실행한다. (중계한다는 의미에서 로그 이름이 "릴레이"다.)

이 과정을 알면 리플리케이션 레그(복제 지연)가 왜 발생하는지도 설명할 수 있다. 또한 I/O 스레드(가져오는 역할)와 SQL 스레드(재실행하는 역할)를 구분하면 복제 과정 어디에서 병목이 생기는지까지 파악할 수 있다.

핵심 키워드: ① binlog ② I/O 스레드와 릴레이 로그 ③ SQL 스레드(재실행)

답변 레벨 차이

레벨 답변 요지 평가
실버 "마스터에서 쓰기를 하면 슬레이브로 데이터가 복사된다" 큰 그림만 있고 "복사된다"의 구체적 과정 부재. 결과만 아는 인상
골드 binlog → I/O 스레드 복사 → 릴레이 로그 → SQL 스레드 재실행의 구체적 경로 과정을 알면 복제 지연·병목까지 설명 가능

꼬리 질문


Q. 데드락이 무엇이고 DB에서 왜 발생하나요?

핵심 답변 (골드 수준)

데드락은 두 개 이상의 트랜잭션이 서로가 보유한 락을 기다리며 무한 대기하는 상태다.

핵심 원인은 두 트랜잭션이 서로 다른 순서로 락을 획득하는 것이다. 예를 들어 트랜잭션 A가 레코드 1에 락을 걸고 레코드 2를 요청하는 동시에, 트랜잭션 B가 레코드 2에 락을 걸고 레코드 1을 요청하면 서로 상대방이 끝나길 기다리며 데드락이 발생한다.

또한 트랜잭션이 길어질수록 락 보유 시간이 늘어나 데드락 발생 확률이 증가한다.

핵심 키워드: ① 무한 대기 ② 서로 다른 순서로 락 획득 ③ 트랜잭션의 길이

답변 레벨 차이

레벨 답변 요지 평가
실버 "두 트랜잭션이 서로 기다리면서 멈추는 것. 락이 꼬여서 발생한다" 현상은 맞으나 "꼬인다"가 모호. 왜/어떤 상황인지 없음
골드 + 서로 다른 순서의 락 획득이라는 정확한 원인, A/B 교차 요청 시나리오, 트랜잭션 길이와의 관계 원인·시나리오·실무 감각까지

꼬리 질문


Q. 데드락이 발생하면 어떻게 감지하고 대처하나요?

핵심 답변 (골드 수준)

감지만 알면 터진 뒤에 대응하는 것이고, 예방까지 알아야 터지기 전에 막을 수 있다. 특히 "락 획득 순서 통일"은 앞 질문에서 다룬 데드락의 원인(서로 다른 순서의 락 획득)과 직접 연결된다.

핵심 키워드: ① 감지 메커니즘(Wait-for 그래프, 저비용 트랜잭션 롤백) ② 예방 메커니즘(순서 통일·범위 최소화·타임아웃)

답변 레벨 차이

레벨 답변 요지 평가
실버 "InnoDB가 자동으로 감지해서 하나를 롤백한다" 맞는 말이지만 감지만 있고 예방이 없음
골드 + Wait-for 그래프라는 구체적 메커니즘, 세 가지 예방법 "터지기 전에 막을 줄 아는 사람"이라는 인상

꼬리 질문


Q. DB에 장애가 발생하면 어떤 순서로 접근하시나요?

핵심 답변 (골드 수준)

  1. 모니터링 대시보드로 현상을 파악한다: CPU, 메모리, 커넥션 수, 슬로우 쿼리 수를 확인한다.
  2. SHOW PROCESSLIST로 현재 실행 중인 쿼리와 락 대기 상태를 확인한다: 모니터링은 추이를 보는 것이고, SHOW PROCESSLIST는 지금 무슨 일이 벌어지고 있는지 실시간으로 보는 것이다.
  3. 원인을 분류한다: 쿼리 문제 / 락 경합 / 리소스 부족 중 어디에 해당하는지 판단한다.
  4. 원인별로 대응한다: 쿼리 문제면 EXPLAIN으로 튜닝, 락 경합이면 트랜잭션 범위 축소나 락 해제, 리소스 부족이면 스케일 업/아웃 또는 커넥션 풀 조정.

"로그 보고 해결합니다"는 경험이 없는 사람의 답이다. 어떤 로그를 어떤 순서로 어떤 기준으로 보는지 말할 수 있어야 장애 해결 경험이 있는 사람으로 인식된다. 3번의 원인 분류(쿼리/락/리소스)는 강의 전체에서 다룬 슬로우 쿼리, 데드락, 커넥션 풀 개념이 모두 연결되는 프레임이다. 전부 외우기보다 실제 장애 해결 경험과 접목해서 답할 것.

핵심 키워드: ① 모니터링 대시보드 ② SHOW PROCESSLIST ③ 원인 분류 ④ 원인별 대응

답변 레벨 차이

레벨 답변 요지 평가
브론즈 "로그를 확인하고 문제를 해결한다" 어떤 로그를 어떤 순서로 보는지 전혀 없음
실버 "모니터링 대시보드에서 CPU·메모리 확인, 슬로우 쿼리 확인, 원인 찾아 튜닝하거나 서버 증설" 흐름은 있으나 SHOW PROCESSLIST를 통한 실시간 확인과 원인 분류 단계가 빠짐
골드 4단계 구조 + 실시간 확인 단계 + 원인 분류 프레임 실제로 장애를 대응해 본 사람의 답변

꼬리 질문


Q. DB 모니터링에서 주요하게 봐야 하는 메트릭은 무엇인가요?

핵심 답변 (골드 수준)

크게 트래픽 / DB 내부 / 리소스 세 관점으로 나눠서 본다.

인프라 메트릭(CPU·메모리)은 "무언가가 느리다"를 알려주지만, DB 내부 메트릭은 "왜 느린지"를 알려준다. 메트릭을 단순 나열하는 것이 아니라 관점으로 분류하면 빠진 게 없는지 체크할 수도 있다. 장애 시 가설을 세우고 증명하는 증거가 바로 메트릭이다.

핵심 키워드: ① 트래픽 관점 ② DB 내부 관점 ③ 리소스 관점 (+각 관점의 대표 메트릭 몇 개)

답변 레벨 차이

레벨 답변 요지 평가
실버 "CPU 사용률과 메모리 사용률, 슬로우 쿼리 수를 본다" 전부 서버 인프라 메트릭. DB 내부 동작을 반영하는 메트릭 부재
골드 세 관점 구조화 + 버퍼 풀 히트 레이쇼, 리플리케이션 레그, 락 대기 시간 등 DB 내부 레이어 "무엇이 느린지"를 넘어 "왜 느린지"를 진단할 수 있는 수준

꼬리 질문


부록: 섹션 8 기타 질문 안내

섹션 2~7에서 다루지 않은 빈출 질문(검색, 캐싱, SQL, JPA 등)은 강의에서 PDF 부록 형태로 별도 제공된다. 강의 영상으로는 다루지 않으므로 이 노트에는 포함하지 않는다.