네이버파이낸셜 데이터 분석가 포지션의 쿼리 테스트를 준비하기 위한 인터랙티브 SQL 학습 웹 애플리케이션
- 주요 업무: 데이터 & AI 활용 사업자 리포트 기획, 고객 타겟 마케팅 플랫폼 기획
- 핵심 역량: 데이터 쿼리 작성 및 분석 능력, 데이터 기반 의사결정
- 우대 경험: B2B 서비스, 마이데이터, 상권분석
- 출처: 소상공인시장진흥공단 상가(상권)정보 (공공데이터포털)
- 형식: CSV
- URL: https://www.data.go.kr/cmm/cmm/fileDownload.do?atchFileId=FILE_000000003199920&fileDetailSn=1
- React 18: 현대적 UI 라이브러리
- Vite: 빠른 개발 환경 및 빌드 도구
- Tailwind CSS: 유틸리티 기반 스타일링
- sql.js: 브라우저에서 실행되는 SQLite (WebAssembly)
- PapaParse: CSV 파싱 라이브러리
- Monaco Editor: VS Code 기반 SQL 에디터 (문법 하이라이팅, 자동완성)
- @monaco-editor/react: React 통합 래퍼
- React Hooks (useState, useEffect, useCallback, useMemo)
- LocalStorage: 쿼리 히스토리 영속성
sql-query-practice/
├── public/
│ └── data/
│ └── store_data.csv # 상가(상권) 정보 CSV
├── src/
│ ├── components/
│ │ ├── SQLEditor.jsx # Monaco 기반 SQL 에디터
│ │ ├── ResultTable.jsx # 쿼리 결과 테이블 표시
│ │ ├── ExampleQueries.jsx # 실무 예제 쿼리 모음
│ │ ├── SchemaViewer.jsx # 데이터베이스 스키마 뷰어
│ │ ├── QueryHistory.jsx # 실행 히스토리
│ │ └── Header.jsx # 앱 헤더
│ ├── hooks/
│ │ ├── useDatabase.js # sql.js DB 초기화 및 쿼리 실행
│ │ └── useQueryHistory.js # 쿼리 히스토리 관리
│ ├── data/
│ │ └── exampleQueries.js # 네이버파이낸셜 맥락 예제 쿼리
│ ├── utils/
│ │ ├── csvLoader.js # CSV 로드 및 파싱
│ │ └── sqlHelpers.js # SQL 유틸리티 함수
│ ├── App.jsx # 메인 앱 컴포넌트
│ ├── main.jsx # 앱 엔트리 포인트
│ └── index.css # 글로벌 스타일
├── package.json
├── vite.config.js
└── tailwind.config.js
App
├── Header
├── Layout (3-column)
│ ├── Left Panel
│ │ ├── SchemaViewer
│ │ └── ExampleQueries
│ ├── Center Panel
│ │ └── SQLEditor
│ └── Right Panel
│ ├── ResultTable
│ └── QueryHistory
- CSV 자동 로드 및 파싱
- SQLite 인메모리 DB 생성
- 컬럼 타입 자동 감지 (TEXT, INTEGER, REAL)
- 인덱스 자동 생성 (성능 최적화)
- Monaco Editor 통합
- SQL 문법 하이라이팅
- 자동완성 (테이블명, 컬럼명)
- 단축키:
Ctrl+Enter(쿼리 실행) - 다크모드/라이트모드 지원
- 실시간 쿼리 실행
- 결과 테이블 표시 (페이지네이션)
- 실행 시간 측정
- 반환 행 수 표시
- 에러 메시지 친화적 표시
- CSV 다운로드 기능
네이버파이낸셜 면접 맥락에 맞춘 6가지 카테고리:
- 업종별 매장 수 집계
- 지역별 상가 분포
- 평균 임대료 계산
- 특정 상권의 업종 다양성 분석
- 상권별 매장 밀집도
- 지역별 평균 면적 비교
- 월세/보증금 패턴 분석
- 면적당 임대료 계산
- 업종별 평균 매장 규모
- 특정 조건 사업자 추출 (위치, 업종, 규모)
- 임대료 범위별 사업자 세그먼트
- 신규 진입 가능 상권 분석
- 윈도우 함수 (ROW_NUMBER, RANK, DENSE_RANK)
- 서브쿼리 활용
- 다중 테이블 JOIN (필요시)
- CTE (Common Table Expression)
- 통계 함수 (PERCENTILE, STDDEV)
- 복잡한 GROUP BY + HAVING
- 테이블 구조 표시
- 컬럼명, 타입, 샘플 데이터
- 데이터 통계 (총 행 수, NULL 비율)
- 실행한 쿼리 자동 저장 (LocalStorage)
- 히스토리 클릭으로 재실행
- 즐겨찾기 기능
- 히스토리 삭제
1. App 마운트
2. CSV 파일 fetch (/public/data/store_data.csv)
3. PapaParse로 CSV → JSON 변환
4. sql.js 초기화 (WebAssembly 로드)
5. CREATE TABLE 실행
6. 데이터 INSERT (배치 처리)
7. 인덱스 생성
8. DB 준비 완료 상태 설정
1. 사용자가 SQL 작성
2. Ctrl+Enter 또는 실행 버튼 클릭
3. 쿼리 유효성 검사
4. sql.js에 쿼리 전달
5. 실행 시간 측정
6. 결과 또는 에러 반환
7. 결과 테이블 렌더링
8. 히스토리에 저장
-- 업종별 상가 수 상위 10개
SELECT
상권업종대분류명,
COUNT(*) as 상가수
FROM stores
GROUP BY 상권업종대분류명
ORDER BY 상가수 DESC
LIMIT 10;-- 시도별 업종 다양성 (서로 다른 업종 수)
SELECT
시도명,
COUNT(DISTINCT 상권업종중분류명) as 업종_다양성,
COUNT(*) as 총_상가수
FROM stores
GROUP BY 시도명
ORDER BY 업종_다양성 DESC;-- 업종별 평균 임대료 및 면적
SELECT
상권업종대분류명,
ROUND(AVG(임대료), 2) as 평균_임대료,
ROUND(AVG(면적), 2) as 평균_면적,
ROUND(AVG(임대료 / NULLIF(면적, 0)), 2) as 평방미터당_임대료
FROM stores
WHERE 임대료 > 0 AND 면적 > 0
GROUP BY 상권업종대분류명
ORDER BY 평방미터당_임대료 DESC;-- 서울 강남구 소형 음식점 (타겟 마케팅 대상)
SELECT
상호명,
상권업종중분류명,
면적,
임대료
FROM stores
WHERE 시도명 = '서울특별시'
AND 시군구명 = '강남구'
AND 상권업종대분류명 = '음식'
AND 면적 BETWEEN 20 AND 50
ORDER BY 임대료 ASC
LIMIT 50;-- 시도별 임대료 랭킹 (상위 3개씩)
WITH ranked_stores AS (
SELECT
시도명,
상호명,
임대료,
ROW_NUMBER() OVER (PARTITION BY 시도명 ORDER BY 임대료 DESC) as rn
FROM stores
WHERE 임대료 > 0
)
SELECT
시도명,
상호명,
임대료,
rn as 순위
FROM ranked_stores
WHERE rn <= 3
ORDER BY 시도명, rn;-- 지역별 임대료 분위수 분석
WITH percentiles AS (
SELECT
시도명,
임대료,
NTILE(4) OVER (PARTITION BY 시도명 ORDER BY 임대료) as quartile
FROM stores
WHERE 임대료 > 0
)
SELECT
시도명,
quartile as 분위수,
MIN(임대료) as 최소값,
MAX(임대료) as 최대값,
ROUND(AVG(임대료), 2) as 평균값
FROM percentiles
GROUP BY 시도명, quartile
ORDER BY 시도명, quartile;- 3단 레이아웃: 왼쪽 (스키마/예제), 중앙 (에디터), 오른쪽 (결과)
- 반응형: 모바일에서는 탭 형식으로 전환
- 다크모드: 개발자 친화적 인터페이스
- Primary: Naver Green (#03C75A)
- Secondary: Dark Blue (#1E3A8A)
- Background: White / Dark Gray (#1F2937)
- Text: Black / White
- Accent: Orange (#F97316) - 에러, 경고
- 쿼리 실행:
Ctrl+Enter단축키 - 예제 로드: 클릭으로 에디터에 자동 삽입
- 결과 다운로드: CSV 형식으로 저장
- 히스토리 재실행: 클릭 한 번으로 재실행
- 스키마 복사: 테이블/컬럼명 클릭으로 복사
- 인덱스: 자주 검색되는 컬럼 (시도명, 상권업종대분류명) 인덱스 생성
- 배치 INSERT: 1000개 단위로 트랜잭션 처리
- 메모리 관리: sql.js 메모리 DB 크기 모니터링
- useMemo: 쿼리 결과 캐싱
- useCallback: 이벤트 핸들러 메모이제이션
- 코드 스플리팅: Monaco Editor lazy loading
- 가상화: 큰 결과 테이블의 경우 react-window 사용
- sql.js: CDN에서 로드
- Monaco Editor: Webpack 설정으로 필요한 언어만 포함
- Tree Shaking: 사용하지 않는 코드 제거
- 프로젝트 설계 문서 작성
- Vite + React 프로젝트 초기화
- Tailwind CSS 설정
- CSV 다운로드 및 데이터 구조 분석
- sql.js 통합
- useDatabase 훅 구현
- CSV 로딩 및 테이블 생성
- 쿼리 실행 로직
- SQLEditor 컴포넌트 (Monaco Editor)
- ResultTable 컴포넌트
- SchemaViewer 컴포넌트
- QueryHistory 컴포넌트
- 네이버파이낸셜 맥락 예제 쿼리 작성 (6개 레벨)
- ExampleQueries 컴포넌트
- SQL 학습 가이드
- 쿼리 패턴 라이브러리
- App.jsx 레이아웃 통합
- 다크모드 구현
- 성능 최적화
- 에러 처리 개선
- 기능 테스트
- 크로스 브라우저 테스트
- Vercel/Netlify 배포
- 문서화 (README.md)
- SELECT 기본: 컬럼 선택, WHERE 조건
- 집계 함수: COUNT, SUM, AVG, MIN, MAX
- GROUP BY: 그룹화 및 집계
- ORDER BY: 정렬
- LIMIT: 결과 제한
- JOIN: INNER, LEFT, RIGHT JOIN
- 서브쿼리: WHERE, FROM, SELECT 절 서브쿼리
- CASE WHEN: 조건부 로직
- 문자열 함수: CONCAT, SUBSTR, LIKE
- 날짜 함수: DATE, DATETIME 처리
- 윈도우 함수: ROW_NUMBER, RANK, LAG, LEAD
- CTE: WITH 절 사용
- 통계 함수: PERCENTILE, STDDEV
- 성능 최적화: 인덱스, 실행 계획
- 복잡한 쿼리: 다중 CTE, 재귀 쿼리
- 집계 분석: "업종별 매출 상위 10개 추출"
- 세그먼트 분석: "특정 조건의 사업자 타겟팅"
- 트렌드 분석: "월별 신규 사업자 증가율"
- 상권 분석: "특정 지역의 업종 밀집도"
- 고객 인사이트: "사업자 특성에 따른 분류"
- 명확한 컬럼명: AS로 결과 컬럼 명시
- 주석 추가: 복잡한 로직 설명
- 들여쓰기: 가독성 있는 포맷팅
- NULL 처리: COALESCE, NULLIF 활용
- 성능 고려: 불필요한 서브쿼리 지양
- 빠른 개발: HMR (Hot Module Replacement)
- 현대적: 최신 JavaScript 기능 지원
- 경량: 빠른 빌드 및 번들 크기
- 브라우저 실행: 서버 불필요, 완전한 클라이언트 사이드
- SQLite 호환: 표준 SQL 문법
- 빠른 성능: WebAssembly 기반
- VS Code 기반: 익숙한 개발 경험
- 강력한 기능: 문법 하이라이팅, 자동완성, 에러 표시
- 커스터마이징: SQL 전용 설정 가능
- 빠른 스타일링: 유틸리티 클래스
- 일관성: 디자인 시스템 통일
- 반응형: 쉬운 반응형 디자인
- 클라이언트 사이드: 모든 처리가 브라우저에서 실행 (데이터 유출 없음)
- XSS 방지: React의 기본 XSS 보호
- SQL Injection: 읽기 전용 DB, 사용자 쿼리 격리
- 데이터 크기: 브라우저 메모리 제한 (~100MB CSV)
- 쿼리 복잡도: 매우 복잡한 쿼리는 느릴 수 있음
- 브라우저 호환성: 최신 브라우저 (Chrome, Firefox, Edge)
- 다중 데이터셋: 여러 CSV 파일 로드
- 쿼리 공유: URL로 쿼리 공유
- AI 도우미: GPT 기반 쿼리 생성 도움
- 시각화: Chart.js로 결과 그래프 표시
- 협업 기능: 실시간 공동 쿼리 작성
- 퀴즈 모드: SQL 문제 풀이 및 자동 채점
- 성능 분석: EXPLAIN QUERY PLAN 표시
- 프로젝트명: NaverFinancial SQL Query Practice Platform
- 버전: 1.0.0
- 작성일: 2025-11-05
- 작성자: Claude Code Assistant
- 라이선스: MIT
- 목적: 네이버파이낸셜 면접 준비 (쿼리 테스트)