From 9045303a7ab85d5c8a1a4db48229fb615d999dbf Mon Sep 17 00:00:00 2001 From: AWESOMEDEV Date: Mon, 20 Jul 2026 12:51:55 +0900 Subject: [PATCH] =?UTF-8?q?fix(content):=20=EC=A0=84=EB=AC=B8=EA=B0=80=20?= =?UTF-8?q?=EA=B2=80=EC=A6=9D=20=EC=A7=80=EC=A0=81=202=EA=B1=B4=20?= =?UTF-8?q?=EB=B0=98=EC=98=81=20(=ED=8B=B0=EC=96=B4=20=EA=B0=95=EC=A2=8C?= =?UTF-8?q?=20=EC=A0=95=EB=B0=80=EC=84=B1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 4개 트랙 전문 리뷰(강좌 48·퀴즈 240) 결과 CRITICAL 0·정답키 오류 0. 확정된 정밀성 MINOR 2건만 수정: - Lv2 테스트 강좌: 'at>0→at>=0으로 바꾸면 빨간불' 실습이 제시된 테스트로는 안 깨지던 문제(살아남는 뮤턴트) — 선두 @ 케이스 테스트 추가로 실제 성립하게 - Lv3 인덱스 강좌+퀴즈 해설: 전방일치 LIKE('보안%')가 Postgres 기본 로케일에선 일반 B-Tree를 못 탄다는 조건(text_pattern_ops 필요) 명시 — 운영 DB 해설도 갱신 정답키·사실오류·버그코드는 240문항·48강좌에서 발견되지 않음. Co-Authored-By: Claude Opus 4.8 --- backend/src/main/resources/seed/quizzes.json | 2 +- frontend/src/pages/levels/Lv2PracticalTestingPage.jsx | 4 ++++ frontend/src/pages/levels/Lv3DbIndexingPage.jsx | 5 ++++- 3 files changed, 9 insertions(+), 2 deletions(-) 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