<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>프로그램 코드 이야기</title>
    <link>https://code.who494.com/</link>
    <description>다양한 코드에 대해 생각을 정리하고 소개하는 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 5 May 2026 17:39:05 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>codeon</managingEditor>
    <image>
      <title>프로그램 코드 이야기</title>
      <url>https://tistory1.daumcdn.net/tistory/7035492/attach/ca7d903385634d0db582274531f56b9c</url>
      <link>https://code.who494.com</link>
    </image>
    <item>
      <title>openclaw 오픈소스 AI 에이전트</title>
      <link>https://code.who494.com/entry/openclaw-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-AI-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;1&quot;&gt;OpenClaw&lt;/b&gt;는 사람이 웹브라우저에서 하는 행동(클릭, 검색, 데이터 입력 등)을 AI가 대신 수행해 주는 &lt;b data-index-in-node=&quot;61&quot; data-path-to-node=&quot;1&quot;&gt;오픈소스 AI 에이전트&lt;/b&gt;입니다. 쉽게 말해 &quot;웹 서핑을 대신 해주는 AI 비서&quot;라고 보시면 됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l0nOU/dJMcadgHB7G/SBk6vwwVF47sGbJjsuRsek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l0nOU/dJMcadgHB7G/SBk6vwwVF47sGbJjsuRsek/img.png&quot; data-alt=&quot;OpenClaw 대표 사이트 메인 캡쳐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l0nOU/dJMcadgHB7G/SBk6vwwVF47sGbJjsuRsek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl0nOU%2FdJMcadgHB7G%2FSBk6vwwVF47sGbJjsuRsek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;259&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OpenClaw 대표 사이트 메인 캡쳐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-path-to-node=&quot;2&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;1. OpenClaw란 무엇인가?&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw는 사용자가 자연어(평소 쓰는 말)로 명령을 내리면, AI(주로 GPT-4o나 Claude 3.5 Sonnet 등)가 브라우저 화면을 직접 보고 판단하여 작업을 완수하는 도구입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;5&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,0,0&quot;&gt;주요 역할:&lt;/b&gt; 정보 수집, 복잡한 웹사이트 예약, 폼 입력, 쇼핑몰 가격 비교 등.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5,1,0&quot;&gt;작동 방식:&lt;/b&gt; 브라우저의 스크린샷과 HTML 구조를 분석해 &quot;어떤 버튼을 눌러야 할지&quot; 스스로 결정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;2. 주요 기능 및 활용 예시&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;이 'AI 비서'에게 내릴 수 있는 명령(Task)의 예시는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;정보 검색 및 요약:&lt;/b&gt; &quot;최신 AI 뉴스 5개를 찾아서 엑셀 형식으로 정리해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;구매 및 예약:&lt;/b&gt; &quot;제주도행 가장 저렴한 비행기 표를 찾아서 예약 페이지까지 띄워줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;반복 업무:&lt;/b&gt; &quot;특정 사이트에 로그인해서 매일 올라오는 공지사항을 확인해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,3,0&quot;&gt;데이터 추출:&lt;/b&gt; &quot;이 쇼핑몰에 있는 모든 상품 이름과 가격을 리스트로 만들어줘.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;3. OpenClaw 사용을 위한 구성 요소&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;단순한 프로그램 설치보다는 개발자 도구에 가깝기 때문에 몇 가지 준비물이 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;Python 환경:&lt;/b&gt; 컴퓨터에 파이썬이 설치되어 있어야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;Playwright:&lt;/b&gt; 브라우저를 원격 제어하기 위한 라이브러리입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;LLM API Key:&lt;/b&gt; AI의 '두뇌' 역할을 할 OpenAI(GPT)나 Anthropic(Claude)의 API 키가 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,3,0&quot;&gt;GitHub 저장소:&lt;/b&gt; 보통 OpenClaw 공식 GitHub에서 코드를 내려받아 실행합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;14&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size20&quot;&gt;4. 게임 명령어와 다른 점&lt;/h4&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;이 비서 서비스에서의 '명령어'는 정해진 단어(예: /help)라기보다 &lt;b data-index-in-node=&quot;40&quot; data-path-to-node=&quot;16&quot;&gt;&quot;사용자의 요청 사항(Prompt)&quot;&lt;/b&gt; 그 자체입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;게임:&lt;/b&gt; god, give all 등 고정된 코드 입력.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;비서:&lt;/b&gt; &quot;내 네이버 메일 들어가서 읽지 않은 메일 제목만 다 알려줘&quot; 같은 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;17,1,0&quot;&gt;자연어 명령&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;OpenClaw 대표 사이트&lt;/h4&gt;
&lt;figure id=&quot;og_1771547656217&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;OpenClaw &amp;mdash; Personal AI Assistant&quot; data-og-description=&quot;OpenClaw &amp;mdash; The AI that actually does things. Your personal assistant on any platform.&quot; data-og-host=&quot;openclaw.ai&quot; data-og-source-url=&quot;https://openclaw.ai/&quot; data-og-url=&quot;https://openclaw.ai/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bm67LG/dJMb8WMl9iY/fb3myivL1rRVbnBM0r8350/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/76ClL/dJMb9bvYTSm/BSCArI7ycgGGTXpgUv9Vrk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b897HK/dJMb9kTZx5S/N3P2SgKOgzZqEJLlpYKIU0/img.jpg?width=400&amp;amp;height=400&amp;amp;face=125_137_262_287&quot;&gt;&lt;a href=&quot;https://openclaw.ai/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://openclaw.ai/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bm67LG/dJMb8WMl9iY/fb3myivL1rRVbnBM0r8350/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/76ClL/dJMb9bvYTSm/BSCArI7ycgGGTXpgUv9Vrk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b897HK/dJMb9kTZx5S/N3P2SgKOgzZqEJLlpYKIU0/img.jpg?width=400&amp;amp;height=400&amp;amp;face=125_137_262_287');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw &amp;mdash; Personal AI Assistant&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;OpenClaw &amp;mdash; The AI that actually does things. Your personal assistant on any platform.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;openclaw.ai&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;OpenClaw 공식 GitHub&lt;/h4&gt;
&lt;figure id=&quot;og_1771547452471&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - openclaw/openclaw: Your own personal AI assistant. Any OS. Any Platform. The lobster way.  &quot; data-og-description=&quot;Your own personal AI assistant. Any OS. Any Platform. The lobster way.   - GitHub - openclaw/openclaw: Your own personal AI assistant. Any OS. Any Platform. The lobster way.  &quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/openclaw/openclaw&quot; data-og-url=&quot;https://github.com/openclaw/openclaw&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/MWoVu/dJMb8YXH3sd/mtdsR9yoFbhBCHoUeqDHak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/sjlS7/dJMb8WMl9hz/uUUoTbjrvsIc0tDMwFv0Ek/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/openclaw/openclaw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/openclaw/openclaw&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/MWoVu/dJMb8YXH3sd/mtdsR9yoFbhBCHoUeqDHak/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/sjlS7/dJMb8WMl9hz/uUUoTbjrvsIc0tDMwFv0Ek/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - openclaw/openclaw: Your own personal AI assistant. Any OS. Any Platform. The lobster way.  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Your own personal AI assistant. Any OS. Any Platform. The lobster way.   - GitHub - openclaw/openclaw: Your own personal AI assistant. Any OS. Any Platform. The lobster way.  &lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우에서 설치시 (cmd.exe) - 비추천 (WSL2 에서 설치하는 것을 추천)&lt;/p&gt;
&lt;pre id=&quot;code_1771547961739&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://openclaw.ai/install.cmd -o install.cmd &amp;amp;&amp;amp; install.cmd &amp;amp;&amp;amp; del install.cmd&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WSL2 설치시&lt;/p&gt;
&lt;pre id=&quot;code_1771557516508&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# nvm 다운로드 및 설치: node 설치 버전 관리 툴
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash

# Node.js 다운로드 및 설치: 22 이상 node 버전을 설치해야 함
nvm install 24

# openclaw 설치
npm install -g openclaw@latest

# openclaw 실행
openclaw onboard --install-daemon&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onboard 를 실행 하면 아래와 같이 화면이 뜨면 정상 설치 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초반 질문에 Yes를 선택해야 한다. 리스크가 있으니 감수하고 설치하겠냐 라고 물어보는 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1771557593582&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  OpenClaw 2026.2.19-2 (45d9b20) &amp;mdash; curl for conversations.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                    OPENCLAW  

┌  OpenClaw onboarding
│
◇  Security ──────────────────────────────────────────────────────────────────────────────╮
│                                                                                         │
│  Security warning &amp;mdash; please read.                                                        │
│                                                                                         │
│  OpenClaw is a hobby project and still in beta. Expect sharp edges.                     │
│  This bot can read files and run actions if tools are enabled.                          │
│  A bad prompt can trick it into doing unsafe things.                                    │
│                                                                                         │
│  If you&amp;rsquo;re not comfortable with basic security and access control, don&amp;rsquo;t run OpenClaw.  │
│  Ask someone experienced to help before enabling tools or exposing it to the internet.  │
│                                                                                         │
│  Recommended baseline:                                                                  │
│  - Pairing/allowlists + mention gating.                                                 │
│  - Sandbox + least-privilege tools.                                                     │
│  - Keep secrets out of the agent&amp;rsquo;s reachable filesystem.                                │
│  - Use the strongest available model for any bot with tools or untrusted inboxes.       │
│                                                                                         │
│  Run regularly:                                                                         │
│  openclaw security audit --deep                                                         │
│  openclaw security audit --fix                                                          │
│                                                                                         │
│  Must read: https://docs.openclaw.ai/gateway/security                                   │
│                                                                                         │
├─────────────────────────────────────────────────────────────────────────────────────────╯
│
◇  I understand this is powerful and inherently risky. Continue?
│  Yes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 화면 열기 위해 세션 토큰 발급을 받아야 한다&lt;/p&gt;
&lt;pre id=&quot;code_1771559006730&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 토큰 발급 명령어
openclaw dashboard

# 결과 Dashboard URL 복사해 브라우저에 붙여넣으면 openclaw과 대화 할 수 있다
Dashboard URL: http://127.0.0.1:18789/#token=6bc75d98e4e41611aa3a59abbac1e0e4d13dd2dd91bedd96 
Copied to clipboard.
No GUI detected. Open from your computer:
ssh -N -L 18789:127.0.0.1:18789 root@&amp;lt;host&amp;gt;
Then open:
http://localhost:18789/
http://localhost:18789/#token=6bc75d98e4e41611aa3a59abbac1e0e4d13dd2dd91bedd96
Docs:
https://docs.openclaw.ai/gateway/remote
https://docs.openclaw.ai/web/control-ui&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;openclaw 문제 발생시&lt;/p&gt;
&lt;pre id=&quot;code_1771559716279&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;openclaw doctor --fix&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;대부분의 문제는 위 명령어로 해소가 가능하다&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;스킬기능 요약&lt;/div&gt;
&lt;div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1password&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1Password CLI 연동&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1Password CLI를 통해 &lt;b&gt;비밀키 읽기&amp;middot;쓰기, 볼트 관리, 멀티 계정 지원&lt;/b&gt;을 제공.&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  blogwatcher&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 검색 결과에서 &amp;ldquo;blogwatcher&amp;rdquo;라는 공식 스킬을 찾을 수 없었습니다.&lt;br /&gt;&amp;rarr; ClawHub에 없거나 다른 이름일 수 있습니다.&lt;br /&gt;원하시면 해당 스킬의 &lt;b&gt;폴더/SKILL.md&lt;/b&gt; 내용을 알려주시면 해석해 드릴게요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  blucli&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BluOS 멀티룸 오디오 제어 CLI&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BluOS 기기(예: Bluesound) &lt;b&gt;검색, 재생, 그룹 관리, 볼륨 조절&lt;/b&gt;을 수행.&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  camsnap&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RTSP/ONVIF 보안 카메라 캡처&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 카메라에서 &lt;b&gt;프레임&amp;middot;클립 캡처&lt;/b&gt;.&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  clawhub&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ClawHub 연동 도구 (스킬 설치&amp;middot;업데이트&amp;middot;동기화 관리)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OpenClaw 공식 스킬 레지스트리 ClawHub에서 &lt;b&gt;설치, 업데이트, 백업, 동기화&lt;/b&gt; 기능 제공.&lt;br /&gt;&lt;a href=&quot;https://docs.openclaw.ai/tools/skills&quot;&gt;[docs.openclaw.ai]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ eightctl&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Eight Sleep 스마트 침대 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Eight Sleep Pod의 &lt;b&gt;온도&amp;middot;알람&amp;middot;스케줄&amp;middot;상태 조회&lt;/b&gt;를 제어.&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  gemini&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 검색 결과에서 &amp;ldquo;gemini&amp;rdquo;라는 독립 스킬은 확인되지 않음.&lt;br /&gt;대신 &lt;b&gt;nano-banana-pro&lt;/b&gt;가 Gemini 3 Pro Image 모델 기반 이미지 생성 스킬임.&lt;br /&gt;(아래 nano-banana-pro 참조)&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ gifgrep&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GIF 검색&amp;middot;다운로드&amp;middot;추출 도구&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GIF 제공처에서 &lt;b&gt;GIF 검색 및 다운로드&lt;/b&gt;, &lt;b&gt;스틸컷&amp;middot;스프라이트시트 추출&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  github&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;GitHub CLI(gh) 연동 스킬&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GitHub 이슈, PR, CI run 조회/생성&lt;/li&gt;
&lt;li&gt;고급 gh api 기능까지 사용&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  gog&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Google Workspace CLI 통합 스킬&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Gmail, Calendar, Drive, Contacts, Sheets, Docs를 하나의 CLI로 제어&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  goplaces&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Google Places API 검색&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장소 검색, 세부 정보, 리뷰 조회&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  himalaya&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IMAP/SMTP 이메일 관리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일 &lt;b&gt;리스트/읽기/답장/전달/검색&lt;/b&gt; 등 지원하는 이메일 CLI&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  mcporter&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MCP(Multi-Client Protocol) 서버 제어 및 설정 도구&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MCP 서버 리스트, 인증, 호출&lt;/li&gt;
&lt;li&gt;HTTP/STDIO 기반 MCP와의 연동, 타입/CLI 생성 기능&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  nano-banana-pro&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Gemini 3 Pro 기반 이미지 생성/편집&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트&amp;rarr;이미지, 이미지&amp;rarr;이미지&lt;/li&gt;
&lt;li&gt;1K/2K/4K 생성, 이미지 편집 지원&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  nano-pdf&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PDF 편집 스킬&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PDF를 자연어로 &lt;b&gt;편집&lt;/b&gt;, 구조 변경, 추출 등 수행&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ obsidian&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Obsidian Vault 자동화&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Obsidian CLI를 통해 마크다운 노트 &lt;b&gt;조회&amp;middot;추가&amp;middot;편집&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  openai-whisper&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로컬 Whisper 음성 인식&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Whisper CLI 기반 &lt;b&gt;오디오 &amp;rarr; 텍스트 변환&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;API 키 불필요&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  openhue&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Philips Hue 조명 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필립스 Hue 조명 및 씬 제어&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ oracle&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &amp;ldquo;oracle&amp;rdquo;이라는 스킬은 검색 결과에서 확인되지 않음.&lt;br /&gt;&amp;rarr; SKILL.md 또는 설치 경로 제공 시 기능 분석 가능.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  ordercli&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 공식 스킬 목록에 존재하는 이름으로 확인되지 않음.&lt;br /&gt;&amp;rarr; SKILL.md 제공 시 해석 가능.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  sag&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 검색 결과에서 &amp;ldquo;sag&amp;rdquo; 스킬 설명이 없음.&lt;br /&gt;&amp;rarr; SKILL.md 제공 시 해석 가능.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  songsee&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오디오 시각화 도구&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스펙트로그램 및 오디오 피처 패널 생성&lt;br /&gt;&lt;a href=&quot;https://openclaw.com.au/skills&quot;&gt;[openclaw.com.au]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  sonoscli&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sonos 스피커 제어&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sonos 기기 &lt;b&gt;검색, 상태, 재생, 볼륨, 그룹 관리&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  summarize&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹/파일 요약 스킬&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 URL, PDF, 이미지, 오디오, YouTube를 &lt;b&gt;요약&lt;/b&gt; &lt;a href=&quot;https://www.clawhub-skills.com/&quot;&gt;[clawhub-skills.com]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ video-frames&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동영상 -&amp;gt; 프레임/클립 추출&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ffmpeg 기반으로 &lt;b&gt;단일 프레임 또는 짧은 클립 추출&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 정보는 &lt;b&gt;OpenClaw 공식 Hooks 문서와 Learn OpenClaw 문서&lt;/b&gt;에 근거하여 작성했습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;✅ 1. &lt;b&gt;boot-md&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 기능 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Gateway(게이트웨이)가 시작될 때 BOOT.md 파일을 자동 실행하는 Hook&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;즉, OpenClaw가 부팅될 때마다 에이전트에게 제공할 &lt;b&gt;초기 문맥&amp;middot;규칙&amp;middot;상태 초기화 지침&lt;/b&gt;을 자동으로 로드합니다.&lt;/li&gt;
&lt;li&gt;이 Hook을 사용하면 매번 수동으로 boot 문서를 다시 읽힐 필요 없이 &lt;b&gt;자동 초기화 시나리오&lt;/b&gt;를 설정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: boot-md는 &amp;ldquo;Run BOOT.md on gateway startup&amp;rdquo;으로 명시됨 &lt;br /&gt;또한 Learn OpenClaw 문서에서도 boot-md가 번들 Hook 중 하나로 등록됨 &lt;a href=&quot;https://docs.openclaw.ai/cli/hooks&quot;&gt;[docs.openclaw.ai]&lt;/a&gt; &lt;a href=&quot;https://www.learnclawdbot.org/docs/hooks&quot;&gt;[learnclawdbot.org]&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;✅ 2. &lt;b&gt;bootstrap-extra-files&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 기능 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에이전트 **부트스트랩 과정에서 추가 workspace 파일을 시스템 프롬프트에 자동 삽입(inject)**하도록 하는 Hook입니다.&lt;/li&gt;
&lt;li&gt;기본적으로 OpenClaw는 다음과 같은 정해진 bootstrap 파일 세트만 자동 로드합니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AGENTS.md&lt;/li&gt;
&lt;li&gt;SOUL.md&lt;/li&gt;
&lt;li&gt;TOOLS.md&lt;/li&gt;
&lt;li&gt;IDENTITY.md&lt;/li&gt;
&lt;li&gt;USER.md&lt;/li&gt;
&lt;li&gt;HEARTBEAT.md&lt;/li&gt;
&lt;li&gt;BOOTSTRAP.md&lt;br /&gt;&amp;rarr; 하지만 **사용자가 넣고 싶은 .md 파일(예: memory/LESSONS.md, project-state.md)**은 기본 기능만으로는 자동 로드되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;bootstrap-extra-files Hook은 이 한계를 해결하여,&lt;/b&gt;&lt;br /&gt;사용자가 지정한 파일을 에이전트의 &amp;ldquo;Project Context&amp;rdquo;에 자동 삽입해 &lt;b&gt;초기 문맥 품질을 크게 높일 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: &amp;ldquo;Inject extra workspace bootstrap files during agent bootstrap&amp;rdquo;으로 명시됨 &lt;br /&gt;또한 &amp;ldquo;추가 bootstrap 파일을 로드하고 싶다&amp;rdquo;는 기능 요청 문서에서 동일 기능이 설명됨 &lt;a href=&quot;https://docs.openclaw.ai/cli/hooks&quot;&gt;[docs.openclaw.ai]&lt;/a&gt; &lt;a href=&quot;https://github.com/openclaw/openclaw/issues/9491&quot;&gt;[github.com]&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;✅ 3. &lt;b&gt;command-logger&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 기능 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OpenClaw에서 발생하는 &lt;b&gt;모든 slash command 이벤트(/new, /reset 등)를 로그로 기록하는 Hook&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;로깅 파일 위치 예:
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;~/.openclaw/logs/commands.log
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;이 Hook은 &lt;b&gt;감사(audit)&amp;middot;트러블슈팅&amp;middot;컴플라이언스&lt;/b&gt;와 같은 환경에서 필수적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처: command-logger는 &amp;ldquo;Log all command events to a centralized audit file&amp;rdquo;로 명시됨 &lt;br /&gt;또한 Learn OpenClaw 문서에 동일 Hook이 번들 Hook으로 포함됨 &lt;a href=&quot;https://docs.openclaw.ai/cli/hooks&quot;&gt;[docs.openclaw.ai]&lt;/a&gt; &lt;a href=&quot;https://www.learnclawdbot.org/docs/hooks&quot;&gt;[learnclawdbot.org]&lt;/a&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;✅ 4. &lt;b&gt;session-memory&lt;/b&gt;&lt;/h1&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✔ 기능 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/new 명령이 실행될 때 &lt;b&gt;현재 세션의 중요한 문맥을 메모리 파일에 자동 저장&lt;/b&gt;하는 Hook입니다.&lt;/li&gt;
&lt;li&gt;예:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션 초기화 전에 중요한 정보가 사라지지 않도록&lt;/li&gt;
&lt;li&gt;memory/YYYY-MM-DD.md 또는 MEMORY.md 등에 자동 저장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&quot;세션 초기화로 기존 맥락 없어지는 문제&quot;를 해결하는 핵심 Hook입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배경 기능 (관련 메모리 시스템)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenClaw의 메모리는 Markdown 파일 기반이며,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;memory/YYYY-MM-DD.md = 일일 기록&lt;/li&gt;
&lt;li&gt;MEMORY.md = 장기 기억&lt;br /&gt;으로 구성됩니다.&lt;br /&gt;session-memory Hook은 이 구조에 맞추어 &lt;b&gt;세션이 초기화되기 전에 자동 백업 기능&lt;/b&gt;을 수행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  출처:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;session-memory는 &amp;ldquo;Save session context to memory when /new command is issued&amp;rdquo;로 명시됨 &lt;a href=&quot;https://docs.openclaw.ai/cli/hooks&quot;&gt;[docs.openclaw.ai]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learn OpenClaw 문서에서 session-memory가 번들 Hook으로 설명됨 &lt;a href=&quot;https://www.learnclawdbot.org/docs/hooks&quot;&gt;[learnclawdbot.org]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;OpenClaw 메모리 구조 설명 문서 참조 &lt;a href=&quot;https://docs.openclaw.ai/concepts/memory&quot;&gt;[docs.openclaw.ai]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>OpenClaw</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/42</guid>
      <comments>https://code.who494.com/entry/openclaw-%EC%98%A4%ED%94%88%EC%86%8C%EC%8A%A4-AI-%EC%97%90%EC%9D%B4%EC%A0%84%ED%8A%B8#entry42comment</comments>
      <pubDate>Fri, 20 Feb 2026 12:44:14 +0900</pubDate>
    </item>
    <item>
      <title>docker 명령어 모음</title>
      <link>https://code.who494.com/entry/docker-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%A8%EC%9D%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;docker의 다양한 명령어를 실제 실행 결과와 함께 표시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1095&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4KQgU/dJMcadOipAo/L9VK8qlEeNoKWIhkYPn480/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4KQgU/dJMcadOipAo/L9VK8qlEeNoKWIhkYPn480/img.webp&quot; data-alt=&quot;도커 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4KQgU/dJMcadOipAo/L9VK8qlEeNoKWIhkYPn480/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4KQgU%2FdJMcadOipAo%2FL9VK8qlEeNoKWIhkYPn480%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;352&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1095&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;도커 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 등록된 이미지 목록 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769472425776&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker image ls

IMAGE             ID             DISK USAGE   CONTENT SIZE   EXTRA
postgres:latest   5ec39c188013        643MB          162MB    U&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 컨테이너에서 실행 중인 이미지 목록&lt;/p&gt;
&lt;pre id=&quot;code_1769472673364&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker container ps -a

CONTAINER ID   IMAGE             COMMAND                  CREATED        STATUS                      PORTS                    NAMES
2f82d779c69a   postgres:latest   &quot;docker-entrypoint.s&amp;hellip;&quot;   2 months ago   Exited (255) 19 hours ago   0.0.0.0:5432-&amp;gt;5432/tcp   PostGres_202511&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 시스템 정보 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769473279472&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker system info

Client: Docker Engine - Community
 Version:    29.1.5
 Context:    default
 Debug Mode: false
 Plugins:
  ai: Docker AI Agent - Ask Gordon (Docker Inc.)
    Version:  v1.9.11
    Path:     /usr/local/lib/docker/cli-plugins/docker-ai
  buildx: Docker Buildx (Docker Inc.)
    Version:  v0.29.1-desktop.1
    Path:     /usr/local/lib/docker/cli-plugins/docker-buildx
  compose: Docker Compose (Docker Inc.)
    Version:  v2.40.3-desktop.1
    Path:     /usr/local/lib/docker/cli-plugins/docker-compose
  debug: Get a shell into any image or container (Docker Inc.)
    Version:  0.0.45
    Path:     /usr/local/lib/docker/cli-plugins/docker-debug
  desktop: Docker Desktop commands (Docker Inc.)
    Version:  v0.2.0
    Path:     /usr/local/lib/docker/cli-plugins/docker-desktop
  extension: Manages Docker extensions (Docker Inc.)
    Version:  v0.2.31
    Path:     /usr/local/lib/docker/cli-plugins/docker-extension
  init: Creates Docker-related starter files for your project (Docker Inc.)
    Version:  v1.4.0
    Path:     /usr/local/lib/docker/cli-plugins/docker-init
  mcp: Docker MCP Plugin (Docker Inc.)
    Version:  v0.27.0
    Path:     /usr/local/lib/docker/cli-plugins/docker-mcp
  model: Docker Model Runner (Docker Inc.)
    Version:  v0.1.46
    Path:     /usr/local/lib/docker/cli-plugins/docker-model
  offload: Docker Offload (Docker Inc.)
    Version:  v0.5.17
    Path:     /usr/local/lib/docker/cli-plugins/docker-offload
  sandbox: Docker Sandbox (Docker Inc.)
    Version:  v0.5.3
    Path:     /usr/local/lib/docker/cli-plugins/docker-sandbox
  sbom: View the packaged-based Software Bill Of Materials (SBOM) for an image (Anchore Inc.)
    Version:  0.6.0
    Path:     /usr/local/lib/docker/cli-plugins/docker-sbom
  scout: Docker Scout (Docker Inc.)
    Version:  v1.18.3
    Path:     /usr/local/lib/docker/cli-plugins/docker-scout

Server:
 Containers: 1
  Running: 1
  Paused: 0
  Stopped: 0
 Images: 1
 Server Version: 28.5.2
 Storage Driver: overlayfs
  driver-type: io.containerd.snapshotter.v1
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 CDI spec directories:
  /etc/cdi
  /var/run/cdi
 Discovered Devices:
  cdi: docker.com/gpu=webgpu
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 nvidia runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 442cb34bda9a6a0fed82a2ca7cade05c5c749582
 runc version: v1.3.3-0-gd842d771
 init version: de40ad0
 Security Options:
  seccomp
   Profile: builtin
  cgroupns
 Kernel Version: 6.6.87.2-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 16
 Total Memory: 15.32GiB
 Name: docker-desktop
 ID: 5cf967e0-627f-4eb7-bfcf-e56c11ce8487
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Labels:
  com.docker.desktop.address=unix:///var/run/docker-cli.sock
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5555
  ::1/128
  127.0.0.0/8
 Live Restore Enabled: false
 Firewall Backend: iptables&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지 정보 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769473541380&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker image inspect postgres:latest

[
    {
        &quot;Id&quot;: &quot;sha256:5ec39c188013123927f30a006987c6b0e20f3ef2b54b140dfa96dac6844d883f&quot;,
        &quot;RepoTags&quot;: [
            &quot;postgres:latest&quot;
        ],
        &quot;RepoDigests&quot;: [
            &quot;postgres@sha256:5ec39c188013123927f30a006987c6b0e20f3ef2b54b140dfa96dac6844d883f&quot;
        ],
        &quot;Parent&quot;: &quot;&quot;,
        &quot;Comment&quot;: &quot;buildkit.dockerfile.v0&quot;,
        &quot;Created&quot;: &quot;2025-11-18T04:58:44.634052089Z&quot;,
        &quot;DockerVersion&quot;: &quot;&quot;,
        &quot;Author&quot;: &quot;&quot;,
        &quot;Architecture&quot;: &quot;amd64&quot;,
        &quot;Os&quot;: &quot;linux&quot;,
        &quot;Size&quot;: 162229123,
        &quot;GraphDriver&quot;: {
            &quot;Data&quot;: null,
            &quot;Name&quot;: &quot;overlayfs&quot;
        },
        &quot;RootFS&quot;: {
            &quot;Type&quot;: &quot;layers&quot;,
            &quot;Layers&quot;: [
                &quot;sha256:70a290c5e58b68f39496ab93a62f21b8b2ca0502e97905131838de1b39a37cbb&quot;,
                &quot;sha256:39a24a141073e06c4da99ac4c283e4ad2d279eb53b979cb87ba26a93a39f359f&quot;,
                &quot;sha256:28355a4ad36c0c8bc45724d6f1dc7cbbf220faefd89b7bbea15b22cb573ae7c4&quot;,
                &quot;sha256:97a2cf9b72ae8bef479d55d7a4afe2ae8b395321c18577378d061c0d69593af8&quot;,
                &quot;sha256:e6e5eedc0dbaef156416af477bfe4150c8b0c766e7d22bc8b411ed8e5e49b8c5&quot;,
                &quot;sha256:87c2d222fac63bdfa4dfe652705d7a33c199114b3b3f3cfb292422c3e5629835&quot;,
                &quot;sha256:f776959d8dad6b1d66c6c5167fb0ea5f7f46a5e92925a8035e12f24dd870623d&quot;,
                &quot;sha256:db8adc8d1a52a6f95e0efff2d28b74fcf94069daa8e7622f01cbee4117e63e2f&quot;,
                &quot;sha256:a2e80675a7743d840288369facdc9b7bb9b86a211568d1fd008a2aa85dd896b5&quot;,
                &quot;sha256:7197eb8b28a118a93f0b7e2fbb57ee205c4795805e0f375b6fe4145209bfb2e7&quot;,
                &quot;sha256:539cbec8e5fb5f5c754a2264e7770d0ea04a26afa6a2a313c08c611066471f9b&quot;,
                &quot;sha256:c3fdd28f0183744a497df7b2d3a0b32e64eecbccfe241172dcef2c774e913c6d&quot;,
                &quot;sha256:6346e5641bb55613d1122e9af70cac2cd4590cf9624a2f5064b72b330dda7ce0&quot;
            ]
        },
        &quot;Metadata&quot;: {
            &quot;LastTagTime&quot;: &quot;2025-11-20T06:56:23.744242983Z&quot;
        },
        &quot;Descriptor&quot;: {
            &quot;mediaType&quot;: &quot;application/vnd.oci.image.index.v1+json&quot;,
            &quot;digest&quot;: &quot;sha256:5ec39c188013123927f30a006987c6b0e20f3ef2b54b140dfa96dac6844d883f&quot;,
            &quot;size&quot;: 10229
        },
        &quot;Config&quot;: {
            &quot;Cmd&quot;: [
                &quot;postgres&quot;
            ],
            &quot;Entrypoint&quot;: [
                &quot;docker-entrypoint.sh&quot;
            ],
            &quot;Env&quot;: [
                &quot;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/postgresql/18/bin&quot;,
                &quot;GOSU_VERSION=1.19&quot;,
                &quot;LANG=en_US.utf8&quot;,
                &quot;PG_MAJOR=18&quot;,
                &quot;PG_VERSION=18.1-1.pgdg13+2&quot;,
                &quot;PGDATA=/var/lib/postgresql/18/docker&quot;
            ],
            &quot;ExposedPorts&quot;: {
                &quot;5432/tcp&quot;: {}
            },
            &quot;Labels&quot;: null,
            &quot;OnBuild&quot;: null,
            &quot;StopSignal&quot;: &quot;SIGINT&quot;,
            &quot;User&quot;: &quot;&quot;,
            &quot;Volumes&quot;: {
                &quot;/var/lib/postgresql&quot;: {}
            },
            &quot;WorkingDir&quot;: &quot;&quot;
        }
    }
]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 가능 도커 이미지 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769473897751&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo docker search mysql

NAME                   DESCRIPTION                                     STARS     OFFICIAL
mysql                  MySQL is a widely used, open-source relation&amp;hellip;   16050     [OK]
bitnami/mysql          Bitnami Secure Image for mysql                  147
circleci/mysql         MySQL is a widely used, open-source relation&amp;hellip;   32
bitnamicharts/mysql    Bitnami Helm chart for MySQL                    0
cimg/mysql                                                             3
ubuntu/mysql           MySQL open source fast, stable, multi-thread&amp;hellip;   72
google/mysql           MySQL server for Google Compute Engine          26
linuxserver/mysql      A Mysql container, brought to you by LinuxSe&amp;hellip;   48
elestio/mysql          Mysql, verified and packaged by Elestio         3
alpine/mysql           mysql client                                    7
docksal/mysql          MySQL service images for Docksal - https://d&amp;hellip;   0
eclipse/mysql          Mysql 5.7, curl, rsync                          3
ilios/mysql            Mysql configured for running Ilios              1
datajoint/mysql        MySQL image pre-configured to work smoothly &amp;hellip;   2
ddev/mysql             ARM64 base images for ddev-dbserver-mysql-8.&amp;hellip;   2
mirantis/mysql                                                         0
corpusops/mysql        https://github.com/corpusops/docker-images/     0
mysql/mysql-server     Optimized MySQL Server Docker images. Create&amp;hellip;   1033
vulhub/mysql                                                           1
cbioportal/mysql       This repository hosts MySQL database images &amp;hellip;   1
vitess/mysql           Lightweight image to run MySQL with Vitess      1
mysql/mysql-router     MySQL Router provides transparent routing be&amp;hellip;   28
mysql/mysql-cluster    Experimental MySQL Cluster Docker images. Cr&amp;hellip;   100
nasqueron/mysql                                                        1
mysql/mysql-operator   MySQL Operator for Kubernetes                   1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 서비스 상태 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769477249756&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status docker

● docker.service - Docker Application Container Engine
     Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
     Active: active (running) since Mon 2026-01-26 14:03:29 KST; 20h ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 7204 (dockerd)
      Tasks: 39
     Memory: 42.5M (peak: 159.5M)
        CPU: 19.112s
     CGroup: /system.slice/docker.service
             ├─7204 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
             ├─7633 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8888 -container-ip 172.17.0.2 -container-port 80 -use-listen-fd
             └─7639 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8888 -container-ip 172.17.0.2 -container-port 80 -use-listen-fd

Jan 26 14:03:28 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:28.841036202+09:00&quot; level=info msg=&quot;Deleting nftables IPv6 rules&quot; error=&quot;exit status 1&quot;
Jan 26 14:03:29 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:29.041321494+09:00&quot; level=info msg=&quot;Loading containers: done.&quot;
Jan 26 14:03:29 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:29.047940881+09:00&quot; level=info msg=&quot;Docker daemon&quot; commit=3b01d64 containerd-snapshotter=true storage-driver=overlayfs &amp;gt;
Jan 26 14:03:29 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:29.048366252+09:00&quot; level=info msg=&quot;Initializing buildkit&quot;
Jan 26 14:03:29 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:29.065302450+09:00&quot; level=info msg=&quot;Completed buildkit initialization&quot;
Jan 26 14:03:29 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:29.067639460+09:00&quot; level=info msg=&quot;Daemon has completed initialization&quot;
Jan 26 14:03:29 DESKTOP-09FFPV8 dockerd[7204]: time=&quot;2026-01-26T14:03:29.067677631+09:00&quot; level=info msg=&quot;API listen on /run/docker.sock&quot;
Jan 26 14:03:29 DESKTOP-09FFPV8 systemd[1]: Started docker.service - Docker Application Container Engine.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 프로세스 전체 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769488940750&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker ps -a

CONTAINER ID   IMAGE                        COMMAND                  CREATED        STATUS                     PORTS     NAMES
e3d57fa4f1ec   openproject/openproject:17   &quot;./docker/prod/entry&amp;hellip;&quot;   23 hours ago   Exited (137) 3 hours ago             dreamy_swirles&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 컨테이너 삭제&lt;/p&gt;
&lt;pre id=&quot;code_1769489039225&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker rm e3d57fa4f1ec

e3d57fa4f1ec&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커에 등록된 이미지 조회&lt;/p&gt;
&lt;pre id=&quot;code_1769489110820&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker images

IMAGE                        ID             DISK USAGE   CONTENT SIZE   EXTRA
openproject/openproject:17   599d46d6544a       4.93GB         1.24GB&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;도커 이미지 삭제&lt;/p&gt;
&lt;pre id=&quot;code_1769489167998&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo docker rmi openproject/openproject:17

Untagged: openproject/openproject:17
Deleted: sha256:599d46d6544aad77bb4293f038f356e45bdd21238d32659b9acca81e935e5d50&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>docker</category>
      <category>도커 상태 조회</category>
      <category>명령어</category>
      <category>모음</category>
      <category>이미지 삭제</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/41</guid>
      <comments>https://code.who494.com/entry/docker-%EB%AA%85%EB%A0%B9%EC%96%B4-%EB%AA%A8%EC%9D%8C#entry41comment</comments>
      <pubDate>Fri, 20 Feb 2026 09:21:46 +0900</pubDate>
    </item>
    <item>
      <title>웹 패킷 분석 Fiddler 사용법</title>
      <link>https://code.who494.com/entry/%EC%9B%B9-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D-Fiddler-%EC%82%AC%EC%9A%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Fiddler는 웹 사이트가 어떻게 작동하는지 내부를 들여다보고 싶을 때, 혹은 API 통신 문제를 해결해야 할 때 필수적으로 사용하는 웹 통신 돋보기와 같은 도구입니다. 유사한 도구로는 Wireshark(네트워크 전반), Charles Proxy(Mac에서 인기) 등이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;780&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S7xEk/dJMcaiozaw2/Y3XxSKDMkqZb1e3vItPF9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S7xEk/dJMcaiozaw2/Y3XxSKDMkqZb1e3vItPF9K/img.png&quot; data-alt=&quot;Fiddler Classic 캡쳐화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S7xEk/dJMcaiozaw2/Y3XxSKDMkqZb1e3vItPF9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS7xEk%2FdJMcaiozaw2%2FY3XxSKDMkqZb1e3vItPF9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;373&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;780&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fiddler Classic 캡쳐화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;주요 기능&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;트래픽 캡처 (Traffic Capture) &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;모든 HTTP/HTTPS 통신을 실시간으로 기록합니다. 어떤 URL에 접속했는지, 어떤 데이터를 보냈는지 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복호화 (HTTPS Decryption)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;암호화된 HTTPS 트래픽을 복호화하여 내부의 실제 텍스트 내용을 볼 수 있게 해줍니다. (자체 인증서 설치 필요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;요청 및 응답 수정 (Manipulation)&lt;br /&gt;서버로&amp;nbsp;보내는&amp;nbsp;요청(Request)을&amp;nbsp;중간에&amp;nbsp;멈춰서&amp;nbsp;내용을&amp;nbsp;바꾼&amp;nbsp;뒤&amp;nbsp;보낼&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;서버에서&amp;nbsp;오는&amp;nbsp;응답(Response)을&amp;nbsp;수정하여&amp;nbsp;클라이언트(브라우저)가&amp;nbsp;어떻게&amp;nbsp;반응하는지&amp;nbsp;테스트할&amp;nbsp;수&amp;nbsp;있습니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 응답기 (AutoResponder)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 요청이 들어오면 서버에 가지 않고 미리 준비한 가짜 파일(JSON, HTML 등)이나 응답을 즉시 내보내도록 설정할 수 있습니다. (서버가 아직 개발되지 않았을 때 유용함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;성능 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지의 로딩 속도를 분석하고, 어떤 리소스가 병목 현상을 일으키는지 시각적으로 보여줍니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키, 헤더 정보, 인증 토큰 등이 안전하게 전달되는지 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 설정 필요&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1gmxe/dJMcadtYWda/83D4OxCGujAdOWtAylco60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1gmxe/dJMcadtYWda/83D4OxCGujAdOWtAylco60/img.png&quot; data-alt=&quot;Tools 아래 Options.. 메뉴 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1gmxe/dJMcadtYWda/83D4OxCGujAdOWtAylco60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1gmxe%2FdJMcadtYWda%2F83D4OxCGujAdOWtAylco60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;365&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Tools 아래 Options.. 메뉴 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K9ZBs/dJMcab33feu/ayzKgNNLRNIEo1KO0uKFyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K9ZBs/dJMcab33feu/ayzKgNNLRNIEo1KO0uKFyk/img.png&quot; data-alt=&quot;Capture, Decrypt HTTPS 체크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K9ZBs/dJMcab33feu/ayzKgNNLRNIEo1KO0uKFyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK9ZBs%2FdJMcab33feu%2FayzKgNNLRNIEo1KO0uKFyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;366&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Capture, Decrypt HTTPS 체크&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZhBuI/dJMcai28bFZ/CxLuWekMZcQDy1vntKss00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZhBuI/dJMcai28bFZ/CxLuWekMZcQDy1vntKss00/img.png&quot; data-alt=&quot;8888 프록시 기본 포트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZhBuI/dJMcai28bFZ/CxLuWekMZcQDy1vntKss00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZhBuI%2FdJMcai28bFZ%2FCxLuWekMZcQDy1vntKss00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;362&quot; data-origin-width=&quot;562&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;8888 프록시 기본 포트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bENKkO/dJMcaia24cW/CiqRobcCkdlIOj7vrBfTL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bENKkO/dJMcaia24cW/CiqRobcCkdlIOj7vrBfTL1/img.png&quot; data-alt=&quot;Online 주소 확인 할 수 있는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bENKkO/dJMcaia24cW/CiqRobcCkdlIOj7vrBfTL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbENKkO%2FdJMcaia24cW%2FCiqRobcCkdlIOj7vrBfTL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1012&quot; height=&quot;305&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Online 주소 확인 할 수 있는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwK1aS/dJMcag5npo7/wIz07YZojhzovkur8v1dFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwK1aS/dJMcag5npo7/wIz07YZojhzovkur8v1dFk/img.png&quot; data-alt=&quot;마우스를 올리면 보임&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwK1aS/dJMcag5npo7/wIz07YZojhzovkur8v1dFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwK1aS%2FdJMcag5npo7%2FwIz07YZojhzovkur8v1dFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;193&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마우스를 올리면 보임&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 캡쳐 화면 내용상 기본적인 Proxy 설정 정보&lt;/p&gt;
&lt;pre id=&quot;code_1769133387615&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;192.168.0.197:8888&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;775&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0AkEp/dJMcagqKBqY/PeGSq3APIqSeot9aSilJek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0AkEp/dJMcagqKBqY/PeGSq3APIqSeot9aSilJek/img.png&quot; data-alt=&quot;필터를 사용해 원하는 도메인만 표시되도록 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0AkEp/dJMcagqKBqY/PeGSq3APIqSeot9aSilJek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0AkEp%2FdJMcagqKBqY%2FPeGSq3APIqSeot9aSilJek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;775&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;775&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;필터를 사용해 원하는 도메인만 표시되도록 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일에서 사용하는 경우 아래 Fiddler.cer 인증서 파일을 모바일 기기에 추가해줘야 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/czPnrJ/dJMcabJMgK8/uQqlzAaqkh1XnKNu4AYlkK/Fiddler.cer?attach=1&amp;amp;knm=tfile.cer&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;Fiddler.cer&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 HTTP 패킷을 분석하기 위해서는 같은 네트워크 (WIFI) 망을 사용해야 합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;작동 원리 (Proxy)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fiddler는&amp;nbsp;컴퓨터의&amp;nbsp;로컬&amp;nbsp;프록시&amp;nbsp;서버로&amp;nbsp;동작합니다. &lt;br /&gt;사용자가&amp;nbsp;브라우저에서&amp;nbsp;웹사이트를&amp;nbsp;호출합니다. &lt;br /&gt;데이터가&amp;nbsp;바로&amp;nbsp;인터넷으로&amp;nbsp;나가지&amp;nbsp;않고,&amp;nbsp;중간에&amp;nbsp;있는&amp;nbsp;Fiddler를&amp;nbsp;거칩니다. &lt;br /&gt;Fiddler가&amp;nbsp;데이터를&amp;nbsp;기록한&amp;nbsp;후&amp;nbsp;서버로&amp;nbsp;전달합니다. &lt;br /&gt;서버의&amp;nbsp;응답&amp;nbsp;역시&amp;nbsp;Fiddler를&amp;nbsp;거쳐&amp;nbsp;브라우저로&amp;nbsp;전달됩니다. &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 사용자 및 용도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발자: 프론트엔드와 백엔드 간의 API 통신이 정확한지, 데이터 형식(JSON 등)이 맞는지 디버깅할 때 사용합니다. &lt;br /&gt;QA/테스터:&amp;nbsp;버그&amp;nbsp;리포트를&amp;nbsp;작성할&amp;nbsp;때&amp;nbsp;상세한&amp;nbsp;네트워크&amp;nbsp;로그를&amp;nbsp;첨부하거나,&amp;nbsp;네트워크&amp;nbsp;속도를&amp;nbsp;제한(Throttling)하여&amp;nbsp;저속&amp;nbsp;환경&amp;nbsp;테스트를&amp;nbsp;할&amp;nbsp;때&amp;nbsp;사용합니다. &lt;br /&gt;보안&amp;nbsp;전문가:&amp;nbsp;취약점&amp;nbsp;분석이나&amp;nbsp;데이터&amp;nbsp;유출&amp;nbsp;여부를&amp;nbsp;점검할&amp;nbsp;때&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Fiddler의 종류 &lt;br /&gt;현재&amp;nbsp;Fiddler는&amp;nbsp;크게&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;버전으로&amp;nbsp;나뉩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Fiddler&amp;nbsp;Classic: &lt;br /&gt;Windows&amp;nbsp;전용입니다. &lt;br /&gt;오랫동안&amp;nbsp;사용되어&amp;nbsp;온&amp;nbsp;전통적인&amp;nbsp;버전이며,&amp;nbsp;무료로&amp;nbsp;강력한&amp;nbsp;기능을&amp;nbsp;제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Fiddler&amp;nbsp;Everywhere: &lt;br /&gt;Windows,&amp;nbsp;macOS,&amp;nbsp;Linux를&amp;nbsp;모두&amp;nbsp;지원하는&amp;nbsp;최신&amp;nbsp;버전입니다. &lt;br /&gt;UI가&amp;nbsp;현대적이고&amp;nbsp;협업&amp;nbsp;기능이&amp;nbsp;강화되었지만,&amp;nbsp;유료&amp;nbsp;구독&amp;nbsp;모델&amp;nbsp;위주로&amp;nbsp;운영됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[Fiddler classic 다운로드 주소]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.telerik.com/fiddler/fiddler-classic&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.telerik.com/fiddler/fiddler-classic&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1769132337011&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Web Debugging Proxy Tool | Fiddler Classic&quot; data-og-description=&quot;Fiddler Classic is a community trusted Windows-only web capture tool that logs HTTP(s) network traffic.&quot; data-og-host=&quot;www.telerik.com&quot; data-og-source-url=&quot;https://www.telerik.com/fiddler/fiddler-classic&quot; data-og-url=&quot;https://www.telerik.com/fiddler/fiddler-classic&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bbnutZ/dJMb9iaLjQh/QRiphC7mS6Q0LRhd7gK0t0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cMXVVu/dJMb84p2UJ8/kEi2nx7s7sQdnfjVDQVsB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/WAunR/dJMb81GRjQb/k4gGsEwmdxzXkvQrHzuVKk/img.png?width=1903&amp;amp;height=1634&amp;amp;face=0_0_1903_1634&quot;&gt;&lt;a href=&quot;https://www.telerik.com/fiddler/fiddler-classic&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.telerik.com/fiddler/fiddler-classic&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bbnutZ/dJMb9iaLjQh/QRiphC7mS6Q0LRhd7gK0t0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/cMXVVu/dJMb84p2UJ8/kEi2nx7s7sQdnfjVDQVsB1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/WAunR/dJMb81GRjQb/k4gGsEwmdxzXkvQrHzuVKk/img.png?width=1903&amp;amp;height=1634&amp;amp;face=0_0_1903_1634');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Web Debugging Proxy Tool | Fiddler Classic&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Fiddler Classic is a community trusted Windows-only web capture tool that logs HTTP(s) network traffic.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.telerik.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>fiddler</category>
      <category>디버깅</category>
      <category>분석</category>
      <category>웹패킷</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/40</guid>
      <comments>https://code.who494.com/entry/%EC%9B%B9-%ED%8C%A8%ED%82%B7-%EB%B6%84%EC%84%9D-Fiddler-%EC%82%AC%EC%9A%A9%EB%B2%95#entry40comment</comments>
      <pubDate>Fri, 23 Jan 2026 11:16:08 +0900</pubDate>
    </item>
    <item>
      <title>Polling (Short Polling), Long Polling, Stream API (Server-Sent Events, SSE)</title>
      <link>https://code.who494.com/entry/Polling-Short-Polling-Long-Polling-Stream-API-Server-Sent-Events-SSE</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션에서 서버로부터 데이터를 실시간으로 가져오기 위한 방법들은 서비스의 요구사항과 자원 효율성에 따라 여러 가지가 있습니다. 가장 대표적인 **Polling, Long Polling, 그리고 Stream API (Server-Sent Events)**에 대해 자세히 설명해 드리겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJrYqA/dJMcagxv090/tjKncTJOLm35uCvJxgrmaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJrYqA/dJMcagxv090/tjKncTJOLm35uCvJxgrmaK/img.png&quot; data-alt=&quot;요약 및 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJrYqA/dJMcagxv090/tjKncTJOLm35uCvJxgrmaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJrYqA%2FdJMcagxv090%2FtjKncTJOLm35uCvJxgrmaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;236&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요약 및 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;웹 애플리케이션에서 서버로부터 데이터를 실시간으로 가져오기 위한 방법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.&amp;nbsp;Polling&amp;nbsp;(Short&amp;nbsp;Polling)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;클라이언트가 일정한 주기(예: 5초마다)로 서버에 &quot;새로운 데이터가 있나요?&quot;라고 물어보는 방식입니다. 가장 고전적이고 구현이 쉬운 방법입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;작동&amp;nbsp;원리:&amp;nbsp;주기적으로&amp;nbsp;HTTP&amp;nbsp;요청을&amp;nbsp;보내고&amp;nbsp;응답을&amp;nbsp;받으면&amp;nbsp;연결을&amp;nbsp;종료합니다. &lt;br /&gt;장점:&amp;nbsp;구현이&amp;nbsp;매우&amp;nbsp;간단하며,&amp;nbsp;서버&amp;nbsp;상태를&amp;nbsp;유지하지&amp;nbsp;않아도&amp;nbsp;됩니다. &lt;br /&gt;단점:&amp;nbsp;데이터가&amp;nbsp;없어도&amp;nbsp;계속&amp;nbsp;요청을&amp;nbsp;보내므로&amp;nbsp;서버&amp;nbsp;및&amp;nbsp;네트워크&amp;nbsp;리소스&amp;nbsp;낭비가&amp;nbsp;심합니다.&amp;nbsp;실시간성이&amp;nbsp;떨어집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1769079363646&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 클라이언트 코드
function startPolling() {
    setInterval(async () =&amp;gt; {
        try {
            const response = await fetch('/api/data');
            const data = await response.json();
            console.log(&quot;데이터 수신:&quot;, data);
        } catch (error) {
            console.error(&quot;에러 발생:&quot;, error);
        }
    }, 5000); // 5초마다 요청
}

startPolling();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.&amp;nbsp;Long&amp;nbsp;Polling&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199; color: #000000;&quot;&gt;Polling의 비효율성을 개선한 방식입니다. 클라이언트가 요청을 보내면 서버는 새로운 데이터가 생길 때까지 연결을 열어두고 기다립니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;작동&amp;nbsp;원리: &lt;br /&gt;클라이언트가&amp;nbsp;서버로&amp;nbsp;요청을&amp;nbsp;보냅니다. &lt;br /&gt;서버는&amp;nbsp;새로운&amp;nbsp;데이터가&amp;nbsp;생길&amp;nbsp;때까지&amp;nbsp;응답을&amp;nbsp;보내지&amp;nbsp;않고&amp;nbsp;대기합니다. &lt;br /&gt;데이터가&amp;nbsp;생기거나&amp;nbsp;타임아웃이&amp;nbsp;발생하면&amp;nbsp;응답을&amp;nbsp;보냅니다. &lt;br /&gt;클라이언트는&amp;nbsp;응답을&amp;nbsp;받자마자&amp;nbsp;다시&amp;nbsp;서버에&amp;nbsp;요청을&amp;nbsp;보냅니다. &lt;br /&gt;장점:&amp;nbsp;일반&amp;nbsp;Polling보다&amp;nbsp;실시간성이&amp;nbsp;높고,&amp;nbsp;데이터가&amp;nbsp;없을&amp;nbsp;때의&amp;nbsp;불필요한&amp;nbsp;트래픽을&amp;nbsp;줄입니다. &lt;br /&gt;단점:&amp;nbsp;다수의&amp;nbsp;클라이언트가&amp;nbsp;연결될&amp;nbsp;경우,&amp;nbsp;서버가&amp;nbsp;많은&amp;nbsp;대기&amp;nbsp;요청을&amp;nbsp;유지해야&amp;nbsp;하므로&amp;nbsp;부담이&amp;nbsp;될&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1769079426390&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;async function longPoll() {
    try {
        const response = await fetch('/api/long-poll');
        if (response.status === 200) {
            const data = await response.json();
            console.log(&quot;새 데이터:&quot;, data);
        }
        // 응답을 받으면 즉시 다시 요청
        longPoll();
    } catch (error) {
        setTimeout(longPoll, 5000); // 에러 발생 시 5초 후 재시도
    }
}
longPoll();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server&amp;nbsp;(Express&amp;nbsp;예시):&lt;/p&gt;
&lt;pre id=&quot;code_1769079478411&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.get('/api/long-poll', (req, res) =&amp;gt; {
    // 데이터가 생길 때까지 기다리는 로직 (예: EventEmitter)
    newDataEmitter.once('update', (data) =&amp;gt; {
        res.json(data);
    });
    
    // 타임아웃 설정 (예: 30초 후 응답)
    setTimeout(() =&amp;gt; {
        if (!res.writableEnded) res.status(204).end();
    }, 30000);
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.&amp;nbsp;Stream&amp;nbsp;API&amp;nbsp;(Server-Sent&amp;nbsp;Events,&amp;nbsp;SSE)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;서버와 클라이언트 간에 한 번 연결을 맺으면, 서버가 클라이언트로 데이터를 지속적으로 밀어주는(Push) 단방향 스트리밍 방식입니다.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작동&amp;nbsp;원리:&amp;nbsp;HTTP&amp;nbsp;연결을&amp;nbsp;유지한&amp;nbsp;채로&amp;nbsp;text/event-stream&amp;nbsp;형식을&amp;nbsp;사용하여&amp;nbsp;데이터를&amp;nbsp;전송합니다. &lt;br /&gt;장점:&amp;nbsp;연결&amp;nbsp;재수립&amp;nbsp;비용이&amp;nbsp;들지&amp;nbsp;않아&amp;nbsp;매우&amp;nbsp;효율적이며&amp;nbsp;실시간성이&amp;nbsp;매우&amp;nbsp;높습니다.&amp;nbsp;HTTP&amp;nbsp;프로토콜을&amp;nbsp;그대로&amp;nbsp;사용하므로&amp;nbsp;호환성이&amp;nbsp;좋습니다. &lt;br /&gt;단점:&amp;nbsp;서버에서&amp;nbsp;클라이언트로만&amp;nbsp;보내는&amp;nbsp;단방향&amp;nbsp;통신입니다.&amp;nbsp;(클라이언트에서&amp;nbsp;서버로&amp;nbsp;보낼&amp;nbsp;때는&amp;nbsp;별도의&amp;nbsp;HTTP&amp;nbsp;요청&amp;nbsp;필요)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제&amp;nbsp;(Node.js&amp;nbsp;&amp;amp;&amp;nbsp;JavaScript) &lt;br /&gt;Server&amp;nbsp;(Express&amp;nbsp;예시):&lt;/p&gt;
&lt;pre id=&quot;code_1769079767040&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.get('/api/stream', (req, res) =&amp;gt; {
    // SSE를 위한 헤더 설정
    res.setHeader('Content-Type', 'text/event-stream');
    res.setHeader('Cache-Control', 'no-cache');
    res.setHeader('Connection', 'keep-alive');

    // 데이터를 2초마다 전송
    const interval = setInterval(() =&amp;gt; {
        const data = { message: '실시간 알림', time: new Date() };
        res.write(`data: ${JSON.stringify(data)}\n\n`); // 규격: &quot;data: 내용\n\n&quot;
    }, 2000);

    // 연결 종료 시 처리
    req.on('close', () =&amp;gt; {
        clearInterval(interval);
        res.end();
    });
});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client 예시:&lt;/p&gt;
&lt;pre id=&quot;code_1769079796820&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function startSSE() {
    const eventSource = new EventSource('/api/stream');

    eventSource.onmessage = (event) =&amp;gt; {
        const data = JSON.parse(event.data);
        console.log(&quot;스트림 데이터 수신:&quot;, data);
    };

    eventSource.onerror = (error) =&amp;gt; {
        console.error(&quot;SSE 에러:&quot;, error);
        eventSource.close();
    };
}
startSSE();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;결론&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순함이&amp;nbsp;제일&amp;nbsp;중요하고&amp;nbsp;실시간성이&amp;nbsp;낮아도&amp;nbsp;된다면&amp;nbsp;-&amp;gt;&amp;nbsp;Polling &lt;br /&gt;실시간성이&amp;nbsp;필요하지만,&amp;nbsp;양방향(WebSocket)까지는&amp;nbsp;필요&amp;nbsp;없다면&amp;nbsp;-&amp;gt;&amp;nbsp;SSE &lt;br /&gt;오래된&amp;nbsp;브라우저를&amp;nbsp;지원해야&amp;nbsp;하거나&amp;nbsp;SSE&amp;nbsp;설정이&amp;nbsp;어려운&amp;nbsp;환경이라면&amp;nbsp;-&amp;gt;&amp;nbsp;Long&amp;nbsp;Polling &lt;br /&gt;만약 채팅처럼 서버-클라이언트 간 양방향 실시간 통신이 매우 빈번하다면 -&amp;gt; WebSocket(별개 기술)을 고려&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>Long Polling</category>
      <category>Polling</category>
      <category>Server-Sent Events</category>
      <category>Short Polling</category>
      <category>SSE</category>
      <category>Stream API</category>
      <category>롱폴링</category>
      <category>숏폴링</category>
      <category>폴링</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/39</guid>
      <comments>https://code.who494.com/entry/Polling-Short-Polling-Long-Polling-Stream-API-Server-Sent-Events-SSE#entry39comment</comments>
      <pubDate>Thu, 22 Jan 2026 20:12:25 +0900</pubDate>
    </item>
    <item>
      <title>안드로이드 폰 ADB(Android Debugging Bridge) 키 인증</title>
      <link>https://code.who494.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%8F%B0-ADBAndroid-Debugging-Bridge-%ED%82%A4-%EC%9D%B8%EC%A6%9D</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;크롬 브라우저에서 디버깅을 할때 &quot;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;Pending authentication: please accept debugging session on the device.&quot; &lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;메시지와 함께 연결이 안 되는 문제는 주로 ADB(Android Debugging Bridge) 키 인증 과정에서 꼬였을 때 발생합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;613&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LpZS2/dJMcaionwNy/UKqQhXG5ZBWYmzmL9sX9r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LpZS2/dJMcaionwNy/UKqQhXG5ZBWYmzmL9sX9r1/img.png&quot; data-alt=&quot;크롬 inspect 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LpZS2/dJMcaionwNy/UKqQhXG5ZBWYmzmL9sX9r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLpZS2%2FdJMcaionwNy%2FUKqQhXG5ZBWYmzmL9sX9r1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;566&quot; height=&quot;366&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;613&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;크롬 inspect 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;연결 명령 실행&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;아래 명령어 실행 파일이 없다면 아래 platform-tools.zip 파일을 다운로드 받으세요.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1766536675607&quot; class=&quot;applescript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\tools&amp;gt;adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully

# 위 메세지 처럼 실행되고 난 후 윈도우 통신 포트 오픈 여부를 물어 봅니다. 그때 예 선택하시면 이후 크롬 브라우저 디버깅이 가능해 집니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bd0fCc/dJMcabCNsmL/PFbkX14TREguSFnzkmZxV0/platform-tools.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;platform-tools.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;6.81MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;연결이 안되는 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;다른 이유&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;12,0,0&quot; data-index-in-node=&quot;0&quot;&gt;포트 충돌:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;다른 미디어 서버(MediaMTX, Janus 등)나 프로세스가 ADB 포트(5037)를 점유하고 있는지 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;12,1,0&quot; data-index-in-node=&quot;0&quot;&gt;USB 모드:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기기의 USB 연결 설정이 '충전 전용'이 아닌&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;12,1,0&quot; data-index-in-node=&quot;35&quot;&gt;'파일 전송(MTP)'&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b data-path-to-node=&quot;12,1,0&quot; data-index-in-node=&quot;51&quot;&gt;'PTP'&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모드로 되어 있어야 팝업이 더 잘 뜹니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-path-to-node=&quot;12,2,0&quot; data-index-in-node=&quot;0&quot;&gt;브라우저 종료:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;가끔 Chrome의 inspect 탭이 인증 프로세스를 붙잡고 놓지 않을 때가 있습니다. 브라우저를 완전히 닫고 adb devices를 먼저 성공시킨 후 브라우저를 켜세요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #303942; text-align: start;&quot;&gt;특히 브라우저 기반 WebRTC 테스트를 위해 기기를 연결 중이라면, 브라우저가 기기를 점유하고 있거나 인증 팝업이 가려져 있을 확률이 높습니다. 아래와 같이 시도해 보세요.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #303942; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;핸드폰과 USB 케이블을 연결 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBHkZr/dJMcabCNr5B/HyVIKGpxW8eAKpBKUy5J6k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBHkZr/dJMcabCNr5B/HyVIKGpxW8eAKpBKUy5J6k/img.jpg&quot; data-alt=&quot;USB 연결된 핸드폰 디버깅 허용 질문 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBHkZr/dJMcabCNr5B/HyVIKGpxW8eAKpBKUy5J6k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBHkZr%2FdJMcabCNr5B%2FHyVIKGpxW8eAKpBKUy5J6k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;362&quot; height=&quot;804&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;2400&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;USB 연결된 핸드폰 디버깅 허용 질문 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TEoxr/dJMcaiIEoGC/qQ8mttXDVvn3uQxBKpUCG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TEoxr/dJMcaiIEoGC/qQ8mttXDVvn3uQxBKpUCG0/img.png&quot; data-alt=&quot;핸드폰과 연결된 크롬 inspect 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TEoxr/dJMcaiIEoGC/qQ8mttXDVvn3uQxBKpUCG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTEoxr%2FdJMcaiIEoGC%2FqQ8mttXDVvn3uQxBKpUCG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;668&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;핸드폰과 연결된 크롬 inspect 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 inspect 를 마우스로 클릭해 디버깅 화면으로 이동하면서 디버깅을 할 수 있게 됩니다.&lt;/p&gt;</description>
      <category>tool download</category>
      <category>ADB</category>
      <category>Android</category>
      <category>inspect</category>
      <category>안드로이드</category>
      <category>크롬 디버깅</category>
      <category>통신</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/38</guid>
      <comments>https://code.who494.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%ED%8F%B0-ADBAndroid-Debugging-Bridge-%ED%82%A4-%EC%9D%B8%EC%A6%9D#entry38comment</comments>
      <pubDate>Wed, 24 Dec 2025 09:22:31 +0900</pubDate>
    </item>
    <item>
      <title>Git 긴급(충돌)할때 사용하는 명령어</title>
      <link>https://code.who494.com/entry/Git-%EA%B8%B4%EA%B8%89%EC%B6%A9%EB%8F%8C%ED%95%A0%EB%95%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;처음 git 명령어를 접하게되면 흔히 발생되는 내용이 소스간에 충돌이 나는 것인데 이때 git이 소스를 관리하는 특성만 이해한다면 git을 사용함에 있어 어려움이 없을 것입니다. git은 기본적으로 로컬 저장소와, 원격 저장소 둘로 나뉘어 소스를 관리합니다. 그래서 보통 로컬에 내용을 업데이트 하는 명령어(pull)와 원격 저장소에 업데이트하는 명령어(push)로 구분되어 집니다. 프로젝트를 하다보면 특성상 같은 이름의 소스를 같이 수정하게되면 소스 충돌이 나게되면서 어떻게 해야하나 싶습니다. 대부분의 문제는 아래와 같은 명령어로 해결이 가능하니 사용해 보시기 바랍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqwChQ/btsP0knfZ93/INKKRCkPNm5MLGh1q815n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqwChQ/btsP0knfZ93/INKKRCkPNm5MLGh1q815n1/img.png&quot; data-alt=&quot;Git 이미지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqwChQ/btsP0knfZ93/INKKRCkPNm5MLGh1q815n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqwChQ%2FbtsP0knfZ93%2FINKKRCkPNm5MLGh1q815n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;544&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Git 이미지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;로컬 소스 &amp;lt;-- 서버 소스 (강제 overwrite)&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755700143528&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 로컬 main 브랜치로 이동
git checkout main

# 2. 원격 저장소의 최신 내역을 가져옵니다.
#    (아직 로컬 브랜치는 변경되지 않음)
git fetch origin

# 3. 로컬 main 브랜치를 원격 origin/main과 동일하게 만듭니다.
#    로컬 커밋과 변경사항이 모두 삭제됩니다.
git reset --hard origin/main&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 git pull을 사용하지 않는가?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;git pull은 git fetch + git merge의 조합입니다. 히스토리가 다른 경우 merge가 실패합니다.&lt;/li&gt;
&lt;li&gt;git pull --rebase는 로컬 커밋을 원격 커밋 위에 다시 올리려고 시도하는데, 이 과정에서 충돌이 발생하거나 원하는 결과가 나오지 않을 수 있습니다.&lt;/li&gt;
&lt;li&gt;git pull --force라는 명령어는 존재하지 않습니다. 일부 Git 버전이나 래퍼(wrapper)에서 git pull이 git fetch + git merge를 하면서 --force 옵션을 허용하는 경우가 있지만, 이는 git pull --rebase와는 다른 의미로, 사용이 권장되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론 및 권장사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격 저장소의 히스토리가 git push --force로 인해 변경되었다면, 로컬 저장소의 히스토리도 동일하게 맞춰야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 안전하고 명확한 방법은 **git fetch**로 최신 상태를 확인한 후, **git reset --hard**로 강제 동기화하는 것입니다. 이 방법을 통해 의도치 않은 로컬 커밋 손실을 방지하고, &quot;무엇을 하려는지&quot;를 명확히 인지할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR'; color: #333333; text-align: center;&quot;&gt;로컬 소스 --&amp;gt; 서버 소스 (강제 overwrite)&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755700306327&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push --force origin main&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동작 원리 및 위험성:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;덮어쓰기:&lt;/b&gt; 원격 브랜치의 커밋 내역을 무시하고 로컬 브랜치의 커밋 내역으로 강제로 대체합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;위험성:&lt;/b&gt; 만약 다른 팀원이 강제 푸시를 하기 전에 원격 저장소에 새로운 커밋을 푸시했다면, git push --force는 그 팀원의 커밋을 &lt;b&gt;영구적으로 삭제&lt;/b&gt;하고 덮어씌웁니다. 이 때문에 협업 환경에서는 매우 위험한 명령어입니다.&lt;/li&gt;
&lt;li&gt;긴급한 상황에서 사용하기 적절합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1755700652830&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push --force-with-lease origin main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;동작 원리 및 장점:&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;안전성:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원격 저장소의 HEAD 커밋이 로컬 저장소의 HEAD 커밋과 다를 경우(즉, 그 사이에 다른 팀원이 푸시한 커밋이 있는 경우), 푸시를 거부합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;충돌 방지:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;원격 저장소에 다른 사람의 작업물이 있는 것을 감지하면 푸시를 막아, 실수로 다른 사람의 커밋을 덮어쓰는 사고를 방지합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;협업에 적합:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;팀 프로젝트에서 강제 푸시가 필요한 경우, git push --force 대신 이 명령어를 사용하는 것이 권장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt; Git을 처음 사용하기 전에 사용자 이름과 이메일을 설정합니다. 이 정보는 커밋(commit)에 기록됩니다.&lt;/span&gt;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755701149515&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 사용자 이름 설정 (예시: Hong Gildong)
git config --global user.name &quot;Your Name&quot;

# 사용자 이메일 설정 (예시: your.email@example.com)
git config --global user.email &quot;your.email@example.com&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기타 설명&lt;/span&gt;&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;핵심 Git 워크플로우 (Git 파일의 3가지 상태)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 파일의 상태를 세 가지 영역으로 구분하여 관리합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Working Directory (작업 공간)&lt;/b&gt;: 현재 작업 중인 파일들이 있는 공간.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Staging Area (스테이징 영역)&lt;/b&gt;: 커밋할 준비가 된 파일들이 모여 있는 공간.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Git Repository (저장소)&lt;/b&gt;: 커밋된 파일들이 히스토리로 기록되어 있는 공간.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 작업 흐름은 수정 -&amp;gt; 스테이징 -&amp;gt; 커밋 순서로 진행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-sheets-baot=&quot;1&quot; data-sheets-root=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git status&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;현재 파일들의 상태를 보여줍니다. (어떤 파일이 수정되었고, 어떤 파일이 스테이징 되었는지 등)&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git add &amp;lt;파일이름&amp;gt;&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;작업 공간의 변경 내용을 스테이징 영역에 추가합니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git commit -m &quot;커밋 메시지&quot;&lt;/td&gt;
&lt;td&gt;
&lt;div&gt;
&lt;div&gt;스테이징 영역에 있는 파일들을 Git 저장소에 확정하여 기록합니다. 커밋 메시지는 어떤 변경 사항인지 명확하게 작성합니다.&lt;/div&gt;
&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;예시&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755701456036&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1. 파일 수정 또는 새로 생성 (예: index.html)

# 2. 상태 확인 (untracked)
git status

# 3. index.html 파일을 스테이징 영역에 추가
git add index.html

# 4. 상태 확인 (Changes to be committed)
git status

# 5. 커밋 (버전 확정)
git commit -m &quot;feat: 홈페이지 초기 레이아웃 추가&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 파일을 한 번에 스테이징하려면 git add . 를 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1755701552643&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;원격 저장소와 동기화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬에서 작업한 내용을 원격 저장소에 반영하거나, 원격 저장소의 최신 내용을 가져옵니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;git push&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;로컬 저장소의 커밋 내역을 원격 저장소에 업로드합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;git pull&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;원격 저장소의 최신 내역을 가져와서 로컬 저장소에 병합(merge)합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;예시&lt;/blockquote&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1755701587934&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로컬의 변경 사항을 원격 저장소로 푸시
git push origin main

# 원격 저장소의 최신 내역을 가져와서 병합
git pull origin main&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;유용한 추가 명령어&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;git log&lt;/b&gt;: 커밋 히스토리를 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git branch&lt;/b&gt;: 모든 브랜치 목록을 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git checkout &amp;lt;브랜치명&amp;gt;&lt;/b&gt;: 다른 브랜치로 이동합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git checkout -b &amp;lt;새로운_브랜치명&amp;gt;&lt;/b&gt;: 새로운 브랜치를 만들고 이동합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git merge &amp;lt;병합할_브랜치명&amp;gt;&lt;/b&gt;: 다른 브랜치의 내용을 현재 브랜치에 병합합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;git diff&lt;/b&gt;: 수정된 내용을 자세히 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어들만 숙지해도 대부분의 기본적인 Git 작업을 수행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;브랜치 &amp;amp; 병합 (Branching &amp;amp; Merging)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 사람이 협업하거나 기능을 분리해서 개발할 때 사용하는 명령어들입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;git branch&lt;/td&gt;
&lt;td&gt;저장소의 브랜치 목록을 확인합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git branch [이름]&lt;/td&gt;
&lt;td&gt;새로운 브랜치를 생성합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git checkout [이름]&lt;/td&gt;
&lt;td&gt;다른 브랜치로 이동합니다. (레거시 명령어)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git switch [이름]&lt;/td&gt;
&lt;td&gt;다른 브랜치로 이동하는 최신 명령어입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git checkout -b [이름]&lt;/td&gt;
&lt;td&gt;새로운 브랜치를 만들고 바로 이동합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git merge [이름]&lt;/td&gt;
&lt;td&gt;지정된 브랜치의 내용을 현재 브랜치에 병합합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git rebase [이름]&lt;/td&gt;
&lt;td&gt;현재 브랜치의 커밋을 지정된 브랜치 위에 덮어씌워 깔끔한 히스토리를 만듭니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;변경사항 되돌리기 &amp;amp; 기록 수정 (Undoing &amp;amp; Rewriting)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실수를 했을 때 변경사항을 되돌리거나 커밋 기록을 수정할 때 사용합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;git restore [파일]&lt;/td&gt;
&lt;td&gt;작업 디렉토리의 변경 내용을 되돌립니다. (git checkout [파일]의 최신 명령어)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git reset [커밋해시]&lt;/td&gt;
&lt;td&gt;HEAD를 특정 커밋으로 되돌립니다. (--soft, --hard 등 옵션 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git revert [커밋해시]&lt;/td&gt;
&lt;td&gt;특정 커밋의 변경 내용을 되돌리는 새로운 커밋을 생성합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git commit --amend&lt;/td&gt;
&lt;td&gt;가장 최근의 커밋 메시지나 내용을 수정합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git stash&lt;/td&gt;
&lt;td&gt;작업 중인 변경 내용을 임시로 저장하고 작업 디렉토리를 정리합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기록 확인 및 비교 (Inspection &amp;amp; Comparison)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 기록을 확인하거나 변경된 내용을 비교할 때 사용합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;git log&lt;/td&gt;
&lt;td&gt;커밋 히스토리를 시간순으로 확인합니다. (--oneline, --graph 등 옵션이 유용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git diff&lt;/td&gt;
&lt;td&gt;두 커밋, 브랜치, 또는 작업 디렉토리와 스테이징 영역의 차이를 보여줍니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git show [커밋해시]&lt;/td&gt;
&lt;td&gt;특정 커밋의 내용을 상세히 보여줍니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;원격 저장소 관리 (Remote Management)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원격 저장소와의 연결을 관리하는 명령어입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;git remote&lt;/td&gt;
&lt;td&gt;연결된 원격 저장소 목록을 확인합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git remote add [이름] [URL]&lt;/td&gt;
&lt;td&gt;새로운 원격 저장소를 추가합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git push --force&lt;/td&gt;
&lt;td&gt;로컬 브랜치로 원격 브랜치를 강제로 덮어씁니다. (매우 위험!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git push --force-with-lease&lt;/td&gt;
&lt;td&gt;원격 브랜치가 최신 상태일 때만 강제로 덮어쓰는 안전한 명령어입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;기타 &amp;amp; 고급 명령어 (Advanced)&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용되지는 않지만, 매우 유용한 고급 기능들입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;명령어&lt;/td&gt;
&lt;td&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;git reflog&lt;/td&gt;
&lt;td&gt;HEAD가 이동한 모든 기록을 확인합니다. (잃어버린 커밋 복구에 유용)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git bisect&lt;/td&gt;
&lt;td&gt;버그가 발생한 커밋을 이진 탐색으로 빠르게 찾습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git tag [버전]&lt;/td&gt;
&lt;td&gt;특정 커밋에 태그를 붙여 중요 버전을 표시합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;git blame [파일]&lt;/td&gt;
&lt;td&gt;파일의 각 라인을 누가 언제 커밋했는지 보여줍니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>git</category>
      <category>gitlab</category>
      <category>고급</category>
      <category>기타</category>
      <category>소스버전관리</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/37</guid>
      <comments>https://code.who494.com/entry/Git-%EA%B8%B4%EA%B8%89%EC%B6%A9%EB%8F%8C%ED%95%A0%EB%95%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%AA%85%EB%A0%B9%EC%96%B4#entry37comment</comments>
      <pubDate>Wed, 20 Aug 2025 23:56:00 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 프로세스에 대한 정보확인</title>
      <link>https://code.who494.com/entry/JAVA-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%B3%B4%ED%99%95%EC%9D%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;가끔 Java 프로세스가 간단하게 어떤 args로 기동이 됐는지 어떤 설정값을 가지고 프로세스가 시작이 됐는지 필요할 때가 꼭 존재한다. 보통 VisualVM을 통한 속성확인을 하곤 하는데 간단한 확인 방법이 존재합니다. 꼭 한번 실행해 볼 가치가 있으니 기억해 두면 좋을 듯 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;749&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dna/biwfSN/btsPNKgBi4b/AAAAAAAAAAAAAAAAAAAAAJRntAmK4vzRg1eQ9oMHe5GaBPEx6uGzxGMjVLuxgZ_p/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1756652399&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=S12Hifgtlnjtk%2B%2BbrZZ69ykfRxk%3D&quot; target=&quot;&quot; title=&quot;Java 프로세스 모든 정보 확인하는 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwfSN/btsPNKgBi4b/wPhm3erOGg6pXTqXpCF2oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiwfSN%2FbtsPNKgBi4b%2FwPhm3erOGg6pXTqXpCF2oK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;527&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;Java 프로세스 모든 정보 확인하는 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jps -l은 실행 중인 모든 자바 프로세스 목록을 출력합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;jps -l&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755008173627&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;19648 jdk.jcmd/sun.tools.jps.Jps
21648 C:\DevelopmentEnvironment\eclipse-jee\plugins\org.springframework.tooling.boot.ls_1.60.0.202502031607\servers\spring-boot-language-server\spring-boot-language-server-1.60.0-SNAPSHOT-exec.jar
24492 Eclipse&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jinfo -flags는 -Xms, -Xmx 등 JVM에 전달된 플래그(인자)를 보여줍니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;jinfo -flags 24492&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755007733342&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;VM Flags:
-XX:CICompilerCount=12 
-XX:ConcGCThreads=3 
-XX:G1ConcRefinementThreads=13 
-XX:G1EagerReclaimRemSetThreshold=12 
-XX:G1HeapRegionSize=1048576 
-XX:G1RemSetArrayOfCardsEntries=12 
-XX:G1RemSetHowlMaxNumBuckets=8 
-XX:G1RemSetHowlNumBuckets=4 
-XX:GCDrainStackTargetSize=64 
-XX:InitialHeapSize=268435456 
-XX:MarkStackSize=4194304 
-XX:MaxHeapSize=2147483648 
-XX:MaxNewSize=1287651328 
-XX:MinHeapDeltaBytes=1048576 
-XX:MinHeapSize=268435456 
-XX:NonNMethodCodeHeapSize=7602480 
-XX:NonProfiledCodeHeapSize=122027880 
-XX:ProfiledCodeHeapSize=122027880 
-XX:ReservedCodeCacheSize=251658240 
-XX:+SegmentedCodeCache 
-XX:SoftMaxHeapSize=2147483648 
-XX:+UseCompressedOops 
-XX:+UseFastUnorderedTimeStamps 
-XX:+UseG1GC 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseStringDeduplication&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령어 같은 경우 자바 프로세스에 자원이 어느정도 할당이 되어있는지 확인하기 가장 쉽고 간편한 방법이라고 할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jinfo&amp;nbsp;-sysprops는 System.getProperties()와&amp;nbsp;동일한&amp;nbsp;시스템&amp;nbsp;속성을&amp;nbsp;보여줍니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;jinfo -sysprops 12345&lt;/blockquote&gt;
&lt;pre id=&quot;code_1755007856057&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Java System Properties:
#Tue Aug 12 23:09:44 KST 2025
applicationXMI=org.eclipse.ui.workbench/LegacyIDE.e4xmi
ds.delayed.keepInstances=true
ds.delayed.keepInstances.default=true
eclipse.application=org.eclipse.ui.ide.workbench
eclipse.buildId=4.33.0.20240905-0613
eclipse.commands=-os\nwin32\n-ws\nwin32\n-arch\nx86_64\n-showsplash\nC\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins\\org.eclipse.epp.package.common_4.33.0.20240905-0613\\splash.bmp\n-launcher\nC\:\\DevelopmentEnvironment\\eclipse-jee\\eclipse.exe\n-name\nEclipse\n--launcher.library\nC\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.2.1100.v20240722-2106\\eclipse_11904.dll\n-startup\nC\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins/org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar\n--launcher.appendVmargs\n-product\norg.eclipse.epp.package.jee.product\n-vm\nC\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_21.0.6.v20250130-0529/jre/bin\\server\\jvm.dll\n
eclipse.e4.inject.javax.warning=false
eclipse.home.location=file\:/C\:/DevelopmentEnvironment/eclipse-jee/
eclipse.launcher=C\:\\DevelopmentEnvironment\\eclipse-jee\\eclipse.exe
eclipse.launcher.name=Eclipse
eclipse.p2.data.area=@config.dir/../p2/
eclipse.p2.profile=epp.package.jee
eclipse.product=org.eclipse.epp.package.jee.product
eclipse.startTime=1755007155963
eclipse.stateSaveDelayInterval=30000
eclipse.vm=C\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins/org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_21.0.6.v20250130-0529/jre/bin\\server\\jvm.dll
eclipse.vmargs=-Dorg.eclipse.ecf.provider.filetransfer.excludeContributors\=org.eclipse.ecf.provider.filetransfer.httpclientjava\n-Dosgi.requiredJavaVersion\=21\n-Dosgi.instance.area.default\=@user.home/eclipse-workspace\n-Dosgi.dataAreaRequiresExplicitInit\=true\n-Dorg.eclipse.swt.graphics.Resource.reportNonDisposed\=true\n-Declipse.e4.inject.javax.warning\=false\n-Dsun.java.command\=Eclipse\n-Xms256m\n-Xmx2048m\n-XX\:+UseG1GC\n-XX\:+UseStringDeduplication\n--add-modules\=ALL-SYSTEM\n-Djava.security.manager\=allow\n-javaagent\:C\:\\DevelopmentEnvironment\\eclipse-jee\\lombok.jar\n-Djava.class.path\=C\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins/org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar\n
equinox.init.uuid=true
file.encoding=UTF-8
file.separator=\\
gosh.args=--nointeractive
guice.disable.misplaced.annotation.check=true
java.class.path=C\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins/org.eclipse.equinox.launcher_1.6.900.v20240613-2009.jar
java.class.version=65.0
java.home=C\:\\DevelopmentEnvironment\\eclipse-jee\\plugins\\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_21.0.6.v20250130-0529\\jre
java.io.tmpdir=C\:\\Users\\who49\\AppData\\Local\\Temp\\
java.library.path=C\:\\DevelopmentEnvironment\\eclipse-jee;C\:\\WINDOWS\\Sun\\Java\\bin;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\Python27\\;C\:\\Python27\\Scripts;C\:\\Windows\\system32;C\:\\Windows;C\:\\Windows\\System32\\Wbem;C\:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C\:\\Windows\\System32\\OpenSSH\\;C\:\\Program Files (x86)\\NVIDIA Corporation\\PhysX\\Common;C\:\\Program Files\\Docker\\Docker\\resources\\bin;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\WINDOWS\\System32\\OpenSSH\\;C\:\\project\\program\\Java\\jdk-17.0.2\\bin;C\:\\Program Files\\NVIDIA Corporation\\NVIDIA NvDLISR;C\:\\Program Files\\Git\\cmd;c\:\\project\\program\\Java\\apache-maven-3.8.6\\bin;C\:\\project\\cmake-3.29.2-windows-x86_64\\bin;C\:\\ProgramData\\chocolatey\\lib\\make\\tools\\install\\bin;C\:\\ProgramData\\chocolatey\\bin;;C\:\\WINDOWS\\system32;C\:\\WINDOWS;C\:\\WINDOWS\\System32\\Wbem;C\:\\WINDOWS\\System32\\WindowsPowerShell\\v1.0\\;C\:\\WINDOWS\\System32\\OpenSSH\\;C\:\\Program Files\\Tailscale\\;C\:\\nodejs\\;C\:\\Users\\who49\\AppData\\Local\\Programs\\Python\\Python313\\Scripts\\;C\:\\Users\\who49\\AppData\\Local\\Programs\\Python\\Python313\\;C\:\\Users\\who49\\AppData\\Local\\Microsoft\\WindowsApps;C\:\\Program Files\\Bandizip\\;;C\:\\project\\program\\VSCode\\bin;C\:\\Users\\who49\\AppData\\Roaming\\npm;.
java.runtime.name=OpenJDK Runtime Environment
java.runtime.version=21.0.6+7-LTS
java.security.manager=allow
java.specification.name=Java Platform API Specification
java.specification.vendor=Oracle Corporation
java.specification.version=21
java.vendor=Eclipse Adoptium
java.vendor.url=https\://adoptium.net/
java.vendor.url.bug=https\://github.com/adoptium/adoptium-support/issues
java.vendor.version=Temurin-21.0.6+7
java.version=21.0.6
java.version.date=2025-01-21
java.vm.compressedOopsMode=32-bit
java.vm.info=mixed mode, sharing
java.vm.name=OpenJDK 64-Bit Server VM
java.vm.specification.name=Java Virtual Machine Specification
java.vm.specification.vendor=Oracle Corporation
java.vm.specification.version=21
java.vm.vendor=Eclipse Adoptium
java.vm.version=21.0.6+7-LTS
jdk.debug=release
jna.loaded=true
jnidispatch.path=C\:\\Users\\who49\\AppData\\Local\\Temp\\jna-113105603\\jna17816437643912817866.dll
line.separator=\r\n
maven.defaultProjectBuilder.disableGlobalModelCache=true
native.encoding=MS949
org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog
org.eclipse.ecf.provider.filetransfer.excludeContributors=org.eclipse.ecf.provider.filetransfer.httpclientjava
org.eclipse.equinox.launcher.splash.location=C\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins\\org.eclipse.epp.package.common_4.33.0.20240905-0613\\splash.bmp
org.eclipse.equinox.simpleconfigurator.configUrl=file\:org.eclipse.equinox.simpleconfigurator/bundles.info
org.eclipse.m2e.log.dir=C\:\\DevelopmentEnvironment\\workspace\\.metadata\\.plugins\\org.eclipse.m2e.logback
org.eclipse.swt.graphics.Resource.reportNonDisposed=true
org.eclipse.swt.internal.deviceZoom=100
org.osgi.framework.executionenvironment=OSGi/Minimum-1.0, OSGi/Minimum-1.1, OSGi/Minimum-1.2, JavaSE/compact1-1.8, JavaSE/compact2-1.8, JavaSE/compact3-1.8, JRE-1.1, J2SE-1.2, J2SE-1.3, J2SE-1.4, J2SE-1.5, JavaSE-1.6, JavaSE-1.7, JavaSE-1.8, JavaSE-9, JavaSE-10, JavaSE-11, JavaSE-12, JavaSE-13, JavaSE-14, JavaSE-15, JavaSE-16, JavaSE-17, JavaSE-18, JavaSE-19, JavaSE-20, JavaSE-21
org.osgi.framework.language=ko
org.osgi.framework.os.name=win32
org.osgi.framework.os.version=10.0.0
org.osgi.framework.processor=x86-64
org.osgi.framework.storage=C\:\\DevelopmentEnvironment\\eclipse-jee\\configuration
org.osgi.framework.system.capabilities=osgi.ee; osgi.ee\=&quot;OSGi/Minimum&quot;; version\:List&amp;lt;Version&amp;gt;\=&quot;1.0, 1.1, 1.2&quot;, osgi.ee; osgi.ee\=&quot;JRE&quot;; version\:List&amp;lt;Version&amp;gt;\=&quot;1.0, 1.1&quot;, osgi.ee; osgi.ee\=&quot;JavaSE&quot;; version\:List&amp;lt;Version&amp;gt;\=&quot;1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0&quot;,osgi.ee; osgi.ee\=&quot;JavaSE/compact1&quot;; version\:List&amp;lt;Version&amp;gt;\=&quot;1.8, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0&quot;,osgi.ee; osgi.ee\=&quot;JavaSE/compact2&quot;; version\:List&amp;lt;Version&amp;gt;\=&quot;1.8, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0&quot;,osgi.ee; osgi.ee\=&quot;JavaSE/compact3&quot;; version\:List&amp;lt;Version&amp;gt;\=&quot;1.8, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0&quot;
org.osgi.framework.system.packages=com.sun.java.accessibility.util, com.sun.jdi, com.sun.jdi.connect, com.sun.jdi.connect.spi, com.sun.jdi.event, com.sun.jdi.request, com.sun.management, com.sun.net.httpserver, com.sun.net.httpserver.spi, com.sun.nio.file, com.sun.nio.sctp, com.sun.security.auth, com.sun.security.auth.callback, com.sun.security.auth.login, com.sun.security.auth.module, com.sun.security.jgss, com.sun.source.doctree, com.sun.source.tree, com.sun.source.util, com.sun.tools.attach, com.sun.tools.attach.spi, com.sun.tools.javac, com.sun.tools.jconsole, java.applet, java.awt, java.awt.color, java.awt.datatransfer, java.awt.desktop, java.awt.dnd, java.awt.event, java.awt.font, java.awt.geom, java.awt.im, java.awt.im.spi, java.awt.image, java.awt.image.renderable, java.awt.print, java.beans, java.beans.beancontext, java.io, java.lang, java.lang.annotation, java.lang.constant, java.lang.foreign, java.lang.instrument, java.lang.invoke, java.lang.management, java.lang.module, java.lang.ref, java.lang.reflect, java.lang.runtime, java.math, java.net, java.net.http, java.net.spi, java.nio, java.nio.channels, java.nio.channels.spi, java.nio.charset, java.nio.charset.spi, java.nio.file, java.nio.file.attribute, java.nio.file.spi, java.rmi, java.rmi.dgc, java.rmi.registry, java.rmi.server, java.security, java.security.cert, java.security.interfaces, java.security.spec, java.sql, java.text, java.text.spi, java.time, java.time.chrono, java.time.format, java.time.temporal, java.time.zone, java.util, java.util.concurrent, java.util.concurrent.atomic, java.util.concurrent.locks, java.util.function, java.util.jar, java.util.logging, java.util.prefs, java.util.random, java.util.regex, java.util.spi, java.util.stream, java.util.zip, javax.accessibility, javax.annotation.processing, javax.crypto, javax.crypto.interfaces, javax.crypto.spec, javax.imageio, javax.imageio.event, javax.imageio.metadata, javax.imageio.plugins.bmp, javax.imageio.plugins.jpeg, javax.imageio.plugins.tiff, javax.imageio.spi, javax.imageio.stream, javax.lang.model, javax.lang.model.element, javax.lang.model.type, javax.lang.model.util, javax.management, javax.management.loading, javax.management.modelmbean, javax.management.monitor, javax.management.openmbean, javax.management.relation, javax.management.remote, javax.management.remote.rmi, javax.management.timer, javax.naming, javax.naming.directory, javax.naming.event, javax.naming.ldap, javax.naming.ldap.spi, javax.naming.spi, javax.net, javax.net.ssl, javax.print, javax.print.attribute, javax.print.attribute.standard, javax.print.event, javax.rmi.ssl, javax.script, javax.security.auth, javax.security.auth.callback, javax.security.auth.kerberos, javax.security.auth.login, javax.security.auth.spi, javax.security.auth.x500, javax.security.cert, javax.security.sasl, javax.smartcardio, javax.sound.midi, javax.sound.midi.spi, javax.sound.sampled, javax.sound.sampled.spi, javax.sql, javax.sql.rowset, javax.sql.rowset.serial, javax.sql.rowset.spi, javax.swing, javax.swing.border, javax.swing.colorchooser, javax.swing.event, javax.swing.filechooser, javax.swing.plaf, javax.swing.plaf.basic, javax.swing.plaf.metal, javax.swing.plaf.multi, javax.swing.plaf.nimbus, javax.swing.plaf.synth, javax.swing.table, javax.swing.text, javax.swing.text.html, javax.swing.text.html.parser, javax.swing.text.rtf, javax.swing.tree, javax.swing.undo, javax.tools, javax.transaction.xa, javax.xml, javax.xml.catalog, javax.xml.crypto, javax.xml.crypto.dom, javax.xml.crypto.dsig, javax.xml.crypto.dsig.dom, javax.xml.crypto.dsig.keyinfo, javax.xml.crypto.dsig.spec, javax.xml.datatype, javax.xml.namespace, javax.xml.parsers, javax.xml.stream, javax.xml.stream.events, javax.xml.stream.util, javax.xml.transform, javax.xml.transform.dom, javax.xml.transform.sax, javax.xml.transform.stax, javax.xml.transform.stream, javax.xml.validation, javax.xml.xpath, jdk.dynalink, jdk.dynalink.beans, jdk.dynalink.linker, jdk.dynalink.linker.support, jdk.dynalink.support, jdk.javadoc.doclet, jdk.jfr, jdk.jfr.consumer, jdk.jshell, jdk.jshell.execution, jdk.jshell.spi, jdk.jshell.tool, jdk.management.jfr, jdk.net, jdk.nio, jdk.nio.mapmode, jdk.security.jarsigner, jdk.swing.interop, netscape.javascript, org.ietf.jgss, org.w3c.dom, org.w3c.dom.bootstrap, org.w3c.dom.css, org.w3c.dom.events, org.w3c.dom.html, org.w3c.dom.ls, org.w3c.dom.ranges, org.w3c.dom.stylesheets, org.w3c.dom.traversal, org.w3c.dom.views, org.w3c.dom.xpath, org.xml.sax, org.xml.sax.ext, org.xml.sax.helpers, sun.misc, sun.reflect
org.osgi.framework.uuid=800a00f4-fa1b-4114-a1a2-c4aebd196415
org.osgi.framework.vendor=Eclipse
org.osgi.framework.version=1.10.0
org.osgi.supports.framework.extension=true
org.osgi.supports.framework.fragment=true
org.osgi.supports.framework.requirebundle=true
os.arch=amd64
os.name=Windows 11
os.version=10.0
osgi.arch=x86_64
osgi.bundles=reference\:file\:org.eclipse.osgi.compatibility.state_1.2.1000.v20240213-1057.jar,reference\:file\:org.eclipse.equinox.simpleconfigurator_1.5.300.v20240424-1301.jar@1\:start
osgi.bundles.defaultStartLevel=4
osgi.compatibility.bootdelegation=true
osgi.compatibility.bootdelegation.default=true
osgi.configuration.area=file\:/C\:/DevelopmentEnvironment/eclipse-jee/configuration/
osgi.dataAreaRequiresExplicitInit=true
osgi.framework=file\:/c\:/DevelopmentEnvironment/eclipse-jee/plugins/org.eclipse.osgi_3.21.0.v20240717-2103.jar
osgi.framework.extensions=reference\:file\:org.eclipse.osgi.compatibility.state_1.2.1000.v20240213-1057.jar
osgi.framework.shape=jar
osgi.framework.useSystemProperties=true
osgi.frameworkClassPath=., file\:c\:/DevelopmentEnvironment/eclipse-jee/plugins/org.eclipse.osgi.compatibility.state_1.2.1000.v20240213-1057.jar
osgi.install.area=file\:/C\:/DevelopmentEnvironment/eclipse-jee/
osgi.instance.area=file\:/C\:/DevelopmentEnvironment/workspace/
osgi.instance.area.default=file\:/C\:/Users/who49/eclipse-workspace/
osgi.logfile=C\:\\DevelopmentEnvironment\\workspace\\.metadata\\.log
osgi.nl=ko_KR
osgi.os=win32
osgi.requiredJavaVersion=21
osgi.splashLocation=C\:\\DevelopmentEnvironment\\eclipse-jee\\\\plugins\\org.eclipse.epp.package.common_4.33.0.20240905-0613\\splash.bmp
osgi.splashPath=platform\:/base/plugins/org.eclipse.epp.package.common
osgi.syspath=c\:\\DevelopmentEnvironment\\eclipse-jee\\plugins
osgi.tracefile=C\:\\DevelopmentEnvironment\\workspace\\.metadata\\trace.log
osgi.ws=win32
path.separator=;
stderr.encoding=MS949
stdout.encoding=MS949
sun.arch.data.model=64
sun.boot.library.path=C\:\\DevelopmentEnvironment\\eclipse-jee\\plugins\\org.eclipse.justj.openjdk.hotspot.jre.full.win32.x86_64_21.0.6.v20250130-0529\\jre\\bin
sun.cpu.endian=little
sun.cpu.isalist=amd64
sun.io.unicode.encoding=UnicodeLittle
sun.java.command=Eclipse
sun.jnu.encoding=MS949
sun.management.compiler=HotSpot 64-Bit Tiered Compilers
sun.os.patch.level=
user.country=KR
user.dir=C\:\\DevelopmentEnvironment\\eclipse-jee
user.home=C\:\\Users\\who49
user.language=ko
user.name=who49
user.script=
user.timezone=Asia/Seoul
user.variant=&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보 내용을 다시 확인해 보면 이 방법들은 운영 중인 서버에서 자바 프로세스의 실행 상태를 모니터링하고 디버깅할 때 매우 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/Java</category>
      <category>jinfo</category>
      <category>jps</category>
      <category>자바 프로세스 확인</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/36</guid>
      <comments>https://code.who494.com/entry/JAVA-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%B3%B4%ED%99%95%EC%9D%B8#entry36comment</comments>
      <pubDate>Tue, 12 Aug 2025 23:33:26 +0900</pubDate>
    </item>
    <item>
      <title>명시적 GC 방지</title>
      <link>https://code.who494.com/entry/%EB%AA%85%EC%8B%9C%EC%A0%81-GC-%EB%B0%A9%EC%A7%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;명시적인 GC 호출은 JVM의 가비지 컬렉터가 최적의 시기가 아닐 때도 GC를 강제로 실행시켜 애플리케이션의 응답 시간(레이턴시)에 예측 불가능한 스파이크(Spike)를 유발할 수 있습니다. 특히 실시간 시스템이나 낮은 지연 시간(low-latency)이 중요한 시스템에서 스파이크와 같은 문제를 방지하기 위해 사용됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Gemini_Generated_Image_3c0v3s3c0v3s3c0v (1) (1).png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpWNXK/btsO5M0lKnI/h7ie2RULdHHYpPKK7IKrL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpWNXK/btsO5M0lKnI/h7ie2RULdHHYpPKK7IKrL1/img.png&quot; data-alt=&quot;명시적 GC 방지 옵션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpWNXK/btsO5M0lKnI/h7ie2RULdHHYpPKK7IKrL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpWNXK%2FbtsO5M0lKnI%2Fh7ie2RULdHHYpPKK7IKrL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;397&quot; data-filename=&quot;Gemini_Generated_Image_3c0v3s3c0v3s3c0v (1) (1).png&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;명시적 GC 방지 옵션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM의&amp;nbsp;최적화된&amp;nbsp;GC&amp;nbsp;알고리즘(G1,&amp;nbsp;ParallelGC,&amp;nbsp;CMS&amp;nbsp;등)은&amp;nbsp;자체적으로&amp;nbsp;최적의&amp;nbsp;GC&amp;nbsp;실행&amp;nbsp;시점을&amp;nbsp;판단합니다.&amp;nbsp;명시적인&amp;nbsp;호출은&amp;nbsp;이러한&amp;nbsp;내부&amp;nbsp;로직과&amp;nbsp;충돌하여&amp;nbsp;오히려&amp;nbsp;비효율적일&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;DisableExplicitGC를&amp;nbsp;사용하면&amp;nbsp;JVM이&amp;nbsp;자체&amp;nbsp;판단에&amp;nbsp;따라&amp;nbsp;GC를&amp;nbsp;수행하게&amp;nbsp;하여&amp;nbsp;튜닝된&amp;nbsp;GC&amp;nbsp;설정을&amp;nbsp;최대한&amp;nbsp;활용할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JVM&amp;nbsp;시작&amp;nbsp;시&amp;nbsp;-XX:+DisableExplicitGC&amp;nbsp;옵션을&amp;nbsp;추가합니다. &lt;/p&gt;
&lt;pre id=&quot;code_1751850351245&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;java -XX:+DisableExplicitGC -jar YourApplication.jar&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;</description>
      <category>언어/Java</category>
      <category>disableexplicitgc</category>
      <category>명시적gc</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/35</guid>
      <comments>https://code.who494.com/entry/%EB%AA%85%EC%8B%9C%EC%A0%81-GC-%EB%B0%A9%EC%A7%80#entry35comment</comments>
      <pubDate>Mon, 7 Jul 2025 10:06:27 +0900</pubDate>
    </item>
    <item>
      <title>다익스트라 알고리즘(Dijkstra Algorithm)</title>
      <link>https://code.who494.com/entry/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Dijkstra-Algorithm</link>
      <description>&lt;h2 data-end=&quot;214&quot; data-start=&quot;171&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;다익스트라 알고리즘(Dijkstra Algorithm)이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;339&quot; data-start=&quot;216&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다익스트라 알고리즘&lt;/b&gt;은 &lt;b&gt;그래프에서 하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 알고리즘&lt;/b&gt;입니다. 네덜란드의 컴퓨터 과학자 **에츠허르 다익스트라(Edsger W. Dijkstra)**가 개발했어요.&lt;/p&gt;
&lt;blockquote data-end=&quot;397&quot; data-start=&quot;341&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;397&quot; data-start=&quot;343&quot; data-ke-size=&quot;size16&quot;&gt;&quot;GPS가 길 찾을 때 최단 경로를 계산하는 기본 원리!&quot;&lt;br /&gt;바로 다익스트라 알고리즘입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;이미지 (1).png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdEcC2/btsOJiEDUBg/9jjsvxHGTwBdYppKi2kFpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdEcC2/btsOJiEDUBg/9jjsvxHGTwBdYppKi2kFpK/img.png&quot; data-alt=&quot;다익스트라 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdEcC2/btsOJiEDUBg/9jjsvxHGTwBdYppKi2kFpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdEcC2%2FbtsOJiEDUBg%2F9jjsvxHGTwBdYppKi2kFpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;710&quot; data-filename=&quot;이미지 (1).png&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다익스트라 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;402&quot; data-start=&quot;399&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;418&quot; data-start=&quot;404&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;주요 특징&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;519&quot; data-start=&quot;420&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;443&quot; data-start=&quot;420&quot;&gt;&lt;b&gt;가중치가 있는 그래프&lt;/b&gt;에서 사용됨&lt;/li&gt;
&lt;li data-end=&quot;481&quot; data-start=&quot;444&quot;&gt;단, 모든 **간선의 가중치가 0 이상(음수 불가)**이어야 함&lt;/li&gt;
&lt;li data-end=&quot;519&quot; data-start=&quot;482&quot;&gt;하나의 시작 노드로부터 &lt;b&gt;모든 노드까지의 최소 비용&lt;/b&gt;을 구함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;524&quot; data-start=&quot;521&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;544&quot; data-start=&quot;526&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;동작 방식 요약&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;683&quot; data-start=&quot;546&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;579&quot; data-start=&quot;546&quot;&gt;시작 정점의 거리는 0, 나머지는 무한대(&amp;infin;)로 초기화&lt;/li&gt;
&lt;li data-end=&quot;615&quot; data-start=&quot;580&quot;&gt;방문하지 않은 노드 중 &lt;b&gt;가장 거리가 짧은 노드 선택&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;655&quot; data-start=&quot;616&quot;&gt;해당 노드를 거쳐 갈 수 있는 이웃 노드의 거리 계산 후 업데이트&lt;/li&gt;
&lt;li data-end=&quot;683&quot; data-start=&quot;656&quot;&gt;모든 노드를 방문할 때까지 2~3단계를 반복&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ChatGPT Image 2025년 6월 20일 오전 12_44_52 (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb0JvV/btsOIW9GSHh/NnT23zpBoKhhIkXhLMKC70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb0JvV/btsOIW9GSHh/NnT23zpBoKhhIkXhLMKC70/img.png&quot; data-alt=&quot;다익스트라 알고리즘 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb0JvV/btsOIW9GSHh/NnT23zpBoKhhIkXhLMKC70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb0JvV%2FbtsOIW9GSHh%2FNnT23zpBoKhhIkXhLMKC70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;465&quot; data-filename=&quot;ChatGPT Image 2025년 6월 20일 오전 12_44_52 (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다익스트라 알고리즘 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;688&quot; data-start=&quot;685&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;706&quot; data-start=&quot;690&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;시간 복잡도&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;자료구조시간 복잡도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;843&quot; data-start=&quot;708&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;843&quot; data-start=&quot;774&quot;&gt;
&lt;tr data-end=&quot;809&quot; data-start=&quot;774&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;788&quot; data-start=&quot;774&quot;&gt;배열 사용&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;809&quot; data-start=&quot;788&quot;&gt;O(V&amp;sup2;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;843&quot; data-start=&quot;810&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;822&quot; data-start=&quot;810&quot;&gt;우선순위 큐(힙)&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;843&quot; data-start=&quot;822&quot;&gt;O(E log V)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;920&quot; data-start=&quot;845&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;858&quot; data-start=&quot;845&quot;&gt;V: 정점 수&lt;/li&gt;
&lt;li data-end=&quot;920&quot; data-start=&quot;859&quot;&gt;E: 간선 수&lt;br /&gt;&amp;rarr; **우선순위 큐(PriorityQueue)**를 사용하면 성능이 매우 향상됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;925&quot; data-start=&quot;922&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;959&quot; data-start=&quot;927&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;Java 코드 예시 (우선순위 큐 사용)&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1750347538611&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.util.*;

public class DijkstraExample {
    
    static class Node implements Comparable&amp;lt;Node&amp;gt; {
        int index, distance;

        public Node(int index, int distance) {
            this.index = index;
            this.distance = distance;
        }

        // 거리 기준으로 오름차순 정렬
        @Override
        public int compareTo(Node other) {
            return Integer.compare(this.distance, other.distance);
        }
    }

    static final int INF = (int)1e9;
    static ArrayList&amp;lt;ArrayList&amp;lt;Node&amp;gt;&amp;gt; graph = new ArrayList&amp;lt;&amp;gt;();
    static int[] dist;

    public static void dijkstra(int start) {
        PriorityQueue&amp;lt;Node&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
        dist[start] = 0;
        pq.offer(new Node(start, 0));

        while (!pq.isEmpty()) {
            Node now = pq.poll();
            int nowIdx = now.index;
            int nowDist = now.distance;

            if (dist[nowIdx] &amp;lt; nowDist) continue;

            for (Node next : graph.get(nowIdx)) {
                int cost = dist[nowIdx] + next.distance;
                if (cost &amp;lt; dist[next.index]) {
                    dist[next.index] = cost;
                    pq.offer(new Node(next.index, cost));
                }
            }
        }
    }

    public static void main(String[] args) {
        int n = 6; // 노드 수
        int start = 1;
        dist = new int[n + 1];

        for (int i = 0; i &amp;lt;= n; i++) {
            graph.add(new ArrayList&amp;lt;&amp;gt;());
            dist[i] = INF;
        }

        // 예시 간선 추가
        graph.get(1).add(new Node(2, 2));
        graph.get(1).add(new Node(3, 5));
        graph.get(2).add(new Node(3, 3));
        graph.get(2).add(new Node(4, 4));
        graph.get(3).add(new Node(4, 2));
        graph.get(4).add(new Node(5, 1));
        graph.get(5).add(new Node(6, 2));

        dijkstra(start);

        // 결과 출력
        for (int i = 1; i &amp;lt;= n; i++) {
            if (dist[i] == INF) {
                System.out.println(i + &quot;번 노드: 도달 불가&quot;);
            } else {
                System.out.println(i + &quot;번 노드까지의 최단 거리: &quot; + dist[i]);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3061&quot; data-start=&quot;3058&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3096&quot; data-start=&quot;3063&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;출력 예시 (간선 구성에 따라 달라짐)&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1750347578588&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1번 노드까지의 최단 거리: 0  
2번 노드까지의 최단 거리: 2  
3번 노드까지의 최단 거리: 5  
4번 노드까지의 최단 거리: 7  
5번 노드까지의 최단 거리: 8  
6번 노드까지의 최단 거리: 10&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;3231&quot; data-start=&quot;3228&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3245&quot; data-start=&quot;3233&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3424&quot; data-start=&quot;3247&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3424&quot; data-start=&quot;3275&quot;&gt;
&lt;tr data-end=&quot;3299&quot; data-start=&quot;3275&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3285&quot; data-start=&quot;3275&quot;&gt;알고리즘 이름&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3299&quot; data-start=&quot;3285&quot;&gt;다익스트라 알고리즘&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3334&quot; data-start=&quot;3300&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3305&quot; data-start=&quot;3300&quot;&gt;목적&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3334&quot; data-start=&quot;3305&quot;&gt;하나의 정점에서 모든 정점까지 최단 거리 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3362&quot; data-start=&quot;3335&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3340&quot; data-start=&quot;3335&quot;&gt;조건&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3362&quot; data-start=&quot;3340&quot;&gt;음의 가중치 불가, 연결된 그래프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3389&quot; data-start=&quot;3363&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3368&quot; data-start=&quot;3363&quot;&gt;성능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3389&quot; data-start=&quot;3368&quot;&gt;힙 사용 시 O(E log V)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3424&quot; data-start=&quot;3390&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3397&quot; data-start=&quot;3390&quot;&gt;사용 예&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;3424&quot; data-start=&quot;3397&quot;&gt;GPS, 네트워크 경로, 최단시간 계산 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3429&quot; data-start=&quot;3426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3450&quot; data-start=&quot;3431&quot; data-ke-size=&quot;size26&quot;&gt;✅ 관련 개념도 알고 싶다면?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3574&quot; data-start=&quot;3452&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3490&quot; data-start=&quot;3452&quot;&gt;&lt;b&gt;벨만&amp;ndash;포드 알고리즘&lt;/b&gt;: 음수 간선이 있는 경우에도 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;3533&quot; data-start=&quot;3491&quot;&gt;&lt;b&gt;플로이드&amp;ndash;워셜 알고리즘&lt;/b&gt;: 모든 정점에서 모든 정점으로의 거리 계산&lt;/li&gt;
&lt;li data-end=&quot;3574&quot; data-start=&quot;3534&quot;&gt;&lt;b&gt;A* 알고리즘&lt;/b&gt;: 다익스트라보다 빠른 휴리스틱 기반 경로 탐색&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알고리즘</category>
      <category>dijkstra algorithm</category>
      <category>다익스트라 알고리즘</category>
      <category>실행 결과</category>
      <category>예제 소스</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/34</guid>
      <comments>https://code.who494.com/entry/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Dijkstra-Algorithm#entry34comment</comments>
      <pubDate>Fri, 20 Jun 2025 00:42:10 +0900</pubDate>
    </item>
    <item>
      <title>이진 탐색(Binary Search)</title>
      <link>https://code.who494.com/entry/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89Binary-Search</link>
      <description>&lt;h2 data-end=&quot;109&quot; data-start=&quot;71&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;이진 탐색(Binary Search) 알고리즘이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;205&quot; data-start=&quot;111&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이진 탐색&lt;/b&gt;은 &lt;b&gt;정렬된 데이터&lt;/b&gt;에서 원하는 값을 &lt;b&gt;빠르게 찾는 알고리즘&lt;/b&gt;입니다. 중간 값을 기준으로 검색 범위를 &lt;b&gt;절반씩 줄여가며&lt;/b&gt; 탐색하는 방식입니다.&lt;/p&gt;
&lt;blockquote data-end=&quot;264&quot; data-start=&quot;207&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;264&quot; data-start=&quot;209&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말하면, &lt;b&gt;전화번호부에서 이름의 첫 글자를 기준으로 책을 반으로 접으며 찾는 방식&lt;/b&gt;이에요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1749956174918 (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/&quot; target=&quot;&quot; title=&quot;이진탐색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOLrC1/btsOCCbeb9J/C8oO1kttq5A5fk3tJG4kHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOLrC1%2FbtsOCCbeb9J%2FC8oO1kttq5A5fk3tJG4kHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;439&quot; data-filename=&quot;1749956174918 (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;이진 탐색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;269&quot; data-start=&quot;266&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;285&quot; data-start=&quot;271&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;전제 조건&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;345&quot; data-start=&quot;287&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;345&quot; data-start=&quot;287&quot;&gt;&lt;b&gt;데이터가 반드시 정렬되어 있어야 함&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;345&quot; data-start=&quot;315&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;345&quot; data-start=&quot;315&quot;&gt;오름차순 또는 내림차순 정렬된 상태에서만 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;350&quot; data-start=&quot;347&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;366&quot; data-start=&quot;352&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;작동 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;438&quot; data-start=&quot;368&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 오름차순으로 정렬된 배열 [10, 20, 30, 40, 50, 60, 70] 에서 숫자 50을 찾는 경우:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;555&quot; data-start=&quot;440&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;498&quot; data-start=&quot;440&quot;&gt;중간 값: 40 &amp;rarr; 찾는 값보다 작으므로 오른쪽 절반 [50, 60, 70]으로 탐색 범위 좁힘&lt;/li&gt;
&lt;li data-end=&quot;541&quot; data-start=&quot;499&quot;&gt;중간 값: 60 &amp;rarr; 찾는 값보다 크므로 왼쪽 절반 [50]으로 좁힘&lt;/li&gt;
&lt;li data-end=&quot;555&quot; data-start=&quot;542&quot;&gt;값 50 발견!&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;589&quot; data-start=&quot;557&quot; data-ke-size=&quot;size16&quot;&gt;  이런 식으로 &lt;b&gt;반복적으로 반을 잘라서&lt;/b&gt; 찾습니다.&lt;/p&gt;
&lt;hr data-end=&quot;594&quot; data-start=&quot;591&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;612&quot; data-start=&quot;596&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;시간 복잡도&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분복잡도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;706&quot; data-start=&quot;614&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;706&quot; data-start=&quot;649&quot;&gt;
&lt;tr data-end=&quot;666&quot; data-start=&quot;649&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;656&quot; data-start=&quot;649&quot;&gt;최선&lt;/td&gt;
&lt;td data-end=&quot;666&quot; data-start=&quot;656&quot; data-col-size=&quot;sm&quot;&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;686&quot; data-start=&quot;667&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;674&quot; data-start=&quot;667&quot;&gt;평균&lt;/td&gt;
&lt;td data-end=&quot;686&quot; data-start=&quot;674&quot; data-col-size=&quot;sm&quot;&gt;O(log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;706&quot; data-start=&quot;687&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;694&quot; data-start=&quot;687&quot;&gt;최악&lt;/td&gt;
&lt;td data-end=&quot;706&quot; data-start=&quot;694&quot; data-col-size=&quot;sm&quot;&gt;O(log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;747&quot; data-start=&quot;708&quot; data-ke-size=&quot;size16&quot;&gt;※ 매우 빠름! n개의 데이터도 최대 log₂n번만 비교하면 됨&lt;/p&gt;
&lt;hr data-end=&quot;752&quot; data-start=&quot;749&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;769&quot; data-start=&quot;754&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;장점과 단점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;779&quot; data-start=&quot;771&quot; data-ke-size=&quot;size23&quot;&gt;✅ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;825&quot; data-start=&quot;780&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;808&quot; data-start=&quot;780&quot;&gt;검색 속도가 매우 빠름 (대용량 데이터에 적합)&lt;/li&gt;
&lt;li data-end=&quot;825&quot; data-start=&quot;809&quot;&gt;구현이 간단하면서도 효율적&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;835&quot; data-start=&quot;827&quot; data-ke-size=&quot;size23&quot;&gt;❌ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;880&quot; data-start=&quot;836&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;858&quot; data-start=&quot;836&quot;&gt;&lt;b&gt;정렬된 배열&lt;/b&gt;이어야만 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;880&quot; data-start=&quot;859&quot;&gt;정렬되지 않은 데이터에는 사용 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;885&quot; data-start=&quot;882&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;907&quot; data-start=&quot;887&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;Java 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1749956267814&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BinarySearchExample {

    // 이진 탐색 메서드
    public static int binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

        while (left &amp;lt;= right) {
            int mid = (left + right) / 2;

            if (arr[mid] == target) {
                return mid; // 찾은 경우
            }

            if (arr[mid] &amp;lt; target) {
                left = mid + 1; // 오른쪽 절반 검색
            } else {
                right = mid - 1; // 왼쪽 절반 검색
            }
        }

        return -1; // 찾지 못한 경우
    }

    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50, 60, 70};
        int target = 50;

        int result = binarySearch(numbers, target);

        if (result != -1) {
            System.out.println(&quot;값 &quot; + target + &quot;은 인덱스 &quot; + result + &quot;에 있습니다.&quot;);
        } else {
            System.out.println(&quot;값 &quot; + target + &quot;을 찾을 수 없습니다.&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1857&quot; data-start=&quot;1854&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1876&quot; data-start=&quot;1859&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;출력 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1749956305186&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;값 50은 인덱스 4에 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1909&quot; data-start=&quot;1906&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1926&quot; data-start=&quot;1911&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;요약 정리&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2091&quot; data-start=&quot;1928&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2091&quot; data-start=&quot;1956&quot;&gt;
&lt;tr data-end=&quot;1991&quot; data-start=&quot;1956&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1966&quot; data-start=&quot;1956&quot;&gt;알고리즘 이름&lt;/td&gt;
&lt;td data-end=&quot;1991&quot; data-start=&quot;1966&quot; data-col-size=&quot;sm&quot;&gt;이진 탐색 (Binary Search)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2010&quot; data-start=&quot;1992&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2000&quot; data-start=&quot;1992&quot;&gt;필요 조건&lt;/td&gt;
&lt;td data-end=&quot;2010&quot; data-start=&quot;2000&quot; data-col-size=&quot;sm&quot;&gt;정렬된 배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2033&quot; data-start=&quot;2011&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2016&quot; data-start=&quot;2011&quot;&gt;성능&lt;/td&gt;
&lt;td data-end=&quot;2033&quot; data-start=&quot;2016&quot; data-col-size=&quot;sm&quot;&gt;빠름 (O(log n))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2056&quot; data-start=&quot;2034&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2039&quot; data-start=&quot;2034&quot;&gt;장점&lt;/td&gt;
&lt;td data-end=&quot;2056&quot; data-start=&quot;2039&quot; data-col-size=&quot;sm&quot;&gt;대용량 데이터에도 효율적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2091&quot; data-start=&quot;2057&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2062&quot; data-start=&quot;2057&quot;&gt;단점&lt;/td&gt;
&lt;td data-end=&quot;2091&quot; data-start=&quot;2062&quot; data-col-size=&quot;sm&quot;&gt;정렬 필요, 배열 구조에서만 직접적 적용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2096&quot; data-start=&quot;2093&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2111&quot; data-start=&quot;2098&quot; data-ke-size=&quot;size26&quot;&gt;✅ 언제 사용할까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2206&quot; data-start=&quot;2113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2136&quot; data-start=&quot;2113&quot;&gt;데이터가 &lt;b&gt;이미 정렬되어 있을 때&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2177&quot; data-start=&quot;2137&quot;&gt;빠른 탐색이 필요한 경우 (ex. 사용자 ID 찾기, 사전 검색 등)&lt;/li&gt;
&lt;li data-end=&quot;2206&quot; data-start=&quot;2178&quot;&gt;대용량 데이터에서 효율적인 검색을 하고 싶을 때&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>알고리즘</category>
      <category>binary search</category>
      <category>결과</category>
      <category>예제 소스</category>
      <category>이진 탐색</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/33</guid>
      <comments>https://code.who494.com/entry/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89Binary-Search#entry33comment</comments>
      <pubDate>Sun, 15 Jun 2025 11:59:00 +0900</pubDate>
    </item>
    <item>
      <title>선형 탐색(Linear Search)</title>
      <link>https://code.who494.com/entry/%EC%84%A0%ED%98%95-%ED%83%90%EC%83%89Linear-Search</link>
      <description>&lt;h2 data-end=&quot;105&quot; data-start=&quot;67&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;선형 탐색(Linear Search) 알고리즘이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;214&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;**선형 탐색(또는 순차 탐색)**은 가장 기본적이고 간단한 탐색 알고리즘입니다. 데이터를 &lt;b&gt;처음부터 끝까지 하나씩 차례대로&lt;/b&gt; 확인하면서 **찾고자 하는 값(키 값)**을 찾는 방식입니다.&lt;/p&gt;
&lt;p data-end=&quot;214&quot; data-start=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1749955771752 (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d4bFPu/btsOBYlu9da/457aHURmrtRfFklQw9mGB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d4bFPu/btsOBYlu9da/457aHURmrtRfFklQw9mGB0/img.png&quot; data-alt=&quot;선형 탐색(Linear Search) 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d4bFPu/btsOBYlu9da/457aHURmrtRfFklQw9mGB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd4bFPu%2FbtsOBYlu9da%2F457aHURmrtRfFklQw9mGB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;543&quot; height=&quot;543&quot; data-filename=&quot;1749955771752 (1).png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;선형 탐색(Linear Search) 알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;219&quot; data-start=&quot;216&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;235&quot; data-start=&quot;221&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;작동 방식&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;353&quot; data-start=&quot;237&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;266&quot; data-start=&quot;237&quot;&gt;배열이나 리스트의 첫 번째 요소부터 시작합니다.&lt;/li&gt;
&lt;li data-end=&quot;307&quot; data-start=&quot;267&quot;&gt;각 요소를 &lt;b&gt;하나씩 검사&lt;/b&gt;하여, 찾고자 하는 값인지 확인합니다.&lt;/li&gt;
&lt;li data-end=&quot;353&quot; data-start=&quot;308&quot;&gt;&lt;b&gt;찾으면 즉시 반환&lt;/b&gt;하고, 끝까지 없으면 &amp;ldquo;찾을 수 없음&amp;rdquo;을 반환합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;358&quot; data-start=&quot;355&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;375&quot; data-start=&quot;360&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;동작 예시&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;420&quot; data-start=&quot;377&quot; data-ke-size=&quot;size16&quot;&gt;배열: [10, 25, 37, 40, 52]&lt;br /&gt;찾고자 하는 값: 37&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;472&quot; data-start=&quot;422&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;435&quot; data-start=&quot;422&quot;&gt;10 &amp;rarr; 아니고&lt;/li&gt;
&lt;li data-end=&quot;449&quot; data-start=&quot;436&quot;&gt;25 &amp;rarr; 아니고&lt;/li&gt;
&lt;li data-end=&quot;472&quot; data-start=&quot;450&quot;&gt;37 &amp;rarr; 찾음! &amp;rarr; 인덱스 2 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;477&quot; data-start=&quot;474&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;495&quot; data-start=&quot;479&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;시간 복잡도&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;상황시간 복잡도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;607&quot; data-start=&quot;497&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;607&quot; data-start=&quot;537&quot;&gt;
&lt;tr data-end=&quot;564&quot; data-start=&quot;537&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;556&quot; data-start=&quot;537&quot;&gt;최선 (첫 번째 원소가 정답)&lt;/td&gt;
&lt;td data-end=&quot;564&quot; data-start=&quot;556&quot; data-col-size=&quot;sm&quot;&gt;O(1)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;578&quot; data-start=&quot;565&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;570&quot; data-start=&quot;565&quot;&gt;평균&lt;/td&gt;
&lt;td data-end=&quot;578&quot; data-start=&quot;570&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;607&quot; data-start=&quot;579&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;599&quot; data-start=&quot;579&quot;&gt;최악 (마지막 원소 또는 없음)&lt;/td&gt;
&lt;td data-end=&quot;607&quot; data-start=&quot;599&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;626&quot; data-start=&quot;609&quot; data-ke-size=&quot;size16&quot;&gt;※ n은 배열의 크기입니다.&lt;/p&gt;
&lt;hr data-end=&quot;631&quot; data-start=&quot;628&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;648&quot; data-start=&quot;633&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;장점과 단점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;658&quot; data-start=&quot;650&quot; data-ke-size=&quot;size23&quot;&gt;✅ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;713&quot; data-start=&quot;659&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;671&quot; data-start=&quot;659&quot;&gt;구현이 매우 간단함&lt;/li&gt;
&lt;li data-end=&quot;693&quot; data-start=&quot;672&quot;&gt;정렬이 되어 있지 않아도 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;694&quot;&gt;소규모 데이터에서는 충분히 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;723&quot; data-start=&quot;715&quot; data-ke-size=&quot;size23&quot;&gt;❌ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;768&quot; data-start=&quot;724&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;748&quot; data-start=&quot;724&quot;&gt;검색 속도가 느림 (특히 대용량일 경우)&lt;/li&gt;
&lt;li data-end=&quot;768&quot; data-start=&quot;749&quot;&gt;비효율적 (중복된 비교가 많음)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;773&quot; data-start=&quot;770&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;795&quot; data-start=&quot;775&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;Java 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1749955450071&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class LinearSearchExample {

    // 선형 탐색 메서드
    public static int linearSearch(int[] arr, int target) {
        for (int i = 0; i &amp;lt; arr.length; i++) {
            if (arr[i] == target) {
                return i; // 찾은 경우 인덱스 반환
            }
        }
        return -1; // 찾지 못한 경우
    }

    public static void main(String[] args) {
        int[] numbers = {10, 25, 37, 40, 52};
        int target = 37;

        int result = linearSearch(numbers, target);

        if (result != -1) {
            System.out.println(&quot;값 &quot; + target + &quot;은 인덱스 &quot; + result + &quot;에 있습니다.&quot;);
        } else {
            System.out.println(&quot;값 &quot; + target + &quot;을 찾을 수 없습니다.&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1508&quot; data-start=&quot;1491&quot; data-ke-size=&quot;size23&quot;&gt; ️ &lt;b&gt;출력 결과&lt;/b&gt;&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1749955520577&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;값 37은 인덱스 2에 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1541&quot; data-start=&quot;1538&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1555&quot; data-start=&quot;1543&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1710&quot; data-start=&quot;1557&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1710&quot; data-start=&quot;1585&quot;&gt;
&lt;tr data-end=&quot;1620&quot; data-start=&quot;1585&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1595&quot; data-start=&quot;1585&quot;&gt;알고리즘 이름&lt;/td&gt;
&lt;td data-end=&quot;1620&quot; data-start=&quot;1595&quot; data-col-size=&quot;sm&quot;&gt;선형 탐색 (Linear Search)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1643&quot; data-start=&quot;1621&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1629&quot; data-start=&quot;1621&quot;&gt;사용 조건&lt;/td&gt;
&lt;td data-end=&quot;1643&quot; data-start=&quot;1629&quot; data-col-size=&quot;sm&quot;&gt;정렬 여부 상관없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1670&quot; data-start=&quot;1644&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1649&quot; data-start=&quot;1644&quot;&gt;장점&lt;/td&gt;
&lt;td data-end=&quot;1670&quot; data-start=&quot;1649&quot; data-col-size=&quot;sm&quot;&gt;단순하고 직관적, 소규모에 적합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1692&quot; data-start=&quot;1671&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1676&quot; data-start=&quot;1671&quot;&gt;단점&lt;/td&gt;
&lt;td data-end=&quot;1692&quot; data-start=&quot;1676&quot; data-col-size=&quot;sm&quot;&gt;대규모 데이터에서 느림&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1710&quot; data-start=&quot;1693&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1702&quot; data-start=&quot;1693&quot;&gt;시간 복잡도&lt;/td&gt;
&lt;td data-end=&quot;1710&quot; data-start=&quot;1702&quot; data-col-size=&quot;sm&quot;&gt;O(n)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;1715&quot; data-start=&quot;1712&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1730&quot; data-start=&quot;1717&quot; data-ke-size=&quot;size26&quot;&gt;✅ 언제 사용할까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1789&quot; data-start=&quot;1732&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1753&quot; data-start=&quot;1732&quot;&gt;데이터가 &lt;b&gt;정렬되지 않았을 때&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1772&quot; data-start=&quot;1754&quot;&gt;데이터 &lt;b&gt;크기가 작을 때&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;1789&quot; data-start=&quot;1773&quot;&gt;간단한 코드가 필요한 상황&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>linear search</category>
      <category>결과</category>
      <category>선형 탐색</category>
      <category>예제 소스</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/32</guid>
      <comments>https://code.who494.com/entry/%EC%84%A0%ED%98%95-%ED%83%90%EC%83%89Linear-Search#entry32comment</comments>
      <pubDate>Sun, 15 Jun 2025 11:50:46 +0900</pubDate>
    </item>
    <item>
      <title>병합 정렬(Merge Sort)</title>
      <link>https://code.who494.com/entry/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort</link>
      <description>&lt;h2 data-end=&quot;88&quot; data-start=&quot;59&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;병합 정렬(Merge Sort)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;90&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;병합 정렬&lt;/b&gt;은 &lt;b&gt;분할 정복(Divide and Conquer)&lt;/b&gt; 알고리즘을 기반으로 하는 정렬 방식으로, 데이터를 &lt;b&gt;작게 나누고&lt;/b&gt; 다시 &lt;b&gt;정렬하며 합치는 방식&lt;/b&gt;으로 동작합니다. 데이터의 크기와 무관하게 &lt;b&gt;항상 안정적이고 예측 가능한 성능&lt;/b&gt;을 보장하기 때문에 많은 환경에서 사용됩니다.&lt;/p&gt;
&lt;p data-end=&quot;259&quot; data-start=&quot;90&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;A visually engaging digital artwork illustrating the concept of the Merge Sort algorithm. The image (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/&quot; target=&quot;&quot; title=&quot;병합정렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmrvrt/btsOCALdB4j/v4D6z4Oe3QqUIusakUHlT1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmrvrt%2FbtsOCALdB4j%2Fv4D6z4Oe3QqUIusakUHlT1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;628&quot; data-filename=&quot;A visually engaging digital artwork illustrating the concept of the Merge Sort algorithm. The image (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;병합정렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-end=&quot;264&quot; data-start=&quot;261&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;293&quot; data-start=&quot;266&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;작동 원리 (어떻게 작동하나요?)&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;450&quot; data-start=&quot;295&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;311&quot; data-start=&quot;295&quot;&gt;배열을 반으로 나눕니다.&lt;/li&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;312&quot;&gt;나눈 배열 각각을 다시 반으로 나눕니다.&lt;/li&gt;
&lt;li data-end=&quot;379&quot; data-start=&quot;338&quot;&gt;배열이 더 이상 쪼갤 수 없을 때까지(길이 1일 때까지) 반복합니다.&lt;/li&gt;
&lt;li data-end=&quot;412&quot; data-start=&quot;380&quot;&gt;이후 작은 배열들을 &lt;b&gt;정렬된 상태로 병합&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;450&quot; data-start=&quot;413&quot;&gt;모든 배열이 병합되면 최종적으로 정렬된 하나의 배열이 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;492&quot; data-start=&quot;452&quot; data-ke-size=&quot;size16&quot;&gt;  쉽게 말해, &lt;b&gt;쪼개고, 쪼개고, 나중에 정렬하면서 합치는 것!&lt;/b&gt;&lt;/p&gt;
&lt;hr data-end=&quot;497&quot; data-start=&quot;494&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;519&quot; data-start=&quot;499&quot; data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;시간 및 공간 복잡도&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;구분복잡도
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;643&quot; data-start=&quot;521&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;643&quot; data-start=&quot;552&quot;&gt;
&lt;tr data-end=&quot;571&quot; data-start=&quot;552&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;557&quot; data-start=&quot;552&quot;&gt;최선&lt;/td&gt;
&lt;td data-end=&quot;571&quot; data-start=&quot;557&quot; data-col-size=&quot;sm&quot;&gt;O(n log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;591&quot; data-start=&quot;572&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;577&quot; data-start=&quot;572&quot;&gt;평균&lt;/td&gt;
&lt;td data-end=&quot;591&quot; data-start=&quot;577&quot; data-col-size=&quot;sm&quot;&gt;O(n log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;611&quot; data-start=&quot;592&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;597&quot; data-start=&quot;592&quot;&gt;최악&lt;/td&gt;
&lt;td data-end=&quot;611&quot; data-start=&quot;597&quot; data-col-size=&quot;sm&quot;&gt;O(n log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;643&quot; data-start=&quot;612&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;621&quot; data-start=&quot;612&quot;&gt;공간 복잡도&lt;/td&gt;
&lt;td data-end=&quot;643&quot; data-start=&quot;621&quot; data-col-size=&quot;sm&quot;&gt;O(n) (새로운 배열이 필요함)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;648&quot; data-start=&quot;645&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;666&quot; data-start=&quot;650&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;장점과 단점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;676&quot; data-start=&quot;668&quot; data-ke-size=&quot;size23&quot;&gt;✅ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;759&quot; data-start=&quot;677&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;706&quot; data-start=&quot;677&quot;&gt;항상 안정적인 성능을 보임 (O(n log n))&lt;/li&gt;
&lt;li data-end=&quot;737&quot; data-start=&quot;707&quot;&gt;&lt;b&gt;안정 정렬&lt;/b&gt;: 동일한 값의 원소 순서가 유지됨&lt;/li&gt;
&lt;li data-end=&quot;759&quot; data-start=&quot;738&quot;&gt;큰 데이터를 정렬할 때 매우 유리함&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;769&quot; data-start=&quot;761&quot; data-ke-size=&quot;size23&quot;&gt;❌ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;820&quot; data-start=&quot;770&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;804&quot; data-start=&quot;770&quot;&gt;&lt;b&gt;추가 메모리 공간 필요&lt;/b&gt; (비교적 공간 효율이 낮음)&lt;/li&gt;
&lt;li data-end=&quot;820&quot; data-start=&quot;805&quot;&gt;구현이 상대적으로 복잡함&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;825&quot; data-start=&quot;822&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;847&quot; data-start=&quot;827&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;Java 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1749954806045&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class MergeSortExample {

    // 병합 정렬 메서드
    public static void mergeSort(int[] arr, int left, int right) {
        if (left &amp;lt; right) {
            // 배열을 절반으로 나누기
            int mid = (left + right) / 2;

            // 왼쪽 절반 정렬
            mergeSort(arr, left, mid);

            // 오른쪽 절반 정렬
            mergeSort(arr, mid + 1, right);

            // 정렬된 두 배열 병합
            merge(arr, left, mid, right);
        }
    }

    // 병합(Merge) 메서드
    public static void merge(int[] arr, int left, int mid, int right) {
        // 배열의 크기 계산
        int n1 = mid - left + 1;
        int n2 = right - mid;

        // 임시 배열 생성
        int[] L = new int[n1];
        int[] R = new int[n2];

        // 데이터 복사
        for (int i = 0; i &amp;lt; n1; ++i)
            L[i] = arr[left + i];
        for (int j = 0; j &amp;lt; n2; ++j)
            R[j] = arr[mid + 1 + j];

        // 병합
        int i = 0, j = 0;
        int k = left;

        while (i &amp;lt; n1 &amp;amp;&amp;amp; j &amp;lt; n2) {
            if (L[i] &amp;lt;= R[j]) {
                arr[k] = L[i];
                i++;
            } else {
                arr[k] = R[j];
                j++;
            }
            k++;
        }

        // 남은 요소 복사
        while (i &amp;lt; n1) {
            arr[k] = L[i];
            i++;
            k++;
        }

        while (j &amp;lt; n2) {
            arr[k] = R[j];
            j++;
            k++;
        }
    }

    // 배열 출력 메서드
    public static void printArray(int[] arr) {
        for (int num : arr)
            System.out.print(num + &quot; &quot;);
        System.out.println();
    }

    // 실행 메서드
    public static void main(String[] args) {
        int[] numbers = {38, 27, 43, 3, 9, 82, 10};

        System.out.println(&quot;정렬 전 배열:&quot;);
        printArray(numbers);

        mergeSort(numbers, 0, numbers.length - 1);

        System.out.println(&quot;정렬 후 배열:&quot;);
        printArray(numbers);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;668&quot; data-end=&quot;676&quot; data-ke-size=&quot;size23&quot;&gt;✅ 출력 결과&lt;/h3&gt;
&lt;pre id=&quot;code_1749954901413&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정렬 전 배열:
38 27 43 3 9 82 10
정렬 후 배열:
3 9 10 27 38 43 82&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-end=&quot;2811&quot; data-start=&quot;2808&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2828&quot; data-start=&quot;2813&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-end=&quot;2828&quot; data-start=&quot;2813&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;정리하면?&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목내용
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;3006&quot; data-start=&quot;2830&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;3006&quot; data-start=&quot;2858&quot;&gt;
&lt;tr data-end=&quot;2898&quot; data-start=&quot;2858&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2866&quot; data-start=&quot;2858&quot;&gt;정렬 방식&lt;/td&gt;
&lt;td data-end=&quot;2898&quot; data-start=&quot;2866&quot; data-col-size=&quot;sm&quot;&gt;분할 후 병합 (Divide and Conquer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2924&quot; data-start=&quot;2899&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2907&quot; data-start=&quot;2899&quot;&gt;정렬 속도&lt;/td&gt;
&lt;td data-end=&quot;2924&quot; data-start=&quot;2907&quot; data-col-size=&quot;sm&quot;&gt;항상 O(n log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2952&quot; data-start=&quot;2925&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2933&quot; data-start=&quot;2925&quot;&gt;공간 사용&lt;/td&gt;
&lt;td data-end=&quot;2952&quot; data-start=&quot;2933&quot; data-col-size=&quot;sm&quot;&gt;O(n) (추가 배열 필요)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2976&quot; data-start=&quot;2953&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2959&quot; data-start=&quot;2953&quot;&gt;안정성&lt;/td&gt;
&lt;td data-end=&quot;2976&quot; data-start=&quot;2959&quot; data-col-size=&quot;sm&quot;&gt;안정 정렬 (순서 유지)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;3006&quot; data-start=&quot;2977&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2984&quot; data-start=&quot;2977&quot;&gt;활용 예&lt;/td&gt;
&lt;td data-end=&quot;3006&quot; data-start=&quot;2984&quot; data-col-size=&quot;sm&quot;&gt;대량 데이터 정렬, 외부 정렬 등&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3011&quot; data-start=&quot;3008&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3094&quot; data-start=&quot;3013&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>Merge Sort</category>
      <category>결과</category>
      <category>병합정렬</category>
      <category>예제소스</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/31</guid>
      <comments>https://code.who494.com/entry/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort#entry31comment</comments>
      <pubDate>Sun, 15 Jun 2025 11:35:50 +0900</pubDate>
    </item>
    <item>
      <title>퀵 정렬(Quick Sort)</title>
      <link>https://code.who494.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort</link>
      <description>&lt;p data-end=&quot;49&quot; data-start=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px;&quot;&gt;  &lt;/span&gt;&lt;b&gt;퀵 정렬(Quick Sort)란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;203&quot; data-start=&quot;86&quot; data-ke-size=&quot;size16&quot;&gt;퀵 정렬은 &lt;b&gt;&quot;분할 정복(Divide and Conquer)&quot;&lt;/b&gt; 전략을 기반으로 한 고성능 정렬 알고리즘입니다. &lt;b&gt;가장 널리 사용되는 정렬 알고리즘 중 하나&lt;/b&gt;로, 평균적으로 매우 빠른 속도를 보여줍니다.&lt;/p&gt;
&lt;p data-end=&quot;203&quot; data-start=&quot;86&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;A digital artwork visualizing the Quick Sort algorithm. The image should include the Korean word '알고 (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/&quot; target=&quot;&quot; title=&quot;퀵 정렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p4RhV/btsOCCbdmZ7/XWUwKf6tiyjiGbWWCPuY9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp4RhV%2FbtsOCCbdmZ7%2FXWUwKf6tiyjiGbWWCPuY9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;488&quot; data-filename=&quot;A digital artwork visualizing the Quick Sort algorithm. The image should include the Korean word '알고 (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;퀵 정렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;220&quot; data-start=&quot;205&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;작동 원리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;284&quot; data-start=&quot;222&quot; data-ke-size=&quot;size16&quot;&gt;퀵 정렬의 핵심은 **피벗(Pivot)**이라는 기준 값을 중심으로 배열을 &lt;b&gt;두 부분으로 나누는&lt;/b&gt; 것입니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;457&quot; data-start=&quot;286&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;337&quot; data-start=&quot;286&quot;&gt;&lt;b&gt;피벗을 하나 선택&lt;/b&gt;합니다. (일반적으로 첫 요소, 마지막 요소, 혹은 중간값 등)&lt;/li&gt;
&lt;li data-end=&quot;372&quot; data-start=&quot;338&quot;&gt;배열을 피벗보다 &lt;b&gt;작은 값과 큰 값으로 분할&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;425&quot; data-start=&quot;373&quot;&gt;피벗을 기준으로 왼쪽과 오른쪽 서브 배열에 대해 &lt;b&gt;퀵 정렬을 재귀적으로 반복&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;457&quot; data-start=&quot;426&quot;&gt;모든 하위 배열이 정렬되면 전체 배열이 정렬됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;475&quot; data-start=&quot;459&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;시간 복잡도&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;604&quot; data-start=&quot;477&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;495&quot; data-start=&quot;477&quot;&gt;평균: O(n log n)&lt;/li&gt;
&lt;li data-end=&quot;544&quot; data-start=&quot;496&quot;&gt;최악 (피벗이 계속 가장 큰 값이나 가장 작은 값으로 선택될 경우): O(n&amp;sup2;)&lt;/li&gt;
&lt;li data-end=&quot;563&quot; data-start=&quot;545&quot;&gt;최선: O(n log n)&lt;/li&gt;
&lt;li data-end=&quot;604&quot; data-start=&quot;564&quot;&gt;공간 복잡도: O(log n) (재귀 호출에 필요한 스택 메모리)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;609&quot; data-start=&quot;606&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;633&quot; data-start=&quot;611&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;퀵 정렬의 장점과 단점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;643&quot; data-start=&quot;635&quot; data-ke-size=&quot;size23&quot;&gt;✅ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;714&quot; data-start=&quot;644&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;660&quot; data-start=&quot;644&quot;&gt;평균적으로 매우 빠릅니다.&lt;/li&gt;
&lt;li data-end=&quot;693&quot; data-start=&quot;661&quot;&gt;추가 메모리를 거의 사용하지 않습니다 (제자리 정렬).&lt;/li&gt;
&lt;li data-end=&quot;714&quot; data-start=&quot;694&quot;&gt;대규모 데이터 정렬에 적합합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;724&quot; data-start=&quot;716&quot; data-ke-size=&quot;size23&quot;&gt;❌ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;797&quot; data-start=&quot;725&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;757&quot; data-start=&quot;725&quot;&gt;최악의 경우 성능이 O(n&amp;sup2;)까지 떨어질 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;797&quot; data-start=&quot;758&quot;&gt;재귀 호출을 많이 사용하기 때문에 스택 오버플로우 위험이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;802&quot; data-start=&quot;799&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;824&quot; data-start=&quot;804&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;Java 예제 코드&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1749952312989&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class QuickSortExample {

    // 퀵 정렬 메서드
    public static void quickSort(int[] arr, int low, int high) {
        if (low &amp;lt; high) {
            // 파티션 기준점(피벗)을 구함
            int pivotIndex = partition(arr, low, high);

            // 피벗 기준 왼쪽, 오른쪽 각각 정렬
            quickSort(arr, low, pivotIndex - 1);
            quickSort(arr, pivotIndex + 1, high);
        }
    }

    // 파티션 메서드 (피벗 기준으로 좌우 분할)
    public static int partition(int[] arr, int low, int high) {
        int pivot = arr[high]; // 마지막 요소를 피벗으로 선택
        int i = low - 1; // 작은 요소의 인덱스

        for (int j = low; j &amp;lt; high; j++) {
            // 현재 요소가 피벗보다 작거나 같으면
            if (arr[j] &amp;lt;= pivot) {
                i++;

                // 교환
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }

        // 피벗을 중간으로 이동
        int temp = arr[i + 1];
        arr[i + 1] = arr[high];
        arr[high] = temp;

        return i + 1;
    }

    // 배열 출력 메서드
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + &quot; &quot;);
        }
        System.out.println();
    }

    // 실행 메서드
    public static void main(String[] args) {
        int[] numbers = {7, 2, 1, 6, 8, 5, 3, 4};

        System.out.println(&quot;정렬 전 배열:&quot;);
        printArray(numbers);

        quickSort(numbers, 0, numbers.length - 1);

        System.out.println(&quot;정렬 후 배열:&quot;);
        printArray(numbers);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;635&quot; data-end=&quot;643&quot; data-ke-size=&quot;size23&quot;&gt;✅ 출력 결과&lt;/h3&gt;
&lt;pre id=&quot;code_1749952349389&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정렬 전 배열:
7 2 1 6 8 5 3 4 
정렬 후 배열:
1 2 3 4 5 6 7 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2402&quot; data-start=&quot;2399&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2416&quot; data-start=&quot;2404&quot; data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;요약&lt;/b&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;항목설명
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2587&quot; data-start=&quot;2418&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2587&quot; data-start=&quot;2446&quot;&gt;
&lt;tr data-end=&quot;2471&quot; data-start=&quot;2446&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2456&quot; data-start=&quot;2446&quot;&gt;알고리즘 종류&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2471&quot; data-start=&quot;2456&quot;&gt;분할 정복 기반 정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2494&quot; data-start=&quot;2472&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2480&quot; data-start=&quot;2472&quot;&gt;평균 성능&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2494&quot; data-start=&quot;2480&quot;&gt;O(n log n)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2519&quot; data-start=&quot;2495&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2504&quot; data-start=&quot;2495&quot;&gt;공간 효율성&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2519&quot; data-start=&quot;2504&quot;&gt;높음 (제자리 정렬)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2554&quot; data-start=&quot;2520&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2528&quot; data-start=&quot;2520&quot;&gt;주요 특징&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2554&quot; data-start=&quot;2528&quot;&gt;빠르고, 재귀적 구조, 피벗 선택이 중요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2587&quot; data-start=&quot;2555&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2564&quot; data-start=&quot;2555&quot;&gt;적합한 경우&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2587&quot; data-start=&quot;2564&quot;&gt;대용량 데이터, 성능이 중요한 환경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;</description>
      <category>알고리즘</category>
      <category>Quick Sort</category>
      <category>결과</category>
      <category>소스코드</category>
      <category>퀵 정렬</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/30</guid>
      <comments>https://code.who494.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort#entry30comment</comments>
      <pubDate>Sun, 15 Jun 2025 10:53:00 +0900</pubDate>
    </item>
    <item>
      <title>버블 정렬(Bubble Sort)</title>
      <link>https://code.who494.com/entry/%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%ACBubble-Sort</link>
      <description>&lt;h2 data-end=&quot;101&quot; data-start=&quot;71&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 버블 정렬(Bubble Sort)란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;245&quot; data-start=&quot;103&quot; data-ke-size=&quot;size16&quot;&gt;버블 정렬은 가장 단순한 정렬 알고리즘 중 하나로, &lt;b&gt;인접한 두 요소를 비교&lt;/b&gt;해서 &lt;b&gt;크기가 잘못된 경우 서로 교환&lt;/b&gt;하는 방식으로 동작합니다. 이러한 과정을 반복하면서 &lt;b&gt;가장 큰(또는 작은) 요소가 끝으로 &quot;버블처럼&quot; 올라가는&lt;/b&gt; 모습을 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;A visually engaging digital artwork illustrating the concept of the Bubble Sort algorithm. The image (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/&quot; target=&quot;&quot; title=&quot;버블정렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uwoce/btsOAwjBc8r/HcJZ1CrKCyBBZeibBuVR3K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuwoce%2FbtsOAwjBc8r%2FHcJZ1CrKCyBBZeibBuVR3K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;446&quot; height=&quot;446&quot; data-filename=&quot;A visually engaging digital artwork illustrating the concept of the Bubble Sort algorithm. The image (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;버블정렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;262&quot; data-start=&quot;247&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;작동 방식&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;462&quot; data-start=&quot;264&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;297&quot; data-start=&quot;264&quot;&gt;배열의 첫 번째 요소부터 인접한 두 요소를 비교합니다.&lt;/li&gt;
&lt;li data-end=&quot;332&quot; data-start=&quot;298&quot;&gt;앞의 값이 뒤의 값보다 크면, 두 값을 서로 교환합니다.&lt;/li&gt;
&lt;li data-end=&quot;356&quot; data-start=&quot;333&quot;&gt;이 과정을 배열의 끝까지 반복합니다.&lt;/li&gt;
&lt;li data-end=&quot;395&quot; data-start=&quot;357&quot;&gt;첫 번째 반복이 끝나면 가장 큰 값이 마지막에 위치하게 됩니다.&lt;/li&gt;
&lt;li data-end=&quot;434&quot; data-start=&quot;396&quot;&gt;다음 반복에서는 마지막 요소를 제외하고 같은 과정을 반복합니다.&lt;/li&gt;
&lt;li data-end=&quot;462&quot; data-start=&quot;435&quot;&gt;배열이 정렬될 때까지 이 과정을 반복합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-end=&quot;480&quot; data-start=&quot;464&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;시간 복잡도&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;587&quot; data-start=&quot;482&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;498&quot; data-start=&quot;482&quot;&gt;최악(O): O(n&amp;sup2;)&lt;/li&gt;
&lt;li data-end=&quot;512&quot; data-start=&quot;499&quot;&gt;평균: O(n&amp;sup2;)&lt;/li&gt;
&lt;li data-end=&quot;551&quot; data-start=&quot;513&quot;&gt;최선(정렬된 경우): O(n) (최적화된 버블 정렬 사용 시)&lt;/li&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;552&quot;&gt;공간 복잡도: O(1) (제자리 정렬, in-place)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1749951844087&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BubbleSortExample {

    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped;

        // 외부 루프는 전체 패스를 반복
        for (int i = 0; i &amp;lt; n - 1; i++) {
            swapped = false; // 교환 여부를 추적

            // 내부 루프는 현재 패스에서 정렬
            for (int j = 0; j &amp;lt; n - 1 - i; j++) {
                if (arr[j] &amp;gt; arr[j + 1]) {
                    // 요소 교환
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;

                    swapped = true; // 교환 발생
                }
            }

            // 교환이 없었다면 배열은 이미 정렬된 상태
            if (!swapped) break;
        }
    }

    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + &quot; &quot;);
        }
        System.out.println();
    }

    // 실행 메서드
    public static void main(String[] args) {
        int[] numbers = {5, 3, 8, 4, 2};

        System.out.println(&quot;정렬 전 배열:&quot;);
        printArray(numbers);

        bubbleSort(numbers);

        System.out.println(&quot;정렬 후 배열:&quot;);
        printArray(numbers);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;464&quot; data-end=&quot;480&quot; data-ke-size=&quot;size23&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;출력 결과&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1749951935756&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;정렬 전 배열:
5 3 8 4 2 
정렬 후 배열:
2 3 4 5 8&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;1851&quot; data-start=&quot;1836&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;요약 정리&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1976&quot; data-start=&quot;1853&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1885&quot; data-start=&quot;1853&quot;&gt;버블 정렬은 개념이 간단해서 입문자에게 매우 좋습니다.&lt;/li&gt;
&lt;li data-end=&quot;1924&quot; data-start=&quot;1886&quot;&gt;하지만 성능은 좋지 않기 때문에 &lt;b&gt;작은 데이터&lt;/b&gt;에 적합합니다.&lt;/li&gt;
&lt;li data-end=&quot;1976&quot; data-start=&quot;1925&quot;&gt;&lt;b&gt;Java 구현도 쉽고 직관적&lt;/b&gt;이므로 기본 정렬 알고리즘을 이해할 때 매우 유용하죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1981&quot; data-start=&quot;1978&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2035&quot; data-start=&quot;1983&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>Bubble Sort</category>
      <category>결과</category>
      <category>버블정렬</category>
      <category>소스코드</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/29</guid>
      <comments>https://code.who494.com/entry/%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%ACBubble-Sort#entry29comment</comments>
      <pubDate>Sun, 15 Jun 2025 10:46:26 +0900</pubDate>
    </item>
    <item>
      <title>알고리즘이란 무엇인가요?</title>
      <link>https://code.who494.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;A visually appealing digital artwork featuring the Korean word '알고리즘' (meaning 'algorithm') prominen (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EvcME/btsOAJbVTOw/SBoCp6O6vzejpZ72A9GTT0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EvcME/btsOAJbVTOw/SBoCp6O6vzejpZ72A9GTT0/img.jpg&quot; data-alt=&quot;알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EvcME/btsOAJbVTOw/SBoCp6O6vzejpZ72A9GTT0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEvcME%2FbtsOAJbVTOw%2FSBoCp6O6vzejpZ72A9GTT0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;479&quot; data-filename=&quot;A visually appealing digital artwork featuring the Korean word '알고리즘' (meaning 'algorithm') prominen (1).jpeg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;알고리즘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-end=&quot;1296&quot; data-start=&quot;1275&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘이란 무엇인가요?&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1314&quot; data-start=&quot;1298&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정의 및 개념&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1316&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘은 주어진 문제를 해결하기 위한 절차적 방법이나 명확한 순서의 집합이에요. 마치 요리를 할 때 레시피를 따라가듯, 컴퓨터가 문제를 해결하도록 안내하는 '지침서'라고 생각하면 쉬워요.&lt;/p&gt;
&lt;h4 data-end=&quot;1441&quot; data-start=&quot;1423&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;알고리즘의 중요성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1535&quot; data-start=&quot;1443&quot; data-ke-size=&quot;size16&quot;&gt;효율적인 알고리즘은 프로그램의 성능을 결정짓는 핵심 요소예요. 동일한 기능을 수행하는 프로그램이라도 알고리즘에 따라 속도, 메모리 사용량, 처리 능력이 천차만별이죠.&lt;/p&gt;
&lt;hr data-end=&quot;1540&quot; data-start=&quot;1537&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;1568&quot; data-start=&quot;1542&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;분류 기준에 따른 알고리즘의 종류&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1588&quot; data-start=&quot;1570&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시간 복잡도 기준&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1689&quot; data-start=&quot;1590&quot; data-ke-size=&quot;size16&quot;&gt;시간 복잡도는 알고리즘이 문제를 해결하는 데 걸리는 시간의 척도예요. 일반적으로는 빅오(Big-O) 표기법을 사용해 O(n), O(log n), O(n^2) 등으로 표시하죠.&lt;/p&gt;
&lt;h4 data-end=&quot;1709&quot; data-start=&quot;1691&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;공간 복잡도 기준&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1772&quot; data-start=&quot;1711&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘이 사용하는 메모리 양이에요. 메모리를 아껴야 하는 환경에서는 공간 복잡도가 낮은 알고리즘이 유리해요.&lt;/p&gt;
&lt;hr data-end=&quot;1777&quot; data-start=&quot;1774&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1805&quot; data-start=&quot;1779&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;가장 많이 사용되는 알고리즘 종류&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;1823&quot; data-start=&quot;1807&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;정렬 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;1860&quot; data-start=&quot;1825&quot; data-ke-size=&quot;size16&quot;&gt;정렬은 데이터를 오름차순이나 내림차순으로 재배열하는 과정이에요.&lt;/p&gt;
&lt;p data-end=&quot;1860&quot; data-start=&quot;1825&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;버블 정렬 (Bubble Sort)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;1937&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size16&quot;&gt;인접한 두 요소를 비교하고 위치를 바꾸는 방식으로, 단순하지만 비효율적이에요.&lt;/p&gt;
&lt;figure id=&quot;og_1749952107124&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;버블 정렬(Bubble Sort)&quot; data-og-description=&quot;버블 정렬(Bubble Sort)란?버블 정렬은 가장 단순한 정렬 알고리즘 중 하나로, 인접한 두 요소를 비교해서 크기가 잘못된 경우 서로 교환하는 방식으로 동작합니다. 이러한 과정을 반복하면서 가장 &quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://code.who494.com/entry/%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%ACBubble-Sort&quot; data-og-url=&quot;https://code.who494.com/entry/%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%ACBubble-Sort&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cBPVeB/hyY79iLOPd/doW1BvlXfSRQgddrcqAZ71/img.jpg?width=800&amp;amp;height=800&amp;amp;face=273_56_630_183,https://scrap.kakaocdn.net/dn/56Dw2/hyY8NfrMbE/xD13qhbSw7ymT2StJaoGYk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=273_56_630_183,https://scrap.kakaocdn.net/dn/dFdiaa/hyY43Egh4i/xOzSeyudrgkNS8xKePgRI0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/entry/%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%ACBubble-Sort&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.who494.com/entry/%EB%B2%84%EB%B8%94-%EC%A0%95%EB%A0%ACBubble-Sort&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cBPVeB/hyY79iLOPd/doW1BvlXfSRQgddrcqAZ71/img.jpg?width=800&amp;amp;height=800&amp;amp;face=273_56_630_183,https://scrap.kakaocdn.net/dn/56Dw2/hyY8NfrMbE/xD13qhbSw7ymT2StJaoGYk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=273_56_630_183,https://scrap.kakaocdn.net/dn/dFdiaa/hyY43Egh4i/xOzSeyudrgkNS8xKePgRI0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;버블 정렬(Bubble Sort)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;버블 정렬(Bubble Sort)란?버블 정렬은 가장 단순한 정렬 알고리즘 중 하나로, 인접한 두 요소를 비교해서 크기가 잘못된 경우 서로 교환하는 방식으로 동작합니다. 이러한 과정을 반복하면서 가장&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;1937&quot; data-start=&quot;1894&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;퀵 정렬 (Quick Sort)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2017&quot; data-start=&quot;1969&quot; data-ke-size=&quot;size16&quot;&gt;피벗을 기준으로 데이터를 나누어 정렬하는 방식. 평균적으로 매우 빠른 성능을 보여줘요.&lt;/p&gt;
&lt;figure id=&quot;og_1749952403521&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;퀵 정렬(Quick Sort)&quot; data-og-description=&quot;  퀵 정렬(Quick Sort)란?퀵 정렬은 &amp;quot;분할 정복(Divide and Conquer)&amp;quot; 전략을 기반으로 한 고성능 정렬 알고리즘입니다. 가장 널리 사용되는 정렬 알고리즘 중 하나로, 평균적으로 매우 빠른 속도를 보여&quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://code.who494.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort&quot; data-og-url=&quot;https://code.who494.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ojBBO/hyY742QdXQ/No4k5d5RdKrIlFZXlM4oq1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/e3Q8c/hyY8KJMnbi/K5SLvkgtJThVgjFd9fy5h0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dpt9D2/hyY7XWXRYY/uFkyXYxaPIKirO6Kn2N8t0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.who494.com/entry/%ED%80%B5-%EC%A0%95%EB%A0%ACQuick-Sort&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ojBBO/hyY742QdXQ/No4k5d5RdKrIlFZXlM4oq1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/e3Q8c/hyY8KJMnbi/K5SLvkgtJThVgjFd9fy5h0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dpt9D2/hyY7XWXRYY/uFkyXYxaPIKirO6Kn2N8t0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;퀵 정렬(Quick Sort)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  퀵 정렬(Quick Sort)란?퀵 정렬은 &quot;분할 정복(Divide and Conquer)&quot; 전략을 기반으로 한 고성능 정렬 알고리즘입니다. 가장 널리 사용되는 정렬 알고리즘 중 하나로, 평균적으로 매우 빠른 속도를 보여&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2017&quot; data-start=&quot;1969&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;병합 정렬 (Merge Sort)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2099&quot; data-start=&quot;2050&quot; data-ke-size=&quot;size16&quot;&gt;데이터를 반씩 나눠 정렬한 후 합치는 방식으로, 안정적이고 예측 가능한 성능을 제공해요.&lt;/p&gt;
&lt;figure id=&quot;og_1749955078620&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;병합 정렬(Merge Sort)&quot; data-og-description=&quot;  병합 정렬(Merge Sort)란?병합 정렬은 분할 정복(Divide and Conquer) 알고리즘을 기반으로 하는 정렬 방식으로, 데이터를 작게 나누고 다시 정렬하며 합치는 방식으로 동작합니다. 데이터의 크기와 &quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://code.who494.com/entry/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort&quot; data-og-url=&quot;https://code.who494.com/entry/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2ESiz/hyY760GbnD/18am6RJNLpvKakccoHuokK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b6TuOt/hyY48lgn6T/21703FJB9dXyuODjaqHDRk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdjDew/hyY8avdmcQ/nge6TMj54ezGK5rmdQg6F1/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=648_11_811_174&quot;&gt;&lt;a href=&quot;https://code.who494.com/entry/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.who494.com/entry/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2ESiz/hyY760GbnD/18am6RJNLpvKakccoHuokK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b6TuOt/hyY48lgn6T/21703FJB9dXyuODjaqHDRk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bdjDew/hyY8avdmcQ/nge6TMj54ezGK5rmdQg6F1/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=648_11_811_174');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;병합 정렬(Merge Sort)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  병합 정렬(Merge Sort)란?병합 정렬은 분할 정복(Divide and Conquer) 알고리즘을 기반으로 하는 정렬 방식으로, 데이터를 작게 나누고 다시 정렬하며 합치는 방식으로 동작합니다. 데이터의 크기와&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2104&quot; data-start=&quot;2101&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2122&quot; data-start=&quot;2106&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;탐색 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2155&quot; data-start=&quot;2124&quot; data-ke-size=&quot;size16&quot;&gt;데이터에서 원하는 값을 찾는 데 사용되는 알고리즘이에요.&lt;/p&gt;
&lt;p data-end=&quot;2155&quot; data-start=&quot;2124&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;선형 탐색 (Linear Search)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2234&quot; data-start=&quot;2191&quot; data-ke-size=&quot;size16&quot;&gt;처음부터 끝까지 하나씩 확인하는 방식이에요. 간단하지만 비효율적일 수 있어요.&lt;/p&gt;
&lt;figure id=&quot;og_1749956379038&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;선형 탐색(Linear Search)&quot; data-og-description=&quot;  선형 탐색(Linear Search) 알고리즘이란?**선형 탐색(또는 순차 탐색)**은 가장 기본적이고 간단한 탐색 알고리즘입니다. 데이터를 처음부터 끝까지 하나씩 차례대로 확인하면서 **찾고자 하는 값&quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://code.who494.com/entry/%EC%84%A0%ED%98%95-%ED%83%90%EC%83%89Linear-Search&quot; data-og-url=&quot;https://code.who494.com/entry/%EC%84%A0%ED%98%95-%ED%83%90%EC%83%89Linear-Search&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0xIXI/hyY45vhGQa/LetuGjSD47hZuSciQFIG6k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b2A0Ro/hyY5hP2zDJ/ZTMNUOoTMxaWW8HMJZ0WI0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/5XcRK/hyY5b3lBTw/HkQimuyMOqxG14sIVv84kk/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/entry/%EC%84%A0%ED%98%95-%ED%83%90%EC%83%89Linear-Search&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.who494.com/entry/%EC%84%A0%ED%98%95-%ED%83%90%EC%83%89Linear-Search&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0xIXI/hyY45vhGQa/LetuGjSD47hZuSciQFIG6k/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/b2A0Ro/hyY5hP2zDJ/ZTMNUOoTMxaWW8HMJZ0WI0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/5XcRK/hyY5b3lBTw/HkQimuyMOqxG14sIVv84kk/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;선형 탐색(Linear Search)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  선형 탐색(Linear Search) 알고리즘이란?**선형 탐색(또는 순차 탐색)**은 가장 기본적이고 간단한 탐색 알고리즘입니다. 데이터를 처음부터 끝까지 하나씩 차례대로 확인하면서 **찾고자 하는 값&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-end=&quot;2234&quot; data-start=&quot;2191&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이진 탐색 (Binary Search)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2320&quot; data-start=&quot;2270&quot; data-ke-size=&quot;size16&quot;&gt;정렬된 데이터에서 중간 값을 기준으로 범위를 줄여가며 탐색하는 방식. 빠르고 효율적이에요.&lt;/p&gt;
&lt;figure id=&quot;og_1749956415314&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;이진 탐색(Binary Search)&quot; data-og-description=&quot;  이진 탐색(Binary Search) 알고리즘이란?이진 탐색은 정렬된 데이터에서 원하는 값을 빠르게 찾는 알고리즘입니다. 중간 값을 기준으로 검색 범위를 절반씩 줄여가며 탐색하는 방식입니다.쉽게 &quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://code.who494.com/entry/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89Binary-Search&quot; data-og-url=&quot;https://code.who494.com/entry/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89Binary-Search&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/YUF18/hyY45vhHfU/i8Wdz6orPlKOPwIcaz42rK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bSAbwu/hyY8TGLwNf/1VhHwE1aTAs1Y4vgfpYbzk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/brd863/hyY8Ok8R4F/26pbQnBcTjRFf21IKMXNCK/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://code.who494.com/entry/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89Binary-Search&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.who494.com/entry/%EC%9D%B4%EC%A7%84-%ED%83%90%EC%83%89Binary-Search&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/YUF18/hyY45vhHfU/i8Wdz6orPlKOPwIcaz42rK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bSAbwu/hyY8TGLwNf/1VhHwE1aTAs1Y4vgfpYbzk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/brd863/hyY8Ok8R4F/26pbQnBcTjRFf21IKMXNCK/img.png?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;이진 탐색(Binary Search)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  이진 탐색(Binary Search) 알고리즘이란?이진 탐색은 정렬된 데이터에서 원하는 값을 빠르게 찾는 알고리즘입니다. 중간 값을 기준으로 검색 범위를 절반씩 줄여가며 탐색하는 방식입니다.쉽게&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-end=&quot;2325&quot; data-start=&quot;2322&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2344&quot; data-start=&quot;2327&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;그래프 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2391&quot; data-start=&quot;2346&quot; data-ke-size=&quot;size16&quot;&gt;노드와 간선으로 구성된 그래프 구조에서 최적의 경로나 연결을 찾는 알고리즘이에요.&lt;/p&gt;
&lt;p data-end=&quot;2391&quot; data-start=&quot;2346&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다익스트라 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2454&quot; data-start=&quot;2416&quot; data-ke-size=&quot;size16&quot;&gt;최단 경로를 구하는 데 사용돼요. GPS 경로 탐색에 자주 활용되죠.&lt;/p&gt;
&lt;figure id=&quot;og_1750347775088&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;다익스트라 알고리즘(Dijkstra Algorithm)&quot; data-og-description=&quot;  다익스트라 알고리즘(Dijkstra Algorithm)이란?다익스트라 알고리즘은 그래프에서 하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 알고리즘입니다. 네덜란드의 컴퓨터 과학자 **에츠&quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://code.who494.com/entry/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Dijkstra-Algorithm&quot; data-og-url=&quot;https://code.who494.com/entry/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Dijkstra-Algorithm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zKoJp/hyZclW1aGc/0REjtnjRKR6kkdxSnAck8K/img.png?width=713&amp;amp;height=710&amp;amp;face=0_0_713_710,https://scrap.kakaocdn.net/dn/cnabOi/hyY7Zg838U/DrHb7CkAuL3kfkPk35bm41/img.png?width=713&amp;amp;height=710&amp;amp;face=0_0_713_710,https://scrap.kakaocdn.net/dn/bXL6sP/hyY8PrV3MV/KnRUid06HZKIun3LpPEJ10/img.png?width=713&amp;amp;height=710&amp;amp;face=0_0_713_710&quot;&gt;&lt;a href=&quot;https://code.who494.com/entry/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Dijkstra-Algorithm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://code.who494.com/entry/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Dijkstra-Algorithm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zKoJp/hyZclW1aGc/0REjtnjRKR6kkdxSnAck8K/img.png?width=713&amp;amp;height=710&amp;amp;face=0_0_713_710,https://scrap.kakaocdn.net/dn/cnabOi/hyY7Zg838U/DrHb7CkAuL3kfkPk35bm41/img.png?width=713&amp;amp;height=710&amp;amp;face=0_0_713_710,https://scrap.kakaocdn.net/dn/bXL6sP/hyY8PrV3MV/KnRUid06HZKIun3LpPEJ10/img.png?width=713&amp;amp;height=710&amp;amp;face=0_0_713_710');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;다익스트라 알고리즘(Dijkstra Algorithm)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  다익스트라 알고리즘(Dijkstra Algorithm)이란?다익스트라 알고리즘은 그래프에서 하나의 정점에서 다른 모든 정점까지의 최단 경로를 구하는 알고리즘입니다. 네덜란드의 컴퓨터 과학자 **에츠&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;2454&quot; data-start=&quot;2416&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;벨만-포드 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2516&quot; data-start=&quot;2479&quot; data-ke-size=&quot;size16&quot;&gt;음의 가중치를 허용하는 그래프에서 최단 경로를 계산할 때 사용돼요.&lt;/p&gt;
&lt;p data-end=&quot;2516&quot; data-start=&quot;2479&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;크루스칼 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2578&quot; data-start=&quot;2540&quot; data-ke-size=&quot;size16&quot;&gt;최소 신장 트리를 찾는 알고리즘으로, 네트워크 연결 최적화에 쓰여요.&lt;/p&gt;
&lt;hr data-end=&quot;2583&quot; data-start=&quot;2580&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-end=&quot;2602&quot; data-start=&quot;2585&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동적 프로그래밍&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2651&quot; data-start=&quot;2604&quot; data-ke-size=&quot;size16&quot;&gt;복잡한 문제를 작은 문제로 나누고, 그 결과를 저장해 중복 계산을 피하는 기법이에요.&lt;/p&gt;
&lt;p data-end=&quot;2651&quot; data-start=&quot;2604&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;피보나치 수열&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2715&quot; data-start=&quot;2673&quot; data-ke-size=&quot;size16&quot;&gt;재귀로 구현하면 비효율적이지만, 동적 프로그래밍을 쓰면 효율이 확 올라가요.&lt;/p&gt;
&lt;p data-end=&quot;2715&quot; data-start=&quot;2673&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;배낭 문제 (Knapsack Problem)&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;2795&quot; data-start=&quot;2754&quot; data-ke-size=&quot;size16&quot;&gt;제한된 용량의 배낭에 최대 가치를 담기 위한 최적화 문제에 자주 등장해요.&lt;/p&gt;
&lt;hr data-end=&quot;2800&quot; data-start=&quot;2797&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-end=&quot;2820&quot; data-start=&quot;2802&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘 설계 기법&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;2859&quot; data-start=&quot;2822&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;분할 정복 (Divide and Conquer)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2899&quot; data-start=&quot;2860&quot; data-ke-size=&quot;size16&quot;&gt;문제를 나눠서 각각 해결한 뒤 병합하는 방식. 병합 정렬이 대표적이죠.&lt;/p&gt;
&lt;h4 data-end=&quot;2929&quot; data-start=&quot;2901&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;탐욕적 알고리즘 (Greedy)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;2966&quot; data-start=&quot;2930&quot; data-ke-size=&quot;size16&quot;&gt;각 단계에서 최선의 선택을 하는 방식이에요. 예: 거스름돈 문제.&lt;/p&gt;
&lt;h4 data-end=&quot;2998&quot; data-start=&quot;2968&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;백트래킹 (Backtracking)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3058&quot; data-start=&quot;2999&quot; data-ke-size=&quot;size16&quot;&gt;모든 경우의 수를 탐색하되, 조건을 만족하지 않으면 되돌아가는 방식. 퍼즐, 미로 탐색 등에 자주 쓰여요.&lt;/p&gt;
&lt;h4 data-end=&quot;3090&quot; data-start=&quot;3060&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;브루트포스 (Brute Force)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3134&quot; data-start=&quot;3091&quot; data-ke-size=&quot;size16&quot;&gt;모든 가능한 경우를 전부 시험해보는 방식이에요. 느리지만 간단한 해결책이에요.&lt;/p&gt;
&lt;hr data-end=&quot;3139&quot; data-start=&quot;3136&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3159&quot; data-start=&quot;3141&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;특수 목적 알고리즘&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;3181&quot; data-start=&quot;3161&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문자열 처리 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3224&quot; data-start=&quot;3183&quot; data-ke-size=&quot;size16&quot;&gt;KMP, 라빈-카프 등은 문자열에서 특정 패턴을 빠르게 찾을 때 사용돼요.&lt;/p&gt;
&lt;h4 data-end=&quot;3243&quot; data-start=&quot;3226&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;암호화 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3292&quot; data-start=&quot;3245&quot; data-ke-size=&quot;size16&quot;&gt;AES, RSA, SHA-256 등은 보안에 관련된 데이터를 암호화하는 데 사용되죠.&lt;/p&gt;
&lt;h4 data-end=&quot;3315&quot; data-start=&quot;3294&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;머신러닝 관련 알고리즘&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3361&quot; data-start=&quot;3317&quot; data-ke-size=&quot;size16&quot;&gt;경사하강법, 의사결정트리, SVM 등은 데이터에서 패턴을 학습하는 데 사용돼요.&lt;/p&gt;
&lt;hr data-end=&quot;3366&quot; data-start=&quot;3363&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3392&quot; data-start=&quot;3368&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;알고리즘 선택 팁과 실전 활용&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-end=&quot;3415&quot; data-start=&quot;3394&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 유형에 따른 선택&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3472&quot; data-start=&quot;3417&quot; data-ke-size=&quot;size16&quot;&gt;정렬 문제에는 퀵 정렬, 최단 경로 문제에는 다익스트라 등, 문제 유형을 파악하는 것이 핵심이에요.&lt;/p&gt;
&lt;h4 data-end=&quot;3494&quot; data-start=&quot;3474&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;성능 테스트와 최적화&lt;/b&gt;&lt;/h4&gt;
&lt;p data-end=&quot;3553&quot; data-start=&quot;3496&quot; data-ke-size=&quot;size16&quot;&gt;같은 알고리즘이라도 코드 구현 방식에 따라 속도가 달라져요. 다양한 입력값으로 테스트하고 최적화하세요.&lt;/p&gt;
&lt;hr data-end=&quot;3558&quot; data-start=&quot;3555&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3569&quot; data-start=&quot;3560&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3721&quot; data-start=&quot;3571&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘은 단순한 코드 이상의 것이에요. 문제 해결의 사고 방식이며, 성능과 효율을 결정하는 핵심 열쇠죠. 다양한 알고리즘을 이해하고 적용할 수 있다면, 어떤 개발 문제든 훨씬 수월하게 풀 수 있어요. 결국 알고리즘은 '코딩의 언어'이자, '문제 해결의 기술'이랍니다.&lt;/p&gt;
&lt;hr data-end=&quot;3726&quot; data-start=&quot;3723&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3749&quot; data-start=&quot;3728&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;자주 묻는 질문 (FAQ)&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;3787&quot; data-start=&quot;3751&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Q1. 어떤 알고리즘부터 공부하는 게 좋을까요?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3853&quot; data-start=&quot;3788&quot; data-ke-size=&quot;size16&quot;&gt;기초적으로는 정렬과 탐색 알고리즘부터 시작하는 것이 좋아요. 이후 동적 프로그래밍이나 그래프 알고리즘으로 확장하세요.&lt;/p&gt;
&lt;h3 data-end=&quot;3893&quot; data-start=&quot;3855&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Q2. 알고리즘 공부에 좋은 사이트는 뭐가 있나요?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3956&quot; data-start=&quot;3894&quot; data-ke-size=&quot;size16&quot;&gt;백준, 프로그래머스, LeetCode, Codeforces 등이 있어요. 다양한 난이도의 문제를 풀 수 있어요.&lt;/p&gt;
&lt;h3 data-end=&quot;3983&quot; data-start=&quot;3958&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Q3. 꼭 암기해야 하나요?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;4030&quot; data-start=&quot;3984&quot; data-ke-size=&quot;size16&quot;&gt;암기보다는 이해가 중요해요. 문제를 풀어보며 자연스럽게 익히는 것이 더 효과적이죠.&lt;/p&gt;
&lt;h3 data-end=&quot;4074&quot; data-start=&quot;4032&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Q4. 동적 프로그래밍이 너무 어려워요. 어떻게 공부하죠?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;4126&quot; data-start=&quot;4075&quot; data-ke-size=&quot;size16&quot;&gt;작은 예제부터 시작하고, 메모이제이션 개념을 확실히 이해한 뒤 단계적으로 난이도를 올리세요.&lt;/p&gt;
&lt;h3 data-end=&quot;4163&quot; data-start=&quot;4128&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Q5. 실제 개발에서도 알고리즘이 중요하나요?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;4211&quot; data-start=&quot;4164&quot; data-ke-size=&quot;size16&quot;&gt;네, 특히 대규모 데이터 처리나 성능이 중요한 서비스에서는 알고리즘의 영향이 큽니다.&lt;/p&gt;</description>
      <category>알고리즘</category>
      <category>개발</category>
      <category>그래프</category>
      <category>머신러닝</category>
      <category>분할 정복</category>
      <category>알고리즘</category>
      <category>정렬</category>
      <category>탐색</category>
      <category>탐욕적 알고리즘</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/28</guid>
      <comments>https://code.who494.com/entry/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80%EC%9A%94#entry28comment</comments>
      <pubDate>Sun, 15 Jun 2025 10:36:48 +0900</pubDate>
    </item>
    <item>
      <title>웹소켓 통신 시 1::, h, a와 같은 문자열</title>
      <link>https://code.who494.com/entry/%EC%9B%B9%EC%86%8C%EC%BC%93-%ED%86%B5%EC%8B%A0-%EC%8B%9C-1-h-a%EC%99%80-%EA%B0%99%EC%9D%80-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
      <description>&lt;p data-sourcepos=&quot;1:1-1:327&quot; data-ke-size=&quot;size16&quot;&gt;웹소켓 통신 시 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;1::, h, a&lt;/span&gt;와 같은 문자열이 붙는 이유는 주로 &lt;b&gt;SockJS&lt;/b&gt;라는 라이브러리를 사용할 때 나타나는 현상입니다. SockJS는 웹소켓을 지원하지 않는 브라우저에서도 웹소켓과 유사한 기능을 제공하기 위한 폴백(Fallback) 메커니즘을 제공합니다. 즉, 웹소켓을 사용할 수 없는 환경에서는 HTTP Long-Polling, HTTP Streaming 등의 방식을 사용하여 실시간 통신을 에뮬레이션합니다. 이때, SockJS는 이러한 폴백 방식들을 관리하고 데이터 전송을 효율적으로 처리하기 위해 특정 문자열들을 사용하여 메시지를 구분하거나 제어합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:327&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/betkwh/btsLGh3o3ax/aMnsYEnPgpLvQedM6Zgixk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/betkwh/btsLGh3o3ax/aMnsYEnPgpLvQedM6Zgixk/img.png&quot; data-alt=&quot;웹소켓 통신 시 1::, h, a와 같은 문자열&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/betkwh/btsLGh3o3ax/aMnsYEnPgpLvQedM6Zgixk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbetkwh%2FbtsLGh3o3ax%2FaMnsYEnPgpLvQedM6Zgixk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;웹소켓 통신 시 1::, h, a와 같은 문자열&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;580&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹소켓 통신 시 1::, h, a와 같은 문자열&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;3:1-3:19&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;br /&gt;SockJS의 메시지 포맷&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;5:1-5:79&quot; data-ke-size=&quot;size16&quot;&gt;SockJS는 단순한 문자열 전송 외에도 다양한 제어 메시지를 사용합니다. 이러한 메시지들은 특정 접두사(Prefix)를 사용하여 구분됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-sourcepos=&quot;7:1-12:0&quot;&gt;
&lt;li data-sourcepos=&quot;7:1-7:43&quot;&gt;&lt;b&gt;o (open):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결이 성공적으로 수립되었음을 나타냅니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;8:1-8:38&quot;&gt;&lt;b&gt;c (close):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결이 종료되었음을 나타냅니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;9:1-9:55&quot;&gt;&lt;b&gt;h (heartbeat):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;연결이 살아있는지 확인하기 위한 하트비트 메시지입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:1-10:54&quot;&gt;&lt;b&gt;a (array):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;여러 메시지를 묶어서 하나의 메시지로 전송할 때 사용됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:1-12:0&quot;&gt;&lt;b&gt;m (message):&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실제 데이터를 담고 있는 메시지입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;13:1-13:30&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1::, 2::, 3:: 등의 형식&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;15:1-15:209&quot; data-ke-size=&quot;size16&quot;&gt;1::, 2::, 3::과 같은 형식은 SockJS의 특정 전송 방식에서 사용되는 포맷입니다. 여기서 숫자는 내부적으로 사용되는 메시지 식별자 또는 순서를 나타낼 수 있으며, ::는 메시지 내용과 구분하는 역할을 합니다. 이러한 형식은 주로 HTTP Long-Polling이나 HTTP Streaming과 같은 폴백 방식에서 메시지를 관리하기 위해 사용됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;17:1-17:7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시:&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;19:1-19:72&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트가 서버에 &quot;Hello&quot;라는 메시지를 보내는 경우, SockJS는 이를 다음과 같은 형태로 변환하여 전송할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot; data-sourcepos=&quot;21:1-23:0&quot;&gt;
&lt;li data-sourcepos=&quot;21:1-21:40&quot;&gt;웹소켓을 사용하는 경우: &quot;Hello&quot; (일반적인 웹소켓 메시지)&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:1-23:0&quot;&gt;HTTP Long-Polling을 사용하는 경우: mHello 또는 3::Hello 와 같은 형태로 변환될 수 있습니다. (구체적인 형식은 SockJS 구현에 따라 다를 수 있습니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;24:1-24:20&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SockJS를 사용하는 이유&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;26:1-26:197&quot; data-ke-size=&quot;size16&quot;&gt;웹소켓은 최신 브라우저에서는 잘 작동하지만, 오래된 브라우저나 특정 네트워크 환경(프록시 서버, 방화벽 등)에서는 제대로 동작하지 않을 수 있습니다. SockJS는 이러한 환경에서도 실시간 통신을 가능하게 하기 위해 다양한 폴백 메커니즘을 제공합니다. 따라서, 웹소켓을 지원하지 않는 환경까지 고려해야 하는 경우 SockJS를 사용하는 것이 유용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;28:1-28:7&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;28:1-28:7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약:&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;30:1-30:207&quot; data-ke-size=&quot;size16&quot;&gt;1::, h, a와 같은 문자열은 SockJS가 폴백 메커니즘을 사용할 때 메시지를 관리하고 구분하기 위해 사용하는 특정 포맷입니다. 이러한 문자열들은 웹소켓 자체의 프로토콜에는 포함되지 않으며, SockJS 라이브러리의 구현 방식에 따라 달라질 수 있습니다. SockJS는 웹소켓을 지원하지 않는 환경에서도 실시간 통신을 가능하게 하는 중요한 역할을 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-sourcepos=&quot;32:1-32:106&quot; data-ke-size=&quot;size16&quot;&gt;만약 SockJS를 사용하지 않고 순수한 웹소켓 통신을 사용하는 경우에는 이러한 문자열들이 나타나지 않습니다. 웹소켓은 자체적인 프레임 포맷을 가지고 있으며, 데이터를 직접적으로 전송합니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>1::</category>
      <category>a</category>
      <category>H</category>
      <category>웹소켓</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/27</guid>
      <comments>https://code.who494.com/entry/%EC%9B%B9%EC%86%8C%EC%BC%93-%ED%86%B5%EC%8B%A0-%EC%8B%9C-1-h-a%EC%99%80-%EA%B0%99%EC%9D%80-%EB%AC%B8%EC%9E%90%EC%97%B4#entry27comment</comments>
      <pubDate>Wed, 8 Jan 2025 16:52:20 +0900</pubDate>
    </item>
    <item>
      <title>java:comp/env/ 규칙은 뭘까?</title>
      <link>https://code.who494.com/entry/javacompenv-%EA%B7%9C%EC%B9%99%EC%9D%80-%EB%AD%98%EA%B9%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;java:comp/env/ 컨텍스트는 Java EE 스펙에서 정의된 표준이므로, 모든 Java EE 호환 WAS는 이 컨텍스트를 지원해야 합니다. 따라서, java:comp/env/를 사용하는 것은 Java EE 표준을 준수하는 방법이며, 애플리케이션의 이식성과 상호 운용성을 보장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w82qb/btsLHR3KgeL/n32LjfMV27uPSRMscmXrp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w82qb/btsLHR3KgeL/n32LjfMV27uPSRMscmXrp0/img.png&quot; data-alt=&quot;java:comp/env/ 규칙은 뭘까?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w82qb/btsLHR3KgeL/n32LjfMV27uPSRMscmXrp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw82qb%2FbtsLHR3KgeL%2Fn32LjfMV27uPSRMscmXrp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;java:comp/env/ 규칙은 뭘까?&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;612&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;612&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;java:comp/env/ 규칙은 뭘까?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;25:1-25:25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;java:comp/env/의 의미:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;27:1-30:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;27:1-27:36&quot;&gt;java:: JNDI 네임스페이스의 루트를 나타냅니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:1-28:78&quot;&gt;comp:: &quot;component&quot;의 약자로, 현재 실행 중인 컴포넌트(예: 웹 애플리케이션, EJB)의 네임스페이스를 나타냅니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;29:1-30:0&quot;&gt;env:: &quot;environment&quot;의 약자로, 컴포넌트의 환경 항목(environment entries)을 저장하는 컨텍스트를 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;31:1-31:95&quot; data-ke-size=&quot;size16&quot;&gt;즉, java:comp/env/는 &quot;현재 컴포넌트의 환경 설정&quot;을 의미하며, 해당 컴포넌트에서 사용할 리소스(예: 데이터 소스, JMS 큐)를 정의하는 데 사용됩니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;31:1-31:95&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;31:1-31:95&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;33:1-33:7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;요약:&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;35:1-35:219&quot; data-ke-size=&quot;size16&quot;&gt;java:comp/env/는 Java EE 스펙에서 정의된 표준 컨텍스트로서, 애플리케이션의 이식성, 구성 관리, 보안, 표준 준수 등 여러 가지 중요한 이점을 제공합니다. 따라서, JNDI를 사용하여 리소스를 lookup할 때 java:comp/env/ 접두사를 사용하는 것은 매우 권장되는 방법입니다. 이 규칙을 따르면 애플리케이션을 보다 효율적이고 안정적으로 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;37:1-37:66&quot; data-ke-size=&quot;size16&quot;&gt;이러한 이유들로 인해 java:comp/env/는 JNDI lookup 시 사실상의 표준 규칙으로 자리 잡았습니다.&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>java ee 스펙</category>
      <category>java ee 호환 was</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/26</guid>
      <comments>https://code.who494.com/entry/javacompenv-%EA%B7%9C%EC%B9%99%EC%9D%80-%EB%AD%98%EA%B9%8C#entry26comment</comments>
      <pubDate>Wed, 8 Jan 2025 15:00:09 +0900</pubDate>
    </item>
    <item>
      <title>OS 엔디안 확인 (Little Endian, Big Endian) and Bi-Endian</title>
      <link>https://code.who494.com/entry/OS-%EC%97%94%EB%94%94%EC%95%88-%ED%99%95%EC%9D%B8-Little-Endian-Big-Endian</link>
      <description>&lt;p data-sourcepos=&quot;1:1-1:156&quot; data-ke-size=&quot;size16&quot;&gt;엔디안이란 컴퓨터의 메모리에 데이터를 저장할 때 바이트의 순서를 나타내는 방식을 말합니다. 크게 빅 엔디안(Big Endian)과 리틀 엔디안(Little Endian) 두 가지 방식이 있습니다. 엔디안이라는 용어 자체는 조너선 스위프트의 소설 &quot;걸리버 여행기&quot;에서 유래했습니다. 소설 속 릴리퍼트라는 나라에서는 삶은 달걀을 깰 때 뭉툭한 쪽(big-end)을 깨야 하는지, 뾰족한 쪽(little-end)을 깨야 하는지를 두고 큰 논쟁이 벌어집니다. 이처럼 사소한 차이로 인해 사람들이 갈등하는 모습을 빗대어, 컴퓨터의 바이트 저장 방식의 차이를 엔디안이라고 부르게 되었습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:156&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:156&quot; data-ke-size=&quot;size16&quot;&gt;요즘에는 Intel x86 계열의 CPU가 널리 사용되면서 리틀 엔디안이 사실상 표준처럼 자리 잡았습니다. 하지만, 네트워크 통신, 임베디드 시스템 등 특정 분야에서는 여전히 빅 엔디안이 사용되고 있습니다. 또한, ARM 아키텍처는 빅 엔디안과 리틀 엔디안을 모두 지원하는 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;바이 엔디안(Bi-Endian)&lt;/span&gt; 방식을 채택하고 있어 필요에 따라 엔디안 방식을 선택할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:156&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rxGJz/btsLFaJgbTh/QrF81dk5WyvfktT1MAGH0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rxGJz/btsLFaJgbTh/QrF81dk5WyvfktT1MAGH0K/img.png&quot; data-alt=&quot;엔디안 확인 (Little Endian, Big Endian)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rxGJz/btsLFaJgbTh/QrF81dk5WyvfktT1MAGH0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrxGJz%2FbtsLFaJgbTh%2FQrF81dk5WyvfktT1MAGH0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;엔디안 확인 (Little Endian, Big Endian)&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;523&quot; data-origin-width=&quot;624&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;엔디안 확인 (Little Endian, Big Endian)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:156&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-sourcepos=&quot;3:1-3:12&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;엔디안의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;5:1-7:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;5:1-5:180&quot;&gt;&lt;b&gt;빅 엔디안 (Big Endian):&lt;/b&gt; 큰 단위의 바이트부터 메모리에 저장하는 방식입니다. 예를 들어, 0x12345678이라는 32비트 데이터를 저장할 때 메모리 주소 순서대로 12, 34, 56, 78 순으로 저장됩니다. 사람이 숫자를 읽는 방식과 동일하여 직관적입니다. 네트워크 바이트 순서로도 사용됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;6:1-7:0&quot;&gt;&lt;b&gt;리틀 엔디안 (Little Endian):&lt;/b&gt; 작은 단위의 바이트부터 메모리에 저장하는 방식입니다. 위와 같은 데이터를 저장할 때 78, 56, 34, 12 순으로 저장됩니다. Intel x86 계열의 CPU에서 주로 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;리눅스 명령어로 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1736150928633&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# [linux]
# 1 Little Endian
# 0 Big Endian
echo -n I | od -to2 | head -n1 | awk '{print $2;}' | cut -c6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;C프로그램으로 확인 (AIX 가능)&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/bcAq2L/btsLDT2MUrd/Dk5mGACSK4hg6nhfO7ktxK/endian.c?attach=1&amp;amp;knm=tfile.c&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;endian.c&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1736152311843&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
    unsigned int num = 0x12345678;
    unsigned char *ptr = (unsigned char *)&amp;amp;num;

    printf(&quot;Number: 0x%X\n&quot;, num);
    printf(&quot;Bytes in memory: 0x%X 0x%X 0x%X 0x%X\n&quot;, ptr[0], ptr[1], ptr[2], ptr[3]);

    if (ptr[0] == 0x78) {
        printf(&quot;Little Endian\n&quot;);
    } else if (ptr[0] == 0x12) {
        printf(&quot;Big Endian\n&quot;);
    } else {
        printf(&quot;Unknown Endian\n&quot;);
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/buNPmj/btsLFyQI5jj/ZVvtGzjdz6KeOzTMDFOK2K/endian?attach=1&amp;amp;knm=tfile.dat&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;endian&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.02MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;endian.c 는 소스, 컴파일된 파일 endian 실행&lt;/p&gt;
&lt;pre id=&quot;code_1736152605900&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~$&amp;gt; ./endian
Number: 0x12345678
Bytes in memory: 0x78 0x56 0x34 0x12
Little Endian&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lscpu 명령어 사용&lt;/p&gt;
&lt;pre id=&quot;code_1736152782644&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;~$&amp;gt; lscpu
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         39 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  6
  On-line CPU(s) list:   0-5
Vendor ID:               GenuineIntel
  Model name:            Intel(R) Core(TM) i5-8500 CPU @ 3.00GHz
    CPU family:          6
    Model:               158
    Thread(s) per core:  1
    Core(s) per socket:  6
    Socket(s):           1
    Stepping:            10
    CPU max MHz:         4100.0000
    CPU min MHz:         800.0000
    BogoMIPS:            6000.00
    Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse s
                         se2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtop
                         ology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma c
                         x16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_
                         lm abm 3dnowprefetch cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow flexpriority ep
                         t vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt intel
                         _pt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp vnmi m
                         d_clear flush_l1d arch_capabilities
Virtualization features:
  Virtualization:        VT-x
Caches (sum of all):
  L1d:                   192 KiB (6 instances)
  L1i:                   192 KiB (6 instances)
  L2:                    1.5 MiB (6 instances)
  L3:                    9 MiB (1 instance)
NUMA:
  NUMA node(s):          1
  NUMA node0 CPU(s):     0-5
Vulnerabilities:
  Gather data sampling:  Mitigation; Microcode
  Itlb multihit:         KVM: Mitigation: VMX disabled
  L1tf:                  Mitigation; PTE Inversion; VMX conditional cache flushes, SMT disabled
  Mds:                   Mitigation; Clear CPU buffers; SMT disabled
  Meltdown:              Mitigation; PTI
  Mmio stale data:       Mitigation; Clear CPU buffers; SMT disabled
  Retbleed:              Mitigation; IBRS
  Spec rstack overflow:  Not affected
  Spec store bypass:     Mitigation; Speculative Store Bypass disabled via prctl
  Spectre v1:            Mitigation; usercopy/swapgs barriers and __user pointer sanitization
  Spectre v2:            Mitigation; IBRS; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affe
                         cted
  Srbds:                 Mitigation; Microcode
  Tsx async abort:       Mitigation; TSX disabled&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Java 소스 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1736153178197&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.nio.ByteOrder;

public class EndianTest {
    public static void main(String[] args) {
        ByteOrder byteOrder = ByteOrder.nativeOrder();
        System.out.println(&quot;Native Byte Order: &quot; + byteOrder);

        if (byteOrder == ByteOrder.LITTLE_ENDIAN) {
            System.out.println(&quot;Little Endian&quot;);
        } else if (byteOrder == ByteOrder.BIG_ENDIAN) {
            System.out.println(&quot;Big Endian&quot;);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>linux</category>
      <category>bi-endian</category>
      <category>big endian</category>
      <category>endian</category>
      <category>little endian</category>
      <category>엔디안</category>
      <category>엔디안 확인</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/25</guid>
      <comments>https://code.who494.com/entry/OS-%EC%97%94%EB%94%94%EC%95%88-%ED%99%95%EC%9D%B8-Little-Endian-Big-Endian#entry25comment</comments>
      <pubDate>Mon, 6 Jan 2025 17:44:05 +0900</pubDate>
    </item>
    <item>
      <title>클래스 불변식(Class Invariant)</title>
      <link>https://code.who494.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B6%88%EB%B3%80%EC%8B%9DClass-Invariant</link>
      <description>&lt;p data-sourcepos=&quot;1:1-1:164&quot; data-ke-size=&quot;size16&quot;&gt;클래스 불변식(Class Invariant)은 객체의 상태가 항상 만족해야 하는 조건 또는 규칙을 의미합니다. 즉, 객체가 생성된 이후부터 소멸될 때까지 특정 속성이나 관계가 항상 참(true)이어야 한다는 것입니다. 이러한 불변식은 객체의 일관성과 안정성을 보장하는 데 중요한 역할을 합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:164&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rM99k/btsLBv06kay/gFhTHevN1A4nGbAmqCSvzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rM99k/btsLBv06kay/gFhTHevN1A4nGbAmqCSvzk/img.png&quot; data-alt=&quot;클래스 불변식(Class Invariant)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rM99k/btsLBv06kay/gFhTHevN1A4nGbAmqCSvzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrM99k%2FbtsLBv06kay%2FgFhTHevN1A4nGbAmqCSvzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;클래스 불변식(Class Invariant)&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;392&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;클래스 불변식(Class Invariant)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-sourcepos=&quot;1:1-1:164&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불변식의 의미:&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:228&quot; data-ke-size=&quot;size16&quot;&gt;어떤 클래스가 있을 때, 그 클래스의 객체는 특정 조건을 만족해야 정상적인 상태로 간주될 수 있습니다. 이러한 조건을 불변식이라고 합니다. 예를 들어, Person 클래스가 있고, 나이를 나타내는 age 속성이 있다면, age는 0보다 크거나 같아야 한다는 것이 불변식이 될 수 있습니다. 만약 age가 음수 값을 가지게 된다면, 이는 객체의 상태가 비정상적인 것이므로 불변식이 깨진 것입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;7:1-7:13&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불변식의 중요성:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;9:1-13:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;9:1-9:90&quot;&gt;&lt;b&gt;객체의 일관성 유지:&lt;/b&gt; 불변식은 객체의 상태가 예측 가능하고 일관성을 유지하도록 합니다. 이를 통해 객체를 사용하는 코드의 오류를 줄일 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:1-10:119&quot;&gt;&lt;b&gt;프로그램의 안정성 향상:&lt;/b&gt; 불변식이 지켜지지 않으면 객체의 상태가 예기치 않게 변경될 수 있으며, 이는 프로그램의 오류나 예외를 발생시킬 수 있습니다. 불변식을 통해 이러한 문제를 예방할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:1-11:90&quot;&gt;&lt;b&gt;코드의 가독성 및 유지보수성 향상:&lt;/b&gt; 불변식을 명확하게 정의하면 코드의 의도를 명확하게 전달할 수 있으며, 코드의 유지보수성을 향상시킬 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;12:1-13:0&quot;&gt;&lt;b&gt;동시성 프로그래밍의 안전성 확보:&lt;/b&gt; 불변 객체(Immutable Object)는 불변식을 이용하여 스레드 안전성을 확보합니다. 객체의 상태가 변하지 않으므로 여러 스레드가 동시에 접근해도 데이터의 불일치 문제가 발생하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;14:1-14:12&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불변식의 예시:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;16:1-24:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;16:1-18:24&quot;&gt;&lt;b&gt;은행 계좌 (BankAccount):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;17:5-18:24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;17:5-17:37&quot;&gt;잔액(balance)은 0보다 크거나 같아야 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;18:5-18:24&quot;&gt;계좌 번호는 고유해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;19:1-20:42&quot;&gt;&lt;b&gt;사각형 (Rectangle):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;20:5-20:42&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;20:5-20:42&quot;&gt;너비(width)와 높이(height)는 0보다 커야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;21:1-24:0&quot;&gt;&lt;b&gt;날짜 (Date):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;22:5-24:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;22:5-22:38&quot;&gt;월(month)은 1부터 12 사이의 값이어야 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:5-24:0&quot;&gt;일(day)은 해당 월의 유효한 날짜 범위 내에 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;25:1-25:17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불변식을 유지하는 방법:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;27:1-31:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;27:1-27:71&quot;&gt;&lt;b&gt;생성자에서 검사:&lt;/b&gt; 객체를 생성할 때 생성자에서 입력 값을 검사하여 불변식을 위반하는 값이 들어오지 않도록 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:1-28:88&quot;&gt;&lt;b&gt;Setter 메서드에서 검사:&lt;/b&gt; 객체의 속성을 변경하는 Setter 메서드에서 입력 값을 검사하여 불변식을 위반하는 값이 설정되지 않도록 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;29:1-29:75&quot;&gt;&lt;b&gt;불변 객체 사용:&lt;/b&gt; 객체의 상태를 변경하지 못하도록 설계하여 불변식을 강제합니다. (예: String, Integer 등)&lt;/li&gt;
&lt;li data-sourcepos=&quot;30:1-31:0&quot;&gt;&lt;b&gt;Assertion 사용:&lt;/b&gt; 개발 단계에서 Assertion을 사용하여 불변식이 지켜지는지 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;32:1-32:22&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Java에서의 불변식 구현 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735626954836&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;public class BankAccount {
    private final String accountNumber;
    private int balance;

    public BankAccount(String accountNumber, int initialBalance) {
        if (initialBalance &amp;lt; 0) {
            throw new IllegalArgumentException(&quot;Initial balance cannot be negative.&quot;);
        }
        this.accountNumber = accountNumber;
        this.balance = initialBalance;
    }

    public void deposit(int amount) {
        if (amount &amp;lt;= 0) {
            throw new IllegalArgumentException(&quot;Deposit amount must be positive.&quot;);
        }
        this.balance += amount;
    }

    public void withdraw(int amount) {
        if (amount &amp;lt;= 0) {
            throw new IllegalArgumentException(&quot;Withdrawal amount must be positive.&quot;);
        }
        if (amount &amp;gt; this.balance) {
            throw new IllegalArgumentException(&quot;Insufficient balance.&quot;);
        }
        this.balance -= amount;
    }

    // accountNumber는 final이므로 Setter가 없음 (불변)
    public String getAccountNumber() {
        return accountNumber;
    }

    public int getBalance() {
        return balance;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>class invariant</category>
      <category>클래스 불변식</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/24</guid>
      <comments>https://code.who494.com/entry/%ED%81%B4%EB%9E%98%EC%8A%A4-%EB%B6%88%EB%B3%80%EC%8B%9DClass-Invariant#entry24comment</comments>
      <pubDate>Tue, 31 Dec 2024 15:37:36 +0900</pubDate>
    </item>
    <item>
      <title>MAVEN 설치 방법</title>
      <link>https://code.who494.com/entry/MAVEN-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MAVEN은 Apache Software Foundation에서 개발한 프로젝트 관리 및 빌드 자동화 도구입니다. 주로 자바 프로젝트에서 사용되지만, 다른 언어와 프레임워크에서도 활용될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GMl3Q/btsLmjU8wEG/DGKJTbmSgvVRKq1XnPHFu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GMl3Q/btsLmjU8wEG/DGKJTbmSgvVRKq1XnPHFu0/img.png&quot; data-alt=&quot;MAVEN 설치 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GMl3Q/btsLmjU8wEG/DGKJTbmSgvVRKq1XnPHFu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGMl3Q%2FbtsLmjU8wEG%2FDGKJTbmSgvVRKq1XnPHFu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;MAVEN 설치 방법&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;497&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MAVEN 설치 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;프로젝트&amp;nbsp;구조&amp;nbsp;관리:&amp;nbsp;MAVEN은&amp;nbsp;표준화된&amp;nbsp;디렉토리&amp;nbsp;구조를&amp;nbsp;제공하여&amp;nbsp;프로젝트의&amp;nbsp;일관성을&amp;nbsp;유지합니다.&lt;br /&gt;&lt;br /&gt;의존성&amp;nbsp;관리:&amp;nbsp;MAVEN은&amp;nbsp;프로젝트에서&amp;nbsp;사용하는&amp;nbsp;라이브러리와&amp;nbsp;그&amp;nbsp;버전을&amp;nbsp;자동으로&amp;nbsp;관리해줍니다.&amp;nbsp;이를&amp;nbsp;통해&amp;nbsp;필요한&amp;nbsp;라이브러리를&amp;nbsp;쉽게&amp;nbsp;다운로드하고&amp;nbsp;업데이트할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;빌드&amp;nbsp;자동화:&amp;nbsp;MAVEN은&amp;nbsp;프로젝트&amp;nbsp;빌드를&amp;nbsp;위한&amp;nbsp;다양한&amp;nbsp;플러그인을&amp;nbsp;제공하여,&amp;nbsp;코드&amp;nbsp;컴파일,&amp;nbsp;테스트&amp;nbsp;실행,&amp;nbsp;패키징,&amp;nbsp;배포&amp;nbsp;등의&amp;nbsp;작업을&amp;nbsp;자동화할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;프로젝트&amp;nbsp;정보&amp;nbsp;관리:&amp;nbsp;pom.xml&amp;nbsp;파일을&amp;nbsp;통해&amp;nbsp;프로젝트의&amp;nbsp;메타데이터(버전,&amp;nbsp;의존성,&amp;nbsp;빌드&amp;nbsp;설정&amp;nbsp;등)를&amp;nbsp;정의하고&amp;nbsp;관리할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;다양한&amp;nbsp;생태계&amp;nbsp;지원:&amp;nbsp;MAVEN은&amp;nbsp;중앙&amp;nbsp;저장소인&amp;nbsp;Maven&amp;nbsp;Central을&amp;nbsp;통해&amp;nbsp;수많은&amp;nbsp;라이브러리를&amp;nbsp;쉽게&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있도록&amp;nbsp;지원합니다.&lt;br /&gt;&lt;br /&gt;MAVEN을&amp;nbsp;사용하면&amp;nbsp;개발자들이&amp;nbsp;반복적인&amp;nbsp;작업을&amp;nbsp;줄이고,&amp;nbsp;프로젝트의&amp;nbsp;유지보수성을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Maven 설치방법 (2024.12.18 기준)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.zip&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dlcdn.apache.org/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.zip&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우의 경우를 기반으로 설명 드립니다. 위 파일을 다운 받으셔서 압축파일을 적당한 위치에 압축 해제를 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLASpu/btsLnHHi7gI/OghRFjPPEwPjR80JIOySM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLASpu/btsLnHHi7gI/OghRFjPPEwPjR80JIOySM1/img.png&quot; data-alt=&quot;해제된 폴더 내용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLASpu/btsLnHHi7gI/OghRFjPPEwPjR80JIOySM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLASpu%2FbtsLnHHi7gI%2FOghRFjPPEwPjR80JIOySM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;해제된 폴더 내용&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;281&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해제된 폴더 내용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 설치한 버전은 하위 버전인 apache-maven-3.9.6 입니다. 위 폴더에서 bin 폴더 위치까지 포함해 환경변수 등록합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWMCnc/btsLofJ2P48/YbE3HzyqWR8hNyJjcKMOsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWMCnc/btsLofJ2P48/YbE3HzyqWR8hNyJjcKMOsK/img.png&quot; data-alt=&quot;환경변수 편집 아이콘을 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWMCnc/btsLofJ2P48/YbE3HzyqWR8hNyJjcKMOsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWMCnc%2FbtsLofJ2P48%2FYbE3HzyqWR8hNyJjcKMOsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;730&quot; height=&quot;176&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;176&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경변수 편집 아이콘을 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b30XQk/btsLnSaJCAD/HSbvUsSFLzPv2MFSGEYcU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b30XQk/btsLnSaJCAD/HSbvUsSFLzPv2MFSGEYcU0/img.png&quot; data-alt=&quot;환경변수 버튼 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b30XQk/btsLnSaJCAD/HSbvUsSFLzPv2MFSGEYcU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb30XQk%2FbtsLnSaJCAD%2FHSbvUsSFLzPv2MFSGEYcU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;521&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경변수 버튼 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdvI9W/btsLmhiP2za/Squ4HLHUlMhZTAnvffjz20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdvI9W/btsLmhiP2za/Squ4HLHUlMhZTAnvffjz20/img.png&quot; data-alt=&quot;환경 변수 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdvI9W/btsLmhiP2za/Squ4HLHUlMhZTAnvffjz20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdvI9W%2FbtsLmhiP2za%2FSqu4HLHUlMhZTAnvffjz20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;환경 변수 창&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;486&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경 변수 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 시스템 변수(S) 에서 Path를 찾아 클릭 후 편집 버튼을 클릭합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CO1Cf/btsLn0NoJA2/2Pzq4XvoRMuwAakgVnG1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CO1Cf/btsLn0NoJA2/2Pzq4XvoRMuwAakgVnG1K0/img.png&quot; data-alt=&quot;추가된 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CO1Cf/btsLn0NoJA2/2Pzq4XvoRMuwAakgVnG1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCO1Cf%2FbtsLn0NoJA2%2F2Pzq4XvoRMuwAakgVnG1K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;574&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추가된 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록할 환경변수 내용은 D:\java\apache-maven-3.9.6\bin 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등록된 이후 CMD 창을 띄우고 mvn -version 명령으로 잘 등록 됐는지 확인합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;mvn&amp;nbsp;-version&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvplYl/btsLnGO9wfT/Kc9OANNQKGQeM5UTmzkCm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvplYl/btsLnGO9wfT/Kc9OANNQKGQeM5UTmzkCm1/img.png&quot; data-alt=&quot;maven 버전확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvplYl/btsLnGO9wfT/Kc9OANNQKGQeM5UTmzkCm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvplYl%2FbtsLnGO9wfT%2FKc9OANNQKGQeM5UTmzkCm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;maven 버전확인&quot; loading=&quot;lazy&quot; width=&quot;663&quot; height=&quot;127&quot; data-origin-width=&quot;663&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;maven 버전확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mvn을 실행하기 위해서는 Java JDK가 설치되 있어야 합니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;</description>
      <category>언어/Java</category>
      <category>maven</category>
      <category>maven 설치방법</category>
      <category>라이브러리 관리</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/23</guid>
      <comments>https://code.who494.com/entry/MAVEN-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95#entry23comment</comments>
      <pubDate>Wed, 18 Dec 2024 16:35:07 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 어플리케이션에서 사용하는 라이선스 확인</title>
      <link>https://code.who494.com/entry/JAVA-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4-%ED%99%95%EC%9D%B8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MojoHaus 프로젝트에서 제공하는 Apache Maven용 플러그인을 제공하는데 그 중에서 어플리케이션에서 사용하는 라이선스가 어떤 종류를 사용하고 있는지 확인 할 수 있는 플러그인이 존재합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2LWen/btsLmo22UHZ/5WWshOnKGOZnOcYrEfrki1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2LWen/btsLmo22UHZ/5WWshOnKGOZnOcYrEfrki1/img.png&quot; data-alt=&quot;JAVA 어플리케이션에서 사용하는 라이선스 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2LWen/btsLmo22UHZ/5WWshOnKGOZnOcYrEfrki1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2LWen%2FbtsLmo22UHZ%2F5WWshOnKGOZnOcYrEfrki1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;JAVA 어플리케이션에서 사용하는 라이선스 확인&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;677&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JAVA 어플리케이션에서 사용하는 라이선스 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[오픈소스 라이선스 종류 확인 명령어]&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;mvn license:license-list&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[ 오픈소스 라이선스 종류 확인&amp;nbsp; 실행 결과]&lt;/p&gt;
&lt;pre id=&quot;code_1734505873414&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[INFO] Available licenses :

 * agpl_v3     : GNU Affero General Public License (AGPL) version 3.0
 * apache_v2   : Apache License version 2.0
 * bsd_2       : BSD 2-Clause License
 * bsd_3       : BSD 3-Clause License
 * cddl_v1     : COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
 * epl_only_v1 : Eclipse Public License - v 1.0
 * epl_only_v2 : Eclipse Public License - v 2.0
 * epl_v1      : Eclipse Public + Distribution License - v 1.0
 * epl_v2      : Eclipse Public License - v 2.0 with Secondary License
 * eupl_v1_1   : European Union Public License v1.1
 * fdl_v1_3    : GNU Free Documentation License (FDL) version 1.3
 * gpl_v1      : GNU General Public License (GPL) version 1.0
 * gpl_v2      : GNU General Public License (GPL) version 2.0
 * gpl_v3      : GNU General Public License (GPL) version 3.0
 * lgpl_v2_1   : GNU General Lesser Public License (LGPL) version 2.1
 * lgpl_v3     : GNU General Lesser Public License (LGPL) version 3.0
 * mit         : MIT-License&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[오픈소스 라이선스 전문 내용까지 확인 명령어]&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;mvn&amp;nbsp;license:license-list&amp;nbsp;-Ddetail&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[오픈소스 라이선스 전문 내용까지 실행 결과]&lt;/p&gt;
&lt;pre id=&quot;code_1734506054702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* gpl_v3      : GNU General Public License (GPL) version 3.0

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public
License along with this program.  If not, see
&amp;lt;http://www.gnu.org/licenses/gpl-3.0.html&amp;gt;.


 * lgpl_v2_1   : GNU General Lesser Public License (LGPL) version 2.1

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 2.1 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Lesser Public License for more details.

You should have received a copy of the GNU General Lesser Public
License along with this program.  If not, see
&amp;lt;http://www.gnu.org/licenses/lgpl-2.1.html&amp;gt;.


 * lgpl_v3     : GNU General Lesser Public License (LGPL) version 3.0

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Lesser Public License for more details.

You should have received a copy of the GNU General Lesser Public
License along with this program.  If not, see
&amp;lt;http://www.gnu.org/licenses/lgpl-3.0.html&amp;gt;.


 * mit         : MIT-License

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the &quot;Software&quot;), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 명령을 실행하기 위한 전제는 maven 프로그램이 설치되 있어야 합니다.&lt;/p&gt;
&lt;figure id=&quot;og_1734507337201&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;MAVEN 설치 방법&quot; data-og-description=&quot;MAVEN은 Apache Software Foundation에서 개발한 프로젝트 관리 및 빌드 자동화 도구입니다. 주로 자바 프로젝트에서 사용되지만, 다른 언어와 프레임워크에서도 활용될 수 있습니다.&amp;nbsp;프로젝트&amp;nbsp;구조&amp;nbsp;관&quot; data-og-host=&quot;code.who494.com&quot; data-og-source-url=&quot;https://codeon.tistory.com/entry/MAVEN-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95&quot; data-og-url=&quot;https://code.who494.com/entry/MAVEN-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kMn6C/hyXObIN0cc/WLs9zempqcTczsJUqj6zu0/img.png?width=638&amp;amp;height=640&amp;amp;face=0_0_638_640,https://scrap.kakaocdn.net/dn/dFpzV3/hyXOjmxOW7/Y3UHxwHolJ9Tvr5oHZjAY0/img.png?width=638&amp;amp;height=640&amp;amp;face=0_0_638_640,https://scrap.kakaocdn.net/dn/dd2lAj/hyXObPzoq8/UCmXcE9aKs35A3mI91j3dK/img.png?width=602&amp;amp;height=574&amp;amp;face=0_0_602_574&quot;&gt;&lt;a href=&quot;https://codeon.tistory.com/entry/MAVEN-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codeon.tistory.com/entry/MAVEN-%EC%84%A4%EC%B9%98-%EB%B0%A9%EB%B2%95&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kMn6C/hyXObIN0cc/WLs9zempqcTczsJUqj6zu0/img.png?width=638&amp;amp;height=640&amp;amp;face=0_0_638_640,https://scrap.kakaocdn.net/dn/dFpzV3/hyXOjmxOW7/Y3UHxwHolJ9Tvr5oHZjAY0/img.png?width=638&amp;amp;height=640&amp;amp;face=0_0_638_640,https://scrap.kakaocdn.net/dn/dd2lAj/hyXObPzoq8/UCmXcE9aKs35A3mI91j3dK/img.png?width=602&amp;amp;height=574&amp;amp;face=0_0_602_574');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;MAVEN 설치 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MAVEN은 Apache Software Foundation에서 개발한 프로젝트 관리 및 빌드 자동화 도구입니다. 주로 자바 프로젝트에서 사용되지만, 다른 언어와 프레임워크에서도 활용될 수 있습니다.&amp;nbsp;프로젝트&amp;nbsp;구조&amp;nbsp;관&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;code.who494.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/Java</category>
      <category>java</category>
      <category>lincense</category>
      <category>maven</category>
      <category>라이선스</category>
      <category>오픈소스</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/22</guid>
      <comments>https://code.who494.com/entry/JAVA-%EC%96%B4%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%9D%BC%EC%9D%B4%EC%84%A0%EC%8A%A4-%ED%99%95%EC%9D%B8#entry22comment</comments>
      <pubDate>Wed, 18 Dec 2024 16:17:20 +0900</pubDate>
    </item>
    <item>
      <title>Spring Boot 다양한 설정</title>
      <link>https://code.who494.com/entry/Spring-Boot-%EB%8B%A4%EC%96%91%ED%95%9C-%EC%84%A4%EC%A0%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;어플리케이션에 프로퍼티 파일 PATH 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 부트 어플리케이션에 외부 프로퍼티 설정을 가능하도록 하는 실행 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;java -jar ./code.jar &lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;--&lt;span style=&quot;color: #006dd7;&quot;&gt;s&lt;/span&gt;pring.config.location&lt;/b&gt;&lt;/span&gt;=file:C:/GAME/application.yaml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDUXMq/btsLj0lWXLE/rx2OMJODvUVYLeKZLK70Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDUXMq/btsLj0lWXLE/rx2OMJODvUVYLeKZLK70Ok/img.png&quot; data-alt=&quot;Spring Boot 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDUXMq/btsLj0lWXLE/rx2OMJODvUVYLeKZLK70Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDUXMq%2FbtsLj0lWXLE%2Frx2OMJODvUVYLeKZLK70Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;Spring Boot 설정&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;604&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Spring Boot 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Profile 설정 부분&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 옵션 : &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-Dspring.profiles.active&lt;/span&gt;&lt;/b&gt;=dev&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스 export 환경설정 이용 : &lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;export spring_profiles_active = dev&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 설정을 하게 되면 프로퍼티 파일에서 application&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-dev&lt;/span&gt;&lt;/b&gt;.yaml 파일 또는 application&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-dev&lt;/span&gt;&lt;/b&gt;.properties를 선택해 어플리케이션이 기동된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/Spring Boot</category>
      <category>config.location</category>
      <category>profile</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/21</guid>
      <comments>https://code.who494.com/entry/Spring-Boot-%EB%8B%A4%EC%96%91%ED%95%9C-%EC%84%A4%EC%A0%95#entry21comment</comments>
      <pubDate>Sat, 14 Dec 2024 17:04:03 +0900</pubDate>
    </item>
    <item>
      <title>로드 밸런싱 (Load Balancing) vs 리버스 프록시 (Reverse Proxy) 차이</title>
      <link>https://code.who494.com/entry/%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%8B%B1-Load-Balancing-vs-%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C-Reverse-Proxy-%EC%B0%A8%EC%9D%B4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;로드 밸런싱과 리버스 프록시는 둘 다 네트워크 트래픽을 관리하는 기술이지만, 목적과 기능에서 차이가 있습니다. 아래에서 두 기술을 비교하여 설명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;988&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdqSNj/btsK07M1j1O/9UbcEvGNkk4Cm32ZQqiuA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdqSNj/btsK07M1j1O/9UbcEvGNkk4Cm32ZQqiuA1/img.png&quot; data-alt=&quot;로드 밸런싱 (Load Balancing) vs 리버스 프록시 (Reverse Proxy) 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdqSNj/btsK07M1j1O/9UbcEvGNkk4Cm32ZQqiuA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdqSNj%2FbtsK07M1j1O%2F9UbcEvGNkk4Cm32ZQqiuA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;401&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;988&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로드 밸런싱 (Load Balancing) vs 리버스 프록시 (Reverse Proxy) 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. 리버스 프록시(Reverse Proxy)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 리버스 프록시는 클라이언트의 요청을 받아 적절한 백엔드 서버에 전달하고, 서버의 응답을 다시 클라이언트로 전송하는 중개자 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 기능:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;보안 강화:&lt;/b&gt; 클라이언트와 백엔드 서버 간의 직접적인 연결을 차단하여 보안을 향상합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캐싱:&lt;/b&gt; 자주 요청되는 데이터를 캐시하여 응답 속도를 높입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SSL 종료:&lt;/b&gt; SSL 암호화 및 복호화를 처리하여 서버의 부하를 줄입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단일 접근 지점 제공:&lt;/b&gt; 여러 서버를 단일 도메인으로 통합하여 클라이언트가 하나의 주소만 접근하도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 사례:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정적 콘텐츠 제공 속도를 높이는 CDN(Content Delivery Network).&lt;/li&gt;
&lt;li&gt;외부 요청에 대한 방화벽 및 인증 처리.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 로드 밸런싱(Load Balancing)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정의:&lt;/b&gt; 로드 밸런서는 다수의 서버 간에 클라이언트 요청을 분산하여 균형을 유지하고, 서버 과부하를 방지하는 역할을 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 기능:&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;트래픽 분산:&lt;/b&gt; 여러 서버로 요청을 효율적으로 배분하여 서버의 부하를 최소화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장애 조치:&lt;/b&gt; 고가용성 및 장애 조치(failover) 특정 서버가 다운되더라도 다른 서버가 요청을 처리하도록 구성합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성:&lt;/b&gt; 서버를 추가하거나 제거함으로써 시스템의 확장성과 유연성을 보장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고급 알고리즘:&lt;/b&gt; 라운드 로빈, 최소 연결, IP 해시 등 다양한 알고리즘을 통해 요청을 분배합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 사례:&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 웹 애플리케이션에서 고가용성을 유지하는 환경.&lt;/li&gt;
&lt;li&gt;온라인 서비스의 요청 폭주를 처리하는 환경.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;주요 차이점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목리버스 프록시로드 밸런싱&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;요청 중개 및 보안, 캐싱&lt;/td&gt;
&lt;td&gt;요청 분산 및 서버 부하 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;주요 역할&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;서버와 클라이언트 간 중개&lt;/td&gt;
&lt;td&gt;서버 간 요청 균형 유지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;사용 범위&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;단일 서버 또는 서버 그룹&lt;/td&gt;
&lt;td&gt;다수의 서버로 트래픽 분산&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리버스 프록시는 주로 보안 및 성능 최적화에 중점을 두며, 로드 밸런싱은 트래픽 관리와 시스템 안정성을 목표로 합니다. 두 기술은 단독으로 사용되기도 하지만, 대규모 환경에서는 리버스 프록시가 로드 밸런서를 포함한 기능으로 확장되어 통합적으로 사용됩니다.&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>로드 밸런싱 (load balancing)</category>
      <category>리버스 프록시 (reverse proxy)</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/20</guid>
      <comments>https://code.who494.com/entry/%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%8B%B1-Load-Balancing-vs-%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C-Reverse-Proxy-%EC%B0%A8%EC%9D%B4#entry20comment</comments>
      <pubDate>Fri, 29 Nov 2024 11:20:36 +0900</pubDate>
    </item>
    <item>
      <title>L4 및 L7 로드 밸런싱이란?</title>
      <link>https://code.who494.com/entry/L4-%EB%B0%8F-L7-%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%8B%B1%EC%9D%B4%EB%9E%80</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;L4&amp;nbsp;및&amp;nbsp;L7&amp;nbsp;로드&amp;nbsp;밸런싱은&amp;nbsp;네트워크에서&amp;nbsp;트래픽을&amp;nbsp;분산시키는&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;주요&amp;nbsp;방법으로,&amp;nbsp;각각의&amp;nbsp;레이어에서&amp;nbsp;작동하는&amp;nbsp;방식과&amp;nbsp;기능이&amp;nbsp;다릅니다.&amp;nbsp;아래에서&amp;nbsp;이&amp;nbsp;두&amp;nbsp;가지&amp;nbsp;로드&amp;nbsp;밸런싱의&amp;nbsp;차이점에&amp;nbsp;대해&amp;nbsp;자세히&amp;nbsp;설명하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;967&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAwVzG/btsKYx7rSsW/ScKOBKlaeiZexV6zC3RXlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAwVzG/btsKYx7rSsW/ScKOBKlaeiZexV6zC3RXlk/img.png&quot; data-alt=&quot;L4 및 L7 로드 밸런싱(Load Balancing)이란&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAwVzG/btsKYx7rSsW/ScKOBKlaeiZexV6zC3RXlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAwVzG%2FbtsKYx7rSsW%2FScKOBKlaeiZexV6zC3RXlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;L4 및 L7 로드 밸런싱이란&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;409&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;967&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;L4 및 L7 로드 밸런싱(Load Balancing)이란&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;L4 로드 밸런싱 (Layer 4 Load Balancing)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정의&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L4&amp;nbsp;로드&amp;nbsp;밸런싱은&amp;nbsp;OSI&amp;nbsp;모델의&amp;nbsp;4계층(전송&amp;nbsp;계층)에서&amp;nbsp;작동합니다.&amp;nbsp;이&amp;nbsp;계층은&amp;nbsp;TCP&amp;nbsp;및&amp;nbsp;UDP와&amp;nbsp;같은&amp;nbsp;전송&amp;nbsp;프로토콜을&amp;nbsp;다루며,&amp;nbsp;패킷의&amp;nbsp;헤더&amp;nbsp;정보를&amp;nbsp;기반으로&amp;nbsp;트래픽을&amp;nbsp;분산합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특징&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트래픽 분산 방식: L4 로드 밸런서는 IP 주소와 포트 번호를 기반으로 클라이언트의 요청을 여러 서버로 분산합니다.&lt;br /&gt;속도:&amp;nbsp;패킷&amp;nbsp;수준에서&amp;nbsp;작동하기&amp;nbsp;때문에,&amp;nbsp;L4&amp;nbsp;로드&amp;nbsp;밸런싱은&amp;nbsp;일반적으로&amp;nbsp;빠르고&amp;nbsp;효율적입니다.&lt;br /&gt;프로토콜&amp;nbsp;지원:&amp;nbsp;TCP,&amp;nbsp;UDP&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;전송&amp;nbsp;프로토콜을&amp;nbsp;지원합니다.&lt;br /&gt;상태&amp;nbsp;비저장:&amp;nbsp;L4&amp;nbsp;로드&amp;nbsp;밸런서는&amp;nbsp;세션&amp;nbsp;정보를&amp;nbsp;저장하지&amp;nbsp;않으며,&amp;nbsp;각&amp;nbsp;요청을&amp;nbsp;독립적으로&amp;nbsp;처리합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;장점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능: 패킷 수준에서 작동하므로, 높은 처리량과 낮은 지연 시간을 제공합니다.&lt;br /&gt;간단한&amp;nbsp;설정:&amp;nbsp;상대적으로&amp;nbsp;설정이&amp;nbsp;간단하고,&amp;nbsp;다양한&amp;nbsp;프로토콜을&amp;nbsp;지원합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제한된 기능: HTTP 헤더, 쿠키, URL 등의 애플리케이션 레벨 정보에 접근할 수 없기 때문에, 복잡한 트래픽 관리가 어렵습니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;L7 로드 밸런싱 (Layer 7 Load Balancing)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L7 로드 밸런싱은 OSI 모델의 7계층(애플리케이션 계층)에서 작동합니다. 이 계층은 HTTP, HTTPS, FTP 등과 같은 애플리케이션 프로토콜을 다룹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;특징&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트래픽 분산 방식: L7 로드 밸런서는 HTTP 요청의 URL, 헤더, 쿠키 등의 정보를 분석하여 트래픽을 분산합니다.&lt;br /&gt;상태&amp;nbsp;저장:&amp;nbsp;세션&amp;nbsp;정보를&amp;nbsp;저장할&amp;nbsp;수&amp;nbsp;있어,&amp;nbsp;사용자&amp;nbsp;세션을&amp;nbsp;유지하는&amp;nbsp;데&amp;nbsp;유리합니다.&lt;br /&gt;고급&amp;nbsp;기능:&amp;nbsp;SSL&amp;nbsp;종료,&amp;nbsp;URL&amp;nbsp;리다이렉션,&amp;nbsp;콘텐츠&amp;nbsp;기반&amp;nbsp;라우팅&amp;nbsp;등&amp;nbsp;다양한&amp;nbsp;고급&amp;nbsp;기능을&amp;nbsp;제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;장점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유연성: 애플리케이션 레벨에서의 세밀한 트래픽 관리가 가능하여, 특정 요청을 특정 서버로 라우팅할 수 있습니다.&lt;br /&gt;보안:&amp;nbsp;SSL&amp;nbsp;종료&amp;nbsp;기능을&amp;nbsp;통해&amp;nbsp;보안성을&amp;nbsp;높일&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;단점&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능: L7 로드 밸런싱은 패킷을 분석하고 처리하는 데 더 많은 리소스를 소모하므로, L4보다 성능이 떨어질 수 있습니다.&lt;br /&gt;복잡성:&amp;nbsp;설정과&amp;nbsp;관리가&amp;nbsp;더&amp;nbsp;복잡할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요약&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;L4 로드 밸런싱: 전송 계층에서 작동하며, IP 주소와 포트 번호를 기반으로 트래픽을 분산. 빠르고 효율적이지만, 애플리케이션 레벨 정보에 대한 접근이 제한적입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;L7&amp;nbsp;로드&amp;nbsp;밸런싱:&amp;nbsp;애플리케이션&amp;nbsp;계층에서&amp;nbsp;작동하며,&amp;nbsp;HTTP&amp;nbsp;요청의&amp;nbsp;세부&amp;nbsp;정보를&amp;nbsp;분석하여&amp;nbsp;트래픽을&amp;nbsp;분산.&amp;nbsp;유연성과&amp;nbsp;고급&amp;nbsp;기능이&amp;nbsp;있지만,&amp;nbsp;성능과&amp;nbsp;복잡성에서&amp;nbsp;단점이&amp;nbsp;있을&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이러한&amp;nbsp;차이점을&amp;nbsp;이해하면,&amp;nbsp;특정&amp;nbsp;환경이나&amp;nbsp;요구&amp;nbsp;사항에&amp;nbsp;맞는&amp;nbsp;로드&amp;nbsp;밸런싱&amp;nbsp;방법을&amp;nbsp;선택하는&amp;nbsp;데&amp;nbsp;도움이&amp;nbsp;될&amp;nbsp;것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;참고&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSL 종료(SSL Termination) 기능이란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL 종료(SSL Termination)는 보안 연결을 처리하는 과정에서 중요한 역할을 하는 기능입니다. SSL(또는 TLS)은 클라이언트와 서버 간 데이터를 암호화하여 전송 중에 발생할 수 있는 데이터 도청이나 위변조를 방지합니다. 그러나 이 암호화와 복호화 작업은 서버의 자원을 많이 소모할 수 있습니다. SSL 종료는 이 과정을 더 효율적으로 처리하기 위해 사용됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSL 종료의 동작 원리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL 종료는 클라이언트와 서버 사이에 위치한 &lt;b&gt;로드 밸런서 또는 프록시 서버&lt;/b&gt;에서 암호화를 해제(복호화)하는 방식으로 작동합니다. 기본적으로 다음과 같은 단계로 이루어집니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;클라이언트 연결:&lt;/b&gt; 클라이언트는 SSL/TLS로 암호화된 요청을 로드 밸런서 또는 프록시 서버로 전송합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;암호 해제:&lt;/b&gt; 로드 밸런서 또는 프록시 서버가 클라이언트의 요청을 복호화합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;서버로 전송:&lt;/b&gt; 복호화된 데이터를 백엔드 서버로 전달합니다. 서버는 이 데이터를 암호화된 형태로 처리할 필요가 없습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSL 종료의 장점&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서버 성능 최적화:&lt;/b&gt; SSL/TLS 암호화와 복호화 작업은 로드 밸런서에서 처리되므로 백엔드 서버의 부담이 줄어듭니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관리 용이성:&lt;/b&gt; SSL 인증서 관리가 중앙화되어, 여러 대의 서버에 인증서를 배포할 필요가 없습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;속도 향상:&lt;/b&gt; 클라이언트 요청에 대한 응답 속도가 빨라질 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;SSL 종료의 단점&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;보안 취약점 증가:&lt;/b&gt; 복호화된 데이터가 로드 밸런서와 서버 간에 평문으로 전송되므로, 내부 네트워크 보안이 중요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추가적인 설정 필요:&lt;/b&gt; 로드 밸런서나 프록시 서버에 SSL 설정을 올바르게 구성해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;사용 사례&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL 종료는 주로 대규모 트래픽 환경에서 로드 밸런서를 사용하는 웹 애플리케이션에서 활용됩니다. 예를 들어, HTTPS를 통해 많은 사용자가 동시에 접속하는 전자상거래 웹사이트에서는 서버 부하를 줄이고 응답 속도를 높이기 위해 SSL 종료를 자주 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로, SSL 종료는 보안과 성능 사이에서 균형을 맞추기 위해 설계된 기능으로, 특히 복잡한 네트워크 환경에서 효율적인 암호화 관리에 매우 유용합니다.&lt;/p&gt;</description>
      <category>개발자를위한다양한이야기</category>
      <category>l4 로드 밸런싱</category>
      <category>l7 로드 밸런싱</category>
      <category>layer 4 load balancing</category>
      <category>layer 7 load balancing</category>
      <category>ssl 종료(ssl termination) 기능</category>
      <category>장단점</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/19</guid>
      <comments>https://code.who494.com/entry/L4-%EB%B0%8F-L7-%EB%A1%9C%EB%93%9C-%EB%B0%B8%EB%9F%B0%EC%8B%B1%EC%9D%B4%EB%9E%80#entry19comment</comments>
      <pubDate>Thu, 28 Nov 2024 15:28:10 +0900</pubDate>
    </item>
    <item>
      <title>현장에서 최신 OpenJDK를 고려할 때</title>
      <link>https://code.who494.com/entry/%ED%98%84%EC%9E%A5%EC%97%90%EC%84%9C-%EC%B5%9C%EC%8B%A0-OpenJDK%EB%A5%BC-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EB%95%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java는 썬 마이크로시스템즈(Sun Microsystem)가 처음 출시한 이후 오라클(Oracle)에서 인수하게 되면서 유료 라이센스가 필요하며 오라클이 유지 관리하게된 점이 가장 큰 변화 입니다. Oracle JDK는 Java SE 11부터 구독형 유료 모델로 전환을 했기때문에 무료 사용을 원하는 업체인 경우 OpenJDK로 전환을 해야 한다는 점 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 SDK 다운로드 사이트를 소개합니다. 아래에 들어가시면 원하는 OpenJDK를 다운로드 받으실 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jdk.java.net/archive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jdk.java.net/archive/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732757443450&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Archived OpenJDK GA Releases&quot; data-og-description=&quot;Archived OpenJDK General-Availability Releases This page is an archive of previously released builds of the JDK licensed under the GNU General Public License, version&amp;nbsp;2, with Classpath Exception. WARNING: These older versions of the JDK are provided to he&quot; data-og-host=&quot;jdk.java.net&quot; data-og-source-url=&quot;https://jdk.java.net/archive/&quot; data-og-url=&quot;https://jdk.java.net/archive/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://jdk.java.net/archive/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jdk.java.net/archive/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Archived OpenJDK GA Releases&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Archived OpenJDK General-Availability Releases This page is an archive of previously released builds of the JDK licensed under the GNU General Public License, version&amp;nbsp;2, with Classpath Exception. WARNING: These older versions of the JDK are provided to he&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;jdk.java.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선적으로 OS를 먼저 확인 후 JDK를 고려해 보는 것이 첫번째 방법이다. 먼저 각 유무로 OS에 관한 지원에 대한 JDK 생명주기를 살펴 봅시다. 아래는 RHEL이 OpenJDK를 지원하는 버전에 대한 지원을 나타내고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;567&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/DgKdO/btsKZOs1Sor/OMDPKiUeKbUVYik0ErJFUk/img.png&quot; target=&quot;&quot; title=&quot;RHEL에서 지원하는 OpenJDK 생명주기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DgKdO/btsKZOs1Sor/OMDPKiUeKbUVYik0ErJFUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDgKdO%2FbtsKZOs1Sor%2FOMDPKiUeKbUVYik0ErJFUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;RHEL에서 지원하는 OpenJDK 생명주기&quot; loading=&quot;lazy&quot; width=&quot;1054&quot; height=&quot;567&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;RHEL에서 지원하는 OpenJDK 생명주기 / www.redhat.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;458&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/k2e2q/btsKYXK0c12/6c8WVRkeO4x5mjGZzlGxfk/img.png&quot; target=&quot;&quot; title=&quot;윈도우에서 지원하는 OpenJDK 생명주기 / www.redhat.com&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k2e2q/btsKYXK0c12/6c8WVRkeO4x5mjGZzlGxfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk2e2q%2FbtsKYXK0c12%2F6c8WVRkeO4x5mjGZzlGxfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;윈도우에서 지원하는 OpenJDK 생명주기 / www.redhat.com&quot; loading=&quot;lazy&quot; width=&quot;1050&quot; height=&quot;458&quot; data-origin-width=&quot;1050&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;윈도우에서 지원하는 OpenJDK 생명주기 / www.redhat.com&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는&amp;nbsp;리눅스&amp;nbsp;배포판별&amp;nbsp;호환&amp;nbsp;JDK&amp;nbsp;버전을&amp;nbsp;정리한&amp;nbsp;표입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;672&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Es4Bq/btsKZPZMcEK/wdIqonnitdxvvwIkIwjkdK/img.png&quot; target=&quot;&quot; title=&quot;리눅스 배포판에 지원가능한 OpenJDK&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Es4Bq/btsKZPZMcEK/wdIqonnitdxvvwIkIwjkdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEs4Bq%2FbtsKZPZMcEK%2FwdIqonnitdxvvwIkIwjkdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;리눅스 배포판에 지원가능한 OpenJDK&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;672&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/a&gt;&lt;figcaption&gt;리눅스 배포판에 지원가능한 OpenJDK&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 시스템 환경에서 OpenJDK를 활요하면 비용을 낮출수 있습니다. 위 자료들이 도움이 되셨으면 좋겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 OS 구매를 하게 되면 그와 호환되는 JDK가 보통 포함되 가격이 책정되있습니다. 다만 라이센스 기간이 지나거나 계약 조건에 따라 달라지는 경우가 존재하니 구매 담당자는 정확하게 확인하고 구매하시면 좋을 듯 싶습니다.&lt;/p&gt;</description>
      <category>언어/Java</category>
      <category>jdk 생명주기</category>
      <category>openjdk</category>
      <category>리눅스</category>
      <category>윈도우</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/18</guid>
      <comments>https://code.who494.com/entry/%ED%98%84%EC%9E%A5%EC%97%90%EC%84%9C-%EC%B5%9C%EC%8B%A0-OpenJDK%EB%A5%BC-%EA%B3%A0%EB%A0%A4%ED%95%A0-%EB%95%8C#entry18comment</comments>
      <pubDate>Thu, 28 Nov 2024 10:58:41 +0900</pubDate>
    </item>
    <item>
      <title>개발 프로세스에서 Ramp-down Ramp-up phase</title>
      <link>https://code.who494.com/entry/%EA%B0%9C%EB%B0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90%EC%84%9C-Ramp-down-Ramp-up-phase</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;개발 프로세스에서 &quot;Ramp-up phase&quot;는 프로젝트 초기 단계로, 개발 팀이 본격적으로 작업을 시작하기 전에 필요한 준비 작업을 수행하는 단계입니다. 이 단계는 주로 프로젝트의 방향 설정, 도구 및 환경 설정, 그리고 초기 요구 사항 분석 등에 집중됩니다. Ramp-up phase는 프로젝트의 성공적인 진행을 위해 필수적인 기반을 마련하는 단계라고 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXOBpl/btsJWpvfrq1/1MLeQn7RJzc1JNHfwCAa4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXOBpl/btsJWpvfrq1/1MLeQn7RJzc1JNHfwCAa4k/img.png&quot; data-alt=&quot;Ramp-up, Ramp-down 개발 프로세스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXOBpl/btsJWpvfrq1/1MLeQn7RJzc1JNHfwCAa4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXOBpl%2FbtsJWpvfrq1%2F1MLeQn7RJzc1JNHfwCAa4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;585&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Ramp-up, Ramp-down 개발 프로세스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ramp-up phase의 주요 특징은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;요구 사항 분석 (Requirements Analysis)&lt;/b&gt;: 프로젝트의 전반적인 목표와 요구 사항을 명확하게 정의하고, 이해 관계자들과 협력하여 개발할 기능을 파악합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;아키텍처 설계 (Architecture Design)&lt;/b&gt;: 소프트웨어의 기본 구조를 설계하고, 시스템의 전반적인 기술 스택과 아키텍처를 결정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;개발 환경 설정 (Environment Setup)&lt;/b&gt;: 개발에 필요한 도구(예: IDE, 빌드 도구, 버전 관리 시스템 등)와 개발 서버, 데이터베이스 등 필수 환경을 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로토타입 제작 (Prototyping)&lt;/b&gt;: 주요 기능이나 핵심 모듈에 대한 간단한 프로토타입을 개발하여 기술적 타당성을 검토합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;팀 구성 및 역할 분담 (Team Formation &amp;amp; Role Assignment)&lt;/b&gt;: 팀 멤버들의 역할과 책임을 명확히 정의하고, 각자가 맡을 작업을 할당합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기 일정 수립 (Initial Scheduling)&lt;/b&gt;: 전체 프로젝트의 일정을 계획하고, 주요 마일스톤과 목표를 설정합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계는 프로젝트의 성공적인 진행을 위한 기본적인 준비를 완료하는 과정으로, 이후 개발 과정이 원활하게 진행될 수 있도록 필수적인 기반을 마련하는 데 중점을 둡니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 프로세스에서 &quot;Ramp-down phase&quot;는 소프트웨어 개발의 마지막 단계 중 하나로, 제품 출시 전 마지막 점검 및 안정화 작업을 수행하는 기간을 의미합니다. 이 단계에서는 새로운 기능 추가를 지양하고, 대신 발견된 버그 수정, 성능 최적화, 코드 정리 및 문서화 등에 집중합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ramp-down phase의 주요 특징은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;기능 동결 (Feature Freeze)&lt;/b&gt;: 새로운 기능이나 변경 사항을 추가하는 것을 중단하고, 기존 기능의 안정성 확보에 집중합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버그 수정 (Bug Fixes)&lt;/b&gt;: 제품의 최종 안정성을 위해 발견된 모든 주요 버그를 수정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;성능 및 메모리 최적화 (Performance &amp;amp; Memory Optimization)&lt;/b&gt;: 애플리케이션의 성능 및 자원 사용을 최적화하여 최종 제품의 품질을 높입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테스트 강화 (Intensive Testing)&lt;/b&gt;: 다양한 시나리오에서의 테스트를 강화하여 제품이 다양한 환경에서도 잘 동작하는지 확인합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문서화 및 배포 준비 (Documentation &amp;amp; Release Preparation)&lt;/b&gt;: 최종 릴리스를 위한 모든 문서 작업과 배포 준비 작업을 완료합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 단계는 제품의 안정성과 품질을 최종적으로 확인하고, 예상치 못한 문제를 방지하기 위한 중요한 과정입니다.&lt;/p&gt;</description>
      <category>언어/Java</category>
      <category>rampdown</category>
      <category>rampup</category>
      <category>개발프로세스</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/17</guid>
      <comments>https://code.who494.com/entry/%EA%B0%9C%EB%B0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%97%90%EC%84%9C-Ramp-down-Ramp-up-phase#entry17comment</comments>
      <pubDate>Mon, 7 Oct 2024 14:13:08 +0900</pubDate>
    </item>
    <item>
      <title>The dependencies of some of the beans in the application context form a cycle 오류</title>
      <link>https://code.who494.com/entry/The-dependencies-of-some-of-the-beans-in-the-application-context-form-a-cycle-%EC%98%A4%EB%A5%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;The dependencies of some of the beans in the application context form a cycle 스프링에서 개발을 진행하다보면 위와같은 오류를 심심치 않게 볼때가 있습니다. 아주 간단하게 위와 같은 현상을 소스코드로 만들어 볼 수 있습니다. 실제 발생되는 소스코드 모습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V5FRs/btsJs9MlSeG/S52tkkdZFnxkauaUzLDID1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V5FRs/btsJs9MlSeG/S52tkkdZFnxkauaUzLDID1/img.png&quot; data-alt=&quot;cycle오류 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V5FRs/btsJs9MlSeG/S52tkkdZFnxkauaUzLDID1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV5FRs%2FbtsJs9MlSeG%2FS52tkkdZFnxkauaUzLDID1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;238&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;cycle오류 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;말그대로, 순환 참조를 하고 있어서 그렇습니다. 당연히 순환 참조를 하지 않도록 소스 코드를 변경해 줘야합니다. 다만 스프링 부트에서 순환관계를 허용할 수 있도록 옵션이 제공됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;299&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crPAPW/btsJrJ2ul1K/nOXpgYJCNl86797wm32eC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crPAPW/btsJrJ2ul1K/nOXpgYJCNl86797wm32eC1/img.png&quot; data-alt=&quot;순환 참조 오류 소스 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crPAPW/btsJrJ2ul1K/nOXpgYJCNl86797wm32eC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrPAPW%2FbtsJrJ2ul1K%2FnOXpgYJCNl86797wm32eC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1591&quot; height=&quot;299&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;299&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순환 참조 오류 소스 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt;&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 원하는 목적은 객체들이 개별 객체를 순환 참조 가능하도록 하는 것이 목적일 것이다. 위와 같이 오류만 없애는 경우 순환관계가 깨지게 된다. 이럴때 순환관계는 해치지 않고 원래의 목적대로 사용하려면 소스 수정 없이 아래와 같이 config 설정을 추가하면 됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1725536152684&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  application:
    name: SecurityWebApplication
  main.allow-circular-references: true&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;main.allow-circular-references: true&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 위와 같은 상황은 다양한 참조 오류가 발생될 수 있으니 가급적 순환 참조 상황은 피하는 것이 정신건강에 이롭습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 아래와 같이 순환을 깨면 정상적인 기동이 이뤄집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFS1rW/btsJtduflh1/RaHPIkAPHkcIKP8MxTDpC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFS1rW/btsJtduflh1/RaHPIkAPHkcIKP8MxTDpC0/img.png&quot; data-alt=&quot;순환 참조를 해제하는 소스코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFS1rW/btsJtduflh1/RaHPIkAPHkcIKP8MxTDpC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFS1rW%2FbtsJtduflh1%2FRaHPIkAPHkcIKP8MxTDpC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1591&quot; height=&quot;305&quot; data-origin-width=&quot;1591&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;순환 참조를 해제하는 소스코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>언어/Spring Frame Work</category>
      <category>main.allow-circular-references</category>
      <category>Spring</category>
      <category>순환참조오류</category>
      <category>순환참조해법</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/16</guid>
      <comments>https://code.who494.com/entry/The-dependencies-of-some-of-the-beans-in-the-application-context-form-a-cycle-%EC%98%A4%EB%A5%98#entry16comment</comments>
      <pubDate>Thu, 5 Sep 2024 21:31:16 +0900</pubDate>
    </item>
    <item>
      <title>오토클릭 Auto Click</title>
      <link>https://code.who494.com/entry/%EC%98%A4%ED%86%A0%ED%81%B4%EB%A6%AD-Auto-Click</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 화면 잠김을 막기 위해 사용하는 간단한 툴 입니다. 자바가 설치되 있으면 사용 가능합니다. 사용하 실 분은 댓글 달아 주세요 암호 알려 드리겠습니다. 감사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;89&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwwG0e/btsJmaqLl8W/X0FcsNIHxCHVkPmwTfs35K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwwG0e/btsJmaqLl8W/X0FcsNIHxCHVkPmwTfs35K/img.png&quot; data-alt=&quot;실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwwG0e/btsJmaqLl8W/X0FcsNIHxCHVkPmwTfs35K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwwG0e%2FbtsJmaqLl8W%2FX0FcsNIHxCHVkPmwTfs35K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;285&quot; height=&quot;89&quot; data-origin-width=&quot;285&quot; data-origin-height=&quot;89&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 텍스트 박스는 클릭 빈도를 입력하는 칸 입니다. ms 단위이니 스크린샷 기준으로는 5초 후 자동 클릭이 이루어 집니다. 실행을 위해서는 Start 버튼을 누르면 시작되고 Stop 버튼을 누르면 중지 됩니다. 다만 너무 빠르게 빈도를 낮추면 마우스로는 제어가 안될수도 있으니 그점만 유의해 사용하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HmVOA/btsJkoRIBSR/O0kwuQFUEo0ebZkURnC23k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HmVOA/btsJkoRIBSR/O0kwuQFUEo0ebZkURnC23k/img.png&quot; data-alt=&quot;Start 버튼을 누른 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HmVOA/btsJkoRIBSR/O0kwuQFUEo0ebZkURnC23k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHmVOA%2FbtsJkoRIBSR%2FO0kwuQFUEo0ebZkURnC23k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;290&quot; height=&quot;88&quot; data-origin-width=&quot;290&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Start 버튼을 누른 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;98&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN9rlF/btsJkyzT07Y/mDuQa4YgwLQBLHcehOCZd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN9rlF/btsJkyzT07Y/mDuQa4YgwLQBLHcehOCZd1/img.png&quot; data-alt=&quot;Stop을 누른 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN9rlF/btsJkyzT07Y/mDuQa4YgwLQBLHcehOCZd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN9rlF%2FbtsJkyzT07Y%2FmDuQa4YgwLQBLHcehOCZd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;98&quot; data-origin-width=&quot;288&quot; data-origin-height=&quot;98&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Stop을 누른 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 프로그램으로 자주 잠기는 화면일때 사용해 보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/cGteWd/btsJmlyQE5Y/ts7DKqpbtnfFpERH2dtRLk/AutoClick.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;AutoClick.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.03MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;!-- [디플/수평] 코드이야기-하단고정 --&gt; &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>tool download</category>
      <category>암호는 댓글요청</category>
      <category>오토클릭</category>
      <category>자바버전</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/13</guid>
      <comments>https://code.who494.com/entry/%EC%98%A4%ED%86%A0%ED%81%B4%EB%A6%AD-Auto-Click#entry13comment</comments>
      <pubDate>Fri, 30 Aug 2024 14:16:33 +0900</pubDate>
    </item>
    <item>
      <title>최신버전 openssl 설치</title>
      <link>https://code.who494.com/entry/%EC%B5%9C%EC%8B%A0%EB%B2%84%EC%A0%84-openssl-%EC%84%A4%EC%B9%98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;인증서 관련 작업을 하기위해 openssl 도구가 필요합니다. 우선 사이트에서 openssl 최신버전을 다운로드 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 시점 최신 버전은 3.3.1 버전 입니다. linux 버전이니 windows 버전은 &lt;a title=&quot;openssl&quot; href=&quot;https://slproweb.com/products/Win32OpenSSL.html&quot;&gt;여기&lt;/a&gt;를 참고하시기 바랍니다. 설치시 root 권한이 필요합니다. 항상 권한에 대한 체크를 잘 해주시기 바랍니다. sudo 실행 권한 또는 root 권한이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. openssl 설치파일을 공식 사이트를 통해 다운로드 받습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;236&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yt1of/btsJjW7Pvtp/nsHOE0TbW7ZrRGgavWQEdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yt1of/btsJjW7Pvtp/nsHOE0TbW7ZrRGgavWQEdK/img.png&quot; data-alt=&quot;최신 버전 정보 / openssl 공식 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yt1of/btsJjW7Pvtp/nsHOE0TbW7ZrRGgavWQEdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyt1of%2FbtsJjW7Pvtp%2FnsHOE0TbW7ZrRGgavWQEdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;236&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;236&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최신 버전 정보 / openssl 공식 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;figure id=&quot;og_1724915759511&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Downloads&quot; data-og-description=&quot;The master sources are maintained in our git repository, which is accessible over the network and cloned on GitHub, at https://github.com/openssl/openssl. Bugs and pull patches (issues and pull requests) should be filed on the GitHub repo. Please familiari&quot; data-og-host=&quot;openssl-library.org&quot; data-og-source-url=&quot;https://openssl-library.org/source/&quot; data-og-url=&quot;https://openssl-library.org/source/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://openssl-library.org/source/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://openssl-library.org/source/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Downloads&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The master sources are maintained in our git repository, which is accessible over the network and cloned on GitHub, at https://github.com/openssl/openssl. Bugs and pull patches (issues and pull requests) should be filed on the GitHub repo. Please familiari&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;openssl-library.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 받은 파일을 적절한 폴더에서 압축을 해제 합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;tar -xvf openssl-3.3.1.tar.gz&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;18&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd8v6U/btsJkwnrciR/1FY6LbSwEgrUmTiKSK10Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd8v6U/btsJkwnrciR/1FY6LbSwEgrUmTiKSK10Yk/img.png&quot; data-alt=&quot;openssl 압축해제 폴더&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd8v6U/btsJkwnrciR/1FY6LbSwEgrUmTiKSK10Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd8v6U%2FbtsJkwnrciR%2F1FY6LbSwEgrUmTiKSK10Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;136&quot; height=&quot;18&quot; data-origin-width=&quot;136&quot; data-origin-height=&quot;18&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;openssl 압축해제 폴더&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 해제한 폴더로 들어가 아래 명령을 순서대로 실행합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;./config&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;sudo ldconfig /usr/local/lib64/&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 설치가 잘 마무리 되었으면 openssl 명령어를 입력해 설치가 잘 됐는지 확인합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;openssl version&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;22&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsX36N/btsJi55w3S8/nQ7ky2zdkuxRNqkIQNY3F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsX36N/btsJi55w3S8/nQ7ky2zdkuxRNqkIQNY3F0/img.png&quot; data-alt=&quot;설치 버전 확인 메세지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsX36N/btsJi55w3S8/nQ7ky2zdkuxRNqkIQNY3F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsX36N%2FbtsJi55w3S8%2FnQ7ky2zdkuxRNqkIQNY3F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;22&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;22&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 버전 확인 메세지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>linux</category>
      <category>install</category>
      <category>openssl</category>
      <category>설치</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/11</guid>
      <comments>https://code.who494.com/entry/%EC%B5%9C%EC%8B%A0%EB%B2%84%EC%A0%84-openssl-%EC%84%A4%EC%B9%98#entry11comment</comments>
      <pubDate>Thu, 29 Aug 2024 16:28:41 +0900</pubDate>
    </item>
    <item>
      <title>TCP UDP 포트확인 port 접속 명령어 실행</title>
      <link>https://code.who494.com/entry/TCP-UDP-%ED%8F%AC%ED%8A%B8%ED%99%95%EC%9D%B8-port-%EC%A0%91%EC%86%8D-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;보통 윈도우와 리눅스에서 서비스 되고 있는 포트 확인이 필요합니다. 보통 TCP 확인을 주로 사용하는 UDP 프로그램을 개발하는 경우 간단하게 포트 Open 여부와 쿼리를 날려볼 도구가 필요 합니니다. linux의 경우 다양한 툴을 제공해 간단히 체크가 가능하 반면 윈도우는 특별한 툴을 제공하지 않아 서비스 확인에 애를 먹습니다. 하나씩 확인하는 작업을 해보도록 하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WL2J9/btsIXnSXJPN/Oqqo3QkeaWRpGwmMa0kFnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WL2J9/btsIXnSXJPN/Oqqo3QkeaWRpGwmMa0kFnk/img.png&quot; data-alt=&quot;TCP UDP 포트확인 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WL2J9/btsIXnSXJPN/Oqqo3QkeaWRpGwmMa0kFnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWL2J9%2FbtsIXnSXJPN%2FOqqo3QkeaWRpGwmMa0kFnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;650&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TCP UDP 포트확인 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TCP&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;linux&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 명령어를 실행하는 경우&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;netstat -tulpn | grep LISTEN&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPp3qm/btsIYZwHVtg/VrlukOhhidD5gUlFpbwPgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPp3qm/btsIYZwHVtg/VrlukOhhidD5gUlFpbwPgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPp3qm/btsIYZwHVtg/VrlukOhhidD5gUlFpbwPgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPp3qm%2FbtsIYZwHVtg%2FVrlukOhhidD5gUlFpbwPgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;261&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;t&lt;/b&gt;: Show only TCP sockets.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;u&lt;/b&gt;: Show only UDP sockets.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;l&lt;/b&gt;: Show listening sockets.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;p&lt;/b&gt;: Show the name of the process that opened the socket.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n&lt;/b&gt;: Do not try to resolve service names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 의미를 가진다. 만약 tcp만 검색하고 싶다면 아래와 같다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;netstat -ulpn | grep LISTEN&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;windows&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 명령어 실행시 UDP 관련 목록만 검색이 가능하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;netstat -bano | find &quot;UDP&quot;&lt;/blockquote&gt;
&lt;pre id=&quot;code_1723101928511&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Windows\system32&amp;gt;netstat -bano | find &quot;UDP&quot;
  UDP    0.0.0.0:53             *:*                                    3708
  UDP    0.0.0.0:123            *:*                                    8736
  UDP    0.0.0.0:3702           *:*                                    8228
  UDP    0.0.0.0:3702           *:*                                    8228
  UDP    0.0.0.0:5050           *:*                                    10092
  UDP    0.0.0.0:5353           *:*                                    5520
  UDP    172.27.224.1:67        *:*                                    3708
  UDP    172.27.224.1:68        *:*                                    3708
  UDP    172.27.224.1:137       *:*                                    4
  UDP    172.27.224.1:138       *:*                                    4
  UDP    172.27.224.1:1900      *:*                                    3648&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행된 프로그램명까지 확인이 가능하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;netstat -bano | more&lt;/blockquote&gt;
&lt;pre id=&quot;code_1723102141238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;netstat -bano | more

활성 연결

  프로토콜  로컬 주소              외부 주소              상태            PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       17064
 [javaw.exe]
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1224
  RpcSs
 [svchost.exe]
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
 소유권 정보를 가져올 수 없습니다.
  TCP    0.0.0.0:843            0.0.0.0:0              LISTENING       4780
 [iSASWebLauncher.exe]
  TCP    0.0.0.0:2179           0.0.0.0:0              LISTENING       2572
 [vmms.exe]
  TCP    0.0.0.0:5040           0.0.0.0:0              LISTENING       10092
  CDPSvc
 [svchost.exe]
  TCP    0.0.0.0:5357           0.0.0.0:0              LISTENING       4
 소유권 정보를 가져올 수 없습니다.
  TCP    0.0.0.0:14430          0.0.0.0:0              LISTENING       17660
 [시스템]
  TCP    0.0.0.0:14440          0.0.0.0:0              LISTENING       17660
 [시스템]
  TCP    0.0.0.0:42235          0.0.0.0:0              LISTENING       17812
 [MagicLine4NX.exe]
  TCP    0.0.0.0:49664          0.0.0.0:0              LISTENING       532
 [lsass.exe]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;TCP UDP 포트 연결 명령어 실행 방법&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;TCP&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tcp는 linux, windows 모두 동일하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;telnet 127.0.0.1 80&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 telnet ip port 이와 같은 형식의 문법이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UDP&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tcp는 linux, windows 다르다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;linux의 경우에는 아래와 같다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;nc -zvu 127.0.0.1 30000&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;windows의 경우에는 특별한 툴이 존재한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;PortQryUi&quot; href=&quot;https://www.microsoft.com/en-us/download/details.aspx?id=24009&quot;&gt;PortQryUI&amp;nbsp;-&amp;nbsp;User&amp;nbsp;Interface&amp;nbsp;for&amp;nbsp;the&amp;nbsp;PortQry&amp;nbsp;Command&amp;nbsp;Line&amp;nbsp;Port&amp;nbsp;Scanner&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행화면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfolKz/btsIYUvs6Jj/gNJNNODDl9FCrakBA0pcdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfolKz/btsIYUvs6Jj/gNJNNODDl9FCrakBA0pcdK/img.png&quot; data-alt=&quot;port Query 실행화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfolKz/btsIYUvs6Jj/gNJNNODDl9FCrakBA0pcdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfolKz%2FbtsIYUvs6Jj%2FgNJNNODDl9FCrakBA0pcdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;408&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;port Query 실행화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 화면에서 원하는 ip를 입력하고 Query 버튼을 누르면 전체 포트를 모두 접속하고 명령 실행까지 완료후 그 결과를 Query Result: 창에 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx11zT/btsIZlfgcIS/DYTz6KClqVaXYNHA3WkPjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx11zT/btsIZlfgcIS/DYTz6KClqVaXYNHA3WkPjk/img.png&quot; data-alt=&quot;Manually로 선택시 포트 번호를 범위 단위로 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx11zT/btsIZlfgcIS/DYTz6KClqVaXYNHA3WkPjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx11zT%2FbtsIZlfgcIS%2FDYTz6KClqVaXYNHA3WkPjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;320&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;320&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Manually로 선택시 포트 번호를 범위 단위로 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 포트 번호를 메뉴얼로 선택해 지정 가능하다. 콤마로 구분해 다양한 범위를 설정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/7TJPz/btsIYdvxFnL/NJkzZ2wsLkMxKAA4D3GOt0/PortQryUI.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;PortQryUI.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.12MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 파일을 다운받기 어려운경우 windows면 위 파일을 다운받고 사용해도 무방하다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;</description>
      <category>linux</category>
      <category>NC</category>
      <category>netstat</category>
      <category>PortQryUI</category>
      <category>TCP</category>
      <category>Telnet</category>
      <category>UDP</category>
      <category>포트확인</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/9</guid>
      <comments>https://code.who494.com/entry/TCP-UDP-%ED%8F%AC%ED%8A%B8%ED%99%95%EC%9D%B8-port-%EC%A0%91%EC%86%8D-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%8B%A4%ED%96%89#entry9comment</comments>
      <pubDate>Thu, 8 Aug 2024 16:55:12 +0900</pubDate>
    </item>
    <item>
      <title>apt install yum 다음 패키지의 의존성이 맞지 않습니다</title>
      <link>https://code.who494.com/entry/apt-install-yum-%EB%8B%A4%EC%9D%8C-%ED%8C%A8%ED%82%A4%EC%A7%80%EC%9D%98-%EC%9D%98%EC%A1%B4%EC%84%B1%EC%9D%B4-%EB%A7%9E%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;apt install yum 프로그램을 설치하려고 아래와 같은 명령을 실행 했는데 다음 패키지의 의존성이 맞지 않습니다라는 오류가 뜨는 경우가 종종 발생하게 됩니다. 그럴때 당황하지 마시고 아래와 같은 순서대로 명령을 차근 차근 따라가보시면 오류에 정답이 있는게 눈에 보이실 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목을 입력해주세요_-001 (2) (1).png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmDPCU/btsINLMAMrF/RZc6Umfy3VWVnFDU9JLfZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmDPCU/btsINLMAMrF/RZc6Umfy3VWVnFDU9JLfZK/img.png&quot; data-alt=&quot;apt install yum&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmDPCU/btsINLMAMrF/RZc6Umfy3VWVnFDU9JLfZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmDPCU%2FbtsINLMAMrF%2FRZc6Umfy3VWVnFDU9JLfZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;891&quot; data-filename=&quot;제목을 입력해주세요_-001 (2) (1).png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apt install yum&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721958791949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt install yum
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료
몇몇 패키지를 설치할 수 없습니다. 요청한 상황이 불가능할 수도 있고,
불안정 배포판을 사용해서 일부 필요한 패키지를 아직 만들지 않았거나,
아직 Incoming에서 나오지 않은 경우일 수도 있습니다.
이 상황을 해결하는데 다음 정보가 도움이 될 수도 있습니다:

다음 패키지의 의존성이 맞지 않습니다:
 python-rpm : 의존: rpm-common (= 4.14.1+dfsg1-2) 하지만 4.17.0+dfsg1-4build1 패키지를 설치할 것입니다
 python3-six : 망가뜨림: libpython-stdlib (&amp;lt; 2.7.18) 하지만 2.7.15~rc1-1 패키지를 설치할 것입니다
               망가뜨림: python-minimal (&amp;lt; 2.7.18) 하지만 2.7.15~rc1-1 패키지를 설치할 것입니다
 python3-yaml : 망가뜨림: libpython-stdlib (&amp;lt; 2.7.18) 하지만 2.7.15~rc1-1 패키지를 설치할 것입니다
                망가뜨림: python-minimal (&amp;lt; 2.7.18) 하지만 2.7.15~rc1-1 패키지를 설치할 것입니다
E: 오류, pkgProblemResolver::Resolve가 망가졌습니다. 고정 패키지때문에 발생할 수도 있습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 오류 내용 중 제일 마지막 Resolve가 망가졌습니다. 고정 패키지때문에 발생할 수도 있습니다. 이분이 가장 중요한 메세지 입니다. 아래와 같이 명령을 실행 합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;apt-get install rpm-common=4.14.1+dfsg1-2&lt;/blockquote&gt;
&lt;pre id=&quot;code_1721961977102&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료
다음의 추가 패키지가 설치될 것입니다 :
  liblua5.2-0 librpm8 librpmio8
다음 새 패키지를 설치할 것입니다:
  liblua5.2-0 librpm8 librpmio8 rpm-common
0개 업그레이드, 4개 새로 설치, 0개 제거 및 106개 업그레이드 안 함.
402 k바이트 아카이브를 받아야 합니다.
이 작업 후 1,616 k바이트의 디스크 공간을 더 사용하게 됩니다.
계속 하시겠습니까? [Y/n] Y
받기:1 http://kr.archive.ubuntu.com/ubuntu jammy/universe amd64 liblua5.2-0 amd64 5.2.4-2 [125 kB]
받기:2 http://archive.ubuntu.com/ubuntu bionic/universe amd64 librpmio8 amd64 4.14.1+dfsg1-2 [74.6 kB]
받기:3 http://archive.ubuntu.com/ubuntu bionic/universe amd64 librpm8 amd64 4.14.1+dfsg1-2 [173 kB]
받기:4 http://archive.ubuntu.com/ubuntu bionic/universe amd64 rpm-common amd64 4.14.1+dfsg1-2 [28.7 kB]
내려받기 402 k바이트, 소요시간 3초 (158 k바이트/초)
Selecting previously unselected package liblua5.2-0:amd64.
(데이터베이스 읽는중 ...현재 302897개의 파일과 디렉터리가 설치되어 있습니다.)
Preparing to unpack .../liblua5.2-0_5.2.4-2_amd64.deb ...
Unpacking liblua5.2-0:amd64 (5.2.4-2) ...
Selecting previously unselected package librpmio8.
Preparing to unpack .../librpmio8_4.14.1+dfsg1-2_amd64.deb ...
Unpacking librpmio8 (4.14.1+dfsg1-2) ...
Selecting previously unselected package librpm8.
Preparing to unpack .../librpm8_4.14.1+dfsg1-2_amd64.deb ...
Unpacking librpm8 (4.14.1+dfsg1-2) ...
Selecting previously unselected package rpm-common.
Preparing to unpack .../rpm-common_4.14.1+dfsg1-2_amd64.deb ...
Unpacking rpm-common (4.14.1+dfsg1-2) ...
liblua5.2-0:amd64 (5.2.4-2) 설정하는 중입니다 ...
librpmio8 (4.14.1+dfsg1-2) 설정하는 중입니다 ...
librpm8 (4.14.1+dfsg1-2) 설정하는 중입니다 ...
rpm-common (4.14.1+dfsg1-2) 설정하는 중입니다 ...
Processing triggers for libc-bin (2.35-0ubuntu3.8) ...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행을 마치면 망가진 프로그램들이 잘 설치가 된 것입니다. 이후 원하는 작업을 진행 하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 apt install yum 설치가 계속 안되시면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;apt install yum4&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;룰 사용하시면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>linux</category>
      <category>apt</category>
      <category>yum install</category>
      <category>yum4</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/8</guid>
      <comments>https://code.who494.com/entry/apt-install-yum-%EB%8B%A4%EC%9D%8C-%ED%8C%A8%ED%82%A4%EC%A7%80%EC%9D%98-%EC%9D%98%EC%A1%B4%EC%84%B1%EC%9D%B4-%EB%A7%9E%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4#entry8comment</comments>
      <pubDate>Fri, 26 Jul 2024 12:09:44 +0900</pubDate>
    </item>
    <item>
      <title>apt update 다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다</title>
      <link>https://code.who494.com/entry/apt-update-%EB%8B%A4%EC%9D%8C-%EC%84%9C%EB%AA%85%EB%93%A4%EC%9D%80-%EA%B3%B5%EA%B0%9C%ED%82%A4%EA%B0%80-%EC%97%86%EA%B8%B0-%EB%95%8C%EB%AC%B8%EC%97%90-%EC%9D%B8%EC%A6%9D%ED%95%A0-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;제목을 입력해주세요_-001 (1).png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;891&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8qeik/btsIOTQoXHm/gOnMLY3UaDfYkz61OTDQF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8qeik/btsIOTQoXHm/gOnMLY3UaDfYkz61OTDQF1/img.png&quot; data-alt=&quot;apt update&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8qeik/btsIOTQoXHm/gOnMLY3UaDfYkz61OTDQF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8qeik%2FbtsIOTQoXHm%2FgOnMLY3UaDfYkz61OTDQF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;891&quot; data-filename=&quot;제목을 입력해주세요_-001 (1).png&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;891&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;apt update&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;apt update 명령을 실행하면 중간에 아래와 같은 오류가 발생 될 수 있습니다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;apt update&lt;/blockquote&gt;
&lt;pre id=&quot;code_1721957560128&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;무시:1 https://apt.datadoghq.com stable InRelease
기존:2 https://apt.datadoghq.com stable Release
기존:4 http://security.ubuntu.com/ubuntu jammy-security InRelease
기존:5 http://kr.archive.ubuntu.com/ubuntu jammy InRelease
기존:6 http://kr.archive.ubuntu.com/ubuntu jammy-updates InRelease
받기:7 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
기존:8 http://kr.archive.ubuntu.com/ubuntu jammy-backports InRelease
기존:9 https://ppa.launchpadcontent.net/ethereum/ethereum/ubuntu jammy InRelease
받기:10 http://archive.ubuntu.com/ubuntu bionic-security InRelease [102 kB]
오류:7 http://archive.ubuntu.com/ubuntu bionic InRelease
  다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY 3B4FE6ACC0B21F32
받기:11 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [102 kB]
오류:10 http://archive.ubuntu.com/ubuntu bionic-security InRelease
  다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY 3B4FE6ACC0B21F32
오류:11 http://archive.ubuntu.com/ubuntu bionic-updates InRelease
  다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY 3B4FE6ACC0B21F32
패키지 목록을 읽는 중입니다... 완료
W: GPG 오류: http://archive.ubuntu.com/ubuntu bionic InRelease: 다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY 3B4FE6ACC0B21F32
E: The repository 'http://archive.ubuntu.com/ubuntu bionic InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: GPG 오류: http://archive.ubuntu.com/ubuntu bionic-security InRelease: 다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY 3B4FE6ACC0B21F32
E: The repository 'http://archive.ubuntu.com/ubuntu bionic-security InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
W: GPG 오류: http://archive.ubuntu.com/ubuntu bionic-updates InRelease: 다음 서명들은 공개키가 없기 때문에 인증할 수 없습니다: NO_PUBKEY 3B4FE6ACC0B21F32
E: The repository 'http://archive.ubuntu.com/ubuntu bionic-updates InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 메세지에서 눈여겨 볼 부분은 : NO_PUBKEY 3B4FE6ACC0B21F32 이 부분 입니다. 현재 본인 서버에 3B4FE6ACC0B21F32 에 해당하는 공개키가 없어 아래 주소로 받는 다양한 것들을 인정할 수 없다는 이야기 입니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;http://archive.ubuntu.com/ubuntu&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해결 방법은 아주 간단하다 공개키를 등록해주면 됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32&lt;/blockquote&gt;
&lt;pre id=&quot;code_1721957928343&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
Executing: /tmp/apt-key-gpghome.yS8uVixTCp/gpg.1.sh --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32
gpg: key 3B4FE6ACC0B21F32: public key &quot;Ubuntu Archive Automatic Signing Key (2012) &amp;lt;ftpmaster@ubuntu.com&amp;gt;&quot; imported
gpg: Total number processed: 1
gpg:               imported: 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 한번 apt update 를 실행해주시면&lt;/p&gt;
&lt;pre id=&quot;code_1721958088736&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/etc/apt# apt update
무시:1 https://apt.datadoghq.com stable InRelease
기존:2 https://apt.datadoghq.com stable Release
기존:4 http://kr.archive.ubuntu.com/ubuntu jammy InRelease
받기:5 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]
받기:6 http://kr.archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]
기존:7 https://ppa.launchpadcontent.net/ethereum/ethereum/ubuntu jammy InRelease
기존:8 http://kr.archive.ubuntu.com/ubuntu jammy-backports InRelease
받기:9 http://kr.archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [1,888 kB]
받기:10 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
받기:11 http://kr.archive.ubuntu.com/ubuntu jammy-updates/main i386 Packages [672 kB]
받기:12 http://kr.archive.ubuntu.com/ubuntu jammy-updates/universe i386 Packages [723 kB]
받기:13 http://kr.archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1,108 kB]
받기:14 http://archive.ubuntu.com/ubuntu bionic-security InRelease [102 kB]
받기:15 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [102 kB]
받기:16 http://archive.ubuntu.com/ubuntu bionic/main i386 Packages [1,007 kB]
받기:17 http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages [1,019 kB]
받기:18 http://archive.ubuntu.com/ubuntu bionic/main Translation-ko [215 kB]
받기:19 http://archive.ubuntu.com/ubuntu bionic/main Translation-en [516 kB]
받기:20 http://archive.ubuntu.com/ubuntu bionic/main amd64 DEP-11 Metadata [477 kB]
받기:21 http://archive.ubuntu.com/ubuntu bionic/main DEP-11 48x48 Icons [118 kB]
받기:22 http://archive.ubuntu.com/ubuntu bionic/main DEP-11 64x64 Icons [245 kB]
받기:23 http://archive.ubuntu.com/ubuntu bionic/main DEP-11 64x64@2 Icons [29 B]
받기:24 http://archive.ubuntu.com/ubuntu bionic/restricted amd64 Packages [9,184 B]
받기:25 http://archive.ubuntu.com/ubuntu bionic/restricted i386 Packages [9,156 B]
받기:26 http://archive.ubuntu.com/ubuntu bionic/restricted Translation-ko [308 B]
받기:27 http://archive.ubuntu.com/ubuntu bionic/restricted Translation-en [3,584 B]
받기:28 http://archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [8,570 kB]
받기:29 http://archive.ubuntu.com/ubuntu bionic/universe i386 Packages [8,531 kB]
받기:30 http://archive.ubuntu.com/ubuntu bionic/universe Translation-en [4,941 kB]
받기:31 http://archive.ubuntu.com/ubuntu bionic/universe Translation-ko [458 kB]
받기:32 http://archive.ubuntu.com/ubuntu bionic/universe amd64 DEP-11 Metadata [3,287 kB]
받기:33 http://archive.ubuntu.com/ubuntu bionic/universe DEP-11 48x48 Icons [2,151 kB]
받기:34 http://archive.ubuntu.com/ubuntu bionic/universe DEP-11 64x64 Icons [8,420 kB]
받기:35 http://archive.ubuntu.com/ubuntu bionic/universe DEP-11 64x64@2 Icons [29 B]
받기:36 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [151 kB]
받기:37 http://archive.ubuntu.com/ubuntu bionic/multiverse i386 Packages [144 kB]
받기:38 http://archive.ubuntu.com/ubuntu bionic/multiverse Translation-ko [492 B]
받기:39 http://archive.ubuntu.com/ubuntu bionic/multiverse Translation-en [108 kB]
받기:40 http://archive.ubuntu.com/ubuntu bionic/multiverse amd64 DEP-11 Metadata [49.7 kB]
받기:41 http://archive.ubuntu.com/ubuntu bionic/multiverse DEP-11 48x48 Icons [8,931 B]
받기:42 http://archive.ubuntu.com/ubuntu bionic/multiverse DEP-11 64x64 Icons [225 kB]
받기:43 http://archive.ubuntu.com/ubuntu bionic/multiverse DEP-11 64x64@2 Icons [29 B]
받기:44 http://archive.ubuntu.com/ubuntu bionic-security/main i386 Packages [1,379 kB]
받기:45 http://archive.ubuntu.com/ubuntu bionic-security/main amd64 Packages [2,717 kB]
받기:46 http://archive.ubuntu.com/ubuntu bionic-security/main Translation-en [467 kB]
받기:47 http://archive.ubuntu.com/ubuntu bionic-security/main amd64 DEP-11 Metadata [76.8 kB]
받기:48 http://archive.ubuntu.com/ubuntu bionic-security/main DEP-11 48x48 Icons [31.1 kB]
받기:49 http://archive.ubuntu.com/ubuntu bionic-security/main DEP-11 64x64 Icons [67.9 kB]
받기:50 http://archive.ubuntu.com/ubuntu bionic-security/main DEP-11 64x64@2 Icons [29 B]
받기:51 http://archive.ubuntu.com/ubuntu bionic-security/restricted i386 Packages [33.0 kB]
받기:52 http://archive.ubuntu.com/ubuntu bionic-security/restricted amd64 Packages [1,317 kB]
받기:53 http://archive.ubuntu.com/ubuntu bionic-security/restricted Translation-en [182 kB]
받기:54 http://archive.ubuntu.com/ubuntu bionic-security/restricted amd64 DEP-11 Metadata [208 B]
받기:55 http://archive.ubuntu.com/ubuntu bionic-security/restricted DEP-11 48x48 Icons [29 B]
받기:56 http://archive.ubuntu.com/ubuntu bionic-security/restricted DEP-11 64x64 Icons [29 B]
받기:57 http://archive.ubuntu.com/ubuntu bionic-security/restricted DEP-11 64x64@2 Icons [29 B]
받기:58 http://archive.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [1,303 kB]
받기:59 http://archive.ubuntu.com/ubuntu bionic-security/universe i386 Packages [1,078 kB]
받기:60 http://archive.ubuntu.com/ubuntu bionic-security/universe Translation-en [308 kB]
받기:61 http://archive.ubuntu.com/ubuntu bionic-security/universe amd64 DEP-11 Metadata [62.5 kB]
받기:62 http://archive.ubuntu.com/ubuntu bionic-security/universe DEP-11 48x48 Icons [35.8 kB]
받기:63 http://archive.ubuntu.com/ubuntu bionic-security/universe DEP-11 64x64 Icons [152 kB]
받기:64 http://archive.ubuntu.com/ubuntu bionic-security/universe DEP-11 64x64@2 Icons [29 B]
받기:65 http://archive.ubuntu.com/ubuntu bionic-security/multiverse i386 Packages [6,008 B]
받기:66 http://archive.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [19.8 kB]
받기:67 http://archive.ubuntu.com/ubuntu bionic-security/multiverse Translation-en [3,928 B]
받기:68 http://archive.ubuntu.com/ubuntu bionic-security/multiverse amd64 DEP-11 Metadata [2,464 B]
받기:69 http://archive.ubuntu.com/ubuntu bionic-security/multiverse DEP-11 48x48 Icons [29 B]
받기:70 http://archive.ubuntu.com/ubuntu bionic-security/multiverse DEP-11 64x64 Icons [2,638 B]
받기:71 http://archive.ubuntu.com/ubuntu bionic-security/multiverse DEP-11 64x64@2 Icons [29 B]
받기:72 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [3,044 kB]
받기:73 http://archive.ubuntu.com/ubuntu bionic-updates/main i386 Packages [1,666 kB]
받기:74 http://archive.ubuntu.com/ubuntu bionic-updates/main Translation-en [554 kB]
받기:75 http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 DEP-11 Metadata [297 kB]
받기:76 http://archive.ubuntu.com/ubuntu bionic-updates/main DEP-11 48x48 Icons [82.8 kB]
받기:77 http://archive.ubuntu.com/ubuntu bionic-updates/main DEP-11 64x64 Icons [154 kB]
받기:78 http://archive.ubuntu.com/ubuntu bionic-updates/main DEP-11 64x64@2 Icons [29 B]
받기:79 http://archive.ubuntu.com/ubuntu bionic-updates/restricted i386 Packages [39.7 kB]
받기:80 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [1,347 kB]
받기:81 http://archive.ubuntu.com/ubuntu bionic-updates/restricted Translation-en [187 kB]
받기:82 http://archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 DEP-11 Metadata [212 B]
받기:83 http://archive.ubuntu.com/ubuntu bionic-updates/restricted DEP-11 48x48 Icons [29 B]
받기:84 http://archive.ubuntu.com/ubuntu bionic-updates/restricted DEP-11 64x64 Icons [29 B]
받기:85 http://archive.ubuntu.com/ubuntu bionic-updates/restricted DEP-11 64x64@2 Icons [29 B]
받기:86 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1,914 kB]
받기:87 http://archive.ubuntu.com/ubuntu bionic-updates/universe i386 Packages [1,663 kB]
받기:88 http://archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [421 kB]
받기:89 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 DEP-11 Metadata [304 kB]
받기:90 http://archive.ubuntu.com/ubuntu bionic-updates/universe DEP-11 48x48 Icons [237 kB]
받기:91 http://archive.ubuntu.com/ubuntu bionic-updates/universe DEP-11 64x64 Icons [521 kB]
받기:92 http://archive.ubuntu.com/ubuntu bionic-updates/universe DEP-11 64x64@2 Icons [29 B]
받기:93 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [25.6 kB]
받기:94 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse i386 Packages [11.2 kB]
받기:95 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse Translation-en [6,088 B]
받기:96 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 DEP-11 Metadata [2,468 B]
받기:97 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse DEP-11 48x48 Icons [29 B]
받기:98 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse DEP-11 64x64 Icons [2,638 B]
받기:99 http://archive.ubuntu.com/ubuntu bionic-updates/multiverse DEP-11 64x64@2 Icons [29 B]
내려받기 67.5 M바이트, 소요시간 32초 (2,132 k바이트/초)
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다... 완료
상태 정보를 읽는 중입니다... 완료&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 다양한 목록들을 받아볼수 있는 결과를 보실 수 있습니다.&lt;/p&gt;</description>
      <category>linux</category>
      <category>apt</category>
      <category>apt update</category>
      <category>공개키</category>
      <category>서명방법</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/7</guid>
      <comments>https://code.who494.com/entry/apt-update-%EB%8B%A4%EC%9D%8C-%EC%84%9C%EB%AA%85%EB%93%A4%EC%9D%80-%EA%B3%B5%EA%B0%9C%ED%82%A4%EA%B0%80-%EC%97%86%EA%B8%B0-%EB%95%8C%EB%AC%B8%EC%97%90-%EC%9D%B8%EC%A6%9D%ED%95%A0-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4#entry7comment</comments>
      <pubDate>Fri, 26 Jul 2024 10:51:42 +0900</pubDate>
    </item>
    <item>
      <title>nginx 설치 및 간단한 SSL 구성 방법</title>
      <link>https://code.who494.com/entry/nginx-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B0%84%EB%8B%A8%ED%95%9C-SSL-%EA%B5%AC%EC%84%B1-%EB%B0%A9%EB%B2%95</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;nginx 설치 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 nginx 파일을 다운로드 받습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a title=&quot;nginx다운로드페이지&quot; href=&quot;https://nginx.org/en/download.html&quot;&gt;https://nginx.org/en/download.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721355193373&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;nginx: download&quot; data-og-description=&quot;&quot; data-og-host=&quot;nginx.org&quot; data-og-source-url=&quot;https://nginx.org/en/download.html&quot; data-og-url=&quot;https://nginx.org/en/download.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://nginx.org/en/download.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://nginx.org/en/download.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;nginx: download&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;nginx.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우 버전 다운로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nginx/Windows-1.27.0 &lt;br /&gt;&lt;a title=&quot;nginx다운로드페이지 윈도우용&quot; href=&quot;https://nginx.org/download/nginx-1.27.0.zip&quot;&gt;https://nginx.org/download/nginx-1.27.0.zip&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;nginx 간단한 SSL 적용 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sYszz/btsIEnlftFu/KK85PktjOMxEYZFPSM0VFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sYszz/btsIEnlftFu/KK85PktjOMxEYZFPSM0VFK/img.png&quot; data-alt=&quot;nginx.conf 파일&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sYszz/btsIEnlftFu/KK85PktjOMxEYZFPSM0VFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsYszz%2FbtsIEnlftFu%2FKK85PktjOMxEYZFPSM0VFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;310&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nginx.conf 파일&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;global.pass 파일 생성&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwAd6X/btsIEwCt4Jx/9Hm22pgbrhH6VtfB1MHjk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwAd6X/btsIEwCt4Jx/9Hm22pgbrhH6VtfB1MHjk0/img.png&quot; data-alt=&quot;ssl 폴더 신규 생성 후 인증서 및 global.pass 파일 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwAd6X/btsIEwCt4Jx/9Hm22pgbrhH6VtfB1MHjk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwAd6X%2FbtsIEwCt4Jx%2F9Hm22pgbrhH6VtfB1MHjk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;182&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ssl 폴더 신규 생성 후 인증서 및 global.pass 파일 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증서 제공 업체로 부터 받은 pem 인증서를 nginx 폴더 아래 ssl 폴더를 생성 후 인증서 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;global.pass 파일 생성 후 파일 내용으로 암호 입력 후 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;56&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wlF1n/btsIFGYnPp5/pyUOIrDkhKJQwO7Wb6YPvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wlF1n/btsIFGYnPp5/pyUOIrDkhKJQwO7Wb6YPvK/img.png&quot; data-alt=&quot;global.pass파일에 패스워드 입력 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wlF1n/btsIFGYnPp5/pyUOIrDkhKJQwO7Wb6YPvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwlF1n%2FbtsIFGYnPp5%2FpyUOIrDkhKJQwO7Wb6YPvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;56&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;56&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;global.pass파일에 패스워드 입력 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;nginx.conf 파일 (ssl이 적용된 완전한 nginx.conf 파일)&lt;/h3&gt;
&lt;pre id=&quot;code_1721355882851&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
	ssl_password_file C:/java/nginx-1.27.0/ssl/global.pass;

    #log_format  main  '$remote_addr - $remote_user [$time_local] &quot;$request&quot; '
    #                  '$status $body_bytes_sent &quot;$http_referer&quot; '
    #                  '&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  code.who494.com;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  code.who494.com;

        ssl_certificate      C:/java/nginx-1.27.0/ssl/cert.pem;
        ssl_certificate_key  C:/java/nginx-1.27.0/ssl/key.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
		
		ssl_protocols	TLSv1.3 TLSv1.2;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 부분만 작성해 놓은 내용&lt;/p&gt;
&lt;pre id=&quot;code_1721359220337&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http {
    include       mime.types;
    default_type  application/octet-stream;
	ssl_password_file C:/java/nginx-1.27.0/ssl/global.pass; // 개인키 생성시 암호 (제공 받은 암호)
   
    # HTTP server
    #  
   server {
        listen       80;
        server_name  code.who494.com;
        
    # HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  code.who494.com; // 본인 도메인 정보 입력 

        ssl_certificate      C:/java/nginx-1.27.0/ssl/cert.pem; // 인증서
        ssl_certificate_key  C:/java/nginx-1.27.0/ssl/key.pem; // 개인키
        


# 위 내용만 추가해 주면 SSL 적용이 바로 됩니다 됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실행 방법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C0f4t/btsIEt6LAD7/gFoAiFcZVLNzszthPhVFo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C0f4t/btsIEt6LAD7/gFoAiFcZVLNzszthPhVFo0/img.png&quot; data-alt=&quot;nginx.exe 파일 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C0f4t/btsIEt6LAD7/gFoAiFcZVLNzszthPhVFo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC0f4t%2FbtsIEt6LAD7%2FgFoAiFcZVLNzszthPhVFo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;244&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;244&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;nginx.exe 파일 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721359609224&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\java\nginx-1.27.0&amp;gt;nginx.exe -h
nginx version: nginx/1.27.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-g directives]

Options:
  -?,-h         : this help
  -v            : show version and exit
  -V            : show version and configure options then exit
  -t            : test configuration and exit
  -T            : test configuration, dump it and exit
  -q            : suppress non-error messages during configuration testing
  -s signal     : send signal to a master process: stop, quit, reopen, reload
  -p prefix     : set prefix path (default: NONE)
  -e filename   : set error log file (default: logs/error.log)
  -c filename   : set configuration file (default: conf/nginx.conf)
  -g directives : set global directives out of configuration file
  
C:\java\nginx-1.27.0&amp;gt;nginx.exe&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOtBWH/btsIEK1EikB/pb9y5yP8Qiwj6rUFw6QOl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOtBWH/btsIEK1EikB/pb9y5yP8Qiwj6rUFw6QOl0/img.png&quot; data-alt=&quot;위 PEM 개인키 생성시 암호를 입력해 주면 됩니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOtBWH/btsIEK1EikB/pb9y5yP8Qiwj6rUFw6QOl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOtBWH%2FbtsIEK1EikB%2Fpb9y5yP8Qiwj6rUFw6QOl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;312&quot; height=&quot;46&quot; data-origin-width=&quot;312&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위 PEM 개인키 생성시 암호를 입력해 주면 됩니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인키 입력 후 엔터를 입력하면 브라우저로 SSL 인증서 적용 화면을 확인 할 수 있습니다. 개인키 암호 입력 창이 안나오는게 정상이나 나오는 경우 개인키 암호를 넣어주거나 다시한번 global.pass 파일 생성을 다시한번 해보시기 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8xxjj/btsIGkAxaSo/WkPJkD3CyJTD6bYJBijkD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8xxjj/btsIGkAxaSo/WkPJkD3CyJTD6bYJBijkD1/img.png&quot; data-alt=&quot;SSL 적용 후 도메인으로 접속시 정상 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8xxjj/btsIGkAxaSo/WkPJkD3CyJTD6bYJBijkD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8xxjj%2FbtsIGkAxaSo%2FWkPJkD3CyJTD6bYJBijkD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;221&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSL 적용 후 도메인으로 접속시 정상 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>nginx</category>
      <category>CERT</category>
      <category>global.pass</category>
      <category>nginx</category>
      <category>Pem</category>
      <category>SSL</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/6</guid>
      <comments>https://code.who494.com/entry/nginx-%EC%84%A4%EC%B9%98-%EB%B0%8F-%EA%B0%84%EB%8B%A8%ED%95%9C-SSL-%EA%B5%AC%EC%84%B1-%EB%B0%A9%EB%B2%95#entry6comment</comments>
      <pubDate>Fri, 19 Jul 2024 12:47:11 +0900</pubDate>
    </item>
    <item>
      <title>Spring Security 6 기본 설정</title>
      <link>https://code.who494.com/entry/Spring-Security-6-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스프링 기본 보안 구성은 다양한 확장성을 기본으로 가져가기 위해 내부적으로 매우 심하게 숨겨져 있습니다. 우선 전체적인 보안 기본 구성과 확장 구성하는 방법에 대해 자세히 설명해 보도록 하겠습니다. 많은 웹 문서에서 설명을 매우 복잡하게 설명하는 바람에 기초 스프링 보안 공부하는 사람에게 다양한 어려움을 주고있는것을 알게 됐습니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적 시큐리티에 필요한 파일 숫자는 단지 파일 하나 입니다. 기본으로 생성된 spring boot 프로젝트에서 아래 파일 하나만 추가한다면 스프링 시큐리티를 완성한 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717918819443&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;package com.security.app.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractAuthenticationFilterConfigurer;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfiguration {

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
    
    String[] authRequestMatchers = {&quot;/login&quot;};

    httpSecurity
        .authorizeHttpRequests(
            authorizationManagerRequestMatcherRegistry -&amp;gt; authorizationManagerRequestMatcherRegistry
                .requestMatchers(authRequestMatchers).permitAll().anyRequest().authenticated())
        .formLogin(AbstractAuthenticationFilterConfigurer::permitAll);
    return httpSecurity.build();
  }
  
  @Bean
  public UserDetailsService userDetailsService(){
      UserDetails user = User.withUsername(&quot;user&quot;).password(&quot;{noop}1111&quot;).roles(&quot;USER&quot;).build();
      return  new InMemoryUserDetailsManager(user);
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/wvIKJ/btsHSv4UMff/kzejXWWPobJ7wIkkkcsge0/SecurityConfiguration.java?attach=1&amp;amp;knm=tfile.java&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;SecurityConfiguration.java&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;로그인 처리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 페이지는 스프링 시큐리티에서 제공을 해주니 페이지를 만들 필요는 없습니다. 아래는 기본으로 제공되는 로그인 페이지 입니다. 우선 아래와 같은 페이지를 보고싶은 경우 위 파일만 프로젝트 환경에 맞게 추가해 주시면 아래와 같은 페이지를 웹에서 확인 할 수 있습니다. 아이디 / 패스워드는 user / 1111 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMo0qD/btsHRxCHHWT/fpEkUmEPi5OhddcFPuGBQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMo0qD/btsHRxCHHWT/fpEkUmEPi5OhddcFPuGBQK/img.png&quot; data-alt=&quot;기본으로 제공되는 로그인 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMo0qD/btsHRxCHHWT/fpEkUmEPi5OhddcFPuGBQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMo0qD%2FbtsHRxCHHWT%2FfpEkUmEPi5OhddcFPuGBQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;268&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본으로 제공되는 로그인 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 이후 페이지는 아래와 같습니다. 로그인 성공 페이지 하나 만들어 줘야 합니다. 내용은 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3ghv/btsHSeJcAKV/zEgWclh9svGmsw4pGKFwek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3ghv/btsHSeJcAKV/zEgWclh9svGmsw4pGKFwek/img.png&quot; data-alt=&quot;로그인 성공 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3ghv/btsHSeJcAKV/zEgWclh9svGmsw4pGKFwek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3ghv%2FbtsHSeJcAKV%2FzEgWclh9svGmsw4pGKFwek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;212&quot; height=&quot;132&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 성공 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/dU6463/btsHR6dzppH/AsT1ra4VDjW8wGKLEyiZJ0/index.html?attach=1&amp;amp;knm=tfile.html&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;index.html&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.00MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 구성으로 조금씩 기능을 추가해 보도록 하겠습니다. 기본 프로젝트 전체 파일을 첨부합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;fileblock&quot; data-ke-align=&quot;alignCenter&quot;&gt;&lt;a href=&quot;https://blog.kakaocdn.net/dn/Ouve7/btsHRHrE29I/tIlNwMlttPJ3yjJSBLdxl0/spring-security-web.zip?attach=1&amp;amp;knm=tfile.zip&quot; class=&quot;&quot;&gt;
    &lt;div class=&quot;image&quot;&gt;&lt;/div&gt;
    &lt;div class=&quot;desc&quot;&gt;&lt;div class=&quot;filename&quot;&gt;&lt;span class=&quot;name&quot;&gt;spring-security-web.zip&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;size&quot;&gt;0.01MB&lt;/div&gt;
&lt;/div&gt;
  &lt;/a&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;</description>
      <category>언어/Spring Frame Work</category>
      <category>security 6</category>
      <category>Spring</category>
      <category>Spring Security 6</category>
      <category>스프링</category>
      <category>시큐리티</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/5</guid>
      <comments>https://code.who494.com/entry/Spring-Security-6-%EA%B8%B0%EB%B3%B8-%EC%84%A4%EC%A0%95#entry5comment</comments>
      <pubDate>Sun, 9 Jun 2024 17:00:43 +0900</pubDate>
    </item>
    <item>
      <title>Java 프로그래밍에서 인코딩 및 디코딩 이야기</title>
      <link>https://code.who494.com/entry/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90%EC%84%9C-%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%B0%8F-%EB%94%94%EC%BD%94%EB%94%A9-%EC%9D%B4%EC%95%BC%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java&amp;nbsp;프로그래밍에서&amp;nbsp;인코딩&amp;nbsp;및&amp;nbsp;디코딩은&amp;nbsp;데이터를&amp;nbsp;한&amp;nbsp;형식에서&amp;nbsp;다른&amp;nbsp;형식으로&amp;nbsp;변환하는&amp;nbsp;프로세스를&amp;nbsp;나타냅니다.&amp;nbsp;이러한&amp;nbsp;프로세스는&amp;nbsp;텍스트,&amp;nbsp;이진&amp;nbsp;데이터&amp;nbsp;또는&amp;nbsp;개체를&amp;nbsp;처리할&amp;nbsp;때&amp;nbsp;일반적으로&amp;nbsp;사용됩니다.&amp;nbsp;각&amp;nbsp;개념을&amp;nbsp;자세히&amp;nbsp;살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인코딩&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;텍스트 인코딩&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 텍스트 문자를 특정 바이트 표현으로 변환하는 작업이 포함됩니다. 예를 들어 UTF-8 또는 UTF-16과 같은 특정 문자 인코딩을 사용하여 문자열을 바이트 시퀀스로 변환합니다. 이 프로세스는 텍스트 데이터를 바이너리 형식으로 저장하거나 전송하는 데 필수적입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717082740414&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.nio.charset.Charset;

public class UnicodeTest {

	public static void main(String[] args) {
		String text = &quot;한&quot;;

		System.out.println(&quot;## this Java virtual machine : &quot; + Charset.defaultCharset());
		System.out.println(&quot;## text this machine byte length :&quot; + text.getBytes().length);
		System.out.println(&quot;## text UTF-8 byte length :&quot; + text.getBytes(Charset.forName(&quot;UTF-8&quot;)).length);
		System.out.println(&quot;## text Unicode byte length :&quot; + text.getBytes(Charset.forName(&quot;Unicode&quot;)).length);
		System.out.println(&quot;## text UTF16 byte length :&quot; + text.getBytes(Charset.forName(&quot;UTF-16&quot;)).length);

		String text2 = &quot;한국&quot;;

		System.out.println('\u0009');
		System.out.println(&quot;## text this machine byte length :&quot; + text2.getBytes().length);
		
		String utf8Text = new String(text2.getBytes(), Charset.forName(&quot;UTF-8&quot;));
		System.out.println(&quot;## utf8 text : &quot; + utf8Text);
		System.out.println(&quot;## text UTF-8 -&amp;gt; UTF-8 length :&quot; + utf8Text.getBytes().length);
		
		String unicodeText = new String(text2.getBytes(), Charset.forName(&quot;Unicode&quot;));
		System.out.println(&quot;## unicode text : &quot; + unicodeText);
		System.out.println(&quot;## unicode text -&amp;gt; UTF-8 text :&quot; + new String(unicodeText.getBytes(Charset.forName(&quot;Unicode&quot;)), Charset.forName(&quot;UTF-8&quot;)));
		System.out.println(&quot;## text UTF-8 -&amp;gt; Unicode length :&quot; + unicodeText.getBytes(Charset.forName(&quot;Unicode&quot;)).length);
		
		System.out.println('\u0009');
		String unicodeText2 = new String(text2.getBytes(Charset.forName(&quot;Unicode&quot;)));
		System.out.println(&quot;## unicode text2 : &quot; + unicodeText2);
		System.out.println(&quot;## unicode text2 -&amp;gt; UTF-8 text :&quot; + new String(unicodeText2.getBytes(), Charset.forName(&quot;UTF-8&quot;)));
		System.out.println(&quot;## unicode text2 -&amp;gt; UTF-8 text :&quot; + new String(unicodeText2.getBytes(Charset.forName(&quot;Unicode&quot;)), Charset.forName(&quot;UTF-8&quot;)));
		System.out.println(&quot;## unicode text2 UTF-8 -&amp;gt; Unicode length :&quot; + unicodeText2.getBytes(Charset.forName(&quot;Unicode&quot;)).length);
		
		System.out.println('\u0009');
		String utf16Text = new String(text2.getBytes(), Charset.forName(&quot;UTF-16&quot;));
		System.out.println(&quot;## utf16 text : &quot; + utf16Text);
		System.out.println(&quot;## text UTF-8 -&amp;gt; UTF-16 length :&quot; + utf16Text.getBytes(Charset.forName(&quot;UTF-16&quot;)).length);
		System.out.println(&quot;## UTF-16 text -&amp;gt; UTF-8 text :&quot; + new String(utf16Text.getBytes(Charset.forName(&quot;UTF-16&quot;)), Charset.forName(&quot;UTF-8&quot;)));
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 결과를 잘 확인해 주시기 바랍니다. 인코딩 디코딩시 반드시 현재 VM의 설정 인코딩 타입을 반드시 고려한 코드가 나와 줘야 합니다. 기본적으로 getByte()를 인자 없이 쓰게 되면 시스템 설정 인코딩 타입이 사용되게 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZFUJD/btsHI73znNT/MuCnHywz5p1Ec1NyM6Ybjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZFUJD/btsHI73znNT/MuCnHywz5p1Ec1NyM6Ybjk/img.png&quot; data-alt=&quot;인코딩 디코딩 실행 결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZFUJD/btsHI73znNT/MuCnHywz5p1Ec1NyM6Ybjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZFUJD%2FbtsHI73znNT%2FMuCnHywz5p1Ec1NyM6Ybjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;335&quot; height=&quot;323&quot; data-origin-width=&quot;335&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인코딩 디코딩 실행 결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;객체&amp;nbsp;직렬화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java 객체는 직렬화될 수 있습니다. 즉, 파일에 저장하거나 네트워크를 통해 전송할 수 있는 바이트 스트림으로 변환됩니다. 이 프로세스는 객체 상태를 유지하거나 다른 Java 애플리케이션 간에 객체를 전송하는 데 중요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717083001593&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Assume 'objectToSerialize' is an instance of a Serializable class
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(&quot;object.ser&quot;))) {
    oos.writeObject(objectToSerialize);
} catch (IOException e) {
    e.printStackTrace();
}

// ======================================================================================

try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(&quot;object.ser&quot;))) {
    Object deserializedObject = ois.readObject();
} catch (IOException | ClassNotFoundException e) {
    e.printStackTrace();
}&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;압축&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코딩에는&amp;nbsp;효율적인&amp;nbsp;저장&amp;nbsp;또는&amp;nbsp;전송을&amp;nbsp;위해&amp;nbsp;데이터&amp;nbsp;크기를&amp;nbsp;줄이는&amp;nbsp;압축이&amp;nbsp;포함될&amp;nbsp;수도&amp;nbsp;있습니다.&amp;nbsp;Java는&amp;nbsp;Deflate와&amp;nbsp;같은&amp;nbsp;알고리즘을&amp;nbsp;사용하여&amp;nbsp;데이터를&amp;nbsp;압축하기&amp;nbsp;위한&amp;nbsp;java.util.zip과&amp;nbsp;같은&amp;nbsp;라이브러리를&amp;nbsp;제공합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717083069428&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;byte[] dataToCompress = ...; // Data to compress
ByteArrayOutputStream compressedStream = new ByteArrayOutputStream();
try (DeflaterOutputStream dos = new DeflaterOutputStream(compressedStream)) {
    dos.write(dataToCompress);
} catch (IOException e) {
    e.printStackTrace();
}
byte[] compressedData = compressedStream.toByteArray();

// ======================================================================================
byte[] compressedData = ...; // Compressed data
ByteArrayOutputStream decompressedStream = new ByteArrayOutputStream();
try (InflaterInputStream iis = new InflaterInputStream(new ByteArrayInputStream(compressedData))) {
    byte[] buffer = new byte[1024];
    int bytesRead;
    while ((bytesRead = iis.read(buffer)) != -1) {
        decompressedStream.write(buffer, 0, bytesRead);
    }
} catch (IOException e) {
    e.printStackTrace();
}
byte[] decompressedData = decompressedStream.toByteArray();&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;
     (adsbygoogle = window.adsbygoogle || []).push({});
&lt;/script&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;암호화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코딩에는 암호 해독 키 없이는 읽을 수 없도록 데이터가 변환되는 암호화가 포함될 수 있습니다. Java는 데이터를 안전하게 암호화하고 해독하기 위해 javax.crypto와 같은 암호화 라이브러리를 제공합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1717083185055&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String originalText = &quot;Sensitive data to encrypt&quot;;
SecretKey secretKey = generateSecretKey(); // Method to generate a secret key
Cipher cipher = Cipher.getInstance(&quot;AES&quot;);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedData = cipher.doFinal(originalText.getBytes(StandardCharsets.UTF_8));

// ======================================================================================

byte[] encryptedData = ...; // Encrypted data
SecretKey secretKey = retrieveSecretKey(); // Method to retrieve the secret key
Cipher cipher = Cipher.getInstance(&quot;AES&quot;);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedData = cipher.doFinal(encryptedData);
String decryptedText = new String(decryptedData, StandardCharsets.UTF_8);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/Java</category>
      <category>UNICODE</category>
      <category>디코딩</category>
      <category>암호화</category>
      <category>압축</category>
      <category>유니코드</category>
      <category>인코딩</category>
      <category>직렬화</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/4</guid>
      <comments>https://code.who494.com/entry/Java-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%97%90%EC%84%9C-%EC%9D%B8%EC%BD%94%EB%94%A9-%EB%B0%8F-%EB%94%94%EC%BD%94%EB%94%A9-%EC%9D%B4%EC%95%BC%EA%B8%B0#entry4comment</comments>
      <pubDate>Fri, 31 May 2024 00:33:35 +0900</pubDate>
    </item>
    <item>
      <title>자바 DATA TYPE의 BYTE 크기 및 범위</title>
      <link>https://code.who494.com/entry/%EC%9E%90%EB%B0%94-DATA-TYPE%EC%9D%98-BYTE-%ED%81%AC%EA%B8%B0-%EB%B0%8F-%EB%B2%94%EC%9C%84</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA 기본적인 데이터 타입별 byte size 및 숫자 범위를 확인해 봐야 할 필요가 있습니다. 외부에서 들어오는 byte형식의 데이터는 자바 기본 타입으로 형변환이 필요한데 원천이되는 byte가 시스템별로 인코딩 타입이 다르고 그 바이트 나열이 &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;LITTLE_ENDIAN 또는 BIG&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;_ENDIAN 등등 다양한 내용을 구분해 형변환이 필요합니다. 이제부터 그 내용을 확인하는 법에 대해 알아보도록 하겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7WNlm/btsHGcRzeej/O08IiQvWAOSX4zwtub4e8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7WNlm/btsHGcRzeej/O08IiQvWAOSX4zwtub4e8k/img.png&quot; data-alt=&quot;Int형 123456789 숫자 4byte little edian의 표&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7WNlm/btsHGcRzeej/O08IiQvWAOSX4zwtub4e8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7WNlm%2FbtsHGcRzeej%2FO08IiQvWAOSX4zwtub4e8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;105&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Int형 123456789 숫자 4byte little edian의 표&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 소스는 현재 시스템의 endian 확인과 각 데이터 타입의 size와 범위를 확인하는 기본 소스이다.&lt;/p&gt;
&lt;pre id=&quot;code_1716904667384&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class TypeSize {
	
	public static void main(String[] args) {
		System.out.println(&quot;# int range : &quot; + Integer.MIN_VALUE + &quot; ~ &quot; + Integer.MAX_VALUE + &quot;, byte size : &quot; + Integer.BYTES);
		System.out.println(&quot;# long range : &quot; + Long.MIN_VALUE + &quot; ~ &quot; + Long.MAX_VALUE + &quot;, byte size : &quot; + Long.BYTES);
		System.out.println(&quot;# short range : &quot; + Short.MIN_VALUE + &quot; ~ &quot; + Short.MAX_VALUE + &quot;, byte size : &quot; + Short.BYTES);
		System.out.println(&quot;# char range : &quot; + Character.MIN_VALUE + &quot; ~ &quot; + Character.MAX_VALUE + &quot;, byte size : &quot; + Character.BYTES);
		System.out.println(&quot;# byte range : &quot; + Byte.MIN_VALUE + &quot; ~ &quot; + Byte.MAX_VALUE + &quot;, byte size : &quot; + Byte.BYTES);
		
		System.out.println(&quot;# ENDIAN : &quot; + ByteOrder.nativeOrder());
		
		int value = 123456789;
		byte [] bytes = ByteBuffer.allocate(4).putInt(value).array();
		for (byte b : bytes) {
		    System.out.format(&quot;0x%x &quot;, b);
		}
		
		System.out.println();
		
		byte [] bytes2 = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder()).putInt(value).array();
		for (byte b : bytes2) {
		    System.out.format(&quot;0x%x &quot;, b);
		}
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 아래와 같다&lt;/p&gt;
&lt;pre id=&quot;code_1716904757141&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# int range : -2147483648 ~ 2147483647, byte size : 4
# long range : -9223372036854775808 ~ 9223372036854775807, byte size : 8
# short range : -32768 ~ 32767, byte size : 2
# char range : ~ , byte size : 2
# byte range : -128 ~ 127, byte size : 1

# ENDIAN : LITTLE_ENDIAN
0x7 0x5b 0xcd 0x15 
0x15 0xcd 0x5b 0x7&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>언어/Java</category>
      <category>big endian</category>
      <category>DATA Type</category>
      <category>java</category>
      <category>little endian</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/2</guid>
      <comments>https://code.who494.com/entry/%EC%9E%90%EB%B0%94-DATA-TYPE%EC%9D%98-BYTE-%ED%81%AC%EA%B8%B0-%EB%B0%8F-%EB%B2%94%EC%9C%84#entry2comment</comments>
      <pubDate>Tue, 28 May 2024 22:59:28 +0900</pubDate>
    </item>
    <item>
      <title>JAVA 스트림에 관한 이야기</title>
      <link>https://code.who494.com/entry/JAVA-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%97%90-%EA%B4%80%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바에서 가장 기본적인 스트림은 InputStream과 OutputStream 입니다. 스트림의 목적은 데이터 이동 입니다. 원하는 목적지로 이동시키기위해 스트림을 구현한 객체를 사용합니다. 모든 프로그램의 목적은 데이터를 가져와 가공 처리 후 필요로 하는 대상에게 전달해 주는 것 입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odY3r/btsHDhSJDZv/IEGvAxocDbH7Yt5egXnhxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odY3r/btsHDhSJDZv/IEGvAxocDbH7Yt5egXnhxk/img.png&quot; data-alt=&quot;Input Straem과 Output Stream의 사용 목적&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odY3r/btsHDhSJDZv/IEGvAxocDbH7Yt5egXnhxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodY3r%2FbtsHDhSJDZv%2FIEGvAxocDbH7Yt5egXnhxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;396&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Input Straem과 Output Stream의 사용 목적&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Input Stream은 원천이 되는 데이터를 자바 프로그램으로 가져올 때 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Output Stream의 경우는 자바 프로그램에서 데이터를 내보낼 때 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1716729464168&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.IOException;

public class Test {
	public static void main(String[] args) {
		StringBuffer buffer = new StringBuffer();
		int ch = 0;
		try {
			while (true) {
				
				ch = System.in.read();
				System.out.println(ch);
				buffer.append((char) ch);
				
				if(ch == -1) {
					break;
				}
			}

		} catch (IOException e) {}
		
		System.out.print(buffer);
	}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 실행시키고 프로그램을 중지시키려면 윈도우의 경우 (Ctrl + Z) 엔터를 Unix의 경우 (Ctrl+D)를 입력하고 엔터를 해야만 종료 -1 값이 프로그램에 전달 됩니다. 위 프로그램은 키보드로 입력한 내용이 화면에 바이트 숫자로 표시되고 마지막에 입력된 전체 값이 문자열로 변환해 입력된 내용을 보여주는 프로그램 예제 입니다. 한 번 실행시켜 보시기 바랍니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 샘플 소스 내용중 Sytem.in.read() 부분을 확인해 보세요. Java에서 기본적으로 제공되는 InputStream 구현 중 하나 입니다. 입력 스트림의 원천 데이터는 아래와 같습니다. &quot;corresponds to keyboard input or another input source specified by the host environment or user&quot;,&amp;nbsp; &lt;span style=&quot;background-color: #fdfdfd; color: #000000; text-align: start;&quot;&gt;호스트 환경 또는 사용자가 지정한 키보드 입력 또는 다른 입력 소스에 해당합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1716730031029&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; // ==================================================================================
 /*
 * @since   JDK1.0
 */
public final class System {
    /**
     * The &quot;standard&quot; input stream. This stream is already
     * open and ready to supply input data. Typically this stream
     * corresponds to keyboard input or another input source specified by
     * the host environment or user.
     */
    public final static InputStream in = null;
    
	/**
     * Initialize the system class.  Called after thread initialization.
     */
    private static void initializeSystemClass() {

        FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
        FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
        FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
        setIn0(new BufferedInputStream(fdIn));
        setOut0(newPrintStream(fdOut, props.getProperty(&quot;sun.stdout.encoding&quot;)));
        setErr0(newPrintStream(fdErr, props.getProperty(&quot;sun.stderr.encoding&quot;)));
// ==================================================================================
 /*
 * @author  Pavani Diwanji
 * @since   JDK1.0
 */
public final class FileDescriptor {
	/**
     * A handle to the standard input stream. Usually, this file
     * descriptor is not used directly, but rather via the input stream
     * known as {@code System.in}.
     *
     * @see     java.lang.System#in
     */
    public static final FileDescriptor in = standardStream(0);

    /**
     * A handle to the standard output stream. Usually, this file
     * descriptor is not used directly, but rather via the output stream
     * known as {@code System.out}.
     * @see     java.lang.System#out
     */
    public static final FileDescriptor out = standardStream(1);

    /**
     * A handle to the standard error stream. Usually, this file
     * descriptor is not used directly, but rather via the output stream
     * known as {@code System.err}.
     *
     * @see     java.lang.System#err
     */
    public static final FileDescriptor err = standardStream(2);

    /**
     * Tests if this file descriptor object is valid.
     *
     * @return  {@code true} if the file descriptor object represents a
     *          valid, open file, socket, or other active I/O connection;
     *          {@code false} otherwise.
     */
    public boolean valid() {
        return ((handle != -1) || (fd != -1));
    }
    
/* This routine initializes JNI field offsets for the class */
    private static native void initIDs();

    private static native long set(int d);

    private static FileDescriptor standardStream(int fd) {
        FileDescriptor desc = new FileDescriptor();
        desc.handle = set(fd);
        return desc;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다시 여기 중요한 부분이 있습니다. private static native long set(int d); 이 부분은 native 소스에서 입력 대상을 찾는 다는 뜻입니다. 운영체제 별로 구현된 native소스를 따라가게 되있습니다. 더 자세한 내용을 알고 싶다면 댓글을 주시면 답변 드리도록 하겠습니다.&lt;/p&gt;
&lt;div&gt;
&lt;script src=&quot;https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-2846300341477747&quot;&gt;&lt;/script&gt;
&lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: inline-block; width: 700px; height: 120px;&quot; data-ad-client=&quot;ca-pub-2846300341477747&quot; data-ad-slot=&quot;9939959140&quot;&gt;&lt;/ins&gt;
&lt;script&gt;     (adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
&lt;/div&gt;</description>
      <category>언어/Java</category>
      <category>inputStream</category>
      <category>java</category>
      <category>outputStream</category>
      <category>스트림</category>
      <author>codeon</author>
      <guid isPermaLink="true">https://code.who494.com/1</guid>
      <comments>https://code.who494.com/entry/JAVA-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%97%90-%EA%B4%80%ED%95%9C-%EC%9D%B4%EC%95%BC%EA%B8%B0#entry1comment</comments>
      <pubDate>Sun, 26 May 2024 23:16:10 +0900</pubDate>
    </item>
  </channel>
</rss>