<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>THE STAR SHINING IN THE MIDDLE</title>
    <link>https://19-97.tistory.com/</link>
    <description>개발 공부 공책</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 20:30:18 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>#1997</managingEditor>
    <image>
      <title>THE STAR SHINING IN THE MIDDLE</title>
      <url>https://tistory1.daumcdn.net/tistory/4094718/attach/481ed05fdb74412c85996b347acc2652</url>
      <link>https://19-97.tistory.com</link>
    </image>
    <item>
      <title>퍼플렉시티 프로 실전 프롬프트</title>
      <link>https://19-97.tistory.com/206</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cdn.tailwindcss.com&quot;&gt;&lt;/script&gt;
&lt;div&gt;
  &lt;style&gt;
    @import url('https://fonts.googleapis.com/css2?family=Pretendard:wght@400;600;700;800&amp;display=swap');

    /* 티스토리 스타일 간섭 방지 및 기본 폰트 설정 */
    .tistory-prompt-container {
      font-family:
        'Pretendard',
        -apple-system,
        BlinkMacSystemFont,
        system-ui,
        sans-serif !important;
      line-height: 1.6 !important;
      color: #1e293b !important;
    }

    .prompt-card {
      transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
      border: 2px solid #e2e8f0;
      background: white;
      margin-bottom: 2.5rem; /* 1줄 정렬 시 카드 간 간격 */
    }

    .prompt-card:hover {
      transform: translateY(-5px);
      box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
      border-color: #4f46e5;
    }

    .chapter-nav-item {
      transition: all 0.2s;
      border-width: 2px;
      cursor: pointer;
    }

    .chapter-nav-item.active {
      background-color: #4f46e5 !important;
      color: white !important;
      border-color: #4f46e5 !important;
    }

    .sticky-header {
      position: sticky;
      top: 0;
      z-index: 50;
      backdrop-filter: blur(15px);
      background-color: rgba(255, 255, 255, 0.9);
      border-bottom: 1px solid #e2e8f0;
    }

    .no-scrollbar::-webkit-scrollbar {
      display: none;
    }
    .no-scrollbar {
      -ms-overflow-style: none;
      scrollbar-width: none;
    }

    /* 하이라이트 스타일 */
    mark {
      background-color: #dbeafe !important;
      color: #1e1b4b !important;
      border-radius: 4px;
      padding: 0 2px;
      font-weight: 800;
    }

    /* 복사 알림 토스트 */
    #copyToast {
      position: fixed;
      bottom: 2rem;
      left: 50%;
      transform: translateX(-50%);
      background-color: #0f172a;
      color: white;
      padding: 1rem 2rem;
      border-radius: 1rem;
      box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
      display: none;
      z-index: 100;
      font-weight: bold;
    }
    .toast-show {
      display: block !important;
      animation: slideUp 0.3s ease-out;
    }
    @keyframes slideUp {
      from {
        bottom: 1rem;
        opacity: 0;
      }
      to {
        bottom: 2rem;
        opacity: 1;
      }
    }
  &lt;/style&gt;
&lt;/div&gt;
&lt;!-- Header Section --&gt;
&lt;header class=&quot;sticky-header mb-8&quot;&gt;
  &lt;div class=&quot;max-w-4xl mx-auto px-4 py-4&quot;&gt;
    &lt;div class=&quot;flex flex-col gap-4&quot;&gt;
      &lt;div class=&quot;flex items-center justify-between&quot;&gt;&amp;nbsp;&lt;/div&gt;
      &lt;!-- Search Box --&gt;
      &lt;div class=&quot;relative&quot;&gt;
        &lt;input
          id=&quot;searchInput&quot;
          class=&quot;w-full bg-slate-100 py-3 pl-12 pr-4 rounded-xl border-2 border-transparent focus:border-indigo-500 focus:bg-white text-base md:text-lg outline-none transition-all shadow-inner&quot;
          type=&quot;text&quot;
          placeholder=&quot;검색어를 입력하세요 (예: 설명법, 로드맵, 활용...)&quot;
        /&gt;
        &lt;i&gt;&lt;/i&gt;
      &lt;/div&gt;
      &lt;!-- Chapter Filter (Scrollable) --&gt;
      &lt;div class=&quot;flex gap-2 overflow-x-auto no-scrollbar pb-1&quot;&gt;
        &lt;button
          onclick=&quot;filterChapter('all')&quot;
          class=&quot;chapter-nav-item px-4 py-2 rounded-xl border-slate-200 text-sm font-bold whitespace-nowrap active bg-white&quot;
        &gt;
          전체
        &lt;/button&gt;
        &lt;button
          onclick=&quot;filterChapter(1)&quot;
          class=&quot;chapter-nav-item px-4 py-2 rounded-xl border-slate-200 text-sm font-bold whitespace-nowrap bg-white&quot;
        &gt;
          Ch.1 기초
        &lt;/button&gt;
        &lt;button
          onclick=&quot;filterChapter(2)&quot;
          class=&quot;chapter-nav-item px-4 py-2 rounded-xl border-slate-200 text-sm font-bold whitespace-nowrap bg-white&quot;
        &gt;
          Ch.2 트렌드
        &lt;/button&gt;
        &lt;button
          onclick=&quot;filterChapter(3)&quot;
          class=&quot;chapter-nav-item px-4 py-2 rounded-xl border-slate-200 text-sm font-bold whitespace-nowrap bg-white&quot;
        &gt;
          Ch.3 마케팅
        &lt;/button&gt;
        &lt;button
          onclick=&quot;filterChapter(4)&quot;
          class=&quot;chapter-nav-item px-4 py-2 rounded-xl border-slate-200 text-sm font-bold whitespace-nowrap bg-white&quot;
        &gt;
          Ch.4 학습
        &lt;/button&gt;
        &lt;button
          onclick=&quot;filterChapter(5)&quot;
          class=&quot;chapter-nav-item px-4 py-2 rounded-xl border-slate-200 text-sm font-bold whitespace-nowrap bg-white&quot;
        &gt;
          Ch.5 업무
        &lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/header&gt;
&lt;!-- Main Content (1줄 정렬 레이아웃) --&gt;
&lt;main class=&quot;max-w-4xl mx-auto px-4 pb-20&quot;&gt;
  &lt;div class=&quot;mb-12 border-l-4 border-indigo-600 pl-4 py-2&quot;&gt;
    &lt;h2
      class=&quot;text-3xl md:text-4xl font-black text-slate-900&quot;
      data-ke-size=&quot;size26&quot;
    &gt;
      실전 프롬프트 50선
    &lt;/h2&gt;
  &lt;/div&gt;
  &lt;!-- 카드들이 여기에 1열로 나열됨 --&gt;
  &lt;div id=&quot;promptGrid&quot; class=&quot;flex flex-col gap-8&quot;&gt;
    &lt;!-- JavaScript Injected Content --&gt;
  &lt;/div&gt;
&lt;/main&gt;
&lt;!-- Toast Notification --&gt;
&lt;div id=&quot;copyToast&quot;&gt;프롬프트가 복사되었습니다!&lt;/div&gt;
&lt;script&gt;
  // 전역 상태
  let currentFilter = 'all';

  const prompts = [
    // Chapter 1: AI 기초 개념 이해 (1-10)
    {
      ch: 1,
      id: 1,
      title: 'ELI5 설명법 — 어린이에게 설명하듯이',
      source: 'r/ChatGPT ★12k',
      eng: &quot;Explain [concept] to me as if I'm a complete beginner with no technical background. Use a simple real-world analogy that even a 10-year-old would understand. Then, give me 3 follow-up questions I should ask to go deeper.&quot;,
      kor: '[개념]을 기술 배경이 전혀 없는 완전한 초보자에게 설명해줘. 10살짜리도 이해할 수 있는 실생활 비유를 사용해줘. 그리고 더 깊이 공부하기 위해 내가 물어봐야 할 후속 질문 3가지도 알려줘.',
      reason:
        &quot;ELI5(Explain Like I'm 5)는 복잡한 개념을 가장 쉽고 명확하게 이해할 수 있는 핵심 학습법입니다.&quot;,
      tips: '이해가 안 될 때 1순위 / 후속 질문으로 심화학습 가능',
    },
    {
      ch: 1,
      id: 2,
      title: '소크라테스 대화법 — 질문으로 파고들기',
      source: 'r/PromptEngineering ★8k',
      eng: &quot;Use the Socratic method to help me understand [topic]. Ask me one question at a time, wait for my answer, then probe deeper. Don't give me the answer directly — guide me to discover it myself.&quot;,
      kor: '소크라테스 문답법을 사용해서 [주제]를 이해하도록 도와줘. 한 번에 한 가지 질문만 하고, 내 대답을 기다린 다음 더 깊이 파고들어줘. 답을 직접 알려주지 말고, 내가 스스로 발견하도록 이끌어줘.',
      reason:
        '수동적 학습을 능동적 사고로 전환하여 지식을 완전히 내 것으로 만듭니다.',
      tips: '시험/면접 준비 및 비판적 사고 훈련에 최적',
    },
    {
      ch: 1,
      id: 3,
      title: '파인만 테크닉 — 가르치면서 배우기',
      source: 'Twitter ★15k',
      eng: &quot;I'm going to explain [concept] to you as if I'm the teacher. After I finish, tell me: (1) what I got right, (2) what I got wrong or oversimplified, (3) the key gaps in my understanding. Here's my explanation: [your explanation]&quot;,
      kor: '내가 선생님처럼 [개념]을 설명할 거야. 내가 끝나면 (1) 내가 맞게 이해한 것, (2) 틀렸거나 너무 단순화한 것, (3) 내 이해의 핵심 빈틈을 말해줘. 내 설명: [나의 설명 입력]',
      reason:
        '자신의 이해도를 객관적으로 파악하고 누락된 부분을 즉시 보완할 수 있습니다.',
      tips: '공부한 직후 이해도 확인 / 오개념 교정에 강력 추천',
    },
    {
      ch: 1,
      id: 4,
      title: '비교 학습 — 두 개념의 차이 완벽 정리',
      source: 'HN ★6k',
      eng: 'Compare [Concept A] vs [Concept B] for someone learning AI. Create a table with: key differences, when to use each, common misconceptions, and a memorable one-sentence summary for each. Include real-world examples.',
      kor: 'AI를 공부하는 사람을 위해 [개념 A]와 [개념 B]를 비교해줘. 핵심 차이점, 언제 무엇을 쓰는지, 흔한 오해, 각각의 한 줄 요약을 표로 만들어줘. 실제 사례도 포함해줘.',
      reason:
        '유사한 개념 간의 혼란을 방지하고 명확한 선택 기준을 마련해줍니다.',
      tips: 'ML vs DL / GPT vs Claude 등 헷갈리는 기술 비교 시 사용',
    },
    {
      ch: 1,
      id: 5,
      title: '용어 사전 만들기 — 나만의 AI 단어장',
      source: 'r/learnml ★9k',
      eng: &quot;I just read about [AI topic]. Extract the top 10 technical terms I must know, and for each: give a plain-English definition (1 sentence), a real-world analogy, and an example sentence showing how it's used in context.&quot;,
      kor: '[AI 주제]에 대해 방금 읽었어. 내가 꼭 알아야 할 핵심 기술 용어 10개를 뽑아서, 각각: 쉬운 한 줄 정의, 실생활 비유, 문맥에서 어떻게 쓰이는지 예문을 알려줘.',
      reason: '기술적 장벽을 낮추기 위해 맥락 중심의 용어 이해를 돕습니다.',
      tips: '논문이나 기술 아티클 독해 중 핵심 용어 정리용',
    },
    {
      ch: 1,
      id: 6,
      title: '오해 교정기 — 잘못된 믿음 부수기',
      source: 'r/artificial ★7k',
      eng: 'What are the top 5 misconceptions beginners have about [AI concept]? For each, explain: (1) what people incorrectly believe, (2) what is actually true, (3) why this misunderstanding is common. Cite sources.',
      kor: '[AI 개념]에 대해 초보자들이 가장 많이 하는 오해 5가지는 뭐야? 각 오해마다: (1) 사람들이 잘못 믿는 것, (2) 실제 사실, (3) 왜 이런 오해가 생기는지 설명해줘. 최신 출처도 인용해줘.',
      reason: '오개념을 바로잡는 것이 올바른 학습의 가장 빠른 지름길입니다.',
      tips: '유명하지만 잘못 알려진 AI 상식 교정에 활용',
    },
    {
      ch: 1,
      id: 7,
      title: '역사적 맥락 이해 — 탄생의 이유',
      source: 'LinkedIn ★5k',
      eng: &quot;Tell me the origin story of [AI technology]. What problem was it invented to solve? Who created it and when? What was the 'aha moment'? How has it evolved? Present this as a compelling narrative.&quot;,
      kor: &quot;[AI 기술]의 탄생 스토리를 알려줘. 어떤 문제를 해결하려고 만들어졌어? 누가 언제 만들었어? 'Aha 모멘트'는 뭐였어? 그 이후로 어떻게 진화했어? 짧지만 흥미로운 이야기처럼 들려줘.&quot;,
      reason:
        &quot;기술이 탄생한 '왜'를 이해하면 현재의 설계 방식을 더 잘 받아들일 수 있습니다.&quot;,
      tips: '딱딱한 기술 지식을 부드러운 이야기로 변환',
    },
    {
      ch: 1,
      id: 8,
      title: '체크포인트 학습 — 이해도 셀프 테스트',
      source: 'r/learncoding ★11k',
      eng: &quot;I think I understand [concept]. Please give me 5 short questions to test my comprehension — basic to advanced. After I answer, score me and explain any gaps. Don't reveal the answers until I try.&quot;,
      kor: '[개념]을 이해했다고 생각해. 내 이해도를 테스트할 짧은 질문 5개를 줘 — 기초부터 심화까지. 내가 답하면 점수를 매기고 빈틈을 설명해줘. 내가 답하기 전까지 정답은 알려주지 마.',
      reason: '인출(Retrieval) 연습은 기억 유지율을 비약적으로 높여줍니다.',
      tips: '공부 마무리 시점에 퀴즈를 통한 최종 확인',
    },
    {
      ch: 1,
      id: 9,
      title: '실제 작동 원리 — 뚜껑 열고 안을 들여다보기',
      source: 'HN ★14k',
      eng: &quot;Walk me through exactly how [AI system] works step by step, from input to output. Use concrete examples. Highlight where the 'magic' actually happens, and what current limitations are. No hand-waving.&quot;,
      kor: &quot;[AI 시스템]이 입력부터 출력까지 정확히 어떻게 작동하는지 단계별로 설명해줘. 각 단계마다 구체적인 예시를 들어줘. '마법'이 실제로 일어나는 부분이 어디인지 강조해줘. 현재 한계도 알려줘. 대충 넘어가지 말고.&quot;,
      reason:
        '블랙박스 상태의 기술을 투명하게 분해하여 기술적 깊이를 더합니다.',
      tips: 'LLM이나 이미지 생성 모델의 내부 로직 분석에 유용',
    },
    {
      ch: 1,
      id: 10,
      title: '학습 로드맵 생성 — 어디서부터 시작할까',
      source: 'r/MachineLearning ★18k',
      eng: &quot;Create a personalized 30-day learning roadmap for someone who wants to understand [AI topic]. I'm a [your background] and my goal is [your goal]. Include: daily topics, resources, and milestones. Realistic, not overwhelming.&quot;,
      kor: '[AI 주제]를 이해하고 싶은 사람을 위한 개인 맞춤 30일 학습 로드맵을 만들어줘. 나는 [나의 배경]이고 목표는 [나의 목표]야. 매일 학습할 주제, 하루 예상 시간, 무료 자료, 핵심 마일스톤을 포함해줘. 현실적으로, 부담스럽지 않게 만들어줘.',
      reason: '방대한 지식 속에서 길을 잃지 않도록 개인별 이정표를 제시합니다.',
      tips: '새로운 분야 입문 전 전체 계획 수립 시 사용',
    },

    // Chapter 2: 최신 AI 트렌드 &amp; 연구 (11-20)
    {
      ch: 2,
      id: 11,
      title: '논문 고속 분해 — 15분 만에 핵심 파악',
      source: 'r/ML ★22k',
      eng: &quot;Summarize the research paper '[paper title or URL]' for a non-expert. Cover: (1) problem, (2) innovation, (3) results in numbers, (4) implications, (5) limitations. Use simple language.&quot;,
      kor: &quot;비전문가를 위해 '[논문 제목 또는 URL]' 논문을 요약해줘. (1) 해결하는 문제, (2) 핵심 혁신, (3) 쉬운 숫자로 표현한 결과, (4) 실제 적용 시사점, (5) 한계점을 다뤄줘. 쉬운 언어로.&quot;,
      reason:
        '복잡한 학술 데이터를 실무에 즉시 적용 가능한 지식으로 압축합니다.',
      tips: '최신 논문을 빠르게 훑어야 할 때 필수',
    },
    {
      ch: 2,
      id: 12,
      title: '주간 AI 브리핑 — 이번 주 놓치면 안 될 뉴스',
      source: 'Twitter ★31k',
      eng: 'Give me a concise briefing on the most important AI developments from the past 7 days. For each: what happened, why it matters, and what to watch next. Prioritize impact over hype. Include sources.',
      kor: '지난 7일간 가장 중요한 AI 동향을 간결하게 브리핑해줘. 각 항목마다: 무슨 일이 있었는지, 왜 중요한지, 다음에 뭘 주목해야 하는지 알려줘. 단순 화제가 아닌 실제 파급력 기준으로 우선순위를 정해줘. 출처도 포함해줘.',
      reason:
        '퍼플렉시티의 실시간 검색 기능을 통해 정보의 최전선을 유지합니다.',
      tips: '매주 월요일 뉴스 브리핑 루틴에 사용',
    },
    {
      ch: 2,
      id: 13,
      title: '모델 비교 분석 — 최신 벤치마크 기반',
      source: 'r/singularity ★19k',
      eng: 'Compare [Model A] vs [Model B] based on latest benchmarks and user reports. Cover: strengths, weaknesses, best use cases, and which one is better for [my task]. Include recent sources.',
      kor: '최신 벤치마크와 사용자 리포트를 기반으로 [모델 A]와 [모델 B]를 비교해줘. 강점, 약점, 최적의 사용 사례, 그리고 내 작업([나의 작업])에 어떤 것이 더 나은지 다뤄줘. 최신 출처를 포함해줘.',
      reason:
        '매일 쏟아지는 새로운 모델들 중 최적의 도구를 선택할 수 있게 합니다.',
      tips: 'GPT-4o vs Claude 3.5 Sonnet 등 모델 선정 시 활용',
    },
    {
      ch: 2,
      id: 14,
      title: 'AI 도구 발굴 — 생산성을 높여줄 새 툴',
      source: 'Product Hunt ★16k',
      eng: &quot;What are the most talked-about new AI tools launched in the past 3 months for [use case]? For each: what it does, who it's for, and how it compares to alternatives. Include links.&quot;,
      kor: '지난 3개월간 출시된 [나의 사용 사례]와 관련된 가장 주목받는 신규 AI 도구들은 뭐야? 각각: 뭘 하는지, 누구를 위한 건지, 기존 대안과의 비교를 알려줘. 링크와 사용자 리뷰도 포함해줘.',
      reason:
        '정보의 불균형을 해소하고 나에게 필요한 도구를 남들보다 먼저 찾습니다.',
      tips: '디자인, 마케팅 등 분야별 도구 리서치',
    },
    {
      ch: 2,
      id: 15,
      title: '팩트체크 — AI 기사의 과장과 진실',
      source: 'HN ★12k',
      eng: &quot;I read this claim about AI: '[claim/headline]'. Break down what is true, what is exaggerated, what is missing context, and what the evidence says. Rate accuracy from 1-10 with sources.&quot;,
      kor: &quot;AI에 대한 이런 주장을 읽었어: '[주장이나 헤드라인]'. 이게 정확해? 사실인 것, 과장된 것, 맥락이 빠진 것, 실제 증거가 뭐라고 하는지 분석해줘. 정확도를 1~10점으로 매기고 이유를 설명해줘.&quot;,
      reason:
        '기술적 과대광고(Hype) 속에서 흔들리지 않는 객관적인 정보를 얻습니다.',
      tips: '자극적인 AI 뉴스에 대한 비판적 확인',
    },
    {
      ch: 2,
      id: 16,
      title: '산업별 AI 파괴적 영향 분석',
      source: 'Forbes ★10k',
      eng: 'Analyze how [industry] is being disrupted by [AI tech]. Identify top 3 winners, 3 at-risk roles, and 2 untapped opportunities. Use 2024-2025 data.',
      kor: '[특정 산업]이 [AI 기술]에 의해 어떻게 변화하고 있는지 분석해줘. 가장 큰 수혜자 3명, 위험한 직무 3개, 아직 개척되지 않은 기회 2개를 찾아줘. 최신 리포트를 사용해줘.',
      reason:
        '산업의 거시적 변화를 읽고 본인의 커리어 및 사업 전략을 수정합니다.',
      tips: '산업 트렌드 분석 및 취업/창업 전략 수립',
    },
    {
      ch: 2,
      id: 17,
      title: 'AI 윤리 및 법규 업데이트',
      source: 'r/Ethics ★5k',
      eng: 'Summarize the latest AI regulations passed in [Region/Country]. How will this impact developers and startups in [field]? List compliance steps.',
      kor: '[지역/국가]에서 통과된 최신 AI 규제를 요약해줘. 이게 [분야]의 개발자와 스타트업에 어떤 영향을 줄까? 준수해야 할 법적 단계는 뭐야?',
      reason:
        '법적 리스크를 선제적으로 파악하여 안전한 비즈니스 환경을 구축합니다.',
      tips: '글로벌 규제 대응 및 법적 안전장치 마련',
    },
    {
      ch: 2,
      id: 18,
      title: 'GitHub 인기 오픈소스 리서치',
      source: 'GitHub ★20k',
      eng: 'Find the top 5 trending open-source AI projects on GitHub related to [topic]. Explain key features, popularity reasons, and how to start using them.',
      kor: '[주제]와 관련된 GitHub의 인기 오픈소스 AI 프로젝트 5개를 찾아줘. 핵심 기능, 인기의 이유, 그리고 어떻게 시작하는지 설명해줘.',
      reason:
        '개발자 생태계의 실제 트렌드를 파악하고 도구를 커스텀하여 활용합니다.',
      tips: '개발자나 기술 기획자에게 강력 추천',
    },
    {
      ch: 2,
      id: 19,
      title: '기술적 딥다이브 — 신규 아키텍처 분석',
      source: 'r/ML ★15k',
      eng: 'Explain the architecture of [New Model/Tech]. What makes it different from Transformers? Show a logic flow diagram using text.',
      kor: '[신규 모델/기술]의 아키텍처를 설명해줘. 기존 트랜스포머와 무엇이 달라? 데이터 흐름을 텍스트 기반 다이어그램으로 그려줘.',
      reason: '표면적인 기능 설명을 넘어 기술의 구조적 우위를 이해합니다.',
      tips: '새로운 AI 기술의 작동 방식을 깊게 파고들 때',
    },
    {
      ch: 2,
      id: 20,
      title: 'VC 투자 트렌드 분석 — 돈이 흐르는 곳',
      source: 'Crunchbase ★7k',
      eng: 'Look at AI startup funding in [Quarter/Year]. Which sectors get most investment? What are common traits of companies that raised Series A+ recently?',
      kor: '[분기/연도]의 AI 스타트업 투자 현황을 봐줘. 어떤 섹터가 가장 많이 투자받고 있어? 최근 시리즈 A 이상을 유치한 기업들의 공통점은 뭐야?',
      reason: '자본의 흐름을 통해 가장 전도유망한 AI 응용 분야를 식별합니다.',
      tips: '시장 가치 판단 및 사업 아이템 선정',
    },

    // Chapter 3: 상품 기획 &amp; 마케팅 (21-30)
    {
      ch: 3,
      id: 21,
      title: '고객 페르소나 생성 — 상세 타겟팅',
      source: 'r/Entrepreneur ★14k',
      eng: 'Build a detailed customer persona for [product]. Include: demographics, psychographics, pain points, trusted sources, and buying triggers.',
      kor: '[제품/서비스]를 살 것 같은 사람의 상세 페르소나를 만들어줘. 인구통계, 심리적 특성, 일상적 페인포인트, 신뢰하는 정보 소스, 구매 트리거를 포함해줘.',
      reason: '가상의 고객을 구체화하여 마케팅 메시지의 적중률을 높입니다.',
      tips: '신제품 런칭 전 고객 타겟팅 단계',
    },
    {
      ch: 3,
      id: 22,
      title: '바이럴 콘텐츠 전략 — 공유 유도',
      source: 'Twitter ★18k',
      eng: 'Create a 30-day content calendar for [platform] about [topic]. Focus on high-engagement hooks and viral potential. List 5 headline templates.',
      kor: '[플랫폼]에서 [주제]에 대한 30일 콘텐츠 달력을 만들어줘. 참여도가 높은 훅과 바이럴 잠재력에 집중해줘. 제목 템플릿 5개도 알려줘.',
      reason:
        '지속 가능한 채널 운영을 위한 체계적인 콘텐츠 로드맵을 설계합니다.',
      tips: '인스타그램, 링크드인 등 SNS 운영 전략 수립',
    },
    {
      ch: 3,
      id: 23,
      title: 'AIDA 모델 기반 광고 카피',
      source: 'Copyblogger ★12k',
      eng: 'Write 3 variations of ad copy for [product] using the AIDA model. Focus on the emotional benefit of [feature]. Optimize for [target audience].',
      kor: 'AIDA 모델을 사용해서 [제품]의 광고 카피 3가지를 써줘. [기능]의 감정적 혜택에 집중하고 [타겟 대상]에 맞춰 최적화해줘.',
      reason:
        '검증된 마케팅 프레임워크로 고객의 시선을 끌고 구매를 유도합니다.',
      tips: '페이스북/구글 광고 및 상세 페이지 카피',
    },
    {
      ch: 3,
      id: 24,
      title: 'SEO 키워드 클러스터링',
      source: 'SearchEngineLand ★9k',
      eng: 'List 20 long-tail keywords for [topic] with high search intent. Cluster them into 4 content pillars and provide titles.',
      kor: '[주제]에 대해 검색 의도가 높은 롱테일 키워드 20개를 나열해줘. 이를 4개의 콘텐츠 기둥으로 묶고 각 기둥에 맞는 검색 최적화 제목을 지어줘.',
      reason:
        '단순 키워드 나열이 아닌 구조적인 SEO 전략으로 검색 상위 노출을 돕습니다.',
      tips: '블로그 주제 선정 및 검색 엔진 최적화',
    },
    {
      ch: 3,
      id: 25,
      title: '경쟁사 약점 파고들기 — 차별화 전략',
      source: 'HN ★7k',
      eng: 'Analyze user reviews for [Competitor Product] on Reddit and Twitter. What are their 3 biggest complaints? How can my [Product] solve these better?',
      kor: 'Reddit과 Twitter에서 [경쟁사 제품]에 대한 사용자 리뷰를 분석해줘. 가장 큰 불만 3가지는 뭐야? 내 [제품]이 이를 어떻게 더 잘 해결할 수 있어?',
      reason:
        '실제 고객의 불만(Pain points)에서 우리 제품의 강력한 소구점을 찾습니다.',
      tips: '경쟁 우위 확보 및 제품 개선 아이디어 도출',
    },
    {
      ch: 3,
      id: 26,
      title: '뉴스레터 리드 마그넷 설계',
      source: 'Substack ★6k',
      eng: &quot;Design a high-converting lead magnet for [topic]. Provide the landing page headline, 3 bullet points of value, and the 'Welcome' email subject line.&quot;,
      kor: '[주제] 뉴스레터를 위한 고효율 리드 마그넷(무료 혜택)을 설계해줘. 랜딩 페이지 제목, 3가지 핵심 가치, 첫 환영 이메일 제목을 제안해줘.',
      reason:
        '구독자의 유입을 강력하게 유도하는 매력적인 미끼와 첫인상을 설계합니다.',
      tips: 'DB 수집 및 뉴스레터 구독자 확대 전략',
    },
    {
      ch: 3,
      id: 27,
      title: '제품 포지셔닝 맵 생성',
      source: 'Forbes ★5k',
      eng: &quot;Map 5 competitors in [market] based on [Price] and [Innovation]. Define the 'White Space' where my product should exist to avoid direct price wars.&quot;,
      kor: &quot;[시장]의 경쟁사 5곳을 [가격]과 [혁신성] 기준으로 배치해줘. 가격 경쟁을 피하기 위해 내 제품이 위치해야 할 '블루오션'은 어디야?&quot;,
      reason: '시장 내 우리 브랜드의 독보적인 위치를 시각화하여 확인합니다.',
      tips: '브랜드 포지셔닝 및 신규 사업 방향 설정',
    },
    {
      ch: 3,
      id: 28,
      title: '답장오는 콜드 이메일 작성',
      source: 'Salesforce ★11k',
      eng: 'Write a short, non-spammy cold email to a [Job Title] at [Company]. Focus on solving [Problem]. Use a specific, low-friction call to action.',
      kor: '[회사]의 [직책]에게 보낼 짧고 정중한 콜드 이메일을 써줘. [문제] 해결에 집중하고, 부담 없는 구체적인 제안(CTA)을 포함해줘.',
      reason:
        '영업 및 비즈니스 네트워킹의 성공 확률을 높이는 심리적 문장을 작성합니다.',
      tips: '영업 제안 및 협업 요청 시 활용',
    },
    {
      ch: 3,
      id: 29,
      title: 'SaaS 가격 책정 전략 컨설팅',
      source: 'r/Startups ★8k',
      eng: 'Recommend a pricing strategy for a SaaS in [niche]. Compare Freemium vs. Flat Fee vs. Tiered. Which one maximizes LTV for [customer type]?',
      kor: '[분야] SaaS를 위한 가격 전략을 추천해줘. 무료체험, 단일 요금제, 단계별 요금제를 비교해보고 어떤 게 [고객 유형]의 생애 가치를 높일까?',
      reason:
        '수익성을 극대화하는 동시에 고객의 저항을 최소화하는 가격 모델을 제안합니다.',
      tips: 'B2B 서비스 요금제 설계 시 참고',
    },
    {
      ch: 3,
      id: 30,
      title: '브랜드 보이스 가이드라인 제작',
      source: 'Canva ★10k',
      eng: &quot;Create a brand voice guide for a company that wants to sound [Traits]. Give 3 examples of how to say 'We are sorry' and 'Join us' in this voice.&quot;,
      kor: &quot;[특성: 예-재치있는] 느낌을 주는 브랜드 보이스 가이드를 만들어줘. '죄송합니다'와 '함께하세요'를 이 목소리로 어떻게 표현할지 예시 3개를 줘.&quot;,
      reason:
        '고객과 만나는 모든 접점에서 일관된 브랜드 경험을 제공하게 합니다.',
      tips: '채널 운영 가이드 및 CS 대응 매뉴얼 구축',
    },

    // Chapter 4: 학습 최적화 (31-40)
    {
      ch: 4,
      id: 31,
      title: '복잡한 주제 단계별 분해 학습',
      source: 'r/college ★12k',
      eng: 'Break down [complex topic] into a series of prerequisite concepts I need to understand first. Start with basics and layer complexity gradually.',
      kor: '[복잡한 주제]를 먼저 이해해야 할 전제 개념들로 분해해줘. 기초부터 시작해서 점진적으로 심화 내용을 쌓아올려줘.',
      reason:
        '어려운 과목을 시작할 때 기초 지식이 없어 좌절하는 것을 방지합니다.',
      tips: '독학 시 학습 순서 설계용',
    },
    {
      ch: 4,
      id: 32,
      title: '암기용 플래시카드 생성',
      source: 'r/Anki ★16k',
      eng: &quot;Generate 15 flashcards in Q&amp;A format from this material. Focus on 'why' and 'how' for deep understanding. [Paste material]&quot;,
      kor: &quot;[학습 자료]에서 Q&amp;A 형식의 플래시카드 15개를 만들어줘. 단순 암기가 아닌 원리를 묻는 '왜'와 '어떻게'에 집중해줘.&quot;,
      reason:
        '능동적 회상을 통해 학습한 내용을 장기 기억으로 확실히 전환합니다.',
      tips: '시험 공부 및 전문 지식 암기 시 활용',
    },
    {
      ch: 4,
      id: 33,
      title: '핵심 요약 및 복습 질문',
      source: 'r/productivity ★9k',
      eng: 'I just studied [topic]. Give me: (1) 5-bullet summary, (2) the single most important concept, (3) 3 questions an expert would ask me.',
      kor: '[주제]를 방금 공부했어. (1) 5가지 핵심 요약, (2) 절대 잊으면 안 되는 단 하나의 개념, (3) 전문가가 나에게 물을 법한 질문 3가지를 알려줘.',
      reason:
        '학습 직후 복습은 망각을 막고 메타인지를 높이는 가장 효율적인 방법입니다.',
      tips: '강의 수강 후나 독서 후 마무리 루틴',
    },
    {
      ch: 4,
      id: 34,
      title: '논문/리포트 리서치 가이드',
      source: 'r/college ★20k',
      eng: &quot;I'm writing a paper on [topic]. Find 5 credible academic sources published after [year]. Summarize key findings and provide APA citations.&quot;,
      kor: '[주제]에 관한 리포트를 쓰고 있어. [연도] 이후 발표된 가장 신뢰할 수 있는 학술 출처 5개를 찾아줘. 핵심 발견을 요약하고 APA 형식으로 인용해줘.',
      reason:
        '신뢰할 수 있는 근거 자료를 빠르게 확보하여 논리적인 글쓰기를 지원합니다.',
      tips: '대학 과제 및 비즈니스 리서치 보고서 작성',
    },
    {
      ch: 4,
      id: 35,
      title: '비판적 사고 트레이너 — 반론 찾기',
      source: 'HN ★15k',
      eng: &quot;I'm presenting an argument for [Topic]. Act as a critical challenger. Find logical fallacies, weak evidence, and counter-arguments to my points.&quot;,
      kor: '[주제]에 대해 내 논리를 펼쳐볼게. 너는 아주 비판적인 반대자가 되어줘. 내 주장에서 논리적 오류와 약한 증거, 예상되는 반론을 찾아내줘.',
      reason:
        '자신의 주장을 미리 공격받아 봄으로써 완벽한 논리를 구축하게 돕습니다.',
      tips: '중요 회의 및 토론 준비 시 필수',
    },
    {
      ch: 4,
      id: 36,
      title: '어려운 개념 비유로 정복하기',
      source: 'r/ELI5 ★14k',
      eng: 'Explain [abstract concept] using 3 analogies: one from sports, one from nature, and one from technology. Which one fits best?',
      kor: '[추상적인 개념]을 3가지 다른 비유(스포츠, 자연, 기술)로 설명해줘. 어떤 비유가 가장 적절하고 이해가 잘 돼?',
      reason:
        '여러 관점의 비유를 통해 뇌가 새로운 지식을 더 쉽게 연결하게 합니다.',
      tips: '난해한 전문 지식 입문 단계에서 사용',
    },
    {
      ch: 4,
      id: 37,
      title: '실전 문제 생성 및 셀프 채점',
      source: 'r/learncoding ★13k',
      eng: 'Create a practical challenge to test my [skill]. Give instructions but no solution yet. After I submit my work, review it and give a 1-10 score.',
      kor: '내 [스킬]을 테스트할 실전 과제를 하나 만들어줘. 지침만 주고 정답은 아직 주지 마. 내가 제출하면 리뷰하고 1~10점으로 점수를 매겨줘.',
      reason:
        '이론 공부를 넘어 실제 활용 능력을 기르고 전문가의 피드백을 모방합니다.',
      tips: '코딩, 글쓰기, 기획 실습 시 활용',
    },
    {
      ch: 4,
      id: 38,
      title: '지식의 연결고리 찾기 (Linkage)',
      source: 'r/ObsidianMD ★11k',
      eng: 'How does [Concept A] relate to [Concept B]? Find a hidden connection or a shared principle that most beginners miss.',
      kor: '[개념 A]와 [개념 B]는 어떤 관계가 있어? 초보자가 놓치기 쉬운 숨겨진 연결고리나 공통 원리를 찾아줘.',
      reason:
        '단편적인 지식들을 엮어 거대한 지식의 체계(Second Brain)를 만듭니다.',
      tips: '통합적 사고가 필요한 기획자 및 연구자용',
    },
    {
      ch: 4,
      id: 39,
      title: '외국어 뉘앙스 완벽 마스터',
      source: 'r/languagelearning ★10k',
      eng: &quot;Explain the subtle difference between '[Word A]' and '[Word B]' in [Language]. Give 3 scenarios where one is appropriate and other is not.&quot;,
      kor: &quot;[외국어]에서 '[단어 A]'와 '[단어 B]'의 미묘한 차이를 설명해줘. 하나는 적절하지만 다른 하나는 어색한 상황 3가지를 예로 들어줘.&quot;,
      reason: '사전적 정의를 넘어 원어민의 실제 감각을 익힐 수 있게 돕습니다.',
      tips: '중급 이상의 어학 학습 및 비즈니스 소통 준비',
    },
    {
      ch: 4,
      id: 40,
      title: '나만의 학습 습관 디자인',
      source: 'r/AtomicHabits ★18k',
      eng: &quot;I want to master [skill] with only 20 mins a day. Create a 'Minimum Viable Routine' that maximizes retention using spaced repetition.&quot;,
      kor: &quot;[스킬]을 배우고 싶은데 하루에 20분밖에 시간이 없어. 간격 반복 학습을 활용해서 기억력을 극대화하는 '최소 실행 루틴'을 만들어줘.&quot;,
      reason:
        '시간 제약 속에서도 최대의 학습 성과를 내는 효율적 습관을 설계합니다.',
      tips: '바쁜 직장인이나 학생의 자기계발 로드맵',
    },

    // Chapter 5: 실전 업무 활용 (41-50)
    {
      ch: 5,
      id: 41,
      title: '회의록 자동 정리 및 액션 플랜',
      source: 'r/productivity ★15k',
      eng: 'Summarize these meeting notes into: (1) Key Decisions, (2) Owner assigned for each task, (3) Deadlines, (4) Next steps. [Notes]',
      kor: '이 회의록을 (1) 주요 결정 사항, (2) 각 담당자, (3) 마감 기한, (4) 다음 단계로 요약해줘. 깔끔한 표 형식으로 만들어줘. [내용]',
      reason: '회의 후 업무의 명확성을 즉시 확보하여 팀의 실행력을 높입니다.',
      tips: '팀 미팅이나 클라이언트 회의 직후 정리용',
    },
    {
      ch: 5,
      id: 42,
      title: '코드 리뷰 및 리팩토링 리포트',
      source: 'r/coding ★20k',
      eng: 'Review this code for: (1) bugs, (2) performance, (3) readability. Suggest a refactored version that follows best practices. [Code]',
      kor: '이 코드를 (1) 잠재적 버그, (2) 성능 병목, (3) 가독성 측면에서 리뷰해줘. 베스트 프랙티스를 따르는 리팩토링 버전을 제안해줘. [코드]',
      reason:
        '기술적 부채를 줄이고 유지보수 가능한 고품질 코드를 작성하게 돕습니다.',
      tips: '개발자 코드 품질 관리 및 협업 시 활용',
    },
    {
      ch: 5,
      id: 43,
      title: '프로젝트 리스크 사전 분석',
      source: 'HN ★12k',
      eng: &quot;We are launching [Project]. Imagine it's 6 months later and it failed miserably. Brainstorm 5 reasons why it failed and how to prevent them.&quot;,
      kor: '우리는 [프로젝트]를 시작할 거야. 6개월 후 이 프로젝트가 완전히 실패했다고 가정해봐. 왜 실패했을지 이유 5가지를 브레인스토밍하고 지금 어떻게 예방할지 알려줘.',
      reason:
        '실패 시나리오를 미리 검토(Pre-mortem)하여 성공 확률을 극대화합니다.',
      tips: '전략 기획 및 대규모 프로젝트 착수 전 필수',
    },
    {
      ch: 5,
      id: 44,
      title: '데이터 기반 비즈니스 인사이트 도출',
      source: 'r/datascience ★14k',
      eng: 'Analyze this raw data about [topic]. What are the top 3 surprising trends? What action should be taken based on this? Explain why. [Data]',
      kor: '[주제]에 대한 이 데이터를 분석해줘. 가장 놀라운 트렌드 3가지는 뭐야? 이 결과를 바탕으로 어떤 비즈니스 결정을 내려야 할까? 이유와 함께 알려줘.',
      reason:
        '단순한 숫자 나열이 아닌 의사결정에 실질적으로 도움이 되는 통찰을 제공합니다.',
      tips: '실적 데이터 분석 및 주간 보고서 작성용',
    },
    {
      ch: 5,
      id: 45,
      title: '논리적 의사결정 프레임워크 제안',
      source: 'Forbes ★9k',
      eng: &quot;I'm choosing between [Option A] and [Option B]. Use a 'Pros vs Cons' table and a 'Weighted Decision Matrix' to help me decide based on [Criteria].&quot;,
      kor: &quot;[옵션 A]와 [옵션 B] 사이에서 고민 중이야. [기준]들을 바탕으로 '장단점 비교표'와 '가중치 의사결정 매트릭스'를 만들어 내 선택을 도와줘.&quot;,
      reason:
        '감정에 치우치지 않고 객관적인 수치와 논리로 최선의 대안을 선택합니다.',
      tips: '중요한 비즈니스 선택 및 이직/투자 결정 시 사용',
    },
    {
      ch: 5,
      id: 46,
      title: '발표용 슬라이드 구성 및 스크립트',
      source: 'TED ★11k',
      eng: 'Design a 10-slide presentation for [Topic]. For each slide: headline, key visual idea, and a 3-sentence script for the presenter.',
      kor: '[주제]에 대한 10페이지 발표 자료를 구성해줘. 각 페이지마다 제목, 핵심 시각 이미지 아이디어, 그리고 발표자를 위한 3문장 스크립트를 작성해줘.',
      reason: '청중의 몰입을 유도하는 전문적인 발표 구조를 빠르게 설계합니다.',
      tips: '제안서 발표 및 강연 자료 초안 작성',
    },
    {
      ch: 5,
      id: 47,
      title: '비즈니스 보고서 경영진 요약 초안',
      source: 'HBR ★13k',
      eng: 'Draft an executive summary for a report on [topic]. Use a professional yet persuasive tone. Include: Problem, Solution, and Expected ROI.',
      kor: '[주제]에 대한 경영진 보고용 요약문(Executive Summary) 초안을 써줘. 전문적이면서도 설득력 있게, 문제점과 해결책, 예상 ROI를 포함해줘.',
      reason:
        '바쁜 의사결정권자가 즉시 내용을 파악하고 승인할 수 있는 고밀도 문장을 작성합니다.',
      tips: '품의서 및 기획안의 핵심 요약 작성용',
    },
    {
      ch: 5,
      id: 48,
      title: '상황별 이메일 톤앤매너 전환',
      source: 'r/work ★8k',
      eng: &quot;Rewrite this email to be [Tone: e.g., more firm / more polite]. Keep the core message but change wording to fit a [Recipient's Role]. [Email]&quot;,
      kor: '이 이메일을 [어조: 예-더 단호하게] 고쳐 써줘. 핵심 메시지는 유지하되 [수신인 직책]에 맞는 정중하거나 명확한 표현으로 바꿔줘. [이메일]',
      reason:
        '커뮤니케이션 대상과의 관계를 해치지 않으면서도 목적을 달성하는 최적의 문장을 선택합니다.',
      tips: '협상, 독촉, 정중한 거절 등 미묘한 상황의 비즈니스 메일',
    },
    {
      ch: 5,
      id: 49,
      title: '업무 자동화 워크플로우 제안',
      source: 'Zapier ★15k',
      eng: 'I spend 2 hours daily on [Manual Task]. How can I automate this using AI and no-code tools? Suggest a 3-step automation workflow.',
      kor: '매일 2시간씩 [수동 작업]을 하고 있어. AI와 노코드 도구로 이걸 어떻게 자동화할 수 있어? 3단계 자동화 워크플로우를 제안해줘.',
      reason:
        '반복적인 업무를 제거하여 창의적이고 생산적인 일에 집중할 시간을 확보합니다.',
      tips: '단순 반복 업무 최적화 및 스마트 워크 구축',
    },
    {
      ch: 5,
      id: 50,
      title: '가상 전문가 그룹 컨설팅',
      source: 'Twitter ★17k',
      eng: 'Act as a world-class expert in [Field]. I am facing [Challenge]. Ask me 3 deep questions to diagnose, then give a 3-step priority plan.',
      kor: '[분야]의 세계적인 전문가가 되어줘. 나는 지금 [도전 과제]에 직면해 있어. 문제를 진단하기 위해 나에게 질문 3개를 던져주고, 그 다음 3단계 우선순위 계획을 알려줘.',
      reason:
        '단일 답변이 아닌 문제 진단부터 실행 계획까지 이어지는 전문가의 사고방식을 빌립니다.',
      tips: '복합적인 비즈니스 난제 해결 및 전략 수립 시 강력 추천',
    },
  ];

  // 하이라이트 적용 함수
  function applyHighlight(text, query) {
    if (!query || query.trim() === '') return text;
    const escapedQuery = query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&amp;');
    const regex = new RegExp(`(${escapedQuery})`, 'gi');
    return text.replace(regex, '&lt;mark&gt;$1&lt;/mark&gt;');
  }

  // 렌더링 함수
  function renderPrompts() {
    const container = document.getElementById('promptGrid');
    const query = document.getElementById('searchInput').value.toLowerCase();

    container.innerHTML = '';

    const filtered = prompts.filter((p) =&gt; {
      const matchesSearch =
        p.title.toLowerCase().includes(query) ||
        p.kor.toLowerCase().includes(query) ||
        p.id.toString() === query;
      const matchesChapter =
        currentFilter === 'all' || p.ch === parseInt(currentFilter);
      return matchesSearch &amp;&amp; matchesChapter;
    });

    filtered.forEach((p) =&gt; {
      const card = document.createElement('div');
      card.className = 'prompt-card rounded-3xl p-8 flex flex-col';

      const hTitle = applyHighlight(p.title, query);
      const hKor = applyHighlight(p.kor, query);
      const hEng = applyHighlight(p.eng, query);

      card.innerHTML = `
                    &lt;div class=&quot;flex-grow&quot;&gt;
                        &lt;div class=&quot;flex items-start justify-between mb-6&quot;&gt;
                            &lt;div class=&quot;flex flex-col&quot;&gt;
                                &lt;span class=&quot;text-xs font-black text-indigo-600 mb-2 tracking-widest uppercase&quot;&gt;Chapter 0${p.ch}&lt;/span&gt;
                                &lt;h2 class=&quot;text-2xl md:text-3xl font-extrabold text-slate-900 leading-tight&quot;&gt;${p.id}. ${hTitle}&lt;/h2&gt;
                            &lt;/div&gt;
                            &lt;span class=&quot;text-[10px] bg-slate-100 text-slate-400 px-2 py-1 rounded font-bold&quot;&gt;${p.source}&lt;/span&gt;
                        &lt;/div&gt;
                        
                        &lt;div class=&quot;space-y-6 mb-8&quot;&gt;
                            &lt;div&gt;
                                &lt;div class=&quot;flex justify-between items-center mb-2&quot;&gt;
                                    &lt;span class=&quot;text-sm font-bold text-slate-400&quot;&gt;Korean Prompt&lt;/span&gt;
                                    &lt;button onclick=&quot;copyToClipboard(\`${p.kor.replace(/`/g, '\\`')}\`)&quot; class=&quot;text-indigo-600 hover:text-indigo-800 text-sm font-black flex items-center gap-2 px-3 py-1 bg-indigo-50 rounded-lg&quot;&gt;
                                        COPY &lt;i class=&quot;fa-regular fa-copy&quot;&gt;&lt;/i&gt;
                                    &lt;/button&gt;
                                &lt;/div&gt;
                                &lt;div class=&quot;bg-slate-50 p-6 rounded-2xl border border-slate-100 text-lg md:text-xl text-slate-800 font-bold leading-relaxed shadow-inner&quot;&gt;
                                    ${hKor}
                                &lt;/div&gt;
                            &lt;/div&gt;
                            &lt;div&gt;
                                &lt;div class=&quot;flex justify-between items-center mb-2&quot;&gt;
                                    &lt;span class=&quot;text-sm font-bold text-slate-400 uppercase&quot;&gt;English Prompt&lt;/span&gt;
                                    &lt;button onclick=&quot;copyToClipboard(\`${p.eng.replace(/`/g, '\\`')}\`)&quot; class=&quot;text-slate-400 hover:text-indigo-600 text-sm font-bold flex items-center gap-1&quot;&gt;
                                        COPY &lt;i class=&quot;fa-regular fa-copy&quot;&gt;&lt;/i&gt;
                                    &lt;/button&gt;
                                &lt;/div&gt;
                                &lt;div class=&quot;bg-slate-50 p-6 rounded-2xl border border-slate-100 text-base md:text-lg text-slate-500 italic leading-relaxed&quot;&gt;
                                    ${hEng}
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;

                        &lt;div class=&quot;pt-6 border-t-2 border-slate-50 space-y-6&quot;&gt;
                            &lt;div class=&quot;flex gap-4&quot;&gt;
                                &lt;div class=&quot;shrink-0 w-10 h-10 rounded-2xl bg-amber-50 flex items-center justify-center&quot;&gt;
                                    &lt;i class=&quot;fa-solid fa-lightbulb text-amber-500 text-lg&quot;&gt;&lt;/i&gt;
                                &lt;/div&gt;
                                &lt;div&gt;
                                    &lt;p class=&quot;text-xs font-black text-slate-400 uppercase mb-1&quot;&gt;Why This Works&lt;/p&gt;
                                    &lt;p class=&quot;text-base md:text-lg text-slate-700 font-bold leading-relaxed&quot;&gt;${p.reason}&lt;/p&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                            &lt;div class=&quot;flex gap-4&quot;&gt;
                                &lt;div class=&quot;shrink-0 w-10 h-10 rounded-2xl bg-emerald-50 flex items-center justify-center&quot;&gt;
                                    &lt;i class=&quot;fa-solid fa-star text-emerald-500 text-lg&quot;&gt;&lt;/i&gt;
                                &lt;/div&gt;
                                &lt;div&gt;
                                    &lt;p class=&quot;text-xs font-black text-slate-400 uppercase mb-1&quot;&gt;Usage Tips&lt;/p&gt;
                                    &lt;p class=&quot;text-base md:text-lg text-slate-700 font-bold leading-relaxed&quot;&gt;${p.tips}&lt;/p&gt;
                                &lt;/div&gt;
                            &lt;/div&gt;
                        &lt;/div&gt;
                    &lt;/div&gt;
                `;
      container.appendChild(card);
    });

    if (filtered.length === 0) {
      container.innerHTML = `&lt;div class=&quot;col-span-full py-32 text-center text-slate-400 font-black text-2xl&quot;&gt;검색 결과가 없습니다.&lt;/div&gt;`;
    }
  }

  function filterChapter(ch) {
    currentFilter = ch;
    const buttons = document.querySelectorAll('.chapter-nav-item');
    buttons.forEach((btn) =&gt; btn.classList.remove('active'));

    if (ch === 'all') buttons[0].classList.add('active');
    else {
      // 인덱스 보정 (전체보기가 0번)
      const targetBtn = Array.from(buttons).find((b) =&gt;
        b.textContent.includes(
          ch === 1
            ? '기초'
            : ch === 2
              ? '트렌드'
              : ch === 3
                ? '마케팅'
                : ch === 4
                  ? '학습'
                  : '업무',
        ),
      );
      if (targetBtn) targetBtn.classList.add('active');
    }

    renderPrompts();
  }

  function copyToClipboard(text) {
    const textarea = document.createElement('textarea');
    textarea.value = text;
    document.body.appendChild(textarea);
    textarea.select();
    document.execCommand('copy');
    document.body.removeChild(textarea);
    showToast();
  }

  function showToast() {
    const toast = document.getElementById('copyToast');
    toast.classList.add('toast-show');
    setTimeout(() =&gt; {
      toast.classList.remove('toast-show');
    }, 2000);
  }

  // 초기 실행
  document.addEventListener('DOMContentLoaded', () =&gt; {
    document
      .getElementById('searchInput')
      .addEventListener('input', renderPrompts);
    renderPrompts(); // 데이터 로딩 즉시 실행
  });
&lt;/script&gt;</description>
      <category>잡학</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/206</guid>
      <comments>https://19-97.tistory.com/206#entry206comment</comments>
      <pubDate>Thu, 12 Mar 2026 14:15:01 +0900</pubDate>
    </item>
    <item>
      <title>엑셀 모든 테두리+굵은 상자 테두리 단축키 만들기</title>
      <link>https://19-97.tistory.com/203</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;평소 엑셀로 작업할때 모든 테두리 + 굵은 상자 테두리를 많이 사용하는데&lt;br /&gt;일일이 클릭으로 하려니 불편해서 찾아보고 까먹기전에 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 해당 매크로는 확장자가 &quot;xlsx&quot;일 경우에는 매크로가 저장되지 않는 파일 형식이라면서 알림창이 띄워집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매크로만 저장되지 않는 것이기에 무시하고 저장을 진행하셔도 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(&quot;xlsm&quot; 확장자로 변경해서 저장하면 매크로까지 저장된다는거 같은데.. 안해봤습니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 MacBook에서 작업을하였고, 윈도우는 단축키만 다를 뿐 엑셀 자체 기능이므로 동일하게 동작할 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Visual Basic Editor 열기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구(tool) &amp;rarr; 매크로 &amp;rarr; Visual Basic Editor&lt;br /&gt;(단축키: Fn + Option + F11)&lt;/p&gt;
&lt;p&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/bVMyiB/btsPbxAaBqR/AAAAAAAAAAAAAAAAAAAAAKAH0taVbiyBwd0oBMFc6gEqLIKUL2WFEcRXwlfX2Ent/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1753973999&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=Po6vmfy7EPlAII0QZEK70fYKgpc%3D&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 모듈 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;visual Basic Editor 좌측 상단 엑셀 모양 옆에 버튼을 클릭하거나, 그 모양 옆에 있는 화살표를 눌러서 만들 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2894&quot; data-origin-height=&quot;1817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPoIkL/btsPaNX4iPd/RyrvyJtjvgcHCdKVjfBIMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPoIkL/btsPaNX4iPd/RyrvyJtjvgcHCdKVjfBIMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPoIkL/btsPaNX4iPd/RyrvyJtjvgcHCdKVjfBIMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPoIkL%2FbtsPaNX4iPd%2FRyrvyJtjvgcHCdKVjfBIMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2894&quot; height=&quot;1817&quot; data-origin-width=&quot;2894&quot; data-origin-height=&quot;1817&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 코드 입력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 입력 후 창을 닫으면 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2915&quot; data-origin-height=&quot;1815&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IAKWs/btsO9ZkHM8u/J8ses8Yakdt9Ow9ytnKbU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IAKWs/btsO9ZkHM8u/J8ses8Yakdt9Ow9ytnKbU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IAKWs/btsO9ZkHM8u/J8ses8Yakdt9Ow9ytnKbU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIAKWs%2FbtsO9ZkHM8u%2FJ8ses8Yakdt9Ow9ytnKbU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2915&quot; height=&quot;1815&quot; data-origin-width=&quot;2915&quot; data-origin-height=&quot;1815&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1752034882569&quot; class=&quot;vbnet&quot; data-ke-language=&quot;vbnet&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Sub ApplyAllBordersWithThickOutline()
    Dim rng As Range
    Set rng = Selection

    With rng.Borders
        .LineStyle = xlContinuous
        .Weight = xlThin
        .ColorIndex = xlAutomatic
    End With

    With rng.Borders(xlEdgeLeft)
        .LineStyle = xlContinuous
        .Weight = xlThick
    End With

    With rng.Borders(xlEdgeTop)
        .LineStyle = xlContinuous
        .Weight = xlThick
    End With

    With rng.Borders(xlEdgeBottom)
        .LineStyle = xlContinuous
        .Weight = xlThick
    End With

    With rng.Borders(xlEdgeRight)
        .LineStyle = xlContinuous
        .Weight = xlThick
    End With
End Sub&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 매크로 열기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도구(tool) &amp;rarr; 매크로 &amp;rarr; 매크로 ..&lt;br /&gt;(단축키: Fn + Option + F8)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL04Dy/btsO9HR5IES/AYkstKOGZLS09pL0KXhOkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL04Dy/btsO9HR5IES/AYkstKOGZLS09pL0KXhOkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL04Dy/btsO9HR5IES/AYkstKOGZLS09pL0KXhOkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL04Dy%2FbtsO9HR5IES%2FAYkstKOGZLS09pL0KXhOkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3840&quot; height=&quot;2160&quot; data-origin-width=&quot;3840&quot; data-origin-height=&quot;2160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. 매크로에 단축키 지정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;옵션..&quot; 버튼을 클릭하여 설정할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매크로는 모듈에 입력되어있는 &quot;ApplyAllBordersWithThickOutline&quot;으로 자동으로 등록되어 보여집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;1202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tGAWw/btsPaG5HCVW/41C32awA2kvrW4UaBSAFy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tGAWw/btsPaG5HCVW/41C32awA2kvrW4UaBSAFy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tGAWw/btsPaG5HCVW/41C32awA2kvrW4UaBSAFy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtGAWw%2FbtsPaG5HCVW%2F41C32awA2kvrW4UaBSAFy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;1202&quot; data-origin-width=&quot;1306&quot; data-origin-height=&quot;1202&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단축키는 &amp;ldquo;Option + Cmd +&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #444447; text-align: left;&quot;&gt;▩&lt;/span&gt;&amp;rdquo; 으로 고정되어 있습니다.&lt;br /&gt;(또한, 입력가능한건 영어만 가능합니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;798&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUhfuM/btsO9Whb56w/wPTYAmSkN9adtCHuxKwilK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUhfuM/btsO9Whb56w/wPTYAmSkN9adtCHuxKwilK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUhfuM/btsO9Whb56w/wPTYAmSkN9adtCHuxKwilK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUhfuM%2FbtsO9Whb56w%2FwPTYAmSkN9adtCHuxKwilK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;798&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;798&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 클릭으로 만든 테두리보다 매크로 테두리가 조금 더 굵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 살짝 수정하면 될거 같지만.. 되는 것에 감사하며 건들지 않았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buDQXP/btsPa4efJ2S/Y5NcxWNOe8MG4dkVRkhQo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buDQXP/btsPa4efJ2S/Y5NcxWNOe8MG4dkVRkhQo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buDQXP/btsPa4efJ2S/Y5NcxWNOe8MG4dkVRkhQo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuDQXP%2FbtsPa4efJ2S%2FY5NcxWNOe8MG4dkVRkhQo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;218&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>잡학</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/203</guid>
      <comments>https://19-97.tistory.com/203#entry203comment</comments>
      <pubDate>Wed, 9 Jul 2025 13:31:19 +0900</pubDate>
    </item>
    <item>
      <title>Mac에서 Nuphy GEM80 펌웨어 업데이트하기</title>
      <link>https://19-97.tistory.com/202</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;한번 해보고 까먹을거 같아서 메모를 위해 작성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 환경은 M3 맥북 에어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. QMK Toolbox 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/qmk/qmk_toolbox/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/qmk/qmk_toolbox/releases&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742446949888&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;Releases &amp;middot; qmk/qmk_toolbox&quot; data-og-description=&quot;A Toolbox companion for QMK Firmware. Contribute to qmk/qmk_toolbox development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/qmk/qmk_toolbox/releases&quot; data-og-url=&quot;https://github.com/qmk/qmk_toolbox/releases&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fr6zT/hyYueSobTh/nKkaelDzbls8TmkpVRskx1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dLrI1d/hyYrZINWdb/mYRsJzakW0JdivYH2qob81/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/qmk/qmk_toolbox/releases&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/qmk/qmk_toolbox/releases&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fr6zT/hyYueSobTh/nKkaelDzbls8TmkpVRskx1/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/dLrI1d/hyYrZINWdb/mYRsJzakW0JdivYH2qob81/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Releases &amp;middot; qmk/qmk_toolbox&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A Toolbox companion for QMK Firmware. Contribute to qmk/qmk_toolbox development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1-1. pkg 파일 설치&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T1VaR/btsMPNAbgTY/huJCWiW6LwMvSoBqOOBN3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T1VaR/btsMPNAbgTY/huJCWiW6LwMvSoBqOOBN3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T1VaR/btsMPNAbgTY/huJCWiW6LwMvSoBqOOBN3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT1VaR%2FbtsMPNAbgTY%2FhuJCWiW6LwMvSoBqOOBN3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;286&quot; data-origin-width=&quot;516&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서명이 안된 파일이므로 위와같이 알림창이 뜨면&lt;br /&gt;개인정보 보호 및 보안으로 이동합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnuM0/btsMPpmgAlo/O8IqZrBV84I2lCe5z1kjV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnuM0/btsMPpmgAlo/O8IqZrBV84I2lCe5z1kjV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnuM0/btsMPpmgAlo/O8IqZrBV84I2lCe5z1kjV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvnuM0%2FbtsMPpmgAlo%2FO8IqZrBV84I2lCe5z1kjV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;525&quot; data-origin-width=&quot;1426&quot; data-origin-height=&quot;1248&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인정보 보호 및 보안 하단에 파일명을 꼭 확인하고 그래도 열기를 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wCfTW/btsMRK9Ar7g/UtTUgnM6sw9ofu2KioDJiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wCfTW/btsMRK9Ar7g/UtTUgnM6sw9ofu2KioDJiK/img.png&quot; data-alt=&quot;그래도 열기 알림창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wCfTW/btsMRK9Ar7g/UtTUgnM6sw9ofu2KioDJiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwCfTW%2FbtsMRK9Ar7g%2FUtTUgnM6sw9ofu2KioDJiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;396&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그래도 열기 알림창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tvJSi/btsMPwk68UE/27QVqzPPlnkfbI4aUhqHO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tvJSi/btsMPwk68UE/27QVqzPPlnkfbI4aUhqHO1/img.png&quot; data-alt=&quot;암호 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tvJSi/btsMPwk68UE/27QVqzPPlnkfbI4aUhqHO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtvJSi%2FbtsMPwk68UE%2F27QVqzPPlnkfbI4aUhqHO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;306&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;암호 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btqHjg/btsMPJdDSBw/JGCAn3wUjGPmNbfoXI0kp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btqHjg/btsMPJdDSBw/JGCAn3wUjGPmNbfoXI0kp1/img.png&quot; data-alt=&quot;설치 실행됨&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btqHjg/btsMPJdDSBw/JGCAn3wUjGPmNbfoXI0kp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtqHjg%2FbtsMPJdDSBw%2FJGCAn3wUjGPmNbfoXI0kp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;433&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;886&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 실행됨&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyQMPA/btsMQofwabQ/uzbu1FvTSyVOwOe19IHxK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyQMPA/btsMQofwabQ/uzbu1FvTSyVOwOe19IHxK0/img.png&quot; data-alt=&quot;Launchpad - QMK Toolbox&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyQMPA/btsMQofwabQ/uzbu1FvTSyVOwOe19IHxK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyQMPA%2FbtsMQofwabQ%2Fuzbu1FvTSyVOwOe19IHxK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;350&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Launchpad - QMK Toolbox&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Launchpad에 들어가서 설치 확인..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 펌웨어 파일 다운로드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.nuphy.kr/firmware&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuphy.kr/firmware&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742447550511&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;NUPHY&quot; data-og-description=&quot;NUPHY 브랜드 공식몰&quot; data-og-host=&quot;www.nuphy.kr&quot; data-og-source-url=&quot;https://www.nuphy.kr/firmware&quot; data-og-url=&quot;https://www.nuphy.kr/firmware&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JQqdL/hyYviUnwcD/XuiPWIQYjM00EhguWLpP9K/img.png?width=674&amp;amp;height=189&amp;amp;face=0_0_674_189&quot;&gt;&lt;a href=&quot;https://www.nuphy.kr/firmware&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.nuphy.kr/firmware&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JQqdL/hyYviUnwcD/XuiPWIQYjM00EhguWLpP9K/img.png?width=674&amp;amp;height=189&amp;amp;face=0_0_674_189');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;NUPHY&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;NUPHY 브랜드 공식몰&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.nuphy.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 펌웨어 업데이트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.nuphy.kr/manual/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;amp;bmode=view&amp;amp;idx=30744728&amp;amp;t=board&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.nuphy.kr/manual/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;amp;bmode=view&amp;amp;idx=30744728&amp;amp;t=board&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742448111929&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;GEM80 _ QMK 펌웨어 업데이트 가이드 : NUPHY&quot; data-og-description=&quot;NUPHY Gem80펌웨어 업데이트 가이드* 참고사항 (펌웨어 업데이트 순서)최신버전 QMK 툴박스 다운로드 및 키보드&amp;nbsp;유선 모드 세팅모델별 키보드 업데이트 파일(.bin) 툴박스에 업로드(키보드 모델에 맞&quot; data-og-host=&quot;www.nuphy.kr&quot; data-og-source-url=&quot;https://www.nuphy.kr/manual/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;amp;bmode=view&amp;amp;idx=30744728&amp;amp;t=board&quot; data-og-url=&quot;https://www.nuphy.kr/manual/?bmode=view&amp;amp;idx=30744728&amp;amp;q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;amp;t=board&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cK3ySj/hyYr3qWLVG/GKgcXRftyWMYwYVrTGnkJ0/img.jpg?width=860&amp;amp;height=810&amp;amp;face=0_0_860_810,https://scrap.kakaocdn.net/dn/lPOy6/hyYvfQSNrN/L9K9xeuZGfg9xkEBmnEgW0/img.jpg?width=860&amp;amp;height=810&amp;amp;face=0_0_860_810,https://scrap.kakaocdn.net/dn/prGVD/hyYvfDlOHV/lqNEtKzOhwzezMgKKo8nKK/img.jpg?width=860&amp;amp;height=652&amp;amp;face=0_0_860_652&quot;&gt;&lt;a href=&quot;https://www.nuphy.kr/manual/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;amp;bmode=view&amp;amp;idx=30744728&amp;amp;t=board&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.nuphy.kr/manual/?q=YToxOntzOjEyOiJrZXl3b3JkX3R5cGUiO3M6MzoiYWxsIjt9&amp;amp;bmode=view&amp;amp;idx=30744728&amp;amp;t=board&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cK3ySj/hyYr3qWLVG/GKgcXRftyWMYwYVrTGnkJ0/img.jpg?width=860&amp;amp;height=810&amp;amp;face=0_0_860_810,https://scrap.kakaocdn.net/dn/lPOy6/hyYvfQSNrN/L9K9xeuZGfg9xkEBmnEgW0/img.jpg?width=860&amp;amp;height=810&amp;amp;face=0_0_860_810,https://scrap.kakaocdn.net/dn/prGVD/hyYvfDlOHV/lqNEtKzOhwzezMgKKo8nKK/img.jpg?width=860&amp;amp;height=652&amp;amp;face=0_0_860_652');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GEM80 _ QMK 펌웨어 업데이트 가이드 : NUPHY&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;NUPHY Gem80펌웨어 업데이트 가이드* 참고사항 (펌웨어 업데이트 순서)최신버전 QMK 툴박스 다운로드 및 키보드&amp;nbsp;유선 모드 세팅모델별 키보드 업데이트 파일(.bin) 툴박스에 업로드(키보드 모델에 맞&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.nuphy.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File에서 다운받은 펌웨어 파일(bin)을 열어줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;1386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqmGkq/btsMRm80qeI/JaKRGvkIBJIpkGCs3CNMo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqmGkq/btsMRm80qeI/JaKRGvkIBJIpkGCs3CNMo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqmGkq/btsMRm80qeI/JaKRGvkIBJIpkGCs3CNMo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqmGkq%2FbtsMRm80qeI%2FJaKRGvkIBJIpkGCs3CNMo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1576&quot; height=&quot;1386&quot; data-origin-width=&quot;1576&quot; data-origin-height=&quot;1386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;1338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GjzCw/btsMP9JI59O/a2uz9UoAc6sALHK2Ka30JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GjzCw/btsMP9JI59O/a2uz9UoAc6sALHK2Ka30JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GjzCw/btsMP9JI59O/a2uz9UoAc6sALHK2Ka30JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGjzCw%2FbtsMP9JI59O%2Fa2uz9UoAc6sALHK2Ka30JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1602&quot; height=&quot;1338&quot; data-origin-width=&quot;1602&quot; data-origin-height=&quot;1338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유선모드로 변경&lt;/li&gt;
&lt;li&gt;케이블 분리&lt;/li&gt;
&lt;li&gt;ESC 버튼 클릭한 상태로 다시 케이블 연결&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 노란색 글씨로 connected 한 줄이 뜹니다.&lt;br /&gt;(캡쳐 찍을려고 뽑았다가..disconnected까지 표시됨)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;1090&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw0DIi/btsMP6zzEuw/P6wZTi7T8ofFGOii1VjKJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw0DIi/btsMP6zzEuw/P6wZTi7T8ofFGOii1VjKJ0/img.png&quot; data-alt=&quot;disconnected까지 뜬 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw0DIi/btsMP6zzEuw/P6wZTi7T8ofFGOii1VjKJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw0DIi%2FbtsMP6zzEuw%2FP6wZTi7T8ofFGOii1VjKJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1572&quot; height=&quot;1090&quot; data-origin-width=&quot;1572&quot; data-origin-height=&quot;1090&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;disconnected까지 뜬 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;connected 상태에서는 Flash 버튼이 활성화됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flash 버튼을 클릭하면 다운로드가 시작됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;1332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t56Ww/btsMRJplnv7/bzPChi6aTRXEt6q3yBbkN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t56Ww/btsMRJplnv7/bzPChi6aTRXEt6q3yBbkN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t56Ww/btsMRJplnv7/bzPChi6aTRXEt6q3yBbkN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft56Ww%2FbtsMRJplnv7%2FbzPChi6aTRXEt6q3yBbkN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;1332&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;1332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;펌웨어 다운로드가 다 되고 나면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flash complete가 뜨면서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동으로 DFU 모드가 해제되면서 disconnected 상태가 됩니다.&lt;/p&gt;</description>
      <category>잡학</category>
      <category>관리자권한으로 실행</category>
      <category>누피</category>
      <category>맥북</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/202</guid>
      <comments>https://19-97.tistory.com/202#entry202comment</comments>
      <pubDate>Thu, 20 Mar 2025 14:20:51 +0900</pubDate>
    </item>
    <item>
      <title>심심해서 만든 로또 당첨확인 QR 생성기</title>
      <link>https://19-97.tistory.com/201</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/qrcodejs/1.0.0/qrcode.min.js&quot;&gt;&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;style&gt;
    body {
      font-family: Arial, sans-serif;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      height: auto;
      background-color: #f9f9f9;
    }

    .container {
      background: white;
      padding: 20px;
      border-radius: 10px;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
      text-align: center;
    }

    .input-group {
      margin-bottom: 10px;
    }

    .input-group input {
      margin: 2px;
    }

    button {
      padding: 10px 20px;
      font-size: 16px;
      cursor: pointer;
      border: none;
      background-color: #007bff;
      color: white;
      border-radius: 5px;
      margin-top: 10px;
    }

    #area {
      margin-top: 20px;
      font-weight: bold;
    }

    #qrcode {
      margin-top: 10px;
    }
  &lt;/style&gt;
&lt;/div&gt;
&lt;div class=&quot;container&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;로또 QR 코드 생성기&lt;/h2&gt;
&lt;div class=&quot;input-group&quot;&gt;&lt;label for=&quot;round border border-[#666] rounded&quot;&gt;회차&lt;/label&gt; &lt;input id=&quot;round&quot; min=&quot;1164&quot; type=&quot;number&quot; /&gt;&lt;/div&gt;
&lt;div id=&quot;lotto-lines&quot; class=&quot;input-group&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;button id=&quot;create&quot;&gt;QR 코드 생성&lt;/button&gt; &lt;input id=&quot;qrlink&quot; type=&quot;hidden&quot; /&gt;
&lt;div id=&quot;qrcode&quot; style=&quot;display: flex; align-items: center; justify-content: center;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;script&gt;
    document.addEventListener(&quot;DOMContentLoaded&quot;, () =&gt; {
      const lottoLinesContainer = document.getElementById(&quot;lotto-lines&quot;);
      for (let i = 1; i &lt;= 5; i++) {
        const div = document.createElement(&quot;div&quot;);
        div.classList.add(&quot;input-group&quot;);
        div.innerHTML = `&lt;label&gt;${i}번째&lt;/label&gt;` +
          Array.from({ length: 6 }, (_, idx) =&gt; `&lt;input type=&quot;number&quot; class=&quot;line${i} border border-[#666] rounded&quot; min=&quot;1&quot; max=&quot;45&quot; maxLength=&quot;2&quot; oninput=&quot;inputCheck(this)&quot;&gt;`).join('');
        lottoLinesContainer.appendChild(div);
      }
    });

    function makeQR() {
      const round = document.getElementById(&quot;round&quot;).value.padStart(4, '0');
      let url = `https://m.dhlottery.co.kr/qr.do?method=winQr&amp;v=${round}`;

      for (let i = 1; i &lt;= 5; i++) {
        const lineNumbers = Array.from(document.querySelectorAll(`.line${i}`))
          .map(input =&gt; input.value.padStart(2, '0')).join('');
        if (lineNumbers) url += `q${lineNumbers}`;
      }

      url += `%EF%BB%BF`;

      document.getElementById(&quot;qrlink&quot;).value = url

      // QR 코드 생성
      document.getElementById(&quot;qrcode&quot;).innerHTML = &quot;&quot;; // 기존 QR 코드 초기화
      new QRCode(document.getElementById(&quot;qrcode&quot;), {
        text: url,
        width: 200,
        height: 200
      });
    }

    function inputCheck(object) {
      if (object.value.length &gt; object.maxLength) {
        //object.maxLength : 매게변수 오브젝트의 maxlength 속성 값입니다.
        object.value = object.value.slice(0, object.maxLength);
      } else if (object.value &lt; 1) {
        object.value = 1
      } else if (object.value &gt; 45) {
        object.value = 45
      }
    }



    document.getElementById(&quot;create&quot;).addEventListener(&quot;click&quot;, makeQR);
  &lt;/script&gt;</description>
      <category>잡학</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/201</guid>
      <comments>https://19-97.tistory.com/201#entry201comment</comments>
      <pubDate>Wed, 19 Mar 2025 18:27:54 +0900</pubDate>
    </item>
    <item>
      <title>로컬에서 Nginx Reverse Proxy 서버 구축 (Nginx Proxy Manager)</title>
      <link>https://19-97.tistory.com/200</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nginxproxymanager.com/guide/#quick-setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nginxproxymanager.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739327748670&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Nginx Proxy Manager&quot; data-og-description=&quot;Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt&quot; data-og-host=&quot;nginxproxymanager.com&quot; data-og-source-url=&quot;https://nginxproxymanager.com/guide/#quick-setup&quot; data-og-url=&quot;https://nginxproxymanager.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/buy1XO/hyYcg4PKLI/RitSskK1kYeLxd2buthDW0/img.png?width=192&amp;amp;height=192&amp;amp;face=0_0_192_192,https://scrap.kakaocdn.net/dn/c5niA9/hyYb7f9qms/HrqKl4QUQzJy9xTCfqDYCk/img.png?width=192&amp;amp;height=192&amp;amp;face=0_0_192_192&quot;&gt;&lt;a href=&quot;https://nginxproxymanager.com/guide/#quick-setup&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nginxproxymanager.com/guide/#quick-setup&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/buy1XO/hyYcg4PKLI/RitSskK1kYeLxd2buthDW0/img.png?width=192&amp;amp;height=192&amp;amp;face=0_0_192_192,https://scrap.kakaocdn.net/dn/c5niA9/hyYb7f9qms/HrqKl4QUQzJy9xTCfqDYCk/img.png?width=192&amp;amp;height=192&amp;amp;face=0_0_192_192');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Nginx Proxy Manager&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker container and built in Web Application for managing Nginx proxy hosts with a simple, powerful interface, providing free SSL support via Let's Encrypt&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nginxproxymanager.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;0. 도커 설치&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.docker.com/desktop/setup/install/mac-install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.docker.com/desktop/setup/install/mac-install/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739334588536&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Mac&quot; data-og-description=&quot;Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/desktop/setup/install/mac-install/&quot; data-og-url=&quot;https://docs.docker.com/desktop/setup/install/mac-install/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rejZi/hyYcgKYyfA/wE795ZK5OEwjW5DRKlyM3k/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://docs.docker.com/desktop/setup/install/mac-install/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/desktop/setup/install/mac-install/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rejZi/hyYcgKYyfA/wE795ZK5OEwjW5DRKlyM3k/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Mac&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Install Docker for Mac to get started. This guide covers system requirements, where to download, and instructions on how to install and update.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;도커 설치(버전) 확인&lt;/h4&gt;
&lt;pre id=&quot;code_1739334626273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Docker Compose 파일 생성&lt;/h2&gt;
&lt;pre id=&quot;code_1739327820970&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  app:
    container_name: nginx-proxy-manager
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/kBGIe/btsMedTQBIs/bBBkfgVptgLTTA1SKVuam0/docker-compose.yml?attach=1&amp;amp;knm=tfile.yml&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;docker-compose.yml&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;위 파일은 공홈 QuickGuide대로입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;docker-compose.yml를 원하는 곳으로 설치(경로는 영어로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;docker-compose.yml을 저장한 경로에서 명령어 실행&lt;/p&gt;
&lt;pre id=&quot;code_1739327912259&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 올라갔는지 확인&lt;/p&gt;
&lt;pre id=&quot;code_1739328050882&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker container ls -all&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;명령어 혹은 OrbStack, Docker Desktop 같은 것으로 확인..&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. Nginx Proxy Manager 접속&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속 URL은 &quot;&lt;b&gt;http://localhost:81&lt;/b&gt;&quot;로 접속하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vOGkm/btsMeUfoGfX/ckqKU7bV0mpMaT7JHuZpeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vOGkm/btsMeUfoGfX/ckqKU7bV0mpMaT7JHuZpeK/img.png&quot; data-alt=&quot;접속 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vOGkm/btsMeUfoGfX/ckqKU7bV0mpMaT7JHuZpeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvOGkm%2FbtsMeUfoGfX%2FckqKU7bV0mpMaT7JHuZpeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;접속 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 계정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1c1e21; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Email:&lt;span&gt;&amp;nbsp;&lt;/span&gt;admin@example.com&lt;/li&gt;
&lt;li&gt;Password:&lt;span&gt;&amp;nbsp;&lt;/span&gt;changeme&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 계정으로 접속시 이름, 닉네임, 이메일, 패스워드를 변경하는 팝업이 뜸.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Host 설정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvkggg/btsMgxiSBZ9/4XTPrwYoJHkyjz3lr6isB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvkggg/btsMgxiSBZ9/4XTPrwYoJHkyjz3lr6isB1/img.png&quot; data-alt=&quot;Hosts &amp;amp;rarr; Proxy Hosts로 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvkggg/btsMgxiSBZ9/4XTPrwYoJHkyjz3lr6isB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvkggg%2FbtsMgxiSBZ9%2F4XTPrwYoJHkyjz3lr6isB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Hosts &amp;rarr; Proxy Hosts로 이동&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8RaMA/btsMfQJ5R7a/SFCiTBUbl3KODIlzTSnlAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8RaMA/btsMfQJ5R7a/SFCiTBUbl3KODIlzTSnlAK/img.png&quot; data-alt=&quot;이동시 첫 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8RaMA/btsMfQJ5R7a/SFCiTBUbl3KODIlzTSnlAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8RaMA%2FbtsMfQJ5R7a%2FSFCiTBUbl3KODIlzTSnlAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이동시 첫 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;1104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WavYZ/btsMfYgRAGZ/ZafixS3BMcLfD9Zhk6Nrq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WavYZ/btsMfYgRAGZ/ZafixS3BMcLfD9Zhk6Nrq1/img.png&quot; data-alt=&quot;Add Proxy Hosts 클릭 시 나오는 팝업&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WavYZ/btsMfYgRAGZ/ZafixS3BMcLfD9Zhk6Nrq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWavYZ%2FbtsMfYgRAGZ%2FZafixS3BMcLfD9Zhk6Nrq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;439&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;1104&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Add Proxy Hosts 클릭 시 나오는 팝업&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Domain Names&lt;/b&gt;: 오픈할 서버 URL 입력 (ex: localhost, local.test.com)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Scheme&lt;/b&gt;: 내부 웹 서비스 프로토콜 (http or https)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Forward Hostname / IP&lt;/b&gt;: 내부 웹 서비스 IP나 호스트 이름 (host.docker.internal)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Forward Port&lt;/b&gt;: 내부 웹 서비스 포트(80, 81, 443은 Nginx Proxy Manager에게 할당되어 있음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cache Assets&lt;/b&gt;: 정적 콘텐츠 캐싱 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Block Common Exploits&lt;/b&gt;: 프로젝트에서 제공하는 공격 패턴 차단 기능&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; SQL Injection을 막아주는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Websockets Supoort&lt;/b&gt;: 웹 소켓 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-1. Custom locations 설정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpFxtQ/btsMgKvADsp/BKIy0ZWXmiiZm5CSdSDvbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpFxtQ/btsMgKvADsp/BKIy0ZWXmiiZm5CSdSDvbk/img.png&quot; data-alt=&quot;Custom Locations&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpFxtQ/btsMgKvADsp/BKIy0ZWXmiiZm5CSdSDvbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpFxtQ%2FbtsMgKvADsp%2FBKIy0ZWXmiiZm5CSdSDvbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;466&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;1160&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Custom Locations&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 백엔드를 3002포트로 열어서 위와 같이 설정했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Define location&lt;/b&gt;: 구분되는 router명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Scheme&lt;/b&gt;: 내부 웹 서비스 프로토콜 (http or https)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Forward Hostname / IP&lt;/b&gt;: 내부 웹 서비스 IP나 호스트 이름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Forward Port&lt;/b&gt;: 내부 웹 서비스 포트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-2. SSL Certificates 등록 (Https 사용시)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 mkcert를 사용하여 localhost용 인증서를 사용할 예정입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK3GJq/btsMftn3xxe/Or6y3Xi1mkMMmFsgxduplk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK3GJq/btsMftn3xxe/Or6y3Xi1mkMMmFsgxduplk/img.png&quot; data-alt=&quot;SSL Certificates 탭 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK3GJq/btsMftn3xxe/Or6y3Xi1mkMMmFsgxduplk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK3GJq%2FbtsMftn3xxe%2FOr6y3Xi1mkMMmFsgxduplk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL Certificates 탭 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ua300/btsMfYab5CY/bhwXIkGviE364zX4NpK0t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ua300/btsMfYab5CY/bhwXIkGviE364zX4NpK0t0/img.png&quot; data-alt=&quot;SSL Certificates 초기화면 및 추가 버튼 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ua300/btsMfYab5CY/bhwXIkGviE364zX4NpK0t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fua300%2FbtsMfYab5CY%2FbhwXIkGviE364zX4NpK0t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL Certificates 초기화면 및 추가 버튼 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;1054&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WdoyO/btsMgLOG0ka/KaUgHQFdpxC93JIJ9vP2H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WdoyO/btsMgLOG0ka/KaUgHQFdpxC93JIJ9vP2H0/img.png&quot; data-alt=&quot;Add Custom Certificate 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WdoyO/btsMgLOG0ka/KaUgHQFdpxC93JIJ9vP2H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWdoyO%2FbtsMgLOG0ka%2FKaUgHQFdpxC93JIJ9vP2H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;419&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;1054&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Add Custom Certificate 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;인증서 등록시 Name은 구분할 수 있게 잘 적어야한다. (수정 불가)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tcX75/btsMgr4edZX/Dtv3bTmxGpOdX5qKkb6D4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tcX75/btsMgr4edZX/Dtv3bTmxGpOdX5qKkb6D4K/img.png&quot; data-alt=&quot;등록 완료 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tcX75/btsMgr4edZX/Dtv3bTmxGpOdX5qKkb6D4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtcX75%2FbtsMgr4edZX%2FDtv3bTmxGpOdX5qKkb6D4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;등록 완료 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inactive 상태는 proxy host에 연결되지 않은 상태일 뿐, 정상 등록된 화면입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3-3. Proxy Hosts에 SSL 설정하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GJtix/btsMekZ3WRm/Psxp74kXOJl3kWzjvrKhZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GJtix/btsMekZ3WRm/Psxp74kXOJl3kWzjvrKhZ0/img.png&quot; data-alt=&quot;Proxy host 설정 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GJtix/btsMekZ3WRm/Psxp74kXOJl3kWzjvrKhZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGJtix%2FbtsMekZ3WRm%2FPsxp74kXOJl3kWzjvrKhZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Proxy host 설정 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1RLcP/btsMem4FIop/ODKqlSTkBEpkBZvCndkJWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1RLcP/btsMem4FIop/ODKqlSTkBEpkBZvCndkJWk/img.png&quot; data-alt=&quot;SSL 탭 위치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1RLcP/btsMem4FIop/ODKqlSTkBEpkBZvCndkJWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1RLcP%2FbtsMem4FIop%2FODKqlSTkBEpkBZvCndkJWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;439&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL 탭 위치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyIydv/btsMghUVI1a/CVnnmPB0lKX36xk1tREpgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyIydv/btsMghUVI1a/CVnnmPB0lKX36xk1tREpgk/img.png&quot; data-alt=&quot;SSL Certificate 선택 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyIydv/btsMghUVI1a/CVnnmPB0lKX36xk1tREpgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyIydv%2FbtsMghUVI1a%2FCVnnmPB0lKX36xk1tREpgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;315&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL Certificate 선택 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diYWVC/btsMfex22Du/rk6ea0LjGiNqRKNok8omnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diYWVC/btsMfex22Du/rk6ea0LjGiNqRKNok8omnK/img.png&quot; data-alt=&quot;SSL Certificate 선택 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diYWVC/btsMfex22Du/rk6ea0LjGiNqRKNok8omnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiYWVC%2FbtsMfex22Du%2Frk6ea0LjGiNqRKNok8omnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;310&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL Certificate 선택 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Force SSL&lt;/b&gt;: HTTP 프로토콜(Port: 80)로 접속해도 HTTPS 프로토콜 (Port: 443)로 접근시키도록 하는 기능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP/2 Support&lt;/b&gt;: HTTP/2 프로토콜 사용&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 기존 HTTP 표준을 확장한 프로토콜이며, 성능이 개선된 방식&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HSTS Enabled&lt;/b&gt;: HTTP Strict Transport Security&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 웹 서비스를 보안 연결을 통해서만 접속되도록 강제하는 정책&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HSTS Subdomains&lt;/b&gt;: HSTS 정책을 모든 하위 도메인에도 적용시키기 위함&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;Request a new SSL Certificate 선택시 나오는 추가옵션&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2P8KP/btsMfHUbxRR/YbHKsGzBs5XTDdGzdQR3b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2P8KP/btsMfHUbxRR/YbHKsGzBs5XTDdGzdQR3b1/img.png&quot; data-alt=&quot;Request a new SSL Certificate 선택시 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2P8KP/btsMfHUbxRR/YbHKsGzBs5XTDdGzdQR3b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2P8KP%2FbtsMfHUbxRR%2FYbHKsGzBs5XTDdGzdQR3b1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;678&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1702&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Request a new SSL Certificate 선택시 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Use a DNS Challenge&lt;/b&gt;: Let's Encrypt SSL 인증서를 발급받기 위한 방식 중 하나로 도메인 소유권을 검증하기 위해 HTTP 챌린지를 사용함. (DNS 설정을 건드릴 수 있어야함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DNS Provider&lt;/b&gt;: 도메인 이름을 IP 주소로 변환해주는 서비스를 제공하는 업체&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQ1D1/btsMemRcFSR/WFlzLthNp8BfAAoBSpLdUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQ1D1/btsMemRcFSR/WFlzLthNp8BfAAoBSpLdUk/img.png&quot; data-alt=&quot;인증서 사용중인 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQ1D1/btsMemRcFSR/WFlzLthNp8BfAAoBSpLdUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQ1D1%2FbtsMemRcFSR%2FWFlzLthNp8BfAAoBSpLdUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;4064&quot; height=&quot;2334&quot; data-origin-width=&quot;4064&quot; data-origin-height=&quot;2334&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인증서 사용중인 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;

&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Docker</category>
      <category>docker</category>
      <category>Nginx</category>
      <category>nginxproxymanager</category>
      <category>proxy</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/200</guid>
      <comments>https://19-97.tistory.com/200#entry200comment</comments>
      <pubDate>Wed, 12 Feb 2025 14:27:07 +0900</pubDate>
    </item>
    <item>
      <title>아이폰 Action Button(동작버튼) 단축어 Actions앱 안깔고 커스텀하기</title>
      <link>https://19-97.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;아이폰 동작 버튼 커스텀을 하려는데, actions 라는 앱을 추천하더라구요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 확인해보니 단축어에는 기기의 &quot;방향 불러오기&quot;가 있어서 만들어봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;1986&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ls99y/btsL40mNRtn/zUhZowA1ZxcsCAPKZzSpnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ls99y/btsL40mNRtn/zUhZowA1ZxcsCAPKZzSpnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ls99y/btsL40mNRtn/zUhZowA1ZxcsCAPKZzSpnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fls99y%2FbtsL40mNRtn%2FzUhZowA1ZxcsCAPKZzSpnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;1986&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;1986&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.icloud.com/shortcuts/6727c7ac1a654cf7835781ce1ee9ab3f&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.icloud.com/shortcuts/6727c7ac1a654cf7835781ce1ee9ab3f&lt;/a&gt;&lt;/p&gt;</description>
      <category>잡학</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/199</guid>
      <comments>https://19-97.tistory.com/199#entry199comment</comments>
      <pubDate>Tue, 4 Feb 2025 11:35:40 +0900</pubDate>
    </item>
    <item>
      <title>VSCode inline copilot 단축키 변경하기</title>
      <link>https://19-97.tistory.com/198</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;맥북에서 자동완성 기능(cmd+i)를 자주 사용하고 있었는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느날 업데이트가 되더니 인라인 코파일럿이 해당 단축키를 점령하고 있었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 부분을 테스트하기 위해 여러번 수정을 거쳤고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 관련된 애들을 다 옮겨 버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3028&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baBP8p/btsLS5VgTVD/mkj0amkRJAU2miidw5qoxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baBP8p/btsLS5VgTVD/mkj0amkRJAU2miidw5qoxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baBP8p/btsLS5VgTVD/mkj0amkRJAU2miidw5qoxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaBP8p%2FbtsLS5VgTVD%2Fmkj0amkRJAU2miidw5qoxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3028&quot; height=&quot;374&quot; data-origin-width=&quot;3028&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단, 우측 컴파일러 채팅을 여는 방법이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;ctrl+cmd+i&quot;와 &quot;shift+cmd+i&quot;가 존재하여, &quot;ctrl+cmd+i&quot;에 있는 코파일럿 채팅을 바인딩 해제하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우클릭 후 복사를 하면 정확히 내용이 나오므로.. JSON도 함께 첨부합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;cmd+i&quot; -&amp;gt; &quot;ctrl+cmd+i&quot;로 변경된 명령&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737347463712&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;key&quot;: &quot;ctrl+cmd+i&quot;,
  &quot;command&quot;: &quot;inlineChat.start&quot;,
  &quot;when&quot;: &quot;editorFocus &amp;amp;&amp;amp; inlineChatHasProvider &amp;amp;&amp;amp; inlineChatPossible &amp;amp;&amp;amp; !editorReadonly &amp;amp;&amp;amp; !editorSimpleInput&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1737347474731&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;key&quot;: &quot;ctrl+cmd+i&quot;,
  &quot;command&quot;: &quot;inlineChat.startWithCurrentLine&quot;,
  &quot;when&quot;: &quot;editorFocus &amp;amp;&amp;amp; github.copilot.chat.editor.enableLineTrigger &amp;amp;&amp;amp; inlineChatHasProvider &amp;amp;&amp;amp; !editorReadonly &amp;amp;&amp;amp; !inlineChatVisible&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1737347486556&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;key&quot;: &quot;ctrl+cmd+i&quot;,
  &quot;command&quot;: &quot;inlineChat.holdForSpeech&quot;,
  &quot;when&quot;: &quot;hasSpeechProvider &amp;amp;&amp;amp; inlineChatHasProvider &amp;amp;&amp;amp; inlineChatVisible &amp;amp;&amp;amp; textInputFocus&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>잡학</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/198</guid>
      <comments>https://19-97.tistory.com/198#entry198comment</comments>
      <pubDate>Mon, 20 Jan 2025 13:31:55 +0900</pubDate>
    </item>
    <item>
      <title>한글 조사(을/를, 이/가 등) 구분 코드</title>
      <link>https://19-97.tistory.com/196</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;특정 String을 넣어서 비교해서 &quot;한글'을'&quot; 형태로 뱉어줄 수 있지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 String이 없다면 계속해서 비교를 추가해야하는 형태이길래 찾아보고 코드를 작성하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 44.3023%; height: 182px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;받침 O&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;&lt;b&gt;받침 X&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;을&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;를&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;은&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;는&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;이&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;과&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;와&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1702951422176&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function determineParticle(str) {
  // 문자열인지 한글인지 확인합니다.
  if (/^[가-힣]+$/.test(str)) {
    // 문자열의 마지막 문자의 유니코드 값을 가져옵니다.
    const unicode = str.charCodeAt(str.length - 1)

    // 해당 유니코드 값에서 한글의 시작인 44032를 빼고, 28로 나누어 받침 코드를 계산합니다.
    const letterConsonant = (unicode - 44032) % 28

    // 받침 코드가 0이면 &quot;를&quot;을 반환하고, 그 외의 경우에는 &quot;을&quot;을 반환합니다.
    return `${str}${!letterConsonant ? '를' : '을'}`
  }
  return str
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 &quot;을/를&quot;로 하였으나, 위 표에 적힌 대로 바꾼다면 해당 형태로 나올 것이고,&lt;br /&gt;아니면 추가 parameter로 형태를 선택하는 옵션을 추가하면 될 것 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1702952321221&quot; class=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const example = {
  a: ['을', '를'],
  b: ['은', '는'],
  c: ['이', '가'],
  d: ['과', '와']
}
function determineParticle(str, opt) {
  ...

  return `${str}${!letterConsonant ? example[opt][1] : example[opt][0]}`
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JavaScript/javascript</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/196</guid>
      <comments>https://19-97.tistory.com/196#entry196comment</comments>
      <pubDate>Tue, 19 Dec 2023 11:04:47 +0900</pubDate>
    </item>
    <item>
      <title>Number Formater (1000 -&amp;gt; 1K, 만원 단위만)</title>
      <link>https://19-97.tistory.com/195</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1000 -&amp;gt; 1K Formater&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업을 하다보니 1,000을 1K로 표시해야하는 코드가 필요하여 사용하였다가&lt;br /&gt;까먹기 전에 메모를 작성합니다..&lt;/p&gt;
&lt;pre id=&quot;code_1702017407876&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function numberFormater(num) {
  if (!isNaN(num)) {
    if (num &amp;gt;= 1e3 &amp;amp;&amp;amp; num &amp;lt; 1e6) {
      num = `${(Math.round(num / 1e3 * 10) / 10)}K`
    } else if (num &amp;gt;= 1e6 &amp;amp;&amp;amp; num &amp;lt; 1e9) {
      num = `${(Math.round(num / 1e6 * 10) / 10)}M`
    } else if (num &amp;gt;= 1e9) {
      num = `${(Math.round(num / 1e9 * 10) / 10)}B`
    } else {
      num = new Intl.NumberFormat('ko-KR').format(num)
    }
  }
  return num
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;만원 단위만&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; 금액에 대한 formater가 필요하여 작성하였고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만원 단위만 구분하여 사용하면 되어서 아래와 같이 작성 후 메모해둡니다..&lt;/p&gt;
&lt;pre id=&quot;code_1702017484058&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function priceFormater(amount) {
  amount = parseInt(amount)
  // 0이면 '무료' 리턴
  if (!amount) {
    return '무료'
  }
  // 1의 자리 반올림
  const roundedAmount = Math.round(amount / 10) * 10
  // 만 단위와 원 단위 분리
  const man = Math.floor(roundedAmount / 10000)
  const won = roundedAmount % 10000

  return `${man &amp;gt; 0 ? `${man}만` : ''}${won ? ` ${new Intl.NumberFormat('ko-KR').format(won)}` : ''}원`
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>JavaScript/javascript</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/195</guid>
      <comments>https://19-97.tistory.com/195#entry195comment</comments>
      <pubDate>Fri, 8 Dec 2023 15:39:35 +0900</pubDate>
    </item>
    <item>
      <title>Keyup, Keydown 이벤트가 2번씩 호출 될 때 해결법</title>
      <link>https://19-97.tistory.com/193</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;input에 keydown의 enter를 인식하여 특정 function을 호출하도록 지정해두었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자꾸 2번씩 동작하여 찾아보다가 메모합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Keypress 사용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말 간단한 방법이며, 쉬운 방법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 잘못 사용한다면 사용자가 엔터키를 꾸욱 누른다면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트가 무한 호출되므로 주의해야합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. isComposing으로 확인하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색을 하다보니 찾게 된 친구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyboard 이벤트에 관련하여 event를 Parameter로 찍어보면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;isComposing이 처음엔 true, 두 번째엔 false로 찍힐 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영어로 입력시엔 발생하지 않는 이유가 여기에 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글로 입력시에는 글자를 조합하는 시간이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 컴포지션을 체크해주는 값이 isComposing입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 콘솔로 이벤트를 찍어보라고 말씀드렸던 이유는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그에는 대부분 &quot;&lt;span style=&quot;background-color: #fafafa; color: #383a42; text-align: start;&quot;&gt;e.nativeEvent&lt;/span&gt;&lt;span style=&quot;background-color: #fafafa; color: #383a42; text-align: start;&quot;&gt;.isComposing&quot; 형태로 사용을 하였지만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vue3 + Vite를 사용하는 제 환경에서는 e.isComposing으로 사용되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;간단한 사용법&lt;/h4&gt;
&lt;pre id=&quot;code_1698719514548&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;document.querySelector('#div').addEventListener('keydown', keydownEvent)

function keydownEvent(e) {
	if (e.isComposing) return
	// 사용할 이벤트 작성
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;저는 vue에서 @keydown.enter=&quot;keydownEvent&quot; 형태로 사용하다가 정리한 상태여서&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;너무 간단하거나 오타가 있을 수 있습니다&lt;/span&gt;&lt;/p&gt;</description>
      <category>JavaScript/javascript</category>
      <author>#1997</author>
      <guid isPermaLink="true">https://19-97.tistory.com/193</guid>
      <comments>https://19-97.tistory.com/193#entry193comment</comments>
      <pubDate>Tue, 31 Oct 2023 11:33:16 +0900</pubDate>
    </item>
  </channel>
</rss>