<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>codeManager</title>
    <link>https://codemanager.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 7 Jun 2026 21:25:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>codeManager</managingEditor>
    <image>
      <title>codeManager</title>
      <url>https://tistory1.daumcdn.net/tistory/5360603/attach/09e671eb03db432d97a67df05c4bf1ee</url>
      <link>https://codemanager.tistory.com</link>
    </image>
    <item>
      <title>맥 유니버셜 컨트롤 (키보드 마우스 하나로 여러기기 사용하기)</title>
      <link>https://codemanager.tistory.com/173</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;유니버설 컨트롤이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플 유니버설 컨트롤은 Mac의 입력 장치(키보드, 마우스, 트랙패드)를 사용하여 근처에 있는 최대 2대의 다른 Mac 또는 iPad 기기를 제어하는 기능입니다. 각 기기는 고유의 화면과 앱을 유지하지만, 사용자는 하나의 입력 장치로 포인터를 기기 간에 원활하게 이동하고, 텍스트를 입력하며, 심지어 드래그 앤 드롭으로 파일이나 사진 등의 콘텐츠를 쉽게 복사하고 이동할 수 있습니다.&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;1200&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x4lIR/btsOQltoQrn/8em7W365drapBWAfVVopY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x4lIR/btsOQltoQrn/8em7W365drapBWAfVVopY0/img.jpg&quot; data-alt=&quot;유니버설 컨트롤&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x4lIR/btsOQltoQrn/8em7W365drapBWAfVVopY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx4lIR%2FbtsOQltoQrn%2F8em7W365drapBWAfVVopY0%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;600&quot; height=&quot;450&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;900&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;h3 data-sourcepos=&quot;13:1-13:31&quot; data-ke-size=&quot;size23&quot;&gt;유니버설 컨트롤 사용법&lt;/h3&gt;
&lt;p data-sourcepos=&quot;15:1-15:35&quot; data-ke-size=&quot;size16&quot;&gt;유니버설 컨트롤을 사용하려면 몇 가지 간단한 설정이 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-sourcepos=&quot;17:1-30:0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-sourcepos=&quot;17:1-20:0&quot;&gt;유니버설 컨트롤 켜기:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;18:5-20:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;18:5-18:184&quot;&gt;Mac (macOS Ventura 및 이후): Apple 메뉴() &amp;gt; 시스템 설정 &amp;gt; 디스플레이 &amp;gt; 고급으로 이동하여 '포인터 및 키보드가 근처의 Mac 또는 iPad 간에 이동하도록 허용' 옵션을 활성화합니다. (이전 macOS 버전에서는 시스템 환경설정 &amp;gt; 디스플레이에서 유사한 옵션을 찾을 수 있습니다.)&lt;/li&gt;
&lt;li data-sourcepos=&quot;19:5-20:0&quot;&gt;iPad (iPadOS 15.4 및 이후): 설정 앱 &amp;gt; 일반 &amp;gt; AirPlay 및 연속성 &amp;gt; '커서 및 키보드'를 활성화합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;21:1-24:0&quot;&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:62&quot;&gt;유니버설 컨트롤을 사용할 모든 기기를 서로 가까이 두고 깨어 있으며 잠금 해제된 상태인지 확인하세요.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:5-24:0&quot;&gt;기본 Mac의 마우스 또는 트랙패드를 사용하여 포인터를 다른 기기 화면 방향으로 화면 가장자리를 지나 이동하면 자동으로 연결됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;25:1-27:0&quot;&gt;디스플레이 정렬하기:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;26:5-27:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;26:5-27:0&quot;&gt;기본 Mac의 디스플레이 설정(Apple 메뉴() &amp;gt; 시스템 설정 &amp;gt; 디스플레이 &amp;gt; 정렬)에서 각 기기의 디스플레이 이미지를 실제 물리적 위치에 맞게 드래그하여 정렬하면 더욱 직관적인 사용이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:1-30:0&quot;&gt;기기 간 자유로운 작업:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;29:5-30:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;29:5-30:0&quot;&gt;이제 연결된 기기 중 어느 기기의 키보드, 마우스 또는 트랙패드를 사용해도 모든 기기를 오가며 작업할 수 있습니다. 예를 들어, Mac에서 작업하다가 포인터를 iPad 화면으로 옮겨 iPad 앱을 제어하고, 다시 Mac으로 돌아오는 것이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;33:1-33:26&quot; data-ke-size=&quot;size23&quot;&gt;유니버설 컨트롤 시스템 요구 사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;35:1-35:66&quot; data-ke-size=&quot;size16&quot;&gt;모든 애플 기기에서 유니버설 컨트롤을 사용할 수 있는 것은 아닙니다. 다음 시스템 요구 사항을 충족해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;37:1-56:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;37:1-37:62&quot;&gt;운영 체제: macOS Monterey 12.4 및 이후 버전, iPadOS 15.4 및 이후 버전.&lt;/li&gt;
&lt;li data-sourcepos=&quot;38:1-46:16&quot;&gt;Mac 모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;39:5-46:16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;39:5-39:24&quot;&gt;MacBook (2016년 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;40:5-40:28&quot;&gt;MacBook Pro (2016년 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;41:5-41:28&quot;&gt;MacBook Air (2018년 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;42:5-42:25&quot;&gt;Mac mini (2018년 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;43:5-43:55&quot;&gt;iMac (2017년 이후 또는 iMac 27 Retina 5K, 2015년 후반 모델)&lt;/li&gt;
&lt;li data-sourcepos=&quot;44:5-44:14&quot;&gt;iMac Pro&lt;/li&gt;
&lt;li data-sourcepos=&quot;45:5-45:24&quot;&gt;Mac Pro (2019년 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;46:5-46:16&quot;&gt;Mac Studio&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;47:1-51:24&quot;&gt;iPad 모델
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;48:5-51:24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;48:5-48:22&quot;&gt;iPad Pro (모든 모델)&lt;/li&gt;
&lt;li data-sourcepos=&quot;49:5-49:19&quot;&gt;iPad (6세대 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;50:5-50:23&quot;&gt;iPad Air (3세대 이후)&lt;/li&gt;
&lt;li data-sourcepos=&quot;51:5-51:24&quot;&gt;iPad mini (5세대 이후)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;52:1-56:0&quot;&gt;추가 요구 사항
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;53:5-56:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;53:5-53:62&quot;&gt;모든 기기는 동일한 Apple ID로 로그인되어 있어야 하며, 이중 인증이 활성화되어 있어야 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;54:5-54:81&quot;&gt;기기들은 서로 10m(30피트) 이내에 있어야 하며, Bluetooth, Wi-Fi 및 Handoff 기능이 모두 켜져 있어야 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;55:5-56:0&quot;&gt;iPad에서 셀룰러 연결을 공유하거나 Mac에서 인터넷 연결을 공유하는 경우 유니버설 컨트롤을 사용할 수 없습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>IT</category>
      <category>맥 유니버설</category>
      <category>맥 유니버셜 방법</category>
      <category>맥 유니버셜 컨트롤</category>
      <category>맥 유니버셜 컨트롤 끊김</category>
      <category>맥 키보드 공유</category>
      <category>맥끼리 마우스</category>
      <category>맥북 유니버셜 컨트롤 설정</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/173</guid>
      <comments>https://codemanager.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 24 Jun 2025 21:23:00 +0900</pubDate>
    </item>
    <item>
      <title>데이터독 APM: 복잡한 애플리케이션의 성능을 한눈에</title>
      <link>https://codemanager.tistory.com/172</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;현대 소프트웨어 아키텍처는 마이크로서비스, 클라우드 네이티브 환경 등으로 인해 점점 더 복잡해지고 있습니다. 이러한 복잡성 속에서 애플리케이션의 성능 문제를 진단하고 해결하는 것은 개발자와 운영 팀에게 큰 도전 과제입니다. 바로 이럴 때 필요한 솔루션이 바로 애플리케이션 성능 모니터링(APM: Application Performance Monitoring)입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:140&quot; data-ke-size=&quot;size16&quot;&gt;그리고 이 분야의 선두 주자 중 하나가 바로 &lt;b&gt;Datadog APM&lt;/b&gt;입니다. Datadog APM은 단순히 서비스가 잘 동작하는지 확인하는 것을 넘어, 코드 레벨까지 깊이 파고들어 문제의 원인을 신속하게 찾아내고 해결하도록 돕는 강력한 도구입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:140&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:140&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;1081&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cciYLU/btsOAroBJG3/jPWhQJDOsLcji1osqMETF1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cciYLU/btsOAroBJG3/jPWhQJDOsLcji1osqMETF1/img.webp&quot; data-alt=&quot;Datadog&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cciYLU/btsOAroBJG3/jPWhQJDOsLcji1osqMETF1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcciYLU%2FbtsOAroBJG3%2FjPWhQJDOsLcji1osqMETF1%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;400&quot; height=&quot;267&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Datadog&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;7:1-7:18&quot; data-ke-size=&quot;size23&quot;&gt;Datadog APM이란?&lt;/h3&gt;
&lt;p data-sourcepos=&quot;9:1-9:186&quot; data-ke-size=&quot;size16&quot;&gt;Datadog APM은 브라우저 및 모바일 애플리케이션부터 백엔드 서비스, 데이터베이스에 이르는 전체 스택에 걸쳐 &lt;b&gt;AI 기반의 코드 레벨 분산 트레이싱(Distributed Tracing)&lt;/b&gt; 기능을 제공합니다. 이는 모든 요청의 흐름을 추적하여 병목 현상이나 오류가 발생하는 지점을 정확하게 시각화하고 분석할 수 있게 해줍니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;11:1-11:26&quot; data-ke-size=&quot;size23&quot;&gt;Datadog APM의 주요 특징과 이점&lt;/h3&gt;
&lt;p data-sourcepos=&quot;13:1-13:56&quot; data-ke-size=&quot;size16&quot;&gt;Datadog APM이 복잡한 애플리케이션 환경에서 빛을 발하는 핵심 기능들을 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-sourcepos=&quot;15:1-36:0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-sourcepos=&quot;15:1-19:0&quot;&gt;&lt;b&gt;코드 레벨 분산 트레이싱 (Thread-level Distributed Tracing)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;16:5-19:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;16:5-16:135&quot;&gt;&lt;b&gt;문제의 근원지 파악&lt;/b&gt;: 브라우저, 모바일 앱, 백엔드 서비스, 데이터베이스에 걸쳐 분산된 요청의 전체 흐름을 시각화합니다. 이를 통해 지연이나 오류가 발생하는 특정 서비스나 코드 라인을 정확하게 pinpoint할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;17:5-17:140&quot;&gt;&lt;b&gt;통합된 가시성&lt;/b&gt;: 트레이스 정보를 로그, 인프라 지표, 데이터베이스 쿼리, 네트워크 호출, 프론트엔드 텔레메트리와 하나의 화면에서 상호 연관시켜 보여줍니다. 덕분에 여러 도구를 오갈 필요 없이 통합된 시야로 문제를 진단할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;18:5-19:0&quot;&gt;&lt;b&gt;코드 성능 개선&lt;/b&gt;: 코드 실행 시간 및 리소스 소비에 대한 가시성을 확보하여 성능이 저하되는 코드를 식별하고 최적화할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;20:1-23:0&quot;&gt;&lt;b&gt;서비스 성능 개선 및 안정성 확보&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;21:5-23:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;21:5-21:109&quot;&gt;&lt;b&gt;신속한 서비스 문제 감지&lt;/b&gt;: 서비스 상태 지표와 의존성, 그리고 인프라 및 데이터베이스의 텔레메트리 데이터를 중앙에서 한눈에 볼 수 있어 서비스 문제의 근원지를 빠르게 찾아냅니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:5-23:0&quot;&gt;&lt;b&gt;사전 예방적 신뢰성 향상&lt;/b&gt;: SLO(Service Level Objectives), 모니터, 합성 테스트(Synthetic Tests)를 설정하여 애플리케이션의 신뢰성을 능동적으로 개선하고 잠재적인 문제를 미리 감지할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;24:1-27:0&quot;&gt;&lt;b&gt;실시간 변경 사항 추적 및 영향 분석&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;25:5-27:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;25:5-25:115&quot;&gt;&lt;b&gt;배포 영향도 파악&lt;/b&gt;: 코드 배포, 기능 플래그(Feature Flags), 설정 변경, 데이터베이스 수정 등과 같은 변경 사항이 애플리케이션 성능에 미치는 영향을 실시간으로 연관 분석합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;26:5-27:0&quot;&gt;&lt;b&gt;릴리스 영향 정밀 진단&lt;/b&gt;: 버전별 오류, 지연 시간, 인프라 및 코드 프로파일링 지표를 비교하여 각 릴리스가 애플리케이션에 미치는 영향을 빠르게 파악할 수 있습니다. 이는 A/B 테스트나 점진적 배포 시 특히 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:1-31:0&quot;&gt;&lt;b&gt;Watchdog AI를 통한 더 빠른 인시던트 해결&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;29:5-31:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;29:5-29:144&quot;&gt;&lt;b&gt;자동화된 근본 원인 분석&lt;/b&gt;: Watchdog AI는 비정상적인 동작이나 성능 저하를 자동으로 감지하고, 그 원인을 분석하여 MTTR(Mean Time To Resolution)을 개선합니다. 이는 문제를 해결하는 데 걸리는 시간을 줄여줍니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;30:5-31:0&quot;&gt;&lt;b&gt;예측 및 이상 감지&lt;/b&gt;: ML(머신러닝) 기반의 알림을 통해 이상 징후, 아웃라이어, 그리고 미래의 성능 저하를 자동으로, 그리고 사용자 지정 가능한 방식으로 감지하여 MTTD(Mean Time To Detect)를 줄여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;32:1-36:0&quot;&gt;&lt;b&gt;빠르고 유연한 데이터 수집으로 풀스택 가시성 확보&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;33:5-36:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;33:5-33:116&quot;&gt;&lt;b&gt;간편한 분산 트레이싱 설정&lt;/b&gt;: 코드 변경이나 재시작 없이 Datadog Agent를 통해 직접 분산 트레이싱을 설정할 수 있어, 관찰 가능성(Observability) 확보 시간을 단축합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;34:5-34:71&quot;&gt;&lt;b&gt;비용 및 가시성 균형&lt;/b&gt;: 세분화된 샘플링 제어 기능을 통해 가시성 수준과 비용 간의 균형을 조절할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;35:5-36:0&quot;&gt;&lt;b&gt;개방형 표준 지원&lt;/b&gt;: OpenTelemetry와 같은 개방형 표준을 지원하여 유연성을 높입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;37:1-37:20&quot; data-ke-size=&quot;size23&quot;&gt;왜 Datadog APM인가?&lt;/h3&gt;
&lt;p data-sourcepos=&quot;39:1-39:179&quot; data-ke-size=&quot;size16&quot;&gt;Datadog APM은 단순히 오류를 보고하는 것을 넘어, 애플리케이션 내부에서 어떤 일이 벌어지고 있는지에 대한 코드 레벨의 깊은 통찰력을 제공합니다. 이는 개발팀이 성능 병목 현상을 정확히 파악하고, 운영팀이 인시던트에 신속하게 대응하며, 비즈니스 측면에서 사용자 경험을 지속적으로 개선할 수 있도록 돕습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;41:1-41:82&quot; data-ke-size=&quot;size16&quot;&gt;복잡한 마이크로서비스 환경에서 애플리케이션의 건강을 유지하고 최상의 성능을 제공하기 위해 Datadog APM은 필수적인 도구라고 할 수 있습니다.&lt;/p&gt;</description>
      <category>tools</category>
      <category>데이터독 apm</category>
      <category>데이터독 적용</category>
      <category>데이터독 특징</category>
      <category>데이터독 활용</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/172</guid>
      <comments>https://codemanager.tistory.com/172#entry172comment</comments>
      <pubDate>Fri, 13 Jun 2025 18:09:51 +0900</pubDate>
    </item>
    <item>
      <title>JetBrains 인텔리제이(IntelliJ) 라이선스 분석: 구독 기반과 영구 라이선스</title>
      <link>https://codemanager.tistory.com/171</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발자들에게 익숙한 IDE와 다양한 개발 도구를 제공하는 JetBrains는 효율적인 작업 환경을 위한 강력한 도구들을 선보입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 JetBrains 제품들을 사용하기 위한 라이선스 모델은 크게 두 가지로 나뉘며, 각각의 특징과 장단점을 이해하는 것이 중요합니다.&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;1200&quot; data-origin-height=&quot;1200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFTtPQ/btsOz50nFrz/PgtvkttGqzvKKwVXcP7emK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFTtPQ/btsOz50nFrz/PgtvkttGqzvKKwVXcP7emK/img.png&quot; data-alt=&quot;Jetbrain&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFTtPQ/btsOz50nFrz/PgtvkttGqzvKKwVXcP7emK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFTtPQ%2FbtsOz50nFrz%2FPgtvkttGqzvKKwVXcP7emK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Jetbrain&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;5:1-5:48&quot; data-ke-size=&quot;size23&quot;&gt;1. 구독 기반 라이선스 (Subscription-based Licensing)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;7:1-7:86&quot; data-ke-size=&quot;size16&quot;&gt;JetBrains의 가장 주요한 라이선스 모델은 바로 '구독 기반'입니다. 이 모델은 소프트웨어 사용에 대한 유연성과 지속적인 업데이트 혜택을 제공합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;9:1-16:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;9:1-9:145&quot;&gt;&lt;b&gt;작동 방식&lt;/b&gt;: 사용자는 매월 또는 매년 구독료를 지불하여 JetBrains 소프트웨어에 접근하고 사용할 수 있습니다. 구독 기간 동안에는 최신 버전의 소프트웨어는 물론, 모든 업데이트와 버그 수정, 그리고 새로운 기능들을 지속적으로 받을 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:1-10:152&quot;&gt;&lt;b&gt;적용 제품&lt;/b&gt;: 현재 JetBrains의 대부분의 제품이 이 구독 모델을 채택하고 있습니다. 여기에는 IntelliJ IDEA, PyCharm, WebStorm과 같은 인기 있는 모든 IDE(통합 개발 환경)는 물론, .NET 도구 및 클라우드 솔루션이 포함됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:1-14:61&quot;&gt;&lt;b&gt;장점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;12:5-14:61&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;12:5-12:69&quot;&gt;&lt;b&gt;항상 최신 버전 유지&lt;/b&gt;: 구독을 통해 항상 최신 기능과 성능 개선이 적용된 소프트웨어를 사용할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;13:5-13:52&quot;&gt;&lt;b&gt;예측 가능한 비용&lt;/b&gt;: 월별 또는 연간 고정된 비용으로 예산 관리가 용이합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;14:5-14:61&quot;&gt;&lt;b&gt;유연성&lt;/b&gt;: 단기 프로젝트나 팀의 규모 변화에 따라 라이선스 수를 유연하게 조정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;15:1-16:0&quot;&gt;&lt;b&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;h3 data-sourcepos=&quot;17:1-17:74&quot; data-ke-size=&quot;size23&quot;&gt;2. 영구 라이선스 + 업그레이드 구독 (Perpetual License with an Upgrade Subscription)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;19:1-19:109&quot; data-ke-size=&quot;size16&quot;&gt;구독 기반 모델 외에, JetBrains는 '영구 라이선스'와 함께 '업그레이드 구독'이 결합된 모델도 제공합니다. 이 모델은 특정 시점의 소프트웨어 버전에 대한 영구적인 접근 권한을 제공합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;21:1-27:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;21:1-21:127&quot;&gt;&lt;b&gt;작동 방식&lt;/b&gt;: 이 모델은 특정 소프트웨어 버전에 대한 영구적인 사용 권한을 부여합니다. 여기에 포함된 '업그레이드 구독'을 통해 구독 기간 동안에는 해당 소프트웨어의 모든 업데이트 및 새로운 버전을 사용할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:1-22:142&quot;&gt;&lt;b&gt;갱신&lt;/b&gt;: 업그레이드 구독 기간이 만료된 후에는 선택적으로 갱신할 수 있습니다. 갱신하지 않더라도 만료 시점의 소프트웨어 버전은 영구적으로 사용할 수 있습니다. 그러나 갱신하지 않으면 더 이상 새로운 업데이트나 최신 버전에 접근할 수 없게 됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:1-25:77&quot;&gt;&lt;b&gt;장점&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;24:5-25:77&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;24:5-24:65&quot;&gt;&lt;b&gt;영구적인 접근&lt;/b&gt;: 구독 갱신 여부와 관계없이 특정 버전의 소프트웨어는 영구적으로 사용할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;25:5-25:77&quot;&gt;&lt;b&gt;선택적 업데이트&lt;/b&gt;: 필요에 따라 업그레이드 구독을 갱신하여 최신 기능을 이용하거나, 기존 버전을 계속 사용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;26:1-27:0&quot;&gt;&lt;b&gt;고려 사항&lt;/b&gt;: 업데이트 구독을 갱신하지 않으면 새로운 기능이나 보안 패치 등 최신 혜택을 놓칠 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;28:1-28:6&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-sourcepos=&quot;28:1-28:6&quot; data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-sourcepos=&quot;30:1-30:195&quot; data-ke-size=&quot;size16&quot;&gt;JetBrains는 사용자의 다양한 요구와 사용 패턴에 맞춰 구독 기반과 영구 라이선스 모델을 제공하고 있습니다. 대부분의 개발자에게는 지속적인 업데이트와 유연성을 제공하는 구독 기반 모델이 더 효율적일 수 있습니다. 하지만 특정 시점의 안정적인 버전을 선호하거나, 영구적인 사용 권한이 필요한 경우에는 영구 라이선스 모델을 고려해 볼 수 있습니다.&lt;/p&gt;</description>
      <category>tools</category>
      <category>IntelliJ</category>
      <category>intellij 라이센스</category>
      <category>인텔리제이 구독</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/171</guid>
      <comments>https://codemanager.tistory.com/171#entry171comment</comments>
      <pubDate>Fri, 13 Jun 2025 17:25:47 +0900</pubDate>
    </item>
    <item>
      <title>Mac에서 사용 중인 포트 확인 및 프로세스 종료 방법</title>
      <link>https://codemanager.tistory.com/170</link>
      <description>&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-sourcepos=&quot;6:1-6:94&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 Mac에서 특정 포트를 사용하고 있는 프로세스를 정확히 찾아내고, 깔끔하게 종료하는 방법을 알아보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;6:1-6:94&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;6:1-6:94&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;10:1-10:36&quot; data-ke-size=&quot;size23&quot;&gt;1. 특정 포트 점유 프로세스 ID (PID) 확인하기&lt;/h3&gt;
&lt;p data-sourcepos=&quot;12:1-12:161&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 할 일은 어떤 포트를 누가 쓰고 있는지 확인하는 것입니다. 터미널을 열고 다음 명령어를 입력해주세요. 여기서 [포트 번호] 부분에 확인하고 싶은 포트 번호를 입력하면 됩니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;12:1-12:161&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 9000번 포트를 확인하고 싶다면 sudo lsof -i :9000이 되겠죠.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;sudo lsof -i :[포트 번호]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;18:1-18:111&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;18:1-18:111&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어는 현재 시스템에서 열려 있는 파일 목록 중 &lt;b&gt;해당 포트와 연결된 프로세스 정보&lt;/b&gt;를 보여줍니다. sudo는 관리자 권한으로 실행하라는 의미이니, 비밀번호를 입력해야 할 수도 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;20:1-20:30&quot; data-ke-size=&quot;size16&quot;&gt;명령어를 실행하면 아래와 비슷한 결과가 나타날 거예요.&lt;/p&gt;
&lt;p data-sourcepos=&quot;20:1-20:30&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;COMMAND    PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     12345  your_user   5u  IPv4 0xabcdef1234567890      0t0  TCP *:9000 (LISTEN)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;27:1-27:113&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;27:1-27:113&quot; data-ke-size=&quot;size16&quot;&gt;여기서 가장 중요한 건 PID 열에 있는 숫자입니다. 위 예시에서는 12345가 바로 해당 포트를 사용하는 node 프로세스의 고유 ID, 즉 &lt;b&gt;PID&lt;/b&gt;입니다. 이 숫자를 잘 기억해두세요&lt;/p&gt;
&lt;p data-sourcepos=&quot;27:1-27:113&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;27:1-27:113&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;31:1-31:27&quot; data-ke-size=&quot;size23&quot;&gt;2. 문제의 프로세스 깔끔하게 종료하기&lt;/h3&gt;
&lt;p data-sourcepos=&quot;33:1-33:39&quot; data-ke-size=&quot;size16&quot;&gt;이제 앞서 확인한 PID를 사용해서 해당 프로세스를 종료할 차례입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;33:1-33:39&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-sourcepos=&quot;35:1-35:20&quot; data-ke-size=&quot;size20&quot;&gt;1. 안전하게 종료 (권장)&lt;/h4&gt;
&lt;p data-sourcepos=&quot;37:1-37:86&quot; data-ke-size=&quot;size16&quot;&gt;대부분의 경우 이 방법으로 충분합니다. 프로세스에게 &quot;이제 그만 종료해줘&quot;라는 신호를 보내는 방식이라, 데이터를 저장하거나 정리할 시간을 줄 수 있습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kill 12345  # 12345는 위에서 확인한 실제 PID로 바꿔주세요!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-sourcepos=&quot;43:1-43:22&quot; data-ke-size=&quot;size20&quot;&gt;2. 강제 종료 (최후의 수단)&lt;/h4&gt;
&lt;p data-sourcepos=&quot;45:1-45:63&quot; data-ke-size=&quot;size16&quot;&gt;만약 kill 명령어로도 프로세스가 꿈쩍하지 않거나, 정말 급하게 종료해야 할 때는 다음 명령어를 사용합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;kill -9 12345  # 역시 12345를 실제 PID로 바꿔주세요!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;51:1-51:144&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;51:1-51:144&quot; data-ke-size=&quot;size16&quot;&gt;kill -9는 프로세스를 즉시 강제 종료시키는 강력한 명령어입니다. 이 방법은 프로세스가 정리 작업을 수행할 기회를 주지 않으므로, 경우에 따라 데이터 손실이나 시스템 불안정을 초래할 수 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;51:1-51:144&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;55:1-55:20&quot; data-ke-size=&quot;size23&quot;&gt;3. 포트 해제 여부 확인&lt;/h3&gt;
&lt;p data-sourcepos=&quot;57:1-57:66&quot; data-ke-size=&quot;size16&quot;&gt;프로세스를 종료했다면, 이제 해당 포트가 제대로 해제되었는지 확인해봐야겠죠? 다시 터미널에서 다음 명령어를 입력합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;sudo lsof -i :[포트 번호]
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;63:1-63:65&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;63:1-63:65&quot; data-ke-size=&quot;size16&quot;&gt;아무런 결과도 출력되지 않는다면, 축하합니다! 해당 포트가 성공적으로 해제되어 이제 원하는 곳에 사용할 수 있습니다.&lt;/p&gt;</description>
      <category>tools</category>
      <category>맥 프로세스 종료</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/170</guid>
      <comments>https://codemanager.tistory.com/170#entry170comment</comments>
      <pubDate>Wed, 11 Jun 2025 22:06:43 +0900</pubDate>
    </item>
    <item>
      <title>Java - Math.random()&amp;nbsp;보안 취약점</title>
      <link>https://codemanager.tistory.com/169</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서 Math.random()은 간단한 의사 난수(pseudo-random number)를 생성하는 데 사용되지만, 보안적인 목적으로는 절대 사용하면 안 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Math.random()은 예측 가능한 알고리즘을 사용하며, 이는 공격자가 다음 난수를 예측하거나 역추적할 수 있게 하여 보안 취약점을 야기할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:76&quot; data-ke-size=&quot;size16&quot;&gt;보안적으로 안전한 난수 생성이 필요한 경우, Java에서는 java.security.SecureRandom 클래스를 사용해야 합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:76&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:76&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;5:1-5:36&quot; data-ke-size=&quot;size23&quot;&gt;java.security.SecureRandom의 장점&lt;/h3&gt;
&lt;p data-sourcepos=&quot;7:1-7:42&quot; data-ke-size=&quot;size16&quot;&gt;SecureRandom은 다음과 같은 이유로 보안적인 상황에 적합합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-sourcepos=&quot;9:1-14:0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-sourcepos=&quot;9:1-10:0&quot;&gt;&lt;b&gt;암호학적으로 안전한 의사 난수 생성기 (CSPRNG):&lt;/b&gt; SecureRandom은 Math.random()이나 java.util.Random과 달리 암호학적으로 강력한 알고리즘(예: SHA1PRNG, NativePRNG, DRBG 등)을 사용하여 난수를 생성합니다. 이는 생성된 난수가 통계적으로 무작위일 뿐만 아니라, 예측 불가능하고 역추적 불가능하게 만듭니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;11:1-12:0&quot;&gt;&lt;b&gt;엔트로피 소스 활용:&lt;/b&gt; SecureRandom은 운영체제에서 제공하는 엔트로피 소스(예: Linux의 /dev/random 또는 /dev/urandom)를 활용하여 초기 시드(seed)를 생성합니다. 이 시드는 예측 불가능하며, 이를 기반으로 생성되는 난수도 예측 불가능하게 됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;13:1-14:0&quot;&gt;&lt;b&gt;다양한 난수 생성 메서드:&lt;/b&gt; SecureRandom은 nextInt(), nextLong(), nextBytes() 등 다양한 타입의 난수를 생성하는 메서드를 제공합니다. 특히 바이트 배열을 채우는 nextBytes()는 암호화 키, 솔트(salt), 토큰 등 보안 관련 데이터를 생성할 때 매우 유용합니다.&lt;/li&gt;
&lt;/ol&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;pre id=&quot;code_1748743196649&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.security.SecureRandom;

public class SecureRandomExample {

    public static void main(String[] args) {
        // 1. SecureRandom 인스턴스 생성 (기본 알고리즘 사용)
        SecureRandom secureRandom = new SecureRandom();

        // 2. 다양한 타입의 보안적으로 안전한 난수 생성
        // 정수 생성
        int randomNumber = secureRandom.nextInt();
        System.out.println(&quot;Secure Random Integer: &quot; + randomNumber);

        // 특정 범위의 정수 생성 (예: 0부터 99까지)
        int randomBoundedNumber = secureRandom.nextInt(100);
        System.out.println(&quot;Secure Random Bounded Integer (0-99): &quot; + randomBoundedNumber);

        // 긴 정수 생성
        long randomLong = secureRandom.nextLong();
        System.out.println(&quot;Secure Random Long: &quot; + randomLong);

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;80:1-80:8&quot; data-ke-size=&quot;size23&quot;&gt;주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;82:1-84:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;82:1-82:195&quot;&gt;SecureRandom은 Math.random()이나 java.util.Random보다 난수 생성 속도가 느릴 수 있습니다. 이는 더 복잡한 알고리즘과 외부 엔트로피 소스를 사용하기 때문입니다. 따라서 성능이 매우 중요하고 보안이 중요하지 않은 단순 시뮬레이션이나 게임 등에서는 java.util.Random을 고려할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;83:1-84:0&quot;&gt;SecureRandom 인스턴스를 생성할 때 초기 시드링(seeding) 과정에서 시간이 다소 걸릴 수 있습니다. 따라서 반복적으로 SecureRandom 객체를 생성하는 것보다는, 한 번 생성하여 재사용하는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Java</category>
      <category>java math random 취약점</category>
      <category>java random 보안</category>
      <category>자바 보안</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/169</guid>
      <comments>https://codemanager.tistory.com/169#entry169comment</comments>
      <pubDate>Sun, 1 Jun 2025 11:01:10 +0900</pubDate>
    </item>
    <item>
      <title>AWS Ligthsail 도메인 설정</title>
      <link>https://codemanager.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;AWS Lightsail에서 도메인을 설정할 때 인스턴스에서 사용할 도메인을 선택하는 옵션의 차이점에 대해 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:27&quot; data-ke-size=&quot;size16&quot;&gt;선택하실 수 있는 3가지 옵션은 다음과 같습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;3:1-3:27&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-sourcepos=&quot;5:1-21:0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-sourcepos=&quot;5:1-9:0&quot;&gt;&lt;b&gt;도메인 이름 선택 (domain.example)&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;6:5-9:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;6:5-6:78&quot;&gt;이 옵션을 선택하면 &lt;b&gt;정확히 domain.example 이라는 도메인 이름&lt;/b&gt;으로만 인스턴스에 접속할 수 있도록 설정합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;7:5-7:87&quot;&gt;www.domain.example 또는 blog.domain.example 과 같은 하위 도메인으로는 해당 인스턴스에 접속할 수 없습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;8:5-9:0&quot;&gt;특정 도메인 이름 하나만을 사용하여 서비스를 제공하고자 할 때 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:1-15:0&quot;&gt;&lt;b&gt;domain.example의 하위 도메인&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;11:5-15:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;11:5-11:80&quot;&gt;이 옵션을 선택하면 &lt;b&gt;domain.example 의 모든 1단계 하위 도메인&lt;/b&gt;을 통해 인스턴스에 접속할 수 있도록 설정합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;12:5-12:95&quot;&gt;예를 들어, www.domain.example, blog.domain.example, shop.domain.example 등으로 접속할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;13:5-13:63&quot;&gt;sub.blog.domain.example 과 같은 2단계 이하의 하위 도메인은 포함되지 않습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;14:5-15:0&quot;&gt;주 도메인 아래에 여러 개의 섹션 또는 서비스를 하위 도메인으로 나누어 운영할 때 유용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;16:1-21:0&quot;&gt;&lt;b&gt;domain.example의 모든 하위 도메인&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;17:5-21:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;17:5-17:76&quot;&gt;이 옵션을 선택하면 &lt;b&gt;domain.example 의 모든 하위 도메인&lt;/b&gt;을 통해 인스턴스에 접속할 수 있도록 설정합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;18:5-18:158&quot;&gt;www.domain.example, blog.domain.example, shop.domain.example 뿐만 아니라 sub.blog.domain.example, admin.shop.domain.example 등 모든 단계의 하위 도메인을 포함합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;19:5-19:67&quot;&gt;와일드카드(*) DNS 레코드와 유사한 개념으로, 앞으로 생성될 모든 하위 도메인에도 자동으로 적용됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;20:5-21:0&quot;&gt;매우 광범위한 하위 도메인 사용 계획이 있거나, 모든 하위 도메인을 특정 인스턴스로 연결하고자 할 때 선택합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-sourcepos=&quot;22:1-22:20&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;어떤 옵션을 선택해야 할까요?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-sourcepos=&quot;24:1-24:45&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;26:1-29:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;26:1-26:58&quot;&gt;단일 웹사이트 또는 서비스라면 &quot;도메인 이름 선택&quot;을 선택하는 것이 가장 간단하고 명확합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;27:1-27:112&quot;&gt;블로그, 쇼핑몰, 포럼 등 여러 개의 독립적인 서비스를 하나의 도메인 아래에서 운영한다면 &quot;domain.example의 하위 도메인&quot;을 선택하여 각 서비스를 명확하게 구분할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:1-29:0&quot;&gt;앞으로 다양한 하위 도메인을 계속해서 확장할 계획이 있거나, 특정 인스턴스에서 모든 하위 도메인을 처리하도록 하려면 &quot;domain.example의 모든 하위 도메인&quot;을 선택하는 것이 편리할 수 있습니다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;30:1-30:101&quot; data-ke-size=&quot;size16&quot;&gt;Lightsail의 도메인 설정은 DNS 레코드 설정을 통해 이루어지므로, 선택한 옵션에 따라 Lightsail DNS 영역에 적절한 A 레코드 또는 CNAME 레코드가 생성됩니다.&lt;/p&gt;</description>
      <category>web</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/167</guid>
      <comments>https://codemanager.tistory.com/167#entry167comment</comments>
      <pubDate>Tue, 20 May 2025 20:55:30 +0900</pubDate>
    </item>
    <item>
      <title>Java - URL 인코딩 디코딩 예제</title>
      <link>https://codemanager.tistory.com/165</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 개발을 하다 보면 종종 URL에 한글이나 특수 문자를 포함해야 할 때가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 사용하는 것이 바로 URL 인코딩(encoding)입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java에서는 java.net.URLEncoder와 java.net.URLDecoder 클래스를 사용하면 URL 인코딩과 디코딩을 간단하게 처리할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;URL 인코딩이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL에 포함할 수 없는 문자(예: 한글, 공백, 특수문자)를 &lt;code&gt;%&lt;/code&gt;와 숫자 조합으로 바꾸는 작업입니다.&lt;/p&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;공백 &amp;rarr; &lt;code&gt;%20&lt;/code&gt; (또는 &lt;code&gt;+&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;한글 &amp;rarr; &lt;code&gt;%ED%95%9C%EA%B8%80&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;: &amp;rarr; &lt;code&gt;%3A&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 사용법&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import java.net.URLEncoder;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

public class UrlEncodingExample {
    public static void main(String[] args) throws Exception {
        String original = &quot;한글 테스트 / 공백 : 특수문자 !@#&quot;;

        // 인코딩
        String encoded = URLEncoder.encode(original, StandardCharsets.UTF_8.toString());
        System.out.println(&quot;Encoded: &quot; + encoded);

        // 디코딩
        String decoded = URLDecoder.decode(encoded, StandardCharsets.UTF_8.toString());
        System.out.println(&quot;Decoded: &quot; + decoded);
    }
}&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;Encoded: %ED%95%9C%EA%B8%80+%ED%85%8C%EC%8A%A4%ED%8A%B8+%2F+%EA%B3%B5%EB%B0%B1+%3A+%ED%8A%B9%EC%88%98%EB%AC%B8%EC%9E%90+%21%40%23&lt;br /&gt;Decoded: 한글 테스트 / 공백 : 특수문자 !@#&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;h2 data-end=&quot;1260&quot; data-start=&quot;1247&quot; data-ke-size=&quot;size26&quot;&gt;인코딩 시 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1420&quot; data-start=&quot;1262&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1323&quot; data-start=&quot;1262&quot;&gt;URLEncoder.encode()는 HTML form 전송 방식에 맞춰 공백을 +로 인코딩합니다.&lt;/li&gt;
&lt;li data-end=&quot;1374&quot; data-start=&quot;1324&quot;&gt;브라우저나 HTTP 라이브러리에서는 공백을 %20으로 처리하는 것을 더 선호합니다.&lt;/li&gt;
&lt;li data-end=&quot;1420&quot; data-start=&quot;1375&quot;&gt;필요한 경우 .replace(&quot;+&quot;, &quot;%20&quot;)으로 보정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1747364051008&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String encodedForUrl = URLEncoder.encode(original, &quot;UTF-8&quot;).replace(&quot;+&quot;, &quot;%20&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;h2 data-end=&quot;1882&quot; data-start=&quot;1859&quot; data-ke-size=&quot;size26&quot;&gt;URLDecoder는 언제 사용할까?&lt;/h2&gt;
&lt;p data-end=&quot;1938&quot; data-start=&quot;1884&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트에서 전송한 파라미터가 % 형태로 전달되었을 때 원래 문자열로 복원할 때 사용합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1747364086104&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;String encodedValue = &quot;%ED%95%9C%EA%B8%80&quot;;
String decodedValue = URLDecoder.decode(encodedValue, &quot;UTF-8&quot;);
System.out.println(decodedValue); // 한글&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;h2 data-end=&quot;2111&quot; data-start=&quot;2106&quot; data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2253&quot; data-start=&quot;2113&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2176&quot; data-start=&quot;2113&quot;&gt;Java에서는 URLEncoder와 URLDecoder로 간편하게 URL 인코딩을 처리할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;2220&quot; data-start=&quot;2177&quot;&gt;웹 개발에서 쿼리 파라미터나 URL 문자열을 다룰 때 필수적인 기능입니다.&lt;/li&gt;
&lt;li data-end=&quot;2253&quot; data-start=&quot;2221&quot;&gt;공백 처리(+ vs %20)에 유의해야 합니다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Java</category>
      <category>java url 디코딩</category>
      <category>java url 인코딩</category>
      <category>자바 url</category>
      <category>자바 인코딩</category>
      <category>자바 쿼리스트링</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/165</guid>
      <comments>https://codemanager.tistory.com/165#entry165comment</comments>
      <pubDate>Fri, 16 May 2025 17:53:21 +0900</pubDate>
    </item>
    <item>
      <title>데이터독 로그 관리 및 비용 절감</title>
      <link>https://codemanager.tistory.com/166</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Datadog은 강력한 로깅 및 모니터링 플랫폼이지만, 로그 데이터의 양이 늘어남에 따라 비용 부담 또한 증가할 수 있습니다.&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-sourcepos=&quot;5:1-5:23&quot; data-ke-size=&quot;size23&quot;&gt;Datadog 로그 비용 구조 이해&lt;/h3&gt;
&lt;p data-sourcepos=&quot;7:1-7:40&quot; data-ke-size=&quot;size16&quot;&gt;Datadog의 로그 관련 비용은 크게 두 가지 핵심 요소로 구성됩니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-sourcepos=&quot;9:1-11:0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-sourcepos=&quot;9:1-9:140&quot;&gt;&lt;b&gt;로그 수집 (Log Ingestion) 비용:&lt;/b&gt; Datadog으로 전송되는 모든 로그 데이터의 총 볼륨(GB)에 따라 월별로 부과됩니다. 마치 수도 요금처럼, Datadog으로 흘러 들어오는 로그 데이터의 양에 비례하여 비용이 발생합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;10:1-11:0&quot;&gt;&lt;b&gt;로그 인덱싱 (Log Indexing) 및 보관 (Retention) 비용:&lt;/b&gt; 실제로 검색 및 분석이 가능하도록 Datadog의 인덱스에 저장되는 로그 이벤트의 수(백만 건당)와 보관 기간에 따라 월별로 부과됩니다. 중요한 정보를 검색하고 활용하기 위해 저장하는 것에 대한 비용이라고 생각하시면 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PsdVL/btsN0ZZbAfO/jZqgIufHDDqZgj5DP60hPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PsdVL/btsN0ZZbAfO/jZqgIufHDDqZgj5DP60hPK/img.png&quot; data-alt=&quot;데이터독&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PsdVL/btsN0ZZbAfO/jZqgIufHDDqZgj5DP60hPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPsdVL%2FbtsN0ZZbAfO%2FjZqgIufHDDqZgj5DP60hPK%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;480&quot; height=&quot;251&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터독&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;12:1-12:17&quot; data-ke-size=&quot;size23&quot;&gt;비용 절감 전략&lt;/h3&gt;
&lt;p data-sourcepos=&quot;14:1-14:126&quot; data-ke-size=&quot;size16&quot;&gt;이제 Datadog 로그 관리 비용을 절감할 수 있는 구체적인 방법들을 살펴보겠습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;14:1-14:126&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-sourcepos=&quot;16:1-16:43&quot; data-ke-size=&quot;size20&quot;&gt;1. 애플리케이션 코드 레벨에서의 로그 최적화 (가장 효과적인 방법)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;18:1-22:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;18:1-18:117&quot;&gt;&lt;b&gt;전략:&lt;/b&gt; 불필요한 로그 출력을 줄이거나, 로그 레벨을 조정하여 (예: DEBUG 대신 INFO 또는 ERROR 레벨만 기록) Datadog으로 전송되는 로그 데이터의 양 자체를 최소화합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;19:1-19:113&quot;&gt;&lt;b&gt;비용 절감 효과:&lt;/b&gt; 로그 수집 비용과 인덱싱/보관 비용 모두를 획기적으로 절감할 수 있습니다. 로그가 생성되지 않으므로 Datadog으로 전송되는 데이터 볼륨 자체가 줄어들기 때문입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;20:1-20:76&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 가장 근본적인 비용 절감 방법이며, 네트워크 트래픽 감소 및 Datadog 백엔드 부하 감소 효과도 얻을 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;21:1-22:0&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 애플리케이션 코드 수정 및 재배포가 필요하며, 운영 중 실시간 적용이 어렵고, 문제 발생 시 상세 로그 확인이 어려워질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;23:1-23:25&quot; data-ke-size=&quot;size20&quot;&gt;2. Datadog 로그 인덱스 관리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;25:1-29:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;25:1-25:134&quot;&gt;&lt;b&gt;전략:&lt;/b&gt; Datadog 콘솔의 &quot;Log Indexes&quot; 기능을 활용하여 일일 할당량(Daily Quota)을 설정하고, 불필요한 로그 패턴을 제외 필터(Exclusion Filters)에 등록하여 인덱싱되는 로그의 양을 제한합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;26:1-26:89&quot;&gt;&lt;b&gt;비용 절감 효과:&lt;/b&gt; 로그 인덱싱 및 보관 비용을 절감할 수 있습니다. 수집된 로그 중 필요한 로그만 인덱싱하여 저장함으로써 비용을 최적화합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;27:1-27:133&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 애플리케이션 코드 수정 없이 Datadog 콘솔에서 비교적 쉽게 설정 변경이 가능하며, 운영 중 실시간 적용이 용이합니다. 제외된 로그도 Live Tail에서 확인하거나 메트릭 생성, 아카이빙에는 영향을 미치지 않습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:1-29:0&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 로그 수집 비용은 그대로 발생합니다. 중요한 로그를 실수로 제외하지 않도록 주의해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;30:1-30:34&quot; data-ke-size=&quot;size20&quot;&gt;3. Observability Pipelines 활용&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;32:1-36:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;32:1-32:158&quot;&gt;&lt;b&gt;전략:&lt;/b&gt; Datadog으로 로그가 유입되기 전에 Observability Pipelines를 구성하여 로그 데이터를 전처리합니다. 필터링, 샘플링, 할당량 설정, 중복 제거 등의 프로세서를 통해 Datadog으로 전송 및 인덱싱되는 로그의 양을 정교하게 제어할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;33:1-33:113&quot;&gt;&lt;b&gt;비용 절감 효과:&lt;/b&gt; 로그 수집 및 인덱싱/보관 비용 모두를 효과적으로 절감할 수 있습니다. 불필요한 로그는 아예 필터링하여 수집을 막거나, 샘플링을 통해 데이터 볼륨을 줄일 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;34:1-34:64&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 매우 강력하고 유연한 로그 관리 기능을 제공하며, 세밀한 규칙 기반으로 비용 최적화가 가능합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;35:1-36:0&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 초기 설정 및 관리에 대한 학습 곡선이 있을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;37:1-37:27&quot; data-ke-size=&quot;size20&quot;&gt;4. Datadog Agent 설정 조정&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;39:1-43:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;39:1-39:124&quot;&gt;&lt;b&gt;전략:&lt;/b&gt; Datadog Agent의 설정 파일 (datadog.yaml 또는 개별 인테그레이션 설정 파일)을 수정하여 특정 로그 파일이나 디렉토리를 수집 대상에서 제외하거나, 로그 수집 관련 설정을 변경합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;40:1-40:103&quot;&gt;&lt;b&gt;비용 절감 효과:&lt;/b&gt; &lt;b&gt;로그 수집 비용을 절감&lt;/b&gt;할 수 있습니다. Agent 레벨에서 불필요한 로그를 수집하지 않도록 설정하여 Datadog으로 전송되는 데이터 양을 줄입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;41:1-41:37&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; 특정 로그 소스에 대한 세밀한 제어가 가능합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;42:1-43:0&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; Agent 설정 변경 후 재시작이 필요할 수 있으며, 콘솔에서 직접 관리하는 것이 아니므로 서버 접근 권한이 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;44:1-44:15&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-sourcepos=&quot;44:1-44:15&quot; data-ke-size=&quot;size23&quot;&gt;실제 비용 예시 비교&lt;/h3&gt;
&lt;p data-sourcepos=&quot;46:1-46:42&quot; data-ke-size=&quot;size16&quot;&gt;다음은 가상의 시나리오를 통해 각 전략의 비용 절감 효과를 비교한 것입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;48:1-48:78&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가정:&lt;/b&gt; 월간 100GB의 로그 데이터를 Datadog으로 전송하고 있으며, 이 중 1억 개의 로그 이벤트가 15일 동안 인덱싱됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;50:1-64:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;50:1-54:0&quot;&gt;&lt;b&gt;기본 비용:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;51:5-54:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;51:5-51:42&quot;&gt;로그 수집 비용: 100GB * $0.10/GB = $10.00&lt;/li&gt;
&lt;li data-sourcepos=&quot;52:5-52:63&quot;&gt;로그 인덱싱 및 보관 비용 (15일): 100백만 이벤트 * $1.70/백만 이벤트 = $170.00&lt;/li&gt;
&lt;li data-sourcepos=&quot;53:5-54:0&quot;&gt;&lt;b&gt;총 월별 비용: $180.00&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;55:1-59:0&quot;&gt;&lt;b&gt;전략 1 (코드 최적화 - 50% 로그 감소):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;56:5-59:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;56:5-56:40&quot;&gt;로그 수집 비용: 50GB * $0.10/GB = $5.00&lt;/li&gt;
&lt;li data-sourcepos=&quot;57:5-57:61&quot;&gt;로그 인덱싱 및 보관 비용 (15일): 50백만 이벤트 * $1.70/백만 이벤트 = $85.00&lt;/li&gt;
&lt;li data-sourcepos=&quot;58:5-59:0&quot;&gt;&lt;b&gt;총 월별 비용: $90.00 (50% 절감)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;60:1-64:0&quot;&gt;&lt;b&gt;전략 2 (인덱스 제외 - 50% 로그 제외):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;61:5-64:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;61:5-61:50&quot;&gt;로그 수집 비용: 100GB * $0.10/GB = $10.00 (절감 없음)&lt;/li&gt;
&lt;li data-sourcepos=&quot;62:5-62:70&quot;&gt;로그 인덱싱 및 보관 비용 (15일): 50백만 이벤트 * $1.70/백만 이벤트 = $85.00 (50% 절감)&lt;/li&gt;
&lt;li data-sourcepos=&quot;63:5-64:0&quot;&gt;&lt;b&gt;총 월별 비용: $95.00 (47.2% 절감)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;65:1-65:149&quot; data-ke-size=&quot;size16&quot;&gt;이 예시에서 볼 수 있듯이, 애플리케이션 코드 레벨에서 로그를 최적화하는 것이 Datadog 비용을 가장 효과적으로 절감하는 방법임을 알 수 있습니다. 인덱스 제외 또한 상당한 비용 절감 효과를 가져오지만, 수집 비용은 그대로 유지된다는 점을 고려해야 합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;67:1-67:6&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-sourcepos=&quot;67:1-67:6&quot; data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-sourcepos=&quot;69:1-69:173&quot; data-ke-size=&quot;size16&quot;&gt;Datadog 로그 관리 비용 절감은 단순히 비용을 줄이는 것을 넘어, 중요한 로그 데이터에 집중하고 시스템의 효율성을 높이는 과정입니다. 애플리케이션 코드 최적화를 우선적으로 고려하고, Datadog의 다양한 로그 관리 기능을 활용하여 상황에 맞는 최적의 비용 절감 전략을 수립하시기 바랍니다.&lt;/p&gt;</description>
      <category>tools</category>
      <category>데이터독 로그</category>
      <category>데이터독 로그 인덱스</category>
      <category>데이터독 로그 절감</category>
      <category>데이터독 로그 활용</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/166</guid>
      <comments>https://codemanager.tistory.com/166#entry166comment</comments>
      <pubDate>Fri, 16 May 2025 17:53:11 +0900</pubDate>
    </item>
    <item>
      <title>자녀 스마트폰 관리 가이드 (iOS와 안드로이드 비교)</title>
      <link>https://codemanager.tistory.com/164</link>
      <description>&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;다행히도 iOS와 안드로이드에서는 부모가 자녀의 디지털 기기 사용을 효과적으로 관리할 수 있는 도구를 제공합니다.&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;iOS의 자녀 보호 기능: 스크린 타임과 구입 요청&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플의 iOS는 자녀 보호를 위한 두 가지 핵심 기능을 제공합니다.&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. 스크린 타임(Screen Time)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 구입 요청(Ask to Buy)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;스크린 타임(Screen Time) 주요 기능&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크린 타임은 iOS 12부터 도입된 기능으로, 기기 사용 습관을 관리하고 제한할 수 있습니다&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;: 특정 앱이나 앱 카테고리별로 일일 사용 시간을 설정할 수 있습니다. 예를 들어, 게임은 하루 1시간으로 제한할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;다운타임(Downtime)&lt;/b&gt;: 취침 시간이나 학습 시간 등 특정 시간대에 기기 사용을 제한할 수 있습니다.&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;li&gt;&lt;b&gt;항상 허용되는 앱&lt;/b&gt;: 다운타임 중에도 사용할 수 있는 필수 앱(예: 전화, 메시지)을 지정할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구입 요청(Ask to Buy) 기능&lt;/h3&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;자녀가 앱스토어에서 무료 또는 유료 앱을 다운로드하려고 할 때 부모에게 승인 요청이 전송됩니다.&lt;/li&gt;
&lt;li&gt;부모가 승인해야만 앱 설치 또는 결제가 가능합니다.&lt;/li&gt;
&lt;li&gt;이 기능은 자녀가 13세 미만인 경우 자동으로 활성화되며, 13-18세의 경우 수동으로 활성화할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;iOS 설정 방법&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부모 기기에서 &lt;b&gt;설정 &amp;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;스크린 타임&lt;/b&gt;을 탭하여 원하는 제한 사항을 설정합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구입 요청&lt;/b&gt;을 활성화하려면 자녀 계정 세부 정보에서 해당 옵션을 켭니다.&lt;/li&gt;
&lt;/ol&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;h2 data-ke-size=&quot;size26&quot;&gt;구글의 자녀 보호 기능: 패밀리 링크(Family Link)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글은 안드로이드 기기를 위한 &lt;b&gt;패밀리 링크(Family Link)&lt;/b&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;644&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vsyDR/btsNZ0qlHXT/5DXwVtrdKMQsNIxGHXYxm1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vsyDR/btsNZ0qlHXT/5DXwVtrdKMQsNIxGHXYxm1/img.webp&quot; data-alt=&quot;구글 패밀리 링크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vsyDR/btsNZ0qlHXT/5DXwVtrdKMQsNIxGHXYxm1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvsyDR%2FbtsNZ0qlHXT%2F5DXwVtrdKMQsNIxGHXYxm1%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;480&quot; height=&quot;265&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;356&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;패밀리 링크 주요 기능&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;앱 승인 및 차단&lt;/b&gt;: 자녀가 설치하려는 앱을 승인하거나 특정 앱을 차단할 수 있습니다.&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;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;사용 시간 모니터링&lt;/b&gt;: 자녀가 어떤 앱을 얼마나 사용했는지 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;패밀리 링크 설정 방법&lt;/h3&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;/li&gt;
&lt;li&gt;자녀의 기기에도 패밀리 링크 앱을 설치하고 로그인합니다.&lt;/li&gt;
&lt;li&gt;부모 기기에서 원하는 제한 사항을 설정합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;iOS vs 구글 패밀리 링크 기능 비교&lt;/h2&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;iOS(스크린 타임/구입 요청)&lt;/td&gt;
&lt;td&gt;구글 패밀리 링크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;✓ (가족 공유 필요)&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;td&gt;✓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&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;/td&gt;
&lt;td&gt;✓ (일간/주간)&lt;/td&gt;
&lt;td&gt;✓ (일간/주간/월간)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;두 시스템의 장단점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;iOS의 장점&lt;/h3&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;li&gt;앱 카테고리별 제한이 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;iOS의 단점&lt;/h3&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;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;/li&gt;
&lt;li&gt;더 세부적인 사용 보고서를 제공합니다.&lt;/li&gt;
&lt;li&gt;안드로이드 기기에 최적화되어 있습니다.&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;일부 제조사의 안드로이드 기기에서는 제한적으로 작동할 수 있습니다.&lt;/li&gt;
&lt;/ul&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;p data-ke-size=&quot;size16&quot;&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;: 제한을 설정하기 전에 자녀와 함께 그 이유에 대해 이야기하세요.&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT</category>
      <category>ios 자녀 관리</category>
      <category>구글 패밀리링크</category>
      <category>자녀 스마트폰</category>
      <category>키즈 스마트폰 관리</category>
      <category>키즈 핸드폰 관리</category>
      <category>키즈폰</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/164</guid>
      <comments>https://codemanager.tistory.com/164#entry164comment</comments>
      <pubDate>Fri, 16 May 2025 00:14:06 +0900</pubDate>
    </item>
    <item>
      <title>Java - ArrayList addAll과 add의 차이점</title>
      <link>https://codemanager.tistory.com/163</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바의 ArrayList에서 addAll() 메소드와 add() 메소드의 차이점은 다음과 같습니다.&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. 추가하는 요소의 수&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add():&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;하나의&amp;nbsp;요소만&amp;nbsp;추가합니다.&lt;/li&gt;
&lt;li&gt;addAll(): 여러 요소를 한 번에 추가할 수 있습니다.&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;2. 매개변수 타입&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add(): 단일 요소를 매개변수로 받습니다.&lt;/li&gt;
&lt;li&gt;addAll(): Collection 타입의 객체를 매개변수로 받습니다.&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;3. 사용 목적&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add(): 리스트에 개별 요소를 추가할 때 사용합니다&lt;/li&gt;
&lt;li&gt;addAll(): 다른 컬렉션의 모든 요소를 현재 리스트에 추가할 때 사용합니다&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;4. 리턴값&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add(): 요소가 성공적으로 추가되면 true를 반환합니다.&lt;/li&gt;
&lt;li&gt;addAll(): 리스트가 변경되었으면 true를, 그렇지 않으면 false를 반환합니다.&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;5. 내부 동작&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;add():&amp;nbsp;단순히&amp;nbsp;요소를&amp;nbsp;리스트의&amp;nbsp;끝에&amp;nbsp;추가합니다.&lt;/li&gt;
&lt;li&gt;addAll(): 전달된 컬렉션의 모든 요소를 순회하며 리스트에 추가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1732025565680&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ArrayList&amp;lt;String&amp;gt; list1 = new ArrayList&amp;lt;&amp;gt;();
list1.add(&quot;Apple&quot;);  // 단일 요소 추가

ArrayList&amp;lt;String&amp;gt; list2 = new ArrayList&amp;lt;&amp;gt;();
list2.add(&quot;Banana&quot;);
list2.add(&quot;Cherry&quot;);

list1.addAll(list2);  // list2의 모든 요소를 list1에 추가&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>java array addall</category>
      <category>자바 ArrayList</category>
      <author>codeManager</author>
      <guid isPermaLink="true">https://codemanager.tistory.com/163</guid>
      <comments>https://codemanager.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 19 Nov 2024 23:16:36 +0900</pubDate>
    </item>
  </channel>
</rss>