diff --git a/backend/src/main/resources/seed/quizzes.json b/backend/src/main/resources/seed/quizzes.json index 9f53e6d..4c17b2f 100644 --- a/backend/src/main/resources/seed/quizzes.json +++ b/backend/src/main/resources/seed/quizzes.json @@ -5477,7 +5477,7 @@ "option3": "WHERE lower(email) = 'kim@awesomedev.dev' (일반 email 인덱스만 있는 경우)", "option4": "WHERE created_at >= '2026-07-01' (범위 조건)", "answerIndex": 2, - "explanation": "인덱스는 원본 컬럼값 그대로 정렬돼 있으므로, lower()처럼 컬럼을 함수로 감싸는 순간 그 정렬표를 쓸 수 없게 됩니다. 꼭 필요하면 lower(email)에 대한 함수 기반 인덱스를 따로 만들어야 합니다. 반면 등호 비교, 전방 일치 LIKE('보안%'), 범위 조건은 모두 B-Tree 인덱스가 처리할 수 있는 형태입니다." + "explanation": "인덱스는 원본 컬럼값 그대로 정렬돼 있으므로, lower()처럼 컬럼을 함수로 감싸는 순간 그 정렬표를 쓸 수 없게 됩니다. 꼭 필요하면 lower(email)에 대한 함수 기반 인덱스를 따로 만들어야 합니다. 반면 등호 비교와 범위 조건은 B-Tree 인덱스가 그대로 처리합니다. (전방 일치 LIKE('보안%')도 원리는 범위 검색이지만, Postgres 기본 로케일에선 text_pattern_ops 인덱스를 따로 만들어야 탑니다.)" }, { "courseSlug": "lv3-db-indexing", diff --git a/frontend/src/pages/levels/Lv2PracticalTestingPage.jsx b/frontend/src/pages/levels/Lv2PracticalTestingPage.jsx index 6b8d829..de0cbdc 100644 --- a/frontend/src/pages/levels/Lv2PracticalTestingPage.jsx +++ b/frontend/src/pages/levels/Lv2PracticalTestingPage.jsx @@ -46,6 +46,10 @@ describe('isValidEmail', () => { it('@가 없으면 false를 돌려준다', () => { expect(isValidEmail('intern.awesomedev.dev')).toBe(false); }); + + it('@로 시작하면 false를 돌려준다', () => { // 선두 @ = 아이디가 비었다 (at === 0) + expect(isValidEmail('@awesomedev.dev')).toBe(false); + }); });`; const CODE_RUN = `# frontend/ 에서 — Vitest 설치와 실행 diff --git a/frontend/src/pages/levels/Lv3DbIndexingPage.jsx b/frontend/src/pages/levels/Lv3DbIndexingPage.jsx index 040e9e9..8ff891a 100644 --- a/frontend/src/pages/levels/Lv3DbIndexingPage.jsx +++ b/frontend/src/pages/levels/Lv3DbIndexingPage.jsx @@ -145,7 +145,10 @@ WHERE phone = '01012345678' -- O -- ③ 앞이 열린 LIKE — 시작 글자를 모르면 정렬 트리를 탈 수 없다 WHERE title LIKE '%보안%' -- X (앞이 %면 못 탐) -WHERE title LIKE '보안%' -- O (전방 일치는 범위 검색으로 변환됨) +WHERE title LIKE '보안%' -- △ 전방 일치는 원리상 범위 검색이지만, + -- Postgres 기본 로케일(ko_KR 등)에선 일반 B-Tree가 못 탄다. + -- text_pattern_ops 인덱스를 만들어야 탄다: + -- CREATE INDEX ix_title_pat ON t (title text_pattern_ops); -- ④ OR — 양쪽 다 인덱스가 있어야 Bitmap OR로 합쳐 쓸 수 있다 WHERE actor = 'a' OR ip = '1.2.3.4' -- 한쪽만 인덱스면 결국 Seq Scan