fix: 코스 콘텐츠 일괄 검수 반영 — 깨진 내부 링크·Gitea 포트·보안그룹 사실 교정

- 검수 61파일 52건: 깨진 Link(/learn/database, /learn/git, /learn/backend 등) 유효 slug로 교체
- Gitea 주소 포트 누락(:3000) 일괄 보정
- 방화벽 코스의 보안그룹 표를 실제 설정(3000·222 포함)에 맞게 교정
- olist 마크업 패턴 통일

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
AWESOMEDEV 2026-07-16 14:49:10 +09:00
parent ff14183f03
commit 1303d06811
35 changed files with 81 additions and 79 deletions

View File

@ -358,7 +358,7 @@ export default function AiToolsPage() {
이제 여러분은 AI에게 <strong>맥락·제약·예시로 시키고</strong>, 답을
<strong> 4단계로 검증하고</strong>, 고객사의 것은 <strong>절대 넣지 않는</strong>
개발자예요. AI가 대신 코드도 결국 Git으로 관리되고 서버에 배포되니,{' '}
<Link to="/learn/git"><strong>Git과 협업</strong></Link> 코스로 코드를 안전하게
<Link to="/learn/git-deep"><strong>Git과 협업</strong></Link> 코스로 코드를 안전하게
나누는 법을, <Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 코스로
코드가 달리는 길을 이어서 배워 보세요. 그리고 오늘 배운 프롬프트 3요소로
실습 과제 하나를 골라 AI와 함께(하지만 주도권은 내가!) 풀어 보는 , 그게 진짜 복습입니다.

View File

@ -350,7 +350,7 @@ export default function AwsIntroPage() {
컴퓨터</strong>, <span className="icode">t3.medium</span> 암호가 아니라
<strong> 읽을 있는 사양표</strong> 보일 거예요. 우리 서비스가 EC2 + 탄력적 IP +
보안 그룹 위에서 어떻게 사는지도 그릴 있고요. 다음은 서버 안에서 앱을
포장해 나르는 기술 <Link to="/learn/docker"><strong>Docker 입문</strong></Link>{' '}
포장해 나르는 기술 <Link to="/learn/docker-intro"><strong>Docker 입문</strong></Link>{' '}
코스로 이어 가세요. 데이터가 서버까지 오는 길이 궁금하다면{' '}
<Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 먼저 복습해도
좋습니다.

View File

@ -392,7 +392,7 @@ export default function CacheNosqlPage() {
이제 여러분은 <strong>캐시</strong>(가까운 사본으로 속도 벌기, 히트/미스, 무효화의 어려움){' '}
<strong>NoSQL</strong>( 대신 문서, Redis와 MongoDB, 역할 분담) 입씩 맛봤어요.
핵심은 하나 <strong>데이터의 성격에 맞는 창고를 고른다</strong> .
표의 세계를 단단히 다지고 싶다면 <Link to="/learn/database"><strong>데이터베이스 기초</strong></Link> 코스로,
표의 세계를 단단히 다지고 싶다면 <Link to="/learn/sql"><strong>SQL 첫걸음</strong></Link> 코스로,
데이터들이 어떤 길로 오가는지 궁금하다면 <Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 코스로
이어 가세요. 그리고 과제 우리 플랫폼에서 <strong>"캐시하면 좋을 데이터 후보 3개"</strong> 골라
섹션 7 질문으로 검증한 멘토와 이야기해 보세요.

View File

@ -334,7 +334,7 @@ export default function CleanCodePage() {
모든 페이지가 규칙을 따르고 있어요 여러분이 코드를 때마다 지도를 먼저 받도록요.
</p>
<div className="tip">
<b>직접 확인해 보기</b> Gitea(<span className="icode">edu.awesomedevapp.com</span>)에서
<b>직접 확인해 보기</b> Gitea(<span className="icode">edu.awesomedevapp.com:3000</span>)에서
플랫폼 저장소를 열고 <span className="icode">frontend/src/pages</span> 폴더의 파일을
아무거나 3 골라 주석만 읽어 보세요. 코드를 줄도 읽고도 파일의 역할을
말할 있게 되면 그게 바로 "왜" 주석의 힘이에요.
@ -435,7 +435,7 @@ export default function CleanCodePage() {
그리고 리뷰의 과녁은 언제나 코드라는 것까지. 배운 바로 써먹을 곳도 준비돼
있습니다 <strong>FE-07(중복 카드 컴포넌트 추출)</strong>
<strong> BE-05(매직넘버 상수 추출)</strong> 티켓이 여러분을 기다려요. 코드를
올리기 전에 <Link to="/learn/git"><strong>Git과 협업 워크플로</strong></Link> 코스에서
올리기 전에 <Link to="/learn/git-deep"><strong>Git과 협업 워크플로</strong></Link> 코스에서
브랜치·PR 만드는 법을 먼저 익히면 리뷰 실습까지 번에 이어집니다.
</p>
</div>

View File

@ -379,7 +379,7 @@ export default function CloudNetworkPage() {
우리 플랫폼의 네트워크 지도를 통째로 그릴 있게 됐습니다. 아직{' '}
<Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 코스를 들었다면
먼저 다녀오고, 다음은 지도 위에 서비스를 올리는 방법 {' '}
<Link to="/learn/deploy"><strong>배포 기초</strong></Link> 코스에서 Docker 컨테이너가
<Link to="/learn/docker-intro"><strong>Docker 입문</strong></Link> 코스에서 Docker 컨테이너가
EC2 위에서 어떻게 굴러가는지 이어서 배워 보세요.
</p>
</div>

View File

@ -376,8 +376,9 @@ export default function ColorPage() {
이제 색을 <strong></strong> 아니라 <strong> 개의 손잡이(색상·명도·채도)
비율(60-30-10), 대비(4.5:1)</strong>라는 문법으로 다룰 있게 됐어요.
우리 블루 #2159C5가 버튼 위에 있는 이유도 설명할 있고요. 다음은 색이 올라가는
뼈대를 배울 차례 <Link to="/learn/layout"><strong>레이아웃과 타이포그래피
기초</strong></Link> 코스에서 여백·정렬·글자 위계를 이어서 배워 보세요.
뼈대를 배울 차례 <Link to="/learn/layout"><strong>레이아웃과
그리드</strong></Link> 코스에서 여백·정렬을, <Link to="/learn/typography"><strong>타이포그래피</strong></Link> 코스에서
글자 위계를 이어서 배워 보세요.
배색 실습 결과물은 멘토 리뷰 과제로 제출하는 , 잊지 마세요!
</p>
</div>

View File

@ -312,7 +312,7 @@ export default function CpuDeepPage() {
<span className="icode">npm run build</span> 실행해 보세요. 조용하던 코어들이
일제히 100% 치솟는 장관을 있어요. 걸린 시간도 기록해 두세요 나중에
장비가 바뀌면 비교해 보는 재미가 있습니다. (Gitea{' '}
<span className="icode">edu.awesomedevapp.com</span>에서 클론할 있어요.)
<span className="icode">edu.awesomedevapp.com:3000</span>에서 클론할 있어요.)
</div>
<p>
하나 빌드 도중 그래프를 보면 <strong>모든 코어가 바쁜 구간</strong>{' '}
@ -333,8 +333,9 @@ export default function CpuDeepPage() {
<p className="muted">
이제 CPU 스펙표가 암호가 아니라 문장으로 읽혀요 명령어 사이클이라는 심장 박동,
코어·스레드·클럭·캐시라는 주방의 구조, 스로틀링이라는 자기 보호, 그리고 이름
해독법까지. 다음은 CPU가 재료를 가져오는 <strong>냉장고(메모리) 창고(저장장치)</strong>
차례예요 <Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 코스와
해독법까지. 다음은 CPU가 재료를 가져오는{' '}
<Link to="/learn/memory-storage"><strong>냉장고(메모리) 창고(저장장치)</strong></Link>
{' '}차례예요 <Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 코스와
함께 들으면 "내 코드가 실행되는 무대" 전체가 그려집니다. 실습 ·②에서 기록한
숫자들은 멘토와의 주간 리뷰 가져와서 같이 해석해 보세요.
</p>

View File

@ -421,7 +421,7 @@ export default function DataModelingPage() {
실제로 만들고 데이터를 꺼내는 언어가 궁금하다면{' '}
<Link to="/learn/sql"><strong>SQL 첫걸음</strong></Link> 코스로,
테이블을 백엔드 코드와 연결하는 법이 궁금하다면{' '}
<Link to="/learn/backend"><strong>Spring Boot 백엔드 입문</strong></Link>으로
<Link to="/learn/spring-intro"><strong>Spring Boot 백엔드 입문</strong></Link>으로
이어 가세요. 쪽지 기능 ERD는 멘토 리뷰 과제 게시판에 제출하는 것도 잊지 말고요!
</p>
</div>

View File

@ -409,7 +409,7 @@ export default function DebuggingPage() {
</div>
<div className="tip">
<b>직접 확인해 보기 </b> 이번 주에 만난 에러 하나를 골라, 템플릿대로
<strong> edu.awesomedevapp.comGitea 이슈</strong> 실제로 작성해 보세요.
<strong> Gitea(edu.awesomedevapp.com:3000) 이슈</strong> 실제로 작성해 보세요.
이미 해결한 에러여도 좋아요 "시도한 것"까지 다음 멘토에게 링크를 보내고,
"이 질문 받으면 바로 도와줄 수 있겠어요?"라고 피드백을 받아 보세요.
</div>
@ -423,7 +423,7 @@ export default function DebuggingPage() {
시간을 <strong>멈추고</strong>(브레이크포인트), 용의자를 <strong>반씩 지우고</strong>(이분 탐색),
사건을 <strong>재현하고</strong>, 막히면 <strong>답이 오는 질문</strong> 있는
탐정이에요. 디버깅으로 잡은 버그가 다시 돌아오지 못하게 막는 {' '}
<Link to="/learn/git"><strong>Git과 협업</strong></Link> 코스에서 커밋으로 수사 기록을
<Link to="/learn/git-deep"><strong>Git과 협업</strong></Link> 코스에서 커밋으로 수사 기록을
남기는 법을 이어서 배우고, 다음 과제에서 만나는 에러에 오늘 배운 순서를 그대로
적용해 보세요.
</p>

View File

@ -333,7 +333,7 @@ export default function DesignSystemPage() {
<Code>{CODE_DZ03_TABLE}</Code>
<div className="olist">
<ol>
<li>Gitea(edu.awesomedevapp.com)에서 <strong>티켓 DZ-03</strong> 열고 본인을 담당자로 지정해요.</li>
<li>Gitea(edu.awesomedevapp.com:3000)에서 <strong>티켓 DZ-03</strong> 열고 본인을 담당자로 지정해요.</li>
<li> 표의 ①번부터 순서대로 채워요 ①은 <span className="icode">global.css</span>, ·③은 <span className="kbd">F12</span> 무기예요.</li>
<li>완성한 표를 DZ-03 댓글로 올리고, "우리 플랫폼에 빠져 있다고 느낀 상태·토큰 1가지" 함께 적어요.</li>
<li>멘토 리뷰를 받으면 실습 완료! 지적받은 부분은 표를 고쳐서 다시 올려요.</li>

View File

@ -251,7 +251,7 @@ export default function FilesPage() {
</p>
<Code>{CODE_HIDDEN}</Code>
<p>
여러분이 Gitea(<span className="icode">edu.awesomedevapp.com</span>)에서 클론한
여러분이 Gitea(<span className="icode">edu.awesomedevapp.com:3000</span>)에서 클론한
저장소 폴더에도 <span className="icode">.git</span>이라는 숨김 폴더가 있어요.
커밋 하나하나의 역사가 전부 안에 들어 있죠 <strong> 폴더를 지우는 순간
평범한 폴더로 돌아가 버립니다.</strong> "저장소를 복사했는데 Git이 안 돼요"

View File

@ -30,6 +30,7 @@ const CODE_PORT_DOOR = `포트를 '연다/닫는다'는 것의 진짜 의미
서버 x.x.x.x (건물)
:443 HTTPS [열림] 문지기: "443호 손님은 누구든 통과"
:80 HTTP [열림] (들어오면 443으로 안내)
:3000 Gitea [열림] 우리 Git 서버의 창구
:22 SSH [조건부] "사무실 IP에서 온 분만 통과"
:5432 PostgreSQL [닫힘] "5432호요? 그런 방 없습니다" (묵묵부답)
:8080 백엔드 [닫힘] 건물 (같은 서버)에서만 노크 가능
@ -74,6 +75,8 @@ const CODE_SECURITY_GROUP = `AWESOMEDEV 서버(AWS EC2 서울)의 보안그룹
포트 대상 허용 범위 이유
80 HTTP 세계(0.0.0.0/0) Caddy가 443으로 안내
443 HTTPS 세계(0.0.0.0/0) 서비스니까 손님은 환영
3000 Gitea(·clone) 세계(0.0.0.0/0) 사내 Git 서버 로그인으로 보호
222 Gitea SSH 세계(0.0.0.0/0) SSH 방식 clone/push용 ( 인증)
22 SSH(원격 접속) 지정한 IP만! 관리자 전용 뒷문
전부: 닫힘 (규칙에 없으면 = 차단)
@ -117,7 +120,7 @@ const CODE_ATTACKS = `서버를 인터넷에 올리는 순간 실제로 벌어
const CODE_CHECKLIST = `AWESOMEDEV 서버 보안 체크리스트 — 새 서버를 열기 전 셀프 점검
[ ] 1. 보안그룹: 80/443 전체 공개, 나머지는 전부 차단했는가?
[ ] 1. 보안그룹: 서비스에 필요한 포트(80/443/3000) 공개했는가?
[ ] 2. SSH(22): 허용 IP를 지정했는가? (0.0.0.0/0 금지!)
[ ] 3. SSH: 비밀번호 대신 파일 인증을 쓰는가?
[ ] 4. DB(PostgreSQL): 외부 포트가 닫혀 있고, 접속 계정 권한이 최소인가?
@ -255,7 +258,7 @@ export default function FirewallPage() {
</div>
</Section>
<Section n={4} title="우리 AWS 보안그룹 — 실제 규칙표" sub="80/443만 공개, SSH는 IP 제한 — 왜?">
<Section n={4} title="우리 AWS 보안그룹 — 실제 규칙표" sub="필요한 문만 열고, SSH는 IP 제한 — 왜?">
<p>
이제 진짜 우리 이야기를 해볼게요. AWESOMEDEV의 서버는 <strong>AWS EC2(서울)</strong>에서
돌고 있고, AWS에서 방화벽 역할을 하는 <strong>보안그룹(Security Group)</strong>이에요.
@ -360,7 +363,7 @@ export default function FirewallPage() {
<h3 style={{ marginBottom: 6 }}>🛡 여기까지 왔다면</h3>
<p className="muted">
이제 방화벽이 무엇을 검사하는지, 포트를 여닫는다는 무슨 뜻인지, 그리고
우리 AWS 서버가 <strong> 80/443열고 SSH를 IP로 잠갔는지</strong>까지
우리 AWS 서버가 <strong> 필요한 포트열고 SSH를 IP로 잠갔는지</strong>까지
설명할 있게 됐어요. 핵심은 문장 <strong>"필요한 문만 열고, 기본은
잠금."</strong> 아직 <Link to="/learn/network"><strong>네트워크의 이해</strong></Link> 코스를
봤다면 IP·포트 개념을 먼저 다지고 오세요. 다음으로는 문단속 위에서

View File

@ -276,7 +276,7 @@ export default function GitDeepPage() {
<b>직접 확인해 보기</b> 우리 학습 플랫폼 저장소를 클론받았다면 폴더에서{' '}
<span className="icode">git log --oneline</span> 보세요. 지금까지 찍힌
사진(커밋)들의 목록이 최신순으로 나와요. 7자리 코드가 바로 사진의
고유 번호(해시)입니다. Gitea(edu.awesomedevapp.com)에서 같은 저장소의
고유 번호(해시)입니다. Gitea(edu.awesomedevapp.com:3000)에서 같은 저장소의
커밋 목록을 열어 화면이 똑같은지 비교해 보세요.
</div>
</Section>
@ -438,7 +438,7 @@ export default function GitDeepPage() {
</div>
<Code>{CODE_CONFLICT_LAB}</Code>
<div className="tip">
<b> 걸음 </b> 같은 실습을 Gitea(edu.awesomedevapp.com) 개인 연습
<b> 걸음 </b> 같은 실습을 Gitea(edu.awesomedevapp.com:3000) 개인 연습
저장소에 push해서, 브랜치 개로 PR을 만들어 보세요. 화면에서
"충돌이 있어 자동 머지 불가" 표시가 뜨는 것까지 보면, 로컬과 원격의
충돌 경험이 하나로 이어집니다.

View File

@ -315,7 +315,7 @@ export default function IconsImagesPage() {
가르는 디테일이에요.
</p>
<div className="tip">
<b>직접 확인해 보기</b> 우리 학습 플랫폼과 Gitea(<span className="icode">edu.awesomedevapp.com</span>)
<b>직접 확인해 보기</b> 우리 학습 플랫폼과 Gitea(<span className="icode">edu.awesomedevapp.com:3000</span>)
아이콘을 비교해 보세요. 그리고 아무 페이지에서 <span className="kbd">F12</span>
<span className="kbd">Elements</span> 탭에서 <span className="icode">&lt;head&gt;</span>
펼쳐 <span className="icode">link rel="icon"</span>
@ -358,7 +358,7 @@ export default function IconsImagesPage() {
이제 그림 파일의 종류(비트맵·벡터), @2x가 필요한 이유, 좋은 아이콘의
3조건, <strong>저작권 확인 습관</strong>, 최적화 순서, 파비콘·OG까지
화면 위의 그림을 다루는 기본기를 갖췄어요. 다음은 그림들이 놓일 화면
전체의 배치를 배울 차례 <Link to="/learn/design"><strong>디자인 기초</strong></Link> 코스에서
전체의 배치를 배울 차례 <Link to="/learn/layout"><strong>레이아웃과 그리드</strong></Link> 코스에서
여백과 정렬을 이어서 배우고, <Link to="/learn/coding"><strong>코딩 기초</strong></Link>에서
SVG를 컴포넌트로 다루는 법까지 연결해 보세요.
</p>

View File

@ -386,7 +386,7 @@ export default function JavaBasicsPage() {
</div>
<Code>{CODE_HELLO}</Code>
<div className="tip">
<b>직접 확인해 보기 </b> 우리 Gitea(<span className="icode">edu.awesomedevapp.com</span>)에서
<b>직접 확인해 보기 </b> 우리 Gitea(<span className="icode">edu.awesomedevapp.com:3000</span>)에서
백엔드 저장소를 열고, <span className="icode">domain</span> 폴더의 클래스 아무거나
하나(: <span className="icode">User.java</span>) 골라 아래 체크리스트를 채워 보세요.
읽기만 하는 실습이니 마음껏 열어 봐도 됩니다.
@ -407,7 +407,7 @@ export default function JavaBasicsPage() {
객체 메서드 생성자</strong> 이어지는 뼈대, 데이터를 지키는
<strong> private</strong> 이유, <strong>List/Map/try-catch</strong>라는 실무
도구까지 손에 넣었어요. 우리 백엔드 코드의 "단어" 배운 셈입니다. 다음은
단어들로 쓰인 "문장" <Link to="/learn/spring-boot"><strong>Spring Boot
단어들로 쓰인 "문장" <Link to="/learn/spring-intro"><strong>Spring Boot
입문</strong></Link> 코스에서 클래스들이 어떻게 API가 되는지 이어서 배워 보세요.
실습 ②의 문장 요약은 멘토 확인 과제로 제출!
</p>

View File

@ -423,7 +423,7 @@ export default function LinuxAdvancedPage() {
이제 여러분은 환경변수로 설정을 주입하고, 스크립트와 크론으로 <strong>서버가 스스로
일하게</strong> 만들고, 문제가 생기면 <strong>로그부터 여는</strong> 사람이 됐어요.
명령어를 아는 것과 운영 감각이 있는 것의 차이가 바로 이것입니다. 다음은 서버 위에서
돌아가는 데이터의 <Link to="/learn/database"><strong>데이터베이스 기초</strong></Link>
돌아가는 데이터의 <Link to="/learn/sql"><strong>데이터베이스 기초</strong></Link>
코스로 이어 가거나, 멘토에게 <strong>"배포 스크립트 함께 읽기"</strong> 과제를 요청해
오늘 배운 if·for·파이프를 실전 코드에서 찾아보세요.
</p>

View File

@ -299,16 +299,14 @@ export default function MainboardPowerPage() {
있어요. 심장이 멈추면 장기가 아니라 온몸이 위험해지는 것과 같죠.
10 아끼려다 100 원어치 부품을 태우는, 가성비가 가장 나쁜 절약입니다.
</p>
<div className="olist">
<ol>
<li><strong>보호 회로의 유무</strong> 좋은 파워엔 과전압(OVP)·과전류(OCP)·단락(SCP)
보호가 들어 있어 사고가 나도 스스로 꺼지며 다른 부품을 지켜요. 싸구려는 이걸 생략합니다.</li>
<li><strong>표기 뻥튀기</strong> 섹션 5에서 '최대 출력' 눈속임. 정격 300W짜리에
"600W"라고 크게 적어 파는 제품이 실제로 있어요.</li>
<li><strong>조용한 증상</strong> 죽기 전엔 게임 갑자기 꺼짐, 이유 없는 재부팅 같은
애매한 증상으로 나타나서 원인 찾기도 어렵습니다.</li>
</ol>
</div>
<ol className="olist">
<li><strong>보호 회로의 유무</strong> 좋은 파워엔 과전압(OVP)·과전류(OCP)·단락(SCP)
보호가 들어 있어 사고가 나도 스스로 꺼지며 다른 부품을 지켜요. 싸구려는 이걸 생략합니다.</li>
<li><strong>표기 뻥튀기</strong> 섹션 5에서 '최대 출력' 눈속임. 정격 300W짜리에
"600W"라고 크게 적어 파는 제품이 실제로 있어요.</li>
<li><strong>조용한 증상</strong> 죽기 전엔 게임 갑자기 꺼짐, 이유 없는 재부팅 같은
애매한 증상으로 나타나서 원인 찾기도 어렵습니다.</li>
</ol>
<div className="warn">
<b>기억할 </b> "파워에 쓰는 돈은 성능이 아니라 <strong>보험</strong>이다."
견적 전체의 10~15% 파워에 배정하고, 검증된 제조사의 정격·80PLUS 인증 제품을 고르세요.
@ -327,15 +325,13 @@ export default function MainboardPowerPage() {
<span className="kbd">Enter</span>. 아래 항목들을 찾아 적어 보세요.
</div>
<Code>{CODE_MSINFO}</Code>
<div className="olist">
<ol>
<li>찾은 모델명을 검색해서 제조사 공식 페이지를 열어 보세요.</li>
<li>스펙 표에서 <strong>폼팩터</strong>(섹션 2), <strong>RAM 슬롯 </strong>(섹션 1),
<strong> 후면 포트 구성</strong>(섹션 3) 확인 오늘 배운 지도가 실제 스펙 표를
읽는 안경이 됩니다.</li>
<li>"BIOS 모드" UEFI로 나오는지도 확인해 보세요(섹션 4).</li>
</ol>
</div>
<ol className="olist">
<li>찾은 모델명을 검색해서 제조사 공식 페이지를 열어 보세요.</li>
<li>스펙 표에서 <strong>폼팩터</strong>(섹션 2), <strong>RAM 슬롯 </strong>(섹션 1),
<strong> 후면 포트 구성</strong>(섹션 3) 확인 오늘 배운 지도가 실제 스펙 표를
읽는 안경이 됩니다.</li>
<li>"BIOS 모드" UEFI로 나오는지도 확인해 보세요(섹션 4).</li>
</ol>
</Section>
<div className="step-card">

View File

@ -119,7 +119,7 @@ const CODE_MISTAKES = `모바일에서 가장 흔한 실수 2가지 — 우리
번이 낯익다면 정상입니다 우리 플랫폼 FE-06 티켓이 바로
"모바일에서 표가 화면을 뚫고 나가는" 가로 스크롤 버그예요.`;
const CODE_WEB_VS_APP = `모바일 웹 vs 네이티브 앱 — 어썸데브는 둘 다 합니다
const CODE_WEB_VS_APP = `모바일 웹 vs 네이티브 앱 — 두 갈래 길 비교
모바일 (React) (React Native · Flutter)
@ -326,7 +326,7 @@ export default function MobileDesignPage() {
</div>
</Section>
<Section n={6} title="웹 vs 앱" sub="React Native·Flutter — 우리 회사가 둘 다 하는 이유">
<Section n={6} title="웹 vs 앱" sub="React Native·Flutter — 두 길의 차이 알아보기">
<p>
같은 서비스라도 <strong>모바일 </strong>으로 낼지 <strong>네이티브 </strong>으로
낼지는 갈림길이에요. 웹은 URL 하나로 바로 열리는 <strong>노점</strong> 진입은
@ -336,8 +336,8 @@ export default function MobileDesignPage() {
</p>
<Code>{CODE_WEB_VS_APP}</Code>
<p>
어썸데브는 React로 웹을 만들, <strong>React Native와 Flutter로 앱도
만듭니다</strong> 얘기가 아니라 여러분이 하게 수도 있는 업무예요.
어썸데브는 React로 웹을 만들어요. 그리고 <strong>React Native는 React 지식을
그대로 살릴 있는 </strong>이라, 언젠가 프로젝트를 만나도 낯설지 않을 예요.
좋은 소식: 지금 코스에서 배운 원칙들은 도구와 무관하게 전부 그대로 통합니다.
화면을 누르는 언제나 사람의 엄지니까요.
</p>

View File

@ -426,9 +426,9 @@ export default function OpsBasicsPage() {
<p className="muted">
이제 여러분은 장애의 가지 신호를 구분하고, <strong>서버 컨테이너 로그 DB</strong> 순서로
원인을 좁히고, 증거를 남기며 재시작하고, 3-2-1 백업과 5 보고서까지 아는 사람이 됐어요.
서버와 Docker가 아직 낯설다면 <Link to="/learn/server"><strong>서버배포 기초</strong></Link> 코스를
서버와 Docker가 아직 낯설다면 <Link to="/learn/server-anatomy"><strong>서버 해부</strong></Link> 코스를
먼저 복습하고, 로그 DB 에러를 깊이 이해하고 싶다면{' '}
<Link to="/learn/database"><strong>데이터베이스 기초</strong></Link>이어 가세요.
<Link to="/learn/sql"><strong>SQL 첫걸음</strong></Link>이어 가세요.
그리고 다음 <strong>A2 보고</strong>에서 오늘 배운 5 골격을 한번 보기!
</p>
</div>

View File

@ -144,7 +144,7 @@ const CODE_SERVER_LINUX = `왜 서버는 거의 다 리눅스일까?
이유 5) Docker의 고향 컨테이너 기술 자체가 리눅스 커널 기능 기반
여러분이 매일 쓰는 것들 뒤에도:
학습 플랫폼( 페이지!) · Gitea(edu.awesomedevapp.com) ·
학습 플랫폼( 페이지!) · Gitea(edu.awesomedevapp.com:3000) ·
PostgreSQL · Caddy 전부 리눅스 위의 프로세스(섹션 3!) 돌고 있어요.`;
//

View File

@ -245,7 +245,7 @@ export default function PortfolioPage() {
휘발되거든요 특히 "고민(A)" 부분이 제일 먼저 사라져요.
</p>
<div className="tip">
<b>직접 확인해 보기</b> 지금 우리 Gitea(<span className="icode">edu.awesomedevapp.com</span>)
<b>직접 확인해 보기</b> 지금 우리 Gitea(<span className="icode">edu.awesomedevapp.com:3000</span>)
로그인해서 내가 올린 커밋과 닫은 이슈 목록을 열어 보세요. 그중 "이건 좀 고생했는데"
싶은 1개를 골라, 이슈에 <strong>문제/해결 코멘트</strong> 지금 달아 보세요.
방금 포트폴리오 조각을 저장한 거예요.
@ -356,7 +356,7 @@ export default function PortfolioPage() {
이야기를 <strong>STAR </strong> 담는 , 그리고 수습 8주의 산출물이
이미 재료라는 알게 됐어요. 오늘 초안은 종합 프로젝트가 끝날 때마다 장씩
늘려 가세요. 대표작을 단단하게 만들고 싶다면{' '}
<Link to="/learn/git"><strong>Git과 협업</strong></Link> 코스에서 커밋 메시지와
<Link to="/learn/git-deep"><strong>Git과 협업</strong></Link> 코스에서 커밋 메시지와
저장소 관리 습관을, <Link to="/learn/coding"><strong>코딩 기초</strong></Link>{' '}
코스에서 트러블슈팅에 실력을 이어서 다져 보세요.
</p>

View File

@ -185,7 +185,7 @@ const CODE_PRACTICE = `STUDY.md 미니 과제 3종 — 오늘 배운 걸 손으
배열 상수를 만들어 .map()으로 <li> 목록 렌더링.
key를 일부러 빼고 저장 브라우저 콘솔(F12) 경고를 직접 목격!
제출: Gitea(edu.awesomedevapp.com) 브랜치 만들어 커밋 & PR.
제출: Gitea(edu.awesomedevapp.com:3000) 브랜치 만들어 커밋 & PR.
멘토가 코드 리뷰로 피드백을 답니다 실무 흐름 그대로!`;
//

View File

@ -364,7 +364,7 @@ export default function ServerAnatomyPage() {
PostgreSQL)라는 , 그리고 몰려드는 요청을 <strong>스레드 풀로 버티고 스케일 /아웃으로
키운다</strong> 것까지 알게 됐어요. 무엇보다, PC로 서버를 직접 켜고 봤죠.
다음은 릴레이의 마지막 주자 데이터를 보관하는 창고의 속을 여는{' '}
<Link to="/learn/database"><strong>데이터베이스 기초</strong></Link> 코스로 이어 가세요.
<Link to="/learn/sql"><strong>데이터베이스 기초</strong></Link> 코스로 이어 가세요.
멘토 과제: 오늘 배운 3계층 그림을 보지 않고 종이에 그려서 멘토에게 설명해 보기!
</p>
</div>

View File

@ -256,7 +256,7 @@ export default function SpringIntroPage() {
</p>
<Code>{CODE_CONSTRUCTOR_DI}</Code>
<div className="tip">
<b>직접 확인해 보기</b> 우리 백엔드 저장소(edu.awesomedevapp.comGitea)에서
<b>직접 확인해 보기</b> 우리 백엔드 저장소(edu.awesomedevapp.com:3000Gitea)에서
<span className="icode"> AuthController.java</span> 열어 보세요. 클래스 위의
<span className="icode"> @RestController</span>, 생성자에서 받는
<span className="icode"> final</span> 필드들 방금 배운 모양 그대로인지 눈으로
@ -370,9 +370,9 @@ export default function SpringIntroPage() {
이제 스프링이 객체를 조립해 주는 원리(DI), 어노테이션 읽는 , 요청이 층을
여행하는 , 설정과 JPA까지 우리 백엔드의 뼈대를 전부 훑었어요. 심지어 API도
하나 만들었죠. 다음은 데이터가 잠드는 {' '}
<Link to="/learn/database"><strong>데이터베이스 기초</strong></Link> 코스에서
<Link to="/learn/sql"><strong>데이터베이스 기초</strong></Link> 코스에서
PostgreSQL과 테이블 설계를 이어서 배우고, 실습에서 만든 API는{' '}
<Link to="/study"><strong>STUDY 과제</strong></Link> 제출해 멘토 리뷰를 받아
<Link to="/assignments"><strong>STUDY 과제</strong></Link> 제출해 멘토 리뷰를 받아
보세요.
</p>
</div>

View File

@ -459,7 +459,7 @@ export default function SqlIntermediatePage() {
NULL에 속지 않고, 인덱스와 EXPLAIN으로 <strong> 느린지 진단</strong>하고,
트랜잭션으로 <strong>안전하게 바꾸는</strong> 법까지 알게 됐어요.
다음 걸음은 갈래 여러 테이블을 이어 붙이는 <strong>JOIN</strong> 파고들거나,{' '}
<Link to="/learn/backend"><strong>백엔드 기초</strong></Link> 코스에서
<Link to="/learn/spring-intro"><strong>Spring Boot 입문</strong></Link> 코스에서
Spring Boot가 쿼리들을 어떻게 대신 주는지(JPA) 이어서 배워 보세요.
완성한 실습 쿼리는 과제 게시판에 제출해 멘토 피드백을 받아 보는 , 잊지 말고요!
</p>

View File

@ -83,7 +83,8 @@ const CODE_PORTS = `잘 알려진 포트 — 전부 우리 회사(AWESOMEDEV)에
22 TCP SSH AWS EC2(서울) 서버에 원격 접속할
80 TCP HTTP Caddy가 받아서 443으로 돌려보냄(리다이렉트)
443 TCP HTTPS 학습 플랫폼·Gitea(edu.awesomedevapp.com) 접속
443 TCP HTTPS 학습 플랫폼(edu.awesomedevapp.com) 접속
3000 TCP HTTP(웹앱) Gitea(edu.awesomedevapp.com:3000) 접속
5432 TCP PostgreSQL 백엔드(Spring Boot) DB랑 대화하는
8080 TCP HTTP(대체) Spring Boot 개발 서버의 단골 기본 포트

View File

@ -130,13 +130,13 @@ const CODE_RUN_TESTS = `# 우리 백엔드 테스트 전체 실행 — 두 가
# 아래 실행 창에 초록 체크()들이 주르륵!
# 방법 2) 터미널에서 (backend 폴더에서)
./gradlew test
mvn test
# 이런 결과가 보이면 성공:
ProgressServiceTest > 이미_완료한_강의를_다시_완료해도_진도율은_그대로다 PASSED
ProgressServiceTest > 모든_강의를_완료하면_진도율은_정확히_100이다 PASSED
[INFO] Running dev.awesomedev.mirim.service.ProgressServiceTest
[INFO] Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
...
BUILD SUCCESSFUL`;
[INFO] BUILD SUCCESS`;
const CODE_QA02 = `# 도전: 테스트 케이스 1개 추가하기 (티켓 QA-02)
@ -409,9 +409,9 @@ export default function TestingPage() {
<strong> 3 구조</strong>, 버그가 사는 <strong>경계값</strong>, 그리고 테스트라는
안전그물 위에서만 가능한 <strong>리팩터링</strong>까지 직접 눌러 초록불과
빨간불을 모두 봤다면 코스는 통과입니다. 도전 과제(QA-02) 끝냈다면{' '}
<Link to="/learn/git"><strong>Git 협업 기초</strong></Link> 코스에서 방금 만든
<Link to="/learn/git-deep"><strong>Git 협업 기초</strong></Link> 코스에서 방금 만든
테스트를 커밋·푸시해 리뷰받는 흐름으로 이어 보세요. 백엔드 코드 자체가 궁금해졌다면{' '}
<Link to="/learn/backend"><strong>Spring Boot 백엔드 입문</strong></Link> 다음 정거장입니다.
<Link to="/learn/spring-intro"><strong>Spring Boot 백엔드 입문</strong></Link> 다음 정거장입니다.
</p>
</div>
</div>

View File

@ -320,7 +320,7 @@ export default function ToolCapturePage() {
이제 <strong>찍고(Win+Shift+S) 담고(스크롤· 캡처) 움직이고(GIF·녹화)
가리키고(주석) 지키는(개인정보 점검)</strong> 다섯 동작이 손에 들어왔어요.
기술은 앞으로 모든 코스의 과제 제출에서 계속 쓰입니다.
다음은 캡처를 첨부할 무대 <Link to="/learn/git"><strong>Git과 Gitea</strong></Link> 코스에서
다음은 캡처를 첨부할 무대 <Link to="/learn/git-deep"><strong>Git과 Gitea</strong></Link> 코스에서
이슈·PR에 리포트를 올리는 협업 흐름을 이어서 배워 보세요.
</p>
</div>

View File

@ -383,7 +383,7 @@ export default function ToolGiteaPage() {
이제 Gitea는 코드 창고가 아니라 <strong>일이 흐르는 본부</strong> 보일 거예요
일은 이슈로, 작업은 브랜치로, 합류는 PR과 리뷰로, 변화는 diff로 읽는 흐름을
전부 손으로 해봤으니까요. 흐름의 밑바닥에서 도는 Git 자체가 궁금하다면{' '}
<Link to="/learn/git"><strong>Git 기초</strong></Link> 코스로, 방금 만든 이슈처럼
<Link to="/learn/git-deep"><strong>Git 기초</strong></Link> 코스로, 방금 만든 이슈처럼
실제 과제를 받아 PR까지 완주해 보고 싶다면{' '}
<Link to="/assignments"><strong>과제 게시판</strong></Link>에서 티켓을
골라 보세요. 여러분의 다음 초록 칸을 기다릴게요.

View File

@ -62,7 +62,7 @@ const CODE_GIT_PANEL = `IntelliJ 안에서 끝내는 Git 일과
Alt + 9 Git 도구창 커밋 이력(Log) 그래프로 구경
Ctrl + K 커밋 바뀐 파일 체크하고 메시지 쓰고 커밋
Ctrl + Shift + K 푸시 Gitea(edu.awesomedevapp.com) 올리기
Ctrl + Shift + K 푸시 Gitea(edu.awesomedevapp.com:3000) 올리기
편집기 왼쪽 여백(거터) 막대도 Git 정보예요:
초록 = 새로 추가된 파랑 = 수정된 회색 화살표 = 삭제된
@ -357,8 +357,8 @@ export default function ToolIntellijPage() {
자동 수리(<strong>Alt+Enter</strong>), 코드 여행(<strong>Ctrl+클릭</strong>),
시간 정지(<strong>디버거</strong>), 비밀 보험(<strong>로컬 히스토리</strong>)까지
장착됐어요. 도구는 결국 쓰면서 늘어요 오늘 배운 단축키를{' '}
<Link to="/learn/git"><strong>Git 코스</strong></Link> 커밋 습관,{' '}
<Link to="/learn/database"><strong>데이터베이스 코스</strong></Link> SQL 연습과
<Link to="/learn/git-deep"><strong>Git 코스</strong></Link> 커밋 습관,{' '}
<Link to="/learn/sql"><strong>SQL 입문 코스</strong></Link> SQL 연습과
묶어서, 다음 백엔드 과제에서 마우스 없이 하루를 버텨 보는 목표로 삼아 보세요.
</p>
</div>

View File

@ -281,7 +281,7 @@ export default function ToolNotionPage() {
"시작 전 → 진행 중 → 완료" 드래그하며 옮길 있어서, 일이 눈에 들어옵니다.
</p>
<div className="tip">
<b>연결해서 생각하기</b> 나중에 <Link to="/learn/database"><strong>데이터베이스
<b>연결해서 생각하기</b> 나중에 <Link to="/learn/sql"><strong>데이터베이스
코스</strong></Link>에서 PostgreSQL을 배울 ", 노션 데이터베이스의 필터가
SQL의 WHERE고, 정렬이 ORDER BY구나"라고 연결되는 순간이 거예요.
도구는 달라도 데이터를 다루는 사고방식은 하나입니다.
@ -363,7 +363,7 @@ export default function ToolNotionPage() {
블록으로 적고, 구조로 정리하고, 검색으로 꺼내 쓰고, 링크로 나눈다
가지가 오늘의 전부입니다. 앞으로 모든 코스에서 배우는 내용을
오늘 만든 TIL에 쌓아 보세요. 다음 도구가 궁금하다면{' '}
<Link to="/learn/git"><strong>Git과 Gitea로 협업하기</strong></Link> 코스에서
<Link to="/learn/git-deep"><strong>Git과 Gitea로 협업하기</strong></Link> 코스에서
"코드의 기록" 남기는 법을 이어서 배우고, 코스의 과제를
오늘 만든 <strong>과제 트래커</strong> 등록해 관리해 보세요.
</p>

View File

@ -372,7 +372,7 @@ export default function ToolTerminalPage() {
Windows Terminal 창에서 탭과 분할로 오가며, 포트를 점거한 유령 프로세스도
직접 잡을 있게 됐어요. 터미널은 <strong>모든 개발 도구의 현관문</strong>
다음은 문으로 들어가 쓰는 번째 도구,{' '}
<Link to="/learn/git"><strong>Git과 버전 관리</strong></Link> 코스로 이어 가세요.
<Link to="/learn/git-deep"><strong>Git과 버전 관리</strong></Link> 코스로 이어 가세요.
방금 만든 Git Bash 탭이 바로 교실입니다.
</p>
</div>

View File

@ -283,7 +283,7 @@ export default function ToolVscodePage() {
<div className="warn">
<b>커밋 diff 확인은 습관으로!</b> 실수로 딸려 들어간 <span className="icode">console.log</span>,
테스트하려고 바꿔 같은 것들이 diff 화면에서 걸립니다.
우리 Gitea(edu.awesomedevapp.com) 올라간 커밋은 전체가 보는 기록이에요
우리 Gitea(edu.awesomedevapp.com:3000) 올라간 커밋은 전체가 보는 기록이에요
"무엇을 올리는지 모르고 올리는" 일만은 피해 주세요.
</div>
</Section>
@ -352,7 +352,7 @@ export default function ToolVscodePage() {
<p className="muted">
이제 에디터가 "코드 치는 메모장"에서 <strong>탐색·편집·실행·커밋을 번에 하는
작업대</strong> 됐어요. 섹션 4에서 맛본 Git을 제대로 배우고 싶다면{' '}
<Link to="/learn/git"><strong>Git과 협업</strong></Link> 코스로,
<Link to="/learn/git-deep"><strong>Git과 협업</strong></Link> 코스로,
갈아 칼로 바로 요리를 시작하고 싶다면{' '}
<Link to="/learn/coding"><strong>코딩 기초</strong></Link> 코스의 과제를
오늘 배운 단축키만으로 해결해 보세요.

View File

@ -273,7 +273,7 @@ export default function UserResearchPage() {
제품이 고쳐져야 가장 값진 자리입니다.
</p>
<div className="tip">
<b>관찰 연습</b> 오늘 동료가 플랫폼이나 Gitea(edu.awesomedevapp.com) 쓰는
<b>관찰 연습</b> 오늘 동료가 플랫폼이나 Gitea(edu.awesomedevapp.com:3000) 쓰는
모습을 어깨너머로 1분만 지켜보세요(허락은 받고요!). 마우스가 헤매는 ,
한숨이 나오는 순간, 같은 버튼을 누르는 장면 본인은 불편하다고
말한 없는 것들이 보이기 시작할 거예요.

View File

@ -391,7 +391,7 @@ export default function WifiSecurityPage() {
무력화하는 방패</strong>입니다. 세상에서 가성비가 가장 좋은 보안 습관이에요.
</p>
<div className="tip">
<b>직접 확인해 보기</b> 우리 Gitea(<span className="icode">edu.awesomedevapp.com</span>)
<b>직접 확인해 보기</b> 우리 Gitea(<span className="icode">edu.awesomedevapp.com:3000</span>)
로그인 우상단 프로필 <span className="kbd">설정</span>
<span className="kbd">보안</span>에서 <strong>2단계 인증(TOTP) 등록</strong> 보세요.
폰에 인증 앱을 설치하고 QR을 찍으면 이때 함께 발급되는