diff --git a/backend/src/main/resources/seed/quizzes.json b/backend/src/main/resources/seed/quizzes.json
index e7bff70..3d2a8a6 100644
--- a/backend/src/main/resources/seed/quizzes.json
+++ b/backend/src/main/resources/seed/quizzes.json
@@ -1,3552 +1,4152 @@
[
- {
- "courseSlug": "ai-tools",
- "question": "이 코스에서 AI 코딩 도구를 크게 두 갈래로 나눈 것은 무엇인가?",
- "option1": "코드 리뷰형과 배포 자동화형",
- "option2": "자동완성형과 챗 어시스턴트형",
- "option3": "검색 엔진형과 문서 번역형",
- "option4": "디버깅 전용형과 테스트 전용형",
- "answerIndex": 1,
- "explanation": "섹션 1에서 AI 코딩 도구를 에디터에서 다음 코드를 이어 써 주는 자동완성형(예: GitHub Copilot)과 대화창에 질문하면 답하는 챗 어시스턴트형(예: ChatGPT, Claude)의 두 갈래로 소개했다."
- },
- {
- "courseSlug": "ai-tools",
- "question": "코스에서 말하는 '좋은 질문의 3요소'로 올바르게 짝지어진 것은?",
- "option1": "맥락 · 속도 · 정확성",
- "option2": "목표 · 일정 · 결과",
- "option3": "예의 · 간결함 · 끈기",
- "option4": "맥락 · 제약 · 예시",
- "answerIndex": 3,
- "explanation": "섹션 2에서 좋은 질문의 3요소는 맥락(어떤 환경에서 뭘 만들다가), 제약(버전·라이브러리 등 조건), 예시(실제 코드·에러 메시지)라고 정리했다. 30분 룰에서 배운 멘토 질문법과 같은 구조다."
- },
- {
- "courseSlug": "ai-tools",
- "question": "다음 중 코스의 'AI 답변 검증 4단계' 체크리스트에 해당하지 않는 것은?",
- "option1": "같은 질문을 여러 AI에게 던져서 답이 많이 겹치는 쪽을 고른다",
- "option2": "한 줄 한 줄 읽고 무슨 코드인지 스스로 설명할 수 있는지 확인한다",
- "option3": "로컬에서 정상 케이스 1개와 이상한 입력 1개로 실제 실행해 본다",
- "option4": "낯선 API나 설정이면 공식 문서를 열어 근거를 교차 확인한다",
- "answerIndex": 0,
- "explanation": "섹션 3의 4단계는 '설명할 수 있는가, 우리 프로젝트에 맞는가, 실제로 돌아가는가, 근거를 교차 확인했는가'다. 여러 AI의 다수결로 고르는 방법은 체크리스트에 없다."
- },
- {
- "courseSlug": "ai-tools",
- "question": "AWESOMEDEV AI 사용 보안 수칙에 따르면, AI 입력창에 넣어도 되는 것은 무엇인가?",
- "option1": "고객사 프로젝트의 소스 코드",
- "option2": "서버 IP와 계정이 함께 적힌 접속 정보",
- "option3": "교재용 학습 플랫폼(mirim-app)처럼 공개 가능한 학습 코드",
- "option4": ".env 파일에 들어 있는 API 키와 토큰 값",
- "answerIndex": 2,
- "explanation": "섹션 5의 보안 수칙에서 공개 가능한 학습 코드, 내가 연습용으로 짠 코드, 경로·키 값을 지운 일반적인 에러 메시지는 넣어도 된다고 했다. 고객사 코드·비밀번호·접속 정보·개인정보는 절대 금지다."
- },
- {
- "courseSlug": "ai-tools",
- "question": "수습 B가 React 화면이 하얗게 나오면서 콘솔에 \"TypeError: Cannot read properties of undefined (reading 'map')\" 에러를 만났다. 코스의 실습 기준으로 가장 잘 쓴 프롬프트는?",
- "option1": "\"에러가 났어요. 급하니까 빨리 고쳐 주세요. 부탁드립니다.\"",
- "option2": "\"React로 코스 목록 화면을 만드는 중인데, 화면이 하얗게 나오고 이 에러 전문이 떠요. 12번째 줄 근처 코드와 제가 시도한 것도 붙일게요. 왜 undefined에서 map을 못 읽는지 원리도 설명해 주세요.\"",
- "option3": "\"TypeError라는 게 정확히 무엇인지 사전적인 정의부터 하나하나 알려 주세요.\"",
- "option4": "\"프로젝트 코드 전체를 붙여넣을 테니 알아서 전부 고친 완성본 파일만 만들어 주세요.\"",
- "answerIndex": 1,
- "explanation": "섹션 7의 실습처럼 맥락(React로 무엇을 만드는지)·증상(에러 전문)·코드(해당 줄 근처)·시도한 것을 담고 원리 설명까지 요청한 프롬프트가 좋은 질문이다. '고쳐줘'만 보내면 AI도 점쟁이가 된다고 했다."
- },
- {
- "courseSlug": "api",
- "question": "코스의 식당 비유에서 '메뉴판'에 해당하는 것은 무엇인가요?",
- "option1": "요청(Request) — 손님이 적어 내는 주문서",
- "option2": "API 문서 — 뭘 시킬 수 있는지 적힌 목록",
- "option3": "백엔드와 DB — 요리를 만드는 주방",
- "option4": "응답(Response) — 주방에서 나온 음식",
- "answerIndex": 1,
- "explanation": "섹션 1의 비유에서 메뉴판은 API 문서에 해당해요. 손님(프론트엔드)은 메뉴판에 있는 것만 주문할 수 있고, 그래서 정해진 요청에 정해진 응답이 오는 예측 가능한 약속이 됩니다."
- },
- {
- "courseSlug": "api",
- "question": "REST 규칙에서 '무엇을(자원)'과 '어떻게(행위)'는 각각 어디에 담나요?",
- "option1": "자원은 HTTP 메서드에, 행위는 URL에 담는다",
- "option2": "자원과 행위를 모두 요청 본문(body)에 담는다",
- "option3": "자원은 URL에, 행위는 HTTP 메서드에 담는다",
- "option4": "자원은 헤더에, 행위는 상태코드에 담는다",
- "answerIndex": 2,
- "explanation": "섹션 2의 핵심 두 줄 요약이에요. 자원은 명사로 URL에(/api/checklists/3), 행위는 GET·POST·PUT·DELETE 같은 메서드에 담아서, URL과 메서드만 봐도 무슨 일이 일어날지 읽히게 합니다."
- },
- {
- "courseSlug": "api",
- "question": "수습 사원이 로그인한 상태에서 관리자 전용 API를 호출했을 때, 서버가 돌려주는 상태코드는 무엇인가요?",
- "option1": "400 — 요청 본문의 문법이 잘못되었다는 뜻",
- "option2": "401 — 토큰이 없거나 만료되었다는 뜻",
- "option3": "404 — 요청한 자원이 존재하지 않는다는 뜻",
- "option4": "403 — 누군지는 알지만 권한이 없다는 뜻",
- "answerIndex": 3,
- "explanation": "섹션 6에서 401은 인증 실패(너 누구야?), 403은 인가 실패(누군진 아는데 자격이 없어)로 구분했어요. 로그인은 했지만 권한이 없는 경우이므로 403 Forbidden입니다."
- },
- {
- "courseSlug": "api",
- "question": "다음 중 코스에서 배운 JSON 문법 규칙으로 올바른 것은 무엇인가요?",
- "option1": "이름표(key)는 항상 큰따옴표로 감싸야 한다",
- "option2": "문자열에는 작은따옴표를 쓰는 것도 허용된다",
- "option3": "마지막 항목 뒤에 쉼표를 붙여도 문제없다",
- "option4": "// 를 사용해 주석을 자유롭게 달 수 있다",
- "answerIndex": 0,
- "explanation": "섹션 3의 규칙 4가지 중 하나로, key는 항상 큰따옴표로 감싸요. 반대로 작은따옴표, 마지막 항목 뒤 쉼표, 주석(//)은 모두 코스에서 '함정 주의'로 짚은 JSON 에러 원인입니다."
- },
- {
- "courseSlug": "api",
- "question": "동료가 체크리스트 삭제 기능을 'GET /api/deleteChecklist?id=3' 으로 만들었습니다. 코스 내용에 비추어 이 설계의 가장 큰 문제는 무엇인가요?",
- "option1": "GET은 응답 본문을 받을 수 없어서 삭제 결과를 확인할 방법이 없다",
- "option2": "GET을 안전하다고 믿는 크롤러가 링크를 따라가며 데이터를 지울 수 있고, 동사는 URL이 아니라 메서드에 담아야 한다",
- "option3": "URL에 물음표(?)와 숫자를 함께 쓰면 REST에서 요청 자체가 거부된다",
- "option4": "삭제는 반드시 POST로만 보내야 하며 DELETE 메서드는 조회 전용이다",
- "answerIndex": 1,
- "explanation": "섹션 2에서 배운 두 가지가 모두 어긋난 설계예요. 브라우저·검색엔진은 GET을 안전한 읽기로 믿고 미리 불러가기도 해서 크롤러가 데이터를 전부 지운 사고가 실제로 있었고, 자원은 명사(URL)·행위는 메서드로 표현해 DELETE /api/checklists/3 처럼 써야 합니다."
- },
- {
- "courseSlug": "assembly",
- "question": "부품 고르기의 '호환성 3대 체크'에서 CPU와 메인보드의 관계로 옳은 것은?",
- "option1": "같은 제조사 제품이면 소켓이 달라도 장착할 수 있다",
- "option2": "소켓 이름이 같은 CPU와 메인보드끼리만 장착할 수 있다",
- "option3": "CPU가 더 최신 제품이면 어떤 메인보드에든 장착할 수 있다",
- "option4": "DDR5를 지원하는 메인보드라면 CPU 종류는 상관없다",
- "answerIndex": 1,
- "explanation": "코스의 호환성 3대 체크 중 첫 번째로, CPU와 보드는 '같은 소켓 이름'끼리만 결혼할 수 있다고 설명해요. 예를 들어 LGA1700 CPU는 AM5 보드에 아예 꽂히지 않습니다."
- },
- {
- "courseSlug": "assembly",
- "question": "파워(PSU) 뒷면 스위치의 I와 O 표시에 대한 설명으로 옳은 것은?",
- "option1": "O가 켜짐이고 I가 꺼짐이다",
- "option2": "I와 O는 전압을 고르는 선택 스위치다",
- "option3": "I가 켜짐이고 O가 꺼짐이다",
- "option4": "I는 절전 모드이고 O는 완전 꺼짐이다",
- "answerIndex": 2,
- "explanation": "코스의 '초보가 자주 하는 실수'에서 파워 뒷면 스위치는 I가 켜짐, O가 꺼짐이라고 알려줘요(이진수의 1과 0). '전원 버튼을 눌러도 반응이 없어요'의 단골 범인입니다."
- },
- {
- "courseSlug": "assembly",
- "question": "첫 부팅에서 팬은 도는데 화면이 안 나올 때, 코스에서 가장 먼저 해보라고 안내하는 조치는?",
- "option1": "부팅 USB를 만들어 윈도우를 다시 설치한다",
- "option2": "CPU 쿨러를 분리해 서멀구리스를 다시 바른다",
- "option3": "파워를 더 높은 용량의 제품으로 교체한다",
- "option4": "RAM을 뽑았다가 \"딸깍\" 소리가 나게 다시 장착한다",
- "answerIndex": 3,
- "explanation": "화면이 안 나오는 원인 1위는 RAM이 덜 꽂힌 상태예요. 코스의 점검 순서에서도 팬은 도는데 화면이 안 나오면 RAM을 뽑았다가 '딸깍' 소리가 나게 재장착하라고 안내합니다."
- },
- {
- "courseSlug": "assembly",
- "question": "조립 마지막 단계인 '선정리'를 하는 진짜 이유로 코스에서 설명하는 것은?",
- "option1": "케이스 안 공기 흐름을 확보해 냉각을 돕기 위해서",
- "option2": "케이블끼리 닿으면 합선이 일어날 수 있어서",
- "option3": "전면 패널 커넥터를 꽂을 공간을 만들기 위해서",
- "option4": "케이블 길이를 줄여 파워 효율을 높이기 위해서",
- "answerIndex": 0,
- "explanation": "표준 9단계의 마지막인 선정리는 예쁘라고 하는 게 아니라 공기 흐름, 즉 냉각을 위해서라고 코스에서 설명해요. 케이블을 케이스 뒷면 공간으로 넘기고 케이블타이로 묶습니다."
- },
- {
- "courseSlug": "assembly",
- "question": "동아리 후배의 PC는 RAM 8GB에 SSD 256GB인데, IntelliJ와 도커를 같이 켜면 버벅인다고 해요. 코스의 '가상 업그레이드 계획' 기준으로 1순위 업그레이드는?",
- "option1": "외장 그래픽카드 추가 — 화면을 그리는 건 GPU의 일이니까",
- "option2": "RAM을 32GB로 증설 — 개발 도구는 메모리 대식가이고 가장 싸고 체감이 크니까",
- "option3": "CPU 교체 — 컴파일 속도가 곧 개발 체감 속도니까",
- "option4": "SSD를 1TB로 교체 — 저장 공간이 커지면 속도도 빨라지니까",
- "answerIndex": 1,
- "explanation": "코스의 업그레이드 계획 예시에서 개발 공부용 PC의 1순위는 RAM 8GB→32GB예요. 개발 도구는 메모리 대식가라서 가장 싸고 체감이 큰 업그레이드이기 때문이고, CPU는 소켓 문제로 사실상 새 PC가 되어 3순위입니다."
- },
- {
- "courseSlug": "aws-intro",
- "question": "코스에서 말하는 클라우드의 핵심 발상 전환으로 가장 알맞은 것은?",
- "option1": "서버 컴퓨터를 더 싸게 대량 구매해서 소유하는 것",
- "option2": "컴퓨터를 소유하는 대신 컴퓨팅 파워를 쓴 만큼 구독하는 것",
- "option3": "모든 소프트웨어를 무료로 내려받아 쓰는 것",
- "option4": "회사마다 데이터센터를 직접 지어 운영하는 것",
- "answerIndex": 1,
- "explanation": "코스 섹션 1은 공장이 발전기를 버리고 전기를 사 쓰게 된 것처럼, '컴퓨터를 소유'하는 시대에서 '컴퓨팅 파워를 구독'하는 시대로 바뀐 것이 클라우드 혁명의 핵심이라고 설명합니다."
- },
- {
- "courseSlug": "aws-intro",
- "question": "코스에서 S3(Simple Storage Service)를 한 줄로 소개한 내용은 무엇인가요?",
- "option1": "DB를 AWS가 대신 설치하고 백업해 주는 관리형 데이터베이스",
- "option2": "클릭 몇 번으로 만드는 가상 서버 인스턴스",
- "option3": "이미지·백업·로그를 파일 단위로 넣고 꺼내는 용량 무제한 웹 창고",
- "option4": "코드만 올리면 실행 환경을 알아서 준비해 주는 서비스",
- "answerIndex": 2,
- "explanation": "섹션 5에서 S3는 '용량 무제한 파일 창고'로, 서버 디스크와 달리 파일 단위로 넣고 꺼내는 웹 창고라고 소개합니다. DB를 대신 관리해 주는 것은 RDS입니다."
- },
- {
- "courseSlug": "aws-intro",
- "question": "인스턴스 이름 t3.medium에서 숫자 '3'이 뜻하는 것은?",
- "option1": "3세대라는 뜻으로, 숫자가 클수록 최신이다",
- "option2": "vCPU가 3개 달려 있다는 뜻이다",
- "option3": "메모리가 3GB라는 뜻이다",
- "option4": "크기 등급 중 3번째로 크다는 뜻이다",
- "answerIndex": 0,
- "explanation": "섹션 3의 '자동차 모델명 읽기' 비유에서 t는 패밀리(차종), 3은 세대(연식), medium은 크기(배기량)입니다. 숫자가 클수록 최신 세대로 보통 더 빠르고 저렴하다고 설명합니다."
- },
- {
- "courseSlug": "aws-intro",
- "question": "EC2 인스턴스를 중지(Stop)했을 때에도 계속 나가는 요금은 무엇인가요?",
- "option1": "인스턴스의 시간당 사용료",
- "option2": "프리 티어 가입 시 내는 기본 요금",
- "option3": "t 패밀리의 CPU 버스트 크레딧 요금",
- "option4": "EBS 디스크와 서버에 연결 안 된 탄력적 IP 요금",
- "answerIndex": 3,
- "explanation": "섹션 4에서 인스턴스를 끄면 시간당 사용료는 멈추지만, 데이터를 보관 중인 EBS 디스크와 서버에 연결되지 않은 탄력적 IP는 계속 과금된다고 설명합니다. '켜 놓고 잊어버림'과 함께 대표적인 요금 함정입니다."
- },
- {
- "courseSlug": "aws-intro",
- "question": "수습 A가 nslookup으로 edu.awesomedevapp.com의 IP를 확인해 두었다. 며칠 뒤 서버가 재시작됐는데도 같은 IP로 잘 접속된다. 코스 내용상 이를 가능하게 하는 부품은?",
- "option1": "보안 그룹이 허락된 포트를 고정해 주기 때문",
- "option2": "탄력적 IP가 '영구 도로명 주소'처럼 서버에 붙어 있기 때문",
- "option3": "Caddy가 HTTPS 현관에서 요청을 대신 받아 주기 때문",
- "option4": "EBS 디스크에 서버의 IP 주소가 저장되어 있기 때문",
- "answerIndex": 1,
- "explanation": "섹션 6에서 EC2는 재시작하면 IP가 바뀔 수 있는데, 탄력적 IP는 '영구 도로명 주소'를 서버에 붙여 두는 것이라 도메인이 늘 같은 곳을 가리킬 수 있다고 설명합니다. 보안 그룹은 경비실(방화벽), Caddy는 HTTPS 처리 담당입니다."
- },
- {
- "courseSlug": "bandwidth",
- "question": "이 코스의 도로 비유에서 '대역폭(bandwidth)'은 무엇에 해당할까요?",
- "option1": "차 한 대가 달리는 최고 속도",
- "option2": "도로의 폭, 즉 동시에 지나갈 수 있는 차선 수",
- "option3": "출발지에서 목적지까지의 거리",
- "option4": "도로 위에 있는 신호등의 개수",
- "answerIndex": 1,
- "explanation": "섹션 1에서 배웠듯 신호가 이동하는 속도는 어느 회선이나 거의 비슷하고, 진짜 차이는 동시에 얼마나 많은 데이터를 흘려보낼 수 있느냐입니다. 그래서 대역폭은 차의 빠르기가 아니라 도로의 폭(차선 수)에 비유됩니다."
- },
- {
- "courseSlug": "bandwidth",
- "question": "통신사 500Mbps 상품을 쓸 때, 브라우저 다운로드 창에 뜰 수 있는 이론상 최대 속도는 약 얼마일까요?",
- "option1": "약 50 MB/s",
- "option2": "약 125 MB/s",
- "option3": "약 62.5 MB/s",
- "option4": "약 500 MB/s",
- "answerIndex": 2,
- "explanation": "Mbps의 b는 bit, MB/s의 B는 Byte이고 1바이트는 8비트이므로 500Mbps ÷ 8 = 62.5MB/s입니다. 섹션 2의 '8배의 비밀' — 다운로드 창 숫자가 작아 보이는 건 고장이 아니라 단위 착시예요."
- },
- {
- "courseSlug": "bandwidth",
- "question": "기가 인터넷을 쓰는데도 온라인 게임에서 랙이 걸릴 수 있는 이유로 가장 알맞은 것은?",
- "option1": "게임은 작은 데이터를 자주 주고받아서 대역폭보다 지연시간(ping)의 영향을 크게 받기 때문",
- "option2": "게임은 큰 데이터를 한꺼번에 받아야 해서 기가 회선으로도 대역폭이 부족하기 때문",
- "option3": "기가 회선은 다운로드 전용이라 게임의 업로드 데이터를 처리하지 못하기 때문",
- "option4": "핑이 낮아질수록 대역폭이 함께 줄어드는 반비례 관계가 있기 때문",
- "answerIndex": 0,
- "explanation": "섹션 4에서 배운 내용으로, 게임은 '내 캐릭터 움직였어!' 같은 작은 메시지를 아주 자주 주고받는 왕복 시간(ping) 싸움입니다. 도로가 아무리 넓어도 서버가 멀면 지연시간은 높을 수 있어요."
- },
- {
- "courseSlug": "bandwidth",
- "question": "인터넷 속도를 '제대로' 측정하는 방법으로 옳은 것은?",
- "option1": "숫자가 가장 크게 나오도록 해외 측정 서버를 골라서 잰다",
- "option2": "저녁 8~11시에 한 번만 측정해서 그 값을 기준으로 삼는다",
- "option3": "다운로드 숫자 하나만 기록하면 업로드와 핑은 볼 필요가 없다",
- "option4": "다른 기기·앱의 다운로드를 끄고, 시간대를 바꿔 2~3번 측정해 경향을 본다",
- "answerIndex": 3,
- "explanation": "섹션 7의 체크리스트대로 측정도 조건 통제가 생명입니다. 다운로드·업로드·핑을 모두 기록하고, 혼잡 시간(저녁 8~11시)을 피해 시간대를 바꿔 여러 번 재서 한 번의 숫자가 아니라 경향으로 읽어야 해요."
- },
- {
- "courseSlug": "bandwidth",
- "question": "500Mbps 상품을 쓰는 집에서 벽 너머 방에서 와이파이로 측정했더니 다운로드 90Mbps, 핑 5ms가 나왔습니다. 가장 의심되는 병목 구간은?",
- "option1": "통신사 회선 구간 — 계약 상품이 실제보다 낮게 설정되어 있다",
- "option2": "내 PC와 공유기 사이 구간 — 벽 너머 와이파이가 속도를 깎고 있다",
- "option3": "상대 서버 구간 — 해외 서버라 국제 구간에서 느려지고 있다",
- "option4": "측정 도구 구간 — 핑이 5ms로 낮게 나온 것 자체가 측정 오류다",
- "answerIndex": 1,
- "explanation": "섹션 7의 마지막 예시처럼 '다운로드는 낮은데 핑은 좋은' 패턴이면 회선(②)이 아니라 집 안 구간(①)이 병목일 가능성이 큽니다. 섹션 6에서 가정의 1순위 용의자는 거의 항상 벽·거리에 약해지는 와이파이라고 배웠어요."
- },
- {
- "courseSlug": "binary",
- "question": "컴퓨터가 0과 1, 딱 두 가지 상태만 사용하는 가장 큰 이유는 무엇인가요?",
- "option1": "2진수는 10진수보다 계산 공식이 단순해서 CPU 설계 비용이 줄어들기 때문",
- "option2": "켜짐과 꺼짐 두 상태만 있으면 전압이 조금 흔들려도 확실히 구분할 수 있기 때문",
- "option3": "전기의 세기를 10단계로 나누면 스위치(트랜지스터)가 10배 더 필요하기 때문",
- "option4": "0과 1만 쓰면 데이터가 자동으로 압축되어 저장 용량이 줄어들기 때문",
- "answerIndex": 1,
- "explanation": "섹션 1 '왜 0과 1인가'의 핵심입니다. 상태가 딱 2개면 헷갈릴 수가 없어서, 전압이 살짝 흔들려도 켜짐인지 꺼짐인지 확실히 구분됩니다. 반대로 0~9를 전압 10단계로 표현하면 6이 7로 읽히는 사고가 납니다."
- },
- {
- "courseSlug": "binary",
- "question": "2진수 1011을 10진수로 바꾸면 얼마인가요?",
- "option1": "9",
- "option2": "10",
- "option3": "11",
- "option4": "13",
- "answerIndex": 2,
- "explanation": "섹션 2의 자리값 계산입니다. 2진수는 오른쪽 끝부터 자리값이 1, 2, 4, 8로 커지고, 1이 켜진 자리의 값만 골라 더하면 됩니다. 1011은 8 + 0 + 2 + 1 = 11입니다."
- },
- {
- "courseSlug": "binary",
- "question": "1KB가 1,000바이트가 아니라 1,024바이트인 이유로 코스가 설명한 것은 무엇인가요?",
- "option1": "컴퓨터는 2의 거듭제곱으로 세는 게 편해서, 1,000에 가장 가까운 2¹⁰ = 1,024를 한 묶음으로 삼았기 때문",
- "option2": "하드디스크 제조사들이 용량을 더 크게 보이게 하려고 국제 규격을 1,024로 정했기 때문",
- "option3": "1바이트가 8비트이므로, 1,000에 가장 가까운 8의 거듭제곱이 1,024이기 때문",
- "option4": "초기 컴퓨터의 메모리가 1,024바이트 단위로만 생산되어 그 관습이 굳어졌기 때문",
- "answerIndex": 0,
- "explanation": "섹션 3 '1024의 비밀'입니다. 컴퓨터는 2진수 세상에 살기 때문에 2를 10번 곱한 1,024가 1,000에 아주 가까운 '2진수식 천 단위'가 되어 한 묶음으로 씁니다. 참고로 제조사는 1,000 기준으로 계산해서 1TB 디스크가 윈도우에선 약 931GB로 보입니다."
- },
- {
- "courseSlug": "binary",
- "question": "'뷁' 같은 글자 깨짐(외계어) 현상이 생기는 원인으로 코스가 설명한 것은 무엇인가요?",
- "option1": "글자 수가 128개를 넘으면 ASCII가 넘치는 글자를 자동으로 잘라내기 때문",
- "option2": "한글은 3바이트라서 전송 중에 마지막 바이트가 자주 손실되기 때문",
- "option3": "유니코드 번호표가 나라마다 달라서 같은 글자에 다른 번호가 붙기 때문",
- "option4": "UTF-8로 포장한 데이터를 EUC-KR 같은 다른 규칙으로 풀어서 번호표가 엉뚱한 글자에 매칭되기 때문",
- "answerIndex": 3,
- "explanation": "섹션 4의 UTF-8 설명입니다. 인코딩은 유니코드 번호를 바이트로 담는 '포장법'이라서, 포장 규칙과 개봉 규칙이 같아야 합니다. 우리 회사가 인코딩을 처음부터 끝까지 UTF-8로 통일하는 이유이기도 합니다."
- },
- {
- "courseSlug": "binary",
- "question": "수민이는 코스에서 배운 대로 한 손의 손가락 5개를 스위치처럼 써서(접힘=0, 펴짐=1) 수를 표현하려고 합니다. 한 손으로 셀 수 있는 가장 큰 수는 얼마인가요?",
- "option1": "15",
- "option2": "31",
- "option3": "32",
- "option4": "63",
- "answerIndex": 1,
- "explanation": "섹션 1의 손가락 비유입니다. 스위치 5개는 2×2×2×2×2 = 32가지 상태를 만들 수 있어 0부터 31까지 셀 수 있습니다. 생일의 '일'(1~31)이 반드시 2진수 5자리 안에 들어가는 이유이기도 합니다."
- },
- {
- "courseSlug": "cache-nosql",
- "question": "코스에서 설명한 '캐시 히트(hit)'에 해당하는 상황은 무엇인가?",
- "option1": "캐시에 데이터가 없어 DB까지 다녀온 뒤 응답하는 경우",
- "option2": "원본 DB가 바뀌어 캐시의 낡은 사본을 지워야 하는 경우",
- "option3": "캐시에 찾는 데이터가 있어 DB에 가지 않고 바로 응답하는 경우",
- "option4": "브라우저가 강력 새로고침으로 캐시를 무시하고 요청하는 경우",
- "answerIndex": 2,
- "explanation": "섹션 2의 사물함 비유처럼 캐시에 찾는 게 있으면 히트, 없으면 미스입니다. 미스일 때는 DB에 다녀오면서 캐시에 사본을 복사해 두어 다음 요청부터 히트가 납니다."
- },
- {
- "courseSlug": "cache-nosql",
- "question": "코스에서 Redis가 빠른 비결로 든 두 가지 이유를 바르게 묶은 것은?",
- "option1": "데이터를 메모리(RAM)에 두고, 키를 해시 계산 한 번으로 바로 찾기 때문",
- "option2": "데이터를 디스크에 압축해 저장하고, 인덱스를 미리 정렬해 두기 때문",
- "option3": "데이터를 표(테이블) 구조로 저장해 JOIN 연산이 강력하기 때문",
- "option4": "모든 데이터를 브라우저에 복사해 두어 네트워크를 타지 않기 때문",
- "answerIndex": 0,
- "explanation": "섹션 3에서 Redis는 디스크보다 훨씬 빠른 메모리(RAM)에 데이터를 두고, 키를 해시로 계산해 위치를 바로 알아내서 데이터가 백만 개여도 찾는 시간이 거의 같다고 설명합니다."
- },
- {
- "courseSlug": "cache-nosql",
- "question": "캐시의 유통기한(TTL)을 1시간처럼 길게 잡았을 때 생기는 문제로 코스가 설명한 것은?",
- "option1": "DB에 너무 자주 다녀오게 되어 캐시 효과가 떨어진다",
- "option2": "메모리 대신 디스크에 저장되어 읽기 속도가 크게 느려진다",
- "option3": "키를 해시로 찾을 수 없게 되어 검색 시간이 점점 늘어난다",
- "option4": "원본이 바뀌어도 낡은 정보를 계속 보여줄 위험이 커진다",
- "answerIndex": 3,
- "explanation": "섹션 4의 우유 유통기한 비유입니다. TTL이 짧으면 신선하지만 DB에 자주 다녀오고, 길면 빠르지만 낡은 정보를 보여줄 위험이 커지는 트레이드오프가 캐시 무효화가 어려운 이유입니다."
- },
- {
- "courseSlug": "cache-nosql",
- "question": "실습에서 확인한 상태 코드 304 Not Modified가 뜻하는 것은 무엇인가?",
- "option1": "서버가 요청받은 파일 전체를 본문에 담아 새로 보내 주었다",
- "option2": "파일이 안 바뀌었으니 브라우저가 가진 사본을 그대로 쓰라는 답장이다",
- "option3": "서버에 묻지 않고 메모리 캐시에서 바로 꺼내 썼다는 표시이다",
- "option4": "요청한 파일이 서버에서 삭제되어 더 이상 찾을 수 없다는 뜻이다",
- "answerIndex": 1,
- "explanation": "섹션 8에서 304는 서버가 ETag 등으로 버전을 비교해 보고 '안 바뀌었으니 네 사본을 써'라고 본문 없이 답장만 보내는 신호, 즉 브라우저 캐시 히트의 영수증이라고 설명합니다."
- },
- {
- "courseSlug": "cache-nosql",
- "question": "학습 플랫폼을 설계한다. 학생마다 형식이 제각각인 자유 양식 학습일지, 날아가도 다시 만들 수 있는 로그인 세션, 절대 사라지면 안 되는 수강 기록 — 섹션 7의 결정 기준에 맞는 배치는?",
- "option1": "학습일지는 Redis, 세션은 PostgreSQL, 수강 기록은 MongoDB",
- "option2": "학습일지는 PostgreSQL, 세션은 MongoDB, 수강 기록은 Redis",
- "option3": "학습일지는 MongoDB, 세션은 Redis, 수강 기록은 PostgreSQL",
- "option4": "학습일지는 Redis, 세션은 MongoDB, 수강 기록은 PostgreSQL",
- "answerIndex": 2,
- "explanation": "섹션 7의 세 질문 그대로입니다. 사라지면 안 되는 원본(수강 기록)은 PostgreSQL, 날아가도 재생성 가능한 것(세션)은 Redis, 문서마다 모양이 다른 것(자유 양식 학습일지)은 MongoDB가 맡습니다."
- },
- {
- "courseSlug": "cicd",
- "question": "코스에서 설명하는 CI(Continuous Integration, 지속적 통합)의 핵심 의미로 가장 알맞은 것은?",
- "option1": "서버에 새 버전을 올린 뒤 사람이 브라우저를 새로고침하며 직접 확인하는 것",
- "option2": "코드를 저장소에 합칠 때마다(push할 때마다) 로봇이 자동으로 빌드하고 테스트하는 것",
- "option3": "여러 사람의 코드를 한 달 치씩 모아 두었다가 한꺼번에 몰아서 검사하는 것",
- "option4": "새 버전에서 장애가 났을 때 이전 버전으로 1분 안에 되돌리는 것",
- "answerIndex": 1,
- "explanation": "섹션 2의 내용으로, CI는 push될 때마다 로봇이 빌드와 테스트를 자동으로 하는 것입니다. '가끔 크게'가 아니라 '자주 조금씩' 검사하기 때문에 버그를 일찍, 싸게 잡을 수 있어요."
- },
- {
- "courseSlug": "cicd",
- "question": "CD(지속적 배포)가 도입된 뒤 사람에게 남는 일은 무엇이라고 코스는 설명하나?",
- "option1": "빌드 결과물을 scp 명령으로 서버에 직접 올리는 일",
- "option2": "서버에 SSH로 접속해서 돌고 있던 옛 버전을 중지하는 일",
- "option3": "git push 명령 하나를 실행하는 일",
- "option4": "배포가 끝난 뒤 헬스체크 로그를 사람이 눈으로 검사하는 일",
- "answerIndex": 2,
- "explanation": "섹션 3에서 CD 이후에는 빌드·검사·업로드·교체·확인이 전부 로봇 몫이 되고, 사람이 하는 일은 git push 하나만 남는다고 설명합니다. 손빨래가 세탁기 버튼이 되는 비유가 여기에 해당해요."
- },
- {
- "courseSlug": "cicd",
- "question": "코스가 파이프라인의 가장 중요한 성질로 꼽는 것은?",
- "option1": "한 정거장이라도 실패하면 그 자리에서 멈춰 배포 단계까지 가지 않는다",
- "option2": "모든 단계를 사람보다 훨씬 빠른 속도로 처리해 배포 시간을 줄인다",
- "option3": "빌드와 테스트를 병렬로 동시에 실행해서 기다리는 시간을 아낀다",
- "option4": "장애가 나면 원인을 자동으로 분석해서 코드까지 고쳐 준다",
- "answerIndex": 0,
- "explanation": "섹션 4의 핵심으로, 파이프라인은 컨베이어 벨트처럼 '실패하면 멈추는' 구조입니다. 그래서 테스트가 깨진 코드는 배포 단계에 구조적으로 도착할 수 없고, 불량품이 사용자에게 가기 전에 벨트가 멈춥니다."
- },
- {
- "courseSlug": "cicd",
- "question": "코스에서 우리 스택의 롤백(되돌리기)을 빠르게 만들어 주는 열쇠로 꼽은 것은?",
- "option1": "장애가 나면 서버에 접속해 코드를 그 자리에서 고치고 다시 빌드하는 것",
- "option2": "배포 전에 테스트를 여러 번 반복 실행해서 장애 자체를 아예 막는 것",
- "option3": "Caddy가 이전 버전의 화면을 캐시로 저장해 두었다가 대신 보여 주는 것",
- "option4": "Docker 이미지에 버전 태그를 붙여 보관해 두고 이전 이미지로 다시 실행하는 것",
- "answerIndex": 3,
- "explanation": "섹션 6에서 롤백의 열쇠는 Docker라고 설명합니다. v1.2, v1.3처럼 버전마다 이미지를 태그로 보관하면, 되돌리기가 '옛 이미지로 컨테이너 다시 실행' 한 줄이 되기 때문이에요."
- },
- {
- "courseSlug": "cicd",
- "question": "수습 A가 마지막 실습대로 우리 플랫폼의 배포 지도를 그리고 각 단계에 [사람]·[자동]·[위험] 표시를 붙였다. 코스의 기준에 따르면 ★(자동화 1순위)을 쳐야 하는 단계는?",
- "option1": "[자동] 표시가 붙은, 이미 로봇이 처리하고 있는 단계",
- "option2": "[사람]과 [위험] 표시가 함께 붙은, 실수가 잦고 실수하면 아픈 단계",
- "option3": "[사람] 표시만 붙은 단계 중에서 시간이 가장 오래 걸리는 단계",
- "option4": "지도의 맨 앞에 있는, 코드 수정 직후의 첫 번째 단계",
- "answerIndex": 1,
- "explanation": "섹션 7 실습의 3단계 규칙으로, [사람]+[위험]이 겹치는 단계에 ★을 칩니다. 사람 손이 필요해 실수가 잦고, 실수하면 사이트가 죽는 아픈 곳부터 자동화하는 것이 1순위이기 때문이에요."
- },
- {
- "courseSlug": "clean-code",
- "question": "이 코스는 모든 규칙이 한 문장으로 요약된다고 소개합니다. 그 문장은 무엇인가요?",
- "option1": "코드는 무조건 짧게 써라",
- "option2": "동작만 같으면 스타일은 자유다",
- "option3": "읽는 사람의 물음표를 줄여라",
- "option4": "주석은 많이 달수록 안전하다",
- "answerIndex": 2,
- "explanation": "섹션 1의 팁에서 이름 짓기부터 코드리뷰 매너까지 이 코스의 규칙 전부가 '읽는 사람의 물음표를 줄여라' 한 문장의 각론이라고 설명합니다."
- },
- {
- "courseSlug": "clean-code",
- "question": "코스에서 제시한 이름 짓기 규칙으로 올바른 것은 무엇인가요?",
- "option1": "변수는 동사로, 함수는 명사로 짓는다",
- "option2": "변수·상수는 명사로, 함수는 동사로 시작한다",
- "option3": "모든 이름은 타자 속도를 위해 짧게 줄인다",
- "option4": "임시 값에는 tmp, data 같은 이름을 쓴다",
- "answerIndex": 1,
- "explanation": "섹션 2의 규칙 3줄 요약 — 변수·상수는 명사(activeMembers 등), 함수는 동사로 시작(fetchCourses 등), a·tmp·data 같은 '아무 이름'은 금지입니다."
- },
- {
- "courseSlug": "clean-code",
- "question": "함수를 쪼개야 할지 판단할 때 코스가 제시한 진짜 기준은 무엇인가요?",
- "option1": "함수가 5줄을 넘으면 무조건 쪼갠다",
- "option2": "주석이 세 개 이상 달리면 쪼갠다",
- "option3": "매개변수가 두 개를 넘으면 쪼갠다",
- "option4": "하는 일을 한 문장으로 말할 때 '그리고'가 나오면 쪼갠다",
- "answerIndex": 3,
- "explanation": "섹션 3에서 기준은 줄 수가 아니라 \"이 함수가 하는 일을 '그리고' 없이 한 문장으로 말할 수 있는가\"라고 했습니다. 한 가지 일을 하는 20줄 함수는 괜찮습니다."
- },
- {
- "courseSlug": "clean-code",
- "question": "코스가 말하는 '좋은 주석'의 예로 가장 알맞은 것은 무엇인가요?",
- "option1": "서버가 페이지 번호를 0이 아니라 1부터 세기 때문에 보정한다",
- "option2": "i 값을 1만큼 증가시키는 코드다",
- "option3": "activeMembers는 회원 목록을 담는 변수다",
- "option4": "아래 반복문은 배열을 처음부터 끝까지 돈다",
- "answerIndex": 0,
- "explanation": "섹션 4에 따르면 좋은 주석은 코드만 봐서는 알 수 없는 '왜'(의도·사정·제약)를 남기는 주석입니다. 나머지 셋은 코드가 이미 말하는 '무엇'을 반복한 소음 주석입니다."
- },
- {
- "courseSlug": "clean-code",
- "question": "수습 동료가 handleSubmit 함수 하나에서 입력 검사, 데이터 가공, 서버 전송, 화면 뒷정리를 전부 처리하고 있습니다. 이 상황을 코스의 비유로 표현하면 무엇인가요?",
- "option1": "받는 사람 없이 나만 알아보면 되는 일기 같은 코드다",
- "option2": "이름표 대신 '그거, 저거'라고 써 붙인 창고다",
- "option3": "한 사람이 주문받고 요리하고 서빙하고 설거지까지 하는 식당이다",
- "option4": "게시판 세 곳에 같은 공지를 붙여 둔 학교다",
- "answerIndex": 2,
- "explanation": "섹션 3 '함수는 한 가지 일만'의 비유입니다. 한 함수가 네 가지 일을 하면 사고 나기 쉽고 일을 나눠 줄 수도 없으니, 일 하나당 함수 하나로 쪼개야 합니다."
- },
- {
- "courseSlug": "cloud-network",
- "question": "우리 학습 플랫폼의 EC2 서버가 실제로 위치한 AWS 리전은 어디인가?",
- "option1": "ap-northeast-1 (도쿄 리전)",
- "option2": "us-east-1 (미국 버지니아 리전)",
- "option3": "ap-northeast-2 (서울 리전)",
- "option4": "ap-northeast-2a (서울의 가용영역)",
- "answerIndex": 2,
- "explanation": "코스 1섹션에서 우리 서버는 사용자와 물리적으로 가까운 서울 리전(ap-northeast-2)에 있다고 배웠다. ap-northeast-2a는 리전이 아니라 그 안의 독립된 건물 그룹인 가용영역(AZ)이다."
- },
- {
- "courseSlug": "cloud-network",
- "question": "코스에서 설명한 VPC(Virtual Private Cloud)의 개념으로 가장 알맞은 것은?",
- "option1": "클라우드 안에 친 가상의 울타리로, 다른 회사와 서로 전혀 보이지 않게 분리된 나만의 네트워크",
- "option2": "서버 여러 대 앞에서 요청을 골고루 나눠 주며 교통정리를 하는 장치",
- "option3": "전 세계 곳곳의 엣지 서버에 복사본을 미리 배치해 두는 전송 네트워크",
- "option4": "도시 단위로 데이터센터 건물들을 묶어 놓은 지리적 구역",
- "answerIndex": 0,
- "explanation": "2섹션에서 VPC는 거대한 데이터센터 단지 안에 울타리를 치고 '여기부터는 우리 땅'이라 선언한 가상 네트워크로, 다른 회사 VPC와는 서로 절대 보이지 않는다고 설명했다. 지난 코스의 공유기 사설 네트워크(192.168.x.x)의 회사·클라우드 버전이다."
- },
- {
- "courseSlug": "cloud-network",
- "question": "데이터베이스처럼 절대 외부에 노출되면 안 되는 서버를 배치할 서브넷과 그 이유로 옳은 것은?",
- "option1": "퍼블릭 서브넷 — 인터넷 게이트웨이와 연결되어 있어 관리자가 접속하기 편하기 때문",
- "option2": "퍼블릭 서브넷 — 손님(사용자)의 요청을 가장 빠르게 받아 처리할 수 있기 때문",
- "option3": "프라이빗 서브넷 — 퍼블릭 서브넷보다 IP 주소를 더 많이 확보할 수 있기 때문",
- "option4": "프라이빗 서브넷 — 인터넷에서 들어오는 길 자체가 없어 해커가 두드려도 접근할 수 없기 때문",
- "answerIndex": 3,
- "explanation": "3섹션의 핵심 원칙 '손님 맞을 것만 대로변에, 금고(DB)는 안쪽 방에'에 해당한다. 프라이빗 서브넷은 인터넷 게이트웨이(정문)와 이어지지 않아 외부에서 직접 들어올 길이 없으며, DB를 퍼블릭에 두는 것은 실무에서 가장 흔한 보안 사고 중 하나라고 경고했다."
- },
- {
- "courseSlug": "cloud-network",
- "question": "코스에서 탄력적 IP(Elastic IP)를 '서버의 평생 전화번호'에 비유했다. 탄력적 IP가 해결해 주는 문제는 무엇인가?",
- "option1": "서버가 살아 있는지 주기적으로 확인해 쓰러진 서버를 배분 명단에서 빼는 문제",
- "option2": "EC2 서버를 껐다 켜면 공인 IP가 바뀌어 도메인이 허공을 가리키게 되는 문제",
- "option3": "지구 반대편 사용자에게는 물리적 거리 때문에 응답이 느려지는 문제",
- "option4": "한 데이터센터 건물에 정전이나 화재가 나면 서비스 전체가 멈추는 문제",
- "answerIndex": 1,
- "explanation": "4섹션에서 EC2는 껐다 켜면 공인 IP가 바뀔 수 있어 도메인이 가리키던 주소가 어긋나는 사고가 나는데, 탄력적 IP(우리 플랫폼은 3.36.160.246)를 고정으로 붙이면 재부팅하거나 새 서버로 갈아타도 같은 주소를 유지한다고 배웠다. 휴대폰 번호이동과 같은 원리다."
- },
- {
- "courseSlug": "cloud-network",
- "question": "우리 플랫폼에 브라질 지사가 생겨 CDN을 도입하기로 했다. 코스의 '편의점 체인' 비유에 따른 올바른 배치는 무엇인가?",
- "option1": "개인별 학습 기록을 각 엣지 서버에 미리 복사해 두고, 이미지는 서울 서버가 매번 새로 보낸다",
- "option2": "모든 데이터를 브라질 엣지 서버로 옮기고 서울의 원본 서버는 더 이상 쓰지 않는다",
- "option3": "이미지·JS/CSS처럼 모두에게 똑같은 파일은 엣지에 두고, 사람마다 다른 학습 기록은 서울 원본 서버가 만든다",
- "option4": "HTTPS 암호 해제만 엣지 서버에 맡기고, 이미지를 포함한 모든 요청은 전부 서울 서버로 보낸다",
- "answerIndex": 2,
- "explanation": "7섹션에서 CDN에는 이미지·동영상·JS/CSS처럼 자주 바뀌지 않는 것을 두고, 개인 학습 기록처럼 매번 달라지는 데이터는 원본 서버가 만들어야 한다고 했다. 본사 공장(원본 서버)은 그대로 두고 동네 편의점(엣지)에 똑같은 물건을 미리 깔아 두는 비유와 같다."
- },
- {
- "courseSlug": "coding",
- "question": "이 코스에서는 '코딩'을 무엇이라고 정의하나요?",
- "option1": "컴퓨터가 스스로 배우도록 데이터를 주는 일",
- "option2": "컴퓨터에게 일을 시키는 글쓰기",
- "option3": "컴퓨터 부품을 조립해 성능을 높이는 작업",
- "option4": "컴퓨터 화면을 예쁘게 꾸미는 디자인 작업",
- "answerIndex": 1,
- "explanation": "섹션 ①에서 코딩은 '컴퓨터에게 일을 시키는 글쓰기'라고 정의합니다. 컴퓨터는 적힌 대로만 움직이므로 무엇을, 어떤 순서로, 어떤 조건에서 할지 빠짐없이 적어야 합니다."
- },
- {
- "courseSlug": "coding",
- "question": "로그인 페이지 코드에서 setUsername 같은 set 함수로 상태(state) 값을 바꾸면 React는 어떤 일을 하나요?",
- "option1": "바뀐 값을 서버에 자동으로 저장한다",
- "option2": "브라우저 전체를 새로고침해서 초기화한다",
- "option3": "값이 바뀐 것을 알아채고 화면을 다시 그린다",
- "option4": "에러가 없는지 검사해 콘솔에 결과를 출력한다",
- "answerIndex": 2,
- "explanation": "섹션 ②의 useState 설명대로, set 함수로 값을 바꾸면 React가 '값이 바뀌었네? 화면도 다시 그리자'라고 알아챕니다. 입력창에 한 글자 칠 때마다 이 일이 일어납니다."
- },
- {
- "courseSlug": "coding",
- "question": "대시보드 체크리스트 코드에 나오는 done ? ' done' : '' 한 줄의 의미로 알맞은 것은?",
- "option1": "체크된 항목이면 done이라는 CSS 클래스를 붙이고, 아니면 붙이지 않는다",
- "option2": "체크된 항목이면 그 항목을 목록에서 바로 삭제한다",
- "option3": "체크 여부와 상관없이 모든 항목에 done 클래스를 붙인다",
- "option4": "체크된 항목이면 서버에 완료 알림 요청을 보낸다",
- "answerIndex": 0,
- "explanation": "섹션 ③에서 이 조건식은 '체크됐으면 done 클래스를 붙이고, 아니면 붙이지 마라'는 if문과 같다고 설명합니다. 체크할 때 글자에 취소선이 생기는 이유가 바로 이 한 줄입니다."
- },
- {
- "courseSlug": "coding",
- "question": "이 앱에서 '비밀번호가 맞는지' 같은 믿을 수 있는 판단을 프론트엔드가 아니라 백엔드(서버)가 맡는 이유는 무엇인가요?",
- "option1": "브라우저에서는 자바스크립트로 비교 연산을 할 수 없기 때문",
- "option2": "서버가 브라우저보다 계산 속도가 훨씬 빠르기 때문",
- "option3": "프론트엔드는 화면을 그리는 기능이 아예 없기 때문",
- "option4": "브라우저에서 도는 코드는 사용자가 열어보고 고칠 수 있기 때문",
- "answerIndex": 3,
- "explanation": "섹션 ④에서 브라우저 코드는 사용자가 얼마든지 열어보고 고칠 수 있어, 검사 코드를 지워버리면 통과할 수 있다고 설명합니다. 그래서 로그인·권한·저장 같은 판단은 전부 서버가 합니다."
- },
- {
- "courseSlug": "coding",
- "question": "수습생 A가 회원가입 화면에서 이미 다른 사람이 쓰고 있는 아이디를 입력하자 '이미 사용 중인 아이디예요'라는 문구가 떴습니다. 이 동작을 만들어 낸 규칙은 코스의 어느 부분일까요?",
- "option1": "passwordHash 필드가 비밀번호를 해시로만 저장하는 보안 수칙",
- "option2": "User 엔티티의 username 컬럼에 붙은 unique = true 규칙",
- "option3": ".map()이 배열의 각 항목마다 화면을 하나씩 만들어 내는 반복 규칙",
- "option4": "try/catch 구조로 실패 상황을 미리 준비해 두는 함수 작성법",
- "answerIndex": 1,
- "explanation": "섹션 ⑤의 '직접 확인해 보기'에서 다룬 상황입니다. users 테이블의 username에 unique = true가 붙어 있어 같은 아이디로 두 명이 가입할 수 없다는 규칙이 데이터베이스 차원에서 강제됩니다."
- },
- {
- "courseSlug": "color",
- "question": "색의 3속성 중 채도(Saturation)가 답하는 질문으로 가장 알맞은 것은?",
- "option1": "\"무슨 색이야?\"",
- "option2": "\"얼마나 밝아?\"",
- "option3": "\"얼마나 쨍해?\"",
- "option4": "\"얼마나 투명해?\"",
- "answerIndex": 2,
- "explanation": "섹션 1의 HSL 좌표에서 채도(S)는 0%(회색)부터 100%(쨍함)까지 색이 얼마나 쨍한지를 나타냅니다. \"무슨 색이야?\"는 색상(H), \"얼마나 밝아?\"는 명도(L)의 질문이에요."
- },
- {
- "courseSlug": "color",
- "question": "60-30-10 법칙에서 포인트색인 브랜드 블루 #2159C5를 쓰기에 알맞은 곳은?",
- "option1": "배경과 카드 같은 넓은 바탕",
- "option2": "버튼·링크 같은 강조 요소",
- "option3": "본문 텍스트와 경계선 전체",
- "option4": "아이콘을 포함한 화면의 절반",
- "answerIndex": 1,
- "explanation": "섹션 3에서 포인트색은 화면의 10%만 차지하는 '주인공'으로, 버튼·링크·강조에 씁니다. 파랑이 귀하니까(희소성) 눈에 띄는 것이고, 60%를 차지하면 아무것도 강조되지 않아요."
- },
- {
- "courseSlug": "color",
- "question": "색상환에서 보색(Complementary)에 대한 설명으로 옳은 것은?",
- "option1": "정반대(180° 차이)의 색으로, 강조가 필요한 한 곳에만 쓴다",
- "option2": "이웃(±30° 안팎)의 색으로, 배경 같은 넓은 면적에 어울린다",
- "option3": "같은 색상에서 명도만 바꾼 색으로, 다크모드 전환에 쓴다",
- "option4": "채도가 같은 색끼리의 묶음으로, 그래프 계열색에 쓴다",
- "answerIndex": 0,
- "explanation": "섹션 2에서 보색은 색상환에서 정반대(180° 차이)에 있는 색으로 대비가 강렬해 강조·경고에 딱이라고 배웁니다. 이웃한 색은 유사색으로, 넓은 면적에 어울려요. 암기법은 \"싸울 땐 맞은편, 친할 땐 옆자리\"."
- },
- {
- "courseSlug": "color",
- "question": "WCAG 기준으로 본문 텍스트가 통과해야 하는 최소 대비비(AA 등급)는?",
- "option1": "3 : 1 이상",
- "option2": "1.8 : 1 이상",
- "option3": "21 : 1 이상",
- "option4": "4.5 : 1 이상",
- "answerIndex": 3,
- "explanation": "섹션 6에서 WCAG AA 등급의 본문 텍스트 최소 기준은 4.5:1입니다. 3:1은 큰 텍스트(18pt+)의 기준이고, 흰 배경 위 #2159C5는 약 6.3:1로 본문 합격이에요."
- },
- {
- "courseSlug": "color",
- "question": "다크모드 화면에서 브랜드 블루 #2159C5 버튼이 어두운 배경에 묻혀 잘 안 보인다. 코스의 원칙대로 고치는 방법은?",
- "option1": "채도를 100%로 올려 형광처럼 쨍하게 만든다",
- "option2": "눈에 잘 띄는 주황 같은 다른 색상으로 교체한다",
- "option3": "색상(H)은 그대로 두고 명도(L)만 올린 밝은 파랑을 쓴다",
- "option4": "버튼 글자를 순수 흰색 #FFFFFF로 바꿔 번쩍이게 한다",
- "answerIndex": 2,
- "explanation": "섹션 7에서 다크모드용 파랑은 색상(H)을 유지한 채 명도(L)만 올린 색입니다. 색상까지 바꾸면 '다른 브랜드'가 되니 정체성은 지키고 조명 대응만 하는 것 — \"같은 사람인데 무대 조명에 맞춰 옷만 갈아입는\" 비유 그대로예요."
- },
- {
- "courseSlug": "cpu-deep",
- "question": "CPU가 명령어 하나를 처리할 때 반복하는 명령어 사이클의 올바른 순서는 무엇인가요?",
- "option1": "해석(Decode) → 가져오기(Fetch) → 실행(Execute)",
- "option2": "실행(Execute) → 해석(Decode) → 가져오기(Fetch)",
- "option3": "가져오기(Fetch) → 해석(Decode) → 실행(Execute)",
- "option4": "가져오기(Fetch) → 실행(Execute) → 해석(Decode)",
- "answerIndex": 2,
- "explanation": "섹션 1의 명령어 사이클입니다. CPU는 메모리에서 명령어를 가져오고(Fetch), 무슨 뜻인지 해석한 뒤(Decode), 실행하는(Execute) 세 박자를 1초에 수십억 번 반복해요."
- },
- {
- "courseSlug": "cpu-deep",
- "question": "코스의 주방 비유에서 '코어(Core)'와 '클럭(Clock)'은 각각 무엇에 해당하나요?",
- "option1": "코어는 요리사 수, 클럭은 손 놀리는 속도",
- "option2": "코어는 도마 옆 재료 선반, 클럭은 요리사 수",
- "option3": "코어는 손 놀리는 속도, 클럭은 요리사의 손 놀림",
- "option4": "코어는 주문 창구 수, 클럭은 냉장고까지의 거리",
- "answerIndex": 0,
- "explanation": "섹션 2의 주방 비유예요. 코어는 주방의 요리사 수(8코어 = 요리사 8명), 클럭은 손 놀리는 속도(4.5GHz = 1초에 45억 박자)에 해당합니다. 재료 선반은 캐시, 냉장고는 RAM이었죠."
- },
- {
- "courseSlug": "cpu-deep",
- "question": "캐시 3층 구조(L1~L3)에 대한 설명으로 옳은 것은 무엇인가요?",
- "option1": "L3가 코어에서 가장 가깝고, 셋 중 가장 빠르다",
- "option2": "L1은 코어들이 공유하는 큰 선반이라 용량이 가장 크다",
- "option3": "CPU는 데이터를 RAM에서 먼저 찾고 없으면 L1으로 내려간다",
- "option4": "코어에서 가까울수록 작고 빠르며, 멀수록 크고 느리다",
- "answerIndex": 3,
- "explanation": "섹션 3의 층수 규칙입니다. L1은 손 안의 재료처럼 가장 작고 빠르고, L3는 코어들이 공유하는 큰 선반이에요. CPU는 L1 → L2 → L3 → RAM 순서로 찾아봅니다."
- },
- {
- "courseSlug": "cpu-deep",
- "question": "CPU 온도가 90℃를 넘었을 때 일어나는 '스로틀링'에 대한 설명으로 옳은 것은 무엇인가요?",
- "option1": "CPU가 고장 나기 직전이라는 신호이므로 즉시 교체해야 한다",
- "option2": "CPU가 타 버리는 걸 막으려고 스스로 클럭을 낮추는 자기 보호 동작이다",
- "option3": "쿨링 팬이 멈추면서 CPU가 강제로 전원을 차단하는 현상이다",
- "option4": "온도를 낮추기 위해 CPU가 클럭을 오히려 더 높여서 일을 빨리 끝내는 기능이다",
- "answerIndex": 1,
- "explanation": "섹션 4의 스로틀링입니다. 마라톤 선수가 무리가 오면 스스로 페이스를 낮추듯, CPU가 클럭을 낮춰(예: 4.5 → 3.0GHz) 타 버리는 걸 막는 정상적인 자기 보호 동작이에요. 고장이 아닙니다."
- },
- {
- "courseSlug": "cpu-deep",
- "question": "친구가 \"내 컴퓨터는 i7인데 최신 i5를 쓰는 네 컴퓨터보다 왜 느리지?\"라고 물었습니다. 코스에서 배운 내용으로 가장 알맞은 대답은 무엇인가요?",
- "option1": "i7이 i5보다 항상 빠르니까 다른 부품이 고장 난 게 분명하다",
- "option2": "클럭(GHz) 숫자만 비교하면 되고, 등급 숫자는 성능과 관계없다",
- "option3": "등급만큼 세대가 중요해서, 최신 세대 i5가 구형 i7을 이기는 건 흔한 일이다",
- "option4": "인텔과 라이젠은 이름 문법이 달라서 두 CPU는 애초에 비교할 수 없다",
- "answerIndex": 2,
- "explanation": "섹션 5의 중고차 비유를 적용한 문제예요. 체급(그랜저냐 아반떼냐)만큼 연식(세대)이 중요해서, 최신 연식 중형차가 10년 된 대형차보다 잘 달리듯 최신 세대 i5가 구형 i7을 이기는 일은 아주 흔합니다."
- },
- {
- "courseSlug": "data-modeling",
- "question": "이 코스가 '미리 보는 핵심 문장'으로 제시한, 코스 전체를 한 줄로 줄인 문장은 무엇인가요?",
- "option1": "테이블은 무조건 잘게 쪼갤수록 좋은 설계다",
- "option2": "모든 데이터는 하나의 테이블에 모아서 관리한다",
- "option3": "같은 사실은 딱 한 곳에만 적고, 필요한 곳에서는 번호(FK)로 가리킨다",
- "option4": "관계는 종류와 상관없이 항상 중간 테이블로 표현한다",
- "answerIndex": 2,
- "explanation": "섹션 1의 팁에서 코스 전체를 한 줄로 줄인 문장으로 \"같은 사실은 딱 한 곳에만 적고, 필요한 곳에서는 번호(FK)로 가리킨다\"를 제시합니다. 무조건 쪼개는 것은 오히려 섹션 5에서 경계한 내용이에요."
- },
- {
- "courseSlug": "data-modeling",
- "question": "코스에서 기본키(PK)를 설명할 때 사용한 비유로 알맞은 것은 무엇인가요?",
- "option1": "이름 — 누구나 알아보기 쉬운 값",
- "option2": "학번 — 학교 안에서 절대 겹치지 않는 번호",
- "option3": "지도 — 테이블 전체의 구조를 보여 주는 것",
- "option4": "다리 — 두 테이블을 이어 주는 연결값",
- "answerIndex": 1,
- "explanation": "섹션 3에서 기본키는 '학번'에 비유됩니다. 이름은 동명이인이 있을 수 있지만 학번은 절대 겹치지 않아 모든 줄을 유일하게 찍어낼 수 있기 때문이에요. 지도는 ERD, 다리는 중간 테이블의 비유입니다."
- },
- {
- "courseSlug": "data-modeling",
- "question": "1:N 관계(예: 멘토 1명이 수습 여러 명을 담당)를 테이블로 표현할 때, 코스가 알려 준 규칙으로 옳은 것은 무엇인가요?",
- "option1": "항상 N쪽(여럿 쪽) 테이블에 FK 한 칸을 둔다",
- "option2": "항상 1쪽 테이블에 담당 대상 칸을 개수만큼 늘려 간다",
- "option3": "두 테이블 사이에 반드시 중간 테이블을 새로 만든다",
- "option4": "양쪽 테이블 모두에 서로를 가리키는 FK를 하나씩 둔다",
- "answerIndex": 0,
- "explanation": "섹션 4의 규칙은 \"1:N에서는 항상 N쪽(여럿 쪽)에 FK를 둔다\"입니다. 1쪽에 '담당수습1, 담당수습2...' 칸을 늘리는 것은 섹션 6의 나쁜 설계 냄새 2에 해당하고, 중간 테이블은 N:M 관계에서 필요해요."
- },
- {
- "courseSlug": "data-modeling",
- "question": "코스에서 이메일을 기본키(PK)로 쓰지 말라고 한 핵심 이유는 무엇인가요?",
- "option1": "이메일은 문자열이라 숫자보다 검색 속도가 크게 느리기 때문",
- "option2": "이메일은 동명이인처럼 여러 사람이 겹칠 수 있는 값이기 때문",
- "option3": "이메일은 민감한 개인정보라 테이블에 저장하면 안 되기 때문",
- "option4": "이메일은 바뀔 수 있는 값이라, 바뀌면 그걸 가리키던 FK가 모두 흔들리기 때문",
- "answerIndex": 3,
- "explanation": "섹션 3의 경고 박스에서 이메일은 유일하긴 하지만 '바뀔 수 있는 값'이라 PK가 바뀌면 그걸 가리키던 모든 FK가 함께 흔들린다고 설명합니다. 그래서 PK는 의미 없는 번호(id)로 두는 것이 정석이에요."
- },
- {
- "courseSlug": "data-modeling",
- "question": "실습에서 '쪽지 기능'을 설계하던 수습이 한 쪽지를 여러 명에게 보내는 단체 쪽지까지 지원하기로 했습니다. 코스에서 배운 대로라면 가장 알맞은 설계는 무엇인가요?",
- "option1": "쪽지 테이블에 받는사람1, 받는사람2, 받는사람3 칸을 추가한다",
- "option2": "받는 사람들의 이메일을 쉼표로 이어 붙여 한 칸에 저장한다",
- "option3": "쪽지와 users 사이에 수신자 중간 테이블을 만들어 N:M로 잇는다",
- "option4": "받는 사람 수만큼 쪽지 제목과 내용을 통째로 복사해 저장한다",
- "answerIndex": 2,
- "explanation": "섹션 7의 '흔한 함정 미리보기'에서 단체 쪽지(한 쪽지 → 여러 수신자)는 N:M 관계이므로 섹션 4의 중간 테이블이 답이라고 알려 줍니다. 번호 붙은 칸의 행진과 한 칸에 여러 값은 섹션 6의 나쁜 설계 냄새예요."
- },
- {
- "courseSlug": "data-structures",
- "question": "코스에서 브라우저의 '뒤로가기' 버튼과 똑같은 방식으로 동작한다고 소개한 자료구조는 무엇인가요?",
- "option1": "큐 — 먼저 방문한 페이지부터 꺼낸다",
- "option2": "배열 — 방문한 순서대로 번호를 붙인다",
- "option3": "스택 — 나중에 쌓은 페이지부터 꺼낸다",
- "option4": "트리 — 페이지를 부모-자식으로 잇는다",
- "answerIndex": 2,
- "explanation": "스택은 접시 탑처럼 맨 위에 쌓고 맨 위부터 꺼내는 LIFO(Last In, First Out) 구조입니다. 코스 섹션 3에서 브라우저 뒤로가기, Ctrl+Z, 콜 스택을 모두 스택의 예로 들었습니다."
- },
- {
- "courseSlug": "data-structures",
- "question": "해시맵(Map)이 배열과 달리 값을 '한 번에' 찾을 수 있는 이유로 코스가 설명한 것은 무엇인가요?",
- "option1": "데이터를 항상 이름 순서로 정렬해 두기 때문에",
- "option2": "해시 함수가 열쇠(key)로 보관 위치를 바로 계산해 주기 때문에",
- "option3": "자주 찾는 값을 맨 앞 칸으로 미리 옮겨 두기 때문에",
- "option4": "같은 데이터를 여러 칸에 복사해서 나눠 담아 두기 때문에",
- "answerIndex": 1,
- "explanation": "섹션 4의 사물함 비유처럼, 해시 함수는 열쇠를 넣으면 보관 위치가 계산되어 나오는 기계입니다. 저장할 때와 찾을 때 같은 계산을 하므로 뒤지지 않고 바로 그 칸으로 직행합니다."
- },
- {
- "courseSlug": "data-structures",
- "question": "자바스크립트 배열로 스택과 큐를 흉내낼 때, 코스에서 설명한 메서드 조합을 바르게 짝지은 것은 무엇인가요?",
- "option1": "스택은 push와 shift, 큐는 push와 pop을 쓴다",
- "option2": "스택은 pop과 shift, 큐는 push와 at을 쓴다",
- "option3": "스택은 shift와 pop, 큐는 pop과 push를 쓴다",
- "option4": "스택은 push와 pop, 큐는 push와 shift를 쓴다",
- "answerIndex": 3,
- "explanation": "두 그릇 모두 넣을 때는 push로 같고, 꺼내는 쪽만 다릅니다. 스택은 뒤에서 꺼내는 pop(LIFO), 큐는 앞에서 꺼내는 shift(FIFO)를 쓴다고 섹션 3에서 정리했습니다."
- },
- {
- "courseSlug": "data-structures",
- "question": "코스의 시간복잡도 설명에 따르면, O(n²)인 코드에서 데이터가 10배로 늘어나면 해야 하는 일의 양은 대략 몇 배가 되나요?",
- "option1": "약 100배로 늘어난다",
- "option2": "약 10배로 늘어난다",
- "option3": "약 2배로 늘어난다",
- "option4": "거의 그대로 유지된다",
- "answerIndex": 0,
- "explanation": "섹션 6의 '반 전체 악수' 비유처럼 O(n²)는 데이터가 10배면 일은 100배가 됩니다(30명 약 450번, 300명 약 45,000번). 그래서 반복문 안의 반복문이 데이터가 커질 때 화면을 버벅이게 만듭니다."
- },
- {
- "courseSlug": "data-structures",
- "question": "학교 매점 프로그램을 만든다고 해 봅시다. 주문이 들어온 순서 그대로, 먼저 주문한 학생부터 빵을 받아야 합니다. 코스의 비유에 따르면 이 주문 목록에 가장 어울리는 그릇은 무엇인가요?",
- "option1": "스택 — 접시 탑처럼 최근 주문부터 처리한다",
- "option2": "해시맵 — 사물함처럼 학생 이름으로 바로 찾는다",
- "option3": "큐 — 급식 줄처럼 먼저 선 사람이 먼저 받는다",
- "option4": "트리 — 폴더처럼 주문을 종류별 가지로 나눈다",
- "answerIndex": 2,
- "explanation": "먼저 온 주문이 먼저 처리되어야 하므로 FIFO(First In, First Out)인 큐가 맞습니다. 코스 섹션 3에서 큐를 '새치기 없는 급식 줄'에 비유하며 프린터 대기열, 서버의 요청 처리 줄을 예로 들었습니다."
- },
- {
- "courseSlug": "debugging",
- "question": "코스에서는 에러 메시지를 '사건 보고서'에 비유하며 세 가지 질문에 답해 준다고 했다. 다음 중 그 세 가지에 해당하지 않는 것은?",
- "option1": "무슨 일이야? — 에러의 종류 (NullPointerException, TypeError 등)",
- "option2": "왜 그랬는데? — 에러 옆의 설명 문장 (\"... is null\" 등)",
- "option3": "어디서? — 파일 이름과 줄 번호 (UserService.java:42 등)",
- "option4": "어떻게 고쳐? — 에러를 해결할 수정 코드 제안",
- "answerIndex": 3,
- "explanation": "섹션 1 '에러 = 단서'에서 에러 메시지는 종류(무슨 일)·설명 문장(왜)·파일과 줄 번호(어디서) 세 가지에 답해 준다고 했다. 고치는 방법까지 알려 주지는 않으며, 이 셋만 읽어도 문제의 절반은 푼 것이라고 설명한다."
- },
- {
- "courseSlug": "debugging",
- "question": "Spring Boot 콘솔에 수십 줄짜리 스택트레이스가 여러 덩어리로 이어져 나올 때, 코스가 알려 준 '진짜 원인'을 찾는 치트키는?",
- "option1": "맨 위의 NestedServletException을 자세히 분석한다",
- "option2": "Ctrl+F로 검색해 가장 아래쪽 \"Caused by\"를 찾는다",
- "option3": "org.springframework로 시작하는 줄부터 차례로 읽는다",
- "option4": "\"... 47 more\"로 접힌 부분을 모두 펼쳐서 읽는다",
- "answerIndex": 1,
- "explanation": "섹션 2에서 에러는 양파처럼 겹겹이 포장돼 올라오며, 맨 위 예외는 겉포장(증상)이고 진범은 거의 항상 가장 아래쪽 Caused by에 있다고 했다. 그래서 긴 로그에서는 Ctrl+F로 Caused by부터 검색하라고 안내한다."
- },
- {
- "courseSlug": "debugging",
- "question": "의심 가는 함수 안에 라벨을 붙여 console.log를 찍었는데, 콘솔에 그 로그가 아예 나타나지 않았다. 코스에 따르면 이 상황의 올바른 해석은?",
- "option1": "그 함수 자체가 호출되지 않았다는 뜻으로, 용의자 절반을 지워 준 중요한 단서다",
- "option2": "로그 출력이 실패한 것이므로 console.log를 다른 문법으로 다시 찍어야 한다",
- "option3": "변수 값이 undefined라서 로그가 출력되지 못한 것이다",
- "option4": "브라우저 캐시 문제이므로 시크릿 창에서 다시 확인해야 한다",
- "answerIndex": 0,
- "explanation": "섹션 4의 주의 박스에서 로그가 아예 안 찍히는 것도 중요한 단서라고 했다. '값이 이상하다'가 아니라 '이 함수 자체가 호출되지 않는다'는 뜻이며, 실패가 아니라 용의자 절반을 지워 준 수확이라고 설명한다."
- },
- {
- "courseSlug": "debugging",
- "question": "브라우저 F12 콘솔에 \"500 Internal Server Error\"가 떠 있다. 코스에서 배운 '프론트 문제인지 서버 문제인지 가르는 감각'에 따르면 다음으로 열어 봐야 할 곳은?",
- "option1": "React 컴포넌트의 JSX에서 오타가 없는지 코드를 다시 읽는다",
- "option2": "브라우저 콘솔에서 TypeError가 함께 떴는지 계속 지켜본다",
- "option3": "백엔드(Spring Boot) 콘솔을 열어 스택트레이스를 확인한다",
- "option4": "새로고침한 뒤 다른 브라우저에서도 같은 화면을 띄워 본다",
- "answerIndex": 2,
- "explanation": "섹션 3에서 TypeError·ReferenceError는 내 JS 코드 문제지만 404·500 같은 숫자는 서버와의 통신 문제라고 했다. 500은 서버 쪽에서 터진 것이므로 브라우저가 아니라 Spring Boot 콘솔의 스택트레이스를 봐야 한다."
- },
- {
- "courseSlug": "debugging",
- "question": "버튼을 누르면 화면이 하얗게 죽는다. 처리 흐름은 A(이벤트 핸들러) → B(fetch 호출) → C(응답 가공) → D(화면 그리기)이고, B와 C 사이에 찍어 둔 로그가 콘솔에 정상적으로 나타났다. 코스의 이분 탐색 요령대로라면 다음 한 수는?",
- "option1": "A의 첫 줄에 로그를 찍어 이벤트가 들어오는지부터 다시 확인한다",
- "option2": "범인을 C·D로 좁혔으니 그 남은 절반의 가운데에 로그를 찍는다",
- "option3": "A부터 D까지 모든 줄에 로그를 찍어 전체 흐름을 한 번에 본다",
- "option4": "fetch 호출(B)의 코드를 처음부터 한 줄씩 자세히 읽어 본다",
- "answerIndex": 1,
- "explanation": "섹션 6의 이분 탐색에서 가운데 검문소(로그)를 통과했으면 앞 구간(A·B)은 무죄이고 범인은 C·D 중에 있다고 했다. 이후에도 남은 절반의 가운데에 또 로그를 찍어 용의자를 반씩 줄여 가는 것이 요령이다."
- },
- {
- "courseSlug": "design-refs",
- "question": "코스에서는 3대 레퍼런스 사이트를 각각 비유로 소개해요. '미술관 전시장'에 비유되며, 완성도 높은 '한 장면'을 보기 좋지만 실제 서비스가 아닌 컨셉 작업이 많은 곳은 어디인가요?",
- "option1": "비핸스",
- "option2": "드리블",
- "option3": "핀터레스트",
- "option4": "피그마",
- "answerIndex": 1,
- "explanation": "섹션 2에서 드리블은 '미술관 전시장'으로, 색·타이포·분위기 같은 한 장면의 완성도를 보기 좋지만 보여주기용 컨셉이 많다고 설명해요. 비핸스는 발표회장, 핀터레스트는 스크랩북에 비유됩니다."
- },
- {
- "courseSlug": "design-refs",
- "question": "피그마 무드보드 만들기 4단계 중, 코스가 '이게 무드보드의 절반'이라고 할 만큼 중요하다고 강조한 단계는 무엇인가요?",
- "option1": "새 파일을 만들고 이름 짓기",
- "option2": "스크린샷을 캔버스에 붙여넣기",
- "option3": "이미지 옆에 태그 메모 붙이기",
- "option4": "비슷한 것끼리 프레임으로 묶기",
- "answerIndex": 2,
- "explanation": "섹션 4에서 가장 중요한 건 ③ 태그라고 말해요. 태그 없는 무드보드는 제목 없는 도서관 같아서 100장을 모아도 필요할 때 못 찾기 때문에, 저장하는 순간 한 단어라도 붙이는 습관이 무드보드의 절반이라고 강조합니다."
- },
- {
- "courseSlug": "design-refs",
- "question": "코스에서 '베끼기'와 '참고'를 스스로 구분해 보라며 제시한 판별 테스트 질문은 무엇인가요?",
- "option1": "원본을 안 보고도 내 디자인을 다시 그릴 수 있는가?",
- "option2": "결과물에 원본의 출처 URL을 표기했는가?",
- "option3": "레퍼런스를 세 개 이상 섞어서 참고했는가?",
- "option4": "색과 폰트를 원본과 다르게 바꿨는가?",
- "answerIndex": 0,
- "explanation": "섹션 3의 판별 테스트는 '원본을 안 보고도 다시 그릴 수 있는가'예요. YES면 원리를 이해한 참고, NO면 그림을 외운 것이라 베끼기에 가깝다고 설명하며, 출처 표기는 사용 허락이 아니라고 못 박습니다."
- },
- {
- "courseSlug": "design-refs",
- "question": "'나만의 수집 루틴' 섹션에서 디자인 실력이 자라는 공식으로 제시한 것은 무엇인가요?",
- "option1": "하루 스크롤 시간 × 저장한 이미지 수",
- "option2": "팔로우한 디자이너 수 × 활동 기간",
- "option3": "무드보드 페이지 수 × 붙인 태그 수",
- "option4": "많이 본 총량 × 분석한 횟수",
- "answerIndex": 3,
- "explanation": "섹션 6의 루틴 다이어그램은 실력이 '많이 본 총량 × 분석한 횟수'로 자란다고 말해요. 모으기만 하고 분석하지 않으면 그냥 스크랩 중독이라고 경고합니다."
- },
- {
- "courseSlug": "design-refs",
- "question": "수습생 지민이는 드리블에서 본 학습 앱 화면을 밑에 깔고 그대로 따라 그린 뒤, 이미지 아래에 원본 출처 URL을 적어 포트폴리오에 넣었어요. 코스의 기준으로 가장 옳은 판단은 무엇인가요?",
- "option1": "출처를 밝혔으므로 문제없는 '참고'에 해당한다",
- "option2": "연습 삼아 그린 것이므로 포트폴리오에 넣어도 괜찮다",
- "option3": "출처 표기는 사용 허락이 아니므로, 트레이싱을 포트폴리오에 쓰면 안 된다",
- "option4": "색과 문구만 바꾸면 저작권 문제가 사라지므로 수정 후 올리면 된다",
- "answerIndex": 2,
- "explanation": "섹션 3에서 트레이싱은 연습장 안에서만 허용되고 제출물·포트폴리오·실제 서비스에 쓰는 순간 문제가 된다고 해요. 또 '출처 표기 ≠ 사용 허락'이므로 URL을 적었다고 베끼기가 참고가 되지는 않습니다."
- },
- {
- "courseSlug": "design-system",
- "question": "코스에서는 디자인 시스템을 색·글꼴·간격·부품·사용 규칙을 모아 둔 것이라고 소개합니다. 이를 한마디로 무엇에 비유했나요?",
- "option1": "제품의 설계 도면",
- "option2": "제품의 부품 창고",
- "option3": "제품의 문법책",
- "option4": "제품의 사용 설명 영상",
- "answerIndex": 2,
- "explanation": "섹션 1에서 디자인 시스템을 '제품의 문법책'에 비유합니다. 문법이 있어야 여러 사람이 써도 한 사람이 쓴 글처럼 읽히듯, 약속이 있어야 열 명이 만들어도 한 사람이 만든 화면처럼 보이기 때문이에요."
- },
- {
- "courseSlug": "design-system",
- "question": "코스에서 말하는 '디자인 토큰(token)'의 뜻으로 가장 알맞은 것은 무엇인가요?",
- "option1": "색·간격·글꼴 같은 디자인 결정에 이름을 붙인 변수",
- "option2": "피그마 파일에 접근할 때 쓰는 인증 키",
- "option3": "컴포넌트의 버전을 관리하는 고유 번호",
- "option4": "버튼의 상태를 저장해 두는 자바스크립트 객체",
- "answerIndex": 0,
- "explanation": "섹션 2에서 토큰은 '디자인 결정에 이름을 붙인 변수'라고 정의합니다. #3B82F6 같은 값 대신 --color-primary라는 이름으로 부르기로 약속하는 것으로, global.css의 :root에 실물이 살고 있어요."
- },
- {
- "courseSlug": "design-system",
- "question": "피그마 컴포넌트와 React 컴포넌트의 짝이 어긋나기 시작하는 것을 막기 위해 코스가 제시한 규칙은 무엇인가요?",
- "option1": "부품 변경은 디자이너가 먼저 끝낸 뒤 개발자에게 문서로 전달한다",
- "option2": "React props 이름은 피그마 variant와 다르게 지어 역할을 구분한다",
- "option3": "variant 추가는 분기별로 모아 두었다가 한꺼번에 코드에 반영한다",
- "option4": "부품을 바꿀 땐 피그마와 코드를 같은 PR·같은 티켓에서 함께 바꾼다",
- "answerIndex": 3,
- "explanation": "섹션 4의 경고 박스에서, 피그마에만 variant가 추가되고 코드에는 없으면 두 세계가 갈라지기 시작하므로 '피그마와 코드를 같은 PR·같은 티켓에서 함께 바꾸는 것'이 규칙이라고 설명합니다."
- },
- {
- "courseSlug": "design-system",
- "question": "코스에서 소개한 '좋은 컴포넌트 문서에 꼭 들어가는 4가지'에 해당하지 않는 것은 무엇인가요?",
- "option1": "언제 쓰는 부품인지 알려 주는 When",
- "option2": "누가 언제 만들었는지 적는 제작자·날짜",
- "option3": "하지 말아야 할 사용법을 적는 Don't",
- "option4": "복사해서 바로 쓰는 예제 코드인 How",
- "answerIndex": 1,
- "explanation": "섹션 5에서 좋은 문서의 4요소는 When(언제 쓰나), How(예제 코드), Don't(하지 말 것), 그리고 상태·변형 전체 목록입니다. 제작자와 날짜는 이 목록에 없어요."
- },
- {
- "courseSlug": "design-system",
- "question": "수습 A가 과제 제출 버튼을 눌렀는데, 서버가 처리하는 동안에도 버튼이 그대로 눌려서 과제가 두 번 제출되는 사고가 났습니다. 버튼의 다섯 상태 중 어떤 설계가 빠진 걸까요?",
- "option1": "hover — 마우스를 올리면 살짝 어두워지는 상태",
- "option2": "loading — 스피너를 보여 주고 다시 못 누르게 잠그는 상태",
- "option3": "active — 누르는 순간 꺼진 느낌을 주는 상태",
- "option4": "default — 평소의 또렷한 기본 모습",
- "answerIndex": 1,
- "explanation": "섹션 3의 상태표에서 loading은 '처리 중(제출 직후 등)에 스피너를 띄우고 다시 못 누르게 잠그는 상태'입니다. 이 상태가 빠지면 제출 직후 버튼이 두 번 눌려 과제가 중복 제출되는 사고로 이어져요."
- },
- {
- "courseSlug": "dns-deep",
- "question": "재귀 조회의 여행에서 도메인의 진짜 IP를 최종적으로 답해 주는 서버는 무엇인가요?",
- "option1": "루트 서버 — 여행의 출발점으로 전 세계 도메인을 다 외우고 있다",
- "option2": "TLD 서버 — .com 같은 최상위 도메인을 관리하는 안내소이므로",
- "option3": "리졸버 — 내 PC 대신 뛰어다니는 심부름꾼이 답을 만들어 낸다",
- "option4": "권한(Authoritative) 서버 — 그 도메인의 진짜 명부를 가진 최종 담당자",
- "answerIndex": 3,
- "explanation": "섹션 1의 여행에서 루트와 TLD 서버는 \"담당자는 저쪽\"이라고 안내만 하고, 실제 IP는 도메인의 명부를 가진 권한 서버가 답합니다. 우리 도메인은 Route53이 그 역할이에요."
- },
- {
- "courseSlug": "dns-deep",
- "question": "DNS 레코드 타입 중 CNAME에 대한 설명으로 옳은 것은 무엇인가요?",
- "option1": "이름을 IPv4 주소로 바꿔 주는, 여행이 끝나는 종착역 레코드다",
- "option2": "이 도메인의 메일이 어디로 가야 하는지 알려 주는 레코드다",
- "option3": "이름을 다른 이름으로 연결하는 별명 레코드로, 사슬 끝에는 A 레코드가 필요하다",
- "option4": "도메인 소유 확인이나 스팸 방지 정책 같은 증명 문자열을 담는 레코드다",
- "answerIndex": 2,
- "explanation": "섹션 2에서 CNAME은 \"이름 → 다른 이름\"인 별명이라 한 정거장 더 가야 하고, 사슬의 맨 끝에는 반드시 A 레코드가 있어야 실제 IP에 도착한다고 배웠어요."
- },
- {
- "courseSlug": "dns-deep",
- "question": "TTL을 길게(예: 86400 = 하루) 설정하면 어떤 일이 생기나요?",
- "option1": "DNS 질문이 줄어 빠르고 서버 부담이 적지만, IP를 바꿔도 최대 하루 동안 옛 주소로 가는 사람이 남는다",
- "option2": "변경이 금방 퍼지는 대신 질문이 잦아져서 Route53 과금이 늘어난다",
- "option3": "리졸버가 캐시를 아예 쓰지 않게 되어 매번 풀코스 여행을 다녀와야 한다",
- "option4": "권한 서버가 하루에 한 번만 레코드를 갱신할 수 있도록 제한된다",
- "answerIndex": 0,
- "explanation": "섹션 3에서 TTL은 \"이 답을 몇 초 동안 믿고 재사용해도 되는지\"를 뜻하며, 길면 질문이 줄어 빠르지만 변경 사항이 캐시 만료 전까지 퍼지지 않는다고 배웠어요."
- },
- {
- "courseSlug": "dns-deep",
- "question": "hosts 파일에 적은 이름은 왜 DNS 서버 설정과 상관없이 항상 이길까요?",
- "option1": "hosts 파일의 내용이 리졸버의 캐시를 강제로 덮어써서 바꾸기 때문이다",
- "option2": "OS가 리졸버(DNS)에 물어보기 전에 hosts 파일을 먼저 확인하고, 답을 찾으면 뒤에는 묻지 않기 때문이다",
- "option3": "hosts 파일에 적은 내용이 루트 서버의 명부에 자동으로 등록되기 때문이다",
- "option4": "관리자 권한으로 저장한 파일은 네트워크 설정보다 항상 우선 적용되기 때문이다",
- "answerIndex": 1,
- "explanation": "섹션 4에서 이름 → IP 변환은 브라우저 캐시 → OS 캐시 → hosts 파일 → 리졸버 순서로 진행되고, 먼저 답을 찾으면 뒤에는 안 물어본다고 배웠어요."
- },
- {
- "courseSlug": "dns-deep",
- "question": "서버 IP를 바꾼 직후 사무실 PC에서는 새 사이트가 열리는데, 친구 폰에서는 아직 옛 주소로 접속됩니다. 코스 내용에 따른 가장 알맞은 진단은 무엇인가요?",
- "option1": "서버 고장이므로 Route53의 레코드를 삭제하고 처음부터 다시 만들어야 한다",
- "option2": "친구 폰의 hosts 파일이 조작된 것이므로 즉시 파일을 초기화해야 한다",
- "option3": "친구 쪽 통신사 리졸버가 옛 답을 TTL 동안 캐시 중인 것으로, 캐시가 만료되면 자연히 해결된다",
- "option4": "두 기기가 서로 다른 권한 서버를 쓰고 있으므로 통신사를 바꿔야 한다",
- "answerIndex": 2,
- "explanation": "섹션 3의 우리 회사 실화처럼 \"DNS 전파가 느리다\"의 정체는 세계 곳곳의 리졸버 캐시가 각자 만료되기를 기다리는 것이라, 고장이 아니며 기다리면 풀립니다."
- },
- {
- "courseSlug": "docker-intro",
- "question": "이 코스는 이미지와 컨테이너를 붕어빵에 비유해 설명합니다. 두 개념의 관계로 옳은 것은 무엇인가요?",
- "option1": "이미지는 실행 중인 프로그램이고, 컨테이너는 그 프로그램의 설계도다",
- "option2": "이미지와 컨테이너는 같은 것을 가리키는 두 가지 다른 이름이다",
- "option3": "이미지는 붕어빵틀처럼 읽기 전용 설계도이고, 컨테이너는 그 틀로 찍어낸 실행 실체다",
- "option4": "이미지는 컨테이너가 종료된 뒤에 남는 실행 기록(로그)을 모아 둔 것이다",
- "answerIndex": 2,
- "explanation": "섹션 2의 붕어빵 비유 그대로, 이미지는 실행에 필요한 모든 것을 구워 놓은 읽기 전용 틀이고 컨테이너는 그 이미지를 실행한 실체입니다. 틀 하나(postgres:17)로 여러 개의 컨테이너를 찍어낼 수 있어요."
- },
- {
- "courseSlug": "docker-intro",
- "question": "도커 5대 기본 명령 중, 실행 중인 컨테이너 '안으로 직접 들어갈' 때 쓰는 명령은 무엇인가요?",
- "option1": "docker ps -a — 멈춘 컨테이너까지 전부 확인한다",
- "option2": "docker exec -it <이름> bash — 컨테이너 안으로 들어간다",
- "option3": "docker logs -f <이름> — 로그를 실시간으로 따라가며 본다",
- "option4": "docker stop <이름> — 컨테이너를 정중하게 멈춘다",
- "answerIndex": 1,
- "explanation": "섹션 4에서 exec은 '문 열고 들어가기'로 기억하라고 했어요. 문제가 생기면 먼저 logs로 일기장을 읽고, 더 파야 할 때 exec으로 컨테이너 안에 직접 들어갑니다."
- },
- {
- "courseSlug": "docker-intro",
- "question": "실습에서 docker compose down으로 DB 컨테이너를 지웠다가 다시 띄웠는데, 어제 만든 hello 테이블과 데이터가 그대로 남아 있었습니다. 코스 내용에 따르면 그 이유는 무엇인가요?",
- "option1": "컨테이너를 삭제하면 도커가 내부 데이터를 자동으로 백업해 두기 때문",
- "option2": "postgres:17 이미지 자체에 사용자가 만든 데이터가 함께 저장되기 때문",
- "option3": "docker compose가 삭제 직전에 데이터를 Git 저장소로 옮겨 두기 때문",
- "option4": "데이터가 컨테이너 밖의 볼륨(practice-data)에 저장되어 컨테이너와 운명을 같이하지 않기 때문",
- "answerIndex": 3,
- "explanation": "섹션 6의 핵심입니다. 컨테이너는 지우면 안이 통째로 사라지는 일회용 도시락통이라, 데이터는 컨테이너 밖의 외장하드인 볼륨에 두어 컨테이너가 죽어도 살아남게 합니다."
- },
- {
- "courseSlug": "docker-intro",
- "question": "우리 docker-compose.yml에서 backend의 DB 주소가 IP가 아니라 jdbc:postgresql://db:5432/mirim처럼 그냥 'db'로 적혀 있습니다. 이게 동작하는 이유는 무엇인가요?",
- "option1": "compose로 띄운 컨테이너들은 같은 가상 네트워크에 들어가고, 서비스 이름이 그대로 도메인 이름이 되기 때문",
- "option2": "도커가 모든 컨테이너의 IP 주소를 항상 'db'라는 고정 별칭 하나로 통일해 주기 때문",
- "option3": "'db'는 호스트 PC의 localhost를 가리키도록 도커가 예약해 둔 특별한 키워드이기 때문",
- "option4": ".env 파일에 'db'라는 이름으로 실제 IP 주소가 미리 등록되어 주입되기 때문",
- "answerIndex": 0,
- "explanation": "섹션 5의 ⑪번 해설 내용입니다. compose가 만든 같은 가상 네트워크 안에서는 서비스 이름(db, backend)이 곧 도메인 이름이 되어, 네트워크 코스에서 배운 DNS가 컨테이너 세계 안에서도 작동하는 셈입니다."
- },
- {
- "courseSlug": "docker-intro",
- "question": "수습 개발자 A가 실습대로 docker compose up -d를 실행했더니 'port is already allocated' 에러가 났습니다. 알고 보니 A의 PC에는 로컬 PostgreSQL이 이미 5432번 포트를 쓰고 있었어요. 코스에서 배운 해결 방법은 무엇인가요?",
- "option1": "ports를 \"5432:15432\"로 바꿔 컨테이너 안의 포스트그레스가 다른 포트를 듣게 한다",
- "option2": "docker compose down -v로 볼륨까지 전부 지운 뒤 처음부터 다시 올린다",
- "option3": "ports를 \"15432:5432\"처럼 바깥쪽(호스트) 번호만 바꿔서 포트 충돌을 피한다",
- "option4": "depends_on 목록에 로컬 PostgreSQL을 추가해서 켜지는 순서를 맞춰 준다",
- "answerIndex": 2,
- "explanation": "포트 매핑은 '바깥:안쪽' 순서라서, 내 PC 쪽 포트가 이미 쓰이고 있으면 바깥 번호만 15432처럼 바꾸면 됩니다. 섹션 7의 회피 기술이자 섹션 8의 '흔한 막힘 포인트'로 소개된 내용이에요."
- },
- {
- "courseSlug": "figma",
- "question": "피그마 화면은 크게 세 부분으로 나뉩니다. 지금 선택한 요소의 크기·색·글꼴 같은 세부 정보를 보고 고치는 곳은 어디인가요?",
- "option1": "왼쪽 레이어 패널",
- "option2": "가운데 캔버스",
- "option3": "오른쪽 속성 패널",
- "option4": "상단 메뉴 바",
- "answerIndex": 2,
- "explanation": "섹션 2에서 배운 3분할 구조입니다. \"왼쪽에서 찾고, 가운데서 그리고, 오른쪽에서 다듬는다\" — 선택한 요소의 세부 속성은 오른쪽 속성 패널에서 고칩니다."
- },
- {
- "courseSlug": "figma",
- "question": "코스에서 \"섹션 4의 주인공\"이라고 소개한 단축키 Shift + A는 무엇을 하는 키인가요?",
- "option1": "선택한 것들을 그룹으로 묶는다",
- "option2": "선택한 것에 오토레이아웃을 씌운다",
- "option3": "방금 만든 요소를 하나 더 복제한다",
- "option4": "새 프레임(화면)을 하나 만든다",
- "answerIndex": 1,
- "explanation": "단축키 표에서 Shift+A는 오토레이아웃 씌우기입니다. 그룹 묶기는 Ctrl+G, 복제는 Ctrl+D, 프레임은 F가 맡습니다."
- },
- {
- "courseSlug": "figma",
- "question": "코스는 오토레이아웃을 \"피그마의 flexbox\"라고 설명하며 CSS와 짝지어 줍니다. 다음 중 옳게 짝지어진 것은 무엇인가요?",
- "option1": "간격(Spacing) ↔ gap",
- "option2": "패딩(Padding) ↔ flex-direction",
- "option3": "방향(가로/세로) ↔ justify-content",
- "option4": "정렬(Alignment) ↔ padding",
- "answerIndex": 0,
- "explanation": "섹션 4의 대응표에 따르면 간격(Spacing)은 CSS의 gap과 같은 개념입니다. 방향은 flex-direction, 패딩은 padding, 정렬은 justify-content/align-items와 짝을 이룹니다."
- },
- {
- "courseSlug": "figma",
- "question": "로그인 버튼을 Ctrl+Alt+K로 컴포넌트로 만들고 인스턴스를 여러 화면에 배치했습니다. 코스가 말하는 컴포넌트의 가장 큰 이점은 무엇인가요?",
- "option1": "인스턴스마다 서로 다른 색을 자동으로 입혀 준다",
- "option2": "버튼이 자동으로 CSS 코드 파일로 저장된다",
- "option3": "인스턴스를 복제할 때마다 이름이 자동으로 정리된다",
- "option4": "원본 하나만 고치면 모든 인스턴스가 한꺼번에 바뀐다",
- "answerIndex": 3,
- "explanation": "섹션 5의 \"마법 도장\" 비유처럼, 컴포넌트는 복사본(인스턴스)이 원본과 연결되어 원본만 수정하면 이미 찍힌 모든 자국이 함께 바뀝니다."
- },
- {
- "courseSlug": "figma",
- "question": "개발 수습생이 디자이너의 시안을 구현하다가 버튼의 정확한 파란색 색상 코드가 필요해졌습니다. 코스가 \"협업 매너이자 여러분의 속도\"라고 권한 행동은 무엇인가요?",
- "option1": "디자이너에게 바로 메시지를 보내 색상 값을 물어본다",
- "option2": "화면을 캡처해서 눈으로 가장 비슷한 색을 골라 쓴다",
- "option3": "우측 상단 > 토글로 Dev Mode를 켜고 요소를 클릭해 값을 직접 읽는다",
- "option4": "버튼 이미지를 PNG로 내보내서 그대로 프로젝트에 붙여 넣는다",
- "answerIndex": 2,
- "explanation": "섹션 7 핸드오프에서 배운 내용입니다. Dev Mode를 켜고 요소를 클릭하면 색상 코드·글꼴·간격이 숫자와 CSS 형태로 표시되므로, 물어보기 전에 직접 읽는 것이 협업 매너입니다."
- },
- {
- "courseSlug": "files",
- "question": "코스에서는 파일시스템을 '디스크의 사서'에 비유합니다. 이 비유에서 파일시스템이 하는 핵심 역할은 무엇인가요?",
- "option1": "디스크의 0과 1을 사람이 읽을 수 있는 글자로 번역해 준다",
- "option2": "어떤 데이터가 디스크의 어느 구역에 있는지 장부(메타데이터)로 관리한다",
- "option3": "파일을 저장할 때마다 자동으로 압축해서 공간을 아껴 준다",
- "option4": "바이러스가 들어오지 못하게 디스크 입구를 지키는 보안 검사를 한다",
- "answerIndex": 1,
- "explanation": "섹션 1에서 디스크는 그냥 0과 1의 바다이고, 파일시스템(사서)이 '보고서.docx는 #4021부터'처럼 장부(메타데이터)를 얹어 관리한다고 배웠어요. 사서가 없으면 책(데이터)이 있어도 찾을 수 없습니다."
- },
- {
- "courseSlug": "files",
- "question": "photo.jpg 파일의 이름을 photo.txt로 바꾸면 어떤 일이 벌어지나요?",
- "option1": "내용물은 그대로이고, Windows가 여는 프로그램만 메모장으로 바뀐다",
- "option2": "파일 맨 앞의 매직 넘버가 텍스트용 바이트로 다시 쓰인다",
- "option3": "JPG 데이터가 손상되어 다시 .jpg로 바꿔도 열리지 않는다",
- "option4": "확장자와 내용을 맞추기 위해 사진이 자동으로 텍스트로 변환된다",
- "answerIndex": 0,
- "explanation": "섹션 2의 핵심: 확장자는 내용물이 아니라 이름표라서, 이름을 바꿔도 바이트는 1도 안 변해요. 단지 Windows가 어떤 프로그램으로 열지 판단하는 기준만 달라질 뿐이라 다시 .jpg로 되돌리면 멀쩡히 열립니다."
- },
- {
- "courseSlug": "files",
- "question": "현재 위치가 frontend/src/pages/ 폴더일 때, 코스 내용에 따르면 ../App.jsx 라는 상대 경로가 가리키는 것은?",
- "option1": "pages 폴더 안에 있는 App.jsx",
- "option2": "두 층 위로 올라간 frontend 폴더의 App.jsx",
- "option3": "한 층 올라간 부모 폴더(src)에 있는 App.jsx",
- "option4": "뿌리(루트)부터 시작하는 절대 경로라서 위치와 무관하다",
- "answerIndex": 2,
- "explanation": "섹션 3에서 ..은 부모 폴더, .은 현재 폴더를 뜻한다고 배웠어요. pages/에서 ../App.jsx는 한 층 올라간 src 폴더의 App.jsx를 가리키며, 상대 경로는 '지금 서 있는 곳' 기준이라는 게 포인트입니다."
- },
- {
- "courseSlug": "files",
- "question": "휴지통을 비우거나 Shift+Delete로 지운 파일을 복구 프로그램이 되살릴 수 있는 이유로, 코스의 설명과 맞는 것은?",
- "option1": "Windows가 모든 파일을 자동으로 클라우드에 백업해 두기 때문에",
- "option2": "휴지통 비우기는 파일을 C:\\$Recycle.Bin 폴더로 옮기기만 하기 때문에",
- "option3": "삭제된 파일이 압축된 형태로 디스크 한쪽에 따로 보관되기 때문에",
- "option4": "장부에서 '자리 비었음'만 표시할 뿐, 데이터는 덮어쓰기 전까지 그대로 남기 때문에",
- "answerIndex": 3,
- "explanation": "섹션 5에서 휴지통 비우기는 사서의 장부에서 지우개질만 하는 것이고, 책(데이터)은 새 파일이 덮어쓰기 전까지 서가에 그대로 남는다고 했어요. 복구 프로그램은 이 '장부엔 없지만 서가엔 남은 책'을 찾아냅니다. (휴지통으로 이사하는 건 Delete 단계의 일이에요.)"
- },
- {
- "courseSlug": "files",
- "question": "수습사원 A가 회의록.txt를 zip으로 압축하니 크기가 크게 줄었는데, 사진.jpg는 압축해도 거의 안 줄었습니다. 코스 내용으로 이 차이를 가장 잘 설명한 것은?",
- "option1": "텍스트는 반복 패턴이 많아 잘 줄지만, JPG는 이미 자체 압축이 되어 더 짜낼 반복이 없어서다",
- "option2": "zip은 글자 데이터 전용 형식이라 사진 파일은 원래 압축 대상이 아니어서다",
- "option3": "사진 파일은 시스템 파일로 분류되어 Windows가 압축을 막아 두기 때문이다",
- "option4": "텍스트는 손실 압축을 허용하지만 사진은 무손실만 가능해서 압축률이 낮은 것이다",
- "answerIndex": 0,
- "explanation": "섹션 6에서 압축은 '반복되는 패턴을 짧은 표현으로 바꿔치기'하는 것이라 반복 많은 글은 팍팍 줄고, 사진·영상은 이미 자기 방식으로 압축돼 있어 거의 안 줄어든다고 배웠어요. '직접 확인해 보기' 실습이 바로 이 실험입니다."
- },
- {
- "courseSlug": "firewall",
- "question": "코스에서 방화벽을 '건물 정문의 문지기'에 비유한 이유로 가장 알맞은 것은?",
- "option1": "서버에 몰리는 트래픽 속도를 조절해 여러 서버로 분산해 주기 때문에",
- "option2": "드나드는 데이터에게 출처와 목적지 포트를 물어 규칙표와 대조한 뒤 통과시키거나 차단하기 때문에",
- "option3": "서버에 저장된 데이터를 암호화해서 도둑이 훔쳐도 읽지 못하게 만들기 때문에",
- "option4": "바이러스에 감염된 파일을 찾아내 자동으로 치료까지 해 주기 때문에",
- "answerIndex": 1,
- "explanation": "섹션 1에서 방화벽은 드나드는 모든 데이터에게 \"어디서 왔죠? 몇 호(포트)에 가시죠?\"를 묻고 규칙표와 대조해 통과·차단하는 문지기로 설명됩니다. 규칙표에 없으면 기본은 차단이에요."
- },
- {
- "courseSlug": "firewall",
- "question": "코스 설명에 따르면 '인바운드(Inbound)' 검사에 대한 설명으로 옳은 것은?",
- "option1": "서버에서 밖으로 나가는 연결을 검사하며, 악성코드의 정보 유출을 잡는 마지막 그물이다",
- "option2": "같은 서버 안의 프로그램끼리 주고받는 내부 연결을 검사하는 것이다",
- "option3": "관리자가 SSH로 접속할 때만 예외적으로 동작하는 특별 검사다",
- "option4": "밖에서 서버로 들어오는 연결을 검사하며, 공격 대부분이 이 방향이라 규칙이 빡빡하다",
- "answerIndex": 3,
- "explanation": "섹션 1에서 인바운드는 밖에서 안으로 '들어오는 손님' 검사이고, 공격이 대부분 이 방향으로 오기 때문에 규칙을 빡빡하게 둔다고 설명합니다. 밖으로 나가는 연결을 검사하는 쪽은 아웃바운드예요."
- },
- {
- "courseSlug": "firewall",
- "question": "포트가 진짜로 '열려 있다'고 말하려면 동시에 성립해야 하는 두 가지 조건은?",
- "option1": "그 포트에서 귀 기울이는 프로그램이 실행 중이고, 방화벽이 그 포트로의 접속을 허용해야 한다",
- "option2": "그 포트 번호가 1024보다 작아야 하고, HTTPS 인증서가 미리 발급되어 있어야 한다",
- "option3": "방화벽에 허용 규칙이 있어야 하고, 최근에 그 포트로 접속한 기록이 남아 있어야 한다",
- "option4": "관리자가 서버에 로그인해 있어야 하고, 아웃바운드 규칙도 함께 열려 있어야 한다",
- "answerIndex": 0,
- "explanation": "섹션 2의 핵심입니다. 방 안에 손님을 맞을 프로그램이 실제로 실행 중이고(방에 사람이 있고), 방화벽이 그 포트로 가는 길을 허용해야(문지기가 통과시켜야) 해요. 둘 중 하나라도 아니면 밖에서는 연결할 수 없습니다."
- },
- {
- "courseSlug": "firewall",
- "question": "AWESOMEDEV 서버(AWS EC2)의 보안그룹에서 전 세계(0.0.0.0/0)가 아니라 지정한 IP에서만 접속을 허용하는 포트는?",
- "option1": "443 — 웹 서비스를 제공하는 HTTPS 창구",
- "option2": "3000 — Gitea 웹과 clone에 쓰이는 문",
- "option3": "22 — 서버를 원격 조종하는 SSH 관리자 전용 뒷문",
- "option4": "80 — Caddy가 443으로 안내해 주는 HTTP 입구",
- "answerIndex": 2,
- "explanation": "섹션 4의 실제 규칙표에서 80·443·3000은 전 세계에 공개하지만, SSH(22)는 뚫리면 서버 전체를 내주는 관리자 전용 뒷문이라 지정한 IP에서 온 접속만 통과시키도록 잠가 두었습니다."
- },
- {
- "courseSlug": "firewall",
- "question": "수습 개발자가 기능 테스트를 위해 서버의 PostgreSQL 포트(5432)를 전 세계에 잠깐 열어 두고 그대로 퇴근했다. 코스 내용에 비추어 가장 올바른 판단은?",
- "option1": "DB는 계정과 비밀번호로 보호되므로 다음 출근 때 닫아도 위험은 거의 없다",
- "option2": "포트 스캔 봇이 열린 문을 금방 찾아내므로, 최소 권한 원칙에 따라 즉시 다시 닫아야 한다",
- "option3": "아웃바운드 규칙만 잠겨 있으면 데이터가 밖으로 나갈 수 없으니 그대로 둬도 된다",
- "option4": "5432는 원래 전 세계 공개가 기본값이라 보안그룹 방침과 어긋나는 일이 아니다",
- "answerIndex": 1,
- "explanation": "섹션 5의 경고 그대로예요 — 잠깐 연 문은 다시 닫는 것까지가 한 세트입니다. 공격 봇은 모든 서버의 포트를 자동으로 두드리고 있고(섹션 6의 포트 스캔), 우리 방침에서 5432는 외부에 존재 자체를 숨기는 닫힌 문이어야 합니다."
- },
- {
- "courseSlug": "git-deep",
- "question": "이 코스에서 설명하는 '커밋'의 본질로 가장 알맞은 것은?",
- "option1": "마지막 커밋 이후 바뀐 부분(변경분)만 골라 저장한 기록",
- "option2": "브랜치 하나를 통째로 압축해 보관해 두는 백업 파일",
- "option3": "그 순간 프로젝트 전체를 통째로 찍은 스냅샷(사진) 한 장",
- "option4": "원격 저장소에 올리기 위해 임시로 묶어 둔 파일 묶음",
- "answerIndex": 2,
- "explanation": "섹션 1 '커밋 = 스냅샷'에서 커밋은 변경분 기록이 아니라 프로젝트 전체를 찍은 사진 한 장이라고 설명해요. 안 바뀐 파일은 이전 사진 것을 재활용해서 빠르고 용량도 작습니다."
- },
- {
- "courseSlug": "git-deep",
- "question": "단체 사진 비유에서 \"사진 찍을 사람 이리 모여!\" 하고 줄을 세운 상태에 해당하는 Git 단계는?",
- "option1": "스테이지 — git add로 커밋에 담을 파일을 골라 둔 상태",
- "option2": "작업 폴더 — 교실에서 각자 코드를 고치고 있는 상태",
- "option3": "저장소 — 커밋되어 사진첩에 정식 보관된 상태",
- "option4": "원격 저장소 — push가 끝나 서버에 올라간 상태",
- "answerIndex": 0,
- "explanation": "섹션 1의 3단계 비유에서 작업 폴더는 교실에서 노는 상태, 스테이지는 줄 세운 상태, 커밋은 사진첩 보관이에요. git add를 따로 두는 이유는 고친 것 중 일부만 골라 한 커밋에 담기 위해서입니다."
- },
- {
- "courseSlug": "git-deep",
- "question": "머지 중 충돌이 난 파일에서 <<<<<<< HEAD 부터 ======= 사이에 적혀 있는 내용은 무엇인가?",
- "option1": "합치려고 하는 상대 브랜치에서 고친 내용",
- "option2": "내 우주, 즉 현재 브랜치에서 고친 내용",
- "option3": "Git이 두 내용을 자동으로 합쳐 제안한 절충안 코드",
- "option4": "두 브랜치가 갈라지기 전의 원래 공통 코드",
- "answerIndex": 1,
- "explanation": "섹션 4에서 <<<<<<< HEAD부터 =======까지는 내 우주(현재 브랜치)의 내용, =======부터 >>>>>>>까지는 상대 우주(합치려는 브랜치)의 내용이라고 읽는 법을 알려 줘요."
- },
- {
- "courseSlug": "git-deep",
- "question": "이미 push해서 팀과 공유한 브랜치에서 \"그 기능 롤백해 주세요\" 요청을 받았다. 코스가 권하는 가장 안전한 방법은?",
- "option1": "git reset --hard로 그 커밋 이전 시점으로 역사를 되돌린다",
- "option2": "git checkout으로 과거 커밋 시점에 다녀오며 상태만 구경한다",
- "option3": "git stash로 해당 기능의 코드를 서랍에 임시 보관해 둔다",
- "option4": "git revert로 그 커밋의 정반대 내용을 새 커밋으로 추가한다",
- "answerIndex": 3,
- "explanation": "섹션 7 '되돌리기 3형제'에서 revert는 역사를 지우지 않고 반대 내용을 새 커밋으로 추가하므로 공유한 브랜치에서도 안전하다고 해요. 실무의 롤백 요청은 대부분 revert이고, 공유 후 reset은 대참사입니다."
- },
- {
- "courseSlug": "git-deep",
- "question": "기능 브랜치에서 코드를 고치던 중(커밋하기엔 애매한 미완성 상태) 멘토가 \"급한 버그부터 고쳐줘!\"라고 요청했다. 코스에서 배운 도구로 가장 알맞은 대처는?",
- "option1": "git reset --hard로 미완성 수정을 전부 지우고 버그 수정부터 시작한다",
- "option2": "git stash로 수정 중인 내용을 서랍에 넣어 두고, 버그를 고친 뒤 git stash pop으로 꺼낸다",
- "option3": "미완성 코드라도 일단 main 브랜치에 바로 커밋해 두고 버그를 고친다",
- "option4": "git revert로 마지막 커밋을 되돌려 놓고 버그 수정 작업을 이어 간다",
- "answerIndex": 1,
- "explanation": "섹션 6에서 stash는 커밋하기 애매한 미완성 코드를 '서랍에 임시 보관'했다가 pop으로 도로 꺼내는 도구이며, 작업 중에 급한 버그 요청이 왔을 때가 바로 쓰는 순간이라고 설명해요."
- },
- {
- "courseSlug": "gpu",
- "question": "코스에서 GPU를 '만 명의 일꾼'에 비유한 이유로 가장 알맞은 것은?",
- "option1": "코어 하나하나가 CPU 코어보다 복잡한 판단을 더 잘하기 때문",
- "option2": "프로그램의 전체 흐름과 순서를 GPU가 직접 결정하기 때문",
- "option3": "단순한 계산을 수천~수만 개의 코어가 동시에 처리하기 때문",
- "option4": "코어 수는 적지만 코어 한 개의 성능이 매우 강력하기 때문",
- "answerIndex": 2,
- "explanation": "섹션 1의 핵심 비유입니다. GPU는 단순한 덧셈·곱셈만 하는 코어 수천~수만 개가 '동시에' 달려들어, 같은 계산이 대량으로 필요한 일에서 천재 한 명(CPU)을 압도합니다."
- },
- {
- "courseSlug": "gpu",
- "question": "코스에서 VRAM을 무엇에 비유했고, VRAM이 부족하면 어떤 일이 생긴다고 설명했나요?",
- "option1": "창고 — 부족하면 GPU가 데이터를 압축해서 쌓아 두게 된다",
- "option2": "작업 책상 — 부족하면 창고(일반 RAM)를 왔다 갔다 하느라 느려진다",
- "option3": "냉각 팬 — 부족하면 GPU가 뜨거워져 스스로 속도를 낮춘다",
- "option4": "두뇌 — 부족하면 복잡한 판단을 전부 CPU에 넘기게 된다",
- "answerIndex": 1,
- "explanation": "섹션 4에서 VRAM은 GPU 전용 '작업 책상'으로 비유됩니다. 책상이 좁으면 재료를 창고(일반 RAM)에서 자꾸 가져와야 해서 일꾼 만 명이 놀게 되고, 연산 속도가 충분해도 느려집니다."
- },
- {
- "courseSlug": "gpu",
- "question": "\"모니터가 144Hz면 화면이 무조건 부드럽다\"는 말에 대해 코스가 설명한 올바른 내용은?",
- "option1": "GPU가 1초에 60장밖에 못 그리면 모니터가 갈아 끼울 그림이 없으므로, 주사율과 GPU 성능은 세트로 맞아야 한다",
- "option2": "주사율은 화면의 색 표현 개수를 정하는 값이라서 화면의 부드러움과는 아무 관계가 없다",
- "option3": "144Hz 모니터는 해상도를 자동으로 낮춰 주기 때문에 어떤 GPU를 써도 항상 부드럽다",
- "option4": "부드러움은 오직 VRAM 용량이 결정하므로 모니터 주사율은 신경 쓰지 않아도 된다",
- "answerIndex": 0,
- "explanation": "섹션 2의 '흔한 오해'입니다. 주사율은 모니터가 1초에 그림을 갈아 끼우는 횟수일 뿐, GPU가 프레임을 제때 만들어 주지 못하면 갈아 끼울 그림이 없어 부드러워지지 않습니다."
- },
- {
- "courseSlug": "gpu",
- "question": "게임용으로 태어난 GPU가 AI 학습의 표준 장비가 된 이유로 코스가 설명한 것은?",
- "option1": "AI 전용 명령어가 게임 그래픽 명령어보다 훨씬 단순하게 만들어졌기 때문",
- "option2": "GPU가 CPU보다 전력을 적게 써서 데이터센터 운영 비용이 줄어들기 때문",
- "option3": "GPU에 달린 VRAM이 일반 RAM보다 용량이 언제나 더 크기 때문",
- "option4": "AI는 사실상 거대한 행렬 곱셈 덩어리라, 픽셀 수백만 개를 동시에 계산하는 게임 작업과 하는 일이 사실상 같기 때문",
- "answerIndex": 3,
- "explanation": "섹션 5의 핵심입니다. AI 학습·실행은 '단순한 곱셈·덧셈을 수십억 번' 반복하는 일이고, 이는 픽셀을 동시에 계산하던 GPU(만 명의 일꾼)가 세상에서 제일 잘하는 일과 같아서 GPU가 AI의 표준 장비가 됐습니다."
- },
- {
- "courseSlug": "gpu",
- "question": "실습 중 작업 관리자 [성능] 탭을 옆에 띄워 두고 유튜브에서 4K 영상을 재생했더니 Video Decode 그래프가 쑥 올라갔다. 코스에 따르면 이 현상이 의미하는 것은?",
- "option1": "브라우저가 CPU 대신 3D 게임 엔진을 실행하기 시작했다는 뜻이다",
- "option2": "VRAM이 부족해서 일반 RAM에서 재료를 빌려 오고 있다는 뜻이다",
- "option3": "영상 압축을 푸는 일을 GPU의 전용 회로가 담당하고 있다는 뜻이다",
- "option4": "외장 GPU가 고장 나서 내장 GPU가 대신 일을 떠맡았다는 뜻이다",
- "answerIndex": 2,
- "explanation": "섹션 7의 실습 ②입니다. 4K 영상을 재생하면 영상 압축을 푸는 일(디코딩)을 GPU 전용 회로가 담당해 Video Decode 그래프가 올라가며, GPU가 게임할 때만 쓰이는 게 아님을 숫자로 확인하는 실습입니다."
- },
- {
- "courseSlug": "hardware",
- "question": "컴퓨터가 하는 5가지 일(입력·기억·계산·저장·출력) 중에서 '계산'을 담당하는 부품은 무엇인가?",
- "option1": "RAM(메모리)",
- "option2": "SSD/HDD(저장장치)",
- "option3": "CPU",
- "option4": "메인보드",
- "answerIndex": 2,
- "explanation": "코스 1섹션의 다이어그램에서 CPU는 '두뇌'로서 계산(생각하기)을 담당한다. RAM은 기억(펼쳐 놓기), SSD/HDD는 저장, 메인보드는 부품들이 꽂히는 판이다."
- },
- {
- "courseSlug": "hardware",
- "question": "코스에서 설명한 RAM(메모리)의 중요한 특징으로 올바른 것은?",
- "option1": "전원을 꺼도 저장한 자료가 그대로 남는다",
- "option2": "전원을 끄면 내용이 싹 비워진다",
- "option3": "윈도우와 프로그램 파일이 설치되는 보관 창고다",
- "option4": "책장처럼 넓지만 자료를 꺼내는 속도가 가장 느리다",
- "answerIndex": 1,
- "explanation": "코스 3섹션에서 RAM은 '지금 하는 일을 펼쳐 놓는 작업 책상'이라 전원을 끄면 싹 비워진다고 설명한다. 전원을 꺼도 남는 보관은 저장장치(SSD/HDD)의 역할이다."
- },
- {
- "courseSlug": "hardware",
- "question": "CPU 모델명 '인텔 코어 i5-14400F'에서 맨 뒤의 'F'가 뜻하는 것은 무엇인가?",
- "option1": "오버클럭이 가능한 고급형 모델이라는 표시",
- "option2": "노트북용 저전력 모델이라는 표시",
- "option3": "같은 세대 안에서 가장 최신 모델이라는 표시",
- "option4": "내장그래픽이 없어 외장 그래픽카드가 꼭 필요하다는 표시",
- "answerIndex": 3,
- "explanation": "코스 2섹션의 CPU 스펙표 읽기에서 'F'는 내장그래픽 없음을 뜻하며, 이 경우 외장 그래픽카드가 필수라고 설명한다. i5는 등급, 14는 세대, 400은 세부 모델이다."
- },
- {
- "courseSlug": "hardware",
- "question": "코스에서 PC 견적을 짤 때 '세 개가 한 세트로 맞아야 한다'고 강조한 조합은 무엇인가?",
- "option1": "CPU ↔ 메인보드 소켓 ↔ RAM 세대(DDR4/DDR5)",
- "option2": "CPU ↔ 파워 정격 출력 ↔ 케이스 색상",
- "option3": "그래픽카드 ↔ 모니터 크기 ↔ SSD 용량",
- "option4": "RAM 용량 ↔ HDD 회전 속도 ↔ 케이스 팬 개수",
- "answerIndex": 0,
- "explanation": "5섹션에서 소켓이 맞아야 CPU가 꽂히고 RAM 규격(DDR4/DDR5)도 메인보드가 정하므로, 'CPU ↔ 보드 소켓 ↔ RAM 세대' 세 가지가 한 세트로 맞아야 한다고 설명한다."
- },
- {
- "courseSlug": "hardware",
- "question": "크롬 탭 30개에 게임과 디스코드까지 켰더니 컴퓨터가 뚝뚝 끊긴다. 코스의 주방·책상 비유로 이 현상의 원인을 가장 잘 설명한 것은?",
- "option1": "요리사(CPU)의 손 빠르기(GHz)가 절반으로 줄어들었기 때문",
- "option2": "책상(RAM)이 꽉 차서 자료를 책장(저장장치)으로 치웠다 꺼내는 스왑이 일어나기 때문",
- "option3": "냉장고(저장장치)가 가득 차서 새 파일을 저장할 공간이 없기 때문",
- "option4": "배전반(파워)의 전력이 모자라 부품 일부가 꺼졌다 켜지기 때문",
- "answerIndex": 1,
- "explanation": "3섹션의 '스왑' 설명에 나오는 상황이다. RAM(책상)이 꽉 차면 덜 쓰는 자료를 SSD/HDD(책장)로 잠시 치워 두는데, 책상에서 바로 집는 것보다 수백~수천 배 느려서 끊김이 생긴다."
- },
- {
- "courseSlug": "history",
- "question": "1946년에 등장한 에니악(ENIAC)에서 실행할 프로그램을 바꾸려면 어떻게 해야 했나요?",
- "option1": "천공카드를 새로 뚫어서 기계에 읽혔다",
- "option2": "메모리에 저장된 파일을 교체해 실행했다",
- "option3": "케이블 배선을 손으로 다시 꽂았다",
- "option4": "진공관을 다른 종류로 갈아 끼웠다",
- "answerIndex": 2,
- "explanation": "코스 1섹션에 나오듯 에니악은 \"프로그램을 바꾼다 = 배선을 다시 꽂는다\"였던 시대의 기계입니다. 파일을 바꿔 실행하는 방식은 이후 폰 노이만 구조가 등장하면서 가능해졌어요."
- },
- {
- "courseSlug": "history",
- "question": "코스에서 소개한 무어의 법칙(1965, 고든 무어의 관찰)의 내용으로 옳은 것은?",
- "option1": "칩의 가격은 2년마다 절반으로 떨어진다",
- "option2": "칩 하나에 들어가는 트랜지스터 수는 약 2년마다 2배가 된다",
- "option3": "컴퓨터의 전력 소모는 매년 2배씩 늘어난다",
- "option4": "소프트웨어의 크기는 하드웨어 성능만큼 빠르게 커진다",
- "answerIndex": 1,
- "explanation": "무어의 법칙은 트랜지스터 수가 약 2년마다 2배가 된다는 관찰로, 코스에서는 \"2배 × 25번\"이 50년간 수백만 배라는 지수적 성장을 만들었다고 설명합니다."
- },
- {
- "courseSlug": "history",
- "question": "코스에서 '헷갈리기 쉽다'며 따로 구분한 인터넷과 웹의 관계로 옳은 것은?",
- "option1": "인터넷은 전 세계 컴퓨터를 잇는 도로망이고, 웹은 그 도로 위에서 HTTP로 문서와 앱을 주고받는 서비스다",
- "option2": "웹이 물리적 연결망이고, 인터넷은 그 연결망 위에서 돌아가는 여러 서비스 중 하나다",
- "option3": "인터넷과 웹은 같은 것을 시대에 따라 다르게 부르는 두 가지 이름일 뿐이다",
- "option4": "인터넷은 한 나라 안의 연결망을, 웹은 나라와 나라를 잇는 국제 연결망을 가리킨다",
- "answerIndex": 0,
- "explanation": "섹션 4의 핵심 구분입니다. 인터넷은 도로망(물리적 연결), 웹은 그 도로 위를 달리는 서비스 중 하나(HTTP로 문서·앱 주고받기)라고 코스가 설명해요."
- },
- {
- "courseSlug": "history",
- "question": "클라우드 섹션에서 소개한 우리 회사(AWESOMEDEV)의 실제 서버 구성 중, Caddy가 맡고 있는 역할은?",
- "option1": "앱을 컨테이너(규격 화물)로 포장해 실행한다",
- "option2": "백엔드 API의 비즈니스 로직을 처리한다",
- "option3": "서비스의 데이터를 저장하고 관리한다",
- "option4": "HTTPS 현관 안내데스크 역할을 한다",
- "answerIndex": 3,
- "explanation": "코스의 실제 구성도에서 Docker는 컨테이너 포장, Spring Boot는 백엔드, PostgreSQL은 데이터베이스, Caddy는 'HTTPS 현관 안내데스크'로 소개됩니다."
- },
- {
- "courseSlug": "history",
- "question": "수습사원 A가 학습 플랫폼 페이지에서 F12를 눌러 기기 툴바를 켜고 화면 폭을 천천히 줄였더니, 어느 지점에서 레이아웃이 '뚝' 하고 다시 배치되었습니다. 코스에 따르면 이 지점의 이름과, 이런 설계가 기본기가 된 시대는?",
- "option1": "렌더링 포인트 — 클라우드 시대",
- "option2": "분기점(breakpoint) — 스마트폰 시대",
- "option3": "체크포인트 — PC 혁명 시대",
- "option4": "접속점(access point) — 인터넷·웹 시대",
- "answerIndex": 1,
- "explanation": "섹션 5의 '직접 확인해 보기' 실습 그대로입니다. 배치가 바뀌는 지점이 반응형의 분기점(breakpoint)이며, \"사용자가 어떤 화면으로 볼지 모른다\"는 전제를 만든 스마트폰 시대가 반응형 디자인을 기본기로 남겼어요."
- },
- {
- "courseSlug": "home-network",
- "question": "공유기 관리자 페이지에 들어가려면 먼저 공유기의 주소를 알아내야 한다. 코스에서 안내한 방법은 무엇인가?",
- "option1": "브라우저 주소창에 8.8.8.8을 입력해서 관리 화면을 연다",
- "option2": "속도 측정 사이트에서 우리 집 공인 IP를 확인해 입력한다",
- "option3": "터미널에서 ipconfig를 실행해 기본 게이트웨이 주소를 확인한다",
- "option4": "공유기 밑면 스티커에 적힌 SSID를 주소창에 입력한다",
- "answerIndex": 2,
- "explanation": "섹션 1에서 배운 3단계의 첫걸음이다. ipconfig로 나오는 기본 게이트웨이(예: 192.168.0.1)가 곧 공유기의 주소이고, 그 주소를 브라우저에 입력하면 관리자 페이지에 들어갈 수 있다."
- },
- {
- "courseSlug": "home-network",
- "question": "코스에서 2.4GHz 대역을 저음(우퍼) 스피커에 비유했다. 2.4GHz의 특징으로 맞는 것은?",
- "option1": "속도는 느리지만 멀리 도달하고 벽을 잘 통과한다",
- "option2": "속도가 빠르고 벽도 잘 통과하지만 도달 거리가 짧다",
- "option3": "도달 거리는 짧지만 전자레인지 간섭이 거의 없다",
- "option4": "채널이 수십 개라 이웃 간 간섭 걱정이 적은 대역이다",
- "answerIndex": 0,
- "explanation": "저음이 벽 너머까지 웅웅 울려 퍼지듯, 낮은 주파수인 2.4GHz는 멀리 가고 벽을 잘 뚫는 대신 속도가 느리고 전자레인지·블루투스 등 간섭이 많다. 빠르지만 여린 쪽은 5GHz다."
- },
- {
- "courseSlug": "home-network",
- "question": "2.4GHz 대역에는 채널 1~13번이 있지만 서로 겹치는 구조다. 실제로 겹치지 않게 쓸 수 있는 채널 조합은?",
- "option1": "2번 · 7번 · 12번",
- "option2": "1번 · 6번 · 11번",
- "option3": "1번 · 5번 · 9번",
- "option4": "3번 · 6번 · 9번",
- "answerIndex": 1,
- "explanation": "섹션 3의 핵심이다. 2.4GHz 채널은 이웃 번호끼리 겹치는 구조라 안 겹치는 조합은 1·6·11 세 개뿐 — 왕복 6차선 도로에서 실제로 안 부딪히는 차선이 3개뿐인 상황에 비유했다."
- },
- {
- "courseSlug": "home-network",
- "question": "외부에서 내 기기로 접속을 허용해야 할 때, 코스가 권장한 순서를 안전한 것부터 바르게 나열한 것은?",
- "option1": "DMZ → UPnP → 필요한 포트만 포트포워딩",
- "option2": "UPnP → 필요한 포트만 포트포워딩 → DMZ",
- "option3": "DMZ → 필요한 포트만 포트포워딩 → UPnP",
- "option4": "필요한 포트만 포트포워딩 → UPnP → DMZ",
- "answerIndex": 3,
- "explanation": "좁게 열수록 안전하다는 원칙이다. 필요한 포트만 여는 포트포워딩이 1순위, 자동문인 UPnP가 2순위, 모든 문을 열어 버리는 DMZ는 최후 수단(사실상 쓰지 말 것)이다. 서버 보안의 최소 권한 원칙과 같다."
- },
- {
- "courseSlug": "home-network",
- "question": "내 PC(192.168.0.5)에서 Spring Boot 서버를 8080 포트로 켰다. 친구가 우리 집 공인 IP의 8080 포트로 접속했지만 공유기에서 막혀 실패했다. 코스의 원칙에 맞는 가장 안전한 해결 방법은?",
- "option1": "공유기 DMZ에 내 PC를 지정해 모든 외부 요청을 받게 한다",
- "option2": "외부 8080 포트를 192.168.0.5의 8080으로 보내는 포트포워딩 규칙을 등록한다",
- "option3": "PC를 5GHz SSID로 옮겨 접속해 무선 속도를 끌어올린다",
- "option4": "무선 채널을 1·6·11 중 이웃이 덜 쓰는 번호로 수동 변경한다",
- "answerIndex": 1,
- "explanation": "경비실(NAT) 비유처럼 공유기는 밖에서 먼저 온 손님을 몇 호로 보낼지 몰라 돌려보내므로, 필요한 포트 하나만 정확히 여는 포트포워딩 규칙을 등록해야 한다. DMZ도 되긴 하지만 문을 전부 여는 위험한 방법이다."
- },
- {
- "courseSlug": "htmlcss",
- "question": "이 코스에서는 웹페이지의 세 가지 재료를 사람에 비유합니다. CSS는 무엇에 해당하나요?",
- "option1": "골격 — 몸의 구조를 잡아 준다",
- "option2": "옷과 화장 — 겉모습을 꾸며 준다",
- "option3": "근육 — 몸을 움직이게 한다",
- "option4": "신경 — 자극에 반응하게 한다",
- "answerIndex": 1,
- "explanation": "섹션 1 '웹페이지의 정체'에서 HTML은 골격, CSS는 옷과 화장, JS는 근육에 비유합니다. 같은 뼈대(HTML)에 옷(CSS)만 갈아입혀도 완전히 다른 사이트처럼 보인다고 설명해요."
- },
- {
- "courseSlug": "htmlcss",
- "question": "박스 모델의 택배 상자 비유에서 '뽁뽁이'(물건과 상자 벽 사이의 완충재)에 해당하는 CSS 속성은 무엇인가요?",
- "option1": "margin — 옆 상자와의 간격",
- "option2": "border — 상자의 벽",
- "option3": "padding — 벽과 내용 사이의 안쪽 여백",
- "option4": "box-shadow — 상자가 떠 있는 느낌",
- "answerIndex": 2,
- "explanation": "섹션 4 박스 모델에서 content는 물건, padding은 뽁뽁이, border는 상자 벽, margin은 옆 상자와의 간격에 비유합니다. 뽁뽁이는 상자 '안'에 있으므로 안쪽 여백인 padding이에요."
- },
- {
- "courseSlug": "htmlcss",
- "question": "우리 플랫폼은 컴포넌트 코드를 한 줄도 바꾸지 않고 다크 모드를 지원합니다. 코스에서 설명한 그 원리는 무엇인가요?",
- "option1": "모든 색이 :root 변수에 모여 있어, @media 블록이 변수 값만 갈아끼우기 때문",
- "option2": "다크 모드 전용 CSS 파일을 페이지마다 하나씩 따로 만들어 두었기 때문",
- "option3": "JS가 화면의 모든 색 속성을 찾아서 어두운 색으로 바꿔 주기 때문",
- "option4": "브라우저가 페이지의 모든 색을 자동으로 반전시켜 주기 때문",
- "answerIndex": 0,
- "explanation": "섹션 5에서 global.css의 :root에 색 '이름표'(--bg, --ink, --primary)를 붙여 두고, @media (prefers-color-scheme: dark)에서 이름표의 값만 바꿔치기하면 사이트 전체가 옷을 갈아입는다고 설명합니다."
- },
- {
- "courseSlug": "htmlcss",
- "question": "겉보기엔