{{--
    Academy Glossary Tooltip Component
    @include('components.academy-glossary', ['domain' => 'fire-shutter'])
    도메인: fire-shutter | it-planning | server-knowledge | frontend-dev | docker-environment | docker-commands | backend-dev | web-basics | env-management | nginx-encyclopedia | git-policy | git-tools
--}}

@push('styles')
<style>
/* ── Glossary Tooltip ── */
.glossary-term {
    position: relative;
    text-decoration: underline;
    text-decoration-style: dashed;
    text-decoration-color: #94a3b8;
    text-decoration-thickness: 1.5px;
    text-underline-offset: 3px;
    cursor: help;
    transition: text-decoration-color 0.15s ease;
}

.glossary-term:hover {
    text-decoration-color: #3b82f6;
}

/* 툴팁 화살표 */
.glossary-term::before {
    content: '';
    position: absolute;
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%);
    border: 6px solid transparent;
    border-top-color: #1e293b;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.15s ease, transform 0.15s ease;
    z-index: 42;
}

/* 툴팁 풍선 */
.glossary-term::after {
    content: attr(data-tooltip);
    position: absolute;
    bottom: calc(100% + 10px);
    left: 50%;
    transform: translateX(-50%) scale(0.95);
    background: #1e293b;
    color: #f1f5f9;
    font-size: 12px;
    font-weight: 400;
    line-height: 1.5;
    padding: 8px 12px;
    border-radius: 8px;
    max-width: 280px;
    width: max-content;
    white-space: normal;
    word-break: keep-all;
    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.15s ease, transform 0.15s ease;
    z-index: 42;
}

/* hover 시 표시 */
.glossary-term:hover::before,
.glossary-term:hover::after {
    opacity: 1;
}
.glossary-term:hover::after {
    transform: translateX(-50%) scale(1);
}

/* 모바일: 탭 토글 */
.glossary-term.is-tooltip-active::before,
.glossary-term.is-tooltip-active::after {
    opacity: 1;
}
.glossary-term.is-tooltip-active::after {
    transform: translateX(-50%) scale(1);
}

/* 화면 좌측 넘침 방지 */
.glossary-term::after {
    min-width: 160px;
}

/* hover 미지원 기기에서 hover 효과 비활성화 */
@media (hover: none) {
    .glossary-term:hover::before,
    .glossary-term:hover::after {
        opacity: 0;
    }
    .glossary-term:hover::after {
        transform: translateX(-50%) scale(0.95);
    }
    .glossary-term.is-tooltip-active::before,
    .glossary-term.is-tooltip-active::after {
        opacity: 1;
    }
    .glossary-term.is-tooltip-active::after {
        transform: translateX(-50%) scale(1);
    }
}
</style>
@endpush

<script>
window.__GLOSSARY_DOMAIN = @json($domain);
window.__GLOSSARY_DATA = window.__GLOSSARY_DATA || {};

@if($domain === 'fire-shutter')
window.__GLOSSARY_DATA['fire-shutter'] = {
    "슬랫": "셔터를 구성하는 금속 띠 형태의 판재. 여러 장이 연결되어 커튼 면을 형성한다.",
    "인터록킹": "슬랫과 슬랫을 서로 맞물리게 결합하는 방식. 분리되지 않으면서도 유연하게 감긴다.",
    "가이드레일": "셔터 양쪽에 설치된 레일. 슬랫이 이 레일을 따라 상하로 이동한다.",
    "샤프트": "셔터 상부에 위치한 회전축. 슬랫이 이 축에 감기며 올라간다.",
    "감속기": "모터의 고속 회전을 저속·고토크로 변환하는 장치. 셔터가 천천히 안전하게 내려온다.",
    "거버너": "셔터 하강 속도를 일정하게 제어하는 조속기. 과속 낙하를 방지한다.",
    "차연재": "셔터 틈새에 부착하여 연기 유입을 차단하는 소재. 화재 시 연기 확산을 막는다.",
    "EGI": "전기아연도금강판(Electro-Galvanized Iron). 아연 도금으로 내식성을 높인 강판이다.",
    "비차열": "화염은 차단하되 열 전달은 허용하는 방화 등급. 일반 방화셔터에 적용된다.",
    "차열": "화염과 열 전달 모두를 차단하는 상위 방화 등급. 피난 통로 등에 요구된다.",
    "방화구획": "건물을 일정 면적으로 나누어 화재 확산을 막는 구획. 건축법으로 의무화되어 있다.",
    "연동제어기": "화재 감지기 신호를 받아 셔터를 자동으로 폐쇄하는 제어 장치.",
    "연기감지기": "공기 중 연기 입자를 감지하여 화재 경보를 발생시키는 센서.",
    "열감지기": "주변 온도 상승을 감지하여 화재 경보를 발생시키는 센서.",
    "일부폐쇄": "셔터가 바닥에서 일정 높이(약 1.5m)까지만 내려오는 1차 폐쇄 단계.",
    "완전폐쇄": "셔터가 바닥까지 완전히 내려오는 최종 폐쇄 단계.",
    "롤포밍": "코일 강판을 연속 롤러로 통과시켜 원하는 단면 형상을 만드는 성형 공법.",
    "자동폐쇄기": "화재 시 외부 신호 없이도 셔터를 자동으로 닫히게 하는 장치.",
    "전자브레이크": "전자석을 이용하여 셔터의 정지·하강을 제어하는 브레이크.",
    "밸런스 스프링": "셔터 무게를 상쇄하여 모터 부하를 줄이고 수동 조작을 가능하게 하는 스프링.",
    "웜기어": "웜(나사축)과 웜휠이 맞물리는 감속 기어. 역회전 방지 기능이 있다.",
    "강판형": "일반 강판 슬랫으로 구성된 셔터 유형. 차열·비차열 성능을 모두 구현 가능하다.",
    "스크린형": "내화 섬유(유리섬유 등) 소재로 구성된 셔터 유형. 경량이고 투시가 가능하다.",
    "분리형": "감속기와 제어 장치가 셔터 본체와 별도로 설치되는 구조.",
    "일체형": "감속기와 제어 장치가 셔터 본체에 내장된 구조. 설치 공간이 절약된다.",
    "내화충전재": "셔터 내부에 충전하여 열 전달을 차단하는 단열 소재.",
    "SPHC": "열간압연 일반구조용 강판(Steel Plate Hot Commercial). 셔터 프레임 소재로 사용된다."
};
@elseif($domain === 'it-planning')
window.__GLOSSARY_DATA['it-planning'] = {
    "PRD": "제품 요구사항 문서(Product Requirements Document). 무엇을 왜 만들지 정의한 기획서.",
    "IA": "정보 구조(Information Architecture). 서비스의 메뉴·화면·콘텐츠 계층 구조를 설계한 것.",
    "와이어프레임": "화면 배치를 선과 도형으로 간략히 표현한 설계도. 디자인 이전 단계에서 사용한다.",
    "프로토타입": "실제 동작을 시뮬레이션하는 시제품. 사용성 검증을 위해 클릭 가능한 형태로 만든다.",
    "MoSCoW": "Must/Should/Could/Won't로 우선순위를 분류하는 기법.",
    "RICE": "Reach·Impact·Confidence·Effort로 기능 우선순위를 점수화하는 프레임워크.",
    "스코프 크리프": "프로젝트 범위가 통제 없이 점점 확장되는 현상. 일정 지연의 주요 원인이다.",
    "페르소나": "대표 사용자 유형을 가상의 인물로 구체화한 것. 사용자 중심 기획의 기초 자료.",
    "VOC": "고객의 소리(Voice of Customer). 사용자 피드백·요구사항을 수집·분석한 데이터.",
    "MECE": "상호 배타적이고 전체를 포괄하는 분류 원칙(Mutually Exclusive, Collectively Exhaustive).",
    "유스케이스": "사용자가 시스템과 상호작용하는 시나리오를 단계별로 기술한 것.",
    "플로우차트": "업무나 시스템의 처리 흐름을 도형과 화살표로 시각화한 다이어그램.",
    "ERD": "엔티티-관계 다이어그램(Entity-Relationship Diagram). 데이터베이스 테이블 간 관계를 표현한다.",
    "스프린트": "애자일 개발에서 1~4주 단위의 반복 개발 주기. 매 주기마다 결과물을 산출한다.",
    "백로그": "개발해야 할 기능·작업을 우선순위로 정리한 목록. 스프린트 계획의 입력값이다.",
    "MVP": "최소 기능 제품(Minimum Viable Product). 핵심 기능만으로 시장 반응을 검증하는 첫 버전.",
    "A/B 테스트": "두 가지 시안을 사용자에게 무작위 노출하여 성과를 비교하는 실험 방법.",
    "스토리보드": "화면 흐름과 사용자 인터랙션을 시각적으로 정리한 기획 산출물.",
    "KPI": "핵심 성과 지표(Key Performance Indicator). 목표 달성도를 측정하는 정량 지표.",
    "OKR": "목표와 핵심결과(Objectives and Key Results). 목표 설정 및 성과 관리 프레임워크.",
    "린 스타트업": "가설→실험→학습 순환으로 빠르게 제품을 검증하는 창업 방법론.",
    "디자인 씽킹": "사용자 공감→문제 정의→아이디어→프로토타입→테스트 5단계 혁신 방법론.",
    "애자일": "변화에 유연하게 대응하며 반복적으로 개발하는 소프트웨어 개발 방법론.",
    "칸반": "작업을 시각적 보드로 관리하며, 진행 중 작업 수(WIP)를 제한하는 워크플로우 방법.",
    "스크럼": "스프린트 단위로 개발하며 데일리 스탠드업, 회고 등 정해진 이벤트를 수행하는 애자일 프레임워크.",
    "이해관계자": "프로젝트의 결과에 영향을 받거나 영향을 미치는 사람 또는 조직.",
    "로드맵": "제품·프로젝트의 중장기 계획을 시간 축으로 시각화한 전략 문서."
};
@elseif($domain === 'frontend-dev')
window.__GLOSSARY_DATA['frontend-dev'] = {
    "DOM": "문서 객체 모델(Document Object Model). 브라우저가 HTML을 읽어 만든 트리 구조. JavaScript로 조작할 수 있다.",
    "시맨틱 태그": "의미를 가진 HTML 태그. header, nav, main, footer 등. 검색엔진과 스크린리더가 콘텐츠를 이해하는 데 도움을 준다.",
    "박스모델": "CSS에서 모든 요소를 상자로 취급하는 개념. content → padding → border → margin 순으로 구성된다.",
    "Flexbox": "1차원(가로 또는 세로) 레이아웃을 쉽게 구현하는 CSS 기능. display: flex로 활성화한다.",
    "Grid": "2차원(행+열) 레이아웃을 구현하는 CSS 기능. 바둑판처럼 요소를 배치할 수 있다.",
    "미디어쿼리": "화면 크기에 따라 다른 CSS를 적용하는 규칙. @media (min-width: 768px) 형태로 사용한다.",
    "viewport": "브라우저에서 웹 콘텐츠가 표시되는 영역. meta viewport 태그로 모바일 대응을 설정한다.",
    "브레이크포인트": "반응형 디자인에서 레이아웃이 전환되는 화면 너비 기준점. 예: 768px, 1024px.",
    "컴포넌트": "재사용 가능한 UI 조각. 버튼, 카드, 모달 등을 독립적인 단위로 만들어 조합한다.",
    "상태관리": "애플리케이션 내 데이터(상태)를 체계적으로 관리하는 방법. Redux, Zustand 등의 라이브러리를 사용한다.",
    "SPA": "Single Page Application. 페이지 전환 없이 하나의 페이지에서 콘텐츠를 동적으로 교체하는 웹 앱.",
    "SSR": "Server-Side Rendering. 서버에서 HTML을 생성하여 브라우저에 전달하는 방식. SEO와 초기 로딩에 유리하다.",
    "CSR": "Client-Side Rendering. 브라우저에서 JavaScript로 HTML을 생성하는 방식. SPA의 기본 렌더링 방식이다.",
    "번들러": "여러 JavaScript/CSS 파일을 하나로 합치고 최적화하는 도구. Vite, Webpack이 대표적이다.",
    "트랜스파일러": "최신 JavaScript 문법을 구형 브라우저에서도 동작하도록 변환하는 도구. Babel이 대표적이다.",
    "린터": "코드의 오류, 스타일 위반, 잠재적 버그를 자동으로 검출하는 도구. ESLint가 대표적이다.",
    "CDN": "Content Delivery Network. 전 세계에 분산된 서버로 콘텐츠를 빠르게 전달하는 네트워크.",
    "CORS": "Cross-Origin Resource Sharing. 다른 도메인 간 리소스 공유를 제어하는 브라우저 보안 정책.",
    "REST API": "URL과 HTTP 메서드(GET/POST/PUT/DELETE)로 자원을 관리하는 웹 API 설계 방식.",
    "JSON": "JavaScript Object Notation. 서버와 클라이언트 간 데이터를 주고받는 경량 텍스트 형식.",
    "npm": "Node Package Manager. JavaScript 패키지를 설치·관리하는 도구이자 세계 최대 패키지 저장소.",
    "반응형 디자인": "화면 크기에 따라 레이아웃이 자동으로 조정되는 웹 디자인 방식.",
    "이벤트 리스너": "사용자 행동(클릭, 입력 등)을 감지하여 정해진 함수를 실행하는 메커니즘.",
    "콜백": "다른 함수의 인자로 전달되어 나중에 호출되는 함수. 비동기 처리의 기본 패턴이다.",
    "Promise": "비동기 작업의 완료 또는 실패를 나타내는 객체. then/catch로 결과를 처리한다.",
    "가상 DOM": "실제 DOM의 가벼운 복사본. React가 변경 사항을 비교하여 최소한의 실제 DOM만 업데이트한다."
};
@elseif($domain === 'docker-environment')
window.__GLOSSARY_DATA['docker-environment'] = {
    "Docker": "애플리케이션을 컨테이너로 패키징하여 어디서나 동일하게 실행할 수 있게 하는 플랫폼.",
    "컨테이너": "앱과 실행 환경을 격리하여 패키징한 가상화 단위. VM보다 가볍고 빠르다.",
    "이미지": "컨테이너를 만들기 위한 읽기 전용 템플릿. Dockerfile로 정의하며 레이어 구조로 되어 있다.",
    "Docker Compose": "여러 컨테이너를 하나의 YAML 파일로 정의하고 함께 실행하는 도구.",
    "Dockerfile": "Docker 이미지를 빌드하기 위한 명령어 모음 파일. FROM, RUN, COPY 등의 명령으로 구성된다.",
    "볼륨": "컨테이너 데이터를 영구적으로 저장하는 Docker 관리 저장소. 컨테이너 삭제 후에도 데이터가 유지된다.",
    "바인드 마운트": "호스트의 특정 경로를 컨테이너에 직접 연결하는 방식. 소스 코드 실시간 동기화에 사용한다.",
    "브리지 네트워크": "같은 Docker 네트워크에 속한 컨테이너끼리 이름으로 통신할 수 있게 하는 기본 네트워크 드라이버.",
    "Supervisor": "여러 프로세스를 동시에 관리·감시하는 도구. 프로세스 비정상 종료 시 자동 재시작한다.",
    "PHP-FPM": "PHP FastCGI Process Manager. PHP 스크립트를 처리하는 프로세스 관리자.",
    "Nginx": "고성능 웹 서버. 리버스 프록시로 도메인별 요청을 적절한 서비스로 라우팅한다.",
    "리버스 프록시": "클라이언트 요청을 받아 내부 서비스로 전달하는 중간 서버. Nginx가 대표적이다.",
    ".env": "환경 변수를 저장하는 설정 파일. DB 접속 정보, API 키 등 환경마다 달라지는 값을 관리한다.",
    "환경 변수": "운영체제나 앱에 전달되는 설정값. 코드 변경 없이 동작을 바꿀 수 있다.",
    "Queue Worker": "백그라운드에서 비동기 작업(메일 발송, 파일 처리 등)을 순차적으로 처리하는 프로세스.",
    "Scheduler": "정해진 시간에 자동으로 명령을 실행하는 Laravel의 크론 작업 관리자.",
    "마이그레이션": "데이터베이스 테이블 구조를 코드로 관리하고 버전별로 적용·롤백하는 Laravel 기능.",
    "OOM": "Out of Memory. 메모리 부족으로 프로세스가 강제 종료되는 현상.",
    "포트": "네트워크 통신에서 서비스를 구분하는 번호. HTTP는 80, MySQL은 3306을 사용한다.",
    "config:clear": "Laravel이 캐시한 설정을 초기화하는 명령. .env 변경 후 반드시 실행해야 한다.",
    "docker exec": "실행 중인 컨테이너 안에서 명령을 실행하는 Docker 명령어.",
    "WSL": "Windows Subsystem for Linux. Windows에서 리눅스 환경을 실행하는 호환 계층.",
    "samnet": "SAM 프로젝트의 Docker 브리지 네트워크. 모든 컨테이너가 이 네트워크로 통신한다.",
    "Next.js": "React 기반의 풀스택 프레임워크. 서버 사이드 렌더링(SSR)을 지원한다.",
    "SSR": "Server-Side Rendering. 서버에서 HTML을 생성하여 브라우저에 전달하는 방식."
};
@elseif($domain === 'backend-dev')
window.__GLOSSARY_DATA['backend-dev'] = {
    "백엔드": "사용자 눈에 보이지 않는 서버 측 영역. 데이터 저장, 비즈니스 로직, 인증 등을 처리한다.",
    "API": "Application Programming Interface. 프로그램 간 데이터를 주고받는 규격화된 통신 방식.",
    "REST": "Representational State Transfer. URL로 자원을 표현하고 HTTP 메서드로 행위를 나타내는 API 설계 방식.",
    "JSON": "JavaScript Object Notation. 서버와 클라이언트 간 데이터를 주고받는 경량 텍스트 형식.",
    "MySQL": "오픈소스 관계형 데이터베이스 관리 시스템(RDBMS). SQL 언어로 데이터를 관리한다.",
    "쿼리": "데이터베이스에 데이터를 요청하거나 조작하는 명령문. SQL로 작성한다.",
    "ORM": "Object-Relational Mapping. 데이터베이스 테이블을 프로그래밍 언어의 객체로 다루는 기술.",
    "Eloquent": "Laravel의 ORM. 테이블을 PHP 클래스로 표현하여 SQL 없이 데이터를 조작할 수 있다.",
    "마이그레이션": "데이터베이스 테이블 구조를 코드로 관리하고 버전별로 적용·롤백하는 기능.",
    "MVC": "Model-View-Controller. 데이터(M), 화면(V), 제어 로직(C)을 분리하는 소프트웨어 설계 패턴.",
    "컨트롤러": "사용자 요청을 받아 적절한 모델과 뷰를 연결하는 중재자 역할의 클래스.",
    "미들웨어": "요청이 컨트롤러에 도달하기 전/후에 실행되는 필터. 인증 확인, 로깅 등을 처리한다.",
    "라우팅": "URL 경로를 특정 컨트롤러·메서드에 연결하는 규칙 정의.",
    "세션": "서버에 사용자 상태를 저장하는 방식. 브라우저는 세션 ID만 쿠키로 보관한다.",
    "토큰": "서버가 발급하는 인증 문자열. 클라이언트가 보유하며 API 요청 시 헤더에 포함한다.",
    "해싱": "데이터를 되돌릴 수 없는 고정 길이 문자열로 변환하는 것. 비밀번호 저장에 사용한다.",
    "CSRF": "Cross-Site Request Forgery. 사용자 모르게 악의적 요청을 보내는 공격. 토큰으로 방어한다.",
    "큐(Queue)": "작업을 대기열에 넣고 순차적으로 처리하는 구조. 이메일 발송, PDF 생성 등에 사용한다.",
    "캐시": "자주 사용하는 데이터를 빠른 저장소에 임시 보관하여 응답 속도를 높이는 기법.",
    "N+1 문제": "1번의 쿼리로 목록을 가져온 뒤 각 항목마다 추가 쿼리가 발생하는 성능 문제.",
    "Eager Loading": "관련 데이터를 미리 한 번에 조회하여 N+1 문제를 방지하는 기법. with() 메서드를 사용한다.",
    "트랜잭션": "여러 DB 작업을 하나의 단위로 묶어 모두 성공하거나 모두 취소하는 처리 방식.",
    "인덱스": "테이블의 특정 컬럼에 대한 검색 색인. 조회 속도를 크게 향상시킨다.",
    "멀티테넌트": "하나의 시스템에서 여러 조직의 데이터를 격리하여 관리하는 아키텍처.",
    "스케줄러": "정해진 시간에 자동으로 작업을 실행하는 기능. Laravel의 크론 작업 대체.",
    "로그": "시스템·애플리케이션의 동작 기록. 오류 추적과 모니터링에 필수적이다.",
    "환경 변수": "운영체제나 앱에 전달되는 설정값. .env 파일로 관리하며 환경마다 다른 값을 사용한다.",
    "SQL Injection": "사용자 입력에 악의적 SQL을 삽입하여 DB를 조작하는 보안 공격.",
    "Sanctum": "Laravel 공식 API 인증 패키지. SPA와 모바일 앱을 위한 토큰 발급·인증을 처리한다.",
    "Artisan": "Laravel의 CLI 도구. 마이그레이션, 시더, 캐시 관리 등 다양한 명령을 제공한다."
};
@elseif($domain === 'web-basics')
window.__GLOSSARY_DATA['web-basics'] = {
    "인터넷": "전 세계의 컴퓨터를 하나로 연결하는 거대한 네트워크. 이메일, 웹, 스트리밍 등 모든 온라인 서비스의 기반.",
    "웹(WWW)": "World Wide Web. 인터넷 위에서 동작하는 서비스 중 하나. 브라우저로 웹사이트를 보는 것이 웹 사용.",
    "URL": "Uniform Resource Locator. 인터넷에서 원하는 페이지를 찾아가기 위한 주소. 프로토콜+도메인+경로로 구성.",
    "IP 주소": "컴퓨터마다 부여된 고유 숫자 주소. 예: 114.203.209.83. 사람이 외우기 어려워 도메인을 사용한다.",
    "도메인": "IP 주소 대신 사람이 기억하기 쉽게 만든 이름. 예: sam.jooil.co.kr. DNS가 IP로 변환해준다.",
    "DNS": "Domain Name System. 도메인 이름을 IP 주소로 변환하는 시스템. 인터넷의 전화번호부 역할.",
    "브라우저": "웹 페이지를 보여주는 프로그램. Chrome, Edge, Safari 등. 인터넷 세상을 보는 창문.",
    "HTTP": "HyperText Transfer Protocol. 브라우저와 서버가 데이터를 주고받는 규칙(주문서 양식).",
    "HTTPS": "HTTP에 SSL/TLS 암호화를 적용한 보안 통신. 데이터를 봉투에 넣어 잠그고 전송한다.",
    "404": "Not Found. 요청한 페이지를 찾을 수 없음. URL 주소가 틀렸거나 삭제된 페이지.",
    "500": "Internal Server Error. 서버 내부 오류. 프로그램 코드에 문제가 발생한 상태.",
    "502": "Bad Gateway. 백엔드 서비스가 응답하지 않는 상태. 서비스가 중단되었을 수 있음.",
    "403": "Forbidden. 접근 권한이 없음. 해당 페이지를 볼 수 있는 권한이 부족한 상태.",
    "클라우드": "내 컴퓨터가 아닌 인터넷 상의 서버에서 서비스를 제공하는 방식. 설치 없이 브라우저로 사용.",
    "SaaS": "Software as a Service. 소프트웨어를 구독하여 인터넷으로 사용하는 방식. 넷플릭스처럼.",
    "구독": "매달 이용료를 내고 서비스를 사용하는 방식. 큰 초기 비용 없이 바로 사용 가능.",
    "로그인": "아이디와 비밀번호로 자신을 인증하는 과정. 사원증을 제시하여 출입하는 것과 같다.",
    "세션": "로그인 후 서버가 발급하는 임시 출입증. 유효시간이 지나면 다시 로그인이 필요하다.",
    "ERP": "Enterprise Resource Planning. 영업·생산·재고·회계 등 회사 전체를 통합 관리하는 시스템.",
    "MES": "Manufacturing Execution System. 공장 현장의 생산 공정을 실시간으로 관리하는 시스템.",
    "데이터베이스": "데이터를 체계적으로 저장·관리하는 시스템. 수백 개의 엑셀 시트를 자동 관리하는 초대형 파일.",
    "API": "Application Programming Interface. 프로그램 간 데이터를 주고받는 창구. 식당의 메뉴판과 주문 시스템.",
    "백업": "데이터의 복사본을 안전한 곳에 보관하는 것. 원본 손상 시 복구할 수 있다.",
    "캐시": "자주 사용하는 데이터를 임시로 저장하여 속도를 높이는 기법. 쌓이면 오류 원인이 되기도 한다.",
    "새로고침": "현재 페이지를 다시 불러오는 것. F5 또는 Ctrl+R. 일시적 오류의 대부분이 해결된다.",
    "암호화": "데이터를 제3자가 읽을 수 없는 형태로 변환하는 것. HTTPS가 대표적인 암호화 통신."
};
@elseif($domain === 'server-knowledge')
window.__GLOSSARY_DATA['server-knowledge'] = {
    "Nginx": "고성능 웹 서버 소프트웨어. 리버스 프록시, 로드 밸런싱 등을 처리한다.",
    "PHP-FPM": "PHP FastCGI Process Manager. PHP 스크립트를 처리하는 프로세스 관리자.",
    "MySQL": "오픈소스 관계형 데이터베이스 관리 시스템(RDBMS). SQL로 데이터를 관리한다.",
    "Docker": "애플리케이션을 컨테이너로 패키징하여 어디서나 동일하게 실행할 수 있게 하는 플랫폼.",
    "컨테이너": "앱과 실행 환경을 격리하여 패키징한 가상화 단위. VM보다 가볍고 빠르다.",
    "SSH": "Secure Shell. 원격 서버에 암호화된 통신으로 안전하게 접속하는 프로토콜.",
    "Git": "소스 코드 버전 관리 시스템. 변경 이력을 추적하고 협업을 지원한다.",
    "Hook": "특정 이벤트 발생 시 자동으로 실행되는 스크립트. Git Hook, Webhook 등이 있다.",
    "chmod": "파일·디렉토리의 접근 권한(읽기/쓰기/실행)을 변경하는 리눅스 명령어.",
    "chown": "파일·디렉토리의 소유자와 소유 그룹을 변경하는 리눅스 명령어.",
    "umask": "새로 생성되는 파일의 기본 권한을 제어하는 설정값.",
    "502 Bad Gateway": "웹 서버가 백엔드(PHP-FPM 등)로부터 정상 응답을 받지 못할 때 발생하는 오류.",
    "리버스 프록시": "클라이언트 요청을 받아 백엔드 서버로 전달하는 중간 서버. Nginx가 대표적이다.",
    "포트": "네트워크 통신에서 프로세스를 구분하는 번호. HTTP는 80, HTTPS는 443을 사용한다.",
    "HTTPS": "HTTP에 SSL/TLS 암호화를 적용한 보안 통신 프로토콜.",
    "SSL/TLS": "인터넷 통신을 암호화하여 데이터를 보호하는 보안 프로토콜.",
    "DNS": "도메인 이름(예: example.com)을 IP 주소로 변환하는 시스템.",
    "IP 주소": "네트워크에서 장치를 식별하는 고유 번호. IPv4(예: 192.168.1.1)와 IPv6가 있다.",
    "프로세스": "실행 중인 프로그램의 인스턴스. 각각 고유 PID를 가진다.",
    "데몬": "백그라운드에서 지속적으로 실행되는 서비스 프로세스. 이름 뒤에 d를 붙인다(예: mysqld).",
    "로그": "시스템·애플리케이션의 동작 기록. 오류 추적과 모니터링에 필수적이다.",
    "배포": "개발 완료된 코드를 서버에 적용하여 사용자에게 서비스하는 과정.",
    "크론": "리눅스에서 정해진 시간에 명령을 자동 실행하는 스케줄러.",
    "방화벽": "허가되지 않은 네트워크 접근을 차단하는 보안 시스템. iptables, ufw 등이 있다.",
    "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 === 'nginx-encyclopedia')
window.__GLOSSARY_DATA['nginx-encyclopedia'] = {
    "Nginx": "고성능 웹 서버이자 리버스 프록시. 이벤트 기반 비동기 처리로 적은 메모리로 수만 개 동시 접속을 처리한다.",
    "리버스 프록시": "클라이언트 요청을 받아 적절한 내부 서비스로 전달하는 중간 서버. SAM에서 외부 Nginx가 이 역할을 한다.",
    "server 블록": "Nginx 설정에서 하나의 도메인(가상 호스트)을 정의하는 설정 단위. server_name으로 도메인을 지정한다.",
    "location 블록": "server 블록 안에서 URL 경로별 처리 규칙을 정의하는 설정 단위. 정규식이나 접두사로 매칭한다.",
    "upstream": "Nginx가 요청을 전달할 백엔드 서버 그룹을 정의하는 디렉티브. 로드 밸런싱에 사용한다.",
    "proxy_pass": "클라이언트 요청을 다른 서버(백엔드)로 전달하는 디렉티브. HTTP 프록시 방식으로 동작한다.",
    "FastCGI": "웹 서버와 애플리케이션(PHP 등) 사이의 고속 통신 프로토콜. CGI의 성능 개선 버전이다.",
    "fastcgi_pass": "PHP-FPM 등 FastCGI 서버에 요청을 전달하는 디렉티브. proxy_pass와 비슷하지만 FastCGI 프로토콜을 사용한다.",
    "try_files": "요청된 URI에 대해 파일 존재 여부를 순서대로 확인하는 디렉티브. 없으면 마지막 인자(Laravel의 index.php)로 전달한다.",
    "SSL/TLS": "인터넷 통신을 암호화하여 데이터를 보호하는 보안 프로토콜. HTTPS의 기반 기술이다.",
    "ssl_protocols": "허용할 TLS 버전을 지정하는 디렉티브. SAM은 TLSv1.2와 TLSv1.3만 허용한다.",
    "HTTP/2": "HTTP 프로토콜의 2세대 버전. 하나의 TCP 연결에서 여러 요청을 동시에 처리하는 멀티플렉싱을 지원한다.",
    "WebSocket": "서버와 클라이언트 간 양방향 실시간 통신을 지원하는 프로토콜. Upgrade 헤더로 HTTP 연결을 전환한다.",
    "HSTS": "HTTP Strict Transport Security. 브라우저에게 항상 HTTPS로 접속하도록 강제하는 보안 헤더.",
    "X-Frame-Options": "웹 페이지가 iframe에 삽입되는 것을 제어하는 보안 헤더. 클릭재킹(clickjacking) 공격을 방지한다.",
    "client_max_body_size": "클라이언트가 업로드할 수 있는 최대 요청 본문 크기를 설정하는 디렉티브. SAM은 100MB로 설정되어 있다.",
    "expires": "응답에 캐시 만료 시간을 설정하는 디렉티브. 30d는 30일간 브라우저 캐시에 보관하라는 의미이다.",
    "access_log": "클라이언트의 요청 기록을 저장하는 로그 파일. IP, 요청 경로, 응답 코드, User-Agent 등이 기록된다.",
    "error_log": "Nginx 오류 및 경고를 기록하는 로그 파일. 설정 오류, 백엔드 연결 실패 등이 기록된다.",
    "nginx -t": "Nginx 설정 파일의 문법 오류를 검사하는 명령어. 설정 변경 후 반드시 실행하여 오류를 확인해야 한다."
};
@elseif($domain === 'docker-commands')
window.__GLOSSARY_DATA['docker-commands'] = {
    "docker ps": "실행 중인 컨테이너 목록을 보여주는 명령어. -a를 붙이면 중지된 컨테이너까지 표시한다.",
    "docker exec": "실행 중인 컨테이너 안에서 명령을 실행하는 명령어. SAM에서 php artisan 명령을 실행할 때 필수로 사용한다.",
    "docker logs": "컨테이너가 출력한 로그를 확인하는 명령어. -f로 실시간 추적, --tail로 최근 N줄만 볼 수 있다.",
    "docker start": "중지된 컨테이너를 다시 시작하는 명령어.",
    "docker stop": "실행 중인 컨테이너를 안전하게 중지하는 명령어. 프로세스에 종료 신호를 보낸다.",
    "docker restart": "컨테이너를 중지 후 즉시 다시 시작하는 명령어. stop + start를 한 번에 실행하는 것과 같다.",
    "docker images": "로컬에 저장된 Docker 이미지 목록을 보여주는 명령어. 이미지는 컨테이너를 만들기 위한 설계도이다.",
    "docker compose up": "docker-compose.yml에 정의된 모든 서비스를 한 번에 생성하고 시작하는 명령어. -d로 백그라운드 실행.",
    "docker compose down": "Compose로 생성된 모든 컨테이너를 중지하고 제거하는 명령어. -v를 붙이면 볼륨까지 삭제되므로 주의.",
    "docker compose ps": "Compose로 관리되는 서비스들의 상태를 보여주는 명령어.",
    "docker compose logs": "Compose 서비스의 로그를 확인하는 명령어. 서비스 이름을 지정하여 특정 서비스만 볼 수 있다.",
    "docker compose restart": "Compose 서비스를 재시작하는 명령어. 서비스 이름을 지정하면 해당 서비스만 재시작한다.",
    "-it 플래그": "-i(interactive)와 -t(tty)를 합친 옵션. 키보드 입력이 필요한 대화형 프로그램(bash, tinker 등) 실행 시 필수.",
    "--tail": "로그 출력을 최근 N줄로 제한하는 옵션. docker logs --tail 50처럼 사용한다.",
    "-f (follow)": "실시간으로 새 로그를 계속 출력하는 옵션. docker logs -f로 사용하며 Ctrl+C로 종료한다.",
    "--since": "지정한 시간 이후의 로그만 출력하는 옵션. --since 30m(30분), --since 2h(2시간) 형태로 사용한다.",
    "-d (detached)": "컨테이너를 백그라운드에서 실행하는 옵션. docker compose up -d로 주로 사용한다.",
    "볼륨(Volume)": "컨테이너 데이터를 영구적으로 저장하는 Docker 관리 저장소. 컨테이너 삭제 후에도 데이터가 유지된다.",
    "docker volume ls": "생성된 Docker 볼륨 목록을 보여주는 명령어.",
    "docker network ls": "생성된 Docker 네트워크 목록을 보여주는 명령어.",
    "samnet": "SAM 프로젝트의 Docker 브리지 네트워크. 모든 컨테이너가 이 네트워크로 서로 통신한다.",
    "docker system prune": "사용하지 않는 Docker 리소스(컨테이너, 이미지, 네트워크)를 일괄 삭제하는 명령어. -a 옵션은 위험.",
    "docker-compose.yml": "Docker Compose의 설정 파일. 서비스, 볼륨, 네트워크 등을 YAML 형식으로 정의한다."
};
@elseif($domain === 'env-management')
window.__GLOSSARY_DATA['env-management'] = {
    ".env": "환경 변수를 저장하는 설정 파일. DB 접속 정보, API 키 등 환경마다 달라지는 값을 관리한다.",
    ".env.example": ".env의 양식 파일. 어떤 변수가 필요한지 보여주지만 실제 비밀 값은 비어 있다. Git에 포함된다.",
    "환경 변수": "운영체제나 앱에 전달되는 설정값. 코드 변경 없이 동작을 바꿀 수 있다.",
    "config:clear": "Laravel이 캐시한 설정을 초기화하는 Artisan 명령. .env 변경 후 반드시 실행해야 한다.",
    "Override": "상위 설정이 하위 설정을 덮어쓰는 것. Docker environment가 .env보다 우선 적용된다.",
    "HMAC": "Hash-based Message Authentication Code. 비밀 키를 이용한 메시지 무결성 검증 방식.",
    "INTERNAL_EXCHANGE_SECRET": "MNG와 API 서버 간 HTTP 통신 시 HMAC 인증에 사용하는 공유 비밀 키.",
    "APP_KEY": "Laravel 앱의 암호화 키. 세션, 쿠키, 비밀번호 재설정 토큰 등의 암호화에 사용된다.",
    "APP_DEBUG": "Laravel 디버그 모드 설정. true이면 에러 시 상세 정보가 표시된다. 운영에서는 반드시 false.",
    "Sanctum": "Laravel 공식 API 인증 패키지. SPA와 모바일 앱을 위한 토큰 발급·인증을 처리한다.",
    "서비스 계정": "Google Cloud에서 앱이 API에 접근할 때 사용하는 인증 계정. JSON 키 파일로 관리한다.",
    "docker-compose": "여러 Docker 컨테이너를 하나의 YAML 파일로 정의하고 함께 실행하는 도구.",
    "바인드 마운트": "호스트의 특정 경로를 컨테이너에 직접 연결하는 방식. 소스 코드 실시간 동기화에 사용한다.",
    "FCM": "Firebase Cloud Messaging. Google의 무료 푸시 알림 서비스.",
    "GCS": "Google Cloud Storage. Google의 클라우드 파일 저장소 서비스."
};
@elseif($domain === 'git-tools')
window.__GLOSSARY_DATA['git-tools'] = {
    "Git Graph": "VS Code 확장 프로그램. 브랜치를 색상별 그래프로 시각화하여 커밋 이력을 한눈에 파악할 수 있다.",
    "GitLens": "VS Code 확장 프로그램. 코드 줄마다 누가, 언제, 왜 수정했는지 Inline Blame으로 보여준다.",
    "Rebase": "브랜치의 커밋들을 다른 브랜치 위에 재배치하는 것. 이력이 깔끔한 직선이 되지만 커밋 해시가 변경된다.",
    "Merge": "두 브랜치의 변경 사항을 하나로 합치는 것. 합류 기록(Merge 커밋)이 남아 이력이 보존된다.",
    "Interactive Rebase": "커밋 순서 변경, 합치기(Squash), 수정 등을 대화형으로 수행하는 Rebase. git rebase -i로 실행한다.",
    "Squash": "여러 개의 커밋을 하나로 합치는 것. 불필요한 중간 커밋을 정리할 때 사용한다.",
    "Cherry-pick": "다른 브랜치의 특정 커밋 하나만 현재 브랜치에 가져오는 것. 전체 Merge 없이 필요한 변경만 적용한다.",
    "HEAD": "현재 체크아웃된 브랜치의 최신 커밋을 가리키는 포인터. '지금 내가 보고 있는 위치'를 뜻한다.",
    "Fast-forward": "브랜치 사이에 분기가 없을 때 포인터만 앞으로 이동하는 Merge 방식. Merge 커밋이 생성되지 않는다.",
    "Blame": "파일의 각 줄을 누가 마지막으로 수정했는지 보여주는 기능. git blame 명령어 또는 GitLens Inline Blame으로 확인한다.",
    "Source Control": "VS Code에 내장된 Git 관리 패널. Ctrl+Shift+G로 열 수 있으며 Stage, Commit, Push 등을 GUI로 수행한다.",
    "Diff": "두 버전 간 차이를 줄 단위로 비교하는 것. 추가(초록), 삭제(빨강), 수정(파랑)으로 색상 구분된다.",
    "Stash": "작업 중인 변경 사항을 임시로 저장하고 Working Directory를 깨끗하게 만드는 기능. 나중에 꺼내어 적용할 수 있다.",
    "GitKraken": "유료 독립 Git GUI 도구. 직관적 UI와 드래그&드롭 방식의 Merge/Rebase를 지원한다.",
    "Sourcetree": "Atlassian에서 제공하는 무료 Git GUI 도구. Windows와 macOS를 지원한다.",
    "Fork": "경량 유료 Git GUI 도구. 빠른 속도와 깔끔한 인터페이스가 특징이다.",
    "lazygit": "터미널에서 동작하는 Git TUI(Text UI) 도구. SSH 환경에서도 시각적으로 Git을 관리할 수 있다.",
    "Timeline": "VS Code 파일 탐색기 하단의 패널. 파일의 변경 이력을 시간순으로 보여준다.",
    "Conflict": "같은 파일의 같은 부분을 두 사람이 다르게 수정했을 때 발생하는 충돌. 수동으로 해결해야 한다.",
    "3-way Merge": "공통 조상, 현재 브랜치, 대상 브랜치 세 가지를 비교하여 충돌을 해결하는 Merge 방식."
};
@elseif($domain === 'equipment')
window.__GLOSSARY_DATA['equipment'] = {
    "BM": "Breakdown Maintenance(사후보전). 설비가 고장난 후에 수리하는 보전 방식. 가장 기본적이지만 비용과 손실이 크다.",
    "PM": "Preventive Maintenance(예방보전). 고장이 발생하기 전에 정기적으로 점검·교체하는 보전 방식.",
    "PdM": "Predictive Maintenance(예지보전). 센서 데이터로 고장 징후를 사전에 감지하여 적시에 보전하는 방식.",
    "OEE": "Overall Equipment Effectiveness(설비종합효율). 가동률 x 성능효율 x 양품률로 계산하며, 설비 생산성의 핵심 지표.",
    "MTBF": "Mean Time Between Failures(평균 고장 간격). 고장 없이 가동한 평균 시간. 값이 클수록 신뢰성이 높다.",
    "MTTR": "Mean Time To Repair(평균 수리 시간). 고장 발생부터 복구까지 걸리는 평균 시간. 값이 작을수록 보전 역량이 높다.",
    "TPM": "Total Productive Maintenance(전원참여 생산보전). 생산부서와 보전부서가 함께 설비 효율을 극대화하는 활동.",
    "가동률": "설비가 실제로 가동된 시간의 비율. 계획 가동시간 대비 실제 가동시간으로 계산한다.",
    "성능효율": "설비가 정상 속도로 가동된 비율. 이론 사이클타임 대비 실제 생산 속도를 나타낸다.",
    "양품률": "생산된 제품 중 양품의 비율. 불량품을 제외한 실제 합격품 비율이다.",
    "ISO 9001": "품질경영시스템 국제 표준. 조직이 고객 요구사항을 충족하고 지속적으로 개선하는 체계를 인증한다.",
    "IATF 16949": "자동차 산업 품질경영시스템 표준. ISO 9001을 기반으로 자동차 산업 고유 요구사항을 추가한다.",
    "예방보전": "Preventive Maintenance. 설비 고장을 예방하기 위해 계획적으로 수행하는 점검·정비·교체 활동.",
    "사후보전": "Breakdown Maintenance. 설비가 고장난 후에 수리하는 방식. 비계획 정지가 발생하여 손실이 크다.",
    "예지보전": "Predictive Maintenance. 설비 상태를 모니터링하여 고장을 사전 예측하고 최적 시점에 보전하는 방식.",
    "파레토 분석": "고장 원인을 빈도순으로 정렬하여 상위 20%의 원인이 80%의 문제를 유발한다는 법칙을 활용하는 분석 기법.",
    "Why-Why 분석": "왜(Why)를 5번 반복하여 고장의 근본 원인을 파악하는 분석 기법. 5 Whys라고도 한다.",
    "교정": "측정 장비의 정확도를 기준 장비와 비교하여 확인·조정하는 활동. 품질 관리의 기본 요소.",
    "보전구분": "수리 작업의 수행 주체 분류. 사내보전(자체 인력)과 외주보전(협력업체)으로 구분한다.",
    "설비이력": "설비의 등록부터 점검, 수리, 폐기까지 전체 생애주기 동안의 기록. 이력 관리는 품질 심사의 핵심 증빙."
};
@endif
</script>
<script src="{{ asset('js/academy-glossary.js') }}" defer></script>
