웹 접근성 미드레벨 데이터베이스 기술면접
새 면접Q. 웹 접근성 준수 여부를 추적하는 시스템을 설계한다고 가정합니다. 웹페이지별로 WCAG 체크리스트 항목(예: 대체 텍스트, 키보드 접근성 등)의 준수 여부를 기록하고, 각 항목에 대해 수정 이력을 추적해야 합니다. 이를 위한 데이터베이스 스키마를 설계할 때 고려해야 할 주요 정규화 전략과 테이블 구조를 설명하고, 이력 관리를 위한 효율적인 모델링 방법을 제시해주세요.
체크리스트 항목 마스터 테이블과 페이지별 준수 현황 테이블, 그리고 변경 이력 테이블의 관계를 생각해보세요.
웹 접근성 준수 추적 시스템은 크게 세 가지 테이블로 설계할 수 있습니다. 첫째, wcag_criteria 마스터 테이블에 WCAG 체크리스트 항목을 관리하고(기준 코드, 설명, 레벨 등), 둘째, page_compliance 테이블에 페이지별 현재 준수 상태를 저장합니다(페이지 ID, 기준 ID, 준수 여부, 최종 수정일). 셋째, compliance_history 테이블에 모든 변경 이력을 시간순으로 기록합니다(이력 ID, 페이지 ID, 기준 ID, 이전 상태, 새 상태, 수정자, 수정 시각). 정규화는 3NF까지 적용하되, 조회 성능을 위해 page_compliance에는 최신 상태만 유지하고 이력은 별도 테이블로 분리합니다. 대량의 이력 데이터 조회를 위해 파티셔닝(날짜 기준)을 고려할 수 있으며, 페이지별 전체 준수율 같은 집계 데이터는 materialized view나 summary 테이블로 관리하는 것이 효율적입니다.
- • 마스터 데이터(WCAG 기준)와 트랜잭션 데이터(준수 현황) 분리
- • 현재 상태 테이블과 이력 테이블의 분리로 조회 성능 최적화
- • 3NF 정규화로 데이터 중복 제거 및 무결성 보장
- • 이력 테이블의 파티셔닝 전략
대규모 웹사이트의 접근성 관리 도구나 컴플라이언스 모니터링 시스템에서 검사 결과와 개선 이력을 추적할 때 사용됩니다.
수백만 개의 페이지와 수십 개의 체크리스트 항목이 있을 때, 특정 기간 동안 준수율이 개선된 페이지 목록을 조회하는 쿼리의 성능을 최적화하려면 어떤 인덱스 전략을 사용하시겠습니까?
Q. 스크린 리더 사용자의 페이지 탐색 패턴을 분석하기 위해 사용자 행동 로그를 저장하는 테이블이 있습니다. 이 테이블에는 사용자 ID, 세션 ID, 페이지 URL, 포커스된 요소의 ARIA role, 타임스탬프, 사용 기기 등이 포함됩니다. 특정 ARIA role을 가진 요소에 대한 사용자별 평균 체류 시간을 계산하는 쿼리가 매우 느립니다. 이 쿼리를 최적화하기 위한 인덱스 설계 전략과, 복합 인덱스를 사용할 때 컬럼 순서를 결정하는 기준을 설명해주세요.
WHERE 절의 필터링 조건, GROUP BY 절, 그리고 카디널리티를 고려한 인덱스 컬럼 순서가 중요합니다.
이 쿼리는 ARIA role로 필터링하고 사용자별로 그룹화하여 집계하므로, 복합 인덱스 설계가 핵심입니다. 인덱스 컬럼 순서는 일반적으로 WHERE 절의 동등 조건, WHERE 절의 범위 조건, GROUP BY/ORDER BY 절 순서로 결정합니다. 이 경우 (aria_role, user_id, timestamp) 순서의 복합 인덱스가 효과적인데, aria_role로 먼저 필터링하고 user_id로 그룹화하며 timestamp는 범위 계산에 사용되기 때문입니다. 다만 aria_role의 카디널리티가 낮다면(종류가 적다면) 인덱스 효율이 떨어질 수 있으므로, 실제 데이터 분포를 분석해야 합니다. 대안으로 특정 role에 대한 쿼리가 빈번하다면 필터링된 인덱스(partial index)를 고려하거나, 시간 범위 조건이 항상 포함된다면 (timestamp, aria_role, user_id) 순서로 파티셔닝과 결합하는 전략도 유효합니다. 또한 집계 쿼리의 특성상 커버링 인덱스를 구성하여 테이블 접근을 완전히 제거하는 것이 성능 향상에 큰 도움이 됩니다.
- • 복합 인덱스의 컬럼 순서는 WHERE 동등 조건, 범위 조건, GROUP BY 순으로 결정
- • 카디널리티가 낮은 컬럼은 인덱스 선두에 배치 시 효율성 저하 가능
- • 커버링 인덱스로 테이블 접근 제거
- • 파티셔닝과 필터링된 인덱스를 활용한 대안 전략
사용자 행동 분석 시스템에서 대량의 로그 데이터를 집계할 때 인덱스 전략이 쿼리 성능에 결정적인 영향을 미칩니다.
이 테이블의 데이터가 시간이 지남에 따라 수억 건으로 증가한다면, 인덱스 유지보수 비용과 조회 성능 사이의 트레이드오프를 어떻게 관리하시겠습니까?
Q. 웹 접근성 자동 검사 시스템에서 여러 크롤러가 동시에 같은 웹페이지의 접근성 점수를 업데이트하려고 합니다. 각 크롤러는 페이지의 현재 점수를 읽고, 새로운 검사 결과를 반영하여 평균 점수를 계산한 후 업데이트합니다. 이 과정에서 발생할 수 있는 동시성 문제를 설명하고, Lost Update를 방지하기 위한 락(Lock) 전략과 격리 수준(Isolation Level) 설정 방법을 제시해주세요.
읽기-수정-쓰기 패턴에서 발생하는 경쟁 조건과 이를 해결하기 위한 비관적/낙관적 락을 고려해보세요.
이 시나리오는 전형적인 Lost Update 문제로, 두 크롤러가 동시에 같은 점수를 읽고 각자 계산한 결과로 업데이트하면 한 쪽의 변경사항이 손실됩니다. 비관적 락 방식으로는 SELECT FOR UPDATE를 사용해 행 수준 배타적 락을 획득한 후 업데이트하면 다른 트랜잭션이 대기하게 되어 안전하게 처리할 수 있습니다. 낙관적 락 방식으로는 버전 컬럼을 추가하고, UPDATE 시 WHERE 절에 읽었던 버전을 포함시켜 버전이 변경되었으면 재시도하는 방식으로 구현합니다. 격리 수준은 최소한 READ COMMITTED 이상이어야 하며, REPEATABLE READ나 SERIALIZABLE을 사용하면 더 강력한 보장을 받지만 성능과 데드락 가능성을 고려해야 합니다. 실무에서는 업데이트 빈도와 충돌 가능성을 고려하여, 충돌이 드물다면 낙관적 락으로 성능을 높이고, 충돌이 빈번하다면 비관적 락이나 큐 기반 순차 처리를 선택하는 것이 효과적입니다.
- • Lost Update 문제 인식 및 읽기-수정-쓰기 패턴의 위험성
- • SELECT FOR UPDATE를 통한 비관적 락 구현
- • 버전 컬럼을 활용한 낙관적 락 구현
- • 격리 수준과 성능 간의 트레이드오프 이해
여러 워커나 마이크로서비스가 동일한 리소스를 동시에 업데이트할 때 데이터 일관성을 보장하기 위해 필수적입니다.
비관적 락 사용 시 데드락이 발생할 수 있는 시나리오를 설명하고, 이를 예방하거나 해결하기 위한 방법은 무엇입니까?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!