(32,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>After login smithery.ai, install the server.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://smithery.ai/server/@alperenkocyigit/semantic-scholar-graph-api\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">https://smithery.ai/server/@alperenkocyigit/semantic-scholar-graph-api</mark></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":1973,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://rndpolicy.org/future/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-08-41-1024x827.png\" alt=\"\" class=\"wp-image-1973\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1 class=\"wp-block-heading\">Response:</h1>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Based on my comprehensive search of recent synthetic biology articles from Semantic Scholar, here\'s a summary of key developments and trends in the field:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Recent Synthetic Biology Developments from Academic Literature</h2>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Machine Learning and AI Integration</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>One of the most significant trends is the convergence of machine learning with synthetic biology. A prominent 2024 review highlights how machine learning and deep learning are rapidly advancing the field, with applications spanning engineering cells, protein activity optimization, and metabolic pathway design. AI tools are now being used for predictive modeling, automated experimental design, and protein structure prediction, fundamentally changing how biological systems are designed.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Medical and Pharmaceutical Applications</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>The field continues to make significant strides in healthcare applications. Recent work demonstrates the development of engineered cells equipped with synthetic DNA circuits for diagnosis and therapy, including:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Living therapeutics with programmable cellular functions</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Bacterial therapies combining synthetic biology with nanomedicine</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Cell-free synthetic platforms for biomanufacturing</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Novel gene therapy vectors using synthetic biology approaches</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Advanced CRISPR Technologies and Beyond</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>While CRISPR remains central to synthetic biology, researchers are expanding beyond traditional applications. Recent reviews emphasize CRISPR\'s role in viral diagnostics, defense, and therapeutics, particularly highlighted by COVID-19\'s impact on biotechnology development. The field is also exploring new genome editing tools and improved delivery systems.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Biosensors and Wearable Technologies</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Synthetic biology is increasingly being applied to create sophisticated biosensing systems, including wearable materials embedded with synthetic biology sensors for biomolecule detection. These developments combine freeze-dried, cell-free synthetic circuits with textile substrates for real-time monitoring applications.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Sustainable Manufacturing and Environmental Applications</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>There\'s growing emphasis on using synthetic biology for sustainability goals, including:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Bioproduction of chemicals and materials as alternatives to petroleum-based products</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Environmental remediation applications</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Development of sustainable manufacturing processes using engineered biological systems</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Bottom-up Synthetic Biology and Artificial Cells</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Recent work focuses on assembling artificial biological systems from molecular components, including:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Engineering artificial vesicular systems for drug delivery and biosensing</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Creating synthetic cells with controllable properties</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Developing modular biological components for complex system assembly</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Standardization and Engineering Principles</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>The field is maturing with increased emphasis on standardization and engineering approaches. Recent publications highlight the development of standardized biological parts, improved assembly methods, and engineering principles like modularity, orthogonality, and predictability becoming central to synthetic biology design.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Cell-Free Systems</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Advanced cell-free transcription-translation systems are enabling new applications in:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Rapid prototyping of biological circuits</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Biomanufacturing without living cells</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Educational and diagnostic applications</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Synthetic cell development</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Emerging Challenges and Opportunities</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Recent literature identifies several key challenges:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Moving synthetic biology applications \"beyond the lab\" to real-world scenarios</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Addressing storage stability and resource-limited operation requirements</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Balancing innovation with biosafety and ethical considerations</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Developing appropriate regulatory frameworks for emerging technologies</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>International Collaboration and Policy</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>The field is seeing increased international cooperation, with recent conferences highlighting the importance of global collaboration in synthetic biology research and the need for aligned funding and shared infrastructure.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>The overall trend shows synthetic biology evolving from a primarily academic discipline to a mature engineering field with practical applications across healthcare, manufacturing, environmental management, and biotechnology, while increasingly integrating with AI and addressing global sustainability challenges.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','Semantic Scholar Academic Research MCP','','publish','open','closed','','semantic-scholar-academic-research-mcp','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(33,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:image {\"id\":1977,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://rndpolicy.org/future/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-18-03-1024x664.png\" alt=\"\" class=\"wp-image-1977\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":1978,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://rndpolicy.org/future/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-15-30-1024x764.png\" alt=\"\" class=\"wp-image-1978\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":1979,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://rndpolicy.org/future/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-16-09-1024x764.png\" alt=\"\" class=\"wp-image-1979\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":1980,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"https://rndpolicy.org/future/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-19-58-1024x852.png\" alt=\"\" class=\"wp-image-1980\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":1} -->\n<h1 class=\"wp-block-heading\">Response:</h1>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>I\'ve designed a comprehensive synthetic biology experiment that demonstrates how CRISPR-enhanced metabolic engineering can improve bacterial production of valuable compounds. Here\'s the complete experimental framework:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Experimental Overview</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>Research Question</strong>: How can we engineer bacteria to produce artemisinic acid (an antimalarial drug precursor) more efficiently using CRISPR-based tools compared to traditional methods?</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Key Components</h2>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Hypothesis</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Engineering E. coli with a CRISPR/CRISPRi-optimized metabolic pathway will achieve nearly 3x higher artemisinic acid yields by simultaneously enhancing biosynthetic gene expression and reducing competing metabolic pathways.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Experimental Design</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Control Groups</strong>: Wild-type E. coli, traditional plasmid-based engineering, CRISPR-enhanced strain</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Timeline</strong>: 7 weeks total (4 weeks strain construction, 2 weeks production testing, 1 week analysis)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Key Innovation</strong>: Combining CRISPR-Cas9 for pathway integration with CRISPRi for metabolic pathway repression</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Expected Results</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>The analysis shows the CRISPR-enhanced approach achieved:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>2.9x higher yield</strong>: 90.4 mg/L vs 31.2 mg/L artemisinic acid</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Enhanced efficiency</strong>: 2.6x better specific productivity and improved carbon utilization <a href=\"https://pubs.acs.org/doi/abs/10.1021/acssynbio.7b00251\" target=\"_blank\" rel=\"noreferrer noopener\">Combining CRISPR and CRISPRi Systems for Metabolic Engineering of E. coli and 1,4-BDO Biosynthesis | ACS Synthetic Biology</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Stable production</strong>: Chromosomal integration eliminated plasmid maintenance issues</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>Broader Impact</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>This experiment demonstrates how modern synthetic biology tools can be systematically combined for metabolic pathway optimization <a href=\"https://pubs.acs.org/doi/10.1021/sb300016b\" target=\"_blank\" rel=\"noreferrer noopener\">ACS Publications</a><a href=\"https://www.nature.com/articles/s41467-017-01695-x\" target=\"_blank\" rel=\"noreferrer noopener\">Nature</a>, with applications extending to:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Pharmaceutical manufacturing</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Sustainable chemical production</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Platform technologies for other biosynthetic pathways</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>The design incorporates current best practices from the literature, including CRISPR-mediated genome editing for iterative metabolic engineering <a href=\"https://pubmed.ncbi.nlm.nih.gov/26141150/\" target=\"_blank\" rel=\"noreferrer noopener\">PubMed</a><a href=\"https://pubs.acs.org/doi/abs/10.1021/acssynbio.7b00251\" target=\"_blank\" rel=\"noreferrer noopener\">ACS Publications</a> and combinatorial approaches using orthogonal CRISPR systems <a href=\"https://www.nature.com/articles/s41467-017-01695-x\" target=\"_blank\" rel=\"noreferrer noopener\">Combinatorial metabolic engineering using an orthogonal tri-functional CRISPR system | Nature Communications</a>.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Would you like me to elaborate on any specific aspect of the experimental design or explore alternative approaches for synthetic biology applications?</p>\n<!-- /wp:paragraph -->','Cognatus Scientific Thinking Server','','publish','open','closed','','cognatus-scientific-thinking-server','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(34,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>localGPT-VISION 은 문서와 이미지를 함께 분석하여 대화할 수 있는 강력한 RAG(Retrieval-Augmented Generation) 시스템입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">설치 방법</h3>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1단계: 사전 요구사항 및 저장소 복제</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>먼저, 시스템에 <strong>Python 3.10 이상</strong>과 <strong>Git</strong>이 설치되어 있는지 확인합니다. 그 다음, GitHub 저장소를 복제합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code># 저장소 복제 및 디렉토리 이동\ngit clone https://github.com/PromtEngineer/localGPT-Vision.git\ncd localGPT-Vision\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>2단계: 파이썬 가상 환경 생성 및 활성화</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>프로젝트별 의존성을 관리하기 위해 <code>conda</code> 또는 <code>venv</code>를 사용하여 가상 환경을 만듭니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Conda 사용 시:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>conda create -n localgpt-vision python=3.10 -y\nconda activate localgpt-vision\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>venv 사용 시:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>python3 -m venv venv\nsource venv/bin/activate\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>3단계: 필수 라이브러리 설치</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><code>requirements.txt</code> 파일에 명시된 라이브러리들을 설치합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>pip install -r requirements.txt\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>4단계: 모델 다운로드</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>이 프로젝트는 LLaVA v1.5와 같은 로컬 Vision 모델을 사용합니다. 스크립트를 처음 실행할 때 필요한 모델 파일들이 자동으로 다운로드되어 캐시 폴더에 저장됩니다. (약 4GB)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>참고</strong>: 만약 OpenAI의 GPT-4 Vision이나 Google Gemini와 같은 상용 모델을 사용하려면, 해당 API 키를 환경 변수로 설정해야 합니다.<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><code>export OPENAI_API_KEY=\"YOUR_OPENAI_API_KEY\" </code></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>export GENAI_API_KEY=\"YOUR_GOOGLE_API_KEY\"</code></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">사용 요령</h3>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1단계: 데이터 준비</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>대화하고 싶은 문서(PDF, TXT 등)나 이미지(JPG, PNG 등)를 <code>SOURCE_DOCUMENTS</code> 폴더 안에 넣습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>2단계: 데이터 색인화 (Ingest)</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><code>ingest.py</code> 스크립트를 실행하여 <code>SOURCE_DOCUMENTS</code> 폴더 안의 파일들을 AI가 이해할 수 있는 벡터 형태로 변환하고 데이터베이스에 저장합니다. 이 과정을 **\"Ingestion\"**이라고 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>python ingest.py\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이 작업은 파일의 양과 크기에 따라 시간이 걸릴 수 있습니다. <code>Ingestion complete</code> 메시지가 나오면 완료된 것입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>3. 챗봇 실행 및 질문하기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><code>run_localgpt.py</code> 스크립트를 실행하여 챗봇 인터페이스를 시작합니다. 기본적으로 로컬 LLaVA 모델을 사용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>python run_localgpt.py\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>스크립트가 실행되면 명령줄(CLI)에 질문을 입력할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p><strong>Enter a query:</strong> (여기에 질문을 입력하세요)</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>질문을 입력하면 AI가 <code>SOURCE_DOCUMENTS</code> 폴더의 내용을 바탕으로 답변과 함께 근거가 된 문서의 출처를 함께 보여줍니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>💡 사용 예시:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>자동차 매뉴얼 PDF와 차량 내부 사진을 넣고 \"에어컨 필터는 어디에 있어?\"라고 질문할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>재무제표 PDF와 그래프 이미지를 넣고 \"작년 대비 매출이 가장 많이 증가한 분기는 언제야?\"라고 물어볼 수 있습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>(선택) 상용 모델 사용하기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>만약 GPT-4 Vision 모델을 사용하고 싶다면 <code>--model_type</code> 플래그를 추가하여 실행합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>python run_localgpt.py --model_type gpt4-vision</code></pre>\n<!-- /wp:code -->','localGPT-vision을 ubuntu서버에 설치 및 사용','','publish','open','closed','','localgpt-vision%ec%9d%84-ubuntu%ec%84%9c%eb%b2%84%ec%97%90-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ec%82%ac%ec%9a%a9','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(35,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">🌟 주요 특징</h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>다양한 데이터 형식 지원</strong>: 텍스트(txt, md, html)는 물론 PDF, Word, Excel, 심지어 이미지와 비디오 같은 복잡한 비정형 데이터까지 처리할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>지능적인 문서 이해</strong>: 딥러닝 기반의 \'Smart Document Processing\' 기술을 활용하여 문서의 레이아웃을 분석하고 텍스트, 표, 이미지 등의 요소를 정확하게 추출하여 품질 높은 청킹(chunking)을 보장합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>템플릿 기반 워크플로우</strong>: 코딩 없이 파이프라인을 시각적으로 설계할 수 있는 템플릿 기능을 제공하여 RAG 애플리케이션 개발을 간소화합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>품질 높은 답변 생성</strong>: 검색된 정보를 바탕으로 LLM(대규모 언어 모델)이 신뢰성 있는 답변을 생성하도록 하여 환각(Hallucination) 현상을 최소화합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>간편한 배포 및 확장성</strong>: Docker를 통해 쉽게 설치하고 확장할 수 있도록 설계되었습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>RagFlow를 Ubuntu 서버에 설치하고 사용하는 방법은 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>1. 사전 요구 사항</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>설치를 진행하기 전에 다음 요구 사항을 충족하는지 확인해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>CPU</strong>: 4코어 이상 (x86)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>RAM</strong>: 16GB 이상</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>디스크</strong>: 50GB 이상</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker</strong>: 버전 24.0.0 이상</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Compose</strong>: 버전 v2.26.1 이상</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>gVisor</strong>: (선택 사항) 코드 실행기(샌드박스) 기능을 사용하려는 경우에만 필요합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2. Ubuntu 서버에 설치</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1단계: 시스템 메모리 매핑 늘리기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Elasticsearch/Infinity를 위해 시스템의 최대 메모리 맵 수를 늘려야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo sysctl -w vm.max_map_count=262144\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>재부팅 후에도 이 설정을 유지하려면 <code>/etc/sysctl.conf</code> 파일에 추가합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>echo \"vm.max_map_count=262144\" | sudo tee -a /etc/sysctl.conf\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>2단계: Docker 및 Docker Compose 설치</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ubuntu에 Docker와 Docker Compose를 설치합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo apt-get update\nsudo apt-get install -y docker.io docker-compose\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>3단계: RAGFlow 리포지토리 복제</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>RAGFlow의 GitHub 리포지토리를 복제합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>git clone https://github.com/infiniflow/ragflow.git\ncd ragflow\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>4단계: RAGFlow 서버 시작</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Compose를 사용하여 RAGFlow 서버를 시작합니다. <code>.env</code> 파일에서 <code>RAGFLOW_IMAGE</code> 변수를 설정하여 원하는 버전을 선택할 수 있습니다 (예: <code>infiniflow/ragflow:v0.19.0-slim</code>).</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>cd docker\n# .env 파일 수정이 필요한 경우 nano .env 또는 vi .env 사용\ndocker-compose up -d\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>3. RAGFlow 사용 요령</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>RAGFlow는 복잡한 문서(PDF, Word 등)를 이해하고, 이를 기반으로 정확한 답변을 생성하는 AI(RAG) 앱을 손쉽게 만들 수 있도록 도와주는 강력한 도구입니다. 이 매뉴얼은 공식 웹사이트(<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https://ragflow.io/\">https://ragflow.io/</a>)를 참조하여 RAGFlow의 핵심 사용법을 안내합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>📌 1단계: 모델 설정 (API 키 연동)</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>RAGFlow가 똑똑하게 작동하려면, 언어 모델(LLM)과의 연결이 가장 먼저 필요합니다. OpenAI의 GPT, Anthropic의 Claude 등 외부 모델이나 로컬 모델을 연결할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":1} -->\n<ol start=\"1\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Model Providers 메뉴 접속</strong>: 로그인 후, 우측 상단의 프로필 아이콘을 클릭하고 \'Model Providers\' 메뉴로 들어갑니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>API 키 추가</strong>: 사용하려는 모델 제공자(예: OpenAI)를 선택하고, 해당 서비스에서 발급받은 <strong>API 키</strong>를 입력한 뒤 저장합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>기본 모델 지정</strong>: \'Set default models\' 버튼을 눌러 각 기능에 사용할 기본 모델을 지정합니다.<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Chat Model</strong>: 사용자와 대화하고 답변을 생성할 모델 (예: <code>gpt-4o</code>)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Embedding Model</strong>: 문서를 벡터(숫자)로 변환하여 검색이 용이하도록 만드는 모델 (예: <code>text-embedding-3-small</code>)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Rerank Model</strong>: 검색된 결과의 순위를 매겨 정확도를 높이는 모델</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 설정이 완료되어야 RAGFlow의 모든 기능이 정상적으로 동작합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>📚 2단계: 지식 베이스(Knowledge Base) 생성 및 파일 업로드</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>지식 베이스는 AI가 학습하고 답변의 근거로 삼을 문서들의 집합입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":1} -->\n<ol start=\"1\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>지식 베이스 만들기</strong>: 메인 화면에서 <strong>\'Knowledge Base\'</strong> 탭으로 이동한 후 \'Create knowledge base\' 버튼을 클릭합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>이름 및 설정</strong>: 지식 베이스의 이름을 입력하고, 사용할 <strong>Embedding Model</strong>을 선택합니다. 다른 고급 설정은 우선 기본값으로 두고 \'Save\'를 눌러 생성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>파일 업로드</strong>: 생성된 지식 베이스 안에서 <strong>\'+ Add file\'</strong> 버튼을 눌러 AI에게 학습시킬 문서 파일(PDF, DOCX, TXT 등)을 업로드합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>문서 처리 (Parsing)</strong>: 업로드가 완료되면, 각 파일 옆의 <strong>재생(▶) 버튼</strong>을 눌러 문서 분석 및 처리를 시작합니다. 처리 상태가 \'SUCCESS\'로 바뀌면 AI가 문서를 학습한 것입니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 과정에서 RAGFlow는 <strong>\'지능형 문서 이해\'</strong> 기술을 통해 문서의 제목, 단락, 표 등을 분석하여 최적의 단위(Chunk)로 자릅니다. 사용자는 처리된 결과를 직접 확인하고 수정할 수도 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>🤖 3단계: 채팅 애플리케이션 (Chat Assistant) 만들기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>이제 학습된 지식 베이스를 기반으로 질문에 답변할 수 있는 AI 채팅 비서를 만들 차례입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":1} -->\n<ol start=\"1\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>애플리케이션 생성</strong>: 상단의 <strong>\'Chat\'</strong> 탭으로 이동하여 \'Create an Assistant\' 버튼을 클릭합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>기본 정보 입력</strong>:<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Name</strong>: AI 비서의 이름을 지어줍니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Description</strong>: 어떤 역할을 하는지 간단히 설명합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Opener</strong>: 채팅방에 처음 입장했을 때 사용자에게 건넬 인사말을 설정할 수 있습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>지식 베이스 연결</strong>: <strong>\'Knowledge Bases\'</strong> 섹션에서 이 AI 비서가 참조할 지식 베이스를 선택합니다. 여러 개의 지식 베이스를 동시에 연결할 수도 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>모델 설정</strong>: <strong>\'Model Setting\'</strong> 섹션에서 답변 생성에 사용할 언어 모델(Chat Model)을 선택합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>생성 완료</strong>: \'OK\' 버튼을 눌러 AI 비서 생성을 마칩니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>💬 4단계: 테스트 및 활용</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>이제 모든 준비가 끝났습니다. Chat 화면에서 방금 만든 AI 비서를 선택하여 대화를 시작할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>질문하기</strong>: 지식 베이스에 업로드한 문서의 내용을 바탕으로 자유롭게 질문해 보세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>출처 확인</strong>: RAGFlow는 답변을 생성할 때 어떤 문서의 어느 부분을 참고했는지 **출처(citation)**를 함께 제공합니다. 이를 통해 답변의 신뢰도를 즉시 확인할 수 있어 \'환각(Hallucination)\' 현상을 크게 줄일 수 있습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 기본 과정을 통해 누구나 코딩 없이 자신만의 문서 기반 AI Q&amp;A 봇을 만들고 활용할 수 있습니다.</p>\n<!-- /wp:paragraph -->','ragflow를 ubuntu서버에 설치 및 사용','','publish','open','closed','','ragflow%eb%a5%bc-ubuntu%ec%84%9c%eb%b2%84%ec%97%90-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ec%82%ac%ec%9a%a9','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(36,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>워크플로는 복잡한 작업을 더 작은 단계(노드)로 나누어 시스템 복잡성을 줄이고, 신속한 엔지니어링 및 모델 추론 기능에 대한 의존도를 줄이며, 복잡한 작업에 대한 LLM 애플리케이션의 성능을 향상시킵니다. 이를 통해 시스템의 해석 가능성, 안정성 및 내결함성도 향상됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify 워크플로는 두 가지 유형으로 구분됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Chatflow</strong>&nbsp;: 고객 서비스, 의미 검색, 응답 구성에 다단계 논리가 필요한 기타 대화형 애플리케이션을 포함한 대화형 시나리오에 맞게 설계되었습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>워크플로</strong>&nbsp;: 자동화 및 일괄 처리 시나리오에 맞춰 설계되었으며, 고품질 번역, 데이터 분석, 콘텐츠 생성, 이메일 자동화 등에 적합합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":772,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-15-1024x665.png\" alt=\"\" class=\"wp-image-772\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>자연어 입력에서 사용자 의도 인식의 복잡성을 해결하기 위해 Chatflow는 질문 이해 노드를 제공합니다. Workflow와 달리 Chatflow는 대화 기록(메모리), 주석이 달린 답변, 답변 노드와 같은 챗봇 기능을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>자동화 및 일괄 처리 시나리오에서 복잡한 비즈니스 로직을 처리하기 위해 Workflow는 코드 노드, IF/ELSE 노드, 템플릿 변환, 반복 노드 등 다양한 로직 노드를 제공합니다. 또한, 시간 기반 및 이벤트 트리거 작업을 위한 기능을 제공하여 자동화 프로세스를 더욱 쉽게 구축할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"common-use-cases\"><a href=\"https://docs.dify.ai/en/guides/workflow/README#common-use-cases\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/README#common-use-cases\"></a>일반적인 사용 사례</h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>고객 서비스</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>LLM을 고객 서비스 시스템에 통합하면 일반적인 질문에 대한 답변을 자동화하여 지원팀의 업무 부담을 줄일 수 있습니다. LLM은 고객 문의의 맥락과 의도를 이해하고 실시간으로 유용하고 정확한 답변을 생성합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>콘텐츠 생성</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>블로그 게시물, 제품 설명, 마케팅 자료 등 어떤 콘텐츠를 제작하든 LLM은 고품질 콘텐츠를 제작하여 도와드립니다. 개요나 주제만 제공해 주시면 LLM이 방대한 지식 기반을 활용하여 매력적이고 유익하며 체계적인 콘텐츠를 제작해 드립니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>작업 자동화</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>LLM은 Trello, Slack, Lark 등 다양한 작업 관리 시스템과 통합되어 프로젝트 및 작업 관리를 자동화할 수 있습니다. LLM은 자연어 처리를 활용하여 사용자 입력을 이해하고 해석하고, 작업을 생성하고, 상태를 업데이트하고, 수동 개입 없이 우선순위를 지정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>데이터 분석 및 보고</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>LLM은 대규모 데이터 세트를 분석하고 보고서 또는 요약을 생성할 수 있습니다. LLM에 관련 정보를 제공함으로써 추세, 패턴 및 인사이트를 파악하고 원시 데이터를 실행 가능한 정보로 변환할 수 있습니다. 이는 데이터 기반 의사 결정을 원하는 기관에 특히 유용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>이메일 자동화</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>LLM은 이메일, 소셜 미디어 업데이트 및 기타 커뮤니케이션 방식의 초안 작성에 활용할 수 있습니다. LLM은 간략한 개요나 핵심 요점을 제공함으로써 체계적이고, 일관성 있으며, 맥락적으로 관련성 있는 메시지를 생성할 수 있습니다. 이를 통해 상당한 시간을 절약하고 명확하고 전문적인 답변을 작성할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"how-to-get-started\"><a href=\"https://docs.dify.ai/en/guides/workflow/README#how-to-get-started\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/README#how-to-get-started\"></a>시작하는 방법</h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>처음부터 워크플로를 구축하거나 시스템 템플릿을 사용하여 시작하세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>캔버스에 노드를 만드는 방법, 노드를 연결하고 구성하는 방법, 워크플로우를 디버깅하는 방법, 실행 기록 보기 등 기본 작업에 익숙해지세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>워크플로를 저장하고 게시합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>게시된 애플리케이션을 실행하거나 API를 통해 워크플로를 호출합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">핵심 개념</h2>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"nodes\">노드</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>노드는 워크플로의 핵심 구성 요소입니다</strong> . 다양한 기능을 가진 노드를 연결하여 워크플로 내에서 일련의 작업을 실행할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"variables\"><a href=\"https://docs.dify.ai/en/guides/workflow/key-concepts#variables\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/key-concepts#variables\"></a>변수</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>변수는 워크플로우 내 노드의 입력과 출력을 연결하는 데 사용되며</strong> , 이를 통해 프로세스 전반에 걸쳐 복잡한 처리 로직을 구현할 수 있습니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"chatflow-and-workflow\"><a href=\"https://docs.dify.ai/en/guides/workflow/key-concepts#chatflow-and-workflow\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/key-concepts#chatflow-and-workflow\"></a>Chatflow 및 워크플로</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>응용 프로그램 시나리오</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Chatflow</strong>&nbsp;: 고객 서비스, 의미 검색, 응답 구성에 다단계 논리가 필요한 기타 대화형 애플리케이션을 포함한 대화형 시나리오에 맞게 설계되었습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>워크플로</strong>&nbsp;: 자동화 및 일괄 처리 시나리오에 맞춰 설계되었으며, 고품질 번역, 데이터 분석, 콘텐츠 생성, 이메일 자동화 등에 적합합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>사용 시작 방법</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":774,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-16-1024x665.png\" alt=\"\" class=\"wp-image-774\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":775,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-17-1024x665.png\" alt=\"\" class=\"wp-image-775\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>사용 가능한 노드의 차이점</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>종료 노드 는 워크플로의 종료 노드이며 프로세스가 끝날 때만 선택할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Answer 노드는 Chatflow에만 적용되며 스트리밍 텍스트 출력에 사용되며 프로세스의 중간 단계에서 출력할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Chatflow에는 여러 차례의 대화 기록을 저장하고 전달하는 내장 채팅 메모리(Memory)가 있으며, LLM 및 질문 분류기와 같은 노드를 활성화할 수 있습니다. Workflow에는 메모리 관련 구성이 없으므로 활성화할 수 없습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','워크플로','','publish','open','closed','','%ec%9b%8c%ed%81%ac%ed%94%8c%eb%a1%9c','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(37,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"definition\">정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>\"시작\"</strong>&nbsp;노드 는 Chatflow/Workflow 애플리케이션의 중요한 사전 설정 노드입니다. 사용자 입력 및&nbsp;<a href=\"https://docs.dify.ai/en/guides/workflow/file-upload\">업로드된 파일</a>&nbsp;과 같은 필수적인 초기 정보를 제공하여&nbsp;애플리케이션 및 후속 워크플로 노드의 정상적인 흐름을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"configuring-the-node\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/start#configuring-the-node\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/start#configuring-the-node\"></a>노드 구성</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>시작 노드의 설정 페이지에는 \"입력 필드\"</strong> 와 사전 설정 <strong>시스템 변수라는</strong> 두 섹션이 있습니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":630,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-2-1024x675.png\" alt=\"\" class=\"wp-image-630\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"input-field\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/start#input-field\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/start#input-field\"></a>입력 필드</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>입력 필드는 사용자에게 추가 정보를 입력하라는 메시지를 표시하기 위해 애플리케이션 개발자가 구성합니다.예를 들어, 주간 보고서 애플리케이션에서 사용자는 이름, 근무 기간, 근무 세부 정보와 같은 배경 정보를 특정 형식으로 제공해야 할 수 있습니다. 이러한 예비 정보는 LLM이 더 높은 품질의 답변을 생성하는 데 도움이 됩니다.6가지 유형의 입력 변수가 지원되며, 모두 필요에 따라 설정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>텍스트:</strong>&nbsp;사용자가 입력하는 짧은 텍스트로, 최대 길이는 256자입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>문단:</strong>&nbsp;긴 텍스트로, 사용자가 더 긴 내용을 입력할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>선택:</strong>&nbsp;개발자가 설정한 고정 옵션입니다. 사용자는 사전 설정된 옵션에서만 선택할 수 있으며 사용자 정의 콘텐츠를 입력할 수 없습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>숫자:</strong>&nbsp;숫자 입력만 허용합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>단일 파일:</strong>&nbsp;사용자가 단일 파일을 업로드할 수 있습니다. 문서 유형, 이미지, 오디오, 비디오 및 기타 파일 유형을 지원합니다. 사용자는 로컬로 업로드하거나 파일 URL을 붙여넣을 수 있습니다. 자세한 사용 방법은 파일 업로드를 참조하세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>파일 목록:</strong>&nbsp;사용자가 파일을 일괄 업로드할 수 있습니다. 문서 유형, 이미지, 오디오, 비디오 및 기타 파일 유형을 지원합니다. 사용자는 로컬로 업로드하거나 파일 URL을 붙여넣을 수 있습니다. 자세한 사용법은 <a href=\"https://rndpolicy.org/future/docs/%ed%8c%8c%ec%9d%bc-%ec%97%85%eb%a1%9c%eb%93%9c/\" data-type=\"docs\" data-id=\"2048\">파일 업로드</a>를 참조하세요.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>Dify에 내장된 문서 추출 노드는 특정 문서 형식만 처리할 수 있습니다. 이미지, 오디오 또는 비디오 파일을 처리하려면 외부 데이터 도구를 참조하여 해당 파일 처리 노드를 설정하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>설정이 완료되면 사용자는 애플리케이션 사용 전에 LLM에 필요한 정보를 제공하도록 안내됩니다. 더 많은 정보를 제공할수록 LLM의 질의응답 효율성이 향상됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"system-variables\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/start#system-variables\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/start#system-variables\"></a>시스템 변수</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>시스템 변수는 Chatflow/Workflow 애플리케이션에서 미리 설정된 시스템 수준 매개변수로, 애플리케이션의 다른 노드에서 전역적으로 접근할 수 있습니다. 시스템 변수는 일반적으로 다중 턴 대화 애플리케이션 구축, 애플리케이션 로그 수집 및 데이터 모니터링, 다양한 애플리케이션 및 사용자 간의 사용 행동 기록과 같은 고급 개발 시나리오에서 사용됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Workflow</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>워크플로 애플리케이션은 다음과 같은 시스템 변수를 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>변수 이름</th><th>데이터 유형</th><th>설명</th><th>노트</th></tr></thead><tbody><tr><td><code>sys.files</code><br>[지난 기능]</td><td>배열[파일]</td><td>파일 매개변수는 사용자가 애플리케이션을 처음 사용할 때 업로드한 이미지를 저장합니다.</td><td>애플리케이션 오케스트레이션 페이지 오른쪽 상단의 \"기능\" 섹션에서 이미지 업로드 기능을 활성화해야 합니다.</td></tr><tr><td><code>sys.user_id</code></td><td>문자열</td><td>사용자 ID는 워크플로 애플리케이션을 사용할 때 각 사용자에게 자동으로 할당되는 고유 식별자로, 서로 다른 대화 사용자를 구별하는 데 사용됩니다.</td><td></td></tr><tr><td><code>sys.app_id</code></td><td>문자열</td><td>애플리케이션 ID는 시스템에서 각 Workflow 애플리케이션에 할당한 고유 식별자로, 다양한 애플리케이션을 구별하고 현재 애플리케이션의 기본 정보를 기록하는 데 사용됩니다.</td><td>개발 기능이 있는 사용자의 경우 이 매개변수를 사용하여 다양한 Workflow 애플리케이션을 구별하고 찾을 수 있습니다.</td></tr><tr><td><code>sys.workflow_id</code></td><td>문자열</td><td>Workflow ID는 현재 Workflow 애플리케이션에 포함된 모든 노드 정보를 기록하는 데 사용됩니다.</td><td>개발 기능이 있는 사용자의 경우 이 매개변수를 사용하여 워크플로 내에서 노드 정보를 추적하고 기록할 수 있습니다.</td></tr><tr><td><code>sys.workflow_run_id</code></td><td>문자열</td><td>Workflow 애플리케이션 실행 ID는 Workflow 애플리케이션의 실행 상태를 기록하는 데 사용됩니다.</td><td>개발 기능이 있는 사용자의 경우 이 매개변수를 사용하여 애플리케이션의 실행 기록을 추적할 수 있습니다.</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:paragraph -->\n<p><strong>챗플로우</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Chatflow 애플리케이션은 다음과 같은 시스템 변수를 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>변수 이름</th><th>데이터 유형</th><th>설명</th><th>노트</th></tr></thead><tbody><tr><td><code>sys.query</code></td><td>문자열</td><td>사용자가 대화 상자에 입력한 초기 내용</td><td></td></tr><tr><td><code>sys.files</code></td><td>배열[파일]</td><td>사용자가 대화 상자에 업로드한 이미지</td><td>애플리케이션 오케스트레이션 페이지 오른쪽 상단의 \"기능\" 섹션에서 이미지 업로드 기능을 활성화해야 합니다.</td></tr><tr><td><code>sys.dialogue_count</code></td><td>숫자</td><td>Chatflow 애플리케이션과 사용자 상호작용 중 대화 턴 수입니다. 각 턴마다 자동으로 1씩 증가합니다. if-else 노드와 함께 사용하여 풍부한 분기 논리를 생성할 수 있습니다. 예를 들어, 대화의 X번째 턴에서 대화 기록을 검토하고 분석을 제공합니다.</td><td></td></tr><tr><td><code>sys.conversation_id</code></td><td>문자열</td><td>대화 상호작용 세션에 대한 고유 식별자로, 모든 관련 메시지를 동일한 대화로 그룹화하여 LLM이 동일한 주제와 맥락에서 대화를 계속할 수 있도록 보장합니다.</td><td></td></tr><tr><td><code>sys.user_id</code></td><td>문자열</td><td>각 애플리케이션 사용자에게 할당된 고유 식별자로, 다양한 대화 사용자를 구별하는 데 사용됩니다.</td><td></td></tr><tr><td><code>sys.app_id</code></td><td>문자열</td><td>애플리케이션 ID는 시스템에서 각 Workflow 애플리케이션에 할당한 고유 식별자로, 다양한 애플리케이션을 구별하고 현재 애플리케이션의 기본 정보를 기록하는 데 사용됩니다.</td><td>개발 기능이 있는 사용자의 경우 이 매개변수를 사용하여 다양한 Workflow 애플리케이션을 구별하고 찾을 수 있습니다.</td></tr><tr><td><code>sys.workflow_id</code></td><td>문자열</td><td>Workflow ID는 현재 Workflow 애플리케이션에 포함된 모든 노드 정보를 기록하는 데 사용됩니다.</td><td>개발 기능이 있는 사용자의 경우 이 매개변수를 사용하여 워크플로 내에서 노드 정보를 추적하고 기록할 수 있습니다.</td></tr><tr><td><code>sys.workflow_run_id</code></td><td>문자열</td><td>Workflow 애플리케이션 실행 ID는 Workflow 애플리케이션의 실행 상태를 기록하는 데 사용됩니다.</td><td>개발 기능이 있는 사용자의 경우 이 매개변수를 사용하여 애플리케이션의 실행 기록을 추적할 수 있습니다.</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','1. Node - Start(시작)','','publish','open','closed','','node-start%ec%8b%9c%ec%9e%91','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(38,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"1-definition\">1. 정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>워크플로의 최종 출력 내용을 정의합니다. 모든 워크플로는 실행이 완료된 후 최종 결과를 출력하기 위해 최소 하나의 종료 노드가 필요합니다.종료 노드는 프로세스의 종료 지점입니다. 이후 노드를 추가할 수 없습니다. 워크플로 애플리케이션에서는 종료 노드에 도달했을 때만 결과가 출력됩니다. 프로세스에 조건 분기가 있는 경우 여러 종료 노드를 정의해야 합니다.최종 노드는 하나 이상의 출력 변수를 선언해야 하며, 이 변수는 모든 상류 노드의 출력 변수를 참조할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Chatflow에서는 종료 노드가 지원되지 않습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"2-scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/end#2-scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/end#2-scenarios\"></a>2. 시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>다음의&nbsp;긴 스토리 생성 워크플로&nbsp;에서 , 종료 노드에서 선언된 변수는&nbsp;<code>Output</code> 상위 코드 노드의 출력입니다. 즉, 코드 노드가 실행을 완료하고 코드의 실행 결과를 출력하면 워크플로가 종료됩니다</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>단일 경로 실행 예:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":615,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-1024x455.png\" alt=\"\" class=\"wp-image-615\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>다중 경로 실행 예:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":624,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/3cb3f5fea376265bede0a4ac5bcc1ddc-1024x511.png\" alt=\"\" class=\"wp-image-624\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','2. Node - End(끝)','','publish','open','closed','','node-end%eb%81%9d','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(39,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"definition\">정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>“시작” 노드에서 사용자가 입력한 정보(자연어, 업로드된 파일 또는 이미지)를 처리하고 효과적인 응답 정보를 제공하기 위해 대규모 언어 모델의 기능을 활용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":648,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-3-1024x610.png\" alt=\"\" class=\"wp-image-648\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#scenarios\"></a>시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>LLM은 Chatflow/Workflow의 핵심 노드로, 대규모 언어 모델의 대화형/생성형/분류형/처리 기능을 활용하여 주어진 프롬프트에 따라 광범위한 작업을 처리하며 워크플로의 여러 단계에서 사용할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>의도 인식</strong>&nbsp;: 고객 서비스 시나리오에서 사용자 문의를 식별하고 분류하여 다운스트림 프로세스를 안내합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>텍스트 생성</strong>&nbsp;: 콘텐츠 생성 시나리오에서 주제와 키워드를 기반으로 관련 텍스트를 생성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>콘텐츠 분류</strong>&nbsp;: 이메일 일괄 처리 시나리오에서 문의/불만/스팸과 같은 이메일을 자동으로 분류합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>텍스트 변환</strong>&nbsp;: 번역 시나리오에서 사용자가 제공한 텍스트를 지정된 언어로 번역하는 작업입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>코드 생성</strong>&nbsp;: 프로그래밍 지원 시나리오에서 사용자 요구 사항에 따라 특정 비즈니스 코드를 생성하거나 테스트 사례를 작성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>RAG</strong>&nbsp;: 지식 기반 Q&amp;A 시나리오에서 검색된 관련 지식을 재구성하여 사용자 질문에 답합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>이미지 이해</strong>&nbsp;: 시각 기능을 갖춘 다중 모달 모델을 사용하여 이미지 내 정보에 대한 질문을 이해하고 답합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>파일 분석</strong>&nbsp;: 파일 처리 시나리오에서 LLM을 사용하여 파일 내에 포함된 정보를 인식하고 분석합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>적절한 모델을 선택하고 프롬프트를 작성하면 Chatflow/Workflow 내에서 강력하고 안정적인 솔루션을 구축할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"how-to-configure\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#how-to-configure\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#how-to-configure\"></a>구성 방법</h3>\n<!-- /wp:heading -->\n\n<!-- wp:image {\"id\":650,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-4-1024x550.png\" alt=\"\" class=\"wp-image-650\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 단계:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>모델 선택</strong>&nbsp;: Dify는 OpenAI의 GPT 시리즈, Anthropic의 Claude 시리즈, Google의 Gemini 시리즈를 포함한 주요 글로벌 모델을 지원합니다. 모델 선택은 추론 성능, 비용, 응답 속도, 컨텍스트 윈도우 등에 따라 달라집니다. 시나리오 요구 사항과 작업 유형에 따라 적합한 모델을 선택해야 합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>모델 매개변수 구성</strong>&nbsp;: 모델 매개변수는 온도, TopP, 최대 토큰, 응답 형식 등과 같은 생성 결과를 제어합니다. 선택을 용이하게 하기 위해 시스템은 Creative, Balanced, Precise의 세 가지 사전 설정 매개변수 세트를 제공합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>프롬프트 작성</strong>&nbsp;: LLM 노드는 사용하기 쉬운 프롬프트 작성 페이지를 제공합니다. 채팅 모델이나 완성 모델을 선택하면 다양한 프롬프트 작성 구조가 표시됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>고급 설정</strong>&nbsp;: 메모리를 활성화하고, 메모리 창을 설정하고, 더 복잡한 프롬프트에 Jinja-2 템플릿 언어를 사용할 수 있습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>처음으로 Dify를 사용하는 경우 LLM 노드에서 모델을 선택하기 전에 <strong>시스템 설정-모델 공급자</strong> 에서 모델 구성을 완료해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"writing-prompts\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#writing-prompts\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#writing-prompts\"></a><strong>글쓰기 프롬프트</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>LLM 노드에서 모델 입력 프롬프트를 사용자 지정할 수 있습니다. 채팅 모델을 선택하면 시스템/사용자/지원 섹션을 조정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>프롬프트 생성기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>효과적인 시스템 프롬프트(시스템)를 생각해내는 데 어려움을 겪고 있다면 프롬프트 생성기를 사용하여 AI 기능을 활용하여 특정 비즈니스 시나리오에 적합한 프롬프트를 빠르게 만들 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":652,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-5-1024x630.png\" alt=\"\" class=\"wp-image-652\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>프롬프트 편집기에서, / 또는 { 를 입력하여 <strong>변수 삽입 메뉴를 불러와 </strong><strong>특수 변수 블록</strong> 이나 <strong>업스트림 노드 변수를</strong> 컨텍스트 콘텐츠로 프롬프트에 삽입 할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":653,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-6-846x1024.png\" alt=\"\" class=\"wp-image-653\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"explanation-of-special-variables\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#explanation-of-special-variables\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#explanation-of-special-variables\"></a>특수 변수에 대한 설명</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>컨텍스트 변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>컨텍스트 변수는 LLM 노드 내에서 정의되는 특수한 유형의 변수로, 외부에서 검색된 텍스트 콘텐츠를 프롬프트에 삽입하는 데 사용됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":656,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-7-1024x602.png\" alt=\"\" class=\"wp-image-656\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>공통 지식 기반 Q&amp;A 애플리케이션에서 지식 검색의 다운스트림 노드는 일반적으로 LLM 노드입니다. 지식 검색의 <strong>출력 변수는</strong> 연관 및 할당을 위해 LLM 노드 내의 <strong>컨텍스트 변수</strong><code>result</code> 에 구성되어야 합니다 . 연관 후, 프롬프트의 적절한 위치에 <strong>컨텍스트 변수를</strong> 삽입하면 외부에서 검색된 지식을 프롬프트에 통합할 수 있습니다.이 변수는 LLM 응답을 위한 프롬프트 컨텍스트에 도입된 외부 지식으로 사용될 수 있을 뿐만 아니라 세그먼트 참조 정보가 포함된 데이터 구조로 인해 애플리케이션의 인용 및 귀속 기능도 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>컨텍스트 변수가 시작 노드의 문자열 유형 변수와 같이 상위 노드의 공통 변수와 연결된 경우 컨텍스트 변수는 여전히 외부 지식으로 사용할 수 있지만 <strong>인용 및 귀속</strong> 기능은 비활성화됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>파일 변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Claude 3.5 Sonnet 과 같은 일부 LLM은 이제 파일 내용의 직접 처리를 지원하여 프롬프트에서 파일 변수를 사용할 수 있습니다. 잠재적인 문제를 방지하려면 애플리케이션 개발자는 파일 변수를 사용하기 전에 LLM 공식 웹사이트에서 지원되는 파일 유형을 확인해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":657,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-8-1024x771.png\" alt=\"\" class=\"wp-image-657\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>모델 매개변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모델의 매개변수는 모델의 출력에 영향을 미칩니다. 모델마다 매개변수가 다릅니다. 다음 그림은 의 매개변수 목록을 보여줍니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":658,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-9-790x1024.png\" alt=\"\" class=\"wp-image-658\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>주요 매개변수 용어는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><strong>Temperature</strong></strong> : 일반적으로 0과 1 사이의 값으로, 무작위성을 제어합니다. <strong>Temperature</strong>가 0에 가까울수록 결과가 더 확실하고 반복적입니다. 1에 가까울수록 결과가 더 무작위적입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Top P</strong> : 결과의 다양성을 제어합니다. 모델은 확률을 기반으로 후보 단어를 선택하여 누적 확률이 사전 설정된 임계값 P를 초과하지 않도록 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><strong>Presence Penalty</strong></strong> : 이미 생성된 콘텐츠에 페널티를 부과하여 동일한 엔터티 또는 정보의 반복 생성을 줄이는 데 사용됩니다. 이를 통해 모델이 새롭거나 다른 콘텐츠를 생성하도록 유도합니다. 매개변수 값이 증가할수록 후속 세대에서 이미 생성된 콘텐츠에 더 큰 페널티가 적용되어 콘텐츠 반복 생성 가능성이 낮아집니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>빈도 페널티</strong> : 너무 자주 등장하는 단어나 구의 생성 확률을 낮춰 페널티를 부과합니다. 매개변수 값이 증가할수록 자주 등장하는 단어나 구에 더 큰 페널티가 부과됩니다. 매개변수 값이 높을수록 이러한 단어의 빈도가 감소하여 텍스트의 어휘 다양성이 증가합니다.이러한 매개변수가 무엇인지 이해가 안 되면 사전 설정을 불러와서 창의적, 균형적, 정밀함의 세 가지 사전 설정 중에서 선택할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":659,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-10-1024x438.png\" alt=\"\" class=\"wp-image-659\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"advanced-features\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#advanced-features\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#advanced-features\"></a>고급 기능</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>메모리</strong> : 이 기능을 활성화하면 의도 분류기에 대한 각 입력에 대화의 채팅 기록이 포함되어 LLM이 맥락을 이해하고 대화형 대화에서 질문 이해도를 향상시키는 데 도움이 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>메모리 창</strong> : 메모리 창이 닫히면 시스템은 모델의 컨텍스트 창에 따라 전달되는 채팅 기록의 양을 동적으로 필터링합니다. 창이 열려 있으면 사용자는 전달되는 채팅 기록의 양(숫자 기준)을 정확하게 제어할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>실패 시 재시도</strong> : 노드에서 발생하는 일부 예외의 경우, 일반적으로 노드를 다시 재시도하는 것으로 충분합니다. 오류 재시도 기능이 활성화되어 있으면 오류 발생 시 노드는 미리 설정된 전략에 따라 자동으로 재시도합니다. 최대 재시도 횟수와 각 재시도 간격을 조정하여 재시도 전략을 설정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>최대 재시도 횟수는 10회입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>최대 재시도 간격은 5000ms입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":660,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-11-1024x918.png\" alt=\"\" class=\"wp-image-660\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>오류 처리</strong> : 현재 노드에 장애가 발생했을 때 메인 프로세스를 중단시키지 않고 오류 메시지를 표시하거나, 백업 경로를 통해 작업을 계속 진행할 수 있는 다양한 노드 오류 처리 전략을 제공합니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>구조화된 출력</strong> : LLM이 사용 가능하고 안정적이며 예측 가능한 형식으로 데이터를 반환하도록 보장하여 사용자가 LLM 노드가 데이터를 반환하는 방식을 정확하게 제어할 수 있도록 돕습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"></ol>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"use-cases\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#use-cases\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/llm#use-cases\"></a>사용 사례</h4>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>지식 기반 콘텐츠 읽기</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>지능형 고객 서비스 애플리케이션을 구축하는 것과 같이 워크플로 애플리케이션이 ” 지식 기반 ” 콘텐츠를 읽을 수 있도록 하려면 다음 단계를 따르세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>LLM 노드 상류에 지식 기반 검색 노드를 추가합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>지식 검색 노드의 <strong>출력 변수를</strong> LLM 노드의 <strong>컨텍스트 변수</strong> 에 채웁니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM이 지식 기반 내의 텍스트를 읽을 수 있는 기능을 제공하려면 애플리케이션 프롬프트에&nbsp;<strong>컨텍스트 변수를</strong>&nbsp;삽입합니다 .</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":661,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-12-1024x468.png\" alt=\"\" class=\"wp-image-661\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>지식 검색 노드의 가변 출력에는 세분화된 참조 정보도 포함됩니다. <strong>인용 및 귀속</strong> 기능을 통해 정보 출처를 확인할 수 있습니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>업스트림 노드의 일반 변수도 컨텍스트 변수에 채워질 수 있습니다. 예를 들어 시작 노드의 문자열 유형 변수가 있지만,&nbsp;<strong>인용 및 귀속</strong>&nbsp;기능은 효과가 없습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>문서 파일 읽기</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>ChatPDF 애플리케이션을 구축하는 등 워크플로 애플리케이션에서 문서 내용을 읽을 수 있도록 하려면 다음 단계를 따르세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>“시작” 노드에 파일 변수를 추가합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM 노드의 상류에 문서 추출 노드를 추가하고 파일 변수를 입력 변수로 사용합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM 노드의 프롬프트에 문서 추출기 노드의 <strong>출력 변수를</strong> 입력합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":662,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-13-1024x440.png\" alt=\"\" class=\"wp-image-662\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>오류 처리</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>LLM 노드는 정보를 처리할 때 입력 텍스트가 토큰 제한을 초과하거나 키 매개변수가 누락되는 등의 오류가 발생할 수 있습니다. 개발자는 다음 단계에 따라 예외 분기를 구성하여 노드 오류 발생 시 전체 흐름이 중단되지 않도록 비상 계획을 실행할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>LLM 노드에서 “오류 처리”를 활성화합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>오류 처리 전략 선택 및 구성</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":663,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/08/image-14-1024x946.png\" alt=\"\" class=\"wp-image-663\"/></figure>\n<!-- /wp:image -->','4. Node - LLM ','','publish','open','closed','','node-answer%eb%8b%b5%eb%b3%80','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(40,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>이 매뉴얼은 공식 문서 사이트(<a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https://docs.openwebui.com/getting-started/updating/\">https://docs.openwebui.com/getting-started/updating/</a>)를 참조하여 작성되었으며, Docker를 사용하여 설치된 Open WebUI를 안전하게 최신 버전으로 업데이트하는 방법을 안내합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>업데이트를 진행하기 전에 데이터 손실을 방지하기 위해 <strong>반드시 볼륨(volume)을 사용하여 데이터가 영구적으로 저장되도록 설정</strong>되어 있는지 확인해야 합니다. 일반적으로 <code>docker run</code> 명령어에 <code>-v open-webui:/app/backend/data</code>와 같은 옵션이 포함되어 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">1. 수동 업데이트 (Manual Update)</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>가장 기본적인 방법으로, 직접 명령어를 입력하여 Open WebUI 컨테이너를 업데이트합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1단계: 최신 Docker 이미지 가져오기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>먼저, 최신 버전의 Open WebUI 이미지를 Docker Hub에서 가져옵니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker pull ghcr.io/open-webui/open-webui:main\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>만약 CUDA 지원 버전을 사용하고 있다면 다음 명령어를 사용하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker pull ghcr.io/open-webui/open-webui:cuda\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>2단계: 기존 컨테이너 중지 및 삭제</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>현재 실행 중인 Open WebUI 컨테이너를 중지하고 삭제합니다. 컨테이너 이름이 <code>open-webui</code>가 아닌 경우, 실제 사용하는 이름으로 변경해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker stop open-webui\ndocker rm open-webui\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>참고:</strong> 이 과정에서 컨테이너는 삭제되지만, <code>-v</code> 옵션으로 연결된 볼륨에 저장된 데이터는 삭제되지 않으므로 채팅 기록이나 설정은 안전하게 보존됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>3단계: 새로운 버전의 컨테이너 실행</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>최신 이미지로 새로운 컨테이너를 실행합니다. 이 때, <strong>최초에 Open WebUI를 설치할 때 사용했던 <code>docker run</code> 명령어와 동일한 옵션을 사용</strong>해야 합니다. 특히, 볼륨 마운트(<code>-v</code>)와 포트 설정(<code>-p</code>)이 중요합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>기본 예시:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>CUDA 지원 버전 예시:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker run -d -p 3000:8080 --gpus all -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:cuda\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이제 새로운 버전의 Open WebUI가 실행됩니다. 웹 브라우저를 통해 접속하여 업데이트가 완료되었는지 확인합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\">2. Watchtower를 이용한 업데이트</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Watchtower는 실행 중인 Docker 컨테이너의 이미지를 모니터링하고, 새로운 버전이 릴리즈되면 자동으로 컨테이너를 업데이트해주는 유용한 도구입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>일회성 수동 업데이트</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Watchtower를 사용하여 한 번만 업데이트를 실행하려면 다음 명령어를 사용합니다. 이 명령어는 <code>open-webui</code>라는 이름의 컨테이너를 찾아 최신 이미지로 업데이트합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once open-webui\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>자동 업데이트 설정</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Watchtower 컨테이너를 계속 실행시켜 두면, 주기적으로 Open WebUI의 업데이트를 확인하고 자동으로 적용하게 할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음 명령어는 300초(5분)마다 업데이트를 확인하도록 Watchtower 컨테이너를 백그라운드에서 실행합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker run -d --name watchtower \\\n  -v /var/run/docker.sock:/var/run/docker.sock \\\n  containrrr/watchtower -i 300 open-webui\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><code>docker-compose.yml</code> 파일을 사용하고 있다면, <code>services</code> 섹션에 Watchtower를 추가하여 자동 업데이트를 설정할 수도 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>version: \'3\'\nservices:\n  open-webui:\n    image: ghcr.io/open-webui/open-webui:main\n    container_name: open-webui\n    ports:\n      - \"3000:8080\"\n    volumes:\n      - open-webui:/app/backend/data\n    restart: unless-stopped\n\n  watchtower:\n    image: containrrr/watchtower\n    container_name: watchtower\n    volumes:\n      - /var/run/docker.sock:/var/run/docker.sock\n    command: --interval 300 open-webui # 300초마다 open-webui 컨테이너를 감시\n    restart: unless-stopped</code></pre>\n<!-- /wp:code -->','Open WebUI 업데이트 매뉴얼','','publish','open','closed','','open-webui-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8-%eb%a7%a4%eb%89%b4%ec%96%bc','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(41,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>이 매뉴얼은 Dify의 공식 GitHub 릴리스 노트를 참조하여 Docker Compose로 설치된 Dify를 최신 버전으로 안전하게 업그레이드하는 방법을 안내합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>업그레이드 작업은 몇 가지 간단한 명령어로 이루어지며, 기존에 사용하던 데이터(앱, 문서, 채팅 기록 등)는 보존됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>업그레이드 전 준비사항</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>터미널(Terminal) 또는 명령 프롬프트(Command Prompt)</strong>: 서버에 접속하여 명령어를 실행할 수 있는 환경이 필요합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Dify 설치 폴더</strong>: <code>git clone</code>으로 Dify를 처음 설치했던 폴더의 위치를 알아야 합니다. 일반적으로 폴더 이름은 <code>dify</code> 입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>업그레이드 절차 (단계별 안내)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>아래의 절차를 순서대로 따라 진행하세요. 모든 명령어는 Dify가 설치된 서버의 터미널에서 실행해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1단계: Dify 작업 폴더로 이동</strong> 및 docker-compose.yaml 백업</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>먼저, Dify의 <code>docker</code> 폴더로 이동합니다. 이 폴더에는 <code>docker-compose.yaml</code>  (dify를 설치하기 위한 docker 셋업 스크립트) 설정 파일이 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code># Dify를 클론한 최상위 폴더로 이동합니다.\ncd dify\n\n# docker 폴더로 들어갑니다.\ncd docker\ncp docker-compose.yaml docker-compose.yaml.$(date +%s).bak</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>2단계: 최신 버전 코드 가져오기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Git을 사용하여 GitHub 저장소에서 최신 버전의 Dify 코드를 로컬 컴퓨터로 가져옵니다. <code>docker-compose.yaml</code> 파일의 변경 사항을 포함한 최신 설정이 업데이트됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>git checkout main\ngit pull origin main\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>3단계: 현재 실행 중인 Dify 서비스 중지</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>업그레이드를 위해 현재 실행되고 있는 모든 Dify 관련 Docker 컨테이너를 안전하게 중지합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker compose down</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>참고:</strong> 이 명령은 컨테이너를 중지하고 제거하지만, 연결된 볼륨에 저장된 데이터는 삭제되지 않으므로 안전합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>4단계: </strong>데이타 백업</h4>\n<!-- /wp:heading -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo tar -cvf volumes-$(date +%s).tgz volumes</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>5단계: Dify 재시작</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>이제 최신 버전의 설정과 이미지로 Dify 서비스를 다시 시작합니다. <code>-d</code> 옵션은 컨테이너를 백그라운드에서 실행하도록 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker compose up -d</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>업그레이드 완료 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>모든 컨테이너가 정상적으로 실행되면 업그레이드 절차가 완료된 것입니다. 웹 브라우저를 열어 Dify에 접속한 후, 새로운 기능이나 변경 사항이 적용되었는지 확인해 보세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>문제가 발생할 경우, <code>docker compose logs -f</code> 명령어를 실행하여 실시간 로그를 확인하면 원인을 파악하는 데 도움이 될 수 있습니다.</p>\n<!-- /wp:paragraph -->','Dify 업그레이드 매뉴얼','','publish','open','closed','','dify-%ec%97%85%ea%b7%b8%eb%a0%88%ec%9d%b4%eb%93%9c-%eb%a7%a4%eb%89%b4%ec%96%bc','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(42,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>WordPress 플랫폼은 유지 관리 및 안정성 구현을 포함하여 사소한 업데이트가 있을 때마다 웹사이트를 자동으로 업데이트합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>WordPress 데이터베이스를 업데이트하지 않으면 기술 및 운영 오류로 인해 웹사이트 기능이 손상될 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>즉각적인 업데이트가 필요한 플러그인과 테마를 파악하려면 모든 플러그인과 테마를 정기적으로 확인하는 것이 중요합니다. 늦게 업데이트하면 웹사이트 기능이 동기화되기 어려워져 잠재적 충돌 위험이 높아집니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>업데이트하기 전에 테스트를 실행하고 업데이트된 버전이 웹사이트에 문제를 일으키지 않는지 확인하십시오.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>플러그인 및 테마 업데이트를 수행하려면 해당 페이지로 이동하십시오.&nbsp;<strong>업데이트</strong>&nbsp;메뉴 위에 마우스를 올리면&nbsp;<strong>계기판</strong>.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>업데이트 화면으로 이동합니다. 여기에서 최신 버전과 함께 나온 모든 플러그인과 테마를 찾을 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":537,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-1024x817.png\" alt=\"\" class=\"wp-image-537\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>선택&nbsp;<strong>모든&nbsp;선택&nbsp;</strong>한 번에 모두 업데이트하거나 업데이트하려는 특정 플러그인과 테마를 선택하여 하나씩 업데이트합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>그러나 모든 플러그인을 한 번에 업데이트하도록 선택할 때는 많은 리소스를 사용하고 웹사이트 속도가 느려질 수 있으므로 주의하십시오.</p>\n<!-- /wp:paragraph -->','WordPress 테마 및 플러그인을 업데이트하는 방법','','publish','open','closed','','wordpress-%ed%85%8c%eb%a7%88-%eb%b0%8f-%ed%94%8c%eb%9f%ac%ea%b7%b8%ec%9d%b8%ec%9d%84-%ec%97%85%eb%8d%b0%ec%9d%b4%ed%8a%b8%ed%95%98%eb%8a%94-%eb%b0%a9%eb%b2%95','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(43,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>처음으로 Dify를 사용하는 경우&nbsp;<br><strong>설정 —&gt; 모델 제공자</strong>&nbsp;로 이동하여 사용할 LLM을 추가하고 구성해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":547,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-1-1024x607.png\" alt=\"\" class=\"wp-image-547\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>ollama 모델을 설치하려면, 설정 -&gt; 모델제공자 -&gt; Ollama 선택하여 다음 화면과 같이 추가합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":549,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-3-1024x691.png\" alt=\"\" class=\"wp-image-549\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>기본 모델을 설정하기 위해서는 설정->모델제공자->시스템 모델 설정 선택 후 다음 화면에서 선택한 후 저장하십시오</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":550,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-4-1024x599.png\" alt=\"\" class=\"wp-image-550\"/></figure>\n<!-- /wp:image -->','dify 내  언어모델 설정방법','','publish','open','closed','','dify-%eb%82%b4-%ec%96%b8%ec%96%b4%eb%aa%a8%eb%8d%b8-%ec%84%a4%ec%a0%95%eb%b0%a9%eb%b2%95','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(44,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>Chatflow 프로세스에서 답변 내용 정의. 텍스트 편집기에서는 답변 형식을 유연하게 설정할 수 있습니다. 여기에는 고정된 텍스트 블록을 작성하거나, 이전 단계의 출력 변수를 답변 내용으로 활용하거나, 사용자 지정 텍스트를 변수와 병합하여 응답을 생성하는 것이 포함됩니다.답변 노드는 언제든지 원활하게 통합되어 대화 응답에 동적으로 콘텐츠를 전달할 수 있습니다. 이 설정은 실시간 편집 구성 모드를 지원하여 텍스트와 이미지 콘텐츠를 함께 정렬할 수 있습니다. 구성은 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>언어 모델(LLM) 노드에서 답변 내용을 출력합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>생성된 이미지 출력.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>일반 텍스트를 출력합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>예제 1: 일반 텍스트를 출력합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":635,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-5-1024x509.png\" alt=\"\" class=\"wp-image-635\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>예시 2: 출력 이미지와 LLM 응답.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":637,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-6-1024x253.png\" alt=\"\" class=\"wp-image-637\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":638,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-7-463x1024.png\" alt=\"\" class=\"wp-image-638\"/></figure>\n<!-- /wp:image -->','3. Node - Answer(답변)','','publish','open','closed','','node-answer%eb%8b%b5%eb%b3%80-2','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(45,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>지식 기반 검색 노드는 Dify 지식 기반에서 사용자 질문과 관련된 텍스트 콘텐츠를 검색하도록 설계되었으며, 이는 대규모 언어 모델(LLM)에서 후속 답변의 컨텍스트로 사용될 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":641,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-8-1024x303.png\" alt=\"\" class=\"wp-image-641\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>지식 기반 검색 노드 구성에는 4가지 주요 단계가 포함됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong> 쿼리 변수 선택</strong></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>쿼리를 위한 지식 기반 선택</strong></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>메타데이터 필터링 적용</strong></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>검색 전략 구성</strong></li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>쿼리 변수 선택</strong>지식 기반 검색 시나리오에서 쿼리 변수는 일반적으로 사용자의 입력 질문을 나타냅니다. 대화형 애플리케이션의 “시작” 노드에서 시스템은 “sys.query”를 사용자 입력 변수로 미리 설정합니다. 이 변수는 사용자 질문과 가장 밀접한 관련이 있는 텍스트 청크를 지식 기반에서 쿼리하는 데 사용할 수 있습니다. 지식 기반에 전송되는 최대 쿼리 내용은 200자입니다.<strong>쿼리를 위한 지식 기반 선택</strong>지식 기반 검색 노드 내에서 Dify의 기존 지식 기반을 추가할 수 있습니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>메타데이터 필터링 적용메타데이터 필터링을</strong> 사용하여 지식 기반에서 문서 검색을 세부적으로 조정할 수 있습니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>검색 전략 구성</strong>노드 내 개별 지식 베이스의 인덱싱 전략 및 검색 모드를 수정할 수 있습니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":644,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-9-1024x698.png\" alt=\"\" class=\"wp-image-644\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>Dify는 다양한 지식 기반 검색 시나리오에 대해 “N-to-1 Recall”과 “Multi-way Recall”이라는 두 가지 회수 전략을 제공합니다. N-to-1 모드에서는 지식 기반 쿼리가 함수 호출을 통해 실행되므로 시스템 추론 모델을 선택해야 합니다. Multi-way Recall 모드에서는 결과 재순위 지정을 위해 Rerank 모델을 구성해야 합니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":645,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-10-1024x610.png\" alt=\"\" class=\"wp-image-645\"/></figure>\n<!-- /wp:image -->','5. Node - 지식 검색','','publish','open','closed','','node-%ec%a7%80%ec%8b%9d-%ea%b2%80%ec%83%89','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(46,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"1-definition\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#1-definition\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#1-definition\"></a>1. 정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>분류 설명을 정의함으로써 질문 분류기는 사용자 입력을 해당 범주에 추론하고 일치시켜 분류 결과를 출력할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"2-scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#2-scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#2-scenarios\"></a>2. 시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>일반적인 사용 사례로는 <strong>고객 서비스 대화 의도 분류, 제품 리뷰 분류, 대량 이메일 분류 등이</strong> 있습니다 .일반적인 제품 고객 서비스 Q&amp;A 시나리오에서 질문 분류기는 지식 기반 검색 전 예비 단계 역할을 할 수 있습니다. 사용자의 입력 질문을 분류하여 다양한 하위 지식 기반 쿼리로 연결하여 사용자 질문에 정확하게 답변할 수 있도록 합니다.다음 다이어그램은 제품 고객 서비스 시나리오에 대한 워크플로 템플릿의 예입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":666,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-11-1024x383.png\" alt=\"\" class=\"wp-image-666\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>이 시나리오에서는 세 가지 분류 라벨/설명을 설정합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>카테고리 1:&nbsp;<strong>애프터서비스 관련 질문</strong></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>카테고리 2:&nbsp;<strong>제품 사용 관련 질문</strong></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>카테고리 3:&nbsp;<strong>기타 질문</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>사용자가 다양한 질문을 입력하면 질문 분류기는 설정된 분류 라벨/설명에 따라 자동으로 질문을 분류합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>“&nbsp;<strong>아이폰 14 연락처 설정은 어떻게 하나요?</strong>&nbsp;” —&gt; “&nbsp;<strong>제품 사용 관련 문의</strong>&nbsp;”</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>“&nbsp;<strong>보증 기간은 어떻게 되나요?</strong>&nbsp;” —&gt; “&nbsp;<strong>애프터서비스 관련 문의</strong>&nbsp;”</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>“&nbsp;<strong>오늘 날씨는 어때요?</strong>&nbsp;” —&gt; “&nbsp;<strong>기타 질문</strong>&nbsp;”</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"3-how-to-configure\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#3-how-to-configure\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#3-how-to-configure\"></a>3. 구성 방법</h3>\n<!-- /wp:heading -->\n\n<!-- wp:image {\"id\":667,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-12-1024x597.png\" alt=\"\" class=\"wp-image-667\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 단계:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>입력 변수 선택</strong>&nbsp;: 이는 분류될 콘텐츠를 의미하며, 일반적으로 고객 서비스 Q&amp;A 시나리오에서의 사용자 질문입니다. 예:&nbsp;<code>sys.query</code>.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>추론 모델 선택</strong>&nbsp;: 문제 분류기는 대규모 언어 모델의 자연어 분류 및 추론 기능을 활용합니다. 적절한 모델을 선택하면 분류 효율성을 높일 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>분류 라벨/설명 작성</strong>&nbsp;: 각 카테고리에 대해 키워드나 설명적 문장을 작성하여 여러 분류를 수동으로 추가할 수 있으며, 이를 통해 대규모 언어 모델이 분류 기준을 더 잘 이해하는 데 도움이 됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해당 다운스트림 노드 선택</strong>&nbsp;: 분류 후, 문제 분류 노드는 분류 노드와 다운스트림 노드 간의 관계에 따라 흐름을 다른 경로로 지시할 수 있습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"advanced-settings%3a\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#advanced-settings%3A\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/question-classifier#advanced-settings%3A\"></a>고급 설정:</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>지침</strong>&nbsp;:&nbsp;<strong>고급 설정 – 지침</strong>&nbsp;에서 분류기의 기능을 향상시키기 위해 더 자세한 분류 기준 등의 보충 지침을 추가할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>메모리</strong>&nbsp;: 이 기능을 활성화하면 문제 분류기의 각 입력에 대화의 채팅 기록이 포함되어 LLM이 맥락을 이해하고 대화형 대화에서 질문 이해도를 향상시키는 데 도움이 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>메모리 창</strong>&nbsp;: 메모리 창이 닫히면 시스템은 모델의 컨텍스트 창에 따라 전달되는 채팅 기록의 양을 동적으로 필터링합니다. 창이 열려 있으면 사용자는 전달되는 채팅 기록의 양(숫자 기준)을 정확하게 제어할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>출력 변수</strong>&nbsp;:<code>class_name</code>분류 출력 레이블을 저장합니다. 필요한 경우 다운스트림 노드에서 이 분류 결과를 참조할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','6. Node - 질문 분류기','','publish','open','closed','','node-%ec%a7%88%eb%ac%b8-%eb%b6%84%eb%a5%98%ea%b8%b0','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(47,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"definition\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/ifelse#definition\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/ifelse#definition\"></a>정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>if/else 조건에 따라 워크플로를 두 개의 분기로 나눌 수 있습니다.조건 분기 노드는 세 부분으로 구성됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>IF 조건: 변수를 선택하고, 조건을 설정하고, 조건을 만족하는 값을 지정합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>IF 조건이 True 로 평가되면 IF 경로를 실행합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>조건이 False 로 평가되면 ELSE 경로를 실행합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>ELIF 조건이 True로 평가되면 ELIF 경로를 실행합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>ELIF 조건이 False로 평가되면 다음 ELIF 경로를 계속 평가하거나 최종 ELSE 경로를 실행합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>조건 유형</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Contains</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Not contains</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Starts with</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Ends with</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Is</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Is not</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Is empty</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Is not empty</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"scenario\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/ifelse#scenario\">​</a>시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:image {\"id\":670,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-13-1024x546.png\" alt=\"\" class=\"wp-image-670\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>위의 <strong>텍스트 요약 워크플로를</strong> 예로 들어 보겠습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>IF 조건: 시작 노드에서 <code>summarystyle</code> 조건을 <strong>포함</strong> <code>Technical</code> 으로 변수를 선택합니다 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>IF 조건이 True로 평가되면 지식 검색 노드를 통해 기술 관련 지식을 쿼리하여 IF 경로를 따른 다음 LLM 노드를 통해 응답합니다(다이어그램 상단 절반에 표시됨).</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>조건이 False로 평가되지만, <code>summarystyle</code> 변수를 위한 입력이 Technology를 포함하지 않지만(<strong>does not include</strong>), Science를 포함(include) 하면, 조건이 Ture인 지 확인한 다음 해당 경로 내에 정의된 단계를 실행합니다. </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>ELIF내 조건이 False 이면, 즉 입력 변수에 , Technology도, Science도 포함되지 않는 경우 , 다음 ELF조건을 계속 평가하거나 최종 ELSE 경로를 실행합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>IF 조건이 False 로 평가되면, 즉 <code>summarystyle</code>변수 input <strong>에 <code>technical</code> 를 포함하지 않으면</strong> ELSE 경로를 실행하고 LLM2 노드(다이어그램 하단)를 통해 응답합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->','7. Node - 조건 분기 IF/ELSE','','publish','open','closed','','node-%ec%a1%b0%ea%b1%b4-%eb%b6%84%ea%b8%b0-if-else','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(48,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"introduction\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#introduction\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#introduction\"></a>소개</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>코드 노드는 워크플로 내에서 데이터 변환을 수행하기 위해 Python/NodeJS 코드 실행을 지원합니다. 워크플로를 간소화하고 산술 연산, JSON 변환, 텍스트 처리 등의 시나리오에 적합합니다.이 노드는 개발자의 유연성을 크게 향상시켜 워크플로 내에 사용자 지정 Python 또는 JavaScript 스크립트를 내장하고 사전 설정된 노드로는 불가능한 방식으로 변수를 조작할 수 있도록 합니다. 구성 옵션을 통해 필요한 입력 및 출력 변수를 지정하고 해당 실행 코드를 작성할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":677,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-14-680x1024.png\" alt=\"\" class=\"wp-image-677\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"configuration\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#configuration\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#configuration\"></a>구성</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>코드 노드에서 다른 노드의 변수를 사용해야 하는 경우, 변수 이름을 정의하고 해당 변수를 참조해야 합니다 .<a href=\"https://docs.dify.ai/en/guides/workflow/variables\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"usage-scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#usage-scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#usage-scenarios\"></a>사용 시나리오</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>코드 노드를 사용하면 다음과 같은 일반적인 작업을 수행할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"structured-data-processing\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#structured-data-processing\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#structured-data-processing\"></a>구조화된 데이터 처리</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>워크플로에서는 JSON 문자열 구문 분석, 추출 및 변환과 같은 비정형 데이터 처리를 자주 처리해야 합니다. 대표적인 예로 HTTP 노드에서 데이터를 처리하는 것을 들 수 있습니다. 일반적인 API 반환 구조에서 데이터는 여러 계층의 JSON 객체 내에 중첩될 수 있으며, 특정 필드를 추출해야 합니다. 코드 노드를 사용하면 이러한 작업을 수행할 수 있습니다. 다음은 <code>data.name</code>HTTP 노드에서 반환된 JSON 문자열에서 필드를 추출하는 간단한 예입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>def main(http_response: str) -&gt; dict:\n    import json\n    data = json.loads(http_response)\n    return {\n        # Note to declare \'result\' in the output variables\n        \'result\': data&#91;\'data\']&#91;\'name\'] \n    }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"mathematical-calculations\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#mathematical-calculations\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#mathematical-calculations\"></a>수학적 계산</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>워크플로에서 복잡한 수학 계산을 수행해야 할 때도 코드 노드를 사용할 수 있습니다. 예를 들어, 복잡한 수학 공식을 계산하거나 데이터에 대한 통계 분석을 수행하는 경우입니다. 다음은 배열의 분산을 계산하는 간단한 예입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>def main(x: list) -&gt; dict:\n    return {\n        # Note to declare \'result\' in the output variables\n        \'result\': sum(&#91;(i - sum(x) / len(x)) ** 2 for i in x]) / len(x)\n    }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"data-concatenation\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#data-concatenation\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#data-concatenation\"></a>데이터 연결</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>때로는 여러 지식 검색, 데이터 검색, API 호출 등 여러 데이터 소스를 연결해야 할 수 있습니다. 코드 노드를 사용하면 이러한 데이터 소스를 통합할 수 있습니다. 다음은 두 지식 베이스의 데이터를 병합하는 간단한 예입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>def main(knowledge1: list, knowledge2: list) -&gt; dict:\n    return {\n        # Note to declare \'result\' in the output variables\n        \'result\': knowledge1 + knowledge2\n    }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"local-deployment\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#local-deployment\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#local-deployment\"></a>로컬 배포</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>로컬 배포 사용자인 경우, 악성 코드가 실행되지 않도록 샌드박스 서비스를 시작해야 합니다. 이 서비스를 사용하려면 Docker가 필요합니다.  또한, 다음 <code>docker-compose</code> 방법을 통해 서비스를 직접 시작할 수도 있습니다 </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker-compose -f docker-compose.middleware.yaml up -d\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"security-policies\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#security-policies\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#security-policies\"></a>보안 정책</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Python과 JavaScript 실행 환경은 모두 보안을 위해 엄격하게 격리(샌드박스)되어 있습니다. 즉, 개발자는 파일 시스템에 직접 접근하거나, 네트워크 요청을 하거나, 운영 체제 수준의 명령을 실행하는 등 많은 시스템 리소스를 소모하거나 보안 위험을 초래할 수 있는 함수를 사용할 수 없습니다. 이러한 제한을 통해 과도한 시스템 리소스 소모를 방지하면서 코드의 안전한 실행이 보장됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"advanced-features\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#advanced-features\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#advanced-features\"></a>고급 기능</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>실패 시 재시도</strong>노드에서 발생하는 일부 예외의 경우, 일반적으로 노드를 다시 시도하는 것으로 충분합니다. 오류 재시도 기능이 활성화되어 있으면 오류 발생 시 노드는 미리 설정된 전략에 따라 자동으로 재시도합니다. 최대 재시도 횟수와 각 재시도 간격을 조정하여 재시도 전략을 설정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>최대 재시도 횟수는 10회입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>최대 재시도 간격은 5000ms입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":678,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-15-1024x810.png\" alt=\"\" class=\"wp-image-678\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>오류 처리</strong>정보를 처리할 때 코드 노드에서 코드 실행 예외가 발생할 수 있습니다. 개발자는 다음 단계에 따라 실패 분기를 구성하여 노드에서 예외 발생 시 비상 계획을 실행하고 워크플로 중단을 방지할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>코드 노드에서 “오류 처리”를 활성화합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>오류 처리 전략 선택 및 구성</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":679,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-16-1024x663.png\" alt=\"\" class=\"wp-image-679\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"faq\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#faq\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/code#faq\"></a>자주 묻는 질문</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>왜 코드 노드에 코드를 저장할 수 없나요?</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>코드에 잠재적으로 위험한 동작이 포함되어 있는지 확인하세요. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>def main() -&gt; dict:\n    return {\n        \"result\": open(\"/etc/passwd\").read(),\n    }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이 코드 조각에는 다음과 같은 문제가 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>승인되지 않은 파일 접근:</strong>&nbsp;이 코드는 Unix/Linux 시스템의 중요한 시스템 파일인 “/etc/passwd” 파일을 읽으려고 시도합니다. 이 파일은 사용자 계정 정보를 저장합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>민감한 정보 공개:</strong>&nbsp;“/etc/passwd” 파일에는 사용자 이름, 사용자 ID, 그룹 ID, 홈 디렉터리 경로 등 시스템 사용자에 대한 중요한 정보가 포함되어 있습니다. 직접 액세스하면 정보 유출이 발생할 수 있습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>위험한 코드는 Cloudflare WAF에 의해 자동으로 차단됩니다. 브라우저의 “웹 개발자 도구”에서 “네트워크” 탭을 확인하여 차단 여부를 확인할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":680,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-17-1024x256.png\" alt=\"\" class=\"wp-image-680\"/></figure>\n<!-- /wp:image -->','8. Node - 코드 실행','','publish','open','closed','','node-%ec%bd%94%eb%93%9c-%ec%8b%a4%ed%96%89','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(49,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>템플릿을 사용하면 Python용 강력한 템플릿 구문인 Jinja2를 사용하여 이전 노드의 변수를 동적으로 서식 지정하고 결합하여 단일 텍스트 기반 출력으로 만들 수 있습니다. 여러 소스의 데이터를 후속 노드에 필요한 특정 구조로 결합하는 데 유용합니다. 아래의 간단한 예시는 다양한 이전 출력을 조합하여 기사를 구성하는 방법을 보여줍니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":683,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-18-703x1024.png\" alt=\"\" class=\"wp-image-683\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>단순한 사용 사례 외에도 Jinja의 다양한 작업에 대한 설명서 에 따라 더욱 복잡한 템플릿을 만들 수 있습니다 . 지식 검색 노드에서 검색된 청크와 관련 메타데이터를 형식화된 마크다운으로 구조화하는 템플릿은 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>{% for item in chunks %}\n### Chunk {{ loop.index }}. \n### Similarity: {{ item.metadata.score | default(\'N/A\') }}\n\n#### {{ item.title }}\n\n##### Content\n{{ item.content | replace(\'\\n\', \'\\n\\n\') }}\n\n---\n{% endfor %}\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":684,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-19-1024x417.png\" alt=\"\" class=\"wp-image-684\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>이 템플릿 노드는 LLM 응답이 시작되기 전에 Chatflow 내에서 최종 사용자에게 중간 출력을 반환하는 데 사용될 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>Chatflow의 노드&nbsp;<code>Answer</code>는 비종단형입니다. 흐름 내 여러 지점에서 응답을 출력하기 위해 어디에나 삽입할 수 있습니다.</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:paragraph -->\n<p>예: HTML 양식 렌더링 지원:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>&lt;form data-format=\"json\"&gt; // Default to text\n  &lt;label for=\"username\"&gt;Username:&lt;/label&gt;\n  &lt;input type=\"text\" name=\"username\" /&gt;\n  &lt;label for=\"password\"&gt;Password:&lt;/label&gt;\n  &lt;input type=\"password\" name=\"password\" /&gt;\n  &lt;label for=\"content\"&gt;Content:&lt;/label&gt;\n  &lt;textarea name=\"content\"&gt;&lt;/textarea&gt;\n  &lt;label for=\"date\"&gt;Date:&lt;/label&gt;\n  &lt;input type=\"date\" name=\"date\" /&gt;\n  &lt;label for=\"time\"&gt;Time:&lt;/label&gt;\n  &lt;input type=\"time\" name=\"time\" /&gt;\n  &lt;label for=\"datetime\"&gt;Datetime:&lt;/label&gt;\n  &lt;input type=\"datetime\" name=\"datetime\" /&gt;\n  &lt;label for=\"select\"&gt;Select:&lt;/label&gt;\n  &lt;input type=\"select\" name=\"select\" data-options=\'&#91;\"hello\",\"world\"]\'/&gt;\n  &lt;input type=\"checkbox\" name=\"check\" data-tip=\"By checking this means you agreed\"/&gt;\n  &lt;button data-size=\"small\" data-variant=\"primary\"&gt;Login&lt;/button&gt;\n&lt;/form&gt;\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:image {\"id\":685,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-20-518x1024.png\" alt=\"\" class=\"wp-image-685\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','9. Node - 템플릿(Template)','','publish','open','closed','','node-%ed%85%9c%ed%94%8c%eb%a6%bftemplate','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(50,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"definition\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#definition\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#definition\"></a>정의</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>LLM은 문서 내용을 직접 읽거나 해석할 수 없습니다. 따라서 문서 추출 노드를 통해 사용자가 업로드한 문서의 정보를 구문 분석하고 읽어서 텍스트로 변환한 후, LLM에 전달하여 파일 내용을 처리해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"application-scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#application-scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#application-scenarios\"></a>응용 프로그램 시나리오</h4>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>ChatPDF나 ChatWord와 같이 파일과 상호 작용할 수 있는 LLM 애플리케이션을 구축합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>사용자가 업로드한 파일의 내용을 분석하고 조사합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"node-functionality\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#node-functionality\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#node-functionality\"></a>노드 기능</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>문서 추출 노드는 정보 처리 센터로 이해될 수 있습니다. 입력 변수의 파일을 인식하고 읽고, 정보를 추출하여 다운스트림 노드가 호출할 수 있도록 문자열 유형의 출력 변수로 변환합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":687,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-21-1024x489.png\" alt=\"\" class=\"wp-image-687\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>문서 추출기 노드 구조는 입력 변수와 출력 변수로 구분됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>입력 변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>문서 추출기는 다음과 같은 데이터 구조를 가진 변수만 허용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><code>File</code>, 단일 파일</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>Array[File]</code>, 여러 파일</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>문서 추출기는 TXT, 마크다운, PDF, HTML, DOCX 형식 파일의 내용과 같은 문서 유형 파일에서만 정보를 추출할 수 있습니다. 이미지, 오디오, 비디오 또는 기타 파일 형식은 처리할 수 없습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>출력 변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력 변수는 고정되어 있으며 텍스트라는 이름이 지정됩니다. 출력 변수의 유형은 입력 변수에 따라 달라집니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>입력 변수가 이면 <code>File</code>출력 변수는 <code>string</code></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>입력 변수가 이면 <code>Array[File]</code>출력 변수는 <code>array[string]</code></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>배열 변수는 일반적으로 목록 연산 노드와 함께 사용해야 합니다. </p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"configuration-example\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#configuration-example\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/doc-extractor#configuration-example\"></a>구성 예</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>일반적인 파일 상호작용 Q&amp;A 시나리오에서 문서 추출기는 LLM 노드의 예비 단계 역할을 하여 애플리케이션에서 파일 정보를 추출하고 이를 다운스트림 LLM 노드로 전달하여 파일과 관련된 사용자 질문에 답할 수 있습니다.이 섹션에서는 일반적인 ChatPDF 예제 워크플로 템플릿을 통해 문서 추출 노드의 사용법을 소개합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":689,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-22-1024x489.png\" alt=\"\" class=\"wp-image-689\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 프로세스:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>애플리케이션의 파일 업로드를 활성화합니다. “시작” 노드에 <strong>파일 변수 하나를</strong> 추가하고 이름을 pdf 로 지정합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>문서 추출기 노드를 추가하고 <code>pdf</code> 입력 변수에서 변수를 선택합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM 노드를 추가하고 시스템 프롬프트에서 문서 추출기 노드의 출력 변수를 선택하세요. LLM은 이 출력 변수를 통해 파일의 내용을 읽을 수 있습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":690,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-23-1024x489.png\" alt=\"\" class=\"wp-image-690\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>끝 노드에서 LLM 노드의 출력 변수를 선택하여 끝 노드를 구성합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":691,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-24-1024x568.png\" alt=\"\" class=\"wp-image-691\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>구성 후, 애플리케이션에는 파일 업로드 기능이 추가되어 사용자가 PDF 파일을 업로드하고 대화에 참여할 수 있습니다.</p>\n<!-- /wp:paragraph -->','10. Node - 문서 추출기','','publish','open','closed','','node-%eb%ac%b8%ec%84%9c-%ec%b6%94%ec%b6%9c%ea%b8%b0','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(51,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>파일 리스트 변수는 문서 파일, 이미지, 오디오, 비디오 파일 등 여러 파일 유형을 동시에 업로드할 수 있도록 지원합니다. 애플리케이션 사용자가 파일을 업로드하면 모든 파일이 동일한 <code>Array[File]</code>배열 유형 변수 에 저장되므로 <strong>이후 개별 파일 처리에 적합하지 않습니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:quote -->\n<blockquote class=\"wp-block-quote\"><!-- wp:paragraph -->\n<p>데이터&nbsp;<code>Array</code>유형은 변수의 실제 값이 [1.mp3, 2.png, 3.doc]일 수 있음을 의미합니다. LLM은 이미지 파일이나 텍스트 콘텐츠와 같은 단일 값만 입력 변수로 읽을 수 있으며, 배열 변수를 직접 읽을 수는 없습니다.</p>\n<!-- /wp:paragraph --></blockquote>\n<!-- /wp:quote -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"node-functionality\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/list-operator#node-functionality\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/list-operator#node-functionality\"></a>노드 기능</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>목록 연산자는 파일 형식 유형, 파일 이름, 크기와 같은 속성을 필터링하고 추출하여 다양한 형식의 파일을 해당 처리 노드에 전달하여 다양한 파일 처리 흐름을 정밀하게 제어할 수 있습니다.예를 들어, 사용자가 문서 파일과 이미지 파일을 동시에 업로드할 수 있는 애플리케이션에서 서로 다른 파일을 <strong>목록 작업 노드를</strong> 통해 정렬해야 하며 , 서로 다른 파일은 서로 다른 프로세스에 의해 처리되어야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":694,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-25-1024x419.png\" alt=\"\" class=\"wp-image-694\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>리스트 연산 노드는 일반적으로 배열 변수에서 정보를 추출하여, 조건 설정을 통해 하위 노드에서 수용할 수 있는 변수 유형으로 변환하는 데 사용됩니다. 리스트 연산 노드의 구조는 입력 변수, 필터 조건, 정렬, 처음 N개 항목 가져오기, 그리고 출력 변수로 나뉩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":695,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-26-1024x685.png\" alt=\"\" class=\"wp-image-695\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>입력 변수</strong>목록 작업 노드는 다음 데이터 구조를 가진 변수만 허용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>배열[문자열]</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>배열[숫자]</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>배열[파일]</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>필터 조건</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>필터 조건을 추가하여 입력 변수의 배열을 처리합니다. 배열의 조건을 충족하는 모든 배열 변수를 정렬합니다. 이는 변수의 속성을 필터링하는 것으로 이해할 수 있습니다.예: 파일에는 파일 이름, 파일 유형, 파일 크기 등 여러 차원의 속성이 포함될 수 있습니다. 필터 조건을 사용하면 배열 변수에서 특정 파일을 선택하고 추출하기 위한 스크리닝 조건을 설정할 수 있습니다.다음 변수 추출을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>유형: 이미지, 문서, 오디오, 비디오 유형을 포함한 파일 범주</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>크기: 파일 크기</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>이름: 파일 이름</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>url: URL을 통해 애플리케이션 사용자가 업로드한 파일을 참조합니다. 필터링을 위해 전체 URL을 입력할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>확장자: 파일 확장자</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>mime_type:&nbsp;<a href=\"https://datatracker.ietf.org/doc/html/rfc2046\" target=\"_blank\" rel=\"noreferrer noopener\">MIME 유형은</a>&nbsp;파일 콘텐츠 유형을 식별하는 데 사용되는 표준화된 문자열입니다. 예: “text/html”은 HTML 문서를 나타냅니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>transfer_method: 파일 업로드 방법으로 로컬 업로드와 URL 업로드로 구분됨</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>정렬</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>파일 속성에 따른 정렬을 지원하여 입력 변수의 배열을 정렬하는 기능을 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>오름차순(ASC): 기본 정렬 옵션으로, 작은 것부터 큰 것 순으로 정렬합니다. 문자와 텍스트는 알파벳순(A – Z)으로 정렬합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>내림차순(DESC): 큰 것부터 작은 것 순으로 정렬하며, 문자와 텍스트는 알파벳 역순(Z – A)으로 정렬합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 옵션은 종종 출력 변수의 first_record 및 last_record와 함께 사용됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>첫 번째 N개 항목 가져오기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>1~20 사이의 값을 선택할 수 있으며, 이는 배열 변수의 처음 n개 항목을 선택하는 데 사용됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>출력 변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 필터 조건을 충족하는 배열 요소입니다. 필터 조건, 정렬 및 제한 사항은 개별적으로 활성화할 수 있습니다. 동시에 활성화하면 모든 조건을 충족하는 배열 요소가 반환됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>결과: 필터링 결과, 데이터 유형은 배열 변수입니다. 배열에 파일이 하나만 포함된 경우, 출력 변수에는 배열 요소가 하나만 포함됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>first_record: 필터링된 배열의 첫 번째 요소, 즉 result[0]</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>last_record: 필터링된 배열의 마지막 요소, 즉 result[array.length-1].</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"configuration-example\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/list-operator#configuration-example\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/list-operator#configuration-example\"></a>구성 예</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>파일 상호작용 Q&amp;A 시나리오에서 애플리케이션 사용자는 문서 파일이나 이미지 파일을 동시에 업로드할 수 있습니다. LLM은 이미지 파일 인식 기능만 지원하며 문서 파일 읽기 기능은 지원하지 않습니다. 이 경우, 파일 변수 배열을 전처리하고 다양한 파일 유형을 해당 처리 노드로 전송하기 위해 리스트 작업 노드가 필요합니다. 오케스트레이션 단계는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Features(특징) 기능을 활성화 하고 파일 형식에서 “이미지”와 “문서” 유형을 모두 선택하세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>두 개의 목록 작업 노드를 추가하고 “목록 연산자” 조건에서 각각 이미지와 문서 변수를 추출하도록 설정합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>문서 파일 변수를 추출하여 “Doc Extractor” 노드로 전달합니다. 이미지 파일 변수를 추출하여 “LLM” 노드로 전달합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM 노드의 출력 변수를 채워서 마지막에 “답변” 노드를 추가합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":697,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-28-1024x207.png\" alt=\"\" class=\"wp-image-697\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>애플리케이션 사용자가 문서 파일과 이미지를 모두 업로드하면 문서 파일은 자동으로 문서 추출 노드로, 이미지 파일은 자동으로 LLM 노드로 전환되어 혼합된 파일의 공동 처리가 달성됩니다.</p>\n<!-- /wp:paragraph -->','11. Node - 리스트 연산자','','publish','open','closed','','node-%eb%aa%a9%eb%a1%9d-%ec%97%b0%ec%82%b0%ec%9e%90','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(52,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"1-definition\">1. 정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>다운스트림 노드에 대한 통합된 구성을 달성하기 위해 여러 분기의 변수를 단일 변수로 집계합니다.변수 집계 노드는 워크플로의 핵심 노드입니다. 여러 분기의 출력 결과를 통합하여 어떤 분기가 실행되든 통합된 변수를 통해 해당 결과를 참조하고 액세스할 수 있도록 합니다. 이는 여러 분기가 있는 상황에서 특히 유용한데, 여러 분기의 동일한 함수를 갖는 변수들을 단일 출력 변수로 매핑하여 다운스트림 노드에서 반복적인 정의를 방지할 수 있기 때문입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"2-scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-aggregator#2-scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-aggregator#2-scenarios\"></a>2. 시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>변수 집계를 통해 문제 분류나 조건 분기 등의 여러 출력을 단일 출력으로 집계하여 다운스트림 노드에서 사용하고 조작할 수 있으므로 데이터 흐름 관리가 간소화됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>이슈 분류 후 다중 지점 집계</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>변수 집계가 없다면 분류 1과 분류 2의 분기는 서로 다른 지식 기반 검색을 거친 후 하위 LLM과 직접 응답 노드에 대해 반복적인 정의가 필요할 것입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":701,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-29-1024x499.png\" alt=\"\" class=\"wp-image-701\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>변수 집계를 추가하면 두 개의 지식 검색 노드의 출력을 단일 변수로 집계할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":702,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-30-1024x365.png\" alt=\"\" class=\"wp-image-702\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>IF/ELSE 조건 분기 후 다중 분기 집계</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":703,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-31-1024x448.png\" alt=\"\" class=\"wp-image-703\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"3-format-requirements\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-aggregator#3-format-requirements\">​</a>3. 형식 요구 사항</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>변수 집계기는 문자열(&nbsp;<code>String</code>), 숫자(&nbsp;<code>Number</code>), 객체(&nbsp;<code>Object</code>), 배열(&nbsp;<code>Array</code>)을 포함한 다양한 데이터 유형의 집계를 지원합니다.<strong>변수 집계기는 동일한 데이터 유형의 변수만 집계할 수 있습니다</strong>&nbsp;. 변수 집계 노드에 추가된 첫 번째 변수가 해당 데이터 유형이면&nbsp;<code>String</code>, 이후 연결은 자동으로 필터링되어&nbsp;<code>String</code>유형 변수만 추가되도록 허용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>집계 그룹화</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>버전 v0.6.10부터 집계 그룹화가 지원됩니다.집계 그룹화가 활성화되면 변수 집계기는 여러 변수 그룹을 집계할 수 있으며, 각 그룹은 집계에 동일한 데이터 유형을 요구합니다.</p>\n<!-- /wp:paragraph -->','12. Node - 변수 집계기','','publish','open','closed','','node-%eb%b3%80%ec%88%98-%ec%a7%91%ea%b3%84%ea%b8%b0','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(53,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"definition\">정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>변수 할당자 노드는 쓰기 가능한 변수에 값을 할당하는 데 사용됩니다. 현재 지원되는 쓰기 가능한 변수는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>대화 변수 .</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>사용법: 변수 할당자 노드를 통해 워크플로 변수를 대화 변수에 할당하여 임시로 저장할 수 있으며, 이후 대화에서 지속적으로 참조할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":707,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-32-1024x542.png\" alt=\"\" class=\"wp-image-707\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"usage-scenario-examples\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-assigner#usage-scenario-examples\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-assigner#usage-scenario-examples\"></a>사용 시나리오 예</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>변수 할당자 노드를 사용하면 대화 프로세스의 컨텍스트, 대화 상자에 업로드된 파일, 그리고 사용자 선호도 정보를 대화 변수에 기록할 수 있습니다. 이렇게 저장된 변수는 이후 대화에서 참조되어 다양한 처리 흐름을 지시하거나 응답을 작성할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>시나리오 1</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>자동으로 내용을 판단하고 추출하고</strong> , 대화의 내역을 저장하고, 대화 내의 세션 변수 배열을 통해 중요한 사용자 정보를 기록하고, 이 내역 내용을 사용하여 후속 채팅에서 응답을 개인화합니다.예: 대화가 시작된 후, LLM은 사용자 입력 내용에 기억해야 할 사실, 선호도 또는 채팅 기록이 포함되어 있는지 자동으로 판단합니다. 만약 포함되어 있다면, LLM은 먼저 해당 정보를 추출하여 저장한 후, 이를 맥락으로 활용하여 답변합니다. 기억할 새로운 정보가 없다면, LLM은 이전에 기억했던 관련 정보를 바로 활용하여 질문에 답변합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":710,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-33-1024x269.png\" alt=\"\" class=\"wp-image-710\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 프로세스:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>대화 변수 설정:</strong><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>먼저, 사용자 정보, 기본 설정, 채팅 기록을 저장하기 위해 array[object] 유형의 <code>memories</code> 대화 변수 배열을 설정합니다 .</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>기억을 확인하고 추출합니다.</strong><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>LLM을 사용하여 사용자 입력에 기억해야 할 새로운 정보가 포함되어 있는지 여부를 확인하는 조건 분기 노드를 추가합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>새로운 정보가 있으면 상위 분기를 따라가고 LLM 노드를 사용하여 이 정보를 추출합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>새로운 정보가 없다면, 가지를 따라 내려가서 기존의 기억을 직접 사용하여 대답하세요.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>변수 할당/쓰기:</strong><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>상위 분기에서 변수 할당자 노드를 사용하여 새로 추출한 정보를&nbsp;<code>memories</code>배열에 추가합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>이스케이프 함수를 사용하여 LLM에서 출력된 텍스트 문자열을 배열[객체]에 저장하기에 적합한 형식으로 변환합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>변수 판독 및 사용:</strong><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>이후 LLM 노드에서 배열의 내용을&nbsp;<code>memories</code>문자열로 변환하여 LLM 프롬프트에 컨텍스트로 삽입합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>이러한 기억을 활용해 개인화된 응답을 생성하세요.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>위 다이어그램의 노드에 대한 코드는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>문자열을 객체로 이스케이프(탈출: 기존에 정해진 규칙에서 벗어난 문자를 만들 때 사용)합니다. </li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>import json\n\ndef main(arg1: str) -&gt; object:\n    try:\n        # Parse the input JSON string\n        input_data = json.loads(arg1)\n        \n        # Extract the memory object\n        memory = input_data.get(\"memory\", {})\n        \n        # Construct the return object\n        result = {\n            \"facts\": memory.get(\"facts\", &#91;]),\n            \"preferences\": memory.get(\"preferences\", &#91;]),\n            \"memories\": memory.get(\"memories\", &#91;])\n        }\n        \n        return {\n            \"mem\": result\n        }\n    except json.JSONDecodeError:\n        return {\n            \"result\": \"Error: Invalid JSON string\"\n        }\n    except Exception as e:\n        return {\n            \"result\": f\"Error: {str(e)}\"\n        }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>객체를 문자열로 이스케이프합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>import json\n\ndef main(arg1: list) -&gt; str:\n    try:\n        # Assume arg1&#91;0] is the dictionary we need to process\n        context = arg1&#91;0] if arg1 else {}\n        \n        # Construct the memory object\n        memory = {\"memory\": context}\n        \n        # Convert the object to a JSON string\n        json_str = json.dumps(memory, ensure_ascii=False, indent=2)\n        \n        # Wrap the JSON string in &lt;answer&gt; tags\n        result = f\"&lt;answer&gt;{json_str}&lt;/answer&gt;\"\n        \n        return {\n            \"result\": result\n        }\n    except Exception as e:\n        return {\n            \"result\": f\"&lt;answer&gt;Error: {str(e)}&lt;/answer&gt;\"\n        }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>시나리오 2</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>초기 사용자 환경 설정 입력 기록</strong> : 대화 중에 사용자의 언어 환경 설정 입력을 기억하고 이후 채팅에서 응답할 때 이 언어를 계속 사용합니다.예: 채팅 전에 사용자가 <code>language</code>입력란에 “영어”를 지정합니다. 이 언어는 대화 변수에 기록되고, LLM은 응답 시 이 정보를 참조하여 이후 대화에서도 “영어”를 계속 사용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":711,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-34-1024x376.png\" alt=\"\" class=\"wp-image-711\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 가이드:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>대화 변수 설정</strong> : 먼저 대화 변수 language를 설정합니다 . 대화 흐름 시작 부분에 조건 판단 노드를 추가하여 <code>language</code>변수가 비어 있는지 확인합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>변수 쓰기/할당</strong> : 첫 번째 채팅 라운드가 시작될 때 <code>language</code>변수가 비어 있으면 LLM 노드를 사용하여 사용자의 입력 언어를 추출한 다음 변수 할당자 노드를 사용하여 이 언어 유형을 대화 변수 <code>language</code>에 씁니다 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>변수 읽기</strong> : 이후 대화 라운드에서 <code>language</code>변수는 사용자의 언어 선호도를 저장합니다. LLM 노드는 언어 변수를 참조하여 사용자가 선호하는 언어 유형을 사용하여 응답합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>시나리오 3</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>체크리스트 점검 지원</strong> : 대화 변수를 사용하여 대화 내 사용자 입력을 기록하고, 체크리스트의 내용을 업데이트하고, 후속 대화에서 누락된 항목을 확인합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>예: 대화 시작 후, LLM은 사용자에게 채팅 상자에 체크리스트 관련 항목을 입력하도록 요청합니다. 사용자가 체크리스트의 내용을 언급하면 해당 내용이 업데이트되어 대화 변수에 저장됩니다. LLM은 각 대화 라운드가 끝날 때마다 사용자에게 누락된 항목을 계속 보충하도록 알려줍니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":712,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-35-1024x411.png\" alt=\"\" class=\"wp-image-712\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 프로세스:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>대화 변수 설정:</strong> 먼저 대화 변수 ai_checklist를 설정하고 , LLM 내에서 이 변수를 참조하여 검사를 위한 컨텍스트로 사용합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>변수 할당자/작성</strong> : 각 대화 라운드 동안 LLM 노드 내의 <code>ai_checklist </code> 값을 확인하고 사용자 입력과 비교합니다. 사용자가 새로운 정보를 제공하면 체크리스트를 업데이트하고 <code>ai_checklist</code> 변수 할당자 노드를 사용하여 출력 내용을 작성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>변수 읽기:</strong>&nbsp;대화의 각 라운드에서 값을 읽고&nbsp;<code>ai_checklist</code>사용자 입력과 비교하여 체크리스트의 모든 항목이 완료될 때까지 진행합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"using-the-variable-assigner-node\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-assigner#using-the-variable-assigner-node\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-assigner#using-the-variable-assigner-node\"></a>변수 할당자 노드 사용</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><code>+</code>노드 오른쪽의 아이콘을 클릭 하고 <strong>“변수 할당”</strong> 노드를 선택하세요. 대상 변수와 해당 소스 변수를 설정하세요. 이 노드를 사용하면 여러 변수에 동시에 값을 할당할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":713,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-36-1024x668.png\" alt=\"\" class=\"wp-image-713\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>변수 설정:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>변수: 할당할 변수를 선택합니다. 즉, 할당해야 할 대상 대화 변수를 지정합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>변수 설정: 할당할 변수를 선택합니다. 즉, 변환해야 할 소스 변수를 지정합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>위 이미지에 나와 있는 변수 할당 논리는 초기 페이지에서 지정한 사용자의 언어 기본 설정을 <code>Start/language</code>시스템 수준 대화 변수 나<code>language</code> 에 할당합니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"operation-modes-for-specifying-variables\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-assigner#operation-modes-for-specifying-variables\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/variable-assigner#operation-modes-for-specifying-variables\"></a><strong>변수 지정을 위한 작업 모드</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>대상 변수의 데이터 유형에 따라 연산 방식이 결정됩니다. 다음은 다양한 변수 유형에 따른 연산 방식입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>대상 변수 데이터 유형:&nbsp;<code>String</code>&nbsp;•&nbsp;<strong>덮어쓰기</strong>&nbsp;: 대상 변수를 소스 변수로 직접 덮어씁니다.&nbsp;•&nbsp;<strong>지우기</strong>&nbsp;: 선택한 대상 변수의 내용을 지웁니다.&nbsp;•&nbsp;<strong>설정</strong>&nbsp;: 소스 변수 없이 수동으로 값을 지정합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>대상 변수 데이터 유형:&nbsp;<code>Number</code>&nbsp;•&nbsp;<strong>덮어쓰기</strong>&nbsp;: 대상 변수를 소스 변수로 직접 덮어씁니다.&nbsp;•&nbsp;<strong>지우기</strong>&nbsp;: 선택한 대상 변수의 내용을 지웁니다.&nbsp;•&nbsp;<strong>설정</strong>&nbsp;: 소스 변수 없이 수동으로 값을 할당합니다.&nbsp;•&nbsp;<strong>산술</strong>&nbsp;: 대상 변수에 덧셈, 뺄셈, 곱셈 또는 나눗셈을 수행합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>대상 변수 데이터 유형:&nbsp;<code>Object</code>&nbsp;•&nbsp;<strong>덮어쓰기</strong>&nbsp;: 대상 변수를 소스 변수로 직접 덮어씁니다.&nbsp;•&nbsp;<strong>지우기</strong>&nbsp;: 선택한 대상 변수의 내용을 지웁니다.&nbsp;•&nbsp;<strong>설정</strong>&nbsp;: 소스 변수 없이 수동으로 값을 지정합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>대상 변수 데이터 유형:&nbsp;<code>Array</code>&nbsp;•&nbsp;<strong>덮어쓰기</strong>&nbsp;: 대상 변수를 소스 변수로 직접 덮어씁니다.&nbsp;•&nbsp;<strong>지우기</strong>&nbsp;: 선택한 대상 변수의 내용을 지웁니다.&nbsp;•&nbsp;<strong>추가</strong>&nbsp;: 대상 변수의 배열에 새 요소를 추가합니다.&nbsp;•&nbsp;<strong>확장</strong>&nbsp;: 대상 변수에 새 배열을 추가하여 여러 요소를 한 번에 추가합니다.&nbsp;•&nbsp;<strong>제거</strong>&nbsp;: 배열에서 요소를 제거합니다. 첫 번째 위치(First) 또는 마지막 위치(Last)에서 제거하는 옵션이 있으며, 기본값은 “First”입니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->','13. Node - 변수 할당자','','publish','open','closed','','node-%eb%b3%80%ec%88%98-%ed%95%a0%eb%8b%b9%ec%9e%90','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(54,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"definition\">정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>모든 결과가 출력될 때까지 배열 요소에 대해 동일한 작업을 순차적으로 수행하여 작업 배치 프로세서 역할을 합니다. 반복 노드는 일반적으로 배열 변수와 함께 작동합니다.예를 들어, 긴 텍스트 번역을 처리할 때 모든 콘텐츠를 LLM 노드에 직접 입력하면 단일 대화 제한에 도달할 수 있습니다. 이 문제를 해결하기 위해 업스트림 노드는 먼저 긴 텍스트를 여러 개의 청크로 분할한 다음, 반복 노드를 사용하여 일괄 번역을 수행하여 단일 LLM 대화의 메시지 제한을 피합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"functional-description\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#functional-description\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#functional-description\"></a>기능 설명</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>반복 노드를 사용하려면 입력 값을 목록 객체로 포맷해야 합니다. 이 노드는 반복 시작 노드부터 배열 변수의 모든 요소를 순차적으로 처리하며, 각 요소에 동일한 처리 단계를 적용합니다. 각 처리 주기를 반복이라고 하며, 최종 출력으로 마무리됩니다.반복 노드는 <strong>입력 변수</strong> , <strong>반복 워크플로</strong> , <strong>출력 변수라는</strong> 세 가지 핵심 구성 요소로 구성됩니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>입력 변수:</strong> 배열 유형 데이터만 허용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>반복 워크플로:</strong> 반복 노드 내에서 작업 순서를 조정하기 위해 여러 워크플로 노드를 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>출력 변수:</strong> 배열 변수( <code>Array[List]</code>)만 출력합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":716,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-37-1024x605.png\" alt=\"\" class=\"wp-image-716\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#scenarios\"></a>시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"example-1%3a-long-article-iteration-generator\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#example-1%3A-long-article-iteration-generator\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#example-1%3A-long-article-iteration-generator\"></a><strong>예제 1: 긴 기사 반복 생성기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:image {\"id\":717,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-38-1024x491.png\" alt=\"\" class=\"wp-image-717\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>시작 노드</strong>&nbsp;에 스토리 제목과 개요를 입력합니다&nbsp;.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM을 사용하여 사용자 입력으로부터 완전한 콘텐츠를 생성하려면 <strong>부제 및 개요 생성(<strong>Generate Subtitles and Outlines</strong></strong>)<strong> 노드를</strong> 사용하세요 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>부제 및 개요 추출 노드를</strong> 사용하여 전체 콘텐츠를 배열 형식으로 변환합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>반복 노드를</strong> 사용하여 <strong>LLM 노드를</strong> 감싸고 여러 반복을 통해 각 장의 콘텐츠를 생성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>반복 노드 내부에&nbsp;<strong>직접 답변 노드를</strong>&nbsp;추가하여 각 반복 후에 스트리밍 출력을 얻습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>자세한 구성 단계</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>시작 노드</strong>&nbsp;에서 스토리 제목(title)과 개요(outline)를 구성합니다&nbsp;.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":719,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-39-1024x907.png\" alt=\"\" class=\"wp-image-719\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>‘부제 및 개요 생성’ 노드를</strong> 사용하여 스토리 제목과 개요를 완전한 텍스트로 변환합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":720,\"width\":\"840px\",\"height\":\"auto\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-40-432x1024.png\" alt=\"\" class=\"wp-image-720\" style=\"width:840px;height:auto\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list {\"ordered\":true,\"start\":3} -->\n<ol start=\"3\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>‘부제 및 개요 추출’ 노드를</strong> 사용하여 스토리 텍스트를 배열(Array) 구조로 변환합니다. 추출할 매개변수는 <code>sections</code>이고 매개변수 유형은 <code>Array[Object]</code> 입니다 .</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":721,\"width\":\"840px\",\"height\":\"auto\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-41-563x1024.png\" alt=\"\" class=\"wp-image-721\" style=\"width:840px;height:auto\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>매개변수 추출의 효율성은 모델의 추론 능력과 제공된 지침에 따라 달라집니다. 추론 능력이 더 뛰어난 모델을 사용하고&nbsp;<strong>지침</strong>&nbsp;에 예시를 추가하면 매개변수 추출 결과를 개선할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":4} -->\n<ol start=\"4\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>배열 형식의 스토리 개요를 반복 노드의 입력으로 사용하고&nbsp;<strong>LLM 노드를</strong>&nbsp;사용하여 반복 노드 내에서 이를 처리합니다 .</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":722,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-42-1024x674.png\" alt=\"\" class=\"wp-image-722\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>LLM 노드에서 입력 변수 <code>GenerateOverallOutline/output</code> 와 <code>Iteration/item</code> 를 구성합니다</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":723,\"width\":\"813px\",\"height\":\"auto\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-43-448x1024.png\" alt=\"\" class=\"wp-image-723\" style=\"width:813px;height:auto\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":5} -->\n<ol start=\"5\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>반복 노드 내부에 직접 응답 노드를</strong>&nbsp;구성하여&nbsp;각 반복 후 스트리밍 출력을 얻습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":727,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-44-1024x345.png\" alt=\"\" class=\"wp-image-727\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list {\"ordered\":true,\"start\":6} -->\n<ol start=\"6\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>디버깅과 미리보기를 완료합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":728,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-45-1024x499.png\" alt=\"\" class=\"wp-image-728\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"example-2%3a-long-article-iteration-generator-another-arrangement\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#example-2%3A-long-article-iteration-generator-another-arrangement\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#example-2%3A-long-article-iteration-generator-another-arrangement\"></a><strong>예 2: 긴 기사 반복 생성기(또 다른 배열)</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:image {\"id\":731,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-46-1024x499.png\" alt=\"\" class=\"wp-image-731\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>시작 노드</strong>&nbsp;에 스토리 제목과 개요를 입력합니다&nbsp;.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>LLM 노드를</strong>&nbsp;사용하여&nbsp;기사의 하위 제목과 해당 내용을 생성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>코드 노드를</strong>&nbsp;사용하여&nbsp;전체 내용을 배열 형식으로 변환합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>반복 노드를</strong> 사용하여 <strong>LLM 노드를</strong> 감싸고 여러 반복을 통해 각 장의 콘텐츠를 생성합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>템플릿 변환</strong>&nbsp;노드를 사용하여&nbsp;반복 노드의 문자열 배열 출력을 다시 문자열로 변환합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>마지막으로,&nbsp;변환된 문자열을 직접 출력하기 위해&nbsp;<strong>직접 응답 노드를 추가합니다.</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"advanced-feature\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#advanced-feature\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#advanced-feature\"></a>고급 기능</h3>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"parallel-mode\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#parallel-mode\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#parallel-mode\"></a>병렬 모드</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>반복 노드는 병렬 처리를 지원하여 활성화 시 실행 효율성이 향상됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":732,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-47-1024x699.png\" alt=\"\" class=\"wp-image-732\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>아래는 반복 노드에서 병렬 실행과 순차 실행을 비교한 것입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":733,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-48-1024x699.png\" alt=\"\" class=\"wp-image-733\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>병렬 모드는 최대 10개의 동시 반복을 지원합니다. 10개 이상의 작업을 처리할 때 처음 10개 요소는 동시에 실행되고, 나머지 작업은 초기 배치가 완료된 후 처리됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"how-to-convert-an-array-to-text\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#how-to-convert-an-array-to-text\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/iteration#how-to-convert-an-array-to-text\"></a>배열을 텍스트로 변환하는 방법</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>반복 노드의 출력 변수가 배열 형식이므로 직접 출력할 수 없습니다. 간단한 단계를 통해 배열을 다시 텍스트로 변환할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>코드 노드를 사용하여 변환</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":734,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-49-853x1024.png\" alt=\"\" class=\"wp-image-734\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>코드 예:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>def main(articleSections: list):\n    data = articleSections\n    return {\n        \"result\": \"/n\".join(data)\n    }\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p><strong>템플릿 노드를 사용하여 변환</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":735,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-50-731x1024.png\" alt=\"\" class=\"wp-image-735\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>코드 예:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>{{ articleSections | join(\"/n\") }}\n</code></pre>\n<!-- /wp:code -->','14. Node - 반복','','publish','open','closed','','node-%eb%b0%98%eb%b3%b5','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(55,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"1-definition\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/parameter-extractor#1-definition\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/parameter-extractor#1-definition\"></a>1. 정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>LLM을 활용하여 자연어에서 구조화된 매개변수를 추론하고 추출하여 후속 도구 호출이나 HTTP 요청에 사용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify 워크플로는 다양한 <a href=\"https://docs.dify.ai/en/tools\">도구</a> 를 제공하며 , 대부분 구조화된 매개변수를 입력으로 필요로 합니다. 매개변수 추출기는 사용자 자연어를 이러한 도구에서 인식 가능한 매개변수로 변환하여 도구 호출을 용이하게 합니다.워크플로 내의 일부 노드는 특정 데이터 형식을 입력으로 필요로 합니다. 예를 들어, 반복 노드는 배열 형식을 필요로 합니다. 매개변수 추출기를 사용하면 구조화된 매개변수 변환을 편리하게 수행할 수 있습니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"2-scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/parameter-extractor#2-scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/parameter-extractor#2-scenarios\"></a>2. 시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>자연어에서 도구에 필요한 주요 매개변수를 추출하는 작업</strong>&nbsp;(예: 간단한 대화형 Arxiv 논문 검색 애플리케이션 구축)</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 예시에서는 Arxiv 논문 검색 도구가 <strong>논문 저자</strong> 또는 <strong>논문 ID를</strong> 입력 매개변수로 요구합니다. 매개변수 추출기는 “이 논문의 내용은 무엇입니까: 2405.10739″라는 쿼리에서 논문 ID <strong>2405.10739를</strong> 추출 하여 정밀한 쿼리를 위한 도구 매개변수로 사용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":738,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-51-1024x698.png\" alt=\"\" class=\"wp-image-738\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>긴 스토리 반복 생성 애플리케이션에서처럼 텍스트를 구조화된 데이터로 변환하는 것은 </strong>반복 노드 의 사전 단계 역할을 하며 , 텍스트 형식의 챕터 콘텐츠를 배열 형식으로 변환하고, 반복 노드에서 여러 라운드 생성 처리를 용이하게 합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":740,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-52-1024x698.png\" alt=\"\" class=\"wp-image-740\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list {\"ordered\":true,\"start\":3} -->\n<ol start=\"3\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>구조화된 데이터를 추출하고 HTTP 요청을</strong> 사용하여 접근 가능한 모든 URL을 요청할 수 있으며, 외부 검색 결과, 웹훅, 이미지 생성 및 기타 시나리오를 얻는 데 적합합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"3-how-to-configure\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/parameter-extractor#3-how-to-configure\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/parameter-extractor#3-how-to-configure\"></a>3. 구성 방법</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>구성 단계</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>입력 변수를 선택합니다. 일반적으로 매개변수 추출을 위한 변수 입력입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>LLM의 추론 및 구조화된 생성 기능에 의존하는 매개변수 추출기이므로 모델을 선택하세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>수동으로 추가하거나 기존 도구에서 빠르게 가져올</strong>&nbsp;수 있는 추출할 매개변수를 정의합니다&nbsp;.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>복잡한 매개변수를 추출할 때 효과성과 안정성을 개선하는 데 도움이 되는 예를 제공하는 지침을 작성합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>고급 설정추론 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>일부 모델은 두 가지 추론 모드를 지원하여 함수/도구 호출 또는 순수 프롬프트 메서드를 통해 매개변수를 추출하며, 명령어 준수 여부에 따라 차이가 있습니다. 예를 들어, 일부 모델은 함수 호출의 효율성이 낮을 경우 프롬프트 추론에서 더 나은 성능을 보일 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>함수 호출/도구 호출</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>프롬프트</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>메모리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>메모리가 활성화되면 질문 분류기의 각 입력에 대화의 채팅 기록이 포함되어 LLM이 맥락을 이해하고 대화형 대화 중에 질문 이해력을 향상시키는 데 도움이 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>출력 변수</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>추출된 정의된 변수</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>노드 내장 변수</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><code>__is_success Number</code> : 추출 성공 상태, 성공 시 값은 1, 실패 시 값은 0입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><code>__reason String</code> 추출 오류 이유</p>\n<!-- /wp:paragraph -->','15. Node - 매개변수 추출','','publish','open','closed','','node-%eb%a7%a4%ea%b0%9c%eb%b3%80%ec%88%98-%ec%b6%94%ec%b6%9c','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(56,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"definition\">정의</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>HTTP 프로토콜을 통해 서버 요청을 전송할 수 있으며, 외부 데이터 검색, 웹훅, 이미지 생성, 파일 다운로드 등의 시나리오에 적합합니다. 지정된 웹 주소로 맞춤형 HTTP 요청을 전송하여 다양한 외부 서비스와의 상호 연결을 구축할 수 있습니다.이 노드는 일반적인 HTTP 요청 방법을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>GET</strong>&nbsp;: 서버에 특정 리소스를 보내달라고 요청하는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>POST</strong>&nbsp;: 일반적으로 양식을 제출하거나 파일을 업로드하여 서버에 데이터를 제출하는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>HEAD</strong>&nbsp;: GET 요청과 비슷하지만, 서버는 리소스 본문 없이 응답 헤더만 반환합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>PATCH</strong>&nbsp;: 리소스에 부분적인 수정 사항을 적용하는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>PUT</strong>&nbsp;: 서버에 리소스를 업로드하는 데 사용되며, 일반적으로 기존 리소스를 업데이트하거나 새 리소스를 만드는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>DELETE</strong>&nbsp;: 서버에 지정된 리소스를 삭제하도록 요청하는 데 사용됩니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>URL, 요청 헤더, 쿼리 매개변수, 요청 본문 내용, 인증 정보를 포함하여 HTTP 요청의 다양한 측면을 구성할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":743,\"width\":\"837px\",\"height\":\"auto\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-53-469x1024.png\" alt=\"\" class=\"wp-image-743\" style=\"width:837px;height:auto\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"scenarios\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/http-request#scenarios\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/http-request#scenarios\"></a>시나리오</h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>특정 서버로 애플리케이션 상호 작용 콘텐츠 보내기</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 노드의 실용적인 기능 중 하나는 시나리오에 따라 요청의 여러 부분에 변수를 동적으로 삽입할 수 있다는 것입니다. 예를 들어, 고객 피드백 요청을 처리할 때 사용자 이름이나 고객 ID, 피드백 내용 등의 변수를 요청에 임베드하여 자동 응답 메시지를 맞춤 설정하거나 특정 고객 정보를 가져와 관련 리소스를 지정된 서버로 전송할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":744,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-54-1024x330.png\" alt=\"\" class=\"wp-image-744\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>HTTP 요청의 반환 값에는 응답 본문, 상태 코드, 응답 헤더, 파일이 포함됩니다. 특히, 응답에 파일이 포함된 경우, 이 노드는 워크플로의 후속 단계에서 사용할 수 있도록 해당 파일을 자동으로 저장할 수 있습니다. 이러한 설계는 처리 효율성을 향상시킬 뿐만 아니라, 파일이 포함된 응답을 간단하고 직접적으로 처리할 수 있도록 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>파일 보내기</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>HTTP PUT 요청을 사용하여 애플리케이션에서 다른 API 서비스로 파일을 전송할 수 있습니다. 요청 본문에서 <code>binary</code> 내의 파일 변수를 선택할 수 있습니다. 이 방법은 파일 전송, 문서 저장 또는 미디어 처리와 같은 시나리오에서 일반적으로 사용됩니다.예: 문서 관리 애플리케이션을 개발 중이고 사용자가 업로드한 PDF 파일을 타사 서비스로 전송해야 한다고 가정해 보겠습니다. HTTP 요청 노드를 사용하여 파일 변수를 전달할 수 있습니다.구성 예는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":748,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-56-1024x848.png\" alt=\"\" class=\"wp-image-748\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"advanced-features\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/http-request#advanced-features\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/http-request#advanced-features\"></a>고급 기능</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>실패 시 재시도</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>노드에서 발생하는 일부 예외의 경우, 일반적으로 노드를 다시 시도하는 것으로 충분합니다. 오류 재시도 기능이 활성화되어 있으면 오류 발생 시 노드는 미리 설정된 전략에 따라 자동으로 재시도합니다. 최대 재시도 횟수와 각 재시도 간격을 조정하여 재시도 전략을 설정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>최대 재시도 횟수는 10회입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>최대 재시도 간격은 5000ms입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":749,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-57-1024x647.png\" alt=\"\" class=\"wp-image-749\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>오류 처리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>HTTP 노드는 정보를 처리할 때 네트워크 요청 시간 초과나 요청 제한과 같은 예외 상황에 직면할 수 있습니다. 애플리케이션 개발자는 다음 단계에 따라 실패 분기를 구성하여 노드에서 예외 발생 시 비상 계획을 실행하고 워크플로 중단을 방지할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>HTTP 노드에서 “오류 처리”를 활성화합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>오류 처리 전략 선택 및 구성</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":750,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-58-1024x1005.png\" alt=\"\" class=\"wp-image-750\"/></figure>\n<!-- /wp:image -->','16. Node - HTTP 요청 ','','publish','open','closed','','node-http-%ec%9a%94%ec%b2%ad','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(57,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"definition\">정의</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>에이전트 노드는 Dify Chatflow/Workflow의 구성 요소로, 자율적인 도구 호출을 지원합니다. 다양한 에이전트 추론 전략을 통합함으로써 LLM은 런타임에 도구를 동적으로 선택하고 실행하여 다단계 추론을 수행할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"configuration-steps\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#configuration-steps\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#configuration-steps\"></a>구성 단계</h2>\n<!-- /wp:heading -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"add-the-node\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#add-the-node\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#add-the-node\"></a>노드 추가</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Dify Chatflow/Workflow 편집기에서 구성 요소 패널에서 에이전트 노드를 캔버스로 끌어다 놓습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":753,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-59-1024x800.png\" alt=\"\" class=\"wp-image-753\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"select-an-agent-strategy\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#select-an-agent-strategy\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#select-an-agent-strategy\"></a>에이전트 전략 선택</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>노드 구성 패널에서 에이전트 전략을 클릭합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":754,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-60-1024x905.png\" alt=\"\" class=\"wp-image-754\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>드롭다운 메뉴에서 원하는 에이전트 추론 전략을 선택하세요. </strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Dify는 함수 호출(Function Calling)과 ReAct(ReAct)라는</strong> 두 가지 기본 전략을 제공하며, <strong>마켓플레이스 → 에이전트 전략(Agent Strategies) 카테고리</strong> 에서 설치할 수 있습니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":755,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-61-1024x376.png\" alt=\"\" class=\"wp-image-755\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"1-function-calling\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#1-function-calling\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#1-function-calling\"></a>1. 함수 호출</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>함수 호출은 사용자 명령을 미리 정의된 함수 또는 도구에 매핑합니다. LLM은 먼저 사용자 의도를 파악한 후, 호출할 함수를 결정하고 필요한 매개변수를 추출합니다. 핵심 메커니즘은 외부 함수 또는 도구를 명시적으로 호출하는 것입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>장점:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:group {\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group\"><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>정밀도:</strong> 명확하게 정의된 작업의 경우 복잡한 추론이 필요 없이 해당 도구를 직접 호출할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>외부 기능 통합이 더 쉬워졌습니다.</strong> 다양한 외부 API나 도구를 모델에서 호출할 수 있는 함수로 래핑할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>구조화된 출력:</strong> 모델은 함수 호출에 대한 구조화된 정보를 출력하여 다운스트림 노드의 처리를 용이하게 합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":756,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-62-977x1024.png\" alt=\"\" class=\"wp-image-756\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\" id=\"2-react-reason-%2b-act\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#2-react-reason-%2B-act\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#2-react-reason-%2B-act\"></a>2. ReAct (추론 + 행동)</h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>ReAct는 에이전트가 추론과 실행을 번갈아 수행할 수 있도록 합니다. LLM은 먼저 현재 상태와 목표를 고려한 후 적절한 도구를 선택하고 호출합니다. 도구의 출력은 LLM의 다음 추론 및 실행 단계를 알려줍니다. 이러한 순환은 문제가 해결될 때까지 계속됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>장점:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>효과적인 외부 정보 활용:</strong> 외부 도구를 활용하여 모델만으로는 달성할 수 없는 정보를 검색하고 작업을 처리할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>설명 가능성 향상:</strong> 추론과 행동이 서로 얽혀 있기 때문에 에이전트의 사고 과정에서 일정 수준의 추적 가능성이 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>폭넓은 적용성:</strong> Q&amp;A, 정보 검색, 작업 실행 등 외부 지식이 필요하거나 특정 작업을 수행해야 하는 시나리오에 적합합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":757,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-63-977x1024.png\" alt=\"\" class=\"wp-image-757\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>개발자는 에이전트 전략 플러그인을 공개 저장소 에 제공할 수 있습니다 . 검토 후, 해당 플러그인은 마켓플레이스에 등록되어 다른 개발자들이 설치할 수 있도록 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"configure-node-parameters\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#configure-node-parameters\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#configure-node-parameters\"></a>노드 매개변수 구성</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>에이전트 전략을 선택하면 구성 패널에 관련 옵션이 표시됩니다. Dify와 함께 제공되는 함수 호출 및 ReAct 전략의 경우, 사용 가능한 구성 항목은 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>모델:</strong>&nbsp;에이전트를 구동하는 대규모 언어 모델을 선택합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>도구 목록:</strong>&nbsp;도구 사용 방식은 에이전트 전략에 따라 정의됩니다. 에이전트가 호출할 수 있는 도구를 추가하고 구성하려면 +를 클릭하세요.<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>검색: 드롭다운에서 설치된 도구 플러그인을 선택합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>승인: 도구를 활성화하기 위해 API 키와 기타 자격 증명을 제공합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>도구 설명 및 매개변수 설정: LLM이 도구를 언제, 왜 사용해야 하는지 이해하고, 모든 기능적 매개변수를 구성하는 데 도움이 되는 설명을 제공합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>지침</strong>&nbsp;: 에이전트의 작업 목표와 컨텍스트를 정의합니다. Jinja 구문을 사용하여 업스트림 노드 변수를 참조할 수 있습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>쿼리</strong>&nbsp;: 사용자 입력을 받습니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최대 반복 횟수:</strong>&nbsp;에이전트의 실행 단계의 최대 횟수를 설정합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>출력 변수:</strong>&nbsp;노드가 출력하는 데이터 구조를 나타냅니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":758,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-64-1024x647.png\" alt=\"\" class=\"wp-image-758\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"logs\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#logs\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#logs\"></a>로그</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>실행 중에 에이전트 노드는 자세한 로그를 생성합니다. 입력 및 출력, 토큰 사용량, 소요 시간 및 상태를 포함한 전반적인 노드 실행 정보를 볼 수 있습니다. ‘세부 정보’를 클릭하면 각 에이전트 전략 실행 라운드의 출력을 볼 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":759,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-65-928x1024.png\" alt=\"\" class=\"wp-image-759\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"memory\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#memory\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#memory\"></a>메모리</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>메모리</strong> </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>토글을 활성화하면 에이전트가 대화 맥락을 기억하고 불러올 수 있습니다. <strong>창 크기를</strong> 조정하면 에이전트가 “기억”할 수 있는 이전 대화 메시지 수를 제어할 수 있습니다. 이를 통해 에이전트는 이전 대화를 이해하고 참조할 수 있으며, 여러 차례 대화가 이어지는 상황에서도 일관성 있고 맥락에 맞는 답변을 제공하여 대화 경험을 향상시킵니다.예를 들어, 사용자가 후속 메시지에서 대명사(예: “그것”, “이것” 또는 “그들”)를 사용하는 경우 메모리 기능이 활성화된 에이전트는 사용자가 전체 정보를 다시 설명하지 않고도 이전 맥락에서 이러한 대명사가 가리키는 내용을 이해할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"customizing-tools-for-your-use-case\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#customizing-tools-for-your-use-case\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#customizing-tools-for-your-use-case\"></a>사용 사례에 맞는 도구 사용자 정의</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>에이전트 노드나 에이전트에 도구를 추가하면 도구의 동작 방식을 사용자 지정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":760,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-66-795x1024.png\" alt=\"\" class=\"wp-image-760\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"tool-description\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#tool-description\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#tool-description\"></a>도구 설명</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>MCP 서버에서 제공되는 기본 설명을 재정의할 수 있습니다. 이는 사용 사례에 맞게 설명을 더욱 구체적으로 작성하는 데 유용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"parameter-configuration-reasoning-config\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#parameter-configuration-reasoning-config\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/agent#parameter-configuration-reasoning-config\"></a>매개변수 구성(추론 구성)</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>각 도구 매개변수에 대해 다음 중에서 선택할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>자동</strong> : AI 모델이 컨텍스트에 따라 매개변수 값을 결정하도록 합니다(기본 동작)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>고정 값</strong> : 항상 사용될 특정 값(정적 값 또는 변수일 수 있음)을 설정하여 AI 추론에서 매개변수를 제거합니다.이것은 다음의 경우에 유용합니다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>일관된 구성 값 설정(&nbsp;<code>numResults: 10</code>검색 도구의 경우와 같이)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>변경되어서는 안 되는 매개변수 미리 채우기(특정 API 엔드포인트 또는 형식 기본 설정 등)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>AI가 처리해야 하는 매개변수 수를 줄여 도구 사용을 단순화합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>예를 들어, 웹 검색 도구를 사용하면 다음과 같은 작업을 수행할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><code>query</code>AI가 검색할 내용을 결정하도록 “자동”을&nbsp;유지하세요 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>numResults</code>응답 크기를 제한하려면 “5”와 같은 고정 값으로&nbsp;설정하세요 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>일관된 동작을 위해 검색 필터와 같은 다른 매개변수를 고정 값으로 설정합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->','17. Node - 에전트(Agent)','','publish','open','closed','','node-%ec%97%90%ec%a0%84%ed%8a%b8agent','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(58,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>워크플로는 세 가지 유형으로 분류된 다양한 도구를 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>내장 도구</strong>&nbsp;: Dify가 제공하는 도구입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>사용자 정의 도구</strong>&nbsp;: OpenAPI/Swagger 표준 형식을 통해 가져오거나 구성된 도구입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>워크플로</strong>&nbsp;: 도구로 게시된 워크플로.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"add-and-use-the-tool-node\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/tools#add-and-use-the-tool-node\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/tools#add-and-use-the-tool-node\"></a>도구 노드 추가 및 사용</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>기본 제공 도구를 사용하려면 먼저 도구를 <strong>인증 해야 할 수도 있습니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기본 제공 도구가 요구 사항을 충족하지 못하는 경우 <strong>Dify 메뉴 탐색 – 도구</strong> 섹션에서 사용자 지정 도구를 만들 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>더욱 복잡한 워크플로를 조율하고 도구로 게시할 수도 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":763,\"width\":\"824px\",\"height\":\"auto\",\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large is-resized\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-67-535x1024.png\" alt=\"\" class=\"wp-image-763\" style=\"width:824px;height:auto\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":764,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-68-1024x421.png\" alt=\"\" class=\"wp-image-764\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>도구 노드를 구성하는 데는 일반적으로 두 단계가 포함됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>도구 승인 / 사용자 정의 도구 생성 / 워크플로를 도구로 게시.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>도구의 입력 및 매개변수 구성.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\" id=\"advanced-features\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/tools#advanced-features\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/tools#advanced-features\"></a>고급 기능</h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>실패 시 재시도</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>노드에서 발생하는 일부 예외의 경우, 일반적으로 노드를 다시 시도하는 것으로 충분합니다. 오류 재시도 기능이 활성화되어 있으면 오류 발생 시 노드는 미리 설정된 전략에 따라 자동으로 재시도합니다. 최대 재시도 횟수와 각 재시도 간격을 조정하여 재시도 전략을 설정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>최대 재시도 횟수는 10회입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>최대 재시도 간격은 5000ms입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":765,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-69-1024x666.png\" alt=\"\" class=\"wp-image-765\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>오류 처리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>도구 노드에서는 정보 처리 중에 워크플로를 중단시킬 수 있는 오류가 발생할 수 있습니다. 개발자는 다음 단계에 따라 실패 분기를 구성하여 노드에서 예외 발생 시 비상 계획을 실행하고 워크플로 중단을 방지할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>도구 노드에서 “오류 처리”를 활성화합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>오류 처리 전략을 선택하고 구성합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":766,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-70-1024x976.png\" alt=\"\" class=\"wp-image-766\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"publishing-workflow-applications-as-tools\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/tools#publishing-workflow-applications-as-tools\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/tools#publishing-workflow-applications-as-tools\"></a>워크플로 애플리케이션을 도구로 게시</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>워크플로 애플리케이션은 도구로 게시되어 다른 워크플로의 노드에서 사용될 수 있습니다. </p>\n<!-- /wp:paragraph -->','18. Node - 도구','','publish','open','closed','','node-%eb%8f%84%ea%b5%ac','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(59,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"what-is-loop-node%3f\">루프 노드란 무엇인가요?</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>루프 노드&nbsp;<strong>는</strong>&nbsp;종료 조건이 충족되거나 최대 루프 수에 도달할 때까지 이전 반복 결과에 따라 반복되는 작업을 실행합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"loop-vs-iteration\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#loop-vs-iteration\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#loop-vs-iteration\"></a>루프 대 반복</h2>\n<!-- /wp:heading -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>유형</th><th>종속성</th><th>사용 사례</th></tr></thead><tbody><tr><td><strong>루프</strong></td><td>각 반복은 이전 결과에 따라 달라집니다.</td><td>재귀 연산, 최적화 문제</td></tr><tr><td><strong>반복</strong></td><td>반복은 독립적으로 실행됩니다</td><td>일괄 처리, 병렬 데이터 처리</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"configurations\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#configurations\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#configurations\"></a>구성</h2>\n<!-- /wp:heading -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>매개변수</th><th>설명</th><th>예</th></tr></thead><tbody><tr><td>루프 종료 조건</td><td>루프를 종료할 시점을 결정하는 표현식</td><td><code>x &lt; 50</code>,<code>error_rate &lt; 0.01</code></td></tr><tr><td>최대 루프 수</td><td>무한 루프를 방지하기 위한 반복 횟수 상한</td><td>10, 100, 1000</td></tr><tr><td>루프 변수</td><td>루프가 완료된 후에도 반복 작업 동안 지속되고 노드에서 계속 액세스할 수 있는 값</td><td>반복할 때마다 카운터가&nbsp;<code>x &lt; 50</code>1씩 증가합니다. 루프 내부에서 계산에 사용한 후, 이후 워크플로 단계에서 최종 값에 접근합니다.</td></tr><tr><td>출구 루프 노드</td><td>도달하면 루프를 즉시 종료합니다.</td><td>다른 조건에 관계없이 실행을 10번의 반복으로 제한합니다.</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:paragraph -->\n<p>루프는 <strong>Exit Loop Node</strong> 또는 <strong>Loop Termination Condition 을</strong> 통해 종료될 수 있습니다 . 두 조건 중 하나가 충족되면 루프는 즉시 종료됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>종료 조건이 지정되지 않으면 루프는 최대 루프 수에</strong> 도달할 때까지 계속 실행됩니다( 와 유사 <code>while (true)</code>) .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\" id=\"example-1%3a-basic-loop\"><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#example-1%3A-basic-loop\">​</a><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#example-1%3A-basic-loop\"></a>예제 1: 기본 루프</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong>목표: 1~100 사이의 난수를 생성하여 50보다 작은 숫자를 생성합니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>단계</strong> :</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>템플릿</strong> 노드가 <code>done</code> 반환할 때 <strong>루프 종료 조건</strong> 이 트리거 되도록 구성하여 <strong>루프</strong> 노드 를 설정합니다 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><code>1~100</code> 사이의 난수 정수를 생성하는 <strong>코드</strong> 노드를 설정합니다 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>다음 논리를 사용하여&nbsp;<strong>IF/ELSE</strong>&nbsp;노드를 설정합니다 .</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>숫자 ≥ 50의 경우: 출력 <code>Current Number</code> 보이고 루프를 계속합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>숫자 &lt; 50의 경우: <code>Final Number</code>를 출력한 다음, <strong>Template</strong> 노드를 사용하여 <code>done</code>을 반환합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true,\"start\":4} -->\n<ol start=\"4\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>아래 숫자가&nbsp;<code>50</code>생성되면 워크플로가 자동으로 종료됩니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#example-2%3A-advanced-loop-with-variables-and-exit-node\">​</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":769,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-71-1024x604.png\" alt=\"\" class=\"wp-image-769\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:image {\"id\":770,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/09/image-72-1024x604.png\" alt=\"\" class=\"wp-image-770\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/workflow/node/loop#example-2%3A-advanced-loop-with-variables-and-exit-node\"></a></p>\n<!-- /wp:paragraph -->','19. Node - 루프(Loop)','','publish','open','closed','','node-%eb%a3%a8%ed%94%84loop','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(60,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p>gpu 서버에 설치된 marker 프로그램 이용하여 변환</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(1) WinSCP와 같은 sftp 프로그램을 이용하여 pdf 파일을 gpu 서버로 전송</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(2) ssh 로 gpu 서버에 kbsiwork 사용자로 접속</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(3) php의 가상환경 진입</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>conda activate marker </code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>(4) 파일을 복사해둔 디렉토리로 이동하여 다음과 같이 marker_single 명령어 실행으로 하나의 pdf 파일 전환</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>(marker) kbsiwork@kbsi-System-Product-Name:~/filedirectory$ marker_single file_name.pdf --output_dir .\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>(4-1) 디렉토리에 있는 파일 모두를 변환할 경우</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>(marker) kbsiwork@kbsi-System-Product-Name:~/filedirectory$ marker /path/to/input/folder --output_dir .</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>(5) filedirecotry 밑에 변화된 markdown 파일과 이미지 들이 생성됨</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','pdf에서 markdown 파일로 변환하는 방법','','publish','open','closed','','pdf%ec%97%90%ec%84%9c-markdown-%ed%8c%8c%ec%9d%bc%eb%a1%9c-%eb%b3%80%ed%99%98%ed%95%98%eb%8a%94-%eb%b0%a9%eb%b2%95','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(61,1,'2025-10-13 13:41:17','2025-10-13 04:41:17','<!-- wp:paragraph -->\n<p><strong>n8n</strong>(pronounced “n‑eight‑n”)은 “노드(Node) 기반 워크플로우(Flow) 자동화 플랫폼”입니다.<br>즉, “<strong>코드(또는 최소한의 코드)로 시각적으로 작업 흐름을 만들고, 다양한 서비스(앱, API, DB, 파일 등)와 연결</strong>”할 수 있는 오픈소스 툴입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">핵심 개념</h2>\n<!-- /wp:heading -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>용어</th><th>의미</th><th>예시</th></tr></thead><tbody><tr><td><strong>Workflow</strong></td><td>한 번에 실행되는 “노드들의 집합”.</td><td>새 주문이 들어오면 주문 정보를 DB에 저장하고 Slack에 알림을 보내는 프로세스</td></tr><tr><td><strong>Node</strong></td><td>하나의 작업 단위(Trigger, Action, Function 등).</td><td><strong>Webhook</strong>(트리거) → <strong>HTTP Request</strong>(API 호출) → <strong>Set</strong>(데이터 변형)</td></tr><tr><td><strong>Trigger</strong></td><td>워크플로우가 시작되는 지점.</td><td>Webhook, Cron(스케줄), Event(예: Gmail에 새 메일)</td></tr><tr><td><strong>Executor</strong></td><td>워크플로우를 실제로 실행시키는 엔진.</td><td>Node.js 기반, <code>@node-n8n/n8n</code> 패키지</td></tr><tr><td><strong>UI Editor</strong></td><td>브라우저에서 노드를 끌어다 놓으며 시각적으로 연결하고 설정할 수 있는 편집기.</td><td>노드 간 선(Flow) 그리기, 파라미터 입력, 로깅 화면 등</td></tr><tr><td><strong>Credentials</strong></td><td>외부 서비스에 인증 정보를 저장.</td><td>Google OAuth, API Key, SMTP 비밀번호</td></tr><tr><td><strong>Nodes Types</strong></td><td>Trigger, Action, Function, Set, Wait, Loop, IF, HTTP Request, Database 등</td><td></td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">주요 특징</h2>\n<!-- /wp:heading -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>특징</th><th>상세 설명</th></tr></thead><tbody><tr><td><strong>오픈소스 (AGPL‑3.0)</strong></td><td>소스가 공개돼서 누구든지 다운로드, 포크, 배포가 가능. 기업용에도 자유롭게 사용 가능(자체 호스팅).</td></tr><tr><td><strong>저장소</strong></td><td>SQLite(기본), Postgres, MySQL, MariaDB, MongoDB 등 다양한 DB에 워크플로우와 실행 기록 저장.</td></tr><tr><td><strong>Self‑Hosting</strong></td><td>Docker, Docker‑Compose, Kubernetes, Vagrant, 로컬 설치 등 거의 모든 환경에서 실행 가능.</td></tr><tr><td><strong>노드 커스터마이징</strong></td><td>TypeScript/JavaScript 로 자체 노드를 만들 수 있고, 공개 커뮤니티 노드도 설치해 사용할 수 있음.</td></tr><tr><td><strong>시각적 디버깅</strong></td><td>노드별 실행 결과(입력/출력)를 실시간으로 확인하고, 실패 시 재시도/회수 옵션.</td></tr><tr><td><strong>조건부 로직</strong></td><td>IF 노드, Switch, Boolean Expression, Loop(For Each) 등을 통해 복잡한 로직 구현.</td></tr><tr><td><strong>데이터 변환</strong></td><td>Function(자바스크립트 실행), Set, Merge, Rename, Split In Batches 등.</td></tr><tr><td><strong>이벤트 기반</strong></td><td>Webhook, Slack, Gmail, GitHub, Telegram 등 200+ 내장 트리거 노드.</td></tr><tr><td><strong>API 통합</strong></td><td>HTTP Request 노드로 임의의 REST/GraphQL API 호출 가능.</td></tr><tr><td><strong>자동화 옵션</strong></td><td>Cron(스케줄), Polling, Retry, Error Handling, Pause/Resume, Timeout 등.</td></tr><tr><td><strong>보안</strong></td><td>Secrets(암호화 저장), IP 허용/차단, CORS, Rate Limit, HTTPS 지원.</td></tr><tr><td><strong>버전 관리</strong></td><td>Git, GitHub Actions 등과 연동해 워크플로우 버전 관리 가능.</td></tr><tr><td><strong>대시보드</strong></td><td>실행 상태, 실행 횟수, 오류, 리소스 사용량 등 모니터링.</td></tr><tr><td><strong>다중 사용자</strong></td><td>Admin, Editor, Viewer 역할을 설정해 멀티 유저 환경 구성 가능.</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">노드</h2>\n<!-- /wp:heading -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>카테고리</th><th>역할</th><th>대표 노드 예시</th><th>비고</th></tr></thead><tbody><tr><td><strong>트리거(Trigger) 노드</strong></td><td>워크플로우 시작 포인트</td><td><code>Cron</code>, <code>Schedule</code>, <code>Webhook</code>, <code>Discord Webhook</code>, <code>GitHub</code>, <code>Google Calendar</code></td><td><code>Webhook</code>는 HTTP 엔드포인트를 생성, <code>Cron</code>은 주기적으로 실행</td></tr><tr><td><strong>HTTP 노드</strong></td><td>HTTP 요청/응답 처리</td><td><code>HTTP Request</code>, <code>HTTP Response</code></td><td>외부 API 호출, webhook 응답</td></tr><tr><td><strong>데이터 조작(Transformation) 노드</strong></td><td>데이터 가공/정제</td><td><code>Set</code>, <code>Function</code>, <code>Function Item</code>, <code>Merge</code>, <code>SplitInBatches</code>, <code>Rename</code></td><td>JavaScript/JSON Path를 활용</td></tr><tr><td><strong>조건/제어 흐름 노드</strong></td><td>조건부 실행</td><td><code>IF</code>, <code>Switch</code>, <code>Loop</code>, <code>Wait</code>, <code>Delay</code></td><td>워크플로우 흐름 제어</td></tr><tr><td><strong>데이터베이스 노드</strong></td><td>DB 연동</td><td><code>MySQL</code>, <code>PostgreSQL</code>, <code>MongoDB</code>, <code>SQLite</code>, <code>Redis</code></td><td>CRUD 연산</td></tr><tr><td><strong>파일/스토리지 노드</strong></td><td>파일 처리</td><td><code>Read Binary File</code>, <code>Write Binary File</code>, <code>Amazon S3</code>, <code>Google Drive</code>, <code>Dropbox</code></td><td>파일 입출력</td></tr><tr><td><strong>통합(Integration) 노드</strong></td><td>SaaS/서비스 연동</td><td><code>Slack</code>, <code>Microsoft Teams</code>, <code>Discord</code>, <code>Twilio</code>, <code>SendGrid</code>, <code>Mailgun</code>, <code>Gmail</code>, <code>Outlook</code>, <code>Shopify</code>, <code>Stripe</code>, <code>Jira</code>, <code>Trello</code> 등</td><td>API 연결을 위한 사전 정의 노드</td></tr><tr><td><strong>공통/유틸리티 노드</strong></td><td>보조 기능</td><td><code>Delete</code>, <code>Comment</code>, <code>Empty</code>, <code>Item List</code>, <code>CSV</code>, <code>JSON</code>, <code>XML</code></td><td>간단한 로직, 데이터 형식 변환</td></tr><tr><td><strong>외부 API 노드</strong></td><td>커스텀 API 연동</td><td><code>Google Sheets</code>, <code>Zendesk</code>, <code>Zendesk Ticket</code>, <code>Zendesk Comment</code>, <code>Zendesk Live Chat</code>, <code>Shopify</code> 등</td><td>3rd‑party 서비스와의 세부 통합</td></tr><tr><td><strong>앱 노드</strong></td><td>앱 기반 이벤트</td><td><code>Google OAuth2</code>, <code>Azure AD</code>, <code>Firebase Auth</code></td><td>인증 및 권한 관리</td></tr><tr><td><strong>시각화/분석 노드</strong></td><td>데이터 분석</td><td><code>Chart</code>, <code>ChartJS</code>, <code>Google Data Studio</code> (외부)</td><td>시각화 플러그인</td></tr><tr><td><strong>커스텀 노드</strong></td><td>직접 개발</td><td><code>Custom Node</code> (자체 JS/TS 코드)</td><td>n8n CLI를 이용해 생성</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:list {\"className\":\"\"} -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>n8n의 핵심은 <strong>노드</strong>입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>노드는 <strong>Trigger → Action → Data Manipulation → Output</strong> 순으로 연결됩니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>n8n은 “코드 없이 자동화하고 싶지만, 필요할 때는 커스터마이즈하고 싶다”는 개발자·시스템 관리자, 비즈니스 오너 모두에게 딱 맞는 툴입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"className\":\"\"} -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>무료/오픈소스</strong> → 비용 부담이 적음</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>자체 호스팅</strong> → 데이터 보안·프라이버시 완전 통제</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>노드 기반 시각화</strong> → 비전문가도 쉽게 흐름 설계 가능</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>확장성</strong> → 커스터마이징, API, 커뮤니티 노드 등으로 한계를 넘을 수 있음</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','n8n이란?','','publish','open','closed','','n8n%ec%9d%b4%eb%9e%80','','','2025-10-13 13:41:17','2025-10-13 04:41:17','',0,'http://kbsi',0,'docs','',0),
(62,1,'2025-10-13 16:51:29','2025-10-13 07:51:29','<!-- wp:paragraph -->\n<p>한국생산기술연구원의 AI 전환을 위해 지혜를 모으기 위한 지식 공유 공간입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":70,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://rndpolicy.org/aidev/wp-content/uploads/2025/10/front_image2.png\" alt=\"\" class=\"wp-image-70\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:betterdocs/categorygrid {\"blockId\":\"betterdocs-categorygrid-y5d0in7\",\"blockMeta\":{\"desktop\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{  background-color: rgba(255, 255, 255, 0);   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper{ \\u002d\\u002dcolumn: 3; margin-top: 28px; margin-right: 0px; margin-left: 0px; margin-bottom: 28px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.masonry \\u003e .betterdocs-single-category-wrapper{ margin-bottom:10px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title a{ color: #528ffe; font-size: 20px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{  padding-top: 0px; padding-right: 0px; padding-left: 0px; padding-bottom: 20px;  border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 2px; border-color: #528ffe; border-style: solid;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{  font-size: 15px; color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{ min-height:30px;min-width:30px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{  background-color: #528ffe;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after{ border-top-color: rgb(173, 94, 98); }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ color: #528ffe; font-size: 16px;  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-footer{ text-align: left; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-articles-list li:not(.betterdocs-nested-category-wrapper) a{  font-size: 15px; color: #566e8b; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li i, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper i{ font-size:15px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li img, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper img{ height:15px;width:15px; }\",\"tab\":\"\",\"mobile\":\"\",\"desktopHover\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span:hover{ color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after:hover{ border-top-color: rgb(173, 94, 98); }\",\"tabHover\":\"\",\"mobileHover\":\"\",\"extraStyles\":\" .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{ transition: border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{ transition:background 0.5s; }\"}} /-->','Home','','publish','closed','closed','','ai-app-development','','','2025-10-18 19:28:36','2025-10-18 10:28:36','',0,'https://rndpolicy.org/aidev/?page_id=62',0,'page','',0),
(63,1,'2025-10-13 16:51:29','2025-10-13 07:51:29','<!-- wp:betterdocs/breadcrumb {\"blockId\":\"betterdocs-breadcrumb-oesr3jh\",\"blockMeta\":{\"desktop\":\" .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh { display:flex; justify-content:left } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ font-size: 16px; padding: 0px; margin: 0px; color:#566e8b; } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .breadcrumb-delimiter .breadcrumb-delimiter-icon{ margin: 0px; padding: 0px; color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 { display:flex; justify-content:left } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ font-size: 16px; padding: 0px; margin: 0px; color:#667085; } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .breadcrumb-delimiter .breadcrumb-delimiter-icon path{ margin: 0px; padding: 0px; color:#566e8b !important; } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 ul.betterdocs-breadcrumb-list { background:#F9FAFB; } \",\"tab\":\" .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .breadcrumb-delimiter .breadcrumb-delimiter-icon{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .breadcrumb-delimiter .breadcrumb-delimiter-icon path{ color:#566e8b } \",\"mobile\":\" .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh .breadcrumb-delimiter .breadcrumb-delimiter-icon{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#667085 } .betterdocs-breadcrumb.betterdocs-breadcrumb-oesr3jh.layout-2 .breadcrumb-delimiter .breadcrumb-delimiter-icon path{ color:#566e8b !important; } \"}} /-->\n\n<!-- wp:betterdocs/breadcrumb {\"blockId\":\"betterdocs-breadcrumb-ot6mmul\",\"blockMeta\":{\"desktop\":\" .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul { display:flex; justify-content:left } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ font-size: 16px; padding: 0px; margin: 0px; color:#566e8b; } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .breadcrumb-delimiter .breadcrumb-delimiter-icon{ margin: 0px; padding: 0px; color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 { display:flex; justify-content:left } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ font-size: 16px; padding: 0px; margin: 0px; color:#667085; } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .breadcrumb-delimiter .breadcrumb-delimiter-icon path{ margin: 0px; padding: 0px; color:#566e8b !important; } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 ul.betterdocs-breadcrumb-list { background:#F9FAFB; } \",\"tab\":\" .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .breadcrumb-delimiter .breadcrumb-delimiter-icon{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .breadcrumb-delimiter .breadcrumb-delimiter-icon path{ color:#566e8b } \",\"mobile\":\" .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul .breadcrumb-delimiter .breadcrumb-delimiter-icon{ color:#566e8b } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item a, .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .betterdocs-breadcrumb-list .betterdocs-breadcrumb-item span{ color:#667085 } .betterdocs-breadcrumb.betterdocs-breadcrumb-ot6mmul.layout-2 .breadcrumb-delimiter .breadcrumb-delimiter-icon path{ color:#566e8b !important; } \"}} /-->\n\n<!-- wp:betterdocs/categorygrid {\"blockId\":\"betterdocs-categorygrid-y5d0in7\",\"blockMeta\":{\"desktop\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{  background-color: rgba(255, 255, 255, 0);   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper{ \\u002d\\u002dcolumn: 3; margin-top: 28px; margin-right: 0px; margin-left: 0px; margin-bottom: 28px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.masonry \\u003e .betterdocs-single-category-wrapper{ margin-bottom:10px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title a{ color: #528ffe; font-size: 20px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{  padding-top: 0px; padding-right: 0px; padding-left: 0px; padding-bottom: 20px;  border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 2px; border-color: #528ffe; border-style: solid;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{  font-size: 15px; color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{ min-height:30px;min-width:30px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{  background-color: #528ffe;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after{ border-top-color: rgb(173, 94, 98); }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ color: #528ffe; font-size: 16px;  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-footer{ text-align: left; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-articles-list li:not(.betterdocs-nested-category-wrapper) a{  font-size: 15px; color: #566e8b; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li i, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper i{ font-size:15px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li img, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper img{ height:15px;width:15px; }\",\"tab\":\"\",\"mobile\":\"\",\"desktopHover\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span:hover{ color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after:hover{ border-top-color: rgb(173, 94, 98); }\",\"tabHover\":\"\",\"mobileHover\":\"\",\"extraStyles\":\" .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{ transition: border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{ transition:background 0.5s; }\"}} /-->','AI app development','','inherit','closed','closed','','62-revision-v1','','','2025-10-13 16:51:29','2025-10-13 07:51:29','',62,'https://rndpolicy.org/aidev/?p=63',0,'revision','',0),
(65,1,'2025-10-13 16:53:59','2025-10-13 07:53:59','{\n    \"show_on_front\": {\n        \"value\": \"page\",\n        \"type\": \"option\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"page_on_front\": {\n        \"value\": \"62\",\n        \"type\": \"option\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_docs_page_docs_list_item_margin_layout_8\": {\n        \"value\": \"{\\\"input1\\\":\\\"24\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_sidebar_title_margin_layout_8\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_sidebar_title_padding_layout_8\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_sidebar_list_item_margin_layout_8\": {\n        \"value\": \"{\\\"input1\\\":\\\"1\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_sidebar_list_item_padding_layout_8\": {\n        \"value\": \"{\\\"input1\\\":\\\"7\\\",\\\"input2\\\":\\\"8\\\",\\\"input3\\\":\\\"7\\\",\\\"input4\\\":\\\"8\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::modal_wrapper_padding\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::modal_wrapper_margin\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_field_modal_padding\": {\n        \"value\": \"{\\\"input1\\\":\\\"5\\\",\\\"input2\\\":\\\"5\\\",\\\"input3\\\":\\\"5\\\",\\\"input4\\\":\\\"5\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_field_modal_margin\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_modal_content_tabs_margin\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_modal_content_tabs_padding\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"28\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"28\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_modal_content_tabs_border\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"1\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_modal_content_tabs_docs_list_padding\": {\n        \"value\": \"{\\\"input1\\\":\\\"16\\\",\\\"input2\\\":\\\"24\\\",\\\"input3\\\":\\\"16\\\",\\\"input4\\\":\\\"24\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::search_modal_content_tabs_docs_list_margin\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_title_margin\": {\n        \"value\": \"{\\\"input1\\\":\\\"0\\\",\\\"input2\\\":\\\"0\\\",\\\"input3\\\":\\\"0\\\",\\\"input4\\\":\\\"0\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_category_name_padding\": {\n        \"value\": \"{\\\"input1\\\":\\\"20\\\",\\\"input2\\\":\\\"20\\\",\\\"input3\\\":\\\"20\\\",\\\"input4\\\":\\\"20\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_list_padding\": {\n        \"value\": \"{\\\"input1\\\":\\\"20\\\",\\\"input2\\\":\\\"20\\\",\\\"input3\\\":\\\"20\\\",\\\"input4\\\":\\\"20\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_category_name_padding_layout_2\": {\n        \"value\": \"{\\\"input1\\\":\\\"20\\\",\\\"input2\\\":\\\"20\\\",\\\"input3\\\":\\\"20\\\",\\\"input4\\\":\\\"20\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_list_padding_layout_2\": {\n        \"value\": \"{\\\"input1\\\":\\\"20\\\",\\\"input2\\\":\\\"20\\\",\\\"input3\\\":\\\"20\\\",\\\"input4\\\":\\\"20\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_category_name_padding_layout_3\": {\n        \"value\": \"{\\\"input1\\\":\\\"20\\\",\\\"input2\\\":\\\"20\\\",\\\"input3\\\":\\\"20\\\",\\\"input4\\\":\\\"20\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_list_padding_layout_3\": {\n        \"value\": \"{\\\"input1\\\":\\\"24\\\",\\\"input2\\\":\\\"14\\\",\\\"input3\\\":\\\"24\\\",\\\"input4\\\":\\\"14\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_category_name_padding_layout_4\": {\n        \"value\": \"{\\\"input1\\\":\\\"20\\\",\\\"input2\\\":\\\"20\\\",\\\"input3\\\":\\\"20\\\",\\\"input4\\\":\\\"20\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    },\n    \"hello-elementor::betterdocs_faq_list_padding_layout_4\": {\n        \"value\": \"{\\\"input1\\\":\\\"24\\\",\\\"input2\\\":\\\"14\\\",\\\"input3\\\":\\\"24\\\",\\\"input4\\\":\\\"14\\\"}\",\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-13 07:53:59\"\n    }\n}','','','trash','closed','closed','','6c2f3d43-86c2-4faa-b383-8e8bc2441cb5','','','2025-10-13 16:53:59','2025-10-13 07:53:59','',0,'https://rndpolicy.org/aidev/6c2f3d43-86c2-4faa-b383-8e8bc2441cb5/',0,'customize_changeset','',0),
(66,1,'2025-10-13 20:40:39','2025-10-13 11:40:39','{\"version\": 3, \"isGlobalStylesUserThemeJSON\": true }','Custom Styles','','publish','closed','closed','','wp-global-styles-hello-elementor','','','2025-10-13 20:40:39','2025-10-13 11:40:39','',0,'https://rndpolicy.org/aidev/wp-global-styles-hello-elementor/',0,'wp_global_styles','',0),
(67,1,'2025-10-13 20:41:13','2025-10-13 11:41:13','<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">도입</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있도록 하는 개방형 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 단위로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. 이를 통해 개발자는 환경에 구애받지 않고 애플리케이션을 동일하게 실행할 수 있으며, 인프라와 애플리케이션을 분리하여 운영 효율성을 극대화할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>본 매뉴얼은 Ubuntu 24.04 LTS 환경에서 Docker를 설치하고, 기본적인 명령어를 통해 컨테이너와 이미지를 관리하며, Python 애플리케이션을 컨테이너화하는 방법, 일반적인 문제 해결 방안, 그리고 Docker 보안 강화 전략에 이르기까지 포괄적인 내용을 다룬다. 각 단계별 상세한 설명과 예제를 통해 사용자가 Docker를 효과적으로 이해하고 활용할 수 있도록 지원하는 것을 목표로 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>1. Ubuntu 24.04 Docker 설치 준비</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Engine을 Ubuntu 24.04에 성공적으로 설치하기 위해서는 몇 가지 사전 준비 사항을 확인하고 충족해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>1.1. 시스템 요구 사항 및 사전 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>운영체제</strong>: Ubuntu Noble 24.04 (LTS)의 64비트 버전이 필요하다. Docker Engine은 x86_64 (amd64), armhf, arm64, s390x, ppc64le (ppc64el) 아키텍처를 지원한다. Linux Mint와 같은 Ubuntu 파생 배포판에서의 설치는 공식적으로 지원되지 않을 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>커널 버전</strong>: Docker는 Linux 커널의 특정 기능을 활용하므로, 최신 상태의 커널을 사용하는 것이 권장된다. 일반적으로 Ubuntu 24.04 LTS의 기본 커널은 Docker 실행에 충분하다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>저장 공간</strong>: Docker 이미지와 컨테이너는 디스크 공간을 차지하므로, 충분한 여유 공간을 확보해야 한다. /var/lib/docker/ 디렉토리에 주로 데이터가 저장된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>방화벽 제한 사항</strong>: Docker를 사용하여 컨테이너 포트를 노출할 경우, ufw 또는 firewalld와 같은 방화벽 규칙을 우회할 수 있다. Docker는 iptables-nft 및 iptables-legacy와 호환되며, nft로 생성된 방화벽 규칙은 지원하지 않는다. 방화벽 규칙은 iptables 또는 ip6tables로 생성하고 DOCKER-USER 체인에 추가해야 한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>1.2. 기존 Docker 버전 또는 충돌 가능 패키지 제거</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>새로운 버전의 Docker Engine을 설치하기 전에, 시스템에 이전 버전의 Docker나 비공식 Docker 패키지가 설치되어 있다면 이를 제거하는 것이 좋다. 충돌을 유발할 수 있는 패키지에는 docker.io, docker-doc, docker-compose, docker-compose-v2, podman-docker 등이 있다. 또한, Docker Engine이 자체적으로 containerd.io와 runc를 번들로 제공하므로, 이들이 별도로 설치되어 있다면 제거해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음 명령어를 사용하여 관련 패키지를 제거할 수 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done<br></code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이 명령어는 패키지를 제거하지만, /var/lib/docker/에 저장된 기존 이미지, 컨테이너, 볼륨, 네트워크는 자동으로 삭제되지 않는다. 완전히 새로 설치하고자 한다면, Docker 제거 후 해당 디렉토리를 수동으로 삭제해야 할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>2. Ubuntu 24.04에 Docker Engine 설치 (APT 저장소 방식)</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ubuntu에 Docker Engine을 설치하는 가장 권장되는 방법은 Docker의 공식 APT 저장소를 사용하는 것이다. 이 방법을 사용하면 설치 및 업데이트 관리가 용이하다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.1. Docker 공식 GPG 키 추가</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>GPG 키는 다운로드하는 패키지의 진위성을 확인하여 소프트웨어 무결성을 보장하는 데 필수적이다. 이 과정은 신뢰할 수 있는 소스에서 Docker를 설치하고 있음을 시스템에 알리는 역할을 한다. 만약 GPG 키 검증 없이 패키지를 설치한다면, 중간자 공격(Man-in-the-Middle attack)이나 악의적으로 수정된 소프트웨어에 노출될 위험이 있다. 따라서 GPG 키 추가는 보안상 매우 중요한 단계이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code><code>#  <span style=\"background-color: initial; font-family: inherit; font-size: inherit; text-align: initial; color: initial;\">먼저, 시스템 패키지 목록을 업데이트하고 HTTPS를 통해 저장소를 사용하는 데 필요한 패키지를 설치한다:</span></code>\n<code>sudo apt-get update </code>\n<code>sudo apt-get install ca-certificates curl </code>\n# GPG 키를 저장할 디렉토리를 생성하고 적절한 권한을 설정한다:\n\n<code>sudo install -m 0755 -d /etc/apt/keyrings </code>\n# Docker의 공식 GPG 키를 다운로드하여 지정된 경로에 저장한다:\n\n<code>sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc </code>\n# 다운로드한 GPG 키 파일에 대해 모든 사용자가 읽을 수 있도록 권한을 변경한다:\n\n<code>sudo chmod a+r /etc/apt/keyrings/docker.asc </code></code></pre>\n<!-- /wp:code -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li></li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.2. Docker APT 저장소 설정</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>GPG 키를 추가한 후, APT가 Docker 패키지를 찾을 수 있도록 Docker의 공식 저장소를 시스템의 소스 목록에 추가해야 한다. 공식 저장소를 사용하면 Docker 팀이 직접 제공하고 관리하는 최신 버전의 안정적이고 안전한 패키지를 받을 수 있다. 운영체제의 기본 저장소에 포함된 Docker 패키지는 오래되었거나 수정되었을 가능성이 있으므로, 공식 저장소 사용은 최신 기능과 보안 패치를 보장받는 최선의 방법이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음 명령어를 실행하여 Docker 저장소를 APT 소스 목록에 추가한다. 이 명령어는 시스템 아키텍처와 Ubuntu 코드명을 자동으로 감지하여 적절한 저장소를 설정한다:<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code><code># Add the repository to Apt sources: </code>\necho \\\n  \"deb &#91;arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\\n  $(. /etc/os-release &amp;&amp; echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null\n\n\n# 저장소를 추가한 후, 다시 패키지 목록을 업데이트하여 APT가 새로운 Docker 저장소의 패키지 정보를 가져오도록 한다:\n\nsudo apt-get update</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.3. Docker Engine 패키지 설치</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>저장소 설정이 완료되면 Docker Engine 및 관련 패키지를 설치할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>최신 버전의 Docker Engine, CLI, containerd, Docker Compose 플러그인, Buildx 플러그인을 설치하려면 다음 명령어를 실행한다:\n\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>여기서 각 패키지의 역할은 다음과 같다:<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker-ce: Docker Community Edition, 즉 Docker 엔진 자체이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-ce-cli: Docker 명령줄 인터페이스(CLI)를 제공한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>containerd.io: 컨테이너 런타임으로, 컨테이너의 생명주기를 관리한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-buildx-plugin: 다중 플랫폼 빌드 등 향상된 이미지 빌드 기능을 제공한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-compose-plugin: YAML 파일을 사용하여 다중 컨테이너 Docker 애플리케이션을 관리할 수 있게 한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>특정 버전의 Docker Engine을 설치하려면, 먼저 사용 가능한 버전을 확인한다:\n\napt-cache madison docker-ce | awk \'{ print $3 }\'\n\n출력된 목록에서 원하는 버전 문자열(예: 5:28.2.1-1~ubuntu.24.04~noble)을 선택한 후, 해당 버전으로 설치한다:\n\nVERSION_STRING=5:28.2.1-1~ubuntu.24.04~noble\n\nsudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.4. 설치 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Engine이 성공적으로 설치되었는지 확인하기 위해 hello-world 이미지를 실행한다. 이 이미지는 간단한 테스트용으로, 실행 시 Docker 설치가 정상적으로 완료되었음을 알리는 메시지를 출력한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo docker run hello-world</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이 명령어를 실행하면 hello-world 이미지가 로컬에 없는 경우 Docker Hub에서 자동으로 다운로드되고, 컨테이너로 실행된 후 메시지를 출력하고 종료된다. \"Hello from Docker!\"와 유사한 메시지가 나타나면 설치가 성공적으로 완료된 것이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>설치된 Docker 버전을 확인하려면 다음 명령어를 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo docker --version</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>출력 예: Docker version 26.1.4, build 5650f9b</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>3. Docker 설치 후속 조치</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Engine 설치 후, 사용 편의성과 시스템 관리를 위해 몇 가지 추가 설정을 수행하는 것이 좋다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>3.1. sudo 없이 Docker 명령어 사용 설정 (비루트 사용자 접근 활성화)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>기본적으로 Docker 명령어는 루트 권한을 요구하므로 sudo를 함께 사용해야 한다. 매번 sudo를 입력하는 번거로움을 줄이고자 한다면, 현재 사용자를 docker 그룹에 추가할 수 있다. 이 설정은 편의성을 제공하지만, 보안적 측면을 고려해야 한다. docker 그룹에 속한 사용자는 Docker 데몬과 직접 통신할 수 있게 되며, Docker 데몬은 루트 권한으로 실행되므로 이는 해당 사용자에게 사실상 루트와 동등한 권한을 부여하는 것과 같다. 특히 다중 사용자 환경에서는 이 설정이 보안 위험을 증가시킬 수 있으므로 신중하게 결정해야 한다. 단일 사용자 환경이나 개발 환경에서는 편의를 위해 설정하는 경우가 많다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker 그룹이 시스템에 존재하지 않을 경우 생성한다. -f 옵션은 그룹이 이미 존재하더라도 오류를 발생시키지 않는다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo groupadd -f docker\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>현재 로그인된 사용자를 docker 그룹에 추가한다. 다른 사용자를 추가하려면 $USER 대신 해당 사용자명을 입력한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker $USER</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>또는 특정 사용자를 추가하려면:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker &#91;username]</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>그룹 변경 사항을 현재 세션에 적용한다. 이를 위해서는 newgrp docker 명령어를 실행하거나, 시스템에서 로그아웃한 후 다시 로그인해야 한다. newgrp 명령어는 새로운 셸을 시작하여 변경된 그룹 멤버십을 즉시 적용한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>newgrp docker</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이후에는 sudo 없이 docker ps와 같은 Docker 명령어를 실행할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker ps</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>실행 중인 컨테이너가 없다면 빈 목록이 출력될 것이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>3.2. Docker 서비스 관리</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker는 시스템 서비스로 실행되므로 systemctl 명령어를 사용하여 관리할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>부팅 시 Docker 자동 시작 활성화</strong>: 시스템이 시작될 때 Docker 서비스가 자동으로 실행되도록 설정한다.<br>sudo systemctl enable docker<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 상태 확인</strong>: Docker 서비스의 현재 실행 상태를 확인한다.<br>sudo systemctl status docker<br>출력에서 active (running) 상태를 확인하면 정상적으로 실행 중인 것이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 시작</strong>: 중지된 Docker 서비스를 시작한다.<br>sudo systemctl start docker<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 중지</strong>: 실행 중인 Docker 서비스를 중지한다.<br>sudo systemctl stop docker<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 재시작</strong>: Docker 서비스를 재시작한다. 설정 변경 후 적용하거나 문제가 발생했을 때 사용한다.<br>sudo systemctl restart docker<br></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>4. Docker 기본 명령어 활용</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker 설치 후에는 다양한 명령어를 사용하여 컨테이너와 이미지를 관리할 수 있다. 다음은 핵심적인 기본 명령어들이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.1. docker ps: 실행 중인 컨테이너 목록 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker ps 명령어는 현재 실행 중인 컨테이너의 목록을 보여준다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker ps<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 컨테이너(중지된 컨테이너 포함)를 보려면 -a 또는 --all 옵션을 추가한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker ps -a<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력에는 컨테이너 ID, 사용된 이미지, 실행된 명령어, 생성 시간, 상태, 포트, 이름 등의 정보가 포함된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.2. docker stop: 실행 중인 컨테이너 중지</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker stop [container_name_or_id] 명령어는 실행 중인 컨테이너를 중지시킨다. (User Query) 이 명령어는 컨테이너의 주 프로세스에 SIGTERM 신호를 보내 정상적으로 종료하도록 요청한다. 일정 시간(기본 10초) 내에 종료되지 않으면 SIGKILL 신호를 보내 강제 종료한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker stop my_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) 여러 컨테이너를 한 번에 중지시킬 수도 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker stop container1 container2<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 실행 중인 컨테이너를 중지하려면 다음 명령어를 사용할 수 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker stop $(docker ps -q)<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>여기서 docker ps -q는 실행 중인 컨테이너의 ID만 나열한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.3. docker start: 중지된 컨테이너 재시작</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker start [container_name_or_id] 명령어는 중지된 컨테이너를 다시 시작시킨다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker start my_stopped_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.4. docker logs: 컨테이너 로그 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker logs [container_name_or_id] 명령어는 컨테이너 내부에서 발생하는 로그(표준 출력 및 표준 에러)를 확인할 때 사용한다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker logs my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>실시간으로 로그를 계속 보려면 -f 또는 --follow 옵션을 추가한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker logs -f my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>최근 N개의 로그 라인만 보려면 --tail N 옵션을 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker logs --tail 50 my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.5. docker rm: 컨테이너 삭제</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker rm [container_name_or_id] 명령어는 하나 이상의 컨테이너를 삭제한다. (User Query) 컨테이너는 중지된 상태여야 삭제할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rm my_stopped_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>실행 중인 컨테이너를 중지하지 않고 즉시 삭제하려면 -f 또는 --force 옵션을 추가한다. 이 옵션은 컨테이너에 SIGKILL 신호를 보내 강제 종료 후 삭제한다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rm -f my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 중지된 컨테이너를 삭제하려면 다음 명령어를 사용할 수 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rm $(docker ps -a -f status=exited -q)<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>또는 docker container prune 명령어를 사용하면 중지된 모든 컨테이너를 한 번에 삭제할 수 있다 (사용자 확인 후 진행):</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker container prune<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.6. docker rmi: 이미지 삭제</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker rmi [image_name_or_id] 명령어는 로컬 시스템에서 하나 이상의 Docker 이미지를 삭제한다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rmi my_image:tag<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이미지가 실행 중인 컨테이너나 다른 이미지의 부모 이미지로 사용되고 있다면 삭제되지 않는다. 강제로 삭제하려면 -f 또는 --force 옵션을 사용할 수 있지만, 주의해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rmi -f my_image:tag<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>태그가 없는 이미지(댕글링 이미지, dangling images)만 삭제하려면 다음 명령어를 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker image prune<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 이미지를 삭제하려면 (사용 중이지 않은 이미지 대상):</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rmi $(docker images -a -q)<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>5. Docker 컨테이너 실행: docker run 상세 분석</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어는 Docker에서 이미지를 기반으로 새로운 컨테이너를 생성하고 실행하는 핵심 명령어이다. 이 명령어는 다양한 옵션을 통해 컨테이너의 동작 방식을 세밀하게 제어할 수 있다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>5.1. docker run 기본 구문</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어의 일반적인 형태는 다음과 같다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker run IMAGE<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>``: 컨테이너의 동작을 설정하는 다양한 옵션들이다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>IMAGE: 컨테이너를 생성할 기반 Docker 이미지의 이름이다. 태그(:TAG)를 생략하면 기본적으로 :latest 태그가 사용된다. 이미지 다이제스트(@DIGEST)를 사용하여 특정 버전의 이미지를 정확히 지정할 수도 있다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>``: 컨테이너가 시작될 때 내부에서 실행할 명령어이다. 이미지에 기본 실행 명령어가 정의되어 있다면 생략 가능하다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>: 에 전달할 인자들이다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>예를 들어, busybox 이미지를 사용하여 \"Hello, World!\"를 출력하는 간단한 컨테이너를 실행하는 명령어는 다음과 같다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker run busybox echo \"Hello, World!\"<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>5.2. docker run 주요 옵션</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어와 함께 자주 사용되는 주요 옵션들은 다음과 같다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>-d, --detach</strong>: 컨테이너를 백그라운드에서 실행한다 (데몬 모드). (User Query) 터미널에 연결되지 않고 백그라운드에서 실행되므로 웹 서버나 데이터베이스와 같은 서비스를 실행할 때 유용하다.<br>docker run -d nginx<br>이 옵션은 장기 실행 서비스에 적합하며, 컨테이너 ID만 출력하고 터미널 제어권을 즉시 반환한다. 반면, 대화형 세션이 필요한 경우 (예: 셸 접속) 이 옵션은 적합하지 않다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-p, --publish HOST_PORT:CONTAINER_PORT</strong>: 호스트와 컨테이너 간의 포트를 연결(매핑)한다. (User Query) 호스트의 HOST_PORT로 들어오는 트래픽을 컨테이너 내부의 CONTAINER_PORT로 전달한다. 예: -p 8080:80은 호스트의 8080번 포트를 컨테이너의 80번 포트로 연결한다. (User Query)<br>docker run -d -p 8080:80 nginx<br>(User Query) 이 포트 매핑 기능은 컨테이너 내부에서 실행 중인 애플리케이션을 외부 네트워크에 노출시키는 핵심 방법이다. 호스트 포트는 호스트 머신에서 사용 가능한 포트여야 하며, 컨테이너 포트는 컨테이너 내 애플리케이션이 수신 대기하는 포트이다. 이를 통해 동일한 컨테이너 이미지를 여러 개 실행하면서 각각 다른 호스트 포트에 매핑하여 서비스 충돌 없이 여러 인스턴스를 운영할 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-v, --volume HOST_PATH:CONTAINER_PATH 또는 VOLUME_NAME:CONTAINER_PATH</strong>: 호스트와 컨테이너 간의 디렉토리나 파일을 공유(마운트)하거나, 명명된 볼륨을 컨테이너에 연결한다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>바인드 마운트 (Bind Mounts)</strong>: 호스트의 특정 경로(HOST_PATH)를 컨테이너의 특정 경로(CONTAINER_PATH)에 직접 연결한다. 호스트 파일 시스템의 변경 사항이 컨테이너에 반영되고, 그 반대도 가능하다. 예: 호스트의 /opt/data 디렉토리를 컨테이너의 /app 디렉토리와 공유한다.<br>docker run -v /opt/data:/app myapp<br>(User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>명명된 볼륨 (Named Volumes)</strong>: Docker가 관리하는 영구 저장 공간인 명명된 볼륨(VOLUME_NAME)을 컨테이너의 특정 경로(CONTAINER_PATH)에 연결한다. 데이터베이스 데이터나 애플리케이션 상태를 영구적으로 저장하는 데 권장된다. 예: my_volume이라는 명명된 볼륨을 컨테이너의 /data 경로에 마운트한다.<br>docker run --mount source=my_volume,target=/data myimage<br>(또는 -v my_volume:/data)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>--name CONTAINER_NAME</strong>: 컨테이너에 고유한 이름을 지정한다. (User Query) 이름을 지정하면 컨테이너 ID 대신 이름으로 컨테이너를 참조할 수 있어 관리가 용이하다.<br>docker run -d --name my_web_server nginx<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--env KEY=VALUE 또는 -e KEY=VALUE</strong>: 컨테이너 내부에 환경 변수를 설정한다. (User Query) 애플리케이션 설정, 데이터베이스 연결 정보 등을 전달하는 데 사용된다. 예: DATABASE_URL 환경 변수를 설정한다.<br>docker run --env DATABASE_URL=mysql://user:password@localhost:5432/db myapp<br>(User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-i, --interactive</strong>: 컨테이너의 표준 입력(STDIN)을 열린 상태로 유지한다. 주로 -t 옵션과 함께 사용된다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-t, --tty</strong>: 가상 터미널(pseudo-TTY)을 할당한다. 주로 -i 옵션과 함께 사용되어 컨테이너와 상호작용하는 셸 환경을 제공한다. (User Query) 예: Ubuntu 이미지로 컨테이너를 실행하고 bash 셸에 접속한다.<br>docker run -it ubuntu /bin/bash<br>-it 옵션은 컨테이너 내부에서 명령어를 직접 입력하고 결과를 확인해야 하는 디버깅이나 개발 작업에 필수적이다. -d 옵션과는 상반되는 용도로, 포그라운드에서 대화형 세션을 유지한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>5.3. docker run 추가 옵션</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>자주 사용되는 옵션 외에도 다음과 같은 유용한 옵션들이 있다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>--rm</strong>: 컨테이너가 종료될 때 자동으로 삭제한다. 일회성 작업이나 테스트용 컨테이너에 유용하다.<br>docker run --rm busybox echo \"Task complete, removing container\"<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--link OTHER_CONTAINER_NAME:ALIAS</strong>: 다른 컨테이너와 네트워크 연결을 설정한다 (레거시 기능, 사용자 정의 네트워크 사용 권장). (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-e, --env-file FILE_PATH</strong>: 환경 변수가 정의된 파일로부터 환경 변수를 읽어와 컨테이너에 설정한다. (User Query)<br>docker run --env-file./env.list myapp<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--restart RESTART_POLICY</strong>: 컨테이너가 종료되었을 때 재시작 정책을 설정한다. (User Query) 예: --restart always (항상 재시작), --restart on-failure (오류로 종료 시 재시작).<br>docker run -d --restart always my_reliable_service<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--network NETWORK_NAME</strong>: 컨테이너가 속할 네트워크를 지정한다. (User Query) 기본 브리지 네트워크 대신 사용자 정의 네트워크에 연결할 때 사용한다.<br>docker run --network my_custom_network myapp<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--add-host HOSTNAME:IP_ADDRESS</strong>: 컨테이너 내부의 /etc/hosts 파일에 호스트 이름과 IP 주소 매핑을 추가한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-w, --workdir PATH</strong>: 컨테이너 내부의 작업 디렉토리를 설정한다. COMMAND가 이 디렉토리에서 실행된다. (docker exec에서도 사용)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어는 매우 강력하며, 위에 언급된 옵션 외에도 다양한 옵션들이 존재한다. docker run --help 명령어를 통해 모든 옵션과 설명을 확인할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>6. Docker 컨테이너 관리 심화</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>컨테이너를 실행한 후에는 컨테이너 내부와 상호작용하거나, 컨테이너의 생명주기를 보다 세밀하게 제어해야 하는 경우가 발생한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.1. 실행 중인 컨테이너에 명령어 전달: docker exec</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker exec 명령어는 이미 실행 중인 컨테이너 내부에서 새로운 명령어를 실행하는 데 사용된다. (User Query) 이는 컨테이너를 중지하거나 새로 시작하지 않고도 내부 상태를 확인하거나, 파일을 수정하거나, 추가적인 프로세스를 실행할 수 있게 해준다. docker run이 새로운 컨테이너를 생성하여 명령어를 실행하는 반면, docker exec는 기존 컨테이너의 네임스페이스 내에서 작동한다. 이 명령어는 컨테이너의 주 프로세스(PID 1)가 실행 중일 때만 작동하며, docker exec로 실행된 명령어는 컨테이너 재시작 시 자동으로 다시 실행되지 않는다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기본 구문:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec CONTAINER COMMAND<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>가장 일반적인 사용 사례는 실행 중인 컨테이너의 셸에 접근하는 것이다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec -it [container_name_or_id] /bin/bash<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) 또는 Alpine Linux와 같이 /bin/bash가 없는 최소 이미지의 경우 /bin/sh를 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec -it [container_name_or_id] sh<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>-i, --interactive: 표준 입력을 열린 상태로 유지한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-t, --tty: 가상 터미널을 할당한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-d, --detach: 명령어를 백그라운드에서 실행한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-e, --env KEY=VALUE: exec 프로세스에 대한 환경 변수를 설정한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-w, --workdir PATH: exec 프로세스가 실행될 컨테이너 내부의 작업 디렉토리를 지정한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>예를 들어, my_container라는 이름의 실행 중인 컨테이너 내부에 /tmp/execWorks라는 파일을 생성하는 명령어는 다음과 같다 (백그라운드 실행):</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec -d my_container touch /tmp/execWorks<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.2. 컨테이너에서 빠져나오기</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>-it 옵션으로 컨테이너의 셸에 접속한 경우, 다음 두 가지 방법으로 빠져나올 수 있다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>컨테이너를 종료하지 않고 빠져나오기</strong>: Ctrl+P를 누른 후 Ctrl+Q를 차례로 입력한다. (User Query) 이렇게 하면 컨테이너는 백그라운드에서 계속 실행된 상태로 현재 터미널 세션만 컨테이너에서 분리된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>컨테이너를 종료하면서 빠져나오기</strong>: 셸에서 exit 명령어를 입력하거나 Ctrl+D를 누른다. 또는 Ctrl+C를 사용하여 현재 실행 중인 포그라운드 프로세스(예: 셸)를 종료시킬 수 있으며, 이것이 컨테이너의 주 프로세스(PID 1)라면 컨테이너 자체가 종료될 수 있다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.3. 컨테이너 강제 종료: docker kill</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker stop 명령어가 컨테이너에 SIGTERM 신호를 보내 정상 종료를 시도하는 반면, docker kill [container_name_or_id] 명령어는 즉시 SIGKILL 신호를 보내 컨테이너를 강제로 종료시킨다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker kill my_ unresponsive_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) docker stop으로 컨테이너가 정상적으로 종료되지 않거나 즉각적인 종료가 필요할 때 사용된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.4. 모든 컨테이너 중지 및 삭제</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>모든 컨테이너 중지</strong>:<br>docker stop $(docker ps -a -q)<br>(User Query) 이 명령어는 실행 중인 컨테이너와 중지된 컨테이너 모두를 대상으로 stop 명령을 시도한다 (docker ps -a -q는 모든 컨테이너 ID를 반환). 실제로는 실행 중인 컨테이너만 중지된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>모든 컨테이너 삭제 (중지 후)</strong>: 먼저 모든 컨테이너를 중지한 후, 모든 컨테이너를 삭제한다.<br>docker stop $(docker ps -a -q)<br>docker rm $(docker ps -a -q)<br>이 두 명령어를 순차적으로 실행하면 시스템의 모든 컨테이너가 정리된다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>7. Docker 시스템 관리</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 장기간 사용하다 보면 이미지, 컨테이너, 볼륨, 네트워크 등 사용하지 않는 리소스들이 누적되어 디스크 공간을 불필요하게 차지할 수 있다. Docker는 이러한 리소스를 효율적으로 관리하고 시스템 상태를 점검할 수 있는 명령어들을 제공한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>7.1. Docker 디스크 사용량 확인: docker system df</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker system df 명령어는 Docker가 사용 중인 디스크 공간에 대한 요약 정보를 보여준다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system df<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력에는 이미지, 컨테이너, 로컬 볼륨, 빌드 캐시 각각에 대한 총 개수, 활성 개수, 사용 중인 크기, 그리고 회수 가능한 공간(unused and reclaimable space)이 표시된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>더 상세한 정보를 보려면 -v 또는 --verbose 옵션을 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system df -v<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 옵션은 각 이미지, 컨테이너, 볼륨별로 개별 크기와 회수 가능 여부 등의 자세한 정보를 제공하여 어떤 요소가 디스크 공간을 많이 차지하는지 파악하는 데 도움이 된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력 형식을 JSON으로 지정하여 스크립트나 다른 도구에서 파싱하기 용이하게 만들 수도 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system df --format json<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>7.2. 불필요한 Docker 리소스 정리: docker system prune</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker system prune 명령어는 사용하지 않는 Docker 리소스(중지된 컨테이너, 사용되지 않는 네트워크, 댕글링 이미지, 빌드 캐시)를 한 번에 정리하여 디스크 공간을 확보하는 데 매우 유용하다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 명령어를 실행하면 삭제될 대상과 함께 경고 메시지가 표시되며, 계속 진행할지 여부를 묻는다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune 명령어는 다음과 같은 주요 옵션들을 제공한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>-a, --all</strong>: 기본적으로 docker system prune은 댕글링 이미지(태그가 없고 다른 이미지의 부모도 아닌 이미지)만 삭제한다. -a 옵션을 추가하면 사용 중이지 않은 모든 이미지(태그가 있는 이미지 포함)까지 삭제 대상으로 포함한다.<br>docker system prune -a<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--volumes</strong>: 기본적으로 명명된 볼륨은 데이터 손실을 방지하기 위해 삭제되지 않는다. 이 옵션을 사용하면 사용 중이지 않은 볼륨(어떤 컨테이너에도 연결되지 않은 볼륨)도 함께 삭제한다. <strong>이 옵션은 중요한 데이터가 저장된 볼륨을 실수로 삭제할 수 있으므로 사용에 각별한 주의가 필요하다.</strong><br>docker system prune --volumes<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-f, --force</strong>: 사용자 확인 프롬프트를 생략하고 즉시 정리 작업을 수행한다. 스크립트나 자동화된 작업에 유용하다.<br>docker system prune -f<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--filter \"until=timestamp\"</strong>: 지정된 타임스탬프 이전에 생성된 리소스만 삭제 대상으로 필터링한다. Go duration 문자열(예: \"24h\", \"10m\")도 사용할 수 있다.<br>docker system prune --filter \"until=24h\"<br></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>가장 강력한 정리 명령어 중 하나는 다음과 같다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune --all --volumes -f<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) 이 명령어는 확인 절차 없이 중지된 모든 컨테이너, 사용되지 않는 모든 네트워크, 사용되지 않는 모든 이미지 (댕글링 이미지 포함), 사용되지 않는 모든 볼륨, 그리고 빌드 캐시를 삭제한다. Docker 환경을 초기 상태에 가깝게 정리할 수 있지만, 데이터 손실 위험이 크므로 신중하게 사용해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune 외에도 특정 리소스 타입별로 정리하는 명령어들이 존재한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker container prune: 중지된 모든 컨테이너 삭제.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker image prune: 댕글링 이미지 삭제. -a 옵션 사용 시 사용되지 않는 모든 이미지 삭제.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker volume prune: 사용되지 않는 로컬 볼륨 삭제 (기본적으로 익명 볼륨만, -a 옵션으로 명명된 볼륨 포함).</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker network prune: 사용되지 않는 네트워크 삭제.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>주기적으로 docker system df로 디스크 사용량을 확인하고, docker system prune 관련 명령어들을 적절히 사용하여 시스템을 깨끗하게 유지하는 것이 좋다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>8. Docker 컨테이너 내 Python 모듈 설치</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 사용하여 Python 애플리케이션을 컨테이너화할 때, 필요한 Python 모듈(패키지)을 이미지에 포함시키거나 실행 중인 컨테이너에 설치하는 방법을 이해하는 것이 중요하다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>8.1. Dockerfile을 이용한 Python 모듈 설치 (이미지 빌드 시)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Python 애플리케이션용 Docker 이미지를 빌드할 때, Dockerfile 내에서 pip 명령어를 사용하여 의존성 모듈을 설치하는 것이 일반적이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>기본 Python Dockerfile 구조 예시</strong>:<br># Use an official Python runtime as a parent image<br>FROM python:3.11-slim-bullseye<br><br># Set the working directory in the container<br>WORKDIR /usr/src/app<br><br># Copy the current directory contents into the container at /usr/src/app<br># For optimization, copy requirements.txt first and install dependencies<br>COPY requirements.txt./<br>RUN pip install --no-cache-dir -r requirements.txt<br><br># Copy the rest of the application code<br>COPY..<br><br># Make port 80 available to the world outside this container (if your app uses a port)<br># EXPOSE 80<br><br># Define environment variable (example)<br># ENV NAME World<br><br># Run app.py when the container launches<br>CMD [\"python\", \"your_app.py\"]<br>(Outline, based on common Python Dockerfile patterns)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>requirements.txt 파일을 사용한 모듈 설치</strong>: 가장 권장되는 방법은 requirements.txt 파일에 필요한 모든 모듈과 버전을 명시하고, 이를 Dockerfile에서 설치하는 것이다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>프로젝트 루트에 requirements.txt 파일을 생성하고 의존성을 나열한다. 예시 requirements.txt:<br>SomePackage==1.0.4<br>AnotherPackage&gt;=2.0<br>requests<br>(Outline, User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Dockerfile에서 requirements.txt 파일을 먼저 복사하고 pip install을 실행한다.<br>COPY requirements.txt./<br>RUN pip install --no-cache-dir -r requirements.txt<br>(Outline) --no-cache-dir 옵션은 pip 캐시를 저장하지 않아 이미지 크기를 줄이는 데 도움이 된다. (Outline)</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이러한 방식은 Docker의 빌드 캐시를 효율적으로 활용하는 데 매우 중요하다. Docker 이미지는 여러 계층(layer)으로 구성되며, Dockerfile의 각 명령어는 새로운 계층을 생성한다. Docker는 빌드 시 이전 빌드와 변경되지 않은 계층은 캐시에서 재사용한다. Python 애플리케이션의 의존성(requirements.txt)은 소스 코드 자체보다 변경 빈도가 낮다. 따라서 requirements.txt를 먼저 복사하고 의존성을 설치하는 계층을 만든 후, 애플리케이션 소스 코드를 복사하는 계층을 만들면, 소스 코드만 변경되었을 경우 의존성 설치 계층은 캐시에서 재사용되어 빌드 시간을 크게 단축할 수 있다. 만약 모든 파일을 한 번에 복사(COPY..)한 후 pip install을 실행하면, 코드의 작은 변경만으로도 의존성 설치 단계까지 캐시가 무효화되어 매번 새로 설치하게 된다. 이 원리는 Dockerfile 작성 시 빌드 최적화의 핵심 개념 중 하나이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Dockerfile에서 직접 pip install 실행 (단일 모듈 또는 특정 경우)</strong>: requirements.txt를 사용하지 않고 Dockerfile 내에서 직접 RUN 명령어로 pip를 실행하여 모듈을 설치할 수도 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>특정 버전 설치: RUN python -m pip install SomePackage==1.0.4 (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>업그레이드: RUN python -m pip install --upgrade SomePackage (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>최소 버전 지정: RUN python -m pip install \"SomePackage&gt;=1.0.4\" (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>8.2. 실행 중인 컨테이너에 Python 모듈 설치 (디버깅 및 테스트용)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>이미 실행 중인 컨테이너에 임시로 Python 모듈을 설치해야 할 경우, docker exec 명령어를 사용할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>먼저, 대상 컨테이너의 셸에 접속한다:<br>docker exec -it &lt;container_name_or_id&gt; /bin/bash<br>(Outline)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>컨테이너 내부 셸에서 pip 명령어를 사용하여 모듈을 설치한다:<br>python -m pip install SomePackage<br>(Outline) 또는 특정 버전:<br>python -m pip install SomePackage==1.2.3<br></li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>주의</strong>: 이 방법으로 설치된 모듈은 해당 컨테이너 인스턴스에만 적용되며, 컨테이너가 중지되고 삭제되면 변경 사항은 사라진다. 즉, 일시적인 변경이며 영구적이지 않다. 프로덕션 환경에서는 Dockerfile을 통해 이미지에 의존성을 포함시키는 것이 올바른 방법이다. 디버깅이나 빠른 테스트 목적으로만 사용하는 것이 좋다. 만약 이러한 변경 사항을 영구적으로 유지하고 싶다면 docker commit 명령어를 사용하여 새로운 이미지를 생성할 수 있지만, 이는 일반적으로 권장되지 않는 워크플로우이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>9. Ubuntu에서 Docker 사용 시 일반적인 문제 해결</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 사용하다 보면 몇 가지 일반적인 문제에 직면할 수 있다. 여기서는 자주 발생하는 포트 바인딩 오류와 볼륨 지정 오류에 대한 해결 방법을 설명한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>9.1. 포트 바인딩 오류</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>컨테이너 실행 시 -p 또는 --publish 옵션으로 포트를 매핑할 때, 호스트의 해당 포트가 이미 사용 중이면 오류가 발생한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>오류 메시지</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Error starting userland proxy: listen tcp 0.0.0.0:&lt;port_number&gt;: bind: address already in use</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Bind for 0.0.0.0:&lt;port_number&gt; failed: port is already allocated</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>원인 및 해결</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>\"address already in use\"</strong>: 이 오류는 Docker 컨테이너가 아닌 다른 프로세스가 호스트 머신의 해당 포트를 이미 사용하고 있을 때 발생한다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>진단</strong>: sudo lsof -i:&lt;port_number&gt; (예: sudo lsof -i:8080) 명령어를 사용하여 어떤 프로세스가 해당 포트를 점유하고 있는지 확인한다. 또는 sudo netstat -tulnp | grep &lt;port_number&gt; 또는 sudo ss -tulnp | grep &lt;port_number&gt; 명령어를 사용할 수도 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해결 방법 1: 충돌 프로세스 종료</strong>: 확인된 프로세스 ID(PID)를 sudo kill &lt;PID&gt; 명령어로 종료시킨다. 이후 Docker 컨테이너를 다시 실행한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해결 방법 2: 다른 호스트 포트 사용</strong>: Docker 컨테이너를 실행할 때, 호스트의 다른 사용 가능한 포트로 매핑한다. 예를 들어, 8080 포트가 사용 중이라면 8081 포트로 변경한다: docker run -p 8081:80....</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>\"port is already allocated\"</strong>: 이 오류는 다른 Docker 컨테이너가 이미 해당 호스트 포트를 사용하고 있을 때 발생한다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>진단</strong>: docker ps 명령어로 실행 중인 컨테이너 목록과 매핑된 포트를 확인하여 어떤 컨테이너가 해당 포트를 사용 중인지 찾는다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해결 방법</strong>: 충돌하는 기존 컨테이너를 중지(docker stop &lt;container_id&gt;)하거나, 새로 실행할 컨테이너에 다른 호스트 포트를 할당한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>오류로 인해 컨테이너 시작에 실패한 경우, 해당 컨테이너는 중지된 상태로 남아있을 수 있다. docker rm &lt;container_name_or_id&gt; 명령어로 불필요한 컨테이너를 정리하는 것이 좋다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>9.2. 볼륨 지정 오류</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어에서 -v 또는 --mount 옵션으로 볼륨을 마운트할 때 경로 지정 문제로 오류가 발생할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>오류 메시지</strong>: Error response from daemon: invalid volume specification: \"&lt;volume_string&gt;\"</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>주요 원인</strong>: 컨테이너 내부 마운트 경로를 절대 경로로 지정하지 않은 경우이다. Docker에서 호스트 OS와 컨테이너 간 디렉토리를 마운트할 때, 컨테이너 측 경로는 반드시 절대 경로여야 한다. 호스트 측 경로는 상대 경로일 수 있으며, 이 경우 Docker CLI가 실행되는 현재 작업 디렉토리를 기준으로 해석되거나 Docker 데몬의 특정 기본 경로를 기준으로 할 수 있다. 그러나 컨테이너 파일 시스템은 자체적으로 격리된 루트(/)를 가지므로, 컨테이너 내의 경로는 이 루트를 기준으로 명확하게 지정되어야 한다. 상대 경로를 사용하면 Docker가 컨테이너 내에서 정확한 마운트 지점을 결정할 수 없어 오류가 발생한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>잘못된 예시</strong>:<br>docker container run -v /abc/webap/:nginx/html...&nbsp; # 컨테이너 경로가 상대 경로<br>docker container run -v /abc/webap/:./nginx/html... # 컨테이너 경로가 상대 경로<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>올바른 예시</strong>:<br>docker container run -v /abc/webap:/nginx/html... # 컨테이너 경로가 절대 경로<br>또한, 호스트 경로가 실제로 존재하는지, 명명된 볼륨을 사용하는 경우 볼륨 이름의 구문이 올바른지 확인하는 것도 중요하다. 이러한 경로 해석의 미묘한 차이를 이해하는 것은 볼륨 마운트 관련 문제를 예방하고 신속하게 해결하는 데 도움이 된다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>10. Ubuntu Docker 보안 강화</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 프로덕션 환경에서 사용하거나 민감한 데이터를 다룰 때는 보안을 강화하는 것이 매우 중요하다. 다음은 Ubuntu에서 Docker 보안을 향상시키기 위한 주요 원칙과 방법들이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.1. Docker 보안 기본 원칙</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>최소 권한의 원칙 (Principle of Least Privilege)</strong>: 컨테이너와 사용자에게 필요한 최소한의 권한만 부여한다. 예를 들어, 컨테이너 내부에서 애플리케이션을 루트 사용자로 실행하지 않도록 한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>심층 방어 (Defense in Depth)</strong>: 단일 보안 계층에 의존하지 않고, 호스트, Docker 데몬, 이미지, 컨테이너, 네트워크 등 여러 계층에 걸쳐 보안 조치를 적용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>정기적인 업데이트</strong>: Docker Engine, 호스트 운영체제(Ubuntu), 사용 중인 모든 Docker 이미지를 최신 상태로 유지하여 알려진 취약점을 패치한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.2. 민감 데이터의 안전한 관리</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>애플리케이션 비밀번호, API 키, TLS 인증서와 같은 민감한 정보는 Docker 이미지에 직접 포함하거나 환경 변수를 통해 평문으로 전달하는 것을 피해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>환경 변수의 한계</strong>: 환경 변수(-e 또는 --env 옵션)는 간단하게 데이터를 전달할 수 있지만, 다음과 같은 보안적 약점이 있다 :</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker inspect &lt;container_id&gt; 명령어로 노출될 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>컨테이너 내부에서 실행되는 모든 프로세스가 접근할 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>로그 파일에 실수로 기록될 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>매우 민감한 데이터에는 적합하지 않다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Secrets (주로 Swarm 모드용)</strong>: Docker Secrets는 Docker Swarm 모드에서 민감한 데이터를 안전하게 관리하기 위해 설계된 기능이다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>개요</strong>: 비밀번호, API 키, TLS 인증서 등의 민감 데이터를 중앙에서 관리하고, 필요한 서비스(컨테이너)에만 안전하게 전달한다. 데이터는 전송 중 및 Swarm Raft 로그에 저장될 때 암호화된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>작동 방식</strong>: Secrets는 컨테이너 내부에 인메모리 파일 시스템으로 마운트된다 (Linux의 경우 기본적으로 /run/secrets/&lt;secret_name&gt;). 애플리케이션은 이 파일을 읽어 민감한 데이터를 사용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>중요 사항</strong>: Docker Secrets는 공식적으로 Swarm 서비스에서만 사용 가능하다. 독립 실행형 컨테이너에서 사용하려면 해당 컨테이너를 단일 노드 Swarm의 서비스로 실행해야 하는 번거로움이 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Secrets 생성</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>표준 입력(STDIN)으로부터: printf \"my_password\" | docker secret create my_db_password -</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>파일로부터: docker secret create my_site_cert /path/to/cert.pem</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>목록 확인: docker secret ls</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>상세 정보 확인: docker secret inspect &lt;secret_name&gt;</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>삭제: docker secret rm &lt;secret_name&gt; (실행 중인 서비스에서 사용 중이면 삭제 불가)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>서비스에서 Secrets 사용</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker service create 사용 시: docker service create --name myservice --secret my_secret_data myimage</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-compose.yml 파일 ( docker stack deploy 용):<br>version: \'3.8\' # 또는 secrets를 지원하는 최신 버전<br>services:<br>&nbsp; myapp:<br>&nbsp; &nbsp; image: myapp_image<br>&nbsp; &nbsp; secrets:<br>&nbsp; &nbsp; &nbsp; - db_password # 짧은 구문: secret 이름 \'db_password\', 컨테이너 내 경로 /run/secrets/db_password<br>&nbsp; &nbsp; &nbsp; # - source: app_config_secret # 긴 구문 예시<br>&nbsp; &nbsp; &nbsp; # &nbsp; target: /etc/app/config<br>&nbsp; &nbsp; &nbsp; # &nbsp; uid: \'1000\'<br>&nbsp; &nbsp; &nbsp; # &nbsp; gid: \'1000\'<br>&nbsp; &nbsp; &nbsp; # &nbsp; mode: 0400<br>&nbsp; &nbsp; environment:<br>&nbsp; &nbsp; &nbsp; # 애플리케이션이 이 파일에서 비밀번호를 읽도록 설정<br>&nbsp; &nbsp; &nbsp; DB_PASSWORD_FILE: /run/secrets/db_password<br>secrets:<br>&nbsp; db_password:<br>&nbsp; &nbsp; file:./db_password.txt # 호스트의 로컬 파일에서 secret 값 로드<br>&nbsp; # app_config_secret:<br>&nbsp; # &nbsp; external: true # Swarm에 이미 secret이 존재하는 경우<br>애플리케이션 코드는 환경 변수(예: DB_PASSWORD_FILE)가 가리키는 파일 경로에서 실제 secret 값을 읽도록 수정되어야 한다. 예를 들어, 공식 MySQL 이미지는 MYSQL_ROOT_PASSWORD_FILE 환경 변수를 통해 파일에서 비밀번호를 읽는 기능을 지원한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>Docker Secrets는 Swarm 환경에서 편리하고 통합된 민감 데이터 관리 방법을 제공하지만, 모든 시나리오에 적합한 것은 아니다. 독립 실행형 컨테이너나 Kubernetes와 같은 다른 오케스트레이션 환경에서는 HashiCorp Vault , AWS Secrets Manager, Azure Key Vault와 같은 외부 전용 시크릿 관리 도구를 고려하는 것이 좋다. 이는 Docker가 제공하는 기본 기능 외에, 조직의 요구사항이나 기존 인프라에 따라 더 강력하고 중앙화된 솔루션을 선택할 수 있음을 시사한다. 즉, 시크릿 관리 전략은 배포 모델과 조직의 보안 정책에 따라 계층적으로 접근해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>외부 시크릿 관리 도구</strong>: HashiCorp Vault와 같은 도구는 보다 정교한 시크릿 관리, 접근 제어, 감사 로깅 기능을 제공하며, 다양한 환경과 통합될 수 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.3. 컨테이너화된 웹 애플리케이션 SSL/TLS 적용</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>웹 애플리케이션을 Docker 컨테이너로 배포할 때, 클라이언트와 서버 간의 통신을 암호화하기 위해 SSL/TLS를 적용하는 것은 필수적이다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>일반적인 패턴: Nginx 리버스 프록시와 SSL 종료 (SSL Termination)</strong> Nginx 컨테이너가 HTTPS (443 포트) 요청을 수신하여 SSL/TLS 핸드셰이크를 처리하고, 암호화된 트래픽을 복호화한 후 내부 네트워크를 통해 HTTP로 애플리케이션 컨테이너(예: Node.js, Python 앱)에 전달하는 방식이 널리 사용된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>SSL/TLS 인증서 생성</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>자체 서명 인증서 (개발/테스트용)</strong>: OpenSSL 등을 사용하여 생성할 수 있다. 브라우저에서 기본적으로 신뢰하지 않으므로 경고가 표시된다.<br># 1. OpenSSL 설정 파일 준비 (예: my-site.conf [span_184](start_span)[span_184](end_span))<br># 2. 개인 키 및 인증서 생성<br>openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout my-site.key -out my-site.crt -config my-site.conf<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Let\'s Encrypt (프로덕션용)</strong>: 무료이며 자동화된 방식으로 신뢰할 수 있는 인증서를 발급받을 수 있다. Certbot과 같은 클라이언트를 사용하며, 도메인 소유권 검증이 필요하다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Nginx SSL 설정</strong>: Nginx 설정 파일 (nginx.conf)에 SSL 관련 지시어를 추가한다. 예시 nginx.conf 일부:<br>server {<br>&nbsp; &nbsp; listen 80;<br>&nbsp; &nbsp; server_name your_domain.com;<br>&nbsp; &nbsp; location / {<br>&nbsp; &nbsp; &nbsp; &nbsp; return 301 https://$host$request_uri; # HTTP를 HTTPS로 리디렉션<br>&nbsp; &nbsp; }<br>}<br><br>server {<br>&nbsp; &nbsp; listen 443 ssl;<br>&nbsp; &nbsp; server_name your_domain.com;<br><br>&nbsp; &nbsp; ssl_certificate /etc/ssl/certs/my-site.crt; &nbsp; &nbsp; &nbsp; # Nginx 컨테이너 내부의 인증서 경로<br>&nbsp; &nbsp; ssl_certificate_key /etc/ssl/private/my-site.key; # Nginx 컨테이너 내부의 개인 키 경로<br><br>&nbsp; &nbsp; # 추가적인 SSL 설정 (프로토콜, 암호화 스위트 등)<br>&nbsp; &nbsp; # ssl_protocols TLSv1.2 TLSv1.3;<br>&nbsp; &nbsp; # ssl_ciphers \'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...\';<br><br>&nbsp; &nbsp; location / {<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://app_container_name:app_port; # 업스트림 애플리케이션 컨테이너<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host $host;<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-Proto $scheme;<br>&nbsp; &nbsp; }<br>}<br>Nginx용 Dockerfile에서는 이 설정 파일과 인증서/키 파일을 이미지에 복사하거나, 볼륨 또는 Docker Secrets(Swarm 사용 시)를 통해 마운트할 수 있다.<br>FROM nginx:latest<br>COPY nginx.conf /etc/nginx/nginx.conf<br>COPY my-site.crt /etc/ssl/certs/my-site.crt<br>COPY my-site.key /etc/ssl/private/my-site.key<br>Docker Compose를 사용하면 Nginx와 애플리케이션 컨테이너를 함께 정의하고 관리하기 용이하다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.4. 주요 Docker 보안 모범 사례</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>다음은 Docker 환경의 보안을 강화하기 위한 핵심적인 모범 사례들이다. 이러한 관행들은 개발 초기 단계부터 보안을 고려하는 \"Shift Left\" 접근 방식을 반영하며, 이는 단순히 런타임 설정뿐만 아니라 이미지 생성 및 관리 전반에 걸친 지속적인 노력을 포함한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>컨테이너를 비루트(non-root) 사용자로 실행</strong>: 기본적으로 컨테이너는 내부에서 루트 사용자로 실행될 수 있으며, 이는 컨테이너가 손상될 경우 심각한 보안 위협이 될 수 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Dockerfile에서 USER &lt;non_root_user&gt;[:&lt;group&gt;] 지시어를 사용하여 컨테이너 실행 사용자를 지정한다. 필요한 경우 먼저 사용자와 그룹을 생성해야 한다 (예: RUN groupadd -r appgroup &amp;&amp; useradd -r -g appgroup appuser).</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker run 명령어 실행 시 -u &lt;username_or_UID&gt; 옵션을 사용할 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최소한의 기본 이미지 사용</strong>: 이미지 크기를 줄이고 불필요한 구성 요소 및 종속성을 제거하여 공격 표면을 최소화한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>alpine, busybox와 같은 경량 이미지나 Google의 distroless 이미지(예: gcr.io/distroless/static-debian11)를 사용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>이미지 정기적 취약점 스캔</strong>: 이미지에 포함된 소프트웨어 패키지의 알려진 취약점을 탐지하고 수정한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker scan &lt;image_name&gt; (Snyk 또는 Docker Scout 기반) 명령어를 사용하거나, Trivy, Clair와 같은 오픈소스 스캐너를 활용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>CI/CD 파이프라인에 이미지 스캔 단계를 통합하여 자동화한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>신뢰할 수 있는 레지스트리(예: Docker Hub 유료 플랜, Harbor)의 내장 스캔 기능을 활용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>컨테이너 리소스 사용량 제한</strong>: 단일 컨테이너가 과도한 시스템 리소스(CPU, 메모리)를 사용하여 서비스 거부(DoS) 공격을 유발하거나 다른 컨테이너의 성능에 영향을 미치는 것을 방지한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker run 명령어의 --memory &lt;limit&gt;, --cpus &lt;limit&gt;, --pids-limit 등의 옵션을 사용하여 리소스를 제한한다. 이는 Linux의 cgroups 기능을 통해 구현된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>보안 컨테이너 레지스트리 사용 및 관리</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Docker Hub의 공식 이미지나 검증된 게시자의 이미지를 우선적으로 사용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>자체 레지스트리를 운영하는 경우, TLS를 사용하여 통신을 암호화하고, 역할 기반 접근 제어(RBAC)를 구현하여 이미지 접근 권한을 관리한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>네트워크 분리 및 API 보안</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>사용자 정의 네트워크를 생성하여 컨테이너 간 통신을 격리하고, 필요한 경우에만 서로 통신하도록 허용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker 데몬 API 접근을 엄격히 제어하고, 가능하면 네트워크에 노출하지 않는다. 원격 접근이 필요하다면 TLS로 암호화하고 인증을 적용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 데몬 및 호스트 OS 최신 상태 유지</strong>:</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Engine 자체와 호스트 운영체제의 커널 및 관련 패키지에 대한 보안 업데이트를 정기적으로 적용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Dockerfile 및 애플리케이션 코드 정적 분석</strong>:</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Hadolint, SonarQube와 같은 도구를 사용하여 Dockerfile의 잠재적인 보안 문제나 비효율적인 구성을 검사하고, 애플리케이션 코드의 보안 취약점을 분석한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 데몬 루트리스(Rootless) 모드 사용 (고급)</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Docker 데몬과 컨테이너를 일반 사용자로 실행하여 보안을 크게 향상시킨다. 호스트 시스템에 대한 잠재적 위험을 줄일 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>dockerd-rootless-setuptool.sh install 스크립트를 사용하여 설정할 수 있다. 일부 기능 제한이 있을 수 있으나, 점차 개선되고 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이러한 보안 관행들을 체계적으로 적용하면 Docker 환경의 전반적인 보안 수준을 크게 높일 수 있다. 다음 표는 주요 보안 모범 사례를 요약한 것이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>표 10.1: Docker 보안 모범 사례 체크리스트</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>카테고리</th><th>모범 사례</th><th>근거/이점</th><th>구현 방법 (간략히)</th></tr></thead><tbody><tr><td><strong>이미지 보안</strong></td><td>최소 기본 이미지 사용</td><td>공격 표면 감소, 이미지 크기 최적화</td><td>alpine, distroless 등 사용</td></tr><tr><td></td><td>이미지 취약점 스캔</td><td>알려진 취약점 사전 탐지 및 완화</td><td>docker scan, Trivy, Clair 등 CI/CD 통합</td></tr><tr><td></td><td>신뢰할 수 있는 이미지 소스 사용</td><td>악성 코드나 변조된 이미지 위험 감소</td><td>Docker Hub 공식 이미지, 검증된 게시자, 자체 보안 레지스트리 사용</td></tr><tr><td></td><td>멀티스테이지 빌드 활용</td><td>최종 이미지에서 빌드 도구 및 불필요한 아티팩트 제거, 이미지 크기 최적화</td><td>Dockerfile에서 여러 FROM 문 사용</td></tr><tr><td><strong>컨테이너 런타임 보안</strong></td><td>비루트 사용자로 컨테이너 실행</td><td>컨테이너 탈출 시 호스트 시스템 피해 최소화 (최소 권한 원칙)</td><td>Dockerfile에 USER 지시어 사용, docker run -u 옵션</td></tr><tr><td></td><td>리소스 사용량 제한</td><td>DoS 공격 방지, 시스템 안정성 확보</td><td>docker run 시 --memory, --cpus 등 옵션 사용</td></tr><tr><td></td><td>읽기 전용 루트 파일 시스템 사용</td><td>컨테이너 내부 파일 시스템 변경 방지, 불변성 강화</td><td>docker run --read-only 옵션 사용 (쓰기 가능한 tmpfs 마운트 필요할 수 있음)</td></tr><tr><td></td><td>AppArmor/Seccomp 프로파일 적용</td><td>컨테이너의 시스템 콜 제한, 커널 수준 보안 강화</td><td>Docker 기본 프로파일 사용 또는 사용자 정의 프로파일 적용</td></tr><tr><td><strong>호스트 및 데몬 보안</strong></td><td>호스트 OS 및 Docker Engine 최신 상태 유지</td><td>알려진 취약점 패치</td><td>정기적인 시스템 업데이트 및 Docker 버전 업그레이드</td></tr><tr><td></td><td>Docker 데몬 API 접근 제어</td><td>무단 접근 및 데몬 제어 방지</td><td>Unix 소켓 사용 권장, TCP 소켓 사용 시 TLS 인증 적용</td></tr><tr><td></td><td>루트리스 모드 사용 (가능한 경우)</td><td>데몬 및 컨테이너를 비루트 사용자로 실행하여 호스트 보안 강화</td><td>dockerd-rootless-setuptool.sh 사용</td></tr><tr><td><strong>데이터 보안</strong></td><td>민감 데이터 Docker Secrets 사용 (Swarm)</td><td>비밀번호, API 키 등을 안전하게 관리 및 컨테이너에 전달</td><td>docker secret create, 서비스 정의 시 secrets 블록 사용</td></tr><tr><td></td><td>외부 시크릿 관리 도구 활용</td><td>Swarm 외부 환경 또는 고급 시크릿 관리 요구사항 충족</td><td>HashiCorp Vault, AWS Secrets Manager 등 연동</td></tr><tr><td></td><td>볼륨 데이터 암호화 (필요시)</td><td>저장된 데이터 보호</td><td>호스트 수준 디스크 암호화 (예: LUKS) 또는 애플리케이션 수준 암호화</td></tr><tr><td><strong>네트워크 보안</strong></td><td>사용자 정의 네트워크로 컨테이너 분리</td><td>불필요한 컨테이너 간 통신 차단, 네트워크 세분화</td><td>docker network create, 컨테이너 실행 시 --network 옵션 사용</td></tr><tr><td></td><td>웹 애플리케이션에 SSL/TLS 적용</td><td>클라이언트-서버 간 통신 암호화</td><td>리버스 프록시(Nginx 등)에서 SSL 종료, Let\'s Encrypt 등 사용</td></tr><tr><td></td><td>불필요한 포트 노출 최소화</td><td>공격 표면 감소</td><td>Dockerfile의 EXPOSE는 문서화 목적, docker run -p로 실제 필요한 포트만 매핑</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>11. 결론 및 추가 자료</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>본 매뉴얼은 Ubuntu 24.04 LTS 환경에서 Docker를 설치하고 기본적인 사용법부터 컨테이너 관리, 시스템 유지보수, Python 애플리케이션 컨테이너화, 일반적인 문제 해결, 그리고 보안 강화 방안에 이르기까지 포괄적인 내용을 다루었다. Docker는 개발 환경의 일관성을 제공하고, 배포 프로세스를 단순화하며, 마이크로서비스 아키텍처 구현을 용이하게 하는 등 현대 애플리케이션 개발 및 운영에 있어 강력하고 유연한 도구임이 확인되었다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>특히, Dockerfile 최적화, 리소스 관리, 보안 모범 사례 적용은 안정적이고 효율적인 Docker 활용을 위해 매우 중요하다. 예를 들어, requirements.txt를 활용한 의존성 관리와 Docker 빌드 캐시의 이해는 이미지 빌드 시간을 단축시키며, docker system prune과 같은 명령어를 통한 주기적인 시스템 정리는 디스크 공간을 효율적으로 관리하는 데 기여한다. 또한, Docker Secrets나 SSL/TLS 적용과 같은 보안 조치는 민감한 데이터를 보호하고 안전한 서비스를 운영하는 데 필수적이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Docker의 세계는 방대하며, 본 매뉴얼에서 다룬 내용은 그 시작점에 해당한다. 사용자의 숙련도와 요구사항에 따라 더 많은 고급 기능과 개념을 학습할 필요가 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>추가 학습을 위한 자료</strong>:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Docker 공식 문서 (Docker Docs)</strong>: <a href=\"https://docs.docker.com/\">https://docs.docker.com/</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>가장 정확하고 최신의 정보를 제공하는 기본 자료이다. 설치, 명령어 레퍼런스, 네트워킹, 스토리지, 보안 등 모든 주제를 망라한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Hub</strong>: <a href=\"https://hub.docker.com/\">https://hub.docker.com/</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>수많은 공식 및 커뮤니티 제공 Docker 이미지를 검색하고 공유할 수 있는 레지스트리이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 커뮤니티 포럼 (Docker Community Forums)</strong>: <a href=\"https://forums.docker.com/\">https://forums.docker.com/</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>다른 Docker 사용자와 질문을 주고받거나 문제 해결 방법을 논의할 수 있는 공간이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>관련 GitHub 저장소</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Docker Engine: <a href=\"https://github.com/moby/moby\">https://github.com/moby/moby</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Compose: <a href=\"https://github.com/docker/compose\">https://github.com/docker/compose</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>향후 탐색해 볼 고급 주제</strong>:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Docker Compose</strong>: YAML 파일을 사용하여 다중 컨테이너 애플리케이션을 정의하고 실행하는 도구이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Swarm 및 Kubernetes</strong>: 컨테이너 오케스트레이션 도구로, 여러 호스트에 걸쳐 컨테이너화된 애플리케이션을 배포, 확장, 관리하는 기능을 제공한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>고급 네트워킹</strong>: 오버레이 네트워크, 맥브랜(macvlan) 네트워크 등 다양한 네트워크 드라이버와 구성 방법을 이해한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최적화된 멀티스테이지 Dockerfile 빌드</strong>: 빌드 컨텍스트를 줄이고 최종 이미지 크기를 최소화하기 위한 고급 Dockerfile 작성 기법이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>루트리스 Docker (Rootless Docker)</strong>: 보안을 강화하기 위해 Docker 데몬과 컨테이너를 일반 사용자로 실행하는 방법이다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>꾸준한 학습과 실습을 통해 Docker의 강력한 기능을 최대한 활용하여 개발 및 운영 효율성을 높일 수 있기를 바란다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>참고 자료</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"https://docs.docker.com/engine/install/ubuntu\">https://docs.docker.com/engine/install/ubuntu</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to Install Docker on Ubuntu 22.04 and 24.04 - phoenixNAP, <a href=\"https://phoenixnap.com/kb/install-docker-ubuntu\">https://phoenixnap.com/kb/install-docker-ubuntu</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Ubuntu | Docker Docs, <a href=\"https://docs.docker.com/engine/install/ubuntu/\">https://docs.docker.com/engine/install/ubuntu/</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to Install Docker on Ubuntu 24.04 | Vultr Docs, <a href=\"https://docs.vultr.com/how-to-install-docker-on-ubuntu-24-04 \">https://docs.vultr.com/how-to-install-docker-on-ubuntu-24-04 </a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How To Remove Docker Images, Containers, and Volumes ..., <a href=\"https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes\">https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Simplifying Containerization With Docker Run Command - BuildPiper, <a href=\"https://www.buildpiper.io/blogs/simplifying-containerization-with-docker-run-command/\">https://www.buildpiper.io/blogs/simplifying-containerization-with-docker-run-command/</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Running containers | Docker Docs, <a href=\"https://docs.docker.com/engine/containers/run/ \">https://docs.docker.com/engine/containers/run/ </a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker container exec, <a href=\"https://docs.docker.com/reference/cli/docker/container/exec/ \">https://docs.docker.com/reference/cli/docker/container/exec/ </a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Prune: A Complete Guide with Hands-On Examples - DataCamp, https://www.datacamp.com/tutorial/docker-prune </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Tidy up with docker system prune - Depot, https://depot.dev/blog/docker-system-prune </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to use docker system df command to check disk usage - LabEx, https://labex.io/tutorials/docker-how-to-use-docker-system-df-command-to-check-disk-usage-555247 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker system - Docker Docs, https://docs.docker.com/reference/cli/docker/system/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Error Bind: Address Already in Use | Baeldung on Linux, https://www.baeldung.com/linux/docker-address-already-in-use </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>[Docker CE] 도커 디렉토리 마운트 설정 에러 (Error response from ..., https://nirsa.tistory.com/54 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Security: 5 Risks and 5 Best Practices for Securing Your Containers - Tigera.io, https://www.tigera.io/learn/guides/container-security-best-practices/docker-security/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Container Security Best Practices for Modern Applications - Wiz, https://www.wiz.io/academy/docker-container-security-best-practices </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Are there any comprehensive beginner-friendly guides to secure Docker or should I just switch to Podman? - Reddit, https://www.reddit.com/r/selfhosted/comments/1iwkul6/are_there_any_comprehensive_beginnerfriendly/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Securing Passwords in Docker | Baeldung on Ops, https://www.baeldung.com/ops/docker-securing-passwords </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Manage sensitive data with Docker secrets | Docker Docs, https://docs.docker.com/engine/swarm/secrets/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to use secrets in Docker Compose, https://docs.docker.com/compose/how-tos/use-secrets/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker secret create - Docker Docs, https://docs.docker.com/reference/cli/docker/secret/create/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to secure a Docker registry with SSL/TLS encryption - LabEx, https://labex.io/tutorials/docker-how-to-secure-a-docker-registry-with-ssl-tls-encryption-411601 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Securing Docker Containers with SSL/TLS Certificates - GlobalSign, https://www.globalsign.com/en/blog/securing-docker-containers-ssl-tls-certificates </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>SSL with Docker images using nginx as reverse proxy - GitHub Gist, https://gist.github.com/dahlsailrunner/679e6dec5fd769f30bce90447ae80081 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How To Secure a Containerized Node.js Application with Nginx, Let\'s Encrypt, and Docker Compose | DigitalOcean, https://www.digitalocean.com/community/tutorials/how-to-secure-a-containerized-node-js-application-with-nginx-let-s-encrypt-and-docker-compose</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->','Docker 설치 및 활용','','inherit','closed','closed','','18-revision-v1','','','2025-10-13 20:41:13','2025-10-13 11:41:13','',18,'https://rndpolicy.org/aidev/?p=67',0,'revision','',0),
(69,1,'2025-10-16 12:27:01','2025-10-16 03:27:01','<!-- wp:paragraph -->\n<p>생산기술연구원의 AI 전환을 위해 지혜를 모으기 위한 지식 공유 공간입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:betterdocs/categorygrid {\"blockId\":\"betterdocs-categorygrid-y5d0in7\",\"blockMeta\":{\"desktop\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{  background-color: rgba(255, 255, 255, 0);   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper{ \\u002d\\u002dcolumn: 3; margin-top: 28px; margin-right: 0px; margin-left: 0px; margin-bottom: 28px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.masonry \\u003e .betterdocs-single-category-wrapper{ margin-bottom:10px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title a{ color: #528ffe; font-size: 20px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{  padding-top: 0px; padding-right: 0px; padding-left: 0px; padding-bottom: 20px;  border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 2px; border-color: #528ffe; border-style: solid;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{  font-size: 15px; color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{ min-height:30px;min-width:30px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{  background-color: #528ffe;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after{ border-top-color: rgb(173, 94, 98); }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ color: #528ffe; font-size: 16px;  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-footer{ text-align: left; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-articles-list li:not(.betterdocs-nested-category-wrapper) a{  font-size: 15px; color: #566e8b; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li i, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper i{ font-size:15px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li img, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper img{ height:15px;width:15px; }\",\"tab\":\"\",\"mobile\":\"\",\"desktopHover\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span:hover{ color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after:hover{ border-top-color: rgb(173, 94, 98); }\",\"tabHover\":\"\",\"mobileHover\":\"\",\"extraStyles\":\" .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{ transition: border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{ transition:background 0.5s; }\"}} /-->','AI app development','','inherit','closed','closed','','62-revision-v1','','','2025-10-16 12:27:01','2025-10-16 03:27:01','',62,'https://rndpolicy.org/aidev/?p=69',0,'revision','',0),
(70,1,'2025-10-16 12:30:35','2025-10-16 03:30:35','','front_image2','','inherit','open','closed','','front_image2','','','2025-10-16 12:30:35','2025-10-16 03:30:35','',62,'https://rndpolicy.org/aidev/wp-content/uploads/2025/10/front_image2.png',0,'attachment','image/png',0),
(71,1,'2025-10-16 12:30:39','2025-10-16 03:30:39','<!-- wp:paragraph -->\n<p>생산기술연구원의 AI 전환을 위해 지혜를 모으기 위한 지식 공유 공간입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":70,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://rndpolicy.org/aidev/wp-content/uploads/2025/10/front_image2.png\" alt=\"\" class=\"wp-image-70\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:betterdocs/categorygrid {\"blockId\":\"betterdocs-categorygrid-y5d0in7\",\"blockMeta\":{\"desktop\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{  background-color: rgba(255, 255, 255, 0);   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper{ \\u002d\\u002dcolumn: 3; margin-top: 28px; margin-right: 0px; margin-left: 0px; margin-bottom: 28px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.masonry \\u003e .betterdocs-single-category-wrapper{ margin-bottom:10px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title a{ color: #528ffe; font-size: 20px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{  padding-top: 0px; padding-right: 0px; padding-left: 0px; padding-bottom: 20px;  border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 2px; border-color: #528ffe; border-style: solid;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{  font-size: 15px; color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{ min-height:30px;min-width:30px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{  background-color: #528ffe;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after{ border-top-color: rgb(173, 94, 98); }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ color: #528ffe; font-size: 16px;  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-footer{ text-align: left; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-articles-list li:not(.betterdocs-nested-category-wrapper) a{  font-size: 15px; color: #566e8b; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li i, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper i{ font-size:15px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li img, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper img{ height:15px;width:15px; }\",\"tab\":\"\",\"mobile\":\"\",\"desktopHover\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span:hover{ color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after:hover{ border-top-color: rgb(173, 94, 98); }\",\"tabHover\":\"\",\"mobileHover\":\"\",\"extraStyles\":\" .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{ transition: border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{ transition:background 0.5s; }\"}} /-->','AI app development','','inherit','closed','closed','','62-revision-v1','','','2025-10-16 12:30:39','2025-10-16 03:30:39','',62,'https://rndpolicy.org/aidev/?p=71',0,'revision','',0),
(72,1,'2025-10-16 12:31:43','2025-10-16 03:31:43','<!-- wp:paragraph -->\n<p>한국생산기술연구원의 AI 전환을 위해 지혜를 모으기 위한 지식 공유 공간입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":70,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://rndpolicy.org/aidev/wp-content/uploads/2025/10/front_image2.png\" alt=\"\" class=\"wp-image-70\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:betterdocs/categorygrid {\"blockId\":\"betterdocs-categorygrid-y5d0in7\",\"blockMeta\":{\"desktop\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{  background-color: rgba(255, 255, 255, 0);   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper{ \\u002d\\u002dcolumn: 3; margin-top: 28px; margin-right: 0px; margin-left: 0px; margin-bottom: 28px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.masonry \\u003e .betterdocs-single-category-wrapper{ margin-bottom:10px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title a{ color: #528ffe; font-size: 20px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{  padding-top: 0px; padding-right: 0px; padding-left: 0px; padding-bottom: 20px;  border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 2px; border-color: #528ffe; border-style: solid;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{  font-size: 15px; color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{ min-height:30px;min-width:30px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{  background-color: #528ffe;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after{ border-top-color: rgb(173, 94, 98); }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ color: #528ffe; font-size: 16px;  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-footer{ text-align: left; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-articles-list li:not(.betterdocs-nested-category-wrapper) a{  font-size: 15px; color: #566e8b; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li i, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper i{ font-size:15px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li img, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper img{ height:15px;width:15px; }\",\"tab\":\"\",\"mobile\":\"\",\"desktopHover\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span:hover{ color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after:hover{ border-top-color: rgb(173, 94, 98); }\",\"tabHover\":\"\",\"mobileHover\":\"\",\"extraStyles\":\" .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{ transition: border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{ transition:background 0.5s; }\"}} /-->','AI app development','','inherit','closed','closed','','62-revision-v1','','','2025-10-16 12:31:43','2025-10-16 03:31:43','',62,'https://rndpolicy.org/aidev/?p=72',0,'revision','',0),
(74,1,'2025-10-16 16:11:17','2025-10-16 07:11:17','{\n    \"hello-elementor::nav_menu_locations[menu-1]\": {\n        \"value\": 10,\n        \"type\": \"theme_mod\",\n        \"user_id\": 1,\n        \"date_modified_gmt\": \"2025-10-16 07:11:17\"\n    }\n}','','','trash','closed','closed','','a407e261-13e5-4546-b9a4-a1d681a40c14','','','2025-10-16 16:11:17','2025-10-16 07:11:17','',0,'https://rndpolicy.org/aidev/a407e261-13e5-4546-b9a4-a1d681a40c14/',0,'customize_changeset','',0),
(75,1,'2025-10-24 10:44:01','2025-10-16 07:13:28','','지식관리','','publish','closed','closed','','%ec%a7%80%ec%8b%9d%ea%b4%80%eb%a6%ac','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=75',1,'nav_menu_item','',0),
(76,1,'2025-10-24 10:44:01','2025-10-16 07:13:28','','매뉴얼','','publish','closed','closed','','%eb%a7%a4%eb%89%b4%ec%96%bc','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=76',2,'nav_menu_item','',0),
(77,1,'2025-10-16 16:15:09','2025-10-16 07:15:09','<!-- wp:paragraph -->\n<p>한국생산기술연구원의 AI 전환을 위해 지혜를 모으기 위한 지식 공유 공간입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":70,\"sizeSlug\":\"full\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-full\"><img src=\"https://rndpolicy.org/aidev/wp-content/uploads/2025/10/front_image2.png\" alt=\"\" class=\"wp-image-70\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:betterdocs/categorygrid {\"blockId\":\"betterdocs-categorygrid-y5d0in7\",\"blockMeta\":{\"desktop\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{  background-color: rgba(255, 255, 255, 0);   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper{ \\u002d\\u002dcolumn: 3; margin-top: 28px; margin-right: 0px; margin-left: 0px; margin-bottom: 28px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.masonry \\u003e .betterdocs-single-category-wrapper{ margin-bottom:10px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-title a{ color: #528ffe; font-size: 20px;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{  padding-top: 0px; padding-right: 0px; padding-left: 0px; padding-bottom: 20px;  border-top-width: 0px; border-right-width: 0px; border-left-width: 0px; border-bottom-width: 2px; border-color: #528ffe; border-style: solid;  }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{  font-size: 15px; color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span{ min-height:30px;min-width:30px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{  background-color: #528ffe;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after{ border-top-color: rgb(173, 94, 98); }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ color: #528ffe; font-size: 16px;  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-footer{ text-align: left; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-articles-list li:not(.betterdocs-nested-category-wrapper) a{  font-size: 15px; color: #566e8b; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{  background-color: #ffffff;   }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li i, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper i{ font-size:15px; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list li img, .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body .betterdocs-articles-list .betterdocs-nested-category-wrapper img{ height:15px;width:15px; }\",\"tab\":\"\",\"mobile\":\"\",\"desktopHover\":\".betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.default .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span,.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper.layout-2 .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-category-items-counts span:hover{ color: #ffffff; }.betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper.layout-2 .betterdocs-category-items-counts:after:hover{ border-top-color: rgb(173, 94, 98); }\",\"tabHover\":\"\",\"mobileHover\":\"\",\"extraStyles\":\" .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header{ transition:background 0.5s; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-header .betterdocs-category-header-inner{ transition: border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-category-items-counts{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-single-category-inner .betterdocs-footer a.betterdocs-category-link-btn{ transition:background 0.5s,  border 0.5s, border-radius 0.5s, box-shadow 0.5s ; } .betterdocs-categorygrid-y5d0in7.betterdocs-category-grid-wrapper .betterdocs-category-grid-inner-wrapper .betterdocs-single-category-wrapper .betterdocs-body{ transition:background 0.5s; }\"}} /-->','Home','','inherit','closed','closed','','62-revision-v1','','','2025-10-16 16:15:09','2025-10-16 07:15:09','',62,'https://rndpolicy.org/aidev/?p=77',0,'revision','',0),
(78,1,'2025-10-16 16:17:15','2025-10-16 07:17:15','','Default Registration','','publish','closed','closed','','default-registration','','','2025-10-16 16:17:15','2025-10-16 07:17:15','',0,'https://rndpolicy.org/aidev/um_form/default-registration/',0,'um_form','',0),
(79,1,'2025-10-16 16:17:15','2025-10-16 07:17:15','','Default Login','','publish','closed','closed','','default-login','','','2025-10-16 16:17:15','2025-10-16 07:17:15','',0,'https://rndpolicy.org/aidev/um_form/default-login/',0,'um_form','',0),
(80,1,'2025-10-16 16:17:15','2025-10-16 07:17:15','','Default Profile','','publish','closed','closed','','default-profile','','','2025-10-16 16:17:15','2025-10-16 07:17:15','',0,'https://rndpolicy.org/aidev/um_form/default-profile/',0,'um_form','',0),
(81,1,'2025-10-16 16:17:15','2025-10-16 07:17:15','','Members','','publish','closed','closed','','members','','','2025-10-16 16:17:15','2025-10-16 07:17:15','',0,'https://rndpolicy.org/aidev/?p=81',0,'um_directory','',0),
(82,1,'2025-10-16 16:21:01','2025-10-16 07:21:01','AI 앱 개발 관련 의견 나눔 자유게시판입니다.','자유게시판','','publish','closed','open','','%ec%9e%90%ec%9c%a0%ea%b2%8c%ec%8b%9c%ed%8c%90','','','2025-10-16 16:21:01','2025-10-16 07:21:01','',0,'https://rndpolicy.org/aidev/?post_type=forum&#038;p=82',0,'forum','',0),
(83,1,'2025-10-16 16:21:01','2025-10-16 07:21:01','AI 앱 개발 관련 의견 나눔 자유게시판입니다.','자유게시판','','inherit','closed','closed','','82-revision-v1','','','2025-10-16 16:21:01','2025-10-16 07:21:01','',82,'https://rndpolicy.org/aidev/?p=83',0,'revision','',0),
(84,1,'2025-10-24 10:44:01','2025-10-16 07:22:36',' ','','','publish','closed','closed','','84','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=84',3,'nav_menu_item','',0),
(85,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','[ultimatemember form_id=\"80\"]','User','','publish','closed','closed','','user','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/user/',0,'page','',0),
(86,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','[ultimatemember form_id=\"79\"]','Login','','publish','closed','closed','','login','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/login/',0,'page','',0),
(87,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','[ultimatemember form_id=\"78\"]','Register','','publish','closed','closed','','register','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/register/',0,'page','',0),
(88,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','[ultimatemember form_id=\"81\"]','Members','','publish','closed','closed','','members','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/members/',0,'page','',0),
(89,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','','Logout','','publish','closed','closed','','logout','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/logout/',0,'page','',0),
(90,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','[ultimatemember_account]','Account','','publish','closed','closed','','account','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/account/',0,'page','',0),
(91,1,'2025-10-16 16:23:39','2025-10-16 07:23:39','[ultimatemember_password]','Password Reset','','publish','closed','closed','','password-reset','','','2025-10-16 16:23:39','2025-10-16 07:23:39','',0,'https://rndpolicy.org/aidev/password-reset/',0,'page','',0),
(92,1,'2025-10-24 10:44:01','2025-10-16 07:25:15',' ','','','publish','closed','closed','','92','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=92',5,'nav_menu_item','',0),
(93,1,'2025-10-24 10:44:01','2025-10-16 07:25:15',' ','','','publish','closed','closed','','93','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=93',6,'nav_menu_item','',0),
(95,1,'2025-10-24 10:44:01','2025-10-16 07:25:15','','가입','','publish','closed','closed','','95','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=95',4,'nav_menu_item','',0),
(97,1,'2025-10-24 10:44:01','2025-10-16 07:25:15',' ','','','publish','closed','closed','','97','','','2025-10-24 10:44:01','2025-10-24 01:44:01','',0,'https://rndpolicy.org/aidev/?p=97',7,'nav_menu_item','',0),
(102,3,'2025-10-16 17:05:48','2025-10-16 08:05:48','서로 격려하며 우리 필요에 맞는 AI 앱 개발을 같이 해요 ','안녕하세요','','publish','closed','closed','','%ec%95%88%eb%85%95%ed%95%98%ec%84%b8%ec%9a%94','','','2025-10-16 17:05:48','2025-10-16 08:05:48','',82,'https://rndpolicy.org/aidev/forums/topic/%ec%95%88%eb%85%95%ed%95%98%ec%84%b8%ec%9a%94/',0,'topic','',0),
(103,1,'2025-10-16 17:10:36','2025-10-16 08:10:36','','기본 키트','','publish','closed','closed','','%ea%b8%b0%eb%b3%b8-%ed%82%a4%ed%8a%b8','','','2025-10-16 17:10:36','2025-10-16 08:10:36','',0,'https://rndpolicy.org/aidev/?p=103',0,'elementor_library','',0),
(104,1,'2025-10-16 17:11:11','0000-00-00 00:00:00','','Elementor #104','','draft','closed','closed','','','','','2025-10-16 17:11:11','2025-10-16 08:11:11','',0,'https://rndpolicy.org/aidev/?page_id=104',0,'page','',0),
(105,1,'2025-10-16 17:11:11','2025-10-16 08:11:11','','Elementor #104','','inherit','closed','closed','','104-revision-v1','','','2025-10-16 17:11:11','2025-10-16 08:11:11','',104,'https://rndpolicy.org/aidev/?p=105',0,'revision','',0),
(108,1,'2025-10-16 17:12:57','2025-10-16 08:12:57','<p  >\n	<a href=\"https://rndpolicy.org/aidev/events/\" >&laquo; 모든 일정표</a>\n</p>				\n					<h1  >\n	hello</h1>','The Events Calendar - Starter','','publish','closed','closed','','the-events-calendar-starter','','','2025-10-16 17:12:57','2025-10-16 08:12:57','',0,'https://rndpolicy.org/aidev/?elementor_library=the-events-calendar-starter',0,'elementor_library','',0),
(109,1,'2025-10-16 17:12:57','2025-10-16 08:12:57','<p  >\n	<a href=\"https://rndpolicy.org/aidev/events/\" >&laquo; 모든 일정표</a>\n</p>				\n					<h1  >\n	hello</h1>','The Events Calendar - Starter','','inherit','closed','closed','','108-revision-v1','','','2025-10-16 17:12:57','2025-10-16 08:12:57','',108,'https://rndpolicy.org/aidev/?p=109',0,'revision','',0),
(112,1,'2025-10-16 17:13:29','0000-00-00 00:00:00','','Elementor #112','','draft','open','open','','','','','2025-10-16 17:13:29','2025-10-16 08:13:29','',0,'https://rndpolicy.org/aidev/?p=112',0,'post','',0),
(113,1,'2025-10-16 17:13:28','2025-10-16 08:13:28','','Elementor #112','','inherit','closed','closed','','112-revision-v1','','','2025-10-16 17:13:28','2025-10-16 08:13:28','',112,'https://rndpolicy.org/aidev/?p=113',0,'revision','',0),
(115,1,'2025-10-17 13:17:10','2025-10-17 04:17:10','<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">워크스테이션에 Ubuntu 24.04 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>인공지능 개발 플랫폼 및 툴 등은 <a href=\"http://192.168.101.245/docs/%eb%a6%ac%eb%88%85%ec%8a%a4-linux%eb%9e%80-%eb%ac%b4%ec%97%87%ec%9d%b8%ea%b0%80/\">리눅스 (Linux)</a> 계열인 Ubuntu에서 쉽게 설치하여 서버로 운영하기에 장점이 많기 때문에, 이 매뉴얼은 <a href=\"http://192.168.101.245/docs/%ec%98%a4%ed%94%88-%ec%86%8c%ec%8a%a4-%ec%86%8c%ed%94%84%ed%8a%b8%ec%9b%a8%ec%96%b4-open-source-software-oss%eb%9e%80-%eb%ac%b4%ec%97%87%ec%9d%b8%ea%b0%80/\">오픈 소스 소프트웨어 (Open Source Software, OSS)</a>인 Ubuntu를 설치하고 Ubuntu 상에 AI 앱 개발 플랫폼과 툴 등을 설치하는 과정을 설명합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/%ec%9b%8c%ed%81%ac%ec%8a%a4%ed%85%8c%ec%9d%b4%ec%85%98pc%ec%97%90-ubuntu-24-04-%ec%84%a4%ec%b9%98-%eb%b0%a9%eb%b2%95/\">워크스테이션(PC)에 Ubuntu 24.04 설치 방법</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>워크스테이션은 실제 운용하여 서비스를 제공해야 하기 때문에, 실습은 각자 개인 노트북 등에서 USB로 Ubuntu를 설치하여 진행합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/%ec%99%b8%ec%9e%a5%ed%98%95-usb%ec%97%90-ubuntu-24-04-%ec%84%a4%ec%b9%98/\">외장형 USB에 Ubuntu 24.04 설치</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Ubutu에서 사용하는 기본 명령어는 아래를 참조해 주세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/ubuntu-%ec%97%90%ec%84%9c-%ec%82%ac%ec%9a%a9%ed%95%a0-%ea%b8%b0%eb%b3%b8-%eb%aa%85%eb%a0%b9%ec%96%b4/\">Ubuntu 에서 사용할 기본 명령어</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">워크스테이션에 GPU를 사용할 수 있는 드라이버 등 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/nvidia-gpu-%ec%84%b8%ed%8c%85/\">NVIDIA- GPU 세팅</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Docker 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있도록 하는 개방형 플랫폼입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/docker-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ed%99%9c%ec%9a%a9/\">Docker 설치 및 활용</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Ollama 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ollama는 다양한 오픈소스 대규모 언어 모델(LLM)을 개인 컴퓨터에서 쉽게 실행할 수 있도록 지원하는 도구입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/ollama-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ec%9a%b4%ec%9a%a9/\">Ollama 설치 및 운용</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Openweb UI 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>OpenWebUI는 Ollama로 실행되는 로컬 LLM과 상호작용할 수 있는 웹 기반의 사용자 친화적인 인터페이스를 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/openwebui-%ec%84%a4%ec%b9%98-%eb%b0%8f-%ec%9a%b4%ec%9a%a9/\">OpenWebui 설치 및 운용</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">Dify 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Dify는 LLM을 활용한 다양한 AI 애플리케이션(챗봇, RAG 시스템 등)을 개발하고 배포할 수 있는 플랫폼입니다.&nbsp;</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/dify-%ec%84%a4%ec%b9%98/\">Dify 설치</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">gpt-researcher 설치</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>GPT-Researcher는 웹 및 로컬 환경에서 심층적인 연구를 수행하도록 설계된 오픈 소스 AI 에이전트입니다. 그 주된 목적은 상세하고 사실적이며 편향되지 않은 연구 보고서를 인용과 함께 생성하는 것입니다. 이 에이전트는 광범위한 사용자 정의 옵션을 제공하여, 사용자가 특정 도메인에 맞춤화된 연구 에이전트를 생성할 수 있도록 지원합니다</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"http://192.168.101.245/docs/gpt-researcher-%ec%84%a4%ec%b9%98/\">GPT-Researcher 설치</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">image 생성 AI</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->','매뉴얼','','inherit','closed','closed','','9-revision-v1','','','2025-10-17 13:17:10','2025-10-17 04:17:10','',9,'https://rndpolicy.org/aidev/?p=115',0,'revision','',0);
INSERT INTO `wp_posts` VALUES
(117,1,'2025-10-17 19:03:38','2025-10-17 10:03:38','<!-- wp:heading -->\n<h2 class=\"wp-block-heading\">도입</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker는 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있도록 하는 개방형 플랫폼이다. Docker는 소프트웨어를 컨테이너라는 표준화된 단위로 패키징하며, 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다. 이를 통해 개발자는 환경에 구애받지 않고 애플리케이션을 동일하게 실행할 수 있으며, 인프라와 애플리케이션을 분리하여 운영 효율성을 극대화할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>본 매뉴얼은 Ubuntu 24.04 LTS 환경에서 Docker를 설치하고, 기본적인 명령어를 통해 컨테이너와 이미지를 관리하며, Python 애플리케이션을 컨테이너화하는 방법, 일반적인 문제 해결 방안, 그리고 Docker 보안 강화 전략에 이르기까지 포괄적인 내용을 다룬다. 각 단계별 상세한 설명과 예제를 통해 사용자가 Docker를 효과적으로 이해하고 활용할 수 있도록 지원하는 것을 목표로 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>1. Ubuntu 24.04 Docker 설치 준비</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Engine을 Ubuntu 24.04에 성공적으로 설치하기 위해서는 몇 가지 사전 준비 사항을 확인하고 충족해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>1.1. 시스템 요구 사항 및 사전 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>운영체제</strong>: Ubuntu Noble 24.04 (LTS)의 64비트 버전이 필요하다. Docker Engine은 x86_64 (amd64), armhf, arm64, s390x, ppc64le (ppc64el) 아키텍처를 지원한다. Linux Mint와 같은 Ubuntu 파생 배포판에서의 설치는 공식적으로 지원되지 않을 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>커널 버전</strong>: Docker는 Linux 커널의 특정 기능을 활용하므로, 최신 상태의 커널을 사용하는 것이 권장된다. 일반적으로 Ubuntu 24.04 LTS의 기본 커널은 Docker 실행에 충분하다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>저장 공간</strong>: Docker 이미지와 컨테이너는 디스크 공간을 차지하므로, 충분한 여유 공간을 확보해야 한다. /var/lib/docker/ 디렉토리에 주로 데이터가 저장된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>방화벽 제한 사항</strong>: Docker를 사용하여 컨테이너 포트를 노출할 경우, ufw 또는 firewalld와 같은 방화벽 규칙을 우회할 수 있다. Docker는 iptables-nft 및 iptables-legacy와 호환되며, nft로 생성된 방화벽 규칙은 지원하지 않는다. 방화벽 규칙은 iptables 또는 ip6tables로 생성하고 DOCKER-USER 체인에 추가해야 한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>1.2. 기존 Docker 버전 또는 충돌 가능 패키지 제거</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>새로운 버전의 Docker Engine을 설치하기 전에, 시스템에 이전 버전의 Docker나 비공식 Docker 패키지가 설치되어 있다면 이를 제거하는 것이 좋다. 충돌을 유발할 수 있는 패키지에는 docker.io, docker-doc, docker-compose, docker-compose-v2, podman-docker 등이 있다. 또한, Docker Engine이 자체적으로 containerd.io와 runc를 번들로 제공하므로, 이들이 별도로 설치되어 있다면 제거해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음 명령어를 사용하여 관련 패키지를 제거할 수 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done<br></code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이 명령어는 패키지를 제거하지만, /var/lib/docker/에 저장된 기존 이미지, 컨테이너, 볼륨, 네트워크는 자동으로 삭제되지 않는다. 완전히 새로 설치하고자 한다면, Docker 제거 후 해당 디렉토리를 수동으로 삭제해야 할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>2. Ubuntu 24.04에 Docker Engine 설치 (APT 저장소 방식)</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Ubuntu에 Docker Engine을 설치하는 가장 권장되는 방법은 Docker의 공식 APT 저장소를 사용하는 것이다. 이 방법을 사용하면 설치 및 업데이트 관리가 용이하다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.1. Docker 공식 GPG 키 추가</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>GPG 키는 다운로드하는 패키지의 진위성을 확인하여 소프트웨어 무결성을 보장하는 데 필수적이다. 이 과정은 신뢰할 수 있는 소스에서 Docker를 설치하고 있음을 시스템에 알리는 역할을 한다. 만약 GPG 키 검증 없이 패키지를 설치한다면, 중간자 공격(Man-in-the-Middle attack)이나 악의적으로 수정된 소프트웨어에 노출될 위험이 있다. 따라서 GPG 키 추가는 보안상 매우 중요한 단계이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code><code>#  <span style=\"background-color: initial; font-family: inherit; font-size: inherit; text-align: initial; color: initial;\">먼저, 시스템 패키지 목록을 업데이트하고 HTTPS를 통해 저장소를 사용하는 데 필요한 패키지를 설치한다:</span></code>\n<code>sudo apt-get update </code>\n<code>sudo apt-get install ca-certificates curl </code>\n# GPG 키를 저장할 디렉토리를 생성하고 적절한 권한을 설정한다:\n\n<code>sudo install -m 0755 -d /etc/apt/keyrings </code>\n# Docker의 공식 GPG 키를 다운로드하여 지정된 경로에 저장한다:\n\n<code>sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc </code>\n# 다운로드한 GPG 키 파일에 대해 모든 사용자가 읽을 수 있도록 권한을 변경한다:\n\n<code>sudo chmod a+r /etc/apt/keyrings/docker.asc </code></code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.2. Docker APT 저장소 설정</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>GPG 키를 추가한 후, APT가 Docker 패키지를 찾을 수 있도록 Docker의 공식 저장소를 시스템의 소스 목록에 추가해야 한다. 공식 저장소를 사용하면 Docker 팀이 직접 제공하고 관리하는 최신 버전의 안정적이고 안전한 패키지를 받을 수 있다. 운영체제의 기본 저장소에 포함된 Docker 패키지는 오래되었거나 수정되었을 가능성이 있으므로, 공식 저장소 사용은 최신 기능과 보안 패치를 보장받는 최선의 방법이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음 명령어를 실행하여 Docker 저장소를 APT 소스 목록에 추가한다. 이 명령어는 시스템 아키텍처와 Ubuntu 코드명을 자동으로 감지하여 적절한 저장소를 설정한다:<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code><code># Add the repository to Apt sources: </code>\necho \\\n  \"deb &#91;arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \\\n  $(. /etc/os-release &amp;&amp; echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable\" | \\\n  sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null\n\n\n# 저장소를 추가한 후, 다시 패키지 목록을 업데이트하여 APT가 새로운 Docker 저장소의 패키지 정보를 가져오도록 한다:\n\nsudo apt-get update</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.3. Docker Engine 패키지 설치</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>저장소 설정이 완료되면 Docker Engine 및 관련 패키지를 설치할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>최신 버전의 Docker Engine, CLI, containerd, Docker Compose 플러그인, Buildx 플러그인을 설치하려면 다음 명령어를 실행한다:\n\nsudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>여기서 각 패키지의 역할은 다음과 같다:<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker-ce: Docker Community Edition, 즉 Docker 엔진 자체이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-ce-cli: Docker 명령줄 인터페이스(CLI)를 제공한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>containerd.io: 컨테이너 런타임으로, 컨테이너의 생명주기를 관리한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-buildx-plugin: 다중 플랫폼 빌드 등 향상된 이미지 빌드 기능을 제공한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-compose-plugin: YAML 파일을 사용하여 다중 컨테이너 Docker 애플리케이션을 관리할 수 있게 한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>특정 버전의 Docker Engine을 설치하려면, 먼저 사용 가능한 버전을 확인한다:\n\napt-cache madison docker-ce | awk \'{ print $3 }\'\n\n출력된 목록에서 원하는 버전 문자열(예: 5:28.2.1-1~ubuntu.24.04~noble)을 선택한 후, 해당 버전으로 설치한다:\n\nVERSION_STRING=5:28.2.1-1~ubuntu.24.04~noble\n\nsudo apt-get install docker-ce=$VERSION_STRING docker-ce-cli=$VERSION_STRING containerd.io docker-buildx-plugin docker-compose-plugin\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2.4. 설치 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Engine이 성공적으로 설치되었는지 확인하기 위해 hello-world 이미지를 실행한다. 이 이미지는 간단한 테스트용으로, 실행 시 Docker 설치가 정상적으로 완료되었음을 알리는 메시지를 출력한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo docker run hello-world</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이 명령어를 실행하면 hello-world 이미지가 로컬에 없는 경우 Docker Hub에서 자동으로 다운로드되고, 컨테이너로 실행된 후 메시지를 출력하고 종료된다. \"Hello from Docker!\"와 유사한 메시지가 나타나면 설치가 성공적으로 완료된 것이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>설치된 Docker 버전을 확인하려면 다음 명령어를 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo docker --version</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>출력 예: Docker version 26.1.4, build 5650f9b</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>3. Docker 설치 후속 조치</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker Engine 설치 후, 사용 편의성과 시스템 관리를 위해 몇 가지 추가 설정을 수행하는 것이 좋다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>3.1. sudo 없이 Docker 명령어 사용 설정 (비루트 사용자 접근 활성화)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>기본적으로 Docker 명령어는 루트 권한을 요구하므로 sudo를 함께 사용해야 한다. 매번 sudo를 입력하는 번거로움을 줄이고자 한다면, 현재 사용자를 docker 그룹에 추가할 수 있다. 이 설정은 편의성을 제공하지만, 보안적 측면을 고려해야 한다. docker 그룹에 속한 사용자는 Docker 데몬과 직접 통신할 수 있게 되며, Docker 데몬은 루트 권한으로 실행되므로 이는 해당 사용자에게 사실상 루트와 동등한 권한을 부여하는 것과 같다. 특히 다중 사용자 환경에서는 이 설정이 보안 위험을 증가시킬 수 있으므로 신중하게 결정해야 한다. 단일 사용자 환경이나 개발 환경에서는 편의를 위해 설정하는 경우가 많다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker 그룹이 시스템에 존재하지 않을 경우 생성한다. -f 옵션은 그룹이 이미 존재하더라도 오류를 발생시키지 않는다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo groupadd -f docker\n</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>현재 로그인된 사용자를 docker 그룹에 추가한다. 다른 사용자를 추가하려면 $USER 대신 해당 사용자명을 입력한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker $USER</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>또는 특정 사용자를 추가하려면:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>sudo usermod -aG docker &#91;username]</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>그룹 변경 사항을 현재 세션에 적용한다. 이를 위해서는 newgrp docker 명령어를 실행하거나, 시스템에서 로그아웃한 후 다시 로그인해야 한다. newgrp 명령어는 새로운 셸을 시작하여 변경된 그룹 멤버십을 즉시 적용한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>newgrp docker</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>이후에는 sudo 없이 docker ps와 같은 Docker 명령어를 실행할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:code -->\n<pre class=\"wp-block-code\"><code>docker ps</code></pre>\n<!-- /wp:code -->\n\n<!-- wp:paragraph -->\n<p>실행 중인 컨테이너가 없다면 빈 목록이 출력될 것이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>3.2. Docker 서비스 관리</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker는 시스템 서비스로 실행되므로 systemctl 명령어를 사용하여 관리할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>부팅 시 Docker 자동 시작 활성화</strong>: 시스템이 시작될 때 Docker 서비스가 자동으로 실행되도록 설정한다.<br>sudo systemctl enable docker<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 상태 확인</strong>: Docker 서비스의 현재 실행 상태를 확인한다.<br>sudo systemctl status docker<br>출력에서 active (running) 상태를 확인하면 정상적으로 실행 중인 것이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 시작</strong>: 중지된 Docker 서비스를 시작한다.<br>sudo systemctl start docker<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 중지</strong>: 실행 중인 Docker 서비스를 중지한다.<br>sudo systemctl stop docker<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 서비스 재시작</strong>: Docker 서비스를 재시작한다. 설정 변경 후 적용하거나 문제가 발생했을 때 사용한다.<br>sudo systemctl restart docker<br></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>4. Docker 기본 명령어 활용</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker 설치 후에는 다양한 명령어를 사용하여 컨테이너와 이미지를 관리할 수 있다. 다음은 핵심적인 기본 명령어들이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.1. docker ps: 실행 중인 컨테이너 목록 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker ps 명령어는 현재 실행 중인 컨테이너의 목록을 보여준다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker ps<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 컨테이너(중지된 컨테이너 포함)를 보려면 -a 또는 --all 옵션을 추가한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker ps -a<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력에는 컨테이너 ID, 사용된 이미지, 실행된 명령어, 생성 시간, 상태, 포트, 이름 등의 정보가 포함된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.2. docker stop: 실행 중인 컨테이너 중지</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker stop [container_name_or_id] 명령어는 실행 중인 컨테이너를 중지시킨다. (User Query) 이 명령어는 컨테이너의 주 프로세스에 SIGTERM 신호를 보내 정상적으로 종료하도록 요청한다. 일정 시간(기본 10초) 내에 종료되지 않으면 SIGKILL 신호를 보내 강제 종료한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker stop my_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) 여러 컨테이너를 한 번에 중지시킬 수도 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker stop container1 container2<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 실행 중인 컨테이너를 중지하려면 다음 명령어를 사용할 수 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker stop $(docker ps -q)<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>여기서 docker ps -q는 실행 중인 컨테이너의 ID만 나열한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.3. docker start: 중지된 컨테이너 재시작</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker start [container_name_or_id] 명령어는 중지된 컨테이너를 다시 시작시킨다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker start my_stopped_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.4. docker logs: 컨테이너 로그 확인</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker logs [container_name_or_id] 명령어는 컨테이너 내부에서 발생하는 로그(표준 출력 및 표준 에러)를 확인할 때 사용한다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker logs my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>실시간으로 로그를 계속 보려면 -f 또는 --follow 옵션을 추가한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker logs -f my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>최근 N개의 로그 라인만 보려면 --tail N 옵션을 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker logs --tail 50 my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.5. docker rm: 컨테이너 삭제</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker rm [container_name_or_id] 명령어는 하나 이상의 컨테이너를 삭제한다. (User Query) 컨테이너는 중지된 상태여야 삭제할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rm my_stopped_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>실행 중인 컨테이너를 중지하지 않고 즉시 삭제하려면 -f 또는 --force 옵션을 추가한다. 이 옵션은 컨테이너에 SIGKILL 신호를 보내 강제 종료 후 삭제한다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rm -f my_running_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 중지된 컨테이너를 삭제하려면 다음 명령어를 사용할 수 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rm $(docker ps -a -f status=exited -q)<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>또는 docker container prune 명령어를 사용하면 중지된 모든 컨테이너를 한 번에 삭제할 수 있다 (사용자 확인 후 진행):</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker container prune<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>4.6. docker rmi: 이미지 삭제</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker rmi [image_name_or_id] 명령어는 로컬 시스템에서 하나 이상의 Docker 이미지를 삭제한다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rmi my_image:tag<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이미지가 실행 중인 컨테이너나 다른 이미지의 부모 이미지로 사용되고 있다면 삭제되지 않는다. 강제로 삭제하려면 -f 또는 --force 옵션을 사용할 수 있지만, 주의해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rmi -f my_image:tag<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>태그가 없는 이미지(댕글링 이미지, dangling images)만 삭제하려면 다음 명령어를 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker image prune<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>모든 이미지를 삭제하려면 (사용 중이지 않은 이미지 대상):</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker rmi $(docker images -a -q)<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>5. Docker 컨테이너 실행: docker run 상세 분석</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어는 Docker에서 이미지를 기반으로 새로운 컨테이너를 생성하고 실행하는 핵심 명령어이다. 이 명령어는 다양한 옵션을 통해 컨테이너의 동작 방식을 세밀하게 제어할 수 있다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>5.1. docker run 기본 구문</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어의 일반적인 형태는 다음과 같다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker run IMAGE<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>``: 컨테이너의 동작을 설정하는 다양한 옵션들이다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>IMAGE: 컨테이너를 생성할 기반 Docker 이미지의 이름이다. 태그(:TAG)를 생략하면 기본적으로 :latest 태그가 사용된다. 이미지 다이제스트(@DIGEST)를 사용하여 특정 버전의 이미지를 정확히 지정할 수도 있다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>``: 컨테이너가 시작될 때 내부에서 실행할 명령어이다. 이미지에 기본 실행 명령어가 정의되어 있다면 생략 가능하다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>: 에 전달할 인자들이다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>예를 들어, busybox 이미지를 사용하여 \"Hello, World!\"를 출력하는 간단한 컨테이너를 실행하는 명령어는 다음과 같다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker run busybox echo \"Hello, World!\"<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>5.2. docker run 주요 옵션</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어와 함께 자주 사용되는 주요 옵션들은 다음과 같다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>-d, --detach</strong>: 컨테이너를 백그라운드에서 실행한다 (데몬 모드). (User Query) 터미널에 연결되지 않고 백그라운드에서 실행되므로 웹 서버나 데이터베이스와 같은 서비스를 실행할 때 유용하다.<br>docker run -d nginx<br>이 옵션은 장기 실행 서비스에 적합하며, 컨테이너 ID만 출력하고 터미널 제어권을 즉시 반환한다. 반면, 대화형 세션이 필요한 경우 (예: 셸 접속) 이 옵션은 적합하지 않다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-p, --publish HOST_PORT:CONTAINER_PORT</strong>: 호스트와 컨테이너 간의 포트를 연결(매핑)한다. (User Query) 호스트의 HOST_PORT로 들어오는 트래픽을 컨테이너 내부의 CONTAINER_PORT로 전달한다. 예: -p 8080:80은 호스트의 8080번 포트를 컨테이너의 80번 포트로 연결한다. (User Query)<br>docker run -d -p 8080:80 nginx<br>(User Query) 이 포트 매핑 기능은 컨테이너 내부에서 실행 중인 애플리케이션을 외부 네트워크에 노출시키는 핵심 방법이다. 호스트 포트는 호스트 머신에서 사용 가능한 포트여야 하며, 컨테이너 포트는 컨테이너 내 애플리케이션이 수신 대기하는 포트이다. 이를 통해 동일한 컨테이너 이미지를 여러 개 실행하면서 각각 다른 호스트 포트에 매핑하여 서비스 충돌 없이 여러 인스턴스를 운영할 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-v, --volume HOST_PATH:CONTAINER_PATH 또는 VOLUME_NAME:CONTAINER_PATH</strong>: 호스트와 컨테이너 간의 디렉토리나 파일을 공유(마운트)하거나, 명명된 볼륨을 컨테이너에 연결한다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>바인드 마운트 (Bind Mounts)</strong>: 호스트의 특정 경로(HOST_PATH)를 컨테이너의 특정 경로(CONTAINER_PATH)에 직접 연결한다. 호스트 파일 시스템의 변경 사항이 컨테이너에 반영되고, 그 반대도 가능하다. 예: 호스트의 /opt/data 디렉토리를 컨테이너의 /app 디렉토리와 공유한다.<br>docker run -v /opt/data:/app myapp<br>(User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>명명된 볼륨 (Named Volumes)</strong>: Docker가 관리하는 영구 저장 공간인 명명된 볼륨(VOLUME_NAME)을 컨테이너의 특정 경로(CONTAINER_PATH)에 연결한다. 데이터베이스 데이터나 애플리케이션 상태를 영구적으로 저장하는 데 권장된다. 예: my_volume이라는 명명된 볼륨을 컨테이너의 /data 경로에 마운트한다.<br>docker run --mount source=my_volume,target=/data myimage<br>(또는 -v my_volume:/data)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>--name CONTAINER_NAME</strong>: 컨테이너에 고유한 이름을 지정한다. (User Query) 이름을 지정하면 컨테이너 ID 대신 이름으로 컨테이너를 참조할 수 있어 관리가 용이하다.<br>docker run -d --name my_web_server nginx<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--env KEY=VALUE 또는 -e KEY=VALUE</strong>: 컨테이너 내부에 환경 변수를 설정한다. (User Query) 애플리케이션 설정, 데이터베이스 연결 정보 등을 전달하는 데 사용된다. 예: DATABASE_URL 환경 변수를 설정한다.<br>docker run --env DATABASE_URL=mysql://user:password@localhost:5432/db myapp<br>(User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-i, --interactive</strong>: 컨테이너의 표준 입력(STDIN)을 열린 상태로 유지한다. 주로 -t 옵션과 함께 사용된다. (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-t, --tty</strong>: 가상 터미널(pseudo-TTY)을 할당한다. 주로 -i 옵션과 함께 사용되어 컨테이너와 상호작용하는 셸 환경을 제공한다. (User Query) 예: Ubuntu 이미지로 컨테이너를 실행하고 bash 셸에 접속한다.<br>docker run -it ubuntu /bin/bash<br>-it 옵션은 컨테이너 내부에서 명령어를 직접 입력하고 결과를 확인해야 하는 디버깅이나 개발 작업에 필수적이다. -d 옵션과는 상반되는 용도로, 포그라운드에서 대화형 세션을 유지한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>5.3. docker run 추가 옵션</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>자주 사용되는 옵션 외에도 다음과 같은 유용한 옵션들이 있다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>--rm</strong>: 컨테이너가 종료될 때 자동으로 삭제한다. 일회성 작업이나 테스트용 컨테이너에 유용하다.<br>docker run --rm busybox echo \"Task complete, removing container\"<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--link OTHER_CONTAINER_NAME:ALIAS</strong>: 다른 컨테이너와 네트워크 연결을 설정한다 (레거시 기능, 사용자 정의 네트워크 사용 권장). (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-e, --env-file FILE_PATH</strong>: 환경 변수가 정의된 파일로부터 환경 변수를 읽어와 컨테이너에 설정한다. (User Query)<br>docker run --env-file./env.list myapp<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--restart RESTART_POLICY</strong>: 컨테이너가 종료되었을 때 재시작 정책을 설정한다. (User Query) 예: --restart always (항상 재시작), --restart on-failure (오류로 종료 시 재시작).<br>docker run -d --restart always my_reliable_service<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--network NETWORK_NAME</strong>: 컨테이너가 속할 네트워크를 지정한다. (User Query) 기본 브리지 네트워크 대신 사용자 정의 네트워크에 연결할 때 사용한다.<br>docker run --network my_custom_network myapp<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--add-host HOSTNAME:IP_ADDRESS</strong>: 컨테이너 내부의 /etc/hosts 파일에 호스트 이름과 IP 주소 매핑을 추가한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-w, --workdir PATH</strong>: 컨테이너 내부의 작업 디렉토리를 설정한다. COMMAND가 이 디렉토리에서 실행된다. (docker exec에서도 사용)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어는 매우 강력하며, 위에 언급된 옵션 외에도 다양한 옵션들이 존재한다. docker run --help 명령어를 통해 모든 옵션과 설명을 확인할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>6. Docker 컨테이너 관리 심화</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>컨테이너를 실행한 후에는 컨테이너 내부와 상호작용하거나, 컨테이너의 생명주기를 보다 세밀하게 제어해야 하는 경우가 발생한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.1. 실행 중인 컨테이너에 명령어 전달: docker exec</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker exec 명령어는 이미 실행 중인 컨테이너 내부에서 새로운 명령어를 실행하는 데 사용된다. (User Query) 이는 컨테이너를 중지하거나 새로 시작하지 않고도 내부 상태를 확인하거나, 파일을 수정하거나, 추가적인 프로세스를 실행할 수 있게 해준다. docker run이 새로운 컨테이너를 생성하여 명령어를 실행하는 반면, docker exec는 기존 컨테이너의 네임스페이스 내에서 작동한다. 이 명령어는 컨테이너의 주 프로세스(PID 1)가 실행 중일 때만 작동하며, docker exec로 실행된 명령어는 컨테이너 재시작 시 자동으로 다시 실행되지 않는다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기본 구문:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec CONTAINER COMMAND<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>가장 일반적인 사용 사례는 실행 중인 컨테이너의 셸에 접근하는 것이다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec -it [container_name_or_id] /bin/bash<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) 또는 Alpine Linux와 같이 /bin/bash가 없는 최소 이미지의 경우 /bin/sh를 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec -it [container_name_or_id] sh<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>-i, --interactive: 표준 입력을 열린 상태로 유지한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-t, --tty: 가상 터미널을 할당한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-d, --detach: 명령어를 백그라운드에서 실행한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-e, --env KEY=VALUE: exec 프로세스에 대한 환경 변수를 설정한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>-w, --workdir PATH: exec 프로세스가 실행될 컨테이너 내부의 작업 디렉토리를 지정한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>예를 들어, my_container라는 이름의 실행 중인 컨테이너 내부에 /tmp/execWorks라는 파일을 생성하는 명령어는 다음과 같다 (백그라운드 실행):</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker exec -d my_container touch /tmp/execWorks<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.2. 컨테이너에서 빠져나오기</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>-it 옵션으로 컨테이너의 셸에 접속한 경우, 다음 두 가지 방법으로 빠져나올 수 있다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>컨테이너를 종료하지 않고 빠져나오기</strong>: Ctrl+P를 누른 후 Ctrl+Q를 차례로 입력한다. (User Query) 이렇게 하면 컨테이너는 백그라운드에서 계속 실행된 상태로 현재 터미널 세션만 컨테이너에서 분리된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>컨테이너를 종료하면서 빠져나오기</strong>: 셸에서 exit 명령어를 입력하거나 Ctrl+D를 누른다. 또는 Ctrl+C를 사용하여 현재 실행 중인 포그라운드 프로세스(예: 셸)를 종료시킬 수 있으며, 이것이 컨테이너의 주 프로세스(PID 1)라면 컨테이너 자체가 종료될 수 있다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.3. 컨테이너 강제 종료: docker kill</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker stop 명령어가 컨테이너에 SIGTERM 신호를 보내 정상 종료를 시도하는 반면, docker kill [container_name_or_id] 명령어는 즉시 SIGKILL 신호를 보내 컨테이너를 강제로 종료시킨다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker kill my_ unresponsive_container<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) docker stop으로 컨테이너가 정상적으로 종료되지 않거나 즉각적인 종료가 필요할 때 사용된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>6.4. 모든 컨테이너 중지 및 삭제</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>모든 컨테이너 중지</strong>:<br>docker stop $(docker ps -a -q)<br>(User Query) 이 명령어는 실행 중인 컨테이너와 중지된 컨테이너 모두를 대상으로 stop 명령을 시도한다 (docker ps -a -q는 모든 컨테이너 ID를 반환). 실제로는 실행 중인 컨테이너만 중지된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>모든 컨테이너 삭제 (중지 후)</strong>: 먼저 모든 컨테이너를 중지한 후, 모든 컨테이너를 삭제한다.<br>docker stop $(docker ps -a -q)<br>docker rm $(docker ps -a -q)<br>이 두 명령어를 순차적으로 실행하면 시스템의 모든 컨테이너가 정리된다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>7. Docker 시스템 관리</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 장기간 사용하다 보면 이미지, 컨테이너, 볼륨, 네트워크 등 사용하지 않는 리소스들이 누적되어 디스크 공간을 불필요하게 차지할 수 있다. Docker는 이러한 리소스를 효율적으로 관리하고 시스템 상태를 점검할 수 있는 명령어들을 제공한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>7.1. Docker 디스크 사용량 확인: docker system df</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker system df 명령어는 Docker가 사용 중인 디스크 공간에 대한 요약 정보를 보여준다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system df<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력에는 이미지, 컨테이너, 로컬 볼륨, 빌드 캐시 각각에 대한 총 개수, 활성 개수, 사용 중인 크기, 그리고 회수 가능한 공간(unused and reclaimable space)이 표시된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>더 상세한 정보를 보려면 -v 또는 --verbose 옵션을 사용한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system df -v<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 옵션은 각 이미지, 컨테이너, 볼륨별로 개별 크기와 회수 가능 여부 등의 자세한 정보를 제공하여 어떤 요소가 디스크 공간을 많이 차지하는지 파악하는 데 도움이 된다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>출력 형식을 JSON으로 지정하여 스크립트나 다른 도구에서 파싱하기 용이하게 만들 수도 있다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system df --format json<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>7.2. 불필요한 Docker 리소스 정리: docker system prune</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker system prune 명령어는 사용하지 않는 Docker 리소스(중지된 컨테이너, 사용되지 않는 네트워크, 댕글링 이미지, 빌드 캐시)를 한 번에 정리하여 디스크 공간을 확보하는 데 매우 유용하다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 명령어를 실행하면 삭제될 대상과 함께 경고 메시지가 표시되며, 계속 진행할지 여부를 묻는다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune 명령어는 다음과 같은 주요 옵션들을 제공한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>-a, --all</strong>: 기본적으로 docker system prune은 댕글링 이미지(태그가 없고 다른 이미지의 부모도 아닌 이미지)만 삭제한다. -a 옵션을 추가하면 사용 중이지 않은 모든 이미지(태그가 있는 이미지 포함)까지 삭제 대상으로 포함한다.<br>docker system prune -a<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--volumes</strong>: 기본적으로 명명된 볼륨은 데이터 손실을 방지하기 위해 삭제되지 않는다. 이 옵션을 사용하면 사용 중이지 않은 볼륨(어떤 컨테이너에도 연결되지 않은 볼륨)도 함께 삭제한다. <strong>이 옵션은 중요한 데이터가 저장된 볼륨을 실수로 삭제할 수 있으므로 사용에 각별한 주의가 필요하다.</strong><br>docker system prune --volumes<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>-f, --force</strong>: 사용자 확인 프롬프트를 생략하고 즉시 정리 작업을 수행한다. 스크립트나 자동화된 작업에 유용하다.<br>docker system prune -f<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>--filter \"until=timestamp\"</strong>: 지정된 타임스탬프 이전에 생성된 리소스만 삭제 대상으로 필터링한다. Go duration 문자열(예: \"24h\", \"10m\")도 사용할 수 있다.<br>docker system prune --filter \"until=24h\"<br></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>가장 강력한 정리 명령어 중 하나는 다음과 같다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune --all --volumes -f<br></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>(User Query) 이 명령어는 확인 절차 없이 중지된 모든 컨테이너, 사용되지 않는 모든 네트워크, 사용되지 않는 모든 이미지 (댕글링 이미지 포함), 사용되지 않는 모든 볼륨, 그리고 빌드 캐시를 삭제한다. Docker 환경을 초기 상태에 가깝게 정리할 수 있지만, 데이터 손실 위험이 크므로 신중하게 사용해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>docker system prune 외에도 특정 리소스 타입별로 정리하는 명령어들이 존재한다:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker container prune: 중지된 모든 컨테이너 삭제.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker image prune: 댕글링 이미지 삭제. -a 옵션 사용 시 사용되지 않는 모든 이미지 삭제.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker volume prune: 사용되지 않는 로컬 볼륨 삭제 (기본적으로 익명 볼륨만, -a 옵션으로 명명된 볼륨 포함).</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker network prune: 사용되지 않는 네트워크 삭제.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>주기적으로 docker system df로 디스크 사용량을 확인하고, docker system prune 관련 명령어들을 적절히 사용하여 시스템을 깨끗하게 유지하는 것이 좋다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>8. Docker 컨테이너 내 Python 모듈 설치</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 사용하여 Python 애플리케이션을 컨테이너화할 때, 필요한 Python 모듈(패키지)을 이미지에 포함시키거나 실행 중인 컨테이너에 설치하는 방법을 이해하는 것이 중요하다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>8.1. Dockerfile을 이용한 Python 모듈 설치 (이미지 빌드 시)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Python 애플리케이션용 Docker 이미지를 빌드할 때, Dockerfile 내에서 pip 명령어를 사용하여 의존성 모듈을 설치하는 것이 일반적이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>기본 Python Dockerfile 구조 예시</strong>:<br># Use an official Python runtime as a parent image<br>FROM python:3.11-slim-bullseye<br><br># Set the working directory in the container<br>WORKDIR /usr/src/app<br><br># Copy the current directory contents into the container at /usr/src/app<br># For optimization, copy requirements.txt first and install dependencies<br>COPY requirements.txt./<br>RUN pip install --no-cache-dir -r requirements.txt<br><br># Copy the rest of the application code<br>COPY..<br><br># Make port 80 available to the world outside this container (if your app uses a port)<br># EXPOSE 80<br><br># Define environment variable (example)<br># ENV NAME World<br><br># Run app.py when the container launches<br>CMD [\"python\", \"your_app.py\"]<br>(Outline, based on common Python Dockerfile patterns)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>requirements.txt 파일을 사용한 모듈 설치</strong>: 가장 권장되는 방법은 requirements.txt 파일에 필요한 모든 모듈과 버전을 명시하고, 이를 Dockerfile에서 설치하는 것이다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>프로젝트 루트에 requirements.txt 파일을 생성하고 의존성을 나열한다. 예시 requirements.txt:<br>SomePackage==1.0.4<br>AnotherPackage&gt;=2.0<br>requests<br>(Outline, User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Dockerfile에서 requirements.txt 파일을 먼저 복사하고 pip install을 실행한다.<br>COPY requirements.txt./<br>RUN pip install --no-cache-dir -r requirements.txt<br>(Outline) --no-cache-dir 옵션은 pip 캐시를 저장하지 않아 이미지 크기를 줄이는 데 도움이 된다. (Outline)</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이러한 방식은 Docker의 빌드 캐시를 효율적으로 활용하는 데 매우 중요하다. Docker 이미지는 여러 계층(layer)으로 구성되며, Dockerfile의 각 명령어는 새로운 계층을 생성한다. Docker는 빌드 시 이전 빌드와 변경되지 않은 계층은 캐시에서 재사용한다. Python 애플리케이션의 의존성(requirements.txt)은 소스 코드 자체보다 변경 빈도가 낮다. 따라서 requirements.txt를 먼저 복사하고 의존성을 설치하는 계층을 만든 후, 애플리케이션 소스 코드를 복사하는 계층을 만들면, 소스 코드만 변경되었을 경우 의존성 설치 계층은 캐시에서 재사용되어 빌드 시간을 크게 단축할 수 있다. 만약 모든 파일을 한 번에 복사(COPY..)한 후 pip install을 실행하면, 코드의 작은 변경만으로도 의존성 설치 단계까지 캐시가 무효화되어 매번 새로 설치하게 된다. 이 원리는 Dockerfile 작성 시 빌드 최적화의 핵심 개념 중 하나이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Dockerfile에서 직접 pip install 실행 (단일 모듈 또는 특정 경우)</strong>: requirements.txt를 사용하지 않고 Dockerfile 내에서 직접 RUN 명령어로 pip를 실행하여 모듈을 설치할 수도 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>특정 버전 설치: RUN python -m pip install SomePackage==1.0.4 (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>업그레이드: RUN python -m pip install --upgrade SomePackage (User Query)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>최소 버전 지정: RUN python -m pip install \"SomePackage&gt;=1.0.4\" (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>8.2. 실행 중인 컨테이너에 Python 모듈 설치 (디버깅 및 테스트용)</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>이미 실행 중인 컨테이너에 임시로 Python 모듈을 설치해야 할 경우, docker exec 명령어를 사용할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li>먼저, 대상 컨테이너의 셸에 접속한다:<br>docker exec -it &lt;container_name_or_id&gt; /bin/bash<br>(Outline)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>컨테이너 내부 셸에서 pip 명령어를 사용하여 모듈을 설치한다:<br>python -m pip install SomePackage<br>(Outline) 또는 특정 버전:<br>python -m pip install SomePackage==1.2.3<br></li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>주의</strong>: 이 방법으로 설치된 모듈은 해당 컨테이너 인스턴스에만 적용되며, 컨테이너가 중지되고 삭제되면 변경 사항은 사라진다. 즉, 일시적인 변경이며 영구적이지 않다. 프로덕션 환경에서는 Dockerfile을 통해 이미지에 의존성을 포함시키는 것이 올바른 방법이다. 디버깅이나 빠른 테스트 목적으로만 사용하는 것이 좋다. 만약 이러한 변경 사항을 영구적으로 유지하고 싶다면 docker commit 명령어를 사용하여 새로운 이미지를 생성할 수 있지만, 이는 일반적으로 권장되지 않는 워크플로우이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>9. Ubuntu에서 Docker 사용 시 일반적인 문제 해결</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 사용하다 보면 몇 가지 일반적인 문제에 직면할 수 있다. 여기서는 자주 발생하는 포트 바인딩 오류와 볼륨 지정 오류에 대한 해결 방법을 설명한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>9.1. 포트 바인딩 오류</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>컨테이너 실행 시 -p 또는 --publish 옵션으로 포트를 매핑할 때, 호스트의 해당 포트가 이미 사용 중이면 오류가 발생한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>오류 메시지</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Error starting userland proxy: listen tcp 0.0.0.0:&lt;port_number&gt;: bind: address already in use</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Bind for 0.0.0.0:&lt;port_number&gt; failed: port is already allocated</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>원인 및 해결</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>\"address already in use\"</strong>: 이 오류는 Docker 컨테이너가 아닌 다른 프로세스가 호스트 머신의 해당 포트를 이미 사용하고 있을 때 발생한다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>진단</strong>: sudo lsof -i:&lt;port_number&gt; (예: sudo lsof -i:8080) 명령어를 사용하여 어떤 프로세스가 해당 포트를 점유하고 있는지 확인한다. 또는 sudo netstat -tulnp | grep &lt;port_number&gt; 또는 sudo ss -tulnp | grep &lt;port_number&gt; 명령어를 사용할 수도 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해결 방법 1: 충돌 프로세스 종료</strong>: 확인된 프로세스 ID(PID)를 sudo kill &lt;PID&gt; 명령어로 종료시킨다. 이후 Docker 컨테이너를 다시 실행한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해결 방법 2: 다른 호스트 포트 사용</strong>: Docker 컨테이너를 실행할 때, 호스트의 다른 사용 가능한 포트로 매핑한다. 예를 들어, 8080 포트가 사용 중이라면 8081 포트로 변경한다: docker run -p 8081:80....</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>\"port is already allocated\"</strong>: 이 오류는 다른 Docker 컨테이너가 이미 해당 호스트 포트를 사용하고 있을 때 발생한다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>진단</strong>: docker ps 명령어로 실행 중인 컨테이너 목록과 매핑된 포트를 확인하여 어떤 컨테이너가 해당 포트를 사용 중인지 찾는다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>해결 방법</strong>: 충돌하는 기존 컨테이너를 중지(docker stop &lt;container_id&gt;)하거나, 새로 실행할 컨테이너에 다른 호스트 포트를 할당한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>오류로 인해 컨테이너 시작에 실패한 경우, 해당 컨테이너는 중지된 상태로 남아있을 수 있다. docker rm &lt;container_name_or_id&gt; 명령어로 불필요한 컨테이너를 정리하는 것이 좋다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>9.2. 볼륨 지정 오류</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>docker run 명령어에서 -v 또는 --mount 옵션으로 볼륨을 마운트할 때 경로 지정 문제로 오류가 발생할 수 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>오류 메시지</strong>: Error response from daemon: invalid volume specification: \"&lt;volume_string&gt;\"</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>주요 원인</strong>: 컨테이너 내부 마운트 경로를 절대 경로로 지정하지 않은 경우이다. Docker에서 호스트 OS와 컨테이너 간 디렉토리를 마운트할 때, 컨테이너 측 경로는 반드시 절대 경로여야 한다. 호스트 측 경로는 상대 경로일 수 있으며, 이 경우 Docker CLI가 실행되는 현재 작업 디렉토리를 기준으로 해석되거나 Docker 데몬의 특정 기본 경로를 기준으로 할 수 있다. 그러나 컨테이너 파일 시스템은 자체적으로 격리된 루트(/)를 가지므로, 컨테이너 내의 경로는 이 루트를 기준으로 명확하게 지정되어야 한다. 상대 경로를 사용하면 Docker가 컨테이너 내에서 정확한 마운트 지점을 결정할 수 없어 오류가 발생한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>잘못된 예시</strong>:<br>docker container run -v /abc/webap/:nginx/html...&nbsp; # 컨테이너 경로가 상대 경로<br>docker container run -v /abc/webap/:./nginx/html... # 컨테이너 경로가 상대 경로<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>올바른 예시</strong>:<br>docker container run -v /abc/webap:/nginx/html... # 컨테이너 경로가 절대 경로<br>또한, 호스트 경로가 실제로 존재하는지, 명명된 볼륨을 사용하는 경우 볼륨 이름의 구문이 올바른지 확인하는 것도 중요하다. 이러한 경로 해석의 미묘한 차이를 이해하는 것은 볼륨 마운트 관련 문제를 예방하고 신속하게 해결하는 데 도움이 된다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>10. Ubuntu Docker 보안 강화</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Docker를 프로덕션 환경에서 사용하거나 민감한 데이터를 다룰 때는 보안을 강화하는 것이 매우 중요하다. 다음은 Ubuntu에서 Docker 보안을 향상시키기 위한 주요 원칙과 방법들이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.1. Docker 보안 기본 원칙</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>최소 권한의 원칙 (Principle of Least Privilege)</strong>: 컨테이너와 사용자에게 필요한 최소한의 권한만 부여한다. 예를 들어, 컨테이너 내부에서 애플리케이션을 루트 사용자로 실행하지 않도록 한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>심층 방어 (Defense in Depth)</strong>: 단일 보안 계층에 의존하지 않고, 호스트, Docker 데몬, 이미지, 컨테이너, 네트워크 등 여러 계층에 걸쳐 보안 조치를 적용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>정기적인 업데이트</strong>: Docker Engine, 호스트 운영체제(Ubuntu), 사용 중인 모든 Docker 이미지를 최신 상태로 유지하여 알려진 취약점을 패치한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.2. 민감 데이터의 안전한 관리</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>애플리케이션 비밀번호, API 키, TLS 인증서와 같은 민감한 정보는 Docker 이미지에 직접 포함하거나 환경 변수를 통해 평문으로 전달하는 것을 피해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>환경 변수의 한계</strong>: 환경 변수(-e 또는 --env 옵션)는 간단하게 데이터를 전달할 수 있지만, 다음과 같은 보안적 약점이 있다 :</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker inspect &lt;container_id&gt; 명령어로 노출될 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>컨테이너 내부에서 실행되는 모든 프로세스가 접근할 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>로그 파일에 실수로 기록될 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>매우 민감한 데이터에는 적합하지 않다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Secrets (주로 Swarm 모드용)</strong>: Docker Secrets는 Docker Swarm 모드에서 민감한 데이터를 안전하게 관리하기 위해 설계된 기능이다. (User Query)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>개요</strong>: 비밀번호, API 키, TLS 인증서 등의 민감 데이터를 중앙에서 관리하고, 필요한 서비스(컨테이너)에만 안전하게 전달한다. 데이터는 전송 중 및 Swarm Raft 로그에 저장될 때 암호화된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>작동 방식</strong>: Secrets는 컨테이너 내부에 인메모리 파일 시스템으로 마운트된다 (Linux의 경우 기본적으로 /run/secrets/&lt;secret_name&gt;). 애플리케이션은 이 파일을 읽어 민감한 데이터를 사용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>중요 사항</strong>: Docker Secrets는 공식적으로 Swarm 서비스에서만 사용 가능하다. 독립 실행형 컨테이너에서 사용하려면 해당 컨테이너를 단일 노드 Swarm의 서비스로 실행해야 하는 번거로움이 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Secrets 생성</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>표준 입력(STDIN)으로부터: printf \"my_password\" | docker secret create my_db_password -</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>파일로부터: docker secret create my_site_cert /path/to/cert.pem</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>목록 확인: docker secret ls</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>상세 정보 확인: docker secret inspect &lt;secret_name&gt;</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>삭제: docker secret rm &lt;secret_name&gt; (실행 중인 서비스에서 사용 중이면 삭제 불가)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>서비스에서 Secrets 사용</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker service create 사용 시: docker service create --name myservice --secret my_secret_data myimage</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker-compose.yml 파일 ( docker stack deploy 용):<br>version: \'3.8\' # 또는 secrets를 지원하는 최신 버전<br>services:<br>&nbsp; myapp:<br>&nbsp; &nbsp; image: myapp_image<br>&nbsp; &nbsp; secrets:<br>&nbsp; &nbsp; &nbsp; - db_password # 짧은 구문: secret 이름 \'db_password\', 컨테이너 내 경로 /run/secrets/db_password<br>&nbsp; &nbsp; &nbsp; # - source: app_config_secret # 긴 구문 예시<br>&nbsp; &nbsp; &nbsp; # &nbsp; target: /etc/app/config<br>&nbsp; &nbsp; &nbsp; # &nbsp; uid: \'1000\'<br>&nbsp; &nbsp; &nbsp; # &nbsp; gid: \'1000\'<br>&nbsp; &nbsp; &nbsp; # &nbsp; mode: 0400<br>&nbsp; &nbsp; environment:<br>&nbsp; &nbsp; &nbsp; # 애플리케이션이 이 파일에서 비밀번호를 읽도록 설정<br>&nbsp; &nbsp; &nbsp; DB_PASSWORD_FILE: /run/secrets/db_password<br>secrets:<br>&nbsp; db_password:<br>&nbsp; &nbsp; file:./db_password.txt # 호스트의 로컬 파일에서 secret 값 로드<br>&nbsp; # app_config_secret:<br>&nbsp; # &nbsp; external: true # Swarm에 이미 secret이 존재하는 경우<br>애플리케이션 코드는 환경 변수(예: DB_PASSWORD_FILE)가 가리키는 파일 경로에서 실제 secret 값을 읽도록 수정되어야 한다. 예를 들어, 공식 MySQL 이미지는 MYSQL_ROOT_PASSWORD_FILE 환경 변수를 통해 파일에서 비밀번호를 읽는 기능을 지원한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>Docker Secrets는 Swarm 환경에서 편리하고 통합된 민감 데이터 관리 방법을 제공하지만, 모든 시나리오에 적합한 것은 아니다. 독립 실행형 컨테이너나 Kubernetes와 같은 다른 오케스트레이션 환경에서는 HashiCorp Vault , AWS Secrets Manager, Azure Key Vault와 같은 외부 전용 시크릿 관리 도구를 고려하는 것이 좋다. 이는 Docker가 제공하는 기본 기능 외에, 조직의 요구사항이나 기존 인프라에 따라 더 강력하고 중앙화된 솔루션을 선택할 수 있음을 시사한다. 즉, 시크릿 관리 전략은 배포 모델과 조직의 보안 정책에 따라 계층적으로 접근해야 한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>외부 시크릿 관리 도구</strong>: HashiCorp Vault와 같은 도구는 보다 정교한 시크릿 관리, 접근 제어, 감사 로깅 기능을 제공하며, 다양한 환경과 통합될 수 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.3. 컨테이너화된 웹 애플리케이션 SSL/TLS 적용</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>웹 애플리케이션을 Docker 컨테이너로 배포할 때, 클라이언트와 서버 간의 통신을 암호화하기 위해 SSL/TLS를 적용하는 것은 필수적이다. (User Query)</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>일반적인 패턴: Nginx 리버스 프록시와 SSL 종료 (SSL Termination)</strong> Nginx 컨테이너가 HTTPS (443 포트) 요청을 수신하여 SSL/TLS 핸드셰이크를 처리하고, 암호화된 트래픽을 복호화한 후 내부 네트워크를 통해 HTTP로 애플리케이션 컨테이너(예: Node.js, Python 앱)에 전달하는 방식이 널리 사용된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>SSL/TLS 인증서 생성</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>자체 서명 인증서 (개발/테스트용)</strong>: OpenSSL 등을 사용하여 생성할 수 있다. 브라우저에서 기본적으로 신뢰하지 않으므로 경고가 표시된다.<br># 1. OpenSSL 설정 파일 준비 (예: my-site.conf [span_184](start_span)[span_184](end_span))<br># 2. 개인 키 및 인증서 생성<br>openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout my-site.key -out my-site.crt -config my-site.conf<br></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Let\'s Encrypt (프로덕션용)</strong>: 무료이며 자동화된 방식으로 신뢰할 수 있는 인증서를 발급받을 수 있다. Certbot과 같은 클라이언트를 사용하며, 도메인 소유권 검증이 필요하다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Nginx SSL 설정</strong>: Nginx 설정 파일 (nginx.conf)에 SSL 관련 지시어를 추가한다. 예시 nginx.conf 일부:<br>server {<br>&nbsp; &nbsp; listen 80;<br>&nbsp; &nbsp; server_name your_domain.com;<br>&nbsp; &nbsp; location / {<br>&nbsp; &nbsp; &nbsp; &nbsp; return 301 https://$host$request_uri; # HTTP를 HTTPS로 리디렉션<br>&nbsp; &nbsp; }<br>}<br><br>server {<br>&nbsp; &nbsp; listen 443 ssl;<br>&nbsp; &nbsp; server_name your_domain.com;<br><br>&nbsp; &nbsp; ssl_certificate /etc/ssl/certs/my-site.crt; &nbsp; &nbsp; &nbsp; # Nginx 컨테이너 내부의 인증서 경로<br>&nbsp; &nbsp; ssl_certificate_key /etc/ssl/private/my-site.key; # Nginx 컨테이너 내부의 개인 키 경로<br><br>&nbsp; &nbsp; # 추가적인 SSL 설정 (프로토콜, 암호화 스위트 등)<br>&nbsp; &nbsp; # ssl_protocols TLSv1.2 TLSv1.3;<br>&nbsp; &nbsp; # ssl_ciphers \'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:...\';<br><br>&nbsp; &nbsp; location / {<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_pass http://app_container_name:app_port; # 업스트림 애플리케이션 컨테이너<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header Host $host;<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Real-IP $remote_addr;<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br>&nbsp; &nbsp; &nbsp; &nbsp; proxy_set_header X-Forwarded-Proto $scheme;<br>&nbsp; &nbsp; }<br>}<br>Nginx용 Dockerfile에서는 이 설정 파일과 인증서/키 파일을 이미지에 복사하거나, 볼륨 또는 Docker Secrets(Swarm 사용 시)를 통해 마운트할 수 있다.<br>FROM nginx:latest<br>COPY nginx.conf /etc/nginx/nginx.conf<br>COPY my-site.crt /etc/ssl/certs/my-site.crt<br>COPY my-site.key /etc/ssl/private/my-site.key<br>Docker Compose를 사용하면 Nginx와 애플리케이션 컨테이너를 함께 정의하고 관리하기 용이하다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>10.4. 주요 Docker 보안 모범 사례</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>다음은 Docker 환경의 보안을 강화하기 위한 핵심적인 모범 사례들이다. 이러한 관행들은 개발 초기 단계부터 보안을 고려하는 \"Shift Left\" 접근 방식을 반영하며, 이는 단순히 런타임 설정뿐만 아니라 이미지 생성 및 관리 전반에 걸친 지속적인 노력을 포함한다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>컨테이너를 비루트(non-root) 사용자로 실행</strong>: 기본적으로 컨테이너는 내부에서 루트 사용자로 실행될 수 있으며, 이는 컨테이너가 손상될 경우 심각한 보안 위협이 될 수 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Dockerfile에서 USER &lt;non_root_user&gt;[:&lt;group&gt;] 지시어를 사용하여 컨테이너 실행 사용자를 지정한다. 필요한 경우 먼저 사용자와 그룹을 생성해야 한다 (예: RUN groupadd -r appgroup &amp;&amp; useradd -r -g appgroup appuser).</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker run 명령어 실행 시 -u &lt;username_or_UID&gt; 옵션을 사용할 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최소한의 기본 이미지 사용</strong>: 이미지 크기를 줄이고 불필요한 구성 요소 및 종속성을 제거하여 공격 표면을 최소화한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>alpine, busybox와 같은 경량 이미지나 Google의 distroless 이미지(예: gcr.io/distroless/static-debian11)를 사용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>이미지 정기적 취약점 스캔</strong>: 이미지에 포함된 소프트웨어 패키지의 알려진 취약점을 탐지하고 수정한다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>docker scan &lt;image_name&gt; (Snyk 또는 Docker Scout 기반) 명령어를 사용하거나, Trivy, Clair와 같은 오픈소스 스캐너를 활용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>CI/CD 파이프라인에 이미지 스캔 단계를 통합하여 자동화한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>신뢰할 수 있는 레지스트리(예: Docker Hub 유료 플랜, Harbor)의 내장 스캔 기능을 활용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>컨테이너 리소스 사용량 제한</strong>: 단일 컨테이너가 과도한 시스템 리소스(CPU, 메모리)를 사용하여 서비스 거부(DoS) 공격을 유발하거나 다른 컨테이너의 성능에 영향을 미치는 것을 방지한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker run 명령어의 --memory &lt;limit&gt;, --cpus &lt;limit&gt;, --pids-limit 등의 옵션을 사용하여 리소스를 제한한다. 이는 Linux의 cgroups 기능을 통해 구현된다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>보안 컨테이너 레지스트리 사용 및 관리</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Docker Hub의 공식 이미지나 검증된 게시자의 이미지를 우선적으로 사용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>자체 레지스트리를 운영하는 경우, TLS를 사용하여 통신을 암호화하고, 역할 기반 접근 제어(RBAC)를 구현하여 이미지 접근 권한을 관리한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>네트워크 분리 및 API 보안</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>사용자 정의 네트워크를 생성하여 컨테이너 간 통신을 격리하고, 필요한 경우에만 서로 통신하도록 허용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker 데몬 API 접근을 엄격히 제어하고, 가능하면 네트워크에 노출하지 않는다. 원격 접근이 필요하다면 TLS로 암호화하고 인증을 적용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 데몬 및 호스트 OS 최신 상태 유지</strong>:</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Engine 자체와 호스트 운영체제의 커널 및 관련 패키지에 대한 보안 업데이트를 정기적으로 적용한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Dockerfile 및 애플리케이션 코드 정적 분석</strong>:</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Hadolint, SonarQube와 같은 도구를 사용하여 Dockerfile의 잠재적인 보안 문제나 비효율적인 구성을 검사하고, 애플리케이션 코드의 보안 취약점을 분석한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 데몬 루트리스(Rootless) 모드 사용 (고급)</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Docker 데몬과 컨테이너를 일반 사용자로 실행하여 보안을 크게 향상시킨다. 호스트 시스템에 대한 잠재적 위험을 줄일 수 있다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>dockerd-rootless-setuptool.sh install 스크립트를 사용하여 설정할 수 있다. 일부 기능 제한이 있을 수 있으나, 점차 개선되고 있다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이러한 보안 관행들을 체계적으로 적용하면 Docker 환경의 전반적인 보안 수준을 크게 높일 수 있다. 다음 표는 주요 보안 모범 사례를 요약한 것이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>표 10.1: Docker 보안 모범 사례 체크리스트</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:table -->\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>카테고리</th><th>모범 사례</th><th>근거/이점</th><th>구현 방법 (간략히)</th></tr></thead><tbody><tr><td><strong>이미지 보안</strong></td><td>최소 기본 이미지 사용</td><td>공격 표면 감소, 이미지 크기 최적화</td><td>alpine, distroless 등 사용</td></tr><tr><td></td><td>이미지 취약점 스캔</td><td>알려진 취약점 사전 탐지 및 완화</td><td>docker scan, Trivy, Clair 등 CI/CD 통합</td></tr><tr><td></td><td>신뢰할 수 있는 이미지 소스 사용</td><td>악성 코드나 변조된 이미지 위험 감소</td><td>Docker Hub 공식 이미지, 검증된 게시자, 자체 보안 레지스트리 사용</td></tr><tr><td></td><td>멀티스테이지 빌드 활용</td><td>최종 이미지에서 빌드 도구 및 불필요한 아티팩트 제거, 이미지 크기 최적화</td><td>Dockerfile에서 여러 FROM 문 사용</td></tr><tr><td><strong>컨테이너 런타임 보안</strong></td><td>비루트 사용자로 컨테이너 실행</td><td>컨테이너 탈출 시 호스트 시스템 피해 최소화 (최소 권한 원칙)</td><td>Dockerfile에 USER 지시어 사용, docker run -u 옵션</td></tr><tr><td></td><td>리소스 사용량 제한</td><td>DoS 공격 방지, 시스템 안정성 확보</td><td>docker run 시 --memory, --cpus 등 옵션 사용</td></tr><tr><td></td><td>읽기 전용 루트 파일 시스템 사용</td><td>컨테이너 내부 파일 시스템 변경 방지, 불변성 강화</td><td>docker run --read-only 옵션 사용 (쓰기 가능한 tmpfs 마운트 필요할 수 있음)</td></tr><tr><td></td><td>AppArmor/Seccomp 프로파일 적용</td><td>컨테이너의 시스템 콜 제한, 커널 수준 보안 강화</td><td>Docker 기본 프로파일 사용 또는 사용자 정의 프로파일 적용</td></tr><tr><td><strong>호스트 및 데몬 보안</strong></td><td>호스트 OS 및 Docker Engine 최신 상태 유지</td><td>알려진 취약점 패치</td><td>정기적인 시스템 업데이트 및 Docker 버전 업그레이드</td></tr><tr><td></td><td>Docker 데몬 API 접근 제어</td><td>무단 접근 및 데몬 제어 방지</td><td>Unix 소켓 사용 권장, TCP 소켓 사용 시 TLS 인증 적용</td></tr><tr><td></td><td>루트리스 모드 사용 (가능한 경우)</td><td>데몬 및 컨테이너를 비루트 사용자로 실행하여 호스트 보안 강화</td><td>dockerd-rootless-setuptool.sh 사용</td></tr><tr><td><strong>데이터 보안</strong></td><td>민감 데이터 Docker Secrets 사용 (Swarm)</td><td>비밀번호, API 키 등을 안전하게 관리 및 컨테이너에 전달</td><td>docker secret create, 서비스 정의 시 secrets 블록 사용</td></tr><tr><td></td><td>외부 시크릿 관리 도구 활용</td><td>Swarm 외부 환경 또는 고급 시크릿 관리 요구사항 충족</td><td>HashiCorp Vault, AWS Secrets Manager 등 연동</td></tr><tr><td></td><td>볼륨 데이터 암호화 (필요시)</td><td>저장된 데이터 보호</td><td>호스트 수준 디스크 암호화 (예: LUKS) 또는 애플리케이션 수준 암호화</td></tr><tr><td><strong>네트워크 보안</strong></td><td>사용자 정의 네트워크로 컨테이너 분리</td><td>불필요한 컨테이너 간 통신 차단, 네트워크 세분화</td><td>docker network create, 컨테이너 실행 시 --network 옵션 사용</td></tr><tr><td></td><td>웹 애플리케이션에 SSL/TLS 적용</td><td>클라이언트-서버 간 통신 암호화</td><td>리버스 프록시(Nginx 등)에서 SSL 종료, Let\'s Encrypt 등 사용</td></tr><tr><td></td><td>불필요한 포트 노출 최소화</td><td>공격 표면 감소</td><td>Dockerfile의 EXPOSE는 문서화 목적, docker run -p로 실제 필요한 포트만 매핑</td></tr></tbody></table></figure>\n<!-- /wp:table -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>11. 결론 및 추가 자료</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>본 매뉴얼은 Ubuntu 24.04 LTS 환경에서 Docker를 설치하고 기본적인 사용법부터 컨테이너 관리, 시스템 유지보수, Python 애플리케이션 컨테이너화, 일반적인 문제 해결, 그리고 보안 강화 방안에 이르기까지 포괄적인 내용을 다루었다. Docker는 개발 환경의 일관성을 제공하고, 배포 프로세스를 단순화하며, 마이크로서비스 아키텍처 구현을 용이하게 하는 등 현대 애플리케이션 개발 및 운영에 있어 강력하고 유연한 도구임이 확인되었다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>특히, Dockerfile 최적화, 리소스 관리, 보안 모범 사례 적용은 안정적이고 효율적인 Docker 활용을 위해 매우 중요하다. 예를 들어, requirements.txt를 활용한 의존성 관리와 Docker 빌드 캐시의 이해는 이미지 빌드 시간을 단축시키며, docker system prune과 같은 명령어를 통한 주기적인 시스템 정리는 디스크 공간을 효율적으로 관리하는 데 기여한다. 또한, Docker Secrets나 SSL/TLS 적용과 같은 보안 조치는 민감한 데이터를 보호하고 안전한 서비스를 운영하는 데 필수적이다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Docker의 세계는 방대하며, 본 매뉴얼에서 다룬 내용은 그 시작점에 해당한다. 사용자의 숙련도와 요구사항에 따라 더 많은 고급 기능과 개념을 학습할 필요가 있다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>추가 학습을 위한 자료</strong>:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Docker 공식 문서 (Docker Docs)</strong>: <a href=\"https://docs.docker.com/\">https://docs.docker.com/</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>가장 정확하고 최신의 정보를 제공하는 기본 자료이다. 설치, 명령어 레퍼런스, 네트워킹, 스토리지, 보안 등 모든 주제를 망라한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Hub</strong>: <a href=\"https://hub.docker.com/\">https://hub.docker.com/</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>수많은 공식 및 커뮤니티 제공 Docker 이미지를 검색하고 공유할 수 있는 레지스트리이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker 커뮤니티 포럼 (Docker Community Forums)</strong>: <a href=\"https://forums.docker.com/\">https://forums.docker.com/</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>다른 Docker 사용자와 질문을 주고받거나 문제 해결 방법을 논의할 수 있는 공간이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>관련 GitHub 저장소</strong>:</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>Docker Engine: <a href=\"https://github.com/moby/moby\">https://github.com/moby/moby</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Compose: <a href=\"https://github.com/docker/compose\">https://github.com/docker/compose</a></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>향후 탐색해 볼 고급 주제</strong>:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>Docker Compose</strong>: YAML 파일을 사용하여 다중 컨테이너 애플리케이션을 정의하고 실행하는 도구이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>Docker Swarm 및 Kubernetes</strong>: 컨테이너 오케스트레이션 도구로, 여러 호스트에 걸쳐 컨테이너화된 애플리케이션을 배포, 확장, 관리하는 기능을 제공한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>고급 네트워킹</strong>: 오버레이 네트워크, 맥브랜(macvlan) 네트워크 등 다양한 네트워크 드라이버와 구성 방법을 이해한다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최적화된 멀티스테이지 Dockerfile 빌드</strong>: 빌드 컨텍스트를 줄이고 최종 이미지 크기를 최소화하기 위한 고급 Dockerfile 작성 기법이다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>루트리스 Docker (Rootless Docker)</strong>: 보안을 강화하기 위해 Docker 데몬과 컨테이너를 일반 사용자로 실행하는 방법이다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>꾸준한 학습과 실습을 통해 Docker의 강력한 기능을 최대한 활용하여 개발 및 운영 효율성을 높일 수 있기를 바란다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>참고 자료</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:list {\"ordered\":true} -->\n<ol class=\"wp-block-list\"><!-- wp:list-item -->\n<li><a href=\"https://docs.docker.com/engine/install/ubuntu\">https://docs.docker.com/engine/install/ubuntu</a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to Install Docker on Ubuntu 22.04 and 24.04 - phoenixNAP, <a href=\"https://phoenixnap.com/kb/install-docker-ubuntu\">https://phoenixnap.com/kb/install-docker-ubuntu</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Ubuntu | Docker Docs, <a href=\"https://docs.docker.com/engine/install/ubuntu/\">https://docs.docker.com/engine/install/ubuntu/</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to Install Docker on Ubuntu 24.04 | Vultr Docs, <a href=\"https://docs.vultr.com/how-to-install-docker-on-ubuntu-24-04 \">https://docs.vultr.com/how-to-install-docker-on-ubuntu-24-04 </a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How To Remove Docker Images, Containers, and Volumes ..., <a href=\"https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes\">https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Simplifying Containerization With Docker Run Command - BuildPiper, <a href=\"https://www.buildpiper.io/blogs/simplifying-containerization-with-docker-run-command/\">https://www.buildpiper.io/blogs/simplifying-containerization-with-docker-run-command/</a> </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Running containers | Docker Docs, <a href=\"https://docs.docker.com/engine/containers/run/ \">https://docs.docker.com/engine/containers/run/ </a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker container exec, <a href=\"https://docs.docker.com/reference/cli/docker/container/exec/ \">https://docs.docker.com/reference/cli/docker/container/exec/ </a></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Prune: A Complete Guide with Hands-On Examples - DataCamp, https://www.datacamp.com/tutorial/docker-prune </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Tidy up with docker system prune - Depot, https://depot.dev/blog/docker-system-prune </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to use docker system df command to check disk usage - LabEx, https://labex.io/tutorials/docker-how-to-use-docker-system-df-command-to-check-disk-usage-555247 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker system - Docker Docs, https://docs.docker.com/reference/cli/docker/system/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Error Bind: Address Already in Use | Baeldung on Linux, https://www.baeldung.com/linux/docker-address-already-in-use </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>[Docker CE] 도커 디렉토리 마운트 설정 에러 (Error response from ..., https://nirsa.tistory.com/54 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Security: 5 Risks and 5 Best Practices for Securing Your Containers - Tigera.io, https://www.tigera.io/learn/guides/container-security-best-practices/docker-security/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Docker Container Security Best Practices for Modern Applications - Wiz, https://www.wiz.io/academy/docker-container-security-best-practices </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Are there any comprehensive beginner-friendly guides to secure Docker or should I just switch to Podman? - Reddit, https://www.reddit.com/r/selfhosted/comments/1iwkul6/are_there_any_comprehensive_beginnerfriendly/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Securing Passwords in Docker | Baeldung on Ops, https://www.baeldung.com/ops/docker-securing-passwords </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Manage sensitive data with Docker secrets | Docker Docs, https://docs.docker.com/engine/swarm/secrets/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to use secrets in Docker Compose, https://docs.docker.com/compose/how-tos/use-secrets/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>docker secret create - Docker Docs, https://docs.docker.com/reference/cli/docker/secret/create/ </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How to secure a Docker registry with SSL/TLS encryption - LabEx, https://labex.io/tutorials/docker-how-to-secure-a-docker-registry-with-ssl-tls-encryption-411601 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Securing Docker Containers with SSL/TLS Certificates - GlobalSign, https://www.globalsign.com/en/blog/securing-docker-containers-ssl-tls-certificates </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>SSL with Docker images using nginx as reverse proxy - GitHub Gist, https://gist.github.com/dahlsailrunner/679e6dec5fd769f30bce90447ae80081 </li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>How To Secure a Containerized Node.js Application with Nginx, Let\'s Encrypt, and Docker Compose | DigitalOcean, https://www.digitalocean.com/community/tutorials/how-to-secure-a-containerized-node-js-application-with-nginx-let-s-encrypt-and-docker-compose</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->','Docker 설치 및 활용','','inherit','closed','closed','','18-revision-v1','','','2025-10-17 19:03:38','2025-10-17 10:03:38','',18,'https://rndpolicy.org/aidev/?p=117',0,'revision','',0),
(120,1,'2025-10-18 18:56:18','2025-10-18 09:56:18','','3bdd5406-ffb1-4cc8-a779-22ce034be3b5_우분투_설치-pdf','','inherit','open','closed','','3bdd5406-ffb1-4cc8-a779-22ce034be3b5_%ec%9a%b0%eb%b6%84%ed%88%ac_%ec%84%a4%ec%b9%98-pdf','','','2025-10-18 18:56:18','2025-10-18 09:56:18','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/06/3bdd5406-ffb1-4cc8-a779-22ce034be3b5_우분투_설치-pdf.jpg',0,'attachment','image/jpeg',0),
(126,1,'2025-10-18 18:56:19','2025-10-18 09:56:19','','blogs2','','inherit','open','closed','','blogs2','','','2025-10-18 18:56:19','2025-10-18 09:56:19','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/06/blogs2.png',0,'attachment','image/png',0),
(131,1,'2025-10-18 18:56:20','2025-10-18 09:56:20','','Screenshot-from-2025-07-28-17-08-41','','inherit','open','closed','','screenshot-from-2025-07-28-17-08-41','','','2025-10-18 18:56:20','2025-10-18 09:56:20','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-08-41.png',0,'attachment','image/png',0),
(132,1,'2025-10-18 18:56:21','2025-10-18 09:56:21','','Screenshot-from-2025-07-28-17-15-30','','inherit','open','closed','','screenshot-from-2025-07-28-17-15-30','','','2025-10-18 18:56:21','2025-10-18 09:56:21','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-15-30.png',0,'attachment','image/png',0),
(133,1,'2025-10-18 18:56:21','2025-10-18 09:56:21','','Screenshot-from-2025-07-28-17-16-09','','inherit','open','closed','','screenshot-from-2025-07-28-17-16-09','','','2025-10-18 18:56:21','2025-10-18 09:56:21','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-16-09.png',0,'attachment','image/png',0),
(134,1,'2025-10-18 18:56:22','2025-10-18 09:56:22','','Screenshot-from-2025-07-28-17-18-03','','inherit','open','closed','','screenshot-from-2025-07-28-17-18-03','','','2025-10-18 18:56:22','2025-10-18 09:56:22','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-18-03.png',0,'attachment','image/png',0),
(135,1,'2025-10-18 18:56:23','2025-10-18 09:56:23','','Screenshot-from-2025-07-28-17-19-58','','inherit','open','closed','','screenshot-from-2025-07-28-17-19-58','','','2025-10-18 18:56:23','2025-10-18 09:56:23','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/Screenshot-from-2025-07-28-17-19-58.png',0,'attachment','image/png',0),
(136,1,'2025-10-18 18:56:23','2025-10-18 09:56:23','','ai_agent','','inherit','open','closed','','ai_agent','','','2025-10-18 18:56:23','2025-10-18 09:56:23','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/ai_agent.png',0,'attachment','image/png',0),
(137,1,'2025-10-18 18:56:24','2025-10-18 09:56:24','','ai_basic_science','','inherit','open','closed','','ai_basic_science','','','2025-10-18 18:56:24','2025-10-18 09:56:24','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/ai_basic_science.png',0,'attachment','image/png',0),
(138,1,'2025-10-18 18:56:24','2025-10-18 09:56:24','','america_ai_action_plan','','inherit','open','closed','','america_ai_action_plan','','','2025-10-18 18:56:24','2025-10-18 09:56:24','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/america_ai_action_plan.png',0,'attachment','image/png',0),
(139,1,'2025-10-18 18:56:24','2025-10-18 09:56:24','','battery','','inherit','open','closed','','battery','','','2025-10-18 18:56:24','2025-10-18 09:56:24','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/battery.png',0,'attachment','image/png',0),
(140,1,'2025-10-18 18:56:25','2025-10-18 09:56:25','','blogs2','','inherit','open','closed','','blogs2-2','','','2025-10-18 18:56:25','2025-10-18 09:56:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/blogs2.png',0,'attachment','image/png',0),
(141,1,'2025-10-18 18:56:25','2025-10-18 09:56:25','','cropped-sprout','','inherit','open','closed','','cropped-sprout','','','2025-10-18 18:56:25','2025-10-18 09:56:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/cropped-sprout.png',0,'attachment','image/png',0),
(142,1,'2025-10-18 18:56:25','2025-10-18 09:56:25','','generativeAI','','inherit','open','closed','','generativeai','','','2025-10-18 18:56:25','2025-10-18 09:56:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/generativeAI.png',0,'attachment','image/png',0),
(143,1,'2025-10-18 18:56:25','2025-10-18 09:56:25','','image-1','','inherit','open','closed','','image-1','','','2025-10-18 18:56:25','2025-10-18 09:56:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-1.jpg',0,'attachment','image/jpeg',0),
(144,1,'2025-10-18 18:56:25','2025-10-18 09:56:25','','image-1','','inherit','open','closed','','image-1-2','','','2025-10-18 18:56:25','2025-10-18 09:56:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-1.png',0,'attachment','image/png',0),
(145,1,'2025-10-18 18:56:26','2025-10-18 09:56:26','','image-10','','inherit','open','closed','','image-10','','','2025-10-18 18:56:26','2025-10-18 09:56:26','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-10.jpg',0,'attachment','image/jpeg',0),
(146,1,'2025-10-18 18:56:26','2025-10-18 09:56:26','','image-100','','inherit','open','closed','','image-100','','','2025-10-18 18:56:26','2025-10-18 09:56:26','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-100.jpg',0,'attachment','image/jpeg',0),
(147,1,'2025-10-18 18:56:26','2025-10-18 09:56:26','','image-101','','inherit','open','closed','','image-101','','','2025-10-18 18:56:26','2025-10-18 09:56:26','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-101.jpg',0,'attachment','image/jpeg',0),
(148,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-102','','inherit','open','closed','','image-102','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-102.jpg',0,'attachment','image/jpeg',0),
(149,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-103','','inherit','open','closed','','image-103','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-103.jpg',0,'attachment','image/jpeg',0),
(150,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-104','','inherit','open','closed','','image-104','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-104.jpg',0,'attachment','image/jpeg',0),
(151,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-11','','inherit','open','closed','','image-11','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-11.jpg',0,'attachment','image/jpeg',0),
(152,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-12','','inherit','open','closed','','image-12','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-12.jpg',0,'attachment','image/jpeg',0),
(153,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-13','','inherit','open','closed','','image-13','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-13.jpg',0,'attachment','image/jpeg',0),
(154,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-14','','inherit','open','closed','','image-14','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-14.jpg',0,'attachment','image/jpeg',0),
(155,1,'2025-10-18 18:56:27','2025-10-18 09:56:27','','image-15','','inherit','open','closed','','image-15','','','2025-10-18 18:56:27','2025-10-18 09:56:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-15.jpg',0,'attachment','image/jpeg',0),
(156,1,'2025-10-18 18:56:28','2025-10-18 09:56:28','','image-16','','inherit','open','closed','','image-16','','','2025-10-18 18:56:28','2025-10-18 09:56:28','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-16.jpg',0,'attachment','image/jpeg',0),
(157,1,'2025-10-18 18:56:28','2025-10-18 09:56:28','','image-17','','inherit','open','closed','','image-17','','','2025-10-18 18:56:28','2025-10-18 09:56:28','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-17.jpg',0,'attachment','image/jpeg',0),
(158,1,'2025-10-18 18:56:28','2025-10-18 09:56:28','','image-18','','inherit','open','closed','','image-18','','','2025-10-18 18:56:28','2025-10-18 09:56:28','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-18.jpg',0,'attachment','image/jpeg',0),
(159,1,'2025-10-18 18:56:28','2025-10-18 09:56:28','','image-19','','inherit','open','closed','','image-19','','','2025-10-18 18:56:28','2025-10-18 09:56:28','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-19.jpg',0,'attachment','image/jpeg',0),
(160,1,'2025-10-18 18:56:28','2025-10-18 09:56:28','','image-2','','inherit','open','closed','','image-2','','','2025-10-18 18:56:28','2025-10-18 09:56:28','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-2.jpg',0,'attachment','image/jpeg',0),
(161,1,'2025-10-18 18:56:28','2025-10-18 09:56:28','','image-2','','inherit','open','closed','','image-2-2','','','2025-10-18 18:56:28','2025-10-18 09:56:28','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-2.png',0,'attachment','image/png',0),
(162,1,'2025-10-18 18:56:29','2025-10-18 09:56:29','','image-20','','inherit','open','closed','','image-20','','','2025-10-18 18:56:29','2025-10-18 09:56:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-20.jpg',0,'attachment','image/jpeg',0),
(163,1,'2025-10-18 18:56:29','2025-10-18 09:56:29','','image-21','','inherit','open','closed','','image-21','','','2025-10-18 18:56:29','2025-10-18 09:56:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-21.jpg',0,'attachment','image/jpeg',0),
(164,1,'2025-10-18 18:56:29','2025-10-18 09:56:29','','image-22','','inherit','open','closed','','image-22','','','2025-10-18 18:56:29','2025-10-18 09:56:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-22.jpg',0,'attachment','image/jpeg',0),
(165,1,'2025-10-18 18:56:29','2025-10-18 09:56:29','','image-23','','inherit','open','closed','','image-23','','','2025-10-18 18:56:29','2025-10-18 09:56:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-23.jpg',0,'attachment','image/jpeg',0),
(166,1,'2025-10-18 18:56:29','2025-10-18 09:56:29','','image-24','','inherit','open','closed','','image-24','','','2025-10-18 18:56:29','2025-10-18 09:56:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-24.jpg',0,'attachment','image/jpeg',0),
(167,1,'2025-10-18 18:56:29','2025-10-18 09:56:29','','image-25','','inherit','open','closed','','image-25','','','2025-10-18 18:56:29','2025-10-18 09:56:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-25.jpg',0,'attachment','image/jpeg',0),
(168,1,'2025-10-18 18:56:30','2025-10-18 09:56:30','','image-26','','inherit','open','closed','','image-26','','','2025-10-18 18:56:30','2025-10-18 09:56:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-26.jpg',0,'attachment','image/jpeg',0),
(169,1,'2025-10-18 18:56:30','2025-10-18 09:56:30','','image-27','','inherit','open','closed','','image-27','','','2025-10-18 18:56:30','2025-10-18 09:56:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-27.jpg',0,'attachment','image/jpeg',0),
(170,1,'2025-10-18 18:56:30','2025-10-18 09:56:30','','image-28','','inherit','open','closed','','image-28','','','2025-10-18 18:56:30','2025-10-18 09:56:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-28.jpg',0,'attachment','image/jpeg',0),
(171,1,'2025-10-18 18:56:30','2025-10-18 09:56:30','','image-29','','inherit','open','closed','','image-29','','','2025-10-18 18:56:30','2025-10-18 09:56:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-29.jpg',0,'attachment','image/jpeg',0),
(172,1,'2025-10-18 18:56:30','2025-10-18 09:56:30','','image-3','','inherit','open','closed','','image-3','','','2025-10-18 18:56:30','2025-10-18 09:56:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-3.jpg',0,'attachment','image/jpeg',0),
(173,1,'2025-10-18 18:56:30','2025-10-18 09:56:30','','image-30','','inherit','open','closed','','image-30','','','2025-10-18 18:56:30','2025-10-18 09:56:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-30.jpg',0,'attachment','image/jpeg',0),
(174,1,'2025-10-18 18:56:31','2025-10-18 09:56:31','','image-31','','inherit','open','closed','','image-31','','','2025-10-18 18:56:31','2025-10-18 09:56:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-31.jpg',0,'attachment','image/jpeg',0),
(175,1,'2025-10-18 18:56:31','2025-10-18 09:56:31','','image-32','','inherit','open','closed','','image-32','','','2025-10-18 18:56:31','2025-10-18 09:56:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-32.jpg',0,'attachment','image/jpeg',0),
(176,1,'2025-10-18 18:56:31','2025-10-18 09:56:31','','image-33','','inherit','open','closed','','image-33','','','2025-10-18 18:56:31','2025-10-18 09:56:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-33.jpg',0,'attachment','image/jpeg',0),
(177,1,'2025-10-18 18:56:31','2025-10-18 09:56:31','','image-34','','inherit','open','closed','','image-34','','','2025-10-18 18:56:31','2025-10-18 09:56:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-34.jpg',0,'attachment','image/jpeg',0),
(178,1,'2025-10-18 18:56:31','2025-10-18 09:56:31','','image-35','','inherit','open','closed','','image-35','','','2025-10-18 18:56:31','2025-10-18 09:56:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-35.jpg',0,'attachment','image/jpeg',0),
(179,1,'2025-10-18 18:56:31','2025-10-18 09:56:31','','image-36','','inherit','open','closed','','image-36','','','2025-10-18 18:56:31','2025-10-18 09:56:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-36.jpg',0,'attachment','image/jpeg',0),
(180,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-37','','inherit','open','closed','','image-37','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-37.jpg',0,'attachment','image/jpeg',0),
(181,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-38','','inherit','open','closed','','image-38','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-38.jpg',0,'attachment','image/jpeg',0),
(182,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-39','','inherit','open','closed','','image-39','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-39.jpg',0,'attachment','image/jpeg',0),
(183,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-4','','inherit','open','closed','','image-4','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-4.jpg',0,'attachment','image/jpeg',0),
(184,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-40','','inherit','open','closed','','image-40','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-40.jpg',0,'attachment','image/jpeg',0),
(185,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-41','','inherit','open','closed','','image-41','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-41.jpg',0,'attachment','image/jpeg',0),
(186,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-42','','inherit','open','closed','','image-42','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-42.jpg',0,'attachment','image/jpeg',0),
(187,1,'2025-10-18 18:56:32','2025-10-18 09:56:32','','image-43','','inherit','open','closed','','image-43','','','2025-10-18 18:56:32','2025-10-18 09:56:32','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-43.jpg',0,'attachment','image/jpeg',0),
(188,1,'2025-10-18 18:56:33','2025-10-18 09:56:33','','image-44','','inherit','open','closed','','image-44','','','2025-10-18 18:56:33','2025-10-18 09:56:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-44.jpg',0,'attachment','image/jpeg',0),
(189,1,'2025-10-18 18:56:33','2025-10-18 09:56:33','','image-45','','inherit','open','closed','','image-45','','','2025-10-18 18:56:33','2025-10-18 09:56:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-45.jpg',0,'attachment','image/jpeg',0),
(190,1,'2025-10-18 18:56:33','2025-10-18 09:56:33','','image-46','','inherit','open','closed','','image-46','','','2025-10-18 18:56:33','2025-10-18 09:56:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-46.jpg',0,'attachment','image/jpeg',0),
(191,1,'2025-10-18 18:56:33','2025-10-18 09:56:33','','image-47','','inherit','open','closed','','image-47','','','2025-10-18 18:56:33','2025-10-18 09:56:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-47.jpg',0,'attachment','image/jpeg',0),
(192,1,'2025-10-18 18:56:33','2025-10-18 09:56:33','','image-48','','inherit','open','closed','','image-48','','','2025-10-18 18:56:33','2025-10-18 09:56:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-48.jpg',0,'attachment','image/jpeg',0),
(193,1,'2025-10-18 18:56:33','2025-10-18 09:56:33','','image-49','','inherit','open','closed','','image-49','','','2025-10-18 18:56:33','2025-10-18 09:56:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-49.jpg',0,'attachment','image/jpeg',0),
(194,1,'2025-10-18 18:56:34','2025-10-18 09:56:34','','image-5','','inherit','open','closed','','image-5','','','2025-10-18 18:56:34','2025-10-18 09:56:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-5.jpg',0,'attachment','image/jpeg',0),
(195,1,'2025-10-18 18:56:34','2025-10-18 09:56:34','','image-50','','inherit','open','closed','','image-50','','','2025-10-18 18:56:34','2025-10-18 09:56:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-50.jpg',0,'attachment','image/jpeg',0),
(196,1,'2025-10-18 18:56:34','2025-10-18 09:56:34','','image-51','','inherit','open','closed','','image-51','','','2025-10-18 18:56:34','2025-10-18 09:56:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-51.jpg',0,'attachment','image/jpeg',0),
(197,1,'2025-10-18 18:56:34','2025-10-18 09:56:34','','image-52','','inherit','open','closed','','image-52','','','2025-10-18 18:56:34','2025-10-18 09:56:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-52.jpg',0,'attachment','image/jpeg',0),
(198,1,'2025-10-18 18:56:34','2025-10-18 09:56:34','','image-53','','inherit','open','closed','','image-53','','','2025-10-18 18:56:34','2025-10-18 09:56:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-53.jpg',0,'attachment','image/jpeg',0),
(199,1,'2025-10-18 18:56:34','2025-10-18 09:56:34','','image-54','','inherit','open','closed','','image-54','','','2025-10-18 18:56:34','2025-10-18 09:56:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-54.jpg',0,'attachment','image/jpeg',0),
(200,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-55','','inherit','open','closed','','image-55','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-55.jpg',0,'attachment','image/jpeg',0),
(201,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-56','','inherit','open','closed','','image-56','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-56.jpg',0,'attachment','image/jpeg',0),
(202,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-57','','inherit','open','closed','','image-57','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-57.jpg',0,'attachment','image/jpeg',0),
(203,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-58','','inherit','open','closed','','image-58','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-58.jpg',0,'attachment','image/jpeg',0),
(204,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-59','','inherit','open','closed','','image-59','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-59.jpg',0,'attachment','image/jpeg',0),
(205,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-6','','inherit','open','closed','','image-6','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-6.jpg',0,'attachment','image/jpeg',0),
(206,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-60','','inherit','open','closed','','image-60','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-60.jpg',0,'attachment','image/jpeg',0),
(207,1,'2025-10-18 18:56:35','2025-10-18 09:56:35','','image-61','','inherit','open','closed','','image-61','','','2025-10-18 18:56:35','2025-10-18 09:56:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-61.jpg',0,'attachment','image/jpeg',0),
(208,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-62','','inherit','open','closed','','image-62','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-62.jpg',0,'attachment','image/jpeg',0),
(209,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-63','','inherit','open','closed','','image-63','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-63.jpg',0,'attachment','image/jpeg',0),
(210,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-64','','inherit','open','closed','','image-64','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-64.jpg',0,'attachment','image/jpeg',0),
(211,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-65','','inherit','open','closed','','image-65','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-65.jpg',0,'attachment','image/jpeg',0),
(212,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-66','','inherit','open','closed','','image-66','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-66.jpg',0,'attachment','image/jpeg',0),
(213,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-67','','inherit','open','closed','','image-67','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-67.jpg',0,'attachment','image/jpeg',0),
(214,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-68','','inherit','open','closed','','image-68','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-68.jpg',0,'attachment','image/jpeg',0),
(215,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-69','','inherit','open','closed','','image-69','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-69.jpg',0,'attachment','image/jpeg',0),
(216,1,'2025-10-18 18:56:36','2025-10-18 09:56:36','','image-7','','inherit','open','closed','','image-7','','','2025-10-18 18:56:36','2025-10-18 09:56:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-7.jpg',0,'attachment','image/jpeg',0),
(217,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-70','','inherit','open','closed','','image-70','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-70.jpg',0,'attachment','image/jpeg',0),
(218,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-71','','inherit','open','closed','','image-71','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-71.jpg',0,'attachment','image/jpeg',0),
(219,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-72','','inherit','open','closed','','image-72','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-72.jpg',0,'attachment','image/jpeg',0),
(220,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-73','','inherit','open','closed','','image-73','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-73.jpg',0,'attachment','image/jpeg',0),
(221,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-74','','inherit','open','closed','','image-74','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-74.jpg',0,'attachment','image/jpeg',0),
(222,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-75','','inherit','open','closed','','image-75','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-75.jpg',0,'attachment','image/jpeg',0),
(223,1,'2025-10-18 18:56:37','2025-10-18 09:56:37','','image-76','','inherit','open','closed','','image-76','','','2025-10-18 18:56:37','2025-10-18 09:56:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-76.jpg',0,'attachment','image/jpeg',0),
(224,1,'2025-10-18 18:56:38','2025-10-18 09:56:38','','image-77','','inherit','open','closed','','image-77','','','2025-10-18 18:56:38','2025-10-18 09:56:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-77.jpg',0,'attachment','image/jpeg',0),
(225,1,'2025-10-18 18:56:38','2025-10-18 09:56:38','','image-78','','inherit','open','closed','','image-78','','','2025-10-18 18:56:38','2025-10-18 09:56:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-78.jpg',0,'attachment','image/jpeg',0),
(226,1,'2025-10-18 18:56:38','2025-10-18 09:56:38','','image-79','','inherit','open','closed','','image-79','','','2025-10-18 18:56:38','2025-10-18 09:56:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-79.jpg',0,'attachment','image/jpeg',0),
(227,1,'2025-10-18 18:56:38','2025-10-18 09:56:38','','image-8','','inherit','open','closed','','image-8','','','2025-10-18 18:56:38','2025-10-18 09:56:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-8.jpg',0,'attachment','image/jpeg',0),
(228,1,'2025-10-18 18:56:38','2025-10-18 09:56:38','','image-80','','inherit','open','closed','','image-80','','','2025-10-18 18:56:38','2025-10-18 09:56:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-80.jpg',0,'attachment','image/jpeg',0),
(229,1,'2025-10-18 18:56:38','2025-10-18 09:56:38','','image-81','','inherit','open','closed','','image-81','','','2025-10-18 18:56:38','2025-10-18 09:56:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-81.jpg',0,'attachment','image/jpeg',0),
(230,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-82','','inherit','open','closed','','image-82','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-82.jpg',0,'attachment','image/jpeg',0),
(231,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-83','','inherit','open','closed','','image-83','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-83.jpg',0,'attachment','image/jpeg',0),
(232,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-84','','inherit','open','closed','','image-84','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-84.jpg',0,'attachment','image/jpeg',0),
(233,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-85','','inherit','open','closed','','image-85','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-85.jpg',0,'attachment','image/jpeg',0),
(234,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-86','','inherit','open','closed','','image-86','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-86.jpg',0,'attachment','image/jpeg',0),
(235,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-87','','inherit','open','closed','','image-87','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-87.jpg',0,'attachment','image/jpeg',0),
(236,1,'2025-10-18 18:56:39','2025-10-18 09:56:39','','image-88','','inherit','open','closed','','image-88','','','2025-10-18 18:56:39','2025-10-18 09:56:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-88.jpg',0,'attachment','image/jpeg',0),
(237,1,'2025-10-18 18:56:40','2025-10-18 09:56:40','','image-89','','inherit','open','closed','','image-89','','','2025-10-18 18:56:40','2025-10-18 09:56:40','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-89.jpg',0,'attachment','image/jpeg',0),
(238,1,'2025-10-18 18:56:40','2025-10-18 09:56:40','','image-9','','inherit','open','closed','','image-9','','','2025-10-18 18:56:40','2025-10-18 09:56:40','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-9.jpg',0,'attachment','image/jpeg',0),
(239,1,'2025-10-18 18:56:40','2025-10-18 09:56:40','','image-90','','inherit','open','closed','','image-90','','','2025-10-18 18:56:40','2025-10-18 09:56:40','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-90.jpg',0,'attachment','image/jpeg',0),
(240,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-91','','inherit','open','closed','','image-91','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-91.jpg',0,'attachment','image/jpeg',0),
(241,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-92','','inherit','open','closed','','image-92','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-92.jpg',0,'attachment','image/jpeg',0),
(242,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-93','','inherit','open','closed','','image-93','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-93.jpg',0,'attachment','image/jpeg',0),
(243,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-94','','inherit','open','closed','','image-94','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-94.jpg',0,'attachment','image/jpeg',0),
(244,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-95','','inherit','open','closed','','image-95','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-95.jpg',0,'attachment','image/jpeg',0),
(245,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-96','','inherit','open','closed','','image-96','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-96.jpg',0,'attachment','image/jpeg',0),
(246,1,'2025-10-18 18:56:41','2025-10-18 09:56:41','','image-97','','inherit','open','closed','','image-97','','','2025-10-18 18:56:41','2025-10-18 09:56:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-97.jpg',0,'attachment','image/jpeg',0),
(247,1,'2025-10-18 18:56:42','2025-10-18 09:56:42','','image-98','','inherit','open','closed','','image-98','','','2025-10-18 18:56:42','2025-10-18 09:56:42','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-98.jpg',0,'attachment','image/jpeg',0),
(248,1,'2025-10-18 18:56:42','2025-10-18 09:56:42','','image-99','','inherit','open','closed','','image-99','','','2025-10-18 18:56:42','2025-10-18 09:56:42','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image-99.jpg',0,'attachment','image/jpeg',0),
(249,1,'2025-10-18 18:56:42','2025-10-18 09:56:42','','image','','inherit','open','closed','','image','','','2025-10-18 18:56:42','2025-10-18 09:56:42','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image.jpg',0,'attachment','image/jpeg',0),
(250,1,'2025-10-18 18:56:42','2025-10-18 09:56:42','','image','','inherit','open','closed','','image-105','','','2025-10-18 18:56:42','2025-10-18 09:56:42','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/image.png',0,'attachment','image/png',0),
(251,1,'2025-10-18 18:56:42','2025-10-18 09:56:42','','premium_photo-1664477117399-4e2e5af26deb','','inherit','open','closed','','premium_photo-1664477117399-4e2e5af26deb','','','2025-10-18 18:56:42','2025-10-18 09:56:42','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/premium_photo-1664477117399-4e2e5af26deb.jpg',0,'attachment','image/jpeg',0),
(252,1,'2025-10-18 18:56:44','2025-10-18 09:56:44','','sprout','','inherit','open','closed','','sprout','','','2025-10-18 18:56:44','2025-10-18 09:56:44','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/07/sprout.png',0,'attachment','image/png',0),
(253,1,'2025-10-18 18:56:44','2025-10-18 09:56:44','','3cb3f5fea376265bede0a4ac5bcc1ddc','','inherit','open','closed','','3cb3f5fea376265bede0a4ac5bcc1ddc','','','2025-10-18 18:56:44','2025-10-18 09:56:44','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/08/3cb3f5fea376265bede0a4ac5bcc1ddc.png',0,'attachment','image/png',0),
(254,1,'2025-10-18 18:56:46','2025-10-18 09:56:46','','image-1','','inherit','open','closed','','image-1-3','','','2025-10-18 18:56:46','2025-10-18 09:56:46','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/08/image-1.png',0,'attachment','image/png',0),
(255,1,'2025-10-18 18:56:47','2025-10-18 09:56:47','','image','','inherit','open','closed','','image-106','','','2025-10-18 18:56:47','2025-10-18 09:56:47','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/08/image.png',0,'attachment','image/png',0),
(256,1,'2025-10-18 18:56:48','2025-10-18 09:56:48','','image-1','','inherit','open','closed','','image-1-4','','','2025-10-18 18:56:48','2025-10-18 09:56:48','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-1.png',0,'attachment','image/png',0),
(257,1,'2025-10-18 18:56:50','2025-10-18 09:56:50','','image-10','','inherit','open','closed','','image-10-2','','','2025-10-18 18:56:50','2025-10-18 09:56:50','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-10.png',0,'attachment','image/png',0),
(258,1,'2025-10-18 18:56:51','2025-10-18 09:56:51','','image-11','','inherit','open','closed','','image-11-2','','','2025-10-18 18:56:51','2025-10-18 09:56:51','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-11.png',0,'attachment','image/png',0),
(259,1,'2025-10-18 18:56:52','2025-10-18 09:56:52','','image-12','','inherit','open','closed','','image-12-2','','','2025-10-18 18:56:52','2025-10-18 09:56:52','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-12.png',0,'attachment','image/png',0),
(260,1,'2025-10-18 18:56:53','2025-10-18 09:56:53','','image-13','','inherit','open','closed','','image-13-2','','','2025-10-18 18:56:53','2025-10-18 09:56:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-13.png',0,'attachment','image/png',0),
(261,1,'2025-10-18 18:56:54','2025-10-18 09:56:54','','image-14','','inherit','open','closed','','image-14-2','','','2025-10-18 18:56:54','2025-10-18 09:56:54','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-14.png',0,'attachment','image/png',0),
(262,1,'2025-10-18 18:56:54','2025-10-18 09:56:54','','image-15','','inherit','open','closed','','image-15-2','','','2025-10-18 18:56:54','2025-10-18 09:56:54','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-15.png',0,'attachment','image/png',0),
(263,1,'2025-10-18 18:56:55','2025-10-18 09:56:55','','image-16','','inherit','open','closed','','image-16-2','','','2025-10-18 18:56:55','2025-10-18 09:56:55','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-16.png',0,'attachment','image/png',0),
(264,1,'2025-10-18 18:56:56','2025-10-18 09:56:56','','image-17','','inherit','open','closed','','image-17-2','','','2025-10-18 18:56:56','2025-10-18 09:56:56','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-17.png',0,'attachment','image/png',0),
(265,1,'2025-10-18 18:56:56','2025-10-18 09:56:56','','image-18','','inherit','open','closed','','image-18-2','','','2025-10-18 18:56:56','2025-10-18 09:56:56','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-18.png',0,'attachment','image/png',0),
(266,1,'2025-10-18 18:56:57','2025-10-18 09:56:57','','image-19','','inherit','open','closed','','image-19-2','','','2025-10-18 18:56:57','2025-10-18 09:56:57','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-19.png',0,'attachment','image/png',0),
(267,1,'2025-10-18 18:56:58','2025-10-18 09:56:58','','image-2','','inherit','open','closed','','image-2-3','','','2025-10-18 18:56:58','2025-10-18 09:56:58','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-2.png',0,'attachment','image/png',0),
(268,1,'2025-10-18 18:57:00','2025-10-18 09:57:00','','image-20','','inherit','open','closed','','image-20-2','','','2025-10-18 18:57:00','2025-10-18 09:57:00','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-20.png',0,'attachment','image/png',0),
(269,1,'2025-10-18 18:57:00','2025-10-18 09:57:00','','image-21','','inherit','open','closed','','image-21-2','','','2025-10-18 18:57:00','2025-10-18 09:57:00','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-21.png',0,'attachment','image/png',0),
(270,1,'2025-10-18 18:57:01','2025-10-18 09:57:01','','image-22','','inherit','open','closed','','image-22-2','','','2025-10-18 18:57:01','2025-10-18 09:57:01','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-22.png',0,'attachment','image/png',0),
(271,1,'2025-10-18 18:57:02','2025-10-18 09:57:02','','image-23','','inherit','open','closed','','image-23-2','','','2025-10-18 18:57:02','2025-10-18 09:57:02','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-23.png',0,'attachment','image/png',0),
(272,1,'2025-10-18 18:57:04','2025-10-18 09:57:04','','image-24','','inherit','open','closed','','image-24-2','','','2025-10-18 18:57:04','2025-10-18 09:57:04','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-24.png',0,'attachment','image/png',0),
(273,1,'2025-10-18 18:57:05','2025-10-18 09:57:05','','image-25','','inherit','open','closed','','image-25-2','','','2025-10-18 18:57:05','2025-10-18 09:57:05','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-25.png',0,'attachment','image/png',0),
(274,1,'2025-10-18 18:57:06','2025-10-18 09:57:06','','image-26','','inherit','open','closed','','image-26-2','','','2025-10-18 18:57:06','2025-10-18 09:57:06','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-26.png',0,'attachment','image/png',0),
(275,1,'2025-10-18 18:57:07','2025-10-18 09:57:07','','image-27','','inherit','open','closed','','image-27-2','','','2025-10-18 18:57:07','2025-10-18 09:57:07','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-27.png',0,'attachment','image/png',0),
(276,1,'2025-10-18 18:57:07','2025-10-18 09:57:07','','image-28','','inherit','open','closed','','image-28-2','','','2025-10-18 18:57:07','2025-10-18 09:57:07','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-28.png',0,'attachment','image/png',0),
(277,1,'2025-10-18 18:57:08','2025-10-18 09:57:08','','image-29','','inherit','open','closed','','image-29-2','','','2025-10-18 18:57:08','2025-10-18 09:57:08','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-29.png',0,'attachment','image/png',0),
(278,1,'2025-10-18 18:57:10','2025-10-18 09:57:10','','image-3','','inherit','open','closed','','image-3-2','','','2025-10-18 18:57:10','2025-10-18 09:57:10','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-3.png',0,'attachment','image/png',0),
(279,1,'2025-10-18 18:57:11','2025-10-18 09:57:11','','image-30','','inherit','open','closed','','image-30-2','','','2025-10-18 18:57:11','2025-10-18 09:57:11','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-30.png',0,'attachment','image/png',0),
(280,1,'2025-10-18 18:57:12','2025-10-18 09:57:12','','image-31','','inherit','open','closed','','image-31-2','','','2025-10-18 18:57:12','2025-10-18 09:57:12','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-31.png',0,'attachment','image/png',0),
(281,1,'2025-10-18 18:57:14','2025-10-18 09:57:14','','image-32','','inherit','open','closed','','image-32-2','','','2025-10-18 18:57:14','2025-10-18 09:57:14','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-32.png',0,'attachment','image/png',0),
(282,1,'2025-10-18 18:57:15','2025-10-18 09:57:15','','image-33','','inherit','open','closed','','image-33-2','','','2025-10-18 18:57:15','2025-10-18 09:57:15','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-33.png',0,'attachment','image/png',0),
(283,1,'2025-10-18 18:57:15','2025-10-18 09:57:15','','image-34','','inherit','open','closed','','image-34-2','','','2025-10-18 18:57:15','2025-10-18 09:57:15','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-34.png',0,'attachment','image/png',0),
(284,1,'2025-10-18 18:57:16','2025-10-18 09:57:16','','image-35','','inherit','open','closed','','image-35-2','','','2025-10-18 18:57:16','2025-10-18 09:57:16','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-35.png',0,'attachment','image/png',0),
(285,1,'2025-10-18 18:57:18','2025-10-18 09:57:18','','image-36','','inherit','open','closed','','image-36-2','','','2025-10-18 18:57:18','2025-10-18 09:57:18','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-36.png',0,'attachment','image/png',0),
(286,1,'2025-10-18 18:57:18','2025-10-18 09:57:18','','image-37','','inherit','open','closed','','image-37-2','','','2025-10-18 18:57:18','2025-10-18 09:57:18','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-37.png',0,'attachment','image/png',0),
(287,1,'2025-10-18 18:57:19','2025-10-18 09:57:19','','image-38','','inherit','open','closed','','image-38-2','','','2025-10-18 18:57:19','2025-10-18 09:57:19','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-38.png',0,'attachment','image/png',0),
(288,1,'2025-10-18 18:57:22','2025-10-18 09:57:22','','image-39','','inherit','open','closed','','image-39-2','','','2025-10-18 18:57:22','2025-10-18 09:57:22','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-39.png',0,'attachment','image/png',0),
(289,1,'2025-10-18 18:57:22','2025-10-18 09:57:22','','image-4','','inherit','open','closed','','image-4-2','','','2025-10-18 18:57:22','2025-10-18 09:57:22','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-4.png',0,'attachment','image/png',0),
(290,1,'2025-10-18 18:57:24','2025-10-18 09:57:24','','image-40','','inherit','open','closed','','image-40-2','','','2025-10-18 18:57:24','2025-10-18 09:57:24','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-40.png',0,'attachment','image/png',0),
(291,1,'2025-10-18 18:57:24','2025-10-18 09:57:24','','image-41','','inherit','open','closed','','image-41-2','','','2025-10-18 18:57:24','2025-10-18 09:57:24','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-41.png',0,'attachment','image/png',0),
(292,1,'2025-10-18 18:57:24','2025-10-18 09:57:24','','image-42','','inherit','open','closed','','image-42-2','','','2025-10-18 18:57:24','2025-10-18 09:57:24','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-42.png',0,'attachment','image/png',0),
(293,1,'2025-10-18 18:57:25','2025-10-18 09:57:25','','image-43','','inherit','open','closed','','image-43-2','','','2025-10-18 18:57:25','2025-10-18 09:57:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-43.png',0,'attachment','image/png',0),
(294,1,'2025-10-18 18:57:25','2025-10-18 09:57:25','','image-44','','inherit','open','closed','','image-44-2','','','2025-10-18 18:57:25','2025-10-18 09:57:25','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-44.png',0,'attachment','image/png',0),
(295,1,'2025-10-18 18:57:26','2025-10-18 09:57:26','','image-45','','inherit','open','closed','','image-45-2','','','2025-10-18 18:57:26','2025-10-18 09:57:26','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-45.png',0,'attachment','image/png',0),
(296,1,'2025-10-18 18:57:27','2025-10-18 09:57:27','','image-46','','inherit','open','closed','','image-46-2','','','2025-10-18 18:57:27','2025-10-18 09:57:27','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-46.png',0,'attachment','image/png',0),
(297,1,'2025-10-18 18:57:29','2025-10-18 09:57:29','','image-47','','inherit','open','closed','','image-47-2','','','2025-10-18 18:57:29','2025-10-18 09:57:29','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-47.png',0,'attachment','image/png',0),
(298,1,'2025-10-18 18:57:30','2025-10-18 09:57:30','','image-48','','inherit','open','closed','','image-48-2','','','2025-10-18 18:57:30','2025-10-18 09:57:30','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-48.png',0,'attachment','image/png',0),
(299,1,'2025-10-18 18:57:31','2025-10-18 09:57:31','','image-49','','inherit','open','closed','','image-49-2','','','2025-10-18 18:57:31','2025-10-18 09:57:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-49.png',0,'attachment','image/png',0),
(300,1,'2025-10-18 18:57:31','2025-10-18 09:57:31','','image-5','','inherit','open','closed','','image-5-2','','','2025-10-18 18:57:31','2025-10-18 09:57:31','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-5.png',0,'attachment','image/png',0),
(301,1,'2025-10-18 18:57:33','2025-10-18 09:57:33','','image-50','','inherit','open','closed','','image-50-2','','','2025-10-18 18:57:33','2025-10-18 09:57:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-50.png',0,'attachment','image/png',0),
(302,1,'2025-10-18 18:57:33','2025-10-18 09:57:33','','image-51','','inherit','open','closed','','image-51-2','','','2025-10-18 18:57:33','2025-10-18 09:57:33','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-51.png',0,'attachment','image/png',0),
(303,1,'2025-10-18 18:57:34','2025-10-18 09:57:34','','image-52','','inherit','open','closed','','image-52-2','','','2025-10-18 18:57:34','2025-10-18 09:57:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-52.png',0,'attachment','image/png',0),
(304,1,'2025-10-18 18:57:34','2025-10-18 09:57:34','','image-53','','inherit','open','closed','','image-53-2','','','2025-10-18 18:57:34','2025-10-18 09:57:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-53.png',0,'attachment','image/png',0),
(305,1,'2025-10-18 18:57:34','2025-10-18 09:57:34','','image-54','','inherit','open','closed','','image-54-2','','','2025-10-18 18:57:34','2025-10-18 09:57:34','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-54.png',0,'attachment','image/png',0),
(306,1,'2025-10-18 18:57:35','2025-10-18 09:57:35','','image-55','','inherit','open','closed','','image-55-2','','','2025-10-18 18:57:35','2025-10-18 09:57:35','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-55.png',0,'attachment','image/png',0),
(307,1,'2025-10-18 18:57:36','2025-10-18 09:57:36','','image-56','','inherit','open','closed','','image-56-2','','','2025-10-18 18:57:36','2025-10-18 09:57:36','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-56.png',0,'attachment','image/png',0),
(308,1,'2025-10-18 18:57:37','2025-10-18 09:57:37','','image-57','','inherit','open','closed','','image-57-2','','','2025-10-18 18:57:37','2025-10-18 09:57:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-57.png',0,'attachment','image/png',0),
(309,1,'2025-10-18 18:57:37','2025-10-18 09:57:37','','image-58','','inherit','open','closed','','image-58-2','','','2025-10-18 18:57:37','2025-10-18 09:57:37','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-58.png',0,'attachment','image/png',0),
(310,1,'2025-10-18 18:57:38','2025-10-18 09:57:38','','image-59','','inherit','open','closed','','image-59-2','','','2025-10-18 18:57:38','2025-10-18 09:57:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-59.png',0,'attachment','image/png',0),
(311,1,'2025-10-18 18:57:38','2025-10-18 09:57:38','','image-6','','inherit','open','closed','','image-6-2','','','2025-10-18 18:57:38','2025-10-18 09:57:38','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-6.png',0,'attachment','image/png',0),
(312,1,'2025-10-18 18:57:39','2025-10-18 09:57:39','','image-60','','inherit','open','closed','','image-60-2','','','2025-10-18 18:57:39','2025-10-18 09:57:39','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-60.png',0,'attachment','image/png',0),
(313,1,'2025-10-18 18:57:40','2025-10-18 09:57:40','','image-61','','inherit','open','closed','','image-61-2','','','2025-10-18 18:57:40','2025-10-18 09:57:40','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-61.png',0,'attachment','image/png',0),
(314,1,'2025-10-18 18:57:41','2025-10-18 09:57:41','','image-62','','inherit','open','closed','','image-62-2','','','2025-10-18 18:57:41','2025-10-18 09:57:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-62.png',0,'attachment','image/png',0),
(315,1,'2025-10-18 18:57:41','2025-10-18 09:57:41','','image-63','','inherit','open','closed','','image-63-2','','','2025-10-18 18:57:41','2025-10-18 09:57:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-63.png',0,'attachment','image/png',0),
(316,1,'2025-10-18 18:57:41','2025-10-18 09:57:41','','image-64','','inherit','open','closed','','image-64-2','','','2025-10-18 18:57:41','2025-10-18 09:57:41','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-64.png',0,'attachment','image/png',0),
(317,1,'2025-10-18 18:57:42','2025-10-18 09:57:42','','image-65','','inherit','open','closed','','image-65-2','','','2025-10-18 18:57:42','2025-10-18 09:57:42','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-65.png',0,'attachment','image/png',0),
(318,1,'2025-10-18 18:57:43','2025-10-18 09:57:43','','image-66','','inherit','open','closed','','image-66-2','','','2025-10-18 18:57:43','2025-10-18 09:57:43','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-66.png',0,'attachment','image/png',0),
(319,1,'2025-10-18 18:57:43','2025-10-18 09:57:43','','image-67','','inherit','open','closed','','image-67-2','','','2025-10-18 18:57:43','2025-10-18 09:57:43','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-67.png',0,'attachment','image/png',0),
(320,1,'2025-10-18 18:57:43','2025-10-18 09:57:43','','image-68','','inherit','open','closed','','image-68-2','','','2025-10-18 18:57:43','2025-10-18 09:57:43','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-68.png',0,'attachment','image/png',0),
(321,1,'2025-10-18 18:57:44','2025-10-18 09:57:44','','image-69','','inherit','open','closed','','image-69-2','','','2025-10-18 18:57:44','2025-10-18 09:57:44','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-69.png',0,'attachment','image/png',0),
(322,1,'2025-10-18 18:57:45','2025-10-18 09:57:45','','image-7','','inherit','open','closed','','image-7-2','','','2025-10-18 18:57:45','2025-10-18 09:57:45','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-7.png',0,'attachment','image/png',0),
(323,1,'2025-10-18 18:57:45','2025-10-18 09:57:45','','image-70','','inherit','open','closed','','image-70-2','','','2025-10-18 18:57:45','2025-10-18 09:57:45','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-70.png',0,'attachment','image/png',0),
(324,1,'2025-10-18 18:57:45','2025-10-18 09:57:45','','image-71','','inherit','open','closed','','image-71-2','','','2025-10-18 18:57:45','2025-10-18 09:57:45','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-71.png',0,'attachment','image/png',0),
(325,1,'2025-10-18 18:57:46','2025-10-18 09:57:46','','image-72','','inherit','open','closed','','image-72-2','','','2025-10-18 18:57:46','2025-10-18 09:57:46','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-72.png',0,'attachment','image/png',0),
(326,1,'2025-10-18 18:57:48','2025-10-18 09:57:48','','image-8','','inherit','open','closed','','image-8-2','','','2025-10-18 18:57:48','2025-10-18 09:57:48','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-8.png',0,'attachment','image/png',0),
(327,1,'2025-10-18 18:57:48','2025-10-18 09:57:48','','image-9','','inherit','open','closed','','image-9-2','','','2025-10-18 18:57:48','2025-10-18 09:57:48','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image-9.png',0,'attachment','image/png',0),
(328,1,'2025-10-18 18:57:49','2025-10-18 09:57:49','','image','','inherit','open','closed','','image-107','','','2025-10-18 18:57:49','2025-10-18 09:57:49','',0,'https://rndpolicy.org/aidev/wp-content/uploads/2025/09/image.png',0,'attachment','image/png',0),
(362,1,'2025-10-18 18:57:52','2025-10-18 09:57:52','','cover_photo-300','','inherit','open','closed','','cover_photo-300-2','','','2025-10-18 18:57:52','2025-10-18 09:57:52','',0,'https://rndpolicy.org/aidev/wp-content/uploads/ultimatemember/3/cover_photo-300.jpg',0,'attachment','image/jpeg',0),
(363,1,'2025-10-18 18:57:52','2025-10-18 09:57:52','','cover_photo-600','','inherit','open','closed','','cover_photo-600-2','','','2025-10-18 18:57:52','2025-10-18 09:57:52','',0,'https://rndpolicy.org/aidev/wp-content/uploads/ultimatemember/3/cover_photo-600.jpg',0,'attachment','image/jpeg',0),
(364,1,'2025-10-18 18:57:52','2025-10-18 09:57:52','','cover_photo','','inherit','open','closed','','cover_photo-2','','','2025-10-18 18:57:52','2025-10-18 09:57:52','',0,'https://rndpolicy.org/aidev/wp-content/uploads/ultimatemember/3/cover_photo.jpg',0,'attachment','image/jpeg',0),
(365,1,'2025-10-18 18:57:52','2025-10-18 09:57:52','','cover_photo_temp','','inherit','open','closed','','cover_photo_temp','','','2025-10-18 18:57:52','2025-10-18 09:57:52','',0,'https://rndpolicy.org/aidev/wp-content/uploads/ultimatemember/3/cover_photo_temp.png',0,'attachment','image/png',0),
(368,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','email-summaries','','inherit','open','closed','','email-summaries','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforms/cache/email-summaries.json',0,'attachment','application/json',0),
(369,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','index','','inherit','open','closed','','index','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforms/cache/index.html',0,'attachment','application/x-empty',0),
(370,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','splash','','inherit','open','closed','','splash','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforms/cache/splash.json',0,'attachment','application/json',0),
(371,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','templates','','inherit','open','closed','','templates','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforms/cache/templates.json',0,'attachment','text/plain',0),
(372,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','themes-custom','','inherit','open','closed','','themes-custom','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforms/themes/themes-custom.json',0,'attachment','application/json',0),
(373,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','colors','','inherit','open','closed','','colors','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforo/assets/colors.css',0,'attachment','text/plain',0),
(384,1,'2025-10-18 18:57:53','2025-10-18 09:57:53','','55153aa9d9b1e7cfaec480af364c4fa9','','inherit','open','closed','','55153aa9d9b1e7cfaec480af364c4fa9','','','2025-10-18 18:57:53','2025-10-18 09:57:53','',0,'https://rndpolicy.org/aidev/wp-content/uploads/wpforo/cache/forum/55153aa9d9b1e7cfaec480af364c4fa9',0,'attachment','text/plain',0),
(472,1,'2025-10-18 19:07:49','2025-10-18 10:07:49','<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>지식</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Dify의 지식 기능은 RAG 파이프라인의 각 단계를 시각화하여 애플리케이션 개발자가 개인 또는 팀 지식을 쉽게 관리할 수 있는 사용자 친화적인 UI를 제공합니다. 또한 AI 애플리케이션과의 원활한 통합을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>개발자는 회사 내부 문서, FAQ, 표준 작업 가이드를 업로드한 다음, 대규모 언어 모델(LLM)에서 쿼리할 수 있는 구조화된 데이터로 처리할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>AI 모델에 내장된 정적인 사전 학습 데이터 세트와 비교했을 때, 지식 기반의 콘텐츠는 실시간으로 업데이트될 수 있으므로 LLM은 항상 최신 정보에 액세스할 수 있고 오래되거나 누락된 데이터로 인해 발생하는 문제를 방지하는 데 도움이 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>LLM은 사용자 질의를 수신하면 먼저 키워드를 사용하여 지식 베이스 내에서 검색합니다. 지식 베이스는 이러한 키워드를 기반으로 관련성이 높은 순위의 콘텐츠 청크를 반환하며, 이를 통해 LLM은 더욱 정확한 답변을 생성하는 데 중요한 맥락을 확보하게 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이러한 접근 방식은 LLM이 사전 훈련된 지식에만 의존하지 않도록 보장합니다. 대신, 실시간 문서와 데이터베이스를 활용하여 답변의 정확성과 관련성을 모두 향상시킬 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>주요 장점</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>• 실시간 업데이트&nbsp;: 지식 기반은 언제든지 업데이트할 수 있으므로 모델에 항상 최신 정보가 유지됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>•&nbsp;정확성&nbsp;: LLM은 관련 문서를 검색하여 실제 정보를 바탕으로 답변을 도출하고 환각을 최소화할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>•&nbsp;유연성&nbsp;: 개발자는 특정 요구 사항에 맞게 지식 기반 콘텐츠를 사용자 정의하고 필요에 따라 지식 범위를 정의할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p>다음과 같은 텍스트 콘텐츠만 준비하면 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>긴 텍스트 콘텐츠(TXT, Markdown, DOCX, HTML, JSONL 또는 PDF 파일)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>구조화된 데이터(CSV, Excel 등)</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>온라인 데이터 소스(웹 페이지, Notion 등)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>지식베이스&nbsp;에 파일을 업로드하기만 하면&nbsp;데이터 처리가 자동으로 처리됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>팀에 이미 독립적인 지식 기반이 있는 경우&nbsp;\"외부 지식 기반에 연결\"&nbsp;기능을 사용하여 Dify와의 연결을 설정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":260,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-2-1024x584.jpg\" alt=\"\" class=\"wp-image-260\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/readme#use-case\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>사용 사례</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기존 지식 기반과 제품 문서를 기반으로 AI 고객 지원 도우미를 만들려면 해당 파일을 Dify의 지식 기반에 업로드한 다음 대화형 애플리케이션을 설정하기만 하면 됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>전통적으로 원시 텍스트 학습에서 완전히 개발된 AI 고객 지원 챗봇으로 전환하는 데는 몇 주가 걸릴 수 있으며, 효과적으로 유지 관리하고 반복하는 것도 어렵습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify에서는 전체 프로세스가 단 3분 만에 완료되며, 그 후 즉시 사용자 피드백을 수집할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/readme#knowledge-base-and-documents\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>지식 기반 및 문서</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify에서 지식 베이스는 여러 문서의 모음이며, 각 문서에는 여러 개의 콘텐츠 청크가 포함될 수 있습니다. 전체 지식 베이스를 애플리케이션에 통합하여 업로드된 파일이나 다른 소스에서 동기화된 데이터를 활용하여 검색 컨텍스트로 활용할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>팀에 Dify 플랫폼과 별개의 독립적인 외부 지식이 이미 있는 경우,&nbsp;외부 지식 베이스&nbsp;기능을 사용하여 연결할 수 있습니다. 이렇게 하면 모든 콘텐츠를 Dify에 다시 업로드할 필요가 없습니다. AI 앱은 팀의 기존 지식에서 실시간으로 정보에 직접 액세스하고 처리할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3,\"metadata\":{\"name\":\"헤딩\"},\"style\":{\"typography\":{\"fontSize\":\"48px\"}}} -->\n<h3 class=\"wp-block-heading\" style=\"font-size:48px\"><strong>지식 기반 만들기</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>지식 기반을 생성하기 위해 문서를 업로드하는 단계:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":1} -->\n<ol start=\"1\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>지식 기반을 만들고 로컬 문서 파일이나 온라인 데이터를 가져옵니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/import-content-data\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>텍스트 데이터 가져오기</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>지식 기반을 만들고 로컬 문서 파일이나 온라인 데이터를 가져옵니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true,\"start\":2} -->\n<ol start=\"2\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>청킹 모드를 선택하고 분할 결과를 미리 확인하세요. 이 단계에서는 긴 텍스트를 여러 개의 작은 청크로 나누는 콘텐츠 전처리 및 구조화가 진행됩니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/chunking-and-cleaning-text\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>청크 모드를 선택하세요</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>청킹 모드를 선택하고 분할 결과를 미리 확인하세요. 이 단계에서는 긴 텍스트를 여러 개의 작은 청크로 나누는 콘텐츠 전처리 및 구조화가 진행됩니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true,\"start\":3} -->\n<ol start=\"3\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>색인 방법과 검색 설정을 구성합니다. 지식 기반은 사용자 질의를 수신하면 미리 설정된 검색 방법에 따라 기존 문서를 검색하고 관련성이 높은 콘텐츠 청크를 추출합니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/setting-indexing-methods\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>인덱싱 방법과 검색 설정을 선택하세요</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>색인 방법과 검색 설정을 구성합니다. 지식 기반은 사용자 질의를 수신하면 미리 설정된 검색 방법에 따라 기존 문서를 검색하고 관련성이 높은 콘텐츠 청크를 추출합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:list {\"ordered\":true,\"start\":4} -->\n<ol start=\"4\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>청크 임베딩이 완료될 때까지 기다리세요.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>완료되면 지식 기반을 애플리케이션에 연결하고 사용을 시작하세요. 그런 다음 지식&nbsp;<strong>기반을 애플리케이션에 통합하여 지식 기반 Q&amp;A를 지원하는 LLM을 구축할 수 있습니다. 지식 기반을 추가로 수정하고 관리하려면&nbsp;지식 기반 및 문서 유지 관리를</strong>&nbsp;참조하세요&nbsp;.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":258,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-1024x528.jpg\" alt=\"\" class=\"wp-image-258\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-base-creation/introduction#embedding\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>임베딩</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>임베딩은</strong>&nbsp;이산 변수(단어, 문장, 문서)를 연속 벡터 표현으로 변환하여 고차원 데이터를 저차원 공간에 매핑합니다. 이 기법은 차원을 줄이는 동시에 중요한 의미 정보를 보존하여 콘텐츠 검색 효율을 향상시킵니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>임베딩 모델은</strong>&nbsp;특수화된 대규모 언어 모델로, 텍스트를 고밀도 수치 벡터로 변환하고 의미적 뉘앙스를 효과적으로 포착하여 데이터 처리 및 분석을 개선하는 데 탁월합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>1. 텍스트 데이터 가져오기</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>Dify의 메인 네비게이션 바에서 \'지식\'을 클릭하세요. 이 페이지에서 기존 지식 베이스를 확인할 수 있습니다.&nbsp;<strong>\'</strong><strong>지식 만들기\'를</strong>&nbsp;클릭하면 설정 마법사가 시작됩니다. 이 지식 베이스는 다음 두 가지 온라인 데이터 가져오기를 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify 상단 탐색 모음에서&nbsp;<strong>\'</strong><strong>지식\'을</strong>&nbsp;클릭한 다음&nbsp;<strong>\'</strong><strong>지식 만들기\'를</strong>&nbsp;선택하세요 . 지식에 문서를 업로드하거나 온라인 데이터를 가져올 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/readme#upload-local-files\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>로컬 파일 업로드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>업로드할 파일을 드래그 앤 드롭하거나 선택하세요. 일괄 업로드</strong>&nbsp;에 허용되는 파일 수는&nbsp;<a href=\"https://dify.ai/pricing\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>구독</strong><strong> </strong><strong>플랜</strong></a>&nbsp;에 따라 다릅니다&nbsp;.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>문서 업로드 제한 사항:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>단일 문서의 업로드 크기 제한은 15MB입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":259,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-1-1024x459.jpg\" alt=\"\" class=\"wp-image-259\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/readme#import-from-online-data-source\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>온라인 데이터 소스에서 가져오기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>지식을</strong>&nbsp;생성할 때&nbsp;온라인 소스에서 데이터를 가져올 수 있습니다. 이 지식은 다음 두 가지 유형의 온라인 데이터를 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>1.1 Notion에서 데이터 가져오기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Notion에서 데이터를 가져오는 방법을 알아보세요</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>1.2 웹사이트에서 동기화</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>웹사이트에서 데이터를 동기화하는 방법을 알아보세요</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반이 온라인 데이터를 사용하도록 설정된 경우, 나중에 로컬 문서를 추가하거나 로컬 파일 기반 모드로 전환할 수 없습니다. 이를 통해 단일 지식 기반에 여러 데이터 소스가 혼합되는 것을 방지하여 관리 복잡성을 방지할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/readme#adding-data-later\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>나중에 데이터 추가</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>아직 문서나 기타 콘텐츠를 준비하지 않았다면 먼저 빈 지식 베이스를 만드세요. 그러면 준비가 되면 언제든지 로컬 파일을 업로드하거나 온라인 데이터를 가져올 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1.1 Notion에서 데이터 동기화</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>페이지 복사</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Dify 데이터 세트는 Notion에서 데이터를 가져오고 동기화를</strong>&nbsp;설정하여&nbsp;Notion의 데이터 업데이트가 자동으로 Dify에 동기화되도록 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#authorization-verification\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>권한 확인</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":1} -->\n<ol start=\"1\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>데이터 세트를 생성하고 데이터 소스를 선택할 때&nbsp;<strong>Notion </strong><strong>콘텐츠에서 동기화 - 지금 바인딩을</strong>&nbsp;클릭 하고 메시지에 따라 권한 검증을 완료합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>또는&nbsp;<strong>설정 — 데이터 소스 — 데이터 소스 추가</strong>&nbsp;로 이동하여 Notion 소스&nbsp;<strong>바인딩을</strong>&nbsp;클릭 하고 권한 확인을 완료할 수 있습니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":277,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-8-1024x435.jpg\" alt=\"\" class=\"wp-image-277\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#importing-notion-data\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Notion 데이터 가져오기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>권한 검증을 완료한 후 데이터 세트 생성 페이지로 이동하여&nbsp;<strong>Notion </strong><strong>콘텐츠에서 동기화를</strong>&nbsp;클릭 하고 가져와야 하는 권한 있는 페이지를 선택합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":273,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-4-1024x524.jpg\" alt=\"\" class=\"wp-image-273\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#chunking-and-cleaning\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>청킹 및 청소</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음으로, 지식 베이스의&nbsp;<a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion.md#chunking-and-cleaning\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>청킹</strong><strong> </strong><strong>모드</strong></a>&nbsp;와&nbsp;<a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods.md\"><strong>인덱싱</strong><strong> </strong><strong>방법을</strong></a>&nbsp;선택하고 저장한 후 자동 처리될 때까지 기다리세요. Dify는 표준 Notion 페이지 가져오기를 지원할 뿐만 아니라 데이터베이스 유형 페이지의 페이지 속성을 통합하고 저장할 수도 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><em>참고: 이미지와 파일은 가져올 수 없으며, 표의 데이터는 텍스트로 변환됩니다.</em></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":272,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-3-1024x481.jpg\" alt=\"\" class=\"wp-image-272\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#synchronizing-notion-data\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Notion 데이터 동기화</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Notion 콘텐츠가 업데이트된 경우,&nbsp;지식 베이스 문서 목록에서 해당 페이지의 \'&nbsp;<strong>동기화\' 버튼을 클릭하여 변경 사항을 동기화할 수 있습니다. 동기화에는 임베딩 프로세스가 포함되며, 이 과정에서 임베딩 모델의 토큰이 사용됩니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":274,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-5-1024x521.jpg\" alt=\"\" class=\"wp-image-274\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#integration-configuration-method-for-community-edition-notion\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>커뮤니티 에디션 Notion 통합 구성 방법</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Notion은 내부 통합</strong>&nbsp;과&nbsp;<strong>공개 통합</strong>&nbsp;, 두 가지 통합 옵션을 제공합니다&nbsp;. 두 방법의 차이점에 대한 자세한 내용은&nbsp;<a href=\"https://developers.notion.com/docs/authorization\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Notion </strong><strong>공식</strong><strong> </strong><strong>문서</strong></a>&nbsp;를 참조하세요 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#1-using-internal-integration\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>1. 내부 통합 사용</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>먼저, 통합 설정 페이지 \'&nbsp;<a href=\"https://www.notion.so/my-integrations\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>통합</strong><strong> </strong><strong>만들기\'</strong></a>&nbsp;에서 통합을 생성합니다 . 기본적으로 모든 통합은 내부 통합으로 시작하며, 내부 통합은 선택한 작업 공간과 연결되므로 통합을 생성하려면 작업 공간 소유자여야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>구체적인 단계:</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>새 통합</strong>&nbsp;버튼을 클릭하세요&nbsp;. 유형은 기본적으로&nbsp;<strong>내부</strong>&nbsp;(Internal)이며 수정할 수 없습니다. 연결된 스페이스를 선택하고 통합 이름을 입력한 후 로고를 업로드하고&nbsp;<strong>제출(Submit)을</strong>&nbsp;클릭하면 통합이 성공적으로 생성됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":276,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-7-1024x850.jpg\" alt=\"\" class=\"wp-image-276\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>통합을 만든 후에는 기능 탭에서 필요에 따라 설정을 업데이트하고 비밀 아래에 있는&nbsp;<strong>표시</strong>&nbsp;버튼을 클릭하여 비밀을 복사할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":275,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-6-1024x367.jpg\" alt=\"\" class=\"wp-image-275\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>복사 후 Dify 소스 코드로 돌아가&nbsp;<strong>.env</strong>&nbsp;파일에서 관련 환경 변수를 설정하세요. 환경 변수는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>NOTION_INTEGRATION_TYPE = internal or NOTION_INTEGRATION_TYPE = public</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>NOTION_INTERNAL_SECRET=you-internal-secret</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-notion#using-public-integration\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>공공 통합 사용</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>내부 통합을 공개 통합으로 업그레이드해야 합니다.</strong>&nbsp;통합의 배포 페이지로 이동하여 통합을 공개로 전환하세요. 공개 설정으로 전환할 때는 아래 조직 정보 양식에 회사명, 웹사이트, 리디렉션 URL 등 추가 정보를 입력한 후 \'&nbsp;<strong>제출\'</strong>&nbsp;버튼을 클릭하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":278,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-9-1024x838.jpg\" alt=\"\" class=\"wp-image-278\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>통합 설정 페이지에서 통합을 성공적으로 공개하면 키 탭에서 통합 키에 액세스할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":279,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-10-1024x777.jpg\" alt=\"\" class=\"wp-image-279\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>Dify 소스 코드로 돌아가서&nbsp;<strong>.env</strong>&nbsp;파일에서 관련 환경 변수를 설정하세요. 환경 변수는 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>NOTION_INTEGRATION_TYPE=public</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>NOTION_CLIENT_SECRET=your-client-secret</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>NOTION_CLIENT_ID=your-client-id</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>구성 후 데이터 세트에서 Notion 데이터 가져오기 및 동기화 기능을 작동할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":4} -->\n<h4 class=\"wp-block-heading\"><strong>1.2 웹사이트에서 데이터 가져오기</strong></h4>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://jina.ai/reader/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>지식</strong><strong> </strong><strong>기반은 Jina Reader</strong></a>&nbsp;및&nbsp;<a href=\"https://www.firecrawl.dev/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Firecrawl</strong></a>&nbsp;과 같은 타사 도구를 사용하여 공개 웹 페이지에서 콘텐츠를 크롤링하고&nbsp;, 이를 Markdown 콘텐츠로 구문 분석하고, 이를 지식 기반으로 가져오는 것을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://www.firecrawl.dev/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Firecrawl</strong></a>&nbsp;과&nbsp;<a href=\"https://jina.ai/reader/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Jina Reader</strong><strong>는</strong></a>&nbsp;모두 웹 페이지를 LLM이 인식하기 쉬운 깔끔한 Markdown 형식 텍스트로 변환할 수 있는 오픈 소스 웹 파싱 도구로, 사용하기 쉬운 API 서비스를 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다음 섹션에서는 Firecrawl과 Jina Reader의 사용 방법을 각각 소개합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#firecrawl\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>파이어크롤</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#1-configure-firecrawl-api-credentials\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>1. Firecrawl API 자격 증명 구성</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>오른쪽 상단 모서리에 있는 아바타를 클릭한 다음,&nbsp;<strong>DataSource</strong>&nbsp;페이지로 이동하여 Firecrawl 옆에 있는&nbsp;<strong>구성</strong>&nbsp;버튼을 클릭합니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":280,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-11-1024x430.jpg\" alt=\"\" class=\"wp-image-280\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://www.firecrawl.dev/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Firecrawl </strong><strong>웹사이트</strong></a>&nbsp;에 로그인하여&nbsp;등록을 완료하고 API 키를 받은 다음 Dify에 입력하여 저장합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":281,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-12-1024x435.jpg\" alt=\"\" class=\"wp-image-281\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#2-scrape-target-webpage\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>2. 대상 웹페이지 스크래핑</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반 생성 페이지에서&nbsp;<strong>웹사이트에서 동기화를</strong>&nbsp;선택하고 공급자로 Firecrawl을 선택한 다음 크롤링할 대상 URL을 입력합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>구성 옵션에는 하위 페이지 크롤링 여부, 페이지 크롤링 제한, 페이지 스크래핑 최대 깊이, 제외된 경로, 경로만 포함, 콘텐츠 추출 범위 등이 있습니다. 구성을 완료한 후 \'&nbsp;<strong>실행\'을</strong>&nbsp;클릭하면 파싱된 페이지를 미리 볼 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":283,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-14-1024x560.jpg\" alt=\"\" class=\"wp-image-283\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#3-review-import-results\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>3. 가져오기 결과 검토</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>웹페이지에서 구문 분석된 텍스트를 가져온 후 지식 기반 문서에 저장됩니다. 가져오기 결과를 확인하고&nbsp;<strong>\'URL </strong><strong>추가\'를</strong>&nbsp;클릭하여 새 웹페이지 가져오기를 계속하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#jina-reader\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>지나 리더</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#1-configuring-jina-reader-credentials\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>1. Jina Reader 자격 증명 구성</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>오른쪽 상단 모서리에 있는 아바타를 클릭한 다음,&nbsp;<strong>DataSource</strong>&nbsp;페이지로 이동하여 Jina Reader 옆에 있는&nbsp;<strong>구성</strong>&nbsp;버튼을 클릭합니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":282,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-13-1024x437.jpg\" alt=\"\" class=\"wp-image-282\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://jina.ai/reader/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Jina Reader </strong><strong>웹사이트</strong></a>&nbsp;에 로그인하여&nbsp;등록을 완료하고 API 키를 받은 다음, 키를 입력하고 저장합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/import-content-data/sync-from-website#2-using-jina-reader-to-crawl-web-content\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>2. Jina Reader를 사용하여 웹 콘텐츠 크롤링</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반 생성 페이지에서&nbsp;<strong>웹사이트에서 동기화를</strong>&nbsp;선택하고 , 공급자로 Jina Reader를 선택한 다음, 크롤링할 대상 URL을 입력합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":284,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-15-1024x885.jpg\" alt=\"\" class=\"wp-image-284\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>구성 옵션에는 하위 페이지 크롤링 여부, 크롤링할 최대 페이지 수, 크롤링에 사이트맵 사용 여부가 포함됩니다. 구성을 완료한 후&nbsp;<strong>\'</strong><strong>실행\'</strong>&nbsp;버튼을 클릭하면 크롤링할 페이지 링크를 미리 볼 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":285,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-16-1024x543.jpg\" alt=\"\" class=\"wp-image-285\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>웹 페이지에서 파싱된 텍스트를 지식 베이스로 가져온 후, 문서 섹션에서 가져온 결과를 검토할 수 있습니다. 웹 페이지를 더 추가하려면&nbsp;오른쪽의&nbsp;<strong>\'URL </strong><strong>추가\' 버튼을 클릭하여 새 페이지 가져오기를 계속하세요.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":286,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-17-1024x405.jpg\" alt=\"\" class=\"wp-image-286\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>크롤링이 완료되면 웹 페이지의 콘텐츠가 지식 기반에 통합됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>2. 청크 모드 선택</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반에 콘텐츠를 업로드한 후 다음 단계는 청킹(chunking) 및 데이터 정리입니다.&nbsp;<strong>이 단계에는 긴 텍스트를 여러 개의 작은 청크로 나누는 콘텐츠 전처리 및 구조화가 포함됩니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>청킹 및 클리닝 전략이란 무엇인가요?</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>LLM이 지식 기반 질의에 정확하게 답변할 수 있는지는 시스템이 관련 콘텐츠 청크를 얼마나 효과적으로 검색하는지에 달려 있습니다. AI 애플리케이션이 정확하고 포괄적인 답변을 생성하는 데 있어 관련성이 높은 청크는 매우 중요합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>예를 들어 AI 고객 챗봇 시나리오에서 LLM에게 도구 매뉴얼의 핵심 내용으로 안내하는 것만으로도 사용자 질문에 신속하게 답변할 수 있으며, 전체 문서를 반복적으로 분석할 필요가 없습니다. 이러한 접근 방식은 분석 단계에서 토큰을 절약하는 동시에 AI가 생성한 답변의 전반적인 품질을 향상시킵니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text#chunk-mode\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>청크 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반은&nbsp;<strong>일반 모드</strong>&nbsp;와&nbsp;<strong>부모-자식 모드</strong>&nbsp;, 두 가지 청킹 모드를 지원합니다 . 지식 기반을 처음 생성하는 경우 부모-자식 모드를 선택하는 것이 좋습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>참고</strong>&nbsp;: 기존의&nbsp;<strong>\"</strong><strong>자동 청킹 및 정리\" 모드가&nbsp;\"일반\"</strong>&nbsp;모드 로 자동 업데이트되었습니다&nbsp;. 별도의 변경은 필요하지 않으며, 기본 설정을 계속 사용하실 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>청크 모드를 선택하고 지식 기반을 생성한 후에는 나중에 변경할 수 없습니다. 지식 기반에 새로 추가되는 모든 문서는 동일한 청킹 전략을 따릅니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":287,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-18-1024x517.jpg\" alt=\"\" class=\"wp-image-287\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text#general-mode\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>일반 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>콘텐츠는 독립적인 청크로 나뉩니다. 사용자가 질의를 제출하면 시스템은 청크와 질의 키워드 간의 관련성을 자동으로 계산합니다. 이후 상위 순위의 청크를 검색하여 LLM으로 전송하여 답변을 처리합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 모드에서는 다양한 문서 형식이나 특정 시나리오 요구 사항에 따라 텍스트 청킹 규칙을 수동으로 정의해야 합니다. 자세한 내용은 다음 구성 옵션을 참조하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>청크 식별자</strong>&nbsp;, 기본값은 이며&nbsp;\\n, 이는 텍스트가 문단 단위로 분할됨을 의미합니다.&nbsp;<a href=\"https://regexr.com/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>정규식을</strong></a>&nbsp;사용하여 청크 분할 규칙을 사용자 지정할 수 있습니다 . 시스템은 지정된 구분 기호를 감지할 때마다 자동으로 청크 분할을 실행합니다. </li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":289,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-20-1024x358.jpg\" alt=\"\" class=\"wp-image-289\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>최대 청크 길이:</strong>&nbsp;청크당 허용되는 최대 텍스트 문자 수를 지정합니다. 이 제한을 초과하면 시스템이 자동으로 청크를 적용합니다. 기본값은 500개 토큰이며, 최대 청크 길이는 4000개 토큰입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>청크 길이 겹침</strong>&nbsp;: 데이터가 청크로 분할될 때 청크 간에 일정량의 겹침이 발생합니다. 이러한 겹침은 정보 보존 및 분석 정확도를 높이고 검색 효과를 높이는 데 도움이 될 수 있습니다. 청크 길이 토큰의 10~25%로 설정하는 것이 좋습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>텍스트 전처리 규칙</strong>&nbsp;. 텍스트 전처리 규칙은 지식 기반에서 관련 없는 콘텐츠를 필터링하는 데 도움이 됩니다. 다음 옵션을 사용할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>연속된 공백, 줄바꿈 문자, 탭을 바꿉니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>모든 URL과 이메일 주소를 제거하세요</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>구성이 완료되면&nbsp;<strong>\"</strong><strong>청크 미리보기\"</strong>&nbsp;를 클릭하여 청크 분할 결과를 확인하세요. 각 청크의 문자 수를 확인할 수 있습니다. 청크 분할 규칙을 수정한 경우, 버튼을 다시 클릭하면 최근에 생성된 텍스트 청크를 확인할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>여러 문서를 대량으로 업로드하는 경우, 상단에 있는 문서 제목을 클릭하여 다른 문서에 대한 청크 결과를 검토하여 문서를 전환할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":288,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-19-1024x518.jpg\" alt=\"\" class=\"wp-image-288\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>청킹 규칙을 설정한 후 다음 단계는 인덱싱 방법을 지정하는 것입니다. 일반 모드는&nbsp;<strong>고품질 인덱싱&nbsp;방법</strong>&nbsp;과&nbsp;<strong>경제적인 인덱싱 방법을</strong>&nbsp;지원합니다 . <strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text#parent-child-mode\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>부모-자식 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>일반 모드</strong>&nbsp;와 비교했을 때&nbsp;,&nbsp;<strong>부모-자식 모드는</strong>&nbsp;정확한 검색과 포괄적인 컨텍스트의 균형을 이루는 2계층 데이터 구조를 사용하여 정확한 매칭과 더 풍부한 컨텍스트 정보를 결합합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 모드에서 부모 청크(예: 문단)는 맥락을 제공하는 더 큰 텍스트 단위로 기능하는 반면, 자식 청크(예: 문장)는 정확한 검색에 중점을 둡니다. 시스템은 먼저 자식 청크를 검색하여 관련성을 확인한 다음, 해당 부모 청크를 가져와 전체 맥락을 제공합니다. 이를 통해 최종 응답의 정확성과 완전한 배경 정보를 보장합니다. 구분 기호와 최대 청크 길이를 설정하여 부모 청크와 자식 청크를 분할하는 방식을 사용자 지정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>예를 들어, AI 기반 고객 챗봇 사례에서 사용자 질의를 지원 문서의 특정 문장에 매핑할 수 있습니다. 그러면 해당 문장이 포함된 단락이나 장이 LLM에 제공되어 전체적인 맥락을 반영하여 답변이 더욱 정확해집니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기본적인 메커니즘은 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>자식 청크를 사용한 쿼리 매칭:</strong><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>종종 한 문단 내의 한 문장처럼 간결한, 짧고 집중적인 정보가 사용자의 질의와 일치하는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>이러한 자식 청크를 통해 정확하고 관련성 있는 초기 검색이 가능합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>부모 청크를 통한 문맥적 풍부화:</strong><!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>그런 다음 일치하는 자식 청크를 포함하는 단락, 섹션 또는 전체 문서와 같은 더 크고 포괄적인 섹션을 검색합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>이러한 상위 청크는 언어 모델(LLM)에 대한 포괄적인 컨텍스트를 제공합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":290,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-21-1024x783.jpg\" alt=\"\" class=\"wp-image-290\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>이 모드에서는 다양한 문서 형식이나 특정 시나리오 요구 사항에 따라 부모 청크와 자식 청크 모두에 대해 별도의 청킹 규칙을 수동으로 구성해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>부모 청크</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>부모 청크 설정은 다음과 같은 옵션을 제공합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>문단 : 이 모드는 구분 기호와 최대 청크 길이를 기준으로 텍스트를 여러 문단으로 분할하고, 분할된 텍스트를 검색을 위한 상위 청크로 사용합니다. 각 문단은 상위 청크로 처리되므로, 텍스트 양이 많고 내용이 명확하며 문단이 비교적 독립적인 문서에 적합합니다. 다음 설정이 지원됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>청크 구분 기호</strong>&nbsp;: 기본값은 이며 , 텍스트를 문단 단위로 분할합니다.&nbsp;<a href=\"https://regexr.com/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>정규식을</strong></a> 기본값 \\n&nbsp;사용하여 청크 분할 규칙을 사용자 지정할 수 있습니다&nbsp;. 지정된 구분 기호가 나타날 때마다 시스템이 자동으로 텍스트를 청크합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최대 청크 길이:</strong>&nbsp;청크당 허용되는 최대 텍스트 문자 수를 지정합니다. 이 제한을 초과하면 시스템이 자동으로 청크를 적용합니다. 기본값은 500개 토큰이며, 최대 청크 길이는 4000개 토큰입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>전체 문서</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>텍스트를 단락으로 나누는 대신, 전체 문서를 부모 청크로 사용하여 직접 검색합니다. 성능상의 이유로 텍스트의 처음 10,000개 토큰만 보존됩니다. 이 설정은 단락이 서로 연관되어 전체 문서 검색이 필요한 소규모 문서에 적합합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":291,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-22-1024x609.jpg\" alt=\"\" class=\"wp-image-291\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>자식 청크</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>자식 청크는 구분 기호 규칙에 따라 부모 청크를 분할하여 생성됩니다. 자식 청크는 쿼리 키워드와 가장 관련성이 높고 직접적인 정보를 식별하고 매칭하는 데 사용됩니다. 기본 자식 청킹 규칙을 사용할 경우, 일반적으로 다음과 같은 분할 결과가 발생합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>부모 청크가 문단인 경우, 자식 청크는 각 문단 내의 개별 문장에 해당합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>부모 청크가 전체 문서인 경우, 자식 청크는 문서 내의 개별 문장에 해당합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>다음 청크 설정을 구성할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>청크 구분 기호</strong>&nbsp;: 기본값은 이며, 텍스트를 문장 단위로 청크합니다.&nbsp;<a href=\"https://regexr.com/\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>정규식을</strong></a>&nbsp;사용하여 청크 규칙을 사용자 지정할 수 있습니다 . 지정된 구분 기호가 나타날 때마다 시스템이 자동으로 텍스트를 청크합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>최대 청크 길이:</strong>&nbsp;청크당 허용되는 최대 텍스트 문자 수를 지정합니다. 이 제한을 초과하면 시스템이 자동으로 청크를 적용합니다. 기본값은 200개 토큰이며, 최대 청크 길이는 4000개 토큰입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>텍스트 전처리 규칙을</strong>&nbsp;사용하여 지식 기반에서 관련 없는 콘텐츠를 필터링할&nbsp;수도 있습니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>연속된 공백, 줄바꿈 문자, 탭을 바꿉니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>모든 URL과 이메일 주소를 제거하세요</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>구성을 완료한 후&nbsp;<strong>\"</strong><strong>청크 미리보기\"</strong>&nbsp;를 클릭하여 결과를 확인하세요. 상위 청크의 총 문자 수를 확인할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>구성이 완료되면&nbsp;<strong>\"</strong><strong>청크 미리보기\"</strong>&nbsp;를 클릭하여 청크 분할 결과를 확인하세요. 상위 청크의 총 문자 수를 확인할 수 있습니다. 파란색으로 강조 표시된 문자는 하위 청크를 나타내며, 현재 하위 청크의 문자 수도 참조용으로 표시됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>청킹 규칙을 수정한 경우 버튼을 다시 클릭하면 최근에 생성된 텍스트 청크를 볼 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>여러 문서를 대량으로 업로드하는 경우, 상단에 있는 문서 제목을 클릭하여 다른 문서에 대한 청크 결과를 검토하여 문서를 전환할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":292,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-23-1024x600.jpg\" alt=\"\" class=\"wp-image-292\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>정확한 콘텐츠 검색을 보장하기 위해 부모-자식 청크 모드는&nbsp;<a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods#high-quality\"><strong>고품질</strong><strong> </strong><strong>인덱싱</strong></a>&nbsp;만 지원합니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text#what%E2%80%99s-the-difference-between-two-modes%EF%BC%9F\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>두 모드의 차이점은 무엇인가요?</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>두 모드의 차이점은 콘텐츠 청크의 구조에 있습니다.&nbsp;<strong>일반 모드는</strong>&nbsp;여러 개의 독립적인 콘텐츠 청크를 생성하는 반면,&nbsp;<strong>부모-자식 모드는</strong>&nbsp;두 계층의 청킹 방식을 사용합니다. 즉, 하나의 부모 청크(예: 전체 문서 또는 단락)가 여러 개의 자식 청크(예: 문장)를 포함합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>다양한 청킹(chunking) 방식이 LLM이 지식 기반을 얼마나 효과적으로 검색할 수 있는지에 영향을 미칩니다. 동일한 문서에 부모-자식 검색(Parent-child Retrieval)을 적용하면 높은 정확도를 유지하면서도 더욱 포괄적인 맥락을 제공하므로 기존의 단일 계층 방식보다 훨씬 효과적입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":293,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-1024x506.png\" alt=\"\" class=\"wp-image-293\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text#reference\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>3. 인덱싱 방법 및 검색 설정 선택</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>청킹 모드를 선택한 후 다음 단계는 구조화된 콘텐츠에 대한 인덱싱 방법을 정의하는 것입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods#setting-the-indexing-method\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>인덱싱 방법 설정</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>검색 엔진이 효율적인 인덱싱 알고리즘을 사용하여 사용자 질의와 가장 관련성이 높은 검색 결과를 찾는 것과 마찬가지로, 선택된 인덱싱 방법은 LLM의 검색 효율성과 지식 기반 콘텐츠에 대한 응답의 정확성에 직접적인 영향을 미칩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반은&nbsp;<strong>고품질</strong>&nbsp;및&nbsp;<strong>경제적</strong>&nbsp;이라는 두 가지 인덱싱 방법을 제공하며 , 각 방법은 서로 다른 검색 설정 옵션을 갖습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>참고</strong>&nbsp;: 원래&nbsp;<strong>Q&amp;A </strong><strong>모드(커뮤니티 에디션에서만 사용 가능)는</strong>&nbsp;이제 고품질 색인 방법에 따른 선택적 기능입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>고품질</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>경제적</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>고품질 모드에서 임베딩 모델은 텍스트 청크를 수치 벡터로 변환하여 대량의 텍스트 정보를 효율적으로 압축하고 저장할 수 있도록 합니다.&nbsp;<strong>이를 통해 사용자 쿼리와 텍스트 간의 더욱 정확한 매칭이 가능합니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>텍스트 청크가 벡터화되어 데이터베이스에 저장되면, 사용자 질의와 일치하는 청크를 가져오는 효과적인 검색 방법이 필요합니다. 고품질 인덱싱 방법은 벡터 검색, 전체 텍스트 검색, 그리고 하이브리드 검색의 세 가지 검색 설정을 제공합니다. 검색 설정에 대한 자세한 내용은&nbsp;<a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods#retrieval-settings\"><strong>\"</strong><strong>검색</strong><strong> </strong><strong>설정\"</strong><strong>을</strong></a>&nbsp;참조하십시오 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>고품질</strong>&nbsp;모드를 선택한 후에&nbsp;는 지식 베이스 색인 방식을 나중에&nbsp;<strong>경제</strong>&nbsp;모드로 다운그레이드할 수 없습니다. 전환해야 하는 경우, 새 지식 베이스를 생성하고 원하는 색인 ​​방식을 선택하는 것이 좋습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":294,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-24-1024x481.jpg\" alt=\"\" class=\"wp-image-294\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods#enable-q%26a-mode-optional%2C-community-edition-only\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Q&amp;A 모드 활성화(선택 사항, 커뮤니티 에디션만 해당)</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 모드를 활성화하면 시스템은 업로드된 텍스트를 분할하고 각 세그먼트의 내용을 요약한 후 자동으로 Q&amp;A 쌍을 생성합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>일반적인&nbsp;<strong>Q to P</strong>&nbsp;전략(사용자 질문을 텍스트 문단과 매칭)과 비교했을 때, Q&amp;A 모드는&nbsp;<strong>Q to Q</strong>&nbsp;전략(질문을 질문과 매칭)을 사용합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이러한 접근 방식은 FAQ 문서의 텍스트가&nbsp;<strong>완전한 문법 구조를 갖춘 자연어로 작성되는 경우가 많기</strong>&nbsp;때문에 특히 효과적입니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Q&nbsp;<strong>to Q</strong>&nbsp;전략은 질문과 답변의 매칭을 더욱 명확하게 만들어 주고, 질문이 빈번하거나 매우 유사한 시나리오를 더 잘 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":295,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-25-982x1024.jpg\" alt=\"\" class=\"wp-image-295\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>사용자가 질문을 하면 시스템은 가장 유사한 질문을 식별하고 해당 질문을 답변으로 반환합니다. 이 방식은 사용자의 질의와 직접 일치하여 사용자가 필요한 정확한 정보를 찾을 수 있도록 하므로 더욱 정확합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":296,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-26-1024x551.jpg\" alt=\"\" class=\"wp-image-296\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods#setting-the-retrieval-setting\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>검색 설정 설정</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반은 사용자 질의를 수신하면, 미리 설정된 검색 방법에 따라 기존 문서를 검색하고 관련성이 높은 콘텐츠 청크를 추출합니다. 이러한 콘텐츠 청크는 LLM에 필수적인 맥락 정보를 제공하여 궁극적으로 답변의 정확성과 신뢰성에 영향을 미칩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>일반적인 검색 방법은 다음과 같습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"ordered\":true,\"start\":1} -->\n<ol start=\"1\" class=\"wp-block-list\"><!-- wp:list-item -->\n<li>벡터 유사성에 기반한 의미 검색 - 텍스트 덩어리와 쿼리를 벡터로 변환하고 유사성 점수를 통해 매칭합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>역색인(표준 검색 엔진 기법)을 이용한 키워드 매칭. 두 방법 모두 Dify 지식 베이스에서 지원됩니다.</li>\n<!-- /wp:list-item --></ol>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>Dify 지식 기반에서는 두 가지 검색 방법 모두 지원됩니다. 사용 가능한 구체적인 검색 옵션은 선택한 인덱싱 방법에 따라 달라집니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>고품질</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>경제적</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>고품질</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>고품질</strong>&nbsp;인덱싱 방법 에서 Dify는&nbsp;<strong>벡터 검색, 전체 텍스트 검색, 하이브리드 검색의</strong>&nbsp;세 가지 검색 설정을 제공합니다&nbsp;.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":297,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-27-1024x755.jpg\" alt=\"\" class=\"wp-image-297\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>벡터 검색</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>정의</strong>&nbsp;: 사용자의 질문을 벡터화하여 쿼리 벡터를 생성한 다음, 지식 기반의 해당 텍스트 벡터와 비교하여 가장 가까운 청크를 찾습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":298,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-28-1024x358.jpg\" alt=\"\" class=\"wp-image-298\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>벡터 검색 설정：</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>Rerank 모델</strong>&nbsp;: 기본적으로 비활성화되어 있습니다. 활성화하면 타사 Rerank 모델이 벡터 검색에서 반환된 텍스트 청크를 정렬하여 결과를 최적화합니다. 이를 통해 LLM이 더욱 정확한 정보에 접근하고 출력 품질을 개선하는 데 도움이 됩니다. 이 옵션을 활성화하기 전에&nbsp;<strong>설정</strong>&nbsp;→&nbsp;<strong>모델 공급자</strong>&nbsp;로 이동하여 Rerank 모델의 API 키를 설정하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 기능을 활성화하면 Rerank 모델의 토큰이 소모됩니다. 자세한 내용은 관련 모델의 가격 페이지를 참조하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>TopK</strong>&nbsp;: 사용자 질의와 가장 유사하다고 판단되는 텍스트 청크를 얼마나 많이 검색할지 결정합니다. 또한 선택한 모델의 컨텍스트 창에 따라 청크 수를 자동으로 조정합니다. 기본값은&nbsp;<strong>3</strong>&nbsp;이며 , 숫자가 높을수록 더 많은 텍스트 청크를 검색합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>점수 임계값</strong>&nbsp;: 청크를 검색하는 데 필요한 최소 유사도 점수를 설정합니다. 이 점수를 초과하는 청크만 검색됩니다. 기본값은&nbsp;<strong>0.5</strong>&nbsp;입니다 . 임계값이 높을수록 더 높은 유사도가 요구되므로 검색되는 청크 수가 줄어듭니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>TopK 및 Score 구성은 Rerank 단계에서만 유효합니다. 따라서 이러한 설정을 적용하려면 Rerank 모델을 추가하고 활성화해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong>전체 텍스트 검색</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>정의:</strong>&nbsp;문서에 있는 모든 용어를 인덱싱하여 사용자가 용어를 쿼리하고 해당 용어가 포함된 텍스트 조각을 반환할 수 있도록 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":299,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-29-1024x355.jpg\" alt=\"\" class=\"wp-image-299\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>Rerank 모델</strong>&nbsp;: 기본적으로 비활성화되어 있습니다. 활성화하면 타사 Rerank 모델이 전체 텍스트 검색에서 반환된 텍스트 청크를 정렬하여 결과를 최적화합니다. 이를 통해 LLM이 더욱 정확한 정보에 접근하고 출력 품질을 향상시킬 수 있습니다. 이 옵션을 활성화하기 전에&nbsp;<strong>설정</strong>&nbsp;→&nbsp;<strong>모델 공급자</strong>&nbsp;로 이동하여 Rerank 모델의 API 키를 설정하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 기능을 활성화하면 Rerank 모델의 토큰이 소모됩니다. 자세한 내용은 관련 모델의 가격 페이지를 참조하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>TopK</strong>&nbsp;: 사용자 질의와 가장 유사하다고 판단되는 텍스트 청크를 얼마나 많이 검색할지 결정합니다. 또한 선택한 모델의 컨텍스트 창에 따라 청크 수를 자동으로 조정합니다. 기본값은&nbsp;<strong>3</strong>&nbsp;이며 , 숫자가 높을수록 더 많은 텍스트 청크를 검색합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>점수 임계값</strong>&nbsp;: 청크를 검색하는 데 필요한 최소 유사도 점수를 설정합니다. 이 점수를 초과하는 청크만 검색됩니다. 기본값은&nbsp;<strong>0.5</strong>&nbsp;입니다 . 임계값이 높을수록 더 높은 유사도가 요구되므로 검색되는 청크 수가 줄어듭니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>TopK 및 Score 구성은 Rerank 단계에서만 유효합니다. 따라서 이러한 설정을 적용하려면 Rerank 모델을 추가하고 활성화해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong>하이브리드 검색</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>정의</strong>&nbsp;: 이 프로세스는 전체 텍스트 검색과 벡터 검색을 결합하여 두 가지를 동시에 수행합니다. 여기에는 사용자 질의를 기반으로 두 검색 결과에서 가장 일치하는 결과를 선택하는 재정렬 단계가 포함됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":300,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-30-1024x687.jpg\" alt=\"\" class=\"wp-image-300\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>이 모드에서는&nbsp;Rerank 모델 API를 구성하거나 검색을 위해&nbsp;<strong>Rerank </strong><strong>모델을 활성화하지 않고도&nbsp;\"가중치 설정\"을</strong>&nbsp;지정할 수 있습니다 .</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>무게 설정</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 기능을 사용하면 사용자가 의미적 우선순위와 키워드 우선순위에 대한 가중치를 직접 설정할 수 있습니다. 키워드 검색은 지식 기반 내에서 전체 텍스트 검색을 수행하는 것을 의미하고, 의미적 검색은 지식 기반 내에서 벡터 검색을 포함합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>1의 의미적 가치</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 기능은 의미 검색 모드만 활성화합니다. 임베딩 모델을 활용하면 질의어의 정확한 용어가 지식 베이스에 나타나지 않더라도 벡터 거리를 계산하여 더욱 심층적인 검색을 수행할 수 있으며, 이를 통해 관련 콘텐츠를 반환합니다. 또한, 다국어 콘텐츠를 처리할 때 의미 검색은 여러 언어의 의미를 포착하여 더욱 정확한 교차 언어 검색 결과를 제공할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>키워드 가치 1</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>이 기능은 키워드 검색 모드만 활성화합니다. 지식 베이스의 입력 텍스트와 전체 일치를 수행하므로 사용자가 정확한 정보나 용어를 알고 있는 경우에 적합합니다. 이 방식은 컴퓨팅 리소스를 덜 소모하며, 대규모 문서 지식 베이스 내에서 빠른 검색에 이상적입니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>사용자 정의 키워드 및 의미적 가중치</strong></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>시맨틱 검색 또는 키워드 검색만 활성화하는 것 외에도, 유연한 맞춤 가중치 설정을 제공합니다. 두 가지 검색 방법의 가중치를 지속적으로 조정하여 비즈니스 상황에 맞는 최적의 가중치 비율을 찾을 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong>재순위 모델</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기본적으로 비활성화되어 있습니다. 활성화하면 타사 Rerank 모델이 하이브리드 검색에서 반환된 텍스트 청크를 정렬하여 결과를 최적화합니다. 이를 통해 LLM이 더욱 정확한 정보에 접근하고 출력 품질을 개선하는 데 도움이 됩니다. 이 옵션을 활성화하기 전에&nbsp;<strong>설정</strong>&nbsp;→&nbsp;<strong>모델 공급자</strong>&nbsp;로 이동하여 Rerank 모델의 API 키를 구성하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>이 기능을 활성화하면 Rerank 모델의 토큰이 소모됩니다. 자세한 내용은 관련 모델의 가격 페이지를 참조하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>\"가중치 설정&nbsp;<strong>\"</strong>&nbsp;및&nbsp;<strong>\"</strong><strong>모델 재순위\"</strong>&nbsp;설정은 다음 옵션을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>TopK</strong>&nbsp;: 사용자 질의와 가장 유사하다고 판단되는 텍스트 청크를 얼마나 많이 검색할지 결정합니다. 또한 선택한 모델의 컨텍스트 창에 따라 청크 수를 자동으로 조정합니다. 기본값은&nbsp;<strong>3</strong>&nbsp;이며 , 숫자가 높을수록 더 많은 텍스트 청크를 검색합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>점수 임계값</strong>&nbsp;: 청크를 검색하는 데 필요한 최소 유사도 점수를 설정합니다. 이 점수를 초과하는 청크만 검색됩니다. 기본값은&nbsp;<strong>0.5</strong>&nbsp;입니다 . 임계값이 높을수록 더 높은 유사도가 요구되므로 검색되는 청크 수가 줄어듭니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods#reference\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading -->\n<h2 class=\"wp-block-heading\"><strong>지식 관리</strong></h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>지식 페이지는 팀 소유자, 팀 관리자 및 편집자 권한이 있는 사용자만 접근할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify 플랫폼 상단의 \'&nbsp;<strong>지식</strong>&nbsp;\' 버튼을 클릭 하고 관리할 지식을 선택하세요. 왼쪽 사이드바의 \'설정\'으로 이동하여 설정하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>여기에서 지식 기반의 이름, 설명, 권한, 인덱싱 방법, 내장 모델 및 검색 설정을 수정할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":301,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-31-1024x762.jpg\" alt=\"\" class=\"wp-image-301\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>지식 이름</strong>&nbsp;: 다양한 지식 기반을 구별하는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>지식 설명</strong>&nbsp;: 지식 기반의 문서에 표현된 정보를 설명하는 데 사용됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>권한</strong>&nbsp;: 지식 기반에 대한 액세스 제어를 세 가지 수준으로 정의합니다.<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>\"나만\"</strong>&nbsp;: 지식 기반 소유자의 접근을 제한합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>\"모든 팀 구성원\"</strong>&nbsp;: 팀의 모든 구성원에게 액세스 권한을 부여합니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>\"일부 팀 구성원\"</strong>&nbsp;: 특정 팀 구성원에게 선택적으로 접근할 수 있습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>적절한 권한이 없는 사용자는 지식 기반에 접근할 수 없습니다. 팀원에게 접근 권한을 부여할 때(옵션 2 또는 3), 권한이 있는 사용자에게는 지식 기반 콘텐츠 보기, 편집 및 삭제 권한을 포함한 모든 권한이 부여됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>인덱싱 모드</strong>&nbsp;: 자세한 설명은&nbsp;<a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/setting-indexing-methods\"><strong>설명서</strong></a>&nbsp;를 참조하세요 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>임베딩 모델</strong>&nbsp;: 지식 기반의 임베딩 모델을 수정할 수 있습니다. 임베딩 모델을 변경하면 지식 기반의 모든 문서가 다시 임베딩되고, 원래 임베딩은 삭제됩니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li><strong>검색 설정</strong>&nbsp;: 자세한 설명은&nbsp;<a href=\"https://docs.dify.ai/en/learn-more/extended-reading/retrieval-augment/retrieval\"><strong>설명서</strong></a>&nbsp;를 참조하세요 .</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/introduction#view-linked-applications-in-the-knowledge-base\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>지식 기반에서 연결된 애플리케이션 보기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 베이스 왼쪽에는 연결된 모든 앱이 표시됩니다. 원형 아이콘 위에 마우스를 올리면 연결된 모든 앱 목록이 표시됩니다. 오른쪽의 바로가기 버튼을 클릭하면 빠르게 탐색할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":302,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-32-1024x348.jpg\" alt=\"\" class=\"wp-image-302\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>웹 인터페이스나 API를 통해 지식 기반 문서를 관리할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/introduction#maintain-knowledge-documents\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>지식 문서 유지 관리</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p>지식 기반에서 모든 문서와 해당 청크를 직접 관리할 수 있습니다. </p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/introduction#maintain-knowledge-base-via-api\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>API를 통한 지식 기반 유지</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>Dify 지식 베이스는 포괄적인 표준 API 세트를 제공합니다. 개발자는 이러한 API를 사용하여 문서 및 청크 추가, 삭제, 업데이트, 검색과 같은 일상적인 관리 및 유지 관리 작업을 수행할 수 있습니다. 자세한 내용은 다음 문서를 참조하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-dataset-via-api\"></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-dataset-via-api\">API를 통한 지식 기반 유지</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-dataset-via-api\">API를 통해 지식 기반을 유지하는 방법을 알아보세요</a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":303,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-33-1024x625.jpg\" alt=\"\" class=\"wp-image-303\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:heading {\"level\":3} -->\n<h3 class=\"wp-block-heading\"><strong>문서 유지 관리</strong></h3>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#manage-documentations-in-the-knowledge-base\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>지식 기반에서 문서 관리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#adding-documentations\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>문서 추가</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 베이스는 문서 모음입니다. 개발자나 운영자가 문서를 업로드하거나 다른 데이터 소스에서 동기화할 수 있습니다. 지식 베이스의 각 문서는 해당 데이터 소스의 파일(예: Notion 문서 또는 온라인 웹페이지)에 해당합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>기존 지식 기반에 새 문서를 업로드하려면&nbsp;<strong>지식 기반</strong>&nbsp;&gt;&nbsp;<strong>문서 로 이동하여&nbsp;파일 추가를</strong>&nbsp;클릭합니다&nbsp;.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":304,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-34-1024x330.jpg\" alt=\"\" class=\"wp-image-304\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#disable-%2F-archive-%2F-delete-document\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>문서 비활성화/보관/삭제</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>활성화</strong>&nbsp;: 현재 정상 상태인 문서는 지식 기반에서 편집 및 검색할 수 있습니다. 비활성화된 문서는 다시 활성화할 수 있습니다. 보관된 문서의 경우, 다시 활성화하기 전에 먼저 보관을 해제해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>비활성화</strong>&nbsp;: 사용 중 문서 색인 생성을 원하지 않으면 문서 오른쪽에 있는 파란색 스위치를 끄세요. 비활성화된 문서도 편집이나 수정은 가능합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>보관</strong>&nbsp;: 더 이상 사용하지 않지만 삭제하고 싶지 않은 오래된 문서는 보관할 수 있습니다. 보관된 문서는 열람 및 삭제만 가능하며 편집은 불가능합니다. 지식 베이스의&nbsp;<strong>문서 목록 에서&nbsp;\'보관\'</strong>&nbsp;버튼을 클릭하거나&nbsp;문서 세부 정보 페이지에서 문서를 보관할 수 있습니다. 보관은 취소할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>삭제</strong>&nbsp;: ⚠️ 위험한 옵션입니다. 잘못된 문서나 명확하게 모호한 내용의 경우, 문서 오른쪽 메뉴에서 \'삭제\'를 선택하세요. 삭제된 내용은 복구할 수 없으므로 주의해서 진행하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>위의 옵션은 모두 여러 문서를 선택한 후 일괄 작업을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":305,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-35-1024x505.jpg\" alt=\"\" class=\"wp-image-305\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong>메모:</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반에 업데이트나 검색이 잠시 동안 이루어지지 않은 문서가 있는 경우, 최적의 성능을 보장하기 위해 시스템에서는 비활성 문서를 비활성화합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>샌드박스 사용자의 경우 \"비활성 문서 비활성화 기간\"은&nbsp;<strong>7</strong><strong>일 후</strong>&nbsp;입니다 .</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Professional 및 Team 사용자의 경우&nbsp;<strong>30</strong><strong>일 후부터</strong>&nbsp;적용됩니다 . 지식 베이스에서 \"활성화\" 버튼을 클릭하면 언제든지 이 문서를 되돌리고 계속 사용할 수 있습니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p>지식 기반에서 \"활성화\" 버튼을 클릭하면 언제든지 비활성화된 문서를 되돌리고 계속 사용할 수 있습니다. 유료 사용자에게는&nbsp;<strong>원클릭 되돌리기</strong>&nbsp;기능이 제공됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":306,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-36-1024x569.jpg\" alt=\"\" class=\"wp-image-306\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#managing-text-chunks\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>텍스트 청크 관리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#viewing-text-chunks\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>텍스트 청크 보기</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 베이스에서는 업로드된 각 문서가 텍스트 청크로 저장됩니다. 문서 제목을 클릭하면 세부 정보 페이지에서 청크 목록과 해당 텍스트 콘텐츠를 볼 수 있습니다. 각 페이지는 기본적으로 10개의 청크를 표시하지만, 웹 하단에서 페이지당 표시되는 청크 수를 변경할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>미리보기에서는 각 콘텐츠 청크의 처음 두 줄만 표시됩니다. 청크 내 전체 텍스트를 보려면 \"청크 확장\" 버튼을 클릭하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":307,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-37-1024x515.jpg\" alt=\"\" class=\"wp-image-307\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>필터를 사용하면 활성화된 문서나 비활성화된 문서를 모두 빠르게 볼 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":308,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-38-1024x266.jpg\" alt=\"\" class=\"wp-image-308\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>다양한&nbsp;<a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text\"><strong>청킹</strong><strong> </strong><strong>모드는</strong></a>&nbsp;다양한 텍스트 청킹 미리 보기 방법에 해당합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>일반 모드</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>부모-자식 모드</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Q&amp;A 모드(커뮤니티 에디션 전용)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>일반 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><a href=\"https://docs.dify.ai/en/guides/knowledge-base/create-knowledge-and-upload-documents/chunking-and-cleaning-text#general-mode\"><strong>일반</strong><strong> </strong><strong>모드</strong></a>&nbsp;에서 텍스트 덩어리는&nbsp;독립적인 블록입니다. 덩어리의 전체 내용을 보려면&nbsp;<strong>전체 화면</strong>&nbsp;아이콘을 클릭하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":309,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-39-1024x658.jpg\" alt=\"\" class=\"wp-image-309\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>지식 기반의 다른 문서로 빠르게 전환하려면 상단의 문서 제목을 탭하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":310,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-40-1024x290.jpg\" alt=\"\" class=\"wp-image-310\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#checking-chunk-quality\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>청크 품질 확인</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>문서 청킹은 지식 기반 애플리케이션의 Q&amp;A 성능에 상당한 영향을 미칩니다. 지식 기반을 애플리케이션에 통합하기 전에 청킹 품질을 수동으로 검토하는 것이 좋습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>문자 길이, 식별자 또는 자연어 처리 의미 체계를 기반으로 하는 자동화된 청크 방식은 대규모 텍스트 청크의 작업 부하를 크게 줄일 수 있지만, 청크의 품질은 다양한 문서 형식의 텍스트 구조와 의미적 맥락에 따라 달라집니다. 수동 검사 및 수정은 의미 인식에서 기계 청크의 단점을 효과적으로 보완할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>청크 품질을 확인할 때 다음 상황에 주의하세요.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>너무 짧은 텍스트 덩어리는</strong>&nbsp;의미 손실을 초래합니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":311,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-41-1024x196.jpg\" alt=\"\" class=\"wp-image-311\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>너무 긴 텍스트 청크로</strong>&nbsp;인해 의미적 노이즈가 발생하여 일치 정확도에 영향을 미칩니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":312,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-42-1024x704.jpg\" alt=\"\" class=\"wp-image-312\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li><strong>최대 세그먼트 길이 제한을 사용할 때 발생하는 명백한 의미적 잘림으로</strong>&nbsp;인해 강제적인 의미적 잘림이 발생하고 회수 중에 콘텐츠가 누락됩니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:image {\"id\":313,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-43-1024x179.jpg\" alt=\"\" class=\"wp-image-313\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#adding-text-chunks\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>텍스트 청크 추가</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반에 텍스트 청크를 개별적으로 추가할 수 있으며, 청킹 모드에 따라 해당 청크를 추가하는 방법도 달라집니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>텍스트 청크 추가는 유료 기능입니다.&nbsp;이 기능을 이용하려면&nbsp;<a href=\"https://dify.ai/pricing\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>여기에서</strong><strong> </strong><strong>계정을</strong><strong> </strong><strong>업그레이드하세요.</strong></a></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>일반 모드</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>부모-자식 모드</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Q&amp;A 모드(커뮤니티 에디션 전용)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>일반 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>청크 목록 페이지에서 청크 추가를</strong>&nbsp;클릭하면&nbsp;문서에 하나 이상의 사용자 정의 청크를 추가할 수 있습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":314,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-44-1024x718.jpg\" alt=\"\" class=\"wp-image-314\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>텍스트 청크를 수동으로 추가할 때 주요 콘텐츠와 키워드를 모두 추가할 수 있습니다. 콘텐츠를 입력한 후&nbsp;하단의&nbsp;<strong>\"</strong><strong>다른 콘텐츠 추가\" 체크박스를 선택하면 더 많은 텍스트 청크를 원활하게 추가할 수 있습니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":315,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-45-1024x661.jpg\" alt=\"\" class=\"wp-image-315\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p>대량으로 청크를 추가하려면 먼저 CSV 형식의 업로드 템플릿을 다운로드하고 템플릿 형식에 따라 Excel에서 모든 청크 내용을 편집한 다음, CSV 파일을 저장하고 업로드해야 합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":316,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-46-1024x648.jpg\" alt=\"\" class=\"wp-image-316\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:separator -->\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"/>\n<!-- /wp:separator -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#editing-text-chunks\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>텍스트 청크 편집</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>일반 모드</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>부모-자식 모드</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Q&amp;A 모드(커뮤니티 에디션 전용)</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>일반 모드</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>추가된 청크 콘텐츠를 직접 편집하거나 수정할 수 있으며,&nbsp;<strong>청크 내의 텍스트 콘텐츠나 키워드를 수정할 수도 있습니다.</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>중복 편집을 방지하기 위해 콘텐츠 청크가 수정된 후에는 \"편집됨\" 태그가 표시됩니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":317,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"><img src=\"http://192.168.101.245/wp-content/uploads/2025/07/image-47-1024x621.jpg\" alt=\"\" class=\"wp-image-317\"/></figure>\n<!-- /wp:image -->\n\n<!-- wp:paragraph -->\n<p><strong><a href=\"https://docs.dify.ai/en/guides/knowledge-base/knowledge-and-documents-maintenance/maintain-knowledge-documents#modify-text-chunks-for-uploaded-documents\">​</a></strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>업로드된 문서의 텍스트 청크 수정</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p>지식 기반은 문서 세분화 재구성을 지원합니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:paragraph -->\n<p><strong>더 큰 덩어리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>각 청크 내에서 더 많은 맥락을 유지하므로 텍스트에 대한 더 폭넓은 이해가 필요한 작업에 이상적입니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>청크의 총 개수를 줄여 처리 시간과 저장 오버헤드를 줄입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>더 작은 덩어리</strong></p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list -->\n<ul class=\"wp-block-list\"><!-- wp:list-item -->\n<li>더욱 세부적인 정보를 제공하여 추출이나 요약과 같은 작업의 정확도를 향상시킵니다.</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>모델 토큰 한도를 초과할 위험을 줄여 제약 조건이 엄격한 모델의 안전성을 높입니다.</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list -->\n\n<!-- wp:paragraph -->\n<p><strong>청크 설정</strong>&nbsp;으로 이동하여&nbsp;설정을 조정한 후 \'&nbsp;<strong>저장 및 처리\'를</strong>&nbsp;클릭하여 변경 사항을 저장하고 문서를 다시 처리합니다. 처리가 완료되면 청크 목록이 자동으로 업데이트되므로 페이지를 새로 고칠 필요가 없습니다.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:image {\"id\":318,\"sizeSlug\":\"large\",\"linkDestination\":\"none\"} -->\n<figure class=\"wp-block-image size-large\"