feat: [academy] Git 정책 백과사전 추가
- 10개 섹션: 버전관리/기초/원격/브랜치/커밋/협업/충돌/SAM정책/.gitignore/배포 - teal 테마, SVG 일러스트 10개, 도움말 풍선 - 전문용어 툴팁 30개 (git-policy 도메인)
3
.gitignore
vendored
@@ -159,3 +159,6 @@ package-lock.json
|
||||
|
||||
# 검사 기준 이미지는 프로젝트 자산으로 추적
|
||||
!public/img/inspection/
|
||||
|
||||
# 아카데미 SVG 일러스트는 프로젝트 자산으로 추적
|
||||
!public/images/academy/**/*.svg
|
||||
|
||||
@@ -79,4 +79,22 @@ public function envManagement(Request $request): View|Response
|
||||
|
||||
return view('academy.env-management');
|
||||
}
|
||||
|
||||
public function gitPolicy(Request $request): View|Response
|
||||
{
|
||||
if ($request->header('HX-Request')) {
|
||||
return response('', 200)->header('HX-Redirect', route('academy.git-policy'));
|
||||
}
|
||||
|
||||
return view('academy.git-policy');
|
||||
}
|
||||
|
||||
public function nginxEncyclopedia(Request $request): View|Response
|
||||
{
|
||||
if ($request->header('HX-Request')) {
|
||||
return response('', 200)->header('HX-Redirect', route('academy.nginx-encyclopedia'));
|
||||
}
|
||||
|
||||
return view('academy.nginx-encyclopedia');
|
||||
}
|
||||
}
|
||||
|
||||
114
public/images/academy/git-policy/1.svg
Normal file
@@ -0,0 +1,114 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg1" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="tealGlow" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#5eead4" stop-opacity="0.3"/>
|
||||
<stop offset="100%" stop-color="#5eead4" stop-opacity="0"/>
|
||||
</linearGradient>
|
||||
<filter id="glow1">
|
||||
<feGaussianBlur stdDeviation="3" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg1)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="50" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">버전 관리의 필요성</text>
|
||||
|
||||
<!-- Left side: Chaos -->
|
||||
<text x="190" y="95" text-anchor="middle" font-family="sans-serif" font-size="16" fill="#ccfbf1" opacity="0.7">Before</text>
|
||||
|
||||
<!-- Chaotic files -->
|
||||
<g transform="translate(60, 110)">
|
||||
<!-- File 1 - tilted -->
|
||||
<g transform="rotate(-8, 130, 60)">
|
||||
<rect x="30" y="20" width="200" height="45" rx="6" fill="#1e293b" stroke="#f87171" stroke-width="1.5" opacity="0.9"/>
|
||||
<rect x="30" y="20" width="30" height="45" rx="6" fill="#f87171" opacity="0.2"/>
|
||||
<text x="70" y="48" font-family="sans-serif" font-size="11" fill="#fca5a5">견적서_최종.xlsx</text>
|
||||
</g>
|
||||
<!-- File 2 - tilted other way -->
|
||||
<g transform="rotate(5, 130, 120)">
|
||||
<rect x="20" y="85" width="230" height="45" rx="6" fill="#1e293b" stroke="#f87171" stroke-width="1.5" opacity="0.9"/>
|
||||
<rect x="20" y="85" width="30" height="45" rx="6" fill="#f87171" opacity="0.2"/>
|
||||
<text x="60" y="113" font-family="sans-serif" font-size="11" fill="#fca5a5">견적서_진짜최종.xlsx</text>
|
||||
</g>
|
||||
<!-- File 3 -->
|
||||
<g transform="rotate(-3, 130, 180)">
|
||||
<rect x="40" y="150" width="240" height="45" rx="6" fill="#1e293b" stroke="#f87171" stroke-width="1.5" opacity="0.9"/>
|
||||
<rect x="40" y="150" width="30" height="45" rx="6" fill="#f87171" opacity="0.2"/>
|
||||
<text x="80" y="178" font-family="sans-serif" font-size="11" fill="#fca5a5">견적서_최종_v3.xlsx</text>
|
||||
</g>
|
||||
<!-- File 4 -->
|
||||
<g transform="rotate(7, 130, 240)">
|
||||
<rect x="15" y="215" width="260" height="45" rx="6" fill="#1e293b" stroke="#f87171" stroke-width="1.5" opacity="0.9"/>
|
||||
<rect x="15" y="215" width="30" height="45" rx="6" fill="#f87171" opacity="0.2"/>
|
||||
<text x="55" y="243" font-family="sans-serif" font-size="11" fill="#fca5a5">견적서_최종_수정_Final.xlsx</text>
|
||||
</g>
|
||||
<!-- File 5 -->
|
||||
<g transform="rotate(-6, 130, 300)">
|
||||
<rect x="25" y="280" width="250" height="45" rx="6" fill="#1e293b" stroke="#f87171" stroke-width="1.5" opacity="0.9"/>
|
||||
<rect x="25" y="280" width="30" height="45" rx="6" fill="#f87171" opacity="0.2"/>
|
||||
<text x="65" y="308" font-family="sans-serif" font-size="11" fill="#fca5a5">견적서_최종_v3_진짜(2).xlsx</text>
|
||||
</g>
|
||||
<!-- Question marks -->
|
||||
<text x="260" y="70" font-family="sans-serif" font-size="24" fill="#f87171" opacity="0.6">?</text>
|
||||
<text x="10" y="160" font-family="sans-serif" font-size="20" fill="#f87171" opacity="0.5">?</text>
|
||||
<text x="270" y="260" font-family="sans-serif" font-size="28" fill="#f87171" opacity="0.4">?</text>
|
||||
</g>
|
||||
|
||||
<!-- Red X icon -->
|
||||
<circle cx="190" cy="500" r="24" fill="#f87171" opacity="0.15"/>
|
||||
<text x="190" y="508" text-anchor="middle" font-family="sans-serif" font-size="24" font-weight="bold" fill="#f87171">✕</text>
|
||||
<text x="190" y="545" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#fca5a5">혼란</text>
|
||||
|
||||
<!-- Center Arrow -->
|
||||
<g filter="url(#glow1)">
|
||||
<line x1="370" y1="300" x2="430" y2="300" stroke="#5eead4" stroke-width="3"/>
|
||||
<polygon points="430,290 450,300 430,310" fill="#5eead4"/>
|
||||
</g>
|
||||
<text x="410" y="330" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#2dd4bf">Git</text>
|
||||
|
||||
<!-- Right side: Clean Git timeline -->
|
||||
<text x="610" y="95" text-anchor="middle" font-family="sans-serif" font-size="16" fill="#ccfbf1" opacity="0.7">After</text>
|
||||
|
||||
<!-- Git timeline vertical line -->
|
||||
<line x1="520" y1="130" x2="520" y2="460" stroke="#5eead4" stroke-width="3" opacity="0.4"/>
|
||||
|
||||
<!-- Commit 1 -->
|
||||
<circle cx="520" cy="160" r="8" fill="#5eead4"/>
|
||||
<rect x="545" y="143" width="200" height="34" rx="8" fill="#134e4a" stroke="#5eead4" stroke-width="1" opacity="0.8"/>
|
||||
<text x="560" y="165" font-family="sans-serif" font-size="12" fill="#ccfbf1">v1.0 - 견적서 초안 작성</text>
|
||||
|
||||
<!-- Commit 2 -->
|
||||
<circle cx="520" cy="230" r="8" fill="#5eead4"/>
|
||||
<rect x="545" y="213" width="200" height="34" rx="8" fill="#134e4a" stroke="#5eead4" stroke-width="1" opacity="0.8"/>
|
||||
<text x="560" y="235" font-family="sans-serif" font-size="12" fill="#ccfbf1">v1.1 - 금액 수정</text>
|
||||
|
||||
<!-- Commit 3 -->
|
||||
<circle cx="520" cy="300" r="8" fill="#5eead4"/>
|
||||
<rect x="545" y="283" width="200" height="34" rx="8" fill="#134e4a" stroke="#5eead4" stroke-width="1" opacity="0.8"/>
|
||||
<text x="560" y="305" font-family="sans-serif" font-size="12" fill="#ccfbf1">v1.2 - 할인 조건 추가</text>
|
||||
|
||||
<!-- Commit 4 -->
|
||||
<circle cx="520" cy="370" r="8" fill="#5eead4"/>
|
||||
<rect x="545" y="353" width="200" height="34" rx="8" fill="#134e4a" stroke="#5eead4" stroke-width="1" opacity="0.8"/>
|
||||
<text x="560" y="375" font-family="sans-serif" font-size="12" fill="#ccfbf1">v1.3 - 최종 확정</text>
|
||||
|
||||
<!-- Commit 5 (latest) -->
|
||||
<circle cx="520" cy="440" r="10" fill="#2dd4bf" stroke="#5eead4" stroke-width="2"/>
|
||||
<rect x="545" y="423" width="200" height="34" rx="8" fill="#134e4a" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<text x="560" y="445" font-family="sans-serif" font-size="12" font-weight="bold" fill="#ccfbf1">v2.0 - 견적서 리뉴얼</text>
|
||||
|
||||
<!-- Green checkmark icon -->
|
||||
<circle cx="610" cy="500" r="24" fill="#5eead4" opacity="0.15"/>
|
||||
<text x="610" y="508" text-anchor="middle" font-family="sans-serif" font-size="22" font-weight="bold" fill="#5eead4">✓</text>
|
||||
<text x="610" y="545" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#99f6e4">체계적 관리</text>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="400" y="585" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#ccfbf1" opacity="0.5">파일 복사 → Git 버전 관리로 전환</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.4 KiB |
232
public/images/academy/git-policy/10.svg
Normal file
@@ -0,0 +1,232 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg10" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow10">
|
||||
<feDropShadow dx="0" dy="3" stdDeviation="5" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow10">
|
||||
<feGaussianBlur stdDeviation="3" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<linearGradient id="conveyorGrad" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#134e4a"/>
|
||||
<stop offset="100%" stop-color="#1e3a5f"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="stageGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#1e293b"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg10)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">CI/CD 파이프라인</text>
|
||||
<text x="400" y="75" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">코드 변경부터 서버 배포까지 자동화된 흐름</text>
|
||||
|
||||
<!-- Conveyor belt base -->
|
||||
<rect x="40" y="280" width="720" height="8" rx="4" fill="url(#conveyorGrad)" opacity="0.6"/>
|
||||
<!-- Conveyor belt rollers -->
|
||||
<circle cx="80" cy="284" r="10" fill="#0f172a" stroke="#2dd4bf" stroke-width="1.5" opacity="0.4"/>
|
||||
<circle cx="200" cy="284" r="10" fill="#0f172a" stroke="#2dd4bf" stroke-width="1.5" opacity="0.4"/>
|
||||
<circle cx="320" cy="284" r="10" fill="#0f172a" stroke="#2dd4bf" stroke-width="1.5" opacity="0.4"/>
|
||||
<circle cx="440" cy="284" r="10" fill="#0f172a" stroke="#2dd4bf" stroke-width="1.5" opacity="0.4"/>
|
||||
<circle cx="560" cy="284" r="10" fill="#0f172a" stroke="#2dd4bf" stroke-width="1.5" opacity="0.4"/>
|
||||
<circle cx="680" cy="284" r="10" fill="#0f172a" stroke="#2dd4bf" stroke-width="1.5" opacity="0.4"/>
|
||||
<!-- Belt movement lines -->
|
||||
<line x1="80" y1="276" x2="200" y2="276" stroke="#2dd4bf" stroke-width="0.5" opacity="0.3"/>
|
||||
<line x1="200" y1="276" x2="320" y2="276" stroke="#2dd4bf" stroke-width="0.5" opacity="0.3"/>
|
||||
<line x1="320" y1="276" x2="440" y2="276" stroke="#2dd4bf" stroke-width="0.5" opacity="0.3"/>
|
||||
<line x1="440" y1="276" x2="560" y2="276" stroke="#2dd4bf" stroke-width="0.5" opacity="0.3"/>
|
||||
<line x1="560" y1="276" x2="680" y2="276" stroke="#2dd4bf" stroke-width="0.5" opacity="0.3"/>
|
||||
|
||||
<!-- Stage 1: Code -->
|
||||
<g filter="url(#shadow10)" transform="translate(35, 115)">
|
||||
<rect x="0" y="0" width="105" height="150" rx="14" fill="url(#stageGrad)" stroke="#5eead4" stroke-width="1.5"/>
|
||||
<!-- Number -->
|
||||
<circle cx="52" cy="25" r="13" fill="#5eead4" opacity="0.15"/>
|
||||
<text x="52" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#5eead4">1</text>
|
||||
<!-- Code icon -->
|
||||
<g transform="translate(25, 45)">
|
||||
<text x="28" y="18" text-anchor="middle" font-family="monospace" font-size="28" fill="#5eead4" opacity="0.8"></></text>
|
||||
</g>
|
||||
<text x="52" y="105" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#ccfbf1">Code</text>
|
||||
<text x="52" y="122" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#99f6e4">코드 작성</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 1->2 -->
|
||||
<g filter="url(#glow10)">
|
||||
<line x1="145" y1="190" x2="155" y2="190" stroke="#5eead4" stroke-width="2"/>
|
||||
<polygon points="155,184 168,190 155,196" fill="#5eead4"/>
|
||||
</g>
|
||||
|
||||
<!-- Stage 2: Git Push -->
|
||||
<g filter="url(#shadow10)" transform="translate(160, 115)">
|
||||
<rect x="0" y="0" width="105" height="150" rx="14" fill="url(#stageGrad)" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<circle cx="52" cy="25" r="13" fill="#2dd4bf" opacity="0.15"/>
|
||||
<text x="52" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#2dd4bf">2</text>
|
||||
<!-- Git icon -->
|
||||
<g transform="translate(22, 45)">
|
||||
<circle cx="30" cy="10" r="8" fill="none" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<line x1="30" y1="18" x2="30" y2="30" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<line x1="30" y1="24" x2="45" y2="14" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<circle cx="45" cy="10" r="5" fill="none" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<circle cx="30" cy="32" r="5" fill="none" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
</g>
|
||||
<text x="52" y="105" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#ccfbf1">Git Push</text>
|
||||
<text x="52" y="122" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#99f6e4">코드 푸시</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 2->3 -->
|
||||
<g filter="url(#glow10)">
|
||||
<line x1="270" y1="190" x2="280" y2="190" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<polygon points="280,184 293,190 280,196" fill="#2dd4bf"/>
|
||||
</g>
|
||||
|
||||
<!-- Stage 3: Build (Jenkins) -->
|
||||
<g filter="url(#shadow10)" transform="translate(285, 115)">
|
||||
<rect x="0" y="0" width="105" height="150" rx="14" fill="url(#stageGrad)" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<circle cx="52" cy="25" r="13" fill="#fbbf24" opacity="0.15"/>
|
||||
<text x="52" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#fbbf24">3</text>
|
||||
<!-- Build/Gear icon -->
|
||||
<g transform="translate(25, 44)">
|
||||
<circle cx="27" cy="18" r="12" fill="none" stroke="#fbbf24" stroke-width="2"/>
|
||||
<circle cx="27" cy="18" r="5" fill="none" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<!-- Gear teeth -->
|
||||
<line x1="27" y1="2" x2="27" y2="7" stroke="#fbbf24" stroke-width="3"/>
|
||||
<line x1="27" y1="29" x2="27" y2="34" stroke="#fbbf24" stroke-width="3"/>
|
||||
<line x1="11" y1="18" x2="16" y2="18" stroke="#fbbf24" stroke-width="3"/>
|
||||
<line x1="38" y1="18" x2="43" y2="18" stroke="#fbbf24" stroke-width="3"/>
|
||||
<line x1="15" y1="7" x2="19" y2="11" stroke="#fbbf24" stroke-width="3"/>
|
||||
<line x1="35" y1="25" x2="39" y2="29" stroke="#fbbf24" stroke-width="3"/>
|
||||
<line x1="35" y1="7" x2="39" y2="11" stroke="#fbbf24" stroke-width="3" transform="rotate(90,37,9)"/>
|
||||
<line x1="15" y1="25" x2="19" y2="29" stroke="#fbbf24" stroke-width="3" transform="rotate(90,17,27)"/>
|
||||
</g>
|
||||
<text x="52" y="105" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#ccfbf1">Build</text>
|
||||
<text x="52" y="122" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#fbbf24">빌드</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 3->4 -->
|
||||
<g filter="url(#glow10)">
|
||||
<line x1="395" y1="190" x2="405" y2="190" stroke="#fbbf24" stroke-width="2"/>
|
||||
<polygon points="405,184 418,190 405,196" fill="#fbbf24"/>
|
||||
</g>
|
||||
|
||||
<!-- Stage 4: Test -->
|
||||
<g filter="url(#shadow10)" transform="translate(410, 115)">
|
||||
<rect x="0" y="0" width="105" height="150" rx="14" fill="url(#stageGrad)" stroke="#818cf8" stroke-width="1.5"/>
|
||||
<circle cx="52" cy="25" r="13" fill="#818cf8" opacity="0.15"/>
|
||||
<text x="52" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#818cf8">4</text>
|
||||
<!-- Test/Checkmark icon -->
|
||||
<g transform="translate(22, 45)">
|
||||
<rect x="5" y="0" width="45" height="35" rx="6" fill="none" stroke="#818cf8" stroke-width="1.5"/>
|
||||
<polyline points="15,15 23,24 40,8" fill="none" stroke="#818cf8" stroke-width="2.5"/>
|
||||
</g>
|
||||
<text x="52" y="105" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#ccfbf1">Test</text>
|
||||
<text x="52" y="122" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#a5b4fc">자동 테스트</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 4->5 -->
|
||||
<g filter="url(#glow10)">
|
||||
<line x1="520" y1="190" x2="530" y2="190" stroke="#818cf8" stroke-width="2"/>
|
||||
<polygon points="530,184 543,190 530,196" fill="#818cf8"/>
|
||||
</g>
|
||||
|
||||
<!-- Stage 5: Deploy -->
|
||||
<g filter="url(#shadow10)" transform="translate(535, 115)">
|
||||
<rect x="0" y="0" width="105" height="150" rx="14" fill="url(#stageGrad)" stroke="#a78bfa" stroke-width="1.5"/>
|
||||
<circle cx="52" cy="25" r="13" fill="#a78bfa" opacity="0.15"/>
|
||||
<text x="52" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#a78bfa">5</text>
|
||||
<!-- Rocket/Deploy icon -->
|
||||
<g transform="translate(28, 42)">
|
||||
<path d="M25,0 Q35,8 35,22 L25,30 L15,22 Q15,8 25,0 Z" fill="none" stroke="#a78bfa" stroke-width="2"/>
|
||||
<circle cx="25" cy="14" r="4" fill="#a78bfa" opacity="0.4"/>
|
||||
<line x1="15" y1="22" x2="8" y2="32" stroke="#a78bfa" stroke-width="1.5"/>
|
||||
<line x1="35" y1="22" x2="42" y2="32" stroke="#a78bfa" stroke-width="1.5"/>
|
||||
<!-- Flame -->
|
||||
<path d="M20,30 Q25,40 30,30" fill="#fbbf24" opacity="0.5"/>
|
||||
</g>
|
||||
<text x="52" y="105" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#ccfbf1">Deploy</text>
|
||||
<text x="52" y="122" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#c4b5fd">배포</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 5->6 -->
|
||||
<g filter="url(#glow10)">
|
||||
<line x1="645" y1="190" x2="655" y2="190" stroke="#a78bfa" stroke-width="2"/>
|
||||
<polygon points="655,184 668,190 655,196" fill="#4ade80"/>
|
||||
</g>
|
||||
|
||||
<!-- Stage 6: Server -->
|
||||
<g filter="url(#shadow10)" transform="translate(660, 115)">
|
||||
<rect x="0" y="0" width="105" height="150" rx="14" fill="url(#stageGrad)" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<circle cx="52" cy="25" r="13" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="52" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" font-weight="bold" fill="#4ade80">6</text>
|
||||
<!-- Server icon -->
|
||||
<g transform="translate(18, 42)">
|
||||
<rect x="5" y="0" width="55" height="16" rx="4" fill="none" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<circle cx="48" cy="8" r="3" fill="#4ade80"/>
|
||||
<rect x="5" y="20" width="55" height="16" rx="4" fill="none" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<circle cx="48" cy="28" r="3" fill="#4ade80"/>
|
||||
<line x1="12" y1="8" x2="35" y2="8" stroke="#4ade80" stroke-width="1" opacity="0.5"/>
|
||||
<line x1="12" y1="28" x2="35" y2="28" stroke="#4ade80" stroke-width="1" opacity="0.5"/>
|
||||
</g>
|
||||
<text x="52" y="105" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#ccfbf1">Server</text>
|
||||
<text x="52" y="122" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#86efac">운영 서버</text>
|
||||
</g>
|
||||
|
||||
<!-- Progress bar below conveyor -->
|
||||
<g transform="translate(40, 310)">
|
||||
<rect x="0" y="0" width="720" height="4" rx="2" fill="#1e293b"/>
|
||||
<!-- Animated-like progress segments -->
|
||||
<rect x="0" y="0" width="120" height="4" rx="2" fill="#5eead4" opacity="0.6"/>
|
||||
<rect x="120" y="0" width="120" height="4" rx="2" fill="#2dd4bf" opacity="0.6"/>
|
||||
<rect x="240" y="0" width="120" height="4" rx="2" fill="#fbbf24" opacity="0.6"/>
|
||||
<rect x="360" y="0" width="120" height="4" rx="2" fill="#818cf8" opacity="0.6"/>
|
||||
<rect x="480" y="0" width="120" height="4" rx="2" fill="#a78bfa" opacity="0.6"/>
|
||||
<rect x="600" y="0" width="120" height="4" rx="2" fill="#4ade80" opacity="0.6"/>
|
||||
</g>
|
||||
|
||||
<!-- Detail boxes below -->
|
||||
<!-- CI section -->
|
||||
<g transform="translate(40, 340)">
|
||||
<rect x="0" y="0" width="350" height="90" rx="12" fill="#0f172a" stroke="#5eead4" stroke-width="1" opacity="0.7"/>
|
||||
<text x="15" y="25" font-family="sans-serif" font-size="14" font-weight="bold" fill="#5eead4">CI (Continuous Integration)</text>
|
||||
<text x="15" y="48" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.7">코드 변경 시 자동으로 빌드하고</text>
|
||||
<text x="15" y="66" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.7">테스트를 실행하여 품질을 보장합니다</text>
|
||||
<rect x="260" y="50" width="70" height="24" rx="12" fill="#5eead4" opacity="0.1" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="295" y="66" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#5eead4">자동화</text>
|
||||
</g>
|
||||
|
||||
<!-- CD section -->
|
||||
<g transform="translate(410, 340)">
|
||||
<rect x="0" y="0" width="350" height="90" rx="12" fill="#0f172a" stroke="#a78bfa" stroke-width="1" opacity="0.7"/>
|
||||
<text x="15" y="25" font-family="sans-serif" font-size="14" font-weight="bold" fill="#a78bfa">CD (Continuous Deployment)</text>
|
||||
<text x="15" y="48" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.7">테스트를 통과한 코드를 자동으로</text>
|
||||
<text x="15" y="66" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.7">서버에 배포하여 신속하게 반영합니다</text>
|
||||
<rect x="260" y="50" width="70" height="24" rx="12" fill="#a78bfa" opacity="0.1" stroke="#a78bfa" stroke-width="1"/>
|
||||
<text x="295" y="66" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#a78bfa">자동화</text>
|
||||
</g>
|
||||
|
||||
<!-- Bottom workflow summary -->
|
||||
<g transform="translate(60, 460)">
|
||||
<rect x="0" y="0" width="680" height="45" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.6"/>
|
||||
<text x="15" y="20" font-family="sans-serif" font-size="12" fill="#5eead4">개발자</text>
|
||||
<text x="65" y="20" font-family="sans-serif" font-size="12" fill="#64748b">코드 작성 + push</text>
|
||||
<text x="195" y="20" font-family="sans-serif" font-size="14" fill="#334155">-></text>
|
||||
<text x="220" y="20" font-family="sans-serif" font-size="12" fill="#fbbf24">CI 서버</text>
|
||||
<text x="275" y="20" font-family="sans-serif" font-size="12" fill="#64748b">빌드 + 테스트</text>
|
||||
<text x="395" y="20" font-family="sans-serif" font-size="14" fill="#334155">-></text>
|
||||
<text x="420" y="20" font-family="sans-serif" font-size="12" fill="#a78bfa">CD</text>
|
||||
<text x="445" y="20" font-family="sans-serif" font-size="12" fill="#64748b">자동 배포</text>
|
||||
<text x="525" y="20" font-family="sans-serif" font-size="14" fill="#334155">-></text>
|
||||
<text x="555" y="20" font-family="sans-serif" font-size="12" fill="#4ade80">운영 서버 반영</text>
|
||||
<text x="340" y="38" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#ccfbf1" opacity="0.4">수동 작업 최소화, 빠른 피드백, 안정적 배포</text>
|
||||
</g>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="400" y="540" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.4">코드 커밋부터 서버 배포까지 자동화된 컨베이어 벨트</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 14 KiB |
135
public/images/academy/git-policy/2.svg
Normal file
@@ -0,0 +1,135 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg2" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="boxGrad1" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#134e4a"/>
|
||||
<stop offset="100%" stop-color="#0f3d3a"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="boxGrad2" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#164e63"/>
|
||||
<stop offset="100%" stop-color="#0e3a4a"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="boxGrad3" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#1e3a5f"/>
|
||||
<stop offset="100%" stop-color="#152e4d"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow2">
|
||||
<feDropShadow dx="0" dy="4" stdDeviation="8" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow2">
|
||||
<feGaussianBlur stdDeviation="2" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg2)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="55" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">Git 3단계 구조</text>
|
||||
<text x="400" y="82" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">코드가 저장소에 기록되기까지의 흐름</text>
|
||||
|
||||
<!-- Stage 1: Working Directory -->
|
||||
<g filter="url(#shadow2)">
|
||||
<rect x="50" y="160" width="200" height="280" rx="16" fill="url(#boxGrad1)" stroke="#5eead4" stroke-width="2"/>
|
||||
</g>
|
||||
<!-- Desk icon -->
|
||||
<g transform="translate(115, 195)">
|
||||
<rect x="0" y="30" width="70" height="5" rx="2" fill="#5eead4"/>
|
||||
<rect x="5" y="35" width="8" height="25" rx="1" fill="#5eead4" opacity="0.6"/>
|
||||
<rect x="57" y="35" width="8" height="25" rx="1" fill="#5eead4" opacity="0.6"/>
|
||||
<!-- Monitor on desk -->
|
||||
<rect x="15" y="0" width="40" height="28" rx="3" fill="#0f172a" stroke="#5eead4" stroke-width="1.5"/>
|
||||
<rect x="30" y="28" width="10" height="5" fill="#5eead4" opacity="0.5"/>
|
||||
<!-- Code lines on monitor -->
|
||||
<line x1="20" y1="8" x2="42" y2="8" stroke="#2dd4bf" stroke-width="1.5" opacity="0.7"/>
|
||||
<line x1="20" y1="14" x2="36" y2="14" stroke="#99f6e4" stroke-width="1.5" opacity="0.5"/>
|
||||
<line x1="20" y1="20" x2="45" y2="20" stroke="#2dd4bf" stroke-width="1.5" opacity="0.6"/>
|
||||
</g>
|
||||
<text x="150" y="280" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="bold" fill="#ccfbf1">Working</text>
|
||||
<text x="150" y="302" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="bold" fill="#ccfbf1">Directory</text>
|
||||
<text x="150" y="332" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#99f6e4">작업 디렉토리</text>
|
||||
<!-- Description items -->
|
||||
<text x="150" y="370" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">코드를 수정하는</text>
|
||||
<text x="150" y="388" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">실제 작업 공간</text>
|
||||
<!-- Number badge -->
|
||||
<circle cx="80" cy="180" r="14" fill="#5eead4" opacity="0.2"/>
|
||||
<text x="80" y="185" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#5eead4">1</text>
|
||||
|
||||
<!-- Arrow 1: git add -->
|
||||
<g filter="url(#glow2)">
|
||||
<line x1="260" y1="300" x2="290" y2="300" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<polygon points="290,293 305,300 290,307" fill="#5eead4"/>
|
||||
</g>
|
||||
<rect x="260" y="254" width="80" height="28" rx="14" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="300" y="273" text-anchor="middle" font-family="monospace" font-size="12" font-weight="bold" fill="#5eead4">git add</text>
|
||||
|
||||
<!-- Stage 2: Staging Area -->
|
||||
<g filter="url(#shadow2)">
|
||||
<rect x="300" y="160" width="200" height="280" rx="16" fill="url(#boxGrad2)" stroke="#2dd4bf" stroke-width="2"/>
|
||||
</g>
|
||||
<!-- Envelope / Package icon -->
|
||||
<g transform="translate(362, 192)">
|
||||
<rect x="0" y="12" width="70" height="50" rx="5" fill="none" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<polyline points="0,12 35,42 70,12" fill="none" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<!-- Check in envelope -->
|
||||
<polyline points="25,35 32,42 48,26" fill="none" stroke="#5eead4" stroke-width="2.5"/>
|
||||
</g>
|
||||
<text x="400" y="280" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="bold" fill="#ccfbf1">Staging</text>
|
||||
<text x="400" y="302" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="bold" fill="#ccfbf1">Area</text>
|
||||
<text x="400" y="332" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#99f6e4">스테이징 영역</text>
|
||||
<text x="400" y="370" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">커밋할 변경사항을</text>
|
||||
<text x="400" y="388" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">준비하는 공간</text>
|
||||
<!-- Number badge -->
|
||||
<circle cx="330" cy="180" r="14" fill="#2dd4bf" opacity="0.2"/>
|
||||
<text x="330" y="185" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#2dd4bf">2</text>
|
||||
|
||||
<!-- Arrow 2: git commit -->
|
||||
<g filter="url(#glow2)">
|
||||
<line x1="510" y1="300" x2="540" y2="300" stroke="#2dd4bf" stroke-width="2.5"/>
|
||||
<polygon points="540,293 555,300 540,307" fill="#2dd4bf"/>
|
||||
</g>
|
||||
<rect x="497" y="254" width="96" height="28" rx="14" fill="#042f2e" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<text x="545" y="273" text-anchor="middle" font-family="monospace" font-size="12" font-weight="bold" fill="#2dd4bf">git commit</text>
|
||||
|
||||
<!-- Stage 3: Repository -->
|
||||
<g filter="url(#shadow2)">
|
||||
<rect x="550" y="160" width="200" height="280" rx="16" fill="url(#boxGrad3)" stroke="#818cf8" stroke-width="2"/>
|
||||
</g>
|
||||
<!-- Cabinet / Safe icon -->
|
||||
<g transform="translate(615, 190)">
|
||||
<rect x="0" y="0" width="60" height="65" rx="6" fill="none" stroke="#818cf8" stroke-width="2"/>
|
||||
<line x1="0" y1="32" x2="60" y2="32" stroke="#818cf8" stroke-width="1.5"/>
|
||||
<!-- Handles -->
|
||||
<circle cx="42" cy="16" r="4" fill="none" stroke="#a5b4fc" stroke-width="1.5"/>
|
||||
<circle cx="42" cy="48" r="4" fill="none" stroke="#a5b4fc" stroke-width="1.5"/>
|
||||
<!-- Lock -->
|
||||
<rect x="22" y="38" width="16" height="12" rx="2" fill="#818cf8" opacity="0.3"/>
|
||||
<circle cx="30" cy="44" r="2" fill="#a5b4fc"/>
|
||||
</g>
|
||||
<text x="650" y="280" text-anchor="middle" font-family="sans-serif" font-size="16" font-weight="bold" fill="#ccfbf1">Repository</text>
|
||||
<text x="650" y="332" text-anchor="middle" font-family="sans-serif" font-size="13" fill="#a5b4fc">저장소 (.git)</text>
|
||||
<text x="650" y="370" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">변경 이력이</text>
|
||||
<text x="650" y="388" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">영구 보관되는 곳</text>
|
||||
<!-- Number badge -->
|
||||
<circle cx="580" cy="180" r="14" fill="#818cf8" opacity="0.2"/>
|
||||
<text x="580" y="185" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#818cf8">3</text>
|
||||
|
||||
<!-- Bottom flow summary -->
|
||||
<g transform="translate(0, 480)">
|
||||
<rect x="60" y="0" width="680" height="50" rx="12" fill="#042f2e" stroke="#5eead4" stroke-width="1" opacity="0.5"/>
|
||||
<text x="120" y="30" font-family="monospace" font-size="14" fill="#5eead4">코드 수정</text>
|
||||
<text x="242" y="30" font-family="sans-serif" font-size="14" fill="#2dd4bf">→</text>
|
||||
<text x="280" y="30" font-family="monospace" font-size="14" fill="#5eead4">git add</text>
|
||||
<text x="370" y="30" font-family="sans-serif" font-size="14" fill="#2dd4bf">→</text>
|
||||
<text x="400" y="30" font-family="monospace" font-size="14" fill="#5eead4">git commit</text>
|
||||
<text x="520" y="30" font-family="sans-serif" font-size="14" fill="#2dd4bf">→</text>
|
||||
<text x="560" y="30" font-family="monospace" font-size="14" fill="#5eead4">이력 저장 완료</text>
|
||||
</g>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="400" y="570" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.4">수정 → 준비 → 확정, 3단계를 거쳐 코드가 기록됩니다</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.3 KiB |
138
public/images/academy/git-policy/3.svg
Normal file
@@ -0,0 +1,138 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg3" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow3">
|
||||
<feDropShadow dx="0" dy="3" stdDeviation="6" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow3">
|
||||
<feGaussianBlur stdDeviation="4" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg3)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="50" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">원격 저장소</text>
|
||||
<text x="400" y="77" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">여러 개발자가 하나의 원격 저장소를 통해 협업합니다</text>
|
||||
|
||||
<!-- Central Server (Top) -->
|
||||
<g filter="url(#shadow3)" transform="translate(310, 110)">
|
||||
<rect x="0" y="0" width="180" height="120" rx="14" fill="#134e4a" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<!-- Server rack icon -->
|
||||
<g transform="translate(55, 12)">
|
||||
<rect x="0" y="0" width="70" height="18" rx="4" fill="#0f172a" stroke="#5eead4" stroke-width="1.2"/>
|
||||
<circle cx="56" cy="9" r="3" fill="#5eead4"/>
|
||||
<line x1="8" y1="9" x2="40" y2="9" stroke="#2dd4bf" stroke-width="1.5" opacity="0.5"/>
|
||||
|
||||
<rect x="0" y="24" width="70" height="18" rx="4" fill="#0f172a" stroke="#5eead4" stroke-width="1.2"/>
|
||||
<circle cx="56" cy="33" r="3" fill="#2dd4bf"/>
|
||||
<line x1="8" y1="33" x2="40" y2="33" stroke="#2dd4bf" stroke-width="1.5" opacity="0.5"/>
|
||||
|
||||
<rect x="0" y="48" width="70" height="18" rx="4" fill="#0f172a" stroke="#5eead4" stroke-width="1.2"/>
|
||||
<circle cx="56" cy="57" r="3" fill="#99f6e4" opacity="0.7"/>
|
||||
<line x1="8" y1="57" x2="40" y2="57" stroke="#2dd4bf" stroke-width="1.5" opacity="0.5"/>
|
||||
</g>
|
||||
<text x="90" y="100" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">Origin (Remote)</text>
|
||||
</g>
|
||||
|
||||
<!-- Glow around server -->
|
||||
<circle cx="400" cy="170" r="90" fill="#5eead4" opacity="0.03" filter="url(#glow3)"/>
|
||||
|
||||
<!-- Computer 1 (Left) -->
|
||||
<g filter="url(#shadow3)" transform="translate(60, 400)">
|
||||
<rect x="0" y="0" width="170" height="110" rx="12" fill="#1e293b" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<!-- Monitor -->
|
||||
<g transform="translate(40, 15)">
|
||||
<rect x="0" y="0" width="55" height="38" rx="4" fill="#0f172a" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<line x1="6" y1="10" x2="35" y2="10" stroke="#5eead4" stroke-width="1" opacity="0.6"/>
|
||||
<line x1="6" y1="17" x2="28" y2="17" stroke="#5eead4" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="6" y1="24" x2="40" y2="24" stroke="#5eead4" stroke-width="1" opacity="0.5"/>
|
||||
<rect x="20" y="38" width="15" height="4" fill="#2dd4bf" opacity="0.4"/>
|
||||
<rect x="12" y="42" width="30" height="3" rx="1" fill="#2dd4bf" opacity="0.3"/>
|
||||
</g>
|
||||
<!-- Keyboard -->
|
||||
<g transform="translate(30, 65)">
|
||||
<rect x="0" y="0" width="70" height="20" rx="3" fill="#334155" stroke="#2dd4bf" stroke-width="0.5" opacity="0.5"/>
|
||||
</g>
|
||||
<text x="85" y="100" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1">개발자 A</text>
|
||||
</g>
|
||||
|
||||
<!-- Computer 2 (Center) -->
|
||||
<g filter="url(#shadow3)" transform="translate(315, 420)">
|
||||
<rect x="0" y="0" width="170" height="110" rx="12" fill="#1e293b" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<g transform="translate(40, 15)">
|
||||
<rect x="0" y="0" width="55" height="38" rx="4" fill="#0f172a" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<line x1="6" y1="10" x2="35" y2="10" stroke="#5eead4" stroke-width="1" opacity="0.6"/>
|
||||
<line x1="6" y1="17" x2="28" y2="17" stroke="#5eead4" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="6" y1="24" x2="40" y2="24" stroke="#5eead4" stroke-width="1" opacity="0.5"/>
|
||||
<rect x="20" y="38" width="15" height="4" fill="#2dd4bf" opacity="0.4"/>
|
||||
<rect x="12" y="42" width="30" height="3" rx="1" fill="#2dd4bf" opacity="0.3"/>
|
||||
</g>
|
||||
<g transform="translate(30, 65)">
|
||||
<rect x="0" y="0" width="70" height="20" rx="3" fill="#334155" stroke="#2dd4bf" stroke-width="0.5" opacity="0.5"/>
|
||||
</g>
|
||||
<text x="85" y="100" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1">개발자 B</text>
|
||||
</g>
|
||||
|
||||
<!-- Computer 3 (Right) -->
|
||||
<g filter="url(#shadow3)" transform="translate(570, 400)">
|
||||
<rect x="0" y="0" width="170" height="110" rx="12" fill="#1e293b" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<g transform="translate(40, 15)">
|
||||
<rect x="0" y="0" width="55" height="38" rx="4" fill="#0f172a" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<line x1="6" y1="10" x2="35" y2="10" stroke="#5eead4" stroke-width="1" opacity="0.6"/>
|
||||
<line x1="6" y1="17" x2="28" y2="17" stroke="#5eead4" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="6" y1="24" x2="40" y2="24" stroke="#5eead4" stroke-width="1" opacity="0.5"/>
|
||||
<rect x="20" y="38" width="15" height="4" fill="#2dd4bf" opacity="0.4"/>
|
||||
<rect x="12" y="42" width="30" height="3" rx="1" fill="#2dd4bf" opacity="0.3"/>
|
||||
</g>
|
||||
<g transform="translate(30, 65)">
|
||||
<rect x="0" y="0" width="70" height="20" rx="3" fill="#334155" stroke="#2dd4bf" stroke-width="0.5" opacity="0.5"/>
|
||||
</g>
|
||||
<text x="85" y="100" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1">개발자 C</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrows: Push (up) from each computer -->
|
||||
<!-- Computer A push -->
|
||||
<line x1="125" y1="395" x2="350" y2="240" stroke="#5eead4" stroke-width="2" stroke-dasharray="6,3" opacity="0.7"/>
|
||||
<polygon points="350,240 342,248 338,238" fill="#5eead4" opacity="0.8"/>
|
||||
<rect x="175" y="295" width="55" height="22" rx="11" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="202" y="310" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#5eead4">push</text>
|
||||
|
||||
<!-- Computer A pull -->
|
||||
<line x1="360" y1="235" x2="140" y2="400" stroke="#2dd4bf" stroke-width="2" opacity="0.5"/>
|
||||
<polygon points="140,400 152,398 148,388" fill="#2dd4bf" opacity="0.6"/>
|
||||
<rect x="200" y="330" width="46" height="22" rx="11" fill="#042f2e" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<text x="223" y="345" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#2dd4bf">pull</text>
|
||||
|
||||
<!-- Computer B push -->
|
||||
<line x1="400" y1="415" x2="400" y2="240" stroke="#5eead4" stroke-width="2" stroke-dasharray="6,3" opacity="0.7"/>
|
||||
<polygon points="393,240 400,228 407,240" fill="#5eead4" opacity="0.8"/>
|
||||
<rect x="410" y="310" width="55" height="22" rx="11" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="437" y="325" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#5eead4">push</text>
|
||||
|
||||
<!-- Computer B pull -->
|
||||
<line x1="390" y1="235" x2="390" y2="415" stroke="#2dd4bf" stroke-width="2" opacity="0.5"/>
|
||||
<polygon points="383,415 390,427 397,415" fill="#2dd4bf" opacity="0.6"/>
|
||||
<rect x="340" y="340" width="46" height="22" rx="11" fill="#042f2e" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<text x="363" y="355" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#2dd4bf">pull</text>
|
||||
|
||||
<!-- Computer C push -->
|
||||
<line x1="675" y1="395" x2="455" y2="240" stroke="#5eead4" stroke-width="2" stroke-dasharray="6,3" opacity="0.7"/>
|
||||
<polygon points="455,240 458,252 465,244" fill="#5eead4" opacity="0.8"/>
|
||||
<rect x="570" y="295" width="55" height="22" rx="11" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="597" y="310" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#5eead4">push</text>
|
||||
|
||||
<!-- Computer C pull -->
|
||||
<line x1="445" y1="235" x2="660" y2="400" stroke="#2dd4bf" stroke-width="2" opacity="0.5"/>
|
||||
<polygon points="660,400 648,388 648,400" fill="#2dd4bf" opacity="0.6"/>
|
||||
<rect x="555" y="330" width="46" height="22" rx="11" fill="#042f2e" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<text x="578" y="345" text-anchor="middle" font-family="monospace" font-size="10" font-weight="bold" fill="#2dd4bf">pull</text>
|
||||
|
||||
<!-- Bottom note -->
|
||||
<text x="400" y="575" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.4">push로 업로드, pull로 다운로드 — 원격 저장소를 통한 협업</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.4 KiB |
120
public/images/academy/git-policy/4.svg
Normal file
@@ -0,0 +1,120 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg4" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="glow4">
|
||||
<feGaussianBlur stdDeviation="2" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg4)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">브랜치 전략</text>
|
||||
<text x="400" y="73" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">브랜치를 활용한 안전한 병렬 개발</text>
|
||||
|
||||
<!-- Legend -->
|
||||
<g transform="translate(520, 90)">
|
||||
<rect x="0" y="0" width="240" height="115" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.8"/>
|
||||
<circle cx="22" cy="22" r="6" fill="#5eead4"/>
|
||||
<text x="38" y="27" font-family="sans-serif" font-size="12" fill="#ccfbf1">main (배포)</text>
|
||||
<circle cx="22" cy="48" r="6" fill="#2dd4bf"/>
|
||||
<text x="38" y="53" font-family="sans-serif" font-size="12" fill="#ccfbf1">develop (개발)</text>
|
||||
<circle cx="22" cy="74" r="6" fill="#99f6e4"/>
|
||||
<text x="38" y="79" font-family="sans-serif" font-size="12" fill="#ccfbf1">feature/* (기능)</text>
|
||||
<circle cx="22" cy="100" r="6" fill="#f87171"/>
|
||||
<text x="38" y="105" font-family="sans-serif" font-size="12" fill="#ccfbf1">hotfix/* (긴급수정)</text>
|
||||
</g>
|
||||
|
||||
<!-- Branch labels on left -->
|
||||
<text x="55" y="195" text-anchor="end" font-family="monospace" font-size="13" font-weight="bold" fill="#5eead4">main</text>
|
||||
<text x="55" y="285" text-anchor="end" font-family="monospace" font-size="13" font-weight="bold" fill="#2dd4bf">develop</text>
|
||||
<text x="55" y="375" text-anchor="end" font-family="monospace" font-size="13" font-weight="bold" fill="#99f6e4">feature/*</text>
|
||||
<text x="55" y="465" text-anchor="end" font-family="monospace" font-size="13" font-weight="bold" fill="#f87171">hotfix/*</text>
|
||||
|
||||
<!-- main branch line -->
|
||||
<line x1="80" y1="190" x2="750" y2="190" stroke="#5eead4" stroke-width="3" opacity="0.4"/>
|
||||
<!-- main commits -->
|
||||
<circle cx="120" cy="190" r="8" fill="#5eead4" filter="url(#glow4)"/>
|
||||
<circle cx="350" cy="190" r="8" fill="#5eead4" filter="url(#glow4)"/>
|
||||
<circle cx="650" cy="190" r="10" fill="#5eead4" stroke="#ccfbf1" stroke-width="2" filter="url(#glow4)"/>
|
||||
<!-- Tags -->
|
||||
<rect x="95" y="155" width="50" height="20" rx="10" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="120" y="169" text-anchor="middle" font-family="monospace" font-size="9" fill="#5eead4">v1.0</text>
|
||||
<rect x="325" y="155" width="50" height="20" rx="10" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="350" y="169" text-anchor="middle" font-family="monospace" font-size="9" fill="#5eead4">v1.1</text>
|
||||
<rect x="625" y="155" width="50" height="20" rx="10" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="650" y="169" text-anchor="middle" font-family="monospace" font-size="9" fill="#5eead4">v2.0</text>
|
||||
|
||||
<!-- develop branch line -->
|
||||
<line x1="120" y1="280" x2="650" y2="280" stroke="#2dd4bf" stroke-width="3" opacity="0.4"/>
|
||||
<!-- develop commits -->
|
||||
<circle cx="180" cy="280" r="7" fill="#2dd4bf"/>
|
||||
<circle cx="280" cy="280" r="7" fill="#2dd4bf"/>
|
||||
<circle cx="420" cy="280" r="7" fill="#2dd4bf"/>
|
||||
<circle cx="520" cy="280" r="7" fill="#2dd4bf"/>
|
||||
<circle cx="580" cy="280" r="7" fill="#2dd4bf"/>
|
||||
|
||||
<!-- Branch from main to develop -->
|
||||
<path d="M120,190 Q120,235 150,280" fill="none" stroke="#2dd4bf" stroke-width="2" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- feature branch line -->
|
||||
<line x1="280" y1="370" x2="520" y2="370" stroke="#99f6e4" stroke-width="3" opacity="0.4"/>
|
||||
<!-- feature commits -->
|
||||
<circle cx="330" cy="370" r="6" fill="#99f6e4"/>
|
||||
<circle cx="390" cy="370" r="6" fill="#99f6e4"/>
|
||||
<circle cx="450" cy="370" r="6" fill="#99f6e4"/>
|
||||
|
||||
<!-- Branch from develop to feature -->
|
||||
<path d="M280,280 Q280,325 300,370" fill="none" stroke="#99f6e4" stroke-width="2" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- Merge feature back to develop -->
|
||||
<path d="M450,370 Q500,370 520,280" fill="none" stroke="#99f6e4" stroke-width="2" stroke-dasharray="4,3"/>
|
||||
<!-- Merge circle -->
|
||||
<circle cx="520" cy="280" r="9" fill="#2dd4bf" stroke="#99f6e4" stroke-width="2"/>
|
||||
|
||||
<!-- Merge develop to main -->
|
||||
<path d="M580,280 Q615,280 650,190" fill="none" stroke="#2dd4bf" stroke-width="2" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- hotfix branch -->
|
||||
<line x1="350" y1="460" x2="490" y2="460" stroke="#f87171" stroke-width="3" opacity="0.4"/>
|
||||
<!-- hotfix commits -->
|
||||
<circle cx="400" cy="460" r="6" fill="#f87171"/>
|
||||
<circle cx="450" cy="460" r="6" fill="#f87171"/>
|
||||
|
||||
<!-- Branch from main to hotfix -->
|
||||
<path d="M350,190 Q350,325 370,460" fill="none" stroke="#f87171" stroke-width="2" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- Merge hotfix to main (and to develop) -->
|
||||
<path d="M450,460 Q530,460 650,190" fill="none" stroke="#f87171" stroke-width="1.5" stroke-dasharray="4,3" opacity="0.7"/>
|
||||
<path d="M450,460 Q480,400 420,280" fill="none" stroke="#f87171" stroke-width="1.5" stroke-dasharray="4,3" opacity="0.5"/>
|
||||
<circle cx="420" cy="280" r="9" fill="#2dd4bf" stroke="#f87171" stroke-width="2"/>
|
||||
|
||||
<!-- Feature branch label -->
|
||||
<rect x="320" y="395" width="120" height="22" rx="11" fill="#042f2e" stroke="#99f6e4" stroke-width="1" opacity="0.8"/>
|
||||
<text x="380" y="410" text-anchor="middle" font-family="monospace" font-size="10" fill="#99f6e4">feature/calendar</text>
|
||||
|
||||
<!-- Hotfix branch label -->
|
||||
<rect x="370" y="475" width="110" height="22" rx="11" fill="#042f2e" stroke="#f87171" stroke-width="1" opacity="0.8"/>
|
||||
<text x="425" y="490" text-anchor="middle" font-family="monospace" font-size="10" fill="#f87171">hotfix/login-fix</text>
|
||||
|
||||
<!-- Merge annotations -->
|
||||
<text x="530" y="260" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#99f6e4" opacity="0.8">merge</text>
|
||||
<text x="620" y="240" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#2dd4bf" opacity="0.8">release</text>
|
||||
|
||||
<!-- Flow description at bottom -->
|
||||
<g transform="translate(80, 530)">
|
||||
<rect x="0" y="0" width="640" height="40" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.6"/>
|
||||
<text x="20" y="26" font-family="sans-serif" font-size="12" fill="#99f6e4">feature 작업</text>
|
||||
<text x="120" y="26" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.5">=></text>
|
||||
<text x="145" y="26" font-family="sans-serif" font-size="12" fill="#2dd4bf">develop 병합</text>
|
||||
<text x="260" y="26" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.5">=></text>
|
||||
<text x="285" y="26" font-family="sans-serif" font-size="12" fill="#5eead4">main 릴리즈</text>
|
||||
<text x="395" y="26" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.3">|</text>
|
||||
<text x="415" y="26" font-family="sans-serif" font-size="12" fill="#f87171">hotfix는 main에서 직접 분기</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.1 KiB |
117
public/images/academy/git-policy/5.svg
Normal file
@@ -0,0 +1,117 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg5" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow5">
|
||||
<feDropShadow dx="0" dy="2" stdDeviation="4" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg5)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">커밋 메시지</text>
|
||||
<text x="400" y="75" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">좋은 커밋 메시지 vs 나쁜 커밋 메시지</text>
|
||||
|
||||
<!-- Terminal frame -->
|
||||
<g filter="url(#shadow5)">
|
||||
<rect x="60" y="95" width="680" height="460" rx="12" fill="#0f172a" stroke="#334155" stroke-width="1.5"/>
|
||||
<!-- Terminal title bar -->
|
||||
<rect x="60" y="95" width="680" height="36" rx="12" fill="#1e293b"/>
|
||||
<rect x="60" y="119" width="680" height="12" fill="#1e293b"/>
|
||||
<circle cx="85" cy="113" r="6" fill="#f87171" opacity="0.8"/>
|
||||
<circle cx="105" cy="113" r="6" fill="#fbbf24" opacity="0.8"/>
|
||||
<circle cx="125" cy="113" r="6" fill="#4ade80" opacity="0.8"/>
|
||||
<text x="400" y="118" text-anchor="middle" font-family="monospace" font-size="12" fill="#94a3b8">git log --oneline</text>
|
||||
</g>
|
||||
|
||||
<!-- Good messages section -->
|
||||
<text x="95" y="160" font-family="sans-serif" font-size="14" font-weight="bold" fill="#4ade80">좋은 커밋 메시지</text>
|
||||
<line x1="95" y1="168" x2="710" y2="168" stroke="#334155" stroke-width="1"/>
|
||||
|
||||
<!-- Good commit 1 -->
|
||||
<g transform="translate(95, 182)">
|
||||
<circle cx="10" cy="10" r="10" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#4ade80">✓</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#fbbf24">a3f8c21</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#ccfbf1">feat: [calendar] 달력 기능 개선</text>
|
||||
</g>
|
||||
|
||||
<!-- Good commit 2 -->
|
||||
<g transform="translate(95, 218)">
|
||||
<circle cx="10" cy="10" r="10" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#4ade80">✓</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#fbbf24">b7e2d45</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#ccfbf1">fix: [auth] 세션 만료 오류 수정</text>
|
||||
</g>
|
||||
|
||||
<!-- Good commit 3 -->
|
||||
<g transform="translate(95, 254)">
|
||||
<circle cx="10" cy="10" r="10" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#4ade80">✓</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#fbbf24">c9d1f83</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#ccfbf1">refactor: [user] 서비스 레이어 분리</text>
|
||||
</g>
|
||||
|
||||
<!-- Good commit 4 -->
|
||||
<g transform="translate(95, 290)">
|
||||
<circle cx="10" cy="10" r="10" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#4ade80">✓</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#fbbf24">d2a5b67</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#ccfbf1">docs: [api] Swagger 문서 업데이트</text>
|
||||
</g>
|
||||
|
||||
<!-- Separator -->
|
||||
<line x1="95" y1="325" x2="710" y2="325" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
|
||||
|
||||
<!-- Bad messages section -->
|
||||
<text x="95" y="355" font-family="sans-serif" font-size="14" font-weight="bold" fill="#f87171">나쁜 커밋 메시지</text>
|
||||
<line x1="95" y1="363" x2="710" y2="363" stroke="#334155" stroke-width="1"/>
|
||||
|
||||
<!-- Bad commit 1 -->
|
||||
<g transform="translate(95, 378)">
|
||||
<circle cx="10" cy="10" r="10" fill="#f87171" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#f87171">✕</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#64748b">e4f7a12</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#64748b">수정</text>
|
||||
<text x="160" y="14" font-family="sans-serif" font-size="11" fill="#f87171" opacity="0.7">← 무엇을 수정했는지 알 수 없음</text>
|
||||
</g>
|
||||
|
||||
<!-- Bad commit 2 -->
|
||||
<g transform="translate(95, 414)">
|
||||
<circle cx="10" cy="10" r="10" fill="#f87171" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#f87171">✕</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#64748b">f8b3c56</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#64748b">asdf</text>
|
||||
<text x="160" y="14" font-family="sans-serif" font-size="11" fill="#f87171" opacity="0.7">← 의미 없는 텍스트</text>
|
||||
</g>
|
||||
|
||||
<!-- Bad commit 3 -->
|
||||
<g transform="translate(95, 450)">
|
||||
<circle cx="10" cy="10" r="10" fill="#f87171" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#f87171">✕</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#64748b">a1c9e78</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#64748b">작업완료</text>
|
||||
<text x="195" y="14" font-family="sans-serif" font-size="11" fill="#f87171" opacity="0.7">← 어떤 작업인지 알 수 없음</text>
|
||||
</g>
|
||||
|
||||
<!-- Bad commit 4 -->
|
||||
<g transform="translate(95, 486)">
|
||||
<circle cx="10" cy="10" r="10" fill="#f87171" opacity="0.15"/>
|
||||
<text x="10" y="15" text-anchor="middle" font-family="sans-serif" font-size="13" font-weight="bold" fill="#f87171">✕</text>
|
||||
<text x="30" y="14" font-family="monospace" font-size="12" fill="#64748b">b2d4f90</text>
|
||||
<text x="110" y="14" font-family="monospace" font-size="13" fill="#64748b">ㅋㅋ 이거 됨</text>
|
||||
<text x="225" y="14" font-family="sans-serif" font-size="11" fill="#f87171" opacity="0.7">← 비전문적, 정보 없음</text>
|
||||
</g>
|
||||
|
||||
<!-- Format guide at bottom -->
|
||||
<g transform="translate(95, 520)">
|
||||
<rect x="0" y="0" width="615" height="28" rx="8" fill="#134e4a" opacity="0.5"/>
|
||||
<text x="15" y="19" font-family="sans-serif" font-size="12" fill="#5eead4">형식:</text>
|
||||
<text x="50" y="19" font-family="monospace" font-size="12" fill="#99f6e4">type: [scope] 작업내용</text>
|
||||
<text x="280" y="19" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.6">예) feat, fix, refactor, docs, chore, style, test</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 6.8 KiB |
178
public/images/academy/git-policy/6.svg
Normal file
@@ -0,0 +1,178 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg6" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow6">
|
||||
<feDropShadow dx="0" dy="3" stdDeviation="6" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow6">
|
||||
<feGaussianBlur stdDeviation="3" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<linearGradient id="cardGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#1e293b"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg6)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">PR 워크플로우</text>
|
||||
<text x="400" y="75" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">Pull Request를 통한 코드 리뷰 프로세스</text>
|
||||
|
||||
<!-- Step 1: Branch -->
|
||||
<g filter="url(#shadow6)" transform="translate(30, 140)">
|
||||
<rect x="0" y="0" width="130" height="160" rx="14" fill="url(#cardGrad)" stroke="#5eead4" stroke-width="1.5"/>
|
||||
<!-- Number -->
|
||||
<circle cx="65" cy="30" r="16" fill="#5eead4" opacity="0.15"/>
|
||||
<text x="65" y="36" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#5eead4">1</text>
|
||||
<!-- Branch icon -->
|
||||
<g transform="translate(35, 55)">
|
||||
<line x1="30" y1="0" x2="30" y2="40" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<line x1="30" y1="15" x2="50" y2="0" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<circle cx="30" cy="0" r="4" fill="#5eead4"/>
|
||||
<circle cx="30" cy="40" r="4" fill="#5eead4"/>
|
||||
<circle cx="50" cy="0" r="4" fill="#99f6e4"/>
|
||||
</g>
|
||||
<text x="65" y="118" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">Branch</text>
|
||||
<text x="65" y="140" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#99f6e4">브랜치 생성</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 1->2 -->
|
||||
<g filter="url(#glow6)">
|
||||
<line x1="165" y1="220" x2="182" y2="220" stroke="#5eead4" stroke-width="2"/>
|
||||
<polygon points="182,214 195,220 182,226" fill="#5eead4"/>
|
||||
</g>
|
||||
|
||||
<!-- Step 2: Commit -->
|
||||
<g filter="url(#shadow6)" transform="translate(190, 140)">
|
||||
<rect x="0" y="0" width="130" height="160" rx="14" fill="url(#cardGrad)" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<circle cx="65" cy="30" r="16" fill="#2dd4bf" opacity="0.15"/>
|
||||
<text x="65" y="36" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#2dd4bf">2</text>
|
||||
<!-- Commit icon -->
|
||||
<g transform="translate(40, 55)">
|
||||
<circle cx="25" cy="5" r="5" fill="#2dd4bf"/>
|
||||
<line x1="25" y1="10" x2="25" y2="20" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<circle cx="25" cy="25" r="5" fill="#2dd4bf"/>
|
||||
<line x1="25" y1="30" x2="25" y2="40" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<circle cx="25" cy="45" r="5" fill="#2dd4bf"/>
|
||||
</g>
|
||||
<text x="65" y="118" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">Commit</text>
|
||||
<text x="65" y="140" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#99f6e4">코드 커밋</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 2->3 -->
|
||||
<g filter="url(#glow6)">
|
||||
<line x1="325" y1="220" x2="342" y2="220" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<polygon points="342,214 355,220 342,226" fill="#2dd4bf"/>
|
||||
</g>
|
||||
|
||||
<!-- Step 3: PR -->
|
||||
<g filter="url(#shadow6)" transform="translate(350, 140)">
|
||||
<rect x="0" y="0" width="130" height="160" rx="14" fill="url(#cardGrad)" stroke="#5eead4" stroke-width="2"/>
|
||||
<circle cx="65" cy="30" r="16" fill="#5eead4" opacity="0.2"/>
|
||||
<text x="65" y="36" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#5eead4">3</text>
|
||||
<!-- PR icon (merge request) -->
|
||||
<g transform="translate(35, 55)">
|
||||
<rect x="5" y="0" width="50" height="45" rx="6" fill="none" stroke="#5eead4" stroke-width="1.5"/>
|
||||
<line x1="15" y1="12" x2="45" y2="12" stroke="#5eead4" stroke-width="1.5" opacity="0.6"/>
|
||||
<line x1="15" y1="22" x2="40" y2="22" stroke="#5eead4" stroke-width="1.5" opacity="0.4"/>
|
||||
<line x1="15" y1="32" x2="35" y2="32" stroke="#5eead4" stroke-width="1.5" opacity="0.3"/>
|
||||
<!-- Arrow merge indicator -->
|
||||
<circle cx="52" cy="0" r="8" fill="#134e4a" stroke="#5eead4" stroke-width="1.5"/>
|
||||
<text x="52" y="4" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#5eead4">PR</text>
|
||||
</g>
|
||||
<text x="65" y="118" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">PR 생성</text>
|
||||
<text x="65" y="140" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#99f6e4">Pull Request</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 3->4 -->
|
||||
<g filter="url(#glow6)">
|
||||
<line x1="485" y1="220" x2="502" y2="220" stroke="#5eead4" stroke-width="2"/>
|
||||
<polygon points="502,214 515,220 502,226" fill="#5eead4"/>
|
||||
</g>
|
||||
|
||||
<!-- Step 4: Review -->
|
||||
<g filter="url(#shadow6)" transform="translate(510, 140)">
|
||||
<rect x="0" y="0" width="130" height="160" rx="14" fill="url(#cardGrad)" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<circle cx="65" cy="30" r="16" fill="#fbbf24" opacity="0.15"/>
|
||||
<text x="65" y="36" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#fbbf24">4</text>
|
||||
<!-- Eye/Review icon -->
|
||||
<g transform="translate(30, 60)">
|
||||
<ellipse cx="35" cy="15" rx="28" ry="15" fill="none" stroke="#fbbf24" stroke-width="2"/>
|
||||
<circle cx="35" cy="15" r="8" fill="none" stroke="#fbbf24" stroke-width="2"/>
|
||||
<circle cx="35" cy="15" r="3" fill="#fbbf24"/>
|
||||
<!-- Comment bubble -->
|
||||
<rect x="45" y="-5" width="22" height="16" rx="4" fill="#fbbf24" opacity="0.3"/>
|
||||
<text x="56" y="7" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#fbbf24">!</text>
|
||||
</g>
|
||||
<text x="65" y="118" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">Review</text>
|
||||
<text x="65" y="140" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#fbbf24">코드 리뷰</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrow 4->5 -->
|
||||
<g filter="url(#glow6)">
|
||||
<line x1="645" y1="220" x2="662" y2="220" stroke="#fbbf24" stroke-width="2"/>
|
||||
<polygon points="662,214 675,220 662,226" fill="#4ade80"/>
|
||||
</g>
|
||||
|
||||
<!-- Step 5: Merge -->
|
||||
<g filter="url(#shadow6)" transform="translate(670, 140)">
|
||||
<rect x="0" y="0" width="100" height="160" rx="14" fill="url(#cardGrad)" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<circle cx="50" cy="30" r="16" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="50" y="36" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#4ade80">5</text>
|
||||
<!-- Merge icon -->
|
||||
<g transform="translate(20, 55)">
|
||||
<line x1="15" y1="0" x2="15" y2="45" stroke="#4ade80" stroke-width="2.5"/>
|
||||
<line x1="45" y1="0" x2="45" y2="15" stroke="#4ade80" stroke-width="2.5"/>
|
||||
<line x1="45" y1="15" x2="15" y2="30" stroke="#4ade80" stroke-width="2.5"/>
|
||||
<circle cx="15" cy="0" r="4" fill="#4ade80"/>
|
||||
<circle cx="45" cy="0" r="4" fill="#4ade80"/>
|
||||
<circle cx="15" cy="45" r="5" fill="#4ade80"/>
|
||||
</g>
|
||||
<text x="50" y="118" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">Merge</text>
|
||||
<text x="50" y="140" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#4ade80">병합 완료</text>
|
||||
</g>
|
||||
|
||||
<!-- Detail cards below -->
|
||||
<!-- Branch detail -->
|
||||
<g transform="translate(30, 340)">
|
||||
<rect x="0" y="0" width="220" height="100" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.8"/>
|
||||
<text x="15" y="25" font-family="monospace" font-size="11" fill="#5eead4">$ git checkout -b feature/new</text>
|
||||
<text x="15" y="50" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">develop에서 새 브랜치를</text>
|
||||
<text x="15" y="68" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">생성하고 작업을 시작합니다</text>
|
||||
</g>
|
||||
|
||||
<!-- PR detail -->
|
||||
<g transform="translate(290, 340)">
|
||||
<rect x="0" y="0" width="220" height="100" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.8"/>
|
||||
<text x="15" y="25" font-family="monospace" font-size="11" fill="#5eead4">$ gh pr create</text>
|
||||
<text x="15" y="50" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">변경사항을 설명하고</text>
|
||||
<text x="15" y="68" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">팀원에게 리뷰를 요청합니다</text>
|
||||
</g>
|
||||
|
||||
<!-- Merge detail -->
|
||||
<g transform="translate(550, 340)">
|
||||
<rect x="0" y="0" width="220" height="100" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.8"/>
|
||||
<text x="15" y="25" font-family="sans-serif" font-size="12" fill="#4ade80">Approved + Merge</text>
|
||||
<text x="15" y="50" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">리뷰 승인 후 develop에</text>
|
||||
<text x="15" y="68" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.7">병합하여 배포를 준비합니다</text>
|
||||
</g>
|
||||
|
||||
<!-- Bottom progress bar -->
|
||||
<g transform="translate(60, 480)">
|
||||
<rect x="0" y="0" width="680" height="6" rx="3" fill="#1e293b"/>
|
||||
<rect x="0" y="0" width="136" height="6" rx="3" fill="#5eead4" opacity="0.5"/>
|
||||
<rect x="136" y="0" width="136" height="6" rx="3" fill="#2dd4bf" opacity="0.5"/>
|
||||
<rect x="272" y="0" width="136" height="6" rx="3" fill="#5eead4" opacity="0.5"/>
|
||||
<rect x="408" y="0" width="136" height="6" rx="3" fill="#fbbf24" opacity="0.5"/>
|
||||
<rect x="544" y="0" width="136" height="6" rx="3" fill="#4ade80" opacity="0.5"/>
|
||||
</g>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="400" y="530" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.4">PR을 통해 코드 품질을 보장하고 팀 지식을 공유합니다</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
151
public/images/academy/git-policy/7.svg
Normal file
@@ -0,0 +1,151 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg7" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow7">
|
||||
<feDropShadow dx="0" dy="3" stdDeviation="5" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow7">
|
||||
<feGaussianBlur stdDeviation="3" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<linearGradient id="conflictGrad" x1="0" y1="0" x2="1" y2="0">
|
||||
<stop offset="0%" stop-color="#f87171" stop-opacity="0.3"/>
|
||||
<stop offset="50%" stop-color="#f87171" stop-opacity="0.15"/>
|
||||
<stop offset="100%" stop-color="#f87171" stop-opacity="0.3"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg7)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">충돌 해결</text>
|
||||
<text x="400" y="75" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">같은 파일을 동시에 수정했을 때 발생하는 충돌과 해결 방법</text>
|
||||
|
||||
<!-- Phase 1: Two branches diverging -->
|
||||
<text x="130" y="115" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">1. 분기</text>
|
||||
|
||||
<!-- Base commit -->
|
||||
<circle cx="100" cy="170" r="10" fill="#5eead4" filter="url(#glow7)"/>
|
||||
<text x="100" y="155" text-anchor="middle" font-family="monospace" font-size="10" fill="#99f6e4">base</text>
|
||||
|
||||
<!-- Branch A (top) -->
|
||||
<path d="M110,165 Q140,145 170,140" fill="none" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<circle cx="170" cy="140" r="7" fill="#5eead4"/>
|
||||
<circle cx="220" cy="135" r="7" fill="#5eead4"/>
|
||||
<line x1="177" y1="140" x2="213" y2="135" stroke="#5eead4" stroke-width="2.5"/>
|
||||
|
||||
<!-- Branch A label -->
|
||||
<rect x="160" y="105" width="80" height="22" rx="11" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="200" y="120" text-anchor="middle" font-family="monospace" font-size="10" fill="#5eead4">branch-A</text>
|
||||
|
||||
<!-- Branch B (bottom) -->
|
||||
<path d="M110,175 Q140,195 170,200" fill="none" stroke="#2dd4bf" stroke-width="2.5"/>
|
||||
<circle cx="170" cy="200" r="7" fill="#2dd4bf"/>
|
||||
<circle cx="220" cy="205" r="7" fill="#2dd4bf"/>
|
||||
<line x1="177" y1="200" x2="213" y2="205" stroke="#2dd4bf" stroke-width="2.5"/>
|
||||
|
||||
<!-- Branch B label -->
|
||||
<rect x="160" y="218" width="80" height="22" rx="11" fill="#042f2e" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<text x="200" y="233" text-anchor="middle" font-family="monospace" font-size="10" fill="#2dd4bf">branch-B</text>
|
||||
|
||||
<!-- Both modified same file -->
|
||||
<g transform="translate(100, 250)">
|
||||
<rect x="0" y="0" width="180" height="48" rx="8" fill="#1e293b" stroke="#334155" stroke-width="1"/>
|
||||
<text x="15" y="20" font-family="sans-serif" font-size="11" fill="#5eead4">A: login.php 15행 수정</text>
|
||||
<text x="15" y="38" font-family="sans-serif" font-size="11" fill="#2dd4bf">B: login.php 15행 수정</text>
|
||||
</g>
|
||||
|
||||
<!-- Phase 2: Conflict zone -->
|
||||
<text x="430" y="115" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#f87171">2. 충돌 발생</text>
|
||||
|
||||
<!-- Conflict zone background -->
|
||||
<rect x="330" y="130" width="200" height="180" rx="12" fill="url(#conflictGrad)" stroke="#f87171" stroke-width="1.5" stroke-dasharray="5,3"/>
|
||||
|
||||
<!-- Merge attempt -->
|
||||
<path d="M350,155 L420,180" fill="none" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<path d="M350,265 L420,240" fill="none" stroke="#2dd4bf" stroke-width="2.5"/>
|
||||
<circle cx="350" cy="155" r="7" fill="#5eead4"/>
|
||||
<circle cx="350" cy="265" r="7" fill="#2dd4bf"/>
|
||||
|
||||
<!-- Collision point -->
|
||||
<circle cx="430" cy="210" r="18" fill="#f87171" opacity="0.2" filter="url(#glow7)"/>
|
||||
<circle cx="430" cy="210" r="12" fill="#0f172a" stroke="#f87171" stroke-width="2"/>
|
||||
<text x="430" y="215" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#f87171">!</text>
|
||||
|
||||
<!-- Warning label -->
|
||||
<text x="430" y="200" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#f87171" opacity="0.8">CONFLICT</text>
|
||||
|
||||
<!-- Conflict code snippet -->
|
||||
<g filter="url(#shadow7)" transform="translate(320, 320)">
|
||||
<rect x="0" y="0" width="220" height="100" rx="8" fill="#0f172a" stroke="#f87171" stroke-width="1"/>
|
||||
<text x="10" y="20" font-family="monospace" font-size="10" fill="#f87171"><<<<<<< branch-A</text>
|
||||
<text x="10" y="38" font-family="monospace" font-size="10" fill="#5eead4">$user = Auth::user();</text>
|
||||
<text x="10" y="54" font-family="monospace" font-size="10" fill="#64748b">=======</text>
|
||||
<text x="10" y="70" font-family="monospace" font-size="10" fill="#2dd4bf">$user = User::find($id);</text>
|
||||
<text x="10" y="88" font-family="monospace" font-size="10" fill="#f87171">>>>>>>> branch-B</text>
|
||||
</g>
|
||||
|
||||
<!-- Phase 3: Resolution -->
|
||||
<text x="680" y="115" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#4ade80">3. 해결 완료</text>
|
||||
|
||||
<!-- Resolved merge -->
|
||||
<path d="M610,155 L660,190" fill="none" stroke="#5eead4" stroke-width="2.5"/>
|
||||
<path d="M610,265 L660,230" fill="none" stroke="#2dd4bf" stroke-width="2.5"/>
|
||||
<circle cx="610" cy="155" r="7" fill="#5eead4"/>
|
||||
<circle cx="610" cy="265" r="7" fill="#2dd4bf"/>
|
||||
|
||||
<!-- Merge point (resolved) -->
|
||||
<circle cx="670" cy="210" r="14" fill="#134e4a" stroke="#4ade80" stroke-width="2.5" filter="url(#glow7)"/>
|
||||
<text x="670" y="215" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#4ade80">✓</text>
|
||||
|
||||
<!-- Continued line -->
|
||||
<line x1="684" y1="210" x2="750" y2="210" stroke="#4ade80" stroke-width="2.5"/>
|
||||
<circle cx="750" cy="210" r="7" fill="#4ade80"/>
|
||||
|
||||
<!-- Resolved code snippet -->
|
||||
<g filter="url(#shadow7)" transform="translate(580, 320)">
|
||||
<rect x="0" y="0" width="190" height="70" rx="8" fill="#0f172a" stroke="#4ade80" stroke-width="1"/>
|
||||
<text x="10" y="22" font-family="sans-serif" font-size="10" fill="#4ade80">해결된 코드:</text>
|
||||
<text x="10" y="45" font-family="monospace" font-size="10" fill="#ccfbf1">$user = Auth::user();</text>
|
||||
<text x="10" y="62" font-family="monospace" font-size="10" fill="#64748b">// 팀 합의 후 A안 채택</text>
|
||||
</g>
|
||||
|
||||
<!-- Resolution steps at bottom -->
|
||||
<g transform="translate(60, 450)">
|
||||
<rect x="0" y="0" width="680" height="100" rx="12" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.7"/>
|
||||
<text x="20" y="28" font-family="sans-serif" font-size="13" font-weight="bold" fill="#5eead4">충돌 해결 절차</text>
|
||||
<line x1="20" y1="38" x2="660" y2="38" stroke="#334155" stroke-width="1"/>
|
||||
|
||||
<!-- Steps -->
|
||||
<circle cx="40" cy="60" r="12" fill="#5eead4" opacity="0.15"/>
|
||||
<text x="40" y="65" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#5eead4">1</text>
|
||||
<text x="60" y="65" font-family="sans-serif" font-size="12" fill="#ccfbf1">충돌 파일 확인</text>
|
||||
|
||||
<text x="185" y="65" font-family="sans-serif" font-size="14" fill="#334155">|</text>
|
||||
|
||||
<circle cx="210" cy="60" r="12" fill="#5eead4" opacity="0.15"/>
|
||||
<text x="210" y="65" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#5eead4">2</text>
|
||||
<text x="230" y="65" font-family="sans-serif" font-size="12" fill="#ccfbf1">마커 제거 + 코드 선택</text>
|
||||
|
||||
<text x="395" y="65" font-family="sans-serif" font-size="14" fill="#334155">|</text>
|
||||
|
||||
<circle cx="420" cy="60" r="12" fill="#5eead4" opacity="0.15"/>
|
||||
<text x="420" y="65" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#5eead4">3</text>
|
||||
<text x="440" y="65" font-family="sans-serif" font-size="12" fill="#ccfbf1">git add + commit</text>
|
||||
|
||||
<text x="575" y="65" font-family="sans-serif" font-size="14" fill="#334155">|</text>
|
||||
|
||||
<circle cx="600" cy="60" r="12" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="600" y="65" text-anchor="middle" font-family="sans-serif" font-size="11" font-weight="bold" fill="#4ade80">4</text>
|
||||
<text x="620" y="65" font-family="sans-serif" font-size="12" fill="#4ade80">해결 완료</text>
|
||||
|
||||
<text x="340" y="88" font-family="sans-serif" font-size="11" fill="#ccfbf1" opacity="0.5">충돌은 자연스러운 현상입니다. 침착하게 해결하세요!</text>
|
||||
</g>
|
||||
|
||||
<!-- Subtitle -->
|
||||
<text x="400" y="582" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1" opacity="0.4">같은 부분을 동시에 수정하면 충돌이 발생하며, 수동으로 해결해야 합니다</text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 8.7 KiB |
149
public/images/academy/git-policy/8.svg
Normal file
@@ -0,0 +1,149 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg8" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow8">
|
||||
<feDropShadow dx="0" dy="3" stdDeviation="6" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow8">
|
||||
<feGaussianBlur stdDeviation="3" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<linearGradient id="dbGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#fbbf24" stop-opacity="0.3"/>
|
||||
<stop offset="100%" stop-color="#fbbf24" stop-opacity="0.1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg8)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">SAM 멀티레포 구조</text>
|
||||
<text x="400" y="75" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">3개의 독립 저장소가 하나의 데이터베이스를 공유합니다</text>
|
||||
|
||||
<!-- MNG Repository -->
|
||||
<g filter="url(#shadow8)" transform="translate(40, 120)">
|
||||
<rect x="0" y="0" width="200" height="180" rx="14" fill="#1e293b" stroke="#5eead4" stroke-width="2"/>
|
||||
<!-- Folder icon -->
|
||||
<g transform="translate(70, 18)">
|
||||
<path d="M0,10 L0,45 L60,45 L60,10 L25,10 L20,3 L0,3 Z" fill="none" stroke="#5eead4" stroke-width="1.5"/>
|
||||
<line x1="8" y1="22" x2="40" y2="22" stroke="#5eead4" stroke-width="1" opacity="0.5"/>
|
||||
<line x1="8" y1="30" x2="35" y2="30" stroke="#5eead4" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="8" y1="38" x2="42" y2="38" stroke="#5eead4" stroke-width="1" opacity="0.3"/>
|
||||
</g>
|
||||
<text x="100" y="88" text-anchor="middle" font-family="monospace" font-size="18" font-weight="bold" fill="#5eead4">mng/</text>
|
||||
<text x="100" y="110" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1">관리자 웹</text>
|
||||
<text x="100" y="128" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#99f6e4" opacity="0.7">Laravel + HTMX</text>
|
||||
<!-- Tech tags -->
|
||||
<rect x="20" y="140" width="70" height="20" rx="10" fill="#042f2e" stroke="#5eead4" stroke-width="0.8"/>
|
||||
<text x="55" y="154" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#5eead4">Controller</text>
|
||||
<rect x="100" y="140" width="80" height="20" rx="10" fill="#042f2e" stroke="#5eead4" stroke-width="0.8"/>
|
||||
<text x="140" y="154" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#5eead4">Blade View</text>
|
||||
</g>
|
||||
|
||||
<!-- API Repository -->
|
||||
<g filter="url(#shadow8)" transform="translate(300, 120)">
|
||||
<rect x="0" y="0" width="200" height="180" rx="14" fill="#1e293b" stroke="#2dd4bf" stroke-width="2"/>
|
||||
<g transform="translate(70, 18)">
|
||||
<path d="M0,10 L0,45 L60,45 L60,10 L25,10 L20,3 L0,3 Z" fill="none" stroke="#2dd4bf" stroke-width="1.5"/>
|
||||
<line x1="8" y1="22" x2="40" y2="22" stroke="#2dd4bf" stroke-width="1" opacity="0.5"/>
|
||||
<line x1="8" y1="30" x2="35" y2="30" stroke="#2dd4bf" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="8" y1="38" x2="42" y2="38" stroke="#2dd4bf" stroke-width="1" opacity="0.3"/>
|
||||
</g>
|
||||
<text x="100" y="88" text-anchor="middle" font-family="monospace" font-size="18" font-weight="bold" fill="#2dd4bf">api/</text>
|
||||
<text x="100" y="110" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1">API 서버</text>
|
||||
<text x="100" y="128" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#99f6e4" opacity="0.7">Laravel + REST API</text>
|
||||
<rect x="15" y="140" width="75" height="20" rx="10" fill="#042f2e" stroke="#2dd4bf" stroke-width="0.8"/>
|
||||
<text x="52" y="154" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#2dd4bf">Migration</text>
|
||||
<rect x="100" y="140" width="85" height="20" rx="10" fill="#042f2e" stroke="#2dd4bf" stroke-width="0.8"/>
|
||||
<text x="142" y="154" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#2dd4bf">Model/API</text>
|
||||
</g>
|
||||
|
||||
<!-- React Repository -->
|
||||
<g filter="url(#shadow8)" transform="translate(560, 120)">
|
||||
<rect x="0" y="0" width="200" height="180" rx="14" fill="#1e293b" stroke="#818cf8" stroke-width="2"/>
|
||||
<g transform="translate(70, 18)">
|
||||
<path d="M0,10 L0,45 L60,45 L60,10 L25,10 L20,3 L0,3 Z" fill="none" stroke="#818cf8" stroke-width="1.5"/>
|
||||
<line x1="8" y1="22" x2="40" y2="22" stroke="#818cf8" stroke-width="1" opacity="0.5"/>
|
||||
<line x1="8" y1="30" x2="35" y2="30" stroke="#818cf8" stroke-width="1" opacity="0.4"/>
|
||||
<line x1="8" y1="38" x2="42" y2="38" stroke="#818cf8" stroke-width="1" opacity="0.3"/>
|
||||
</g>
|
||||
<text x="100" y="88" text-anchor="middle" font-family="monospace" font-size="18" font-weight="bold" fill="#818cf8">react/</text>
|
||||
<text x="100" y="110" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#ccfbf1">프론트엔드</text>
|
||||
<text x="100" y="128" text-anchor="middle" font-family="sans-serif" font-size="11" fill="#c4b5fd" opacity="0.7">Next.js + React</text>
|
||||
<rect x="20" y="140" width="75" height="20" rx="10" fill="#042f2e" stroke="#818cf8" stroke-width="0.8"/>
|
||||
<text x="57" y="154" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#818cf8">Component</text>
|
||||
<rect x="105" y="140" width="75" height="20" rx="10" fill="#042f2e" stroke="#818cf8" stroke-width="0.8"/>
|
||||
<text x="142" y="154" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#818cf8">Page/UI</text>
|
||||
</g>
|
||||
|
||||
<!-- Remote repos (small icons above each) -->
|
||||
<!-- MNG remote -->
|
||||
<g transform="translate(95, 330)">
|
||||
<rect x="0" y="0" width="90" height="35" rx="8" fill="#042f2e" stroke="#5eead4" stroke-width="1"/>
|
||||
<text x="45" y="15" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#5eead4">Remote</text>
|
||||
<text x="45" y="28" text-anchor="middle" font-family="monospace" font-size="9" fill="#99f6e4">sam-mng.git</text>
|
||||
</g>
|
||||
<line x1="140" y1="300" x2="140" y2="330" stroke="#5eead4" stroke-width="1.5" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- API remote -->
|
||||
<g transform="translate(355, 330)">
|
||||
<rect x="0" y="0" width="90" height="35" rx="8" fill="#042f2e" stroke="#2dd4bf" stroke-width="1"/>
|
||||
<text x="45" y="15" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#2dd4bf">Remote</text>
|
||||
<text x="45" y="28" text-anchor="middle" font-family="monospace" font-size="9" fill="#99f6e4">sam-api.git</text>
|
||||
</g>
|
||||
<line x1="400" y1="300" x2="400" y2="330" stroke="#2dd4bf" stroke-width="1.5" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- React remote -->
|
||||
<g transform="translate(615, 330)">
|
||||
<rect x="0" y="0" width="90" height="35" rx="8" fill="#042f2e" stroke="#818cf8" stroke-width="1"/>
|
||||
<text x="45" y="15" text-anchor="middle" font-family="sans-serif" font-size="9" fill="#818cf8">Remote</text>
|
||||
<text x="45" y="28" text-anchor="middle" font-family="monospace" font-size="9" fill="#c4b5fd">sam-react.git</text>
|
||||
</g>
|
||||
<line x1="660" y1="300" x2="660" y2="330" stroke="#818cf8" stroke-width="1.5" stroke-dasharray="4,3"/>
|
||||
|
||||
<!-- Central Database -->
|
||||
<g filter="url(#shadow8)" transform="translate(300, 420)">
|
||||
<rect x="0" y="0" width="200" height="100" rx="14" fill="#1e293b" stroke="#fbbf24" stroke-width="2"/>
|
||||
<!-- DB cylinder icon -->
|
||||
<g transform="translate(70, 10)">
|
||||
<ellipse cx="30" cy="8" rx="25" ry="8" fill="none" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<line x1="5" y1="8" x2="5" y2="45" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<line x1="55" y1="8" x2="55" y2="45" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<ellipse cx="30" cy="45" rx="25" ry="8" fill="none" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<ellipse cx="30" cy="26" rx="25" ry="8" fill="none" stroke="#fbbf24" stroke-width="0.8" opacity="0.4"/>
|
||||
</g>
|
||||
<text x="100" y="82" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#fbbf24">MySQL 8.0</text>
|
||||
<text x="100" y="97" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#ccfbf1" opacity="0.7">공유 데이터베이스</text>
|
||||
</g>
|
||||
|
||||
<!-- Connection lines from repos to DB -->
|
||||
<!-- MNG to DB -->
|
||||
<path d="M140,300 L140,390 Q140,420 200,440 L300,460" fill="none" stroke="#5eead4" stroke-width="1.5" stroke-dasharray="5,3" opacity="0.6"/>
|
||||
<!-- API to DB -->
|
||||
<line x1="400" y1="365" x2="400" y2="420" stroke="#2dd4bf" stroke-width="2" opacity="0.7"/>
|
||||
<!-- React to DB (via API) -->
|
||||
<path d="M660,300 L660,390 Q660,420 600,440 L500,460" fill="none" stroke="#818cf8" stroke-width="1.5" stroke-dasharray="5,3" opacity="0.6"/>
|
||||
|
||||
<!-- API is primary DB manager indicator -->
|
||||
<rect x="345" y="385" width="110" height="24" rx="12" fill="#042f2e" stroke="#fbbf24" stroke-width="1"/>
|
||||
<text x="400" y="401" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#fbbf24">DB 관리 주체</text>
|
||||
|
||||
<!-- React connects via API label -->
|
||||
<text x="580" y="405" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#818cf8" opacity="0.7">API 경유</text>
|
||||
|
||||
<!-- Key rules at bottom -->
|
||||
<g transform="translate(60, 540)">
|
||||
<rect x="0" y="0" width="680" height="38" rx="10" fill="#0f172a" stroke="#334155" stroke-width="1" opacity="0.7"/>
|
||||
<text x="20" y="24" font-family="sans-serif" font-size="12" fill="#fbbf24">핵심 규칙:</text>
|
||||
<text x="100" y="24" font-family="sans-serif" font-size="12" fill="#ccfbf1">마이그레이션은</text>
|
||||
<text x="195" y="24" font-family="monospace" font-size="12" font-weight="bold" fill="#2dd4bf">api/</text>
|
||||
<text x="230" y="24" font-family="sans-serif" font-size="12" fill="#ccfbf1">에서만 관리</text>
|
||||
<text x="330" y="24" font-family="sans-serif" font-size="12" fill="#64748b">|</text>
|
||||
<text x="350" y="24" font-family="sans-serif" font-size="12" fill="#ccfbf1">각 폴더는</text>
|
||||
<text x="428" y="24" font-family="sans-serif" font-size="12" font-weight="bold" fill="#5eead4">독립 Git 저장소</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 10 KiB |
173
public/images/academy/git-policy/9.svg
Normal file
@@ -0,0 +1,173 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 800 600" width="800" height="600">
|
||||
<defs>
|
||||
<linearGradient id="bg9" x1="0" y1="0" x2="1" y2="1">
|
||||
<stop offset="0%" stop-color="#042f2e"/>
|
||||
<stop offset="100%" stop-color="#0f172a"/>
|
||||
</linearGradient>
|
||||
<filter id="shadow9">
|
||||
<feDropShadow dx="0" dy="3" stdDeviation="5" flood-color="#000" flood-opacity="0.3"/>
|
||||
</filter>
|
||||
<filter id="glow9">
|
||||
<feGaussianBlur stdDeviation="4" result="blur"/>
|
||||
<feMerge><feMergeNode in="blur"/><feMergeNode in="SourceGraphic"/></feMerge>
|
||||
</filter>
|
||||
<linearGradient id="shieldGrad" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#5eead4"/>
|
||||
<stop offset="100%" stop-color="#2dd4bf"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
|
||||
<!-- Background -->
|
||||
<rect width="800" height="600" fill="url(#bg9)"/>
|
||||
|
||||
<!-- Title -->
|
||||
<text x="400" y="48" text-anchor="middle" font-family="sans-serif" font-size="28" font-weight="bold" fill="#5eead4">.gitignore 보안</text>
|
||||
<text x="400" y="75" text-anchor="middle" font-family="sans-serif" font-size="14" fill="#ccfbf1" opacity="0.6">민감한 파일과 불필요한 파일을 Git 추적에서 제외합니다</text>
|
||||
|
||||
<!-- Left side: Files incoming -->
|
||||
<text x="120" y="115" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#ccfbf1">모든 파일</text>
|
||||
|
||||
<!-- File: .env (dangerous) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 135)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#f87171" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#f87171"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#fca5a5">.env</text>
|
||||
<text x="115" y="25" font-family="sans-serif" font-size="10" fill="#f87171" opacity="0.7">비밀키</text>
|
||||
</g>
|
||||
|
||||
<!-- File: node_modules (dangerous) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 190)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#f87171" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#f87171"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#fca5a5">node_modules/</text>
|
||||
</g>
|
||||
|
||||
<!-- File: .DS_Store (dangerous) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 245)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#f87171" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#f87171"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#fca5a5">.DS_Store</text>
|
||||
</g>
|
||||
|
||||
<!-- File: vendor/ (dangerous) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 300)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#fbbf24" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#fbbf24"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#fcd34d">vendor/</text>
|
||||
</g>
|
||||
|
||||
<!-- File: app.php (safe) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 370)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#4ade80"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#86efac">app.php</text>
|
||||
</g>
|
||||
|
||||
<!-- File: routes.php (safe) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 425)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#4ade80"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#86efac">routes.php</text>
|
||||
</g>
|
||||
|
||||
<!-- File: README.md (safe) -->
|
||||
<g filter="url(#shadow9)" transform="translate(40, 480)">
|
||||
<rect x="0" y="0" width="160" height="40" rx="8" fill="#1e293b" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<rect x="0" y="0" width="8" height="40" rx="4" fill="#4ade80"/>
|
||||
<text x="20" y="25" font-family="monospace" font-size="13" fill="#86efac">README.md</text>
|
||||
</g>
|
||||
|
||||
<!-- Arrows from files toward shield -->
|
||||
<!-- Blocked arrows (red files) -->
|
||||
<line x1="205" y1="155" x2="310" y2="250" stroke="#f87171" stroke-width="1.5" stroke-dasharray="4,3" opacity="0.5"/>
|
||||
<line x1="205" y1="210" x2="310" y2="265" stroke="#f87171" stroke-width="1.5" stroke-dasharray="4,3" opacity="0.5"/>
|
||||
<line x1="205" y1="265" x2="310" y2="280" stroke="#f87171" stroke-width="1.5" stroke-dasharray="4,3" opacity="0.5"/>
|
||||
<line x1="205" y1="320" x2="310" y2="295" stroke="#fbbf24" stroke-width="1.5" stroke-dasharray="4,3" opacity="0.5"/>
|
||||
|
||||
<!-- Passed arrows (green files) -->
|
||||
<line x1="205" y1="390" x2="310" y2="325" stroke="#4ade80" stroke-width="1.5" opacity="0.5"/>
|
||||
<line x1="205" y1="445" x2="310" y2="340" stroke="#4ade80" stroke-width="1.5" opacity="0.5"/>
|
||||
<line x1="205" y1="500" x2="310" y2="355" stroke="#4ade80" stroke-width="1.5" opacity="0.5"/>
|
||||
|
||||
<!-- Central Shield -->
|
||||
<g filter="url(#glow9)" transform="translate(330, 200)">
|
||||
<!-- Shield shape -->
|
||||
<path d="M70,0 L140,25 L140,90 Q140,140 70,170 Q0,140 0,90 L0,25 Z" fill="#042f2e" stroke="url(#shieldGrad)" stroke-width="3"/>
|
||||
<!-- Inner shield details -->
|
||||
<path d="M70,15 L125,35 L125,85 Q125,125 70,150 Q15,125 15,85 L15,35 Z" fill="#134e4a" opacity="0.5"/>
|
||||
<!-- .gitignore text on shield -->
|
||||
<text x="70" y="75" text-anchor="middle" font-family="monospace" font-size="12" font-weight="bold" fill="#5eead4">.gitignore</text>
|
||||
<!-- Lock icon -->
|
||||
<g transform="translate(50, 90)">
|
||||
<rect x="5" y="10" width="30" height="22" rx="4" fill="#5eead4" opacity="0.3"/>
|
||||
<path d="M12,10 L12,5 Q12,-3 20,-3 Q28,-3 28,5 L28,10" fill="none" stroke="#5eead4" stroke-width="2"/>
|
||||
<circle cx="20" cy="21" r="3" fill="#5eead4"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- Blocked indicators (X marks) -->
|
||||
<g transform="translate(315, 220)">
|
||||
<circle cx="0" cy="0" r="10" fill="#f87171" opacity="0.2"/>
|
||||
<text x="0" y="5" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#f87171">✕</text>
|
||||
</g>
|
||||
<g transform="translate(315, 250)">
|
||||
<circle cx="0" cy="0" r="10" fill="#f87171" opacity="0.2"/>
|
||||
<text x="0" y="5" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#f87171">✕</text>
|
||||
</g>
|
||||
<g transform="translate(315, 280)">
|
||||
<circle cx="0" cy="0" r="10" fill="#f87171" opacity="0.2"/>
|
||||
<text x="0" y="5" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#f87171">✕</text>
|
||||
</g>
|
||||
|
||||
<!-- Passed indicators (checkmarks) after shield -->
|
||||
<line x1="490" y1="310" x2="560" y2="310" stroke="#4ade80" stroke-width="2"/>
|
||||
<polygon points="560,304 575,310 560,316" fill="#4ade80"/>
|
||||
<line x1="490" y1="330" x2="560" y2="330" stroke="#4ade80" stroke-width="2"/>
|
||||
<polygon points="560,324 575,330 560,336" fill="#4ade80"/>
|
||||
<line x1="490" y1="350" x2="560" y2="350" stroke="#4ade80" stroke-width="2"/>
|
||||
<polygon points="560,344 575,350 560,356" fill="#4ade80"/>
|
||||
|
||||
<!-- Right side: Git Repository (only safe files) -->
|
||||
<g filter="url(#shadow9)" transform="translate(580, 200)">
|
||||
<rect x="0" y="0" width="180" height="220" rx="14" fill="#1e293b" stroke="#4ade80" stroke-width="1.5"/>
|
||||
<text x="90" y="30" text-anchor="middle" font-family="sans-serif" font-size="14" font-weight="bold" fill="#4ade80">Git 저장소</text>
|
||||
<line x1="20" y1="40" x2="160" y2="40" stroke="#334155" stroke-width="1"/>
|
||||
|
||||
<!-- Safe files listed -->
|
||||
<g transform="translate(20, 55)">
|
||||
<circle cx="8" cy="8" r="6" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="8" y="12" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#4ade80">✓</text>
|
||||
<text x="22" y="12" font-family="monospace" font-size="11" fill="#86efac">app.php</text>
|
||||
</g>
|
||||
<g transform="translate(20, 85)">
|
||||
<circle cx="8" cy="8" r="6" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="8" y="12" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#4ade80">✓</text>
|
||||
<text x="22" y="12" font-family="monospace" font-size="11" fill="#86efac">routes.php</text>
|
||||
</g>
|
||||
<g transform="translate(20, 115)">
|
||||
<circle cx="8" cy="8" r="6" fill="#4ade80" opacity="0.15"/>
|
||||
<text x="8" y="12" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#4ade80">✓</text>
|
||||
<text x="22" y="12" font-family="monospace" font-size="11" fill="#86efac">README.md</text>
|
||||
</g>
|
||||
|
||||
<!-- Blocked files NOT here -->
|
||||
<line x1="20" y1="150" x2="160" y2="150" stroke="#334155" stroke-width="1" stroke-dasharray="3,3"/>
|
||||
<g transform="translate(20, 165)">
|
||||
<circle cx="8" cy="8" r="6" fill="#f87171" opacity="0.15"/>
|
||||
<text x="8" y="12" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#f87171">✕</text>
|
||||
<text x="22" y="12" font-family="monospace" font-size="11" fill="#64748b" text-decoration="line-through">.env</text>
|
||||
</g>
|
||||
<g transform="translate(20, 190)">
|
||||
<circle cx="8" cy="8" r="6" fill="#f87171" opacity="0.15"/>
|
||||
<text x="8" y="12" text-anchor="middle" font-family="sans-serif" font-size="10" fill="#f87171">✕</text>
|
||||
<text x="22" y="12" font-family="monospace" font-size="11" fill="#64748b" text-decoration="line-through">node_modules/</text>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<!-- gitignore file content preview -->
|
||||
<g filter="url(#shadow9)" transform="translate(80, 540)">
|
||||
<rect x="0" y="0" width="640" height="42" rx="8" fill="#0f172a" stroke="#5eead4" stroke-width="1" opacity="0.7"/>
|
||||
<text x="15" y="16" font-family="monospace" font-size="10" fill="#5eead4"># .gitignore</text>
|
||||
<text x="15" y="34" font-family="monospace" font-size="10" fill="#99f6e4">.env node_modules/ vendor/ .DS_Store *.log storage/*.key</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.7 KiB |
1286
resources/views/academy/git-policy.blade.php
Normal file
@@ -317,6 +317,39 @@
|
||||
"sudo": "일반 사용자가 관리자(root) 권한으로 명령을 실행할 수 있게 하는 명령어.",
|
||||
"systemctl": "systemd 서비스를 시작·중지·재시작·상태확인하는 관리 명령어."
|
||||
};
|
||||
@elseif($domain === 'git-policy')
|
||||
window.__GLOSSARY_DATA['git-policy'] = {
|
||||
"Git": "소스 코드 버전 관리 시스템. 파일의 변경 이력을 추적하고 여러 사람이 동시에 작업할 수 있게 한다.",
|
||||
"버전 관리": "파일의 변경 이력을 체계적으로 기록·관리하는 것. 언제, 누가, 무엇을 바꿨는지 추적할 수 있다.",
|
||||
"Repository": "저장소. Git이 파일과 변경 이력을 보관하는 공간. 프로젝트 폴더 안의 .git 폴더가 실체이다.",
|
||||
"Commit": "변경 사항을 저장소에 기록하는 행위. 작업 일지의 한 줄에 해당하며, 고유한 해시값을 가진다.",
|
||||
"Branch": "독립적인 작업 공간. 메인 코드에 영향을 주지 않고 새 기능을 개발할 수 있는 분기점.",
|
||||
"Merge": "두 브랜치의 변경 사항을 하나로 합치는 것. 분리된 작업을 다시 통합하는 과정.",
|
||||
"Pull Request": "코드 변경을 본 브랜치에 합쳐달라는 요청. 코드 리뷰를 거친 뒤 승인되면 머지된다.",
|
||||
"Clone": "원격 저장소의 전체 내용을 로컬에 복사하는 것. 프로젝트에 처음 참여할 때 사용한다.",
|
||||
"Push": "로컬 커밋을 원격 저장소에 업로드하는 것. 내 작업을 팀 공유 저장소에 올리는 행위.",
|
||||
"Pull": "원격 저장소의 최신 변경 사항을 로컬로 가져오는 것. 다른 사람의 작업을 내 PC에 동기화한다.",
|
||||
"Staging Area": "커밋할 파일을 미리 모아두는 중간 영역. git add로 파일을 이곳에 올린다.",
|
||||
"Working Directory": "실제 파일을 편집하는 작업 공간. 프로젝트 폴더 그 자체를 의미한다.",
|
||||
"Conflict": "같은 파일의 같은 부분을 두 사람이 다르게 수정했을 때 발생하는 충돌. 수동으로 해결해야 한다.",
|
||||
"Revert": "특정 커밋의 변경 사항을 되돌리는 새 커밋을 만드는 것. 이력이 보존되어 안전하다.",
|
||||
"Reset": "커밋 이력 자체를 되돌리는 것. 이력이 사라지므로 주의가 필요하다.",
|
||||
".gitignore": "Git이 추적하지 않을 파일 목록을 정의하는 파일. .env, node_modules 등을 제외할 때 사용한다.",
|
||||
"HEAD": "현재 체크아웃된 브랜치의 최신 커밋을 가리키는 포인터. '지금 내가 보고 있는 위치'를 뜻한다.",
|
||||
"Origin": "원격 저장소의 기본 이름. git clone 시 자동으로 origin이라는 이름이 붙는다.",
|
||||
"develop 브랜치": "개발 통합 브랜치. 기능 개발이 완료되면 여기에 합치고, 안정화 후 main에 반영한다.",
|
||||
"feature 브랜치": "새 기능을 개발하는 임시 브랜치. feature/기능명 형식으로 이름을 짓는다.",
|
||||
"hotfix 브랜치": "운영 중 긴급 버그를 수정하는 브랜치. main에서 분기하여 빠르게 수정 후 바로 병합한다.",
|
||||
"커밋 해시": "각 커밋에 부여되는 40자리 고유 식별자. SHA-1 알고리즘으로 생성되며 앞 7자리만 써도 된다.",
|
||||
"git log": "커밋 이력을 시간 순으로 보여주는 명령어. 누가 언제 무엇을 바꿨는지 확인할 수 있다.",
|
||||
"git status": "현재 작업 디렉토리의 상태를 보여주는 명령어. 수정·추가·삭제된 파일을 확인한다.",
|
||||
"git diff": "파일의 변경 내용을 줄 단위로 비교하는 명령어. 커밋 전 변경 사항을 검토할 때 사용한다.",
|
||||
"Pre-commit Hook": "커밋 실행 직전에 자동으로 실행되는 스크립트. 코드 포맷팅, 린트 검사 등을 자동화한다.",
|
||||
"CI/CD": "지속적 통합/지속적 배포. 코드 변경 시 자동으로 빌드·테스트·배포하는 자동화 파이프라인.",
|
||||
"Gitea": "경량 자체 호스팅 Git 서비스. GitHub와 유사하지만 자체 서버에서 운영한다. SAM이 사용 중.",
|
||||
"멀티레포": "하나의 프로젝트를 여러 독립 저장소로 나누어 관리하는 전략. SAM은 mng/api/react 3개로 운영.",
|
||||
"Pint": "Laravel 공식 코드 포맷터. PHP 코드 스타일을 자동으로 정리해주는 도구. Pre-commit에서 자동 실행."
|
||||
};
|
||||
@elseif($domain === 'env-management')
|
||||
window.__GLOSSARY_DATA['env-management'] = {
|
||||
".env": "환경 변수를 저장하는 설정 파일. DB 접속 정보, API 키 등 환경마다 달라지는 값을 관리한다.",
|
||||
|
||||
@@ -1469,6 +1469,8 @@
|
||||
Route::get('/web-basics', [\App\Http\Controllers\AcademyController::class, 'webBasics'])->name('web-basics');
|
||||
Route::get('/backend-dev', [\App\Http\Controllers\AcademyController::class, 'backendDev'])->name('backend-dev');
|
||||
Route::get('/env-management', [\App\Http\Controllers\AcademyController::class, 'envManagement'])->name('env-management');
|
||||
Route::get('/git-policy', [\App\Http\Controllers\AcademyController::class, 'gitPolicy'])->name('git-policy');
|
||||
Route::get('/nginx-encyclopedia', [\App\Http\Controllers\AcademyController::class, 'nginxEncyclopedia'])->name('nginx-encyclopedia');
|
||||
});
|
||||
|
||||
// SAM E-Sign - 인증 필요
|
||||
|
||||