MySQL 시니어 코딩 면접

MySQL 시니어 (7년+) 코딩 · 알고리즘 5문항 조회수 41 · 2026-07-19 (일) 19:11:06
1 SQL 최적화 및 리팩토링
Hard

Q. 레거시 시스템에서 N+1 쿼리 문제가 발생하는 상황을 발견했습니다. 예를 들어 주문 목록을 조회한 후 각 주문마다 상품 정보를 별도로 조회하는 경우입니다. 이를 해결하기 위한 SQL 리팩토링 전략을 제시하고, 단순 JOIN으로 해결할 수 없는 복잡한 케이스(1:N 관계에서 집계가 필요한 경우)에서는 어떤 접근법을 사용해야 하는지 설명해주세요. 또한 ORM 사용 환경에서 N+1 문제를 예방하는 방법도 함께 설명해주세요.

A. 모범답안

N+1 문제는 기본적으로 JOIN을 사용해 단일 쿼리로 통합하여 해결합니다. 1:N 관계에서 집계가 필요한 경우 서브쿼리나 CTE(Common Table Expression)를 활용하거나, 메인 쿼리와 집계 쿼리를 분리한 후 애플리케이션에서 조합하는 방식을 사용합니다. GROUP_CONCAT이나 JSON_ARRAYAGG 같은 집계 함수로 관련 데이터를 단일 행으로 압축할 수도 있습니다. ORM 환경에서는 Eager Loading(즉시 로딩) 설정, Batch Fetching, DataLoader 패턴 등을 활용하여 예방합니다. 쿼리 로그 모니터링과 APM 도구를 통해 N+1 패턴을 조기에 감지하는 것도 중요합니다.

핵심 포인트
  • • JOIN을 통한 쿼리 통합이 기본 해결책
  • • 복잡한 집계는 서브쿼리, CTE, 또는 쿼리 분리 후 애플리케이션 조합
  • • ORM에서는 Eager Loading, Batch Fetching, DataLoader 패턴 활용
  • • 쿼리 로그와 APM 도구를 통한 사전 감지 체계 구축
Follow-up 질문

GraphQL API에서 N+1 문제가 특히 자주 발생하는데, DataLoader 패턴을 MySQL과 함께 사용할 때 주의해야 할 점은 무엇인가요?

2 스토어드 프로시저 및 함수
Medium

Q. 복잡한 비즈니스 로직을 MySQL 스토어드 프로시저로 구현하는 것과 애플리케이션 레이어에서 처리하는 것의 장단점을 비교하고, 각각의 적절한 사용 시나리오를 제시해주세요. 특히 마이크로서비스 아키텍처 환경에서 스토어드 프로시저 사용이 권장되지 않는 이유와, 그럼에도 불구하고 스토어드 프로시저를 사용하는 것이 유리한 경우를 설명해주세요.

A. 모범답안

스토어드 프로시저는 네트워크 왕복을 줄이고 DB 내에서 데이터 처리가 가능하여 성능상 유리할 수 있지만, 버전 관리가 어렵고 테스트와 디버깅이 복잡하며 애플리케이션과 DB 간 결합도가 높아집니다. 마이크로서비스 환경에서는 서비스 간 독립성과 배포 유연성을 해치므로 권장되지 않습니다. 그러나 대량 데이터 배치 처리, 복잡한 집계 연산, 레거시 시스템 통합, 또는 DB 트리거와 연계된 작업에서는 여전히 유용합니다. 현대적 접근은 비즈니스 로직은 애플리케이션에, 데이터 중심 처리는 프로시저에 배치하는 하이브리드 방식입니다.

핵심 포인트
  • • 스토어드 프로시저는 성능상 유리하지만 버전 관리, 테스트, 결합도 문제 존재
  • • 마이크로서비스에서는 서비스 독립성을 해치므로 비권장
  • • 대량 배치 처리, 복잡한 집계, 레거시 통합에서는 여전히 유용
  • • 하이브리드 접근: 비즈니스 로직은 앱, 데이터 처리는 프로시저
Follow-up 질문

스토어드 프로시저의 성능을 프로파일링하고 최적화하는 방법은 무엇이며, 프로시저 내부에서 발생하는 데드락은 어떻게 디버깅하나요?

3 트랜잭션 설계 및 동시성 제어
Hard

Q. 전자상거래 시스템에서 재고 차감 로직을 구현할 때, 높은 동시성 환경에서 발생할 수 있는 문제(과다 차감, Lost Update)를 방지하기 위한 코딩 전략을 제시해주세요. SELECT FOR UPDATE를 사용한 비관적 락, UPDATE 조건절을 활용한 낙관적 락, 그리고 애플리케이션 레벨의 분산 락을 비교하고, 각각의 구현 방법과 성능 특성, 적절한 사용 시나리오를 설명해주세요.

A. 모범답안

비관적 락(SELECT FOR UPDATE)은 트랜잭션 시작 시 행을 잠그므로 충돌을 확실히 방지하지만 락 대기로 인한 성능 저하가 있습니다. 낙관적 락(UPDATE SET stock = stock - 1 WHERE id = ? AND stock >= 1)은 버전 컬럼이나 조건절로 변경 시점에 검증하며, 충돌이 적은 환경에서 성능이 우수하지만 재시도 로직이 필요합니다. 분산 락(Redis, Zookeeper)은 여러 DB 인스턴스나 마이크로서비스 환경에서 필요하며, 락 타임아웃과 장애 처리가 복잡합니다. 일반적으로 재고 차감은 낙관적 락으로 시작하고, 충돌률이 높으면 비관적 락으로 전환하며, 분산 환경에서는 분산 락을 추가합니다.

핵심 포인트
  • • 비관적 락(SELECT FOR UPDATE): 확실하지만 성능 저하 가능
  • • 낙관적 락(조건절 UPDATE): 충돌 적은 환경에서 우수, 재시도 필요
  • • 분산 락: 분산 환경 필수, 복잡도 증가
  • • 일반적으로 낙관적 락 우선, 충돌률에 따라 비관적 락 전환
Follow-up 질문

재고가 0이 되었을 때 대기 중인 주문을 처리하는 대기열 시스템을 설계한다면, MySQL과 메시지 큐를 어떻게 조합하여 구현하시겠습니까?

4 배치 처리 및 대용량 데이터 조작
Hard

Q. 1억 건의 사용자 데이터에 대해 일괄 업데이트를 수행해야 하는 상황입니다. 단순 UPDATE 문으로 처리하면 락 타임아웃, 롤백 세그먼트 증가, 복제 지연 등의 문제가 발생할 수 있습니다. 안전하고 효율적으로 대량 업데이트를 수행하기 위한 배치 처리 전략을 코딩 관점에서 설명하고, Chunk 크기 결정 기준, 트랜잭션 관리 방법, 실패 시 재시작 전략, 그리고 프로덕션 환경에서 진행 상황을 모니터링하는 방법을 제시해주세요.

A. 모범답안

대량 업데이트는 작은 청크(보통 1000~10000건)로 분할하여 처리하며, 각 청크를 별도 트랜잭션으로 커밋하여 롤백 세그먼트 증가를 방지합니다. WHERE 조건에 LIMIT과 PRIMARY KEY 범위를 사용해 청크를 나누고, 처리된 마지막 ID를 기록하여 실패 시 재시작 지점을 보장합니다. 청크 크기는 트랜잭션 로그 크기, 락 대기 시간, 복제 지연을 모니터링하며 동적으로 조정합니다. 각 청크 사이에 짧은 sleep을 두어 복제 서버가 따라잡을 시간을 줍니다. 진행 상황은 별도 테이블에 기록하고, Prometheus나 Grafana로 시각화하며, 실패 시 재시도 로직과 알림을 구현합니다.

핵심 포인트
  • • 청크 단위(1000~10000건) 분할 처리, 각 청크별 트랜잭션 커밋
  • • PRIMARY KEY 범위와 LIMIT으로 청크 구분, 마지막 ID 기록으로 재시작 보장
  • • 청크 크기는 트랜잭션 로그, 락 대기, 복제 지연 기준으로 동적 조정
  • • 진행 상황 테이블 기록, 모니터링 도구 연동, 실패 재시도 로직 구현
Follow-up 질문

배치 업데이트 중 애플리케이션에서 해당 데이터를 읽는 요청이 들어올 때, 일관성을 보장하면서도 성능을 유지하는 방법은 무엇인가요?

5 데이터 마이그레이션 및 ETL
Medium

Q. 서로 다른 스키마를 가진 두 MySQL 데이터베이스 간에 데이터를 마이그레이션해야 합니다. 예를 들어 정규화된 구조를 비정규화된 구조로 변환하거나, 컬럼 타입과 이름이 다른 경우입니다. 무중단으로 안전하게 데이터를 이관하기 위한 ETL 전략을 설계하고, INSERT ... SELECT 방식과 애플리케이션 레벨 처리의 장단점, 데이터 검증 방법, 그리고 롤백 계획을 포함하여 설명해주세요.

A. 모범답안

무중단 마이그레이션은 이중 쓰기(dual write) 전략을 사용합니다. 먼저 신규 스키마에 데이터를 복사하되 INSERT ... SELECT는 초기 벌크 로드에만 사용하고, 이후 변경분은 CDC(Change Data Capture)나 트리거로 실시간 동기화합니다. 애플리케이션 레벨 처리는 복잡한 변환 로직에 유리하고 트랜잭션 제어가 용이하지만, INSERT ... SELECT는 대량 데이터에 빠르고 네트워크 오버헤드가 없습니다. 데이터 검증은 체크섬, 행 개수 비교, 샘플링 쿼리로 수행하며, 불일치 발견 시 재동기화합니다. 롤백을 위해 구 스키마를 일정 기간 유지하고, 애플리케이션에서 feature flag로 스키마 전환을 제어합니다.

핵심 포인트
  • • 이중 쓰기 전략: 초기 벌크 로드 후 CDC/트리거로 실시간 동기화
  • • INSERT ... SELECT는 벌크에 유리, 애플리케이션 처리는 복잡 변환에 적합
  • • 체크섬, 행 개수, 샘플링으로 데이터 검증 및 재동기화
  • • 구 스키마 유지 + feature flag로 롤백 가능 구조 구축
Follow-up 질문

마이그레이션 중 신구 스키마 간 데이터 불일치가 발생했을 때, 이를 자동으로 감지하고 복구하는 시스템을 어떻게 설계하시겠습니까?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!