<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Intellog</title>
    <link>https://intelloper.tistory.com/</link>
    <description>안녕하세요. intelligence developer, intelloper입니다.  &amp;zwj;♂️ 
현재 풀스택 웹 개발자로 활동하고 있으며 인공지능 웹앱을 주로 구현합니다.  &amp;zwj; 
그에 맞는 기술과 지식을 공유하는 블로그이며 더 나아가 IT라는 광범위한 주제를 다루고 있습니다. 
주력 언어는 HTML, CSS, Javascript, Python이며 리눅스를 좋아합니다.</description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 18:01:06 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>인텔로퍼</managingEditor>
    <image>
      <title>Intellog</title>
      <url>https://tistory1.daumcdn.net/tistory/4539429/attach/ae5fef4fd2f043deb8ac01e993a2264c</url>
      <link>https://intelloper.tistory.com</link>
    </image>
    <item>
      <title>과한 추상화 멈추기: 실전 파이썬 리팩터링</title>
      <link>https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B3%BC%ED%95%9C-%EC%B6%94%EC%83%81%ED%99%94-%EB%A9%88%EC%B6%94%EA%B8%B0</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhhG9/btsQfy7hDTz/57i8fm0z100bbAJy2YK4R0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhhG9/btsQfy7hDTz/57i8fm0z100bbAJy2YK4R0/img.webp&quot; data-alt=&quot;Python clean code class를 단순하게! img generated by aickyway generator&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhhG9/btsQfy7hDTz/57i8fm0z100bbAJy2YK4R0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhhG9%2FbtsQfy7hDTz%2F57i8fm0z100bbAJy2YK4R0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Python clean code class를 단순하게! img generated by aickyway generator&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;클래스 줄이면 코드가 가벼워집니다.&lt;/span&gt;&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OOP가 늘 정답은 아니다. 단순함이 이길 때가 많다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&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;만 필요하면 @dataclass가 깔끔하다.&lt;/li&gt;
&lt;li&gt;가벼운 상태는 &lt;b&gt;dict&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;상속/폴리모피즘/GUI/프레임워크 요구&lt;/b&gt;가 있을 때는 클래스를 쓰자.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;용어 미리보기 (누구나 알 수 있게)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;OOP(Object-Oriented Programming)&lt;/b&gt;: 객체(데이터+메서드) 중심으로 코드를 구성하는 방식.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;클래스(Class)&lt;/b&gt;: 객체의 설계도. 속성(데이터)과 메서드(행동)를 정의한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상속(Inheritance)&lt;/b&gt;: 기존 클래스를 확장해서 새 클래스를 만드는 것.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캡슐화(Encapsulation)&lt;/b&gt;: 내부 구현을 감추고 인터페이스만 노출하는 것.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;폴리모피즘(Polymorphism)&lt;/b&gt;: 같은 메서드 이름이 상황에 따라 다르게 동작하는 것.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터클래스(@dataclass)&lt;/b&gt;: 데이터 보관용 클래스를 자동으로 만들어주는 파이썬 데코레이터.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DTO(Data Transfer Object)&lt;/b&gt;: 레이어 간 &lt;b&gt;데이터 전달용&lt;/b&gt; 객체. 로직은 거의 없다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모듈(Module)&lt;/b&gt;: 파이썬 파일 하나. 함수/변수/상수 등을 담는다. 필요하면 &quot;사실상 싱글턴&quot;처럼 공용 상태를 둘 수 있다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ETL&lt;/b&gt;: 데이터를 **추출(Extract)&amp;rarr;변환(Transform)&amp;rarr;적재(Load)**하는 작업 파이프라인.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;API&lt;/b&gt;: 프로그램 간 통신하는 &lt;b&gt;규약&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xC7pT/btsQgQsQ9Nc/bkXq60TwNOm80TM9YkLk4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xC7pT/btsQgQsQ9Nc/bkXq60TwNOm80TM9YkLk4K/img.png&quot; data-alt=&quot;Minimal, clean flat illustration comparing a simple Python function (one block) vs a tangled class hierarchy (many connected boxes). Soft pastel colors, vector style, high contrast, white background, editorial tech illustration.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xC7pT/btsQgQsQ9Nc/bkXq60TwNOm80TM9YkLk4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxC7pT%2FbtsQgQsQ9Nc%2FbkXq60TwNOm80TM9YkLk4K%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;512&quot; height=&quot;341&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Minimal, clean flat illustration comparing a simple Python function (one block) vs a tangled class hierarchy (many connected boxes). Soft pastel colors, vector style, high contrast, white background, editorial tech illustration.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;클래스에 집착하던 시절&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 뭐든 클래스로 감싸는 게 더 &amp;lsquo;프로&amp;rsquo; 같았다. __init__, 상속, 캡슐화&amp;hellip; 교과서대로 계층을 쌓고, 작은 작업에도 설계를 키웠다. 예를 들면:&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class User:
    def __init__(self, name, email):
        self.name = name
        self.email = email
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트가 커질수록 이상했다. **의식(ceremony)**이 늘고, 단순한 로직이 &lt;b&gt;불필요한 추상화&lt;/b&gt; 뒤에 숨어버렸다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그래서 뭘 쓰나? &amp;mdash; 내 대안 4가지&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1) 함수 우선 (Functions First)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태를 &lt;b&gt;호출 사이에 보관하지 않아도 된다면&lt;/b&gt;, 굳이 클래스가 필요 없다. 함수는 짧고 읽기 쉽고 테스트하기도 좋다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;def send_email(to, subject, body):
    # Simple and clear
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  테스트 팁: 함수는 &lt;b&gt;입력&amp;rarr;출력&lt;/b&gt;이 명확해서 모킹(mocking) 범위가 줄고, 단위 테스트가 쉬워진다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2) 데이터클래스(@dataclass)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 저장&lt;/b&gt;만 목적이라면 @dataclass가 최고다. 보일러플레이트 없이 __init__, __repr__ 등을 자동으로 제공한다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from dataclasses import dataclass

@dataclass
class User:
    name: str
    email: str
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTO, 설정(config), 구조화된 입력 등에 잘 맞는다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3) 가벼운 상태는 dict&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSON, API 응답, 설정처럼 가벼운 구조엔 &lt;b&gt;dict&lt;/b&gt;면 충분하다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;user = {
    &quot;name&quot;: &quot;Alice&quot;,
    &quot;email&quot;: &quot;alice@example.com&quot;,
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  팁: 외부 세계(JSON, YAML, HTTP)와 맞닿은 경계에선 dict가 &lt;b&gt;자연스럽고 직관적&lt;/b&gt;이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4) 모듈을 싱글턴처럼&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공용 상태나 유틸 함수는 &lt;b&gt;모듈&lt;/b&gt;로 풀자. 굳이 싱글턴 클래스로 감싸지 않아도 된다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# email_utils.py

def send_email(to, subject, body):
    pass

# usage
import email_utils
email_utils.send_email(...)
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; ️ 장점: &lt;b&gt;인스턴스화 불필요&lt;/b&gt;, 임포트만으로 명시적 네임스페이스 확보.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;너무 이른 추상화의 문제&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;테스트하기 어려워지고(&amp;ldquo;클래스를 모킹할까? 메서드를 모킹할까?&amp;rdquo;),&lt;/li&gt;
&lt;li&gt;장황해지고,&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;작은 스크립트, 마이크로서비스, ETL 작업에선 대부분 &lt;b&gt;과한 무게&lt;/b&gt;다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그럼에도 클래스를 쓰는 순간&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 &lt;b&gt;반(反) 클래스&lt;/b&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;/li&gt;
&lt;li&gt;PyQt, Pygame 같은 &lt;b&gt;복잡한 GUI/게임&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;프레임워크가 클래스를 요구할 때 (예: Django 모델, 일부 FastAPI 의존성 패턴)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;가변 상태&lt;/b&gt;와 **풍부한 행동(behavior)**을 동시에 가진 객체&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 리팩터링: 클래스 &amp;rarr; 함수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI 이벤트에 맞춰 슬랙에 메시지를 올리는 스크립트를 이렇게 바꿨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Before (class-based)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class SlackNotifier:
    def __init__(self, webhook_url):
        self.webhook_url = webhook_url

    def send(self, message):
        # send message to Slack
        ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;After (function-based)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;def send_slack_message(webhook_url, message):
    # send message to Slack
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 짧고, 테스트하기 쉬우며, &lt;b&gt;한 번 쓰려고 굳이 인스턴스를 만들 필요&lt;/b&gt;가 없다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;언제 클래스를 만들지 결정하는 체크리스트&lt;/h2&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한두 개라도 &amp;lsquo;아니오&amp;rsquo;라면, 클래스 없이 시작하자. 필요해지면 &lt;b&gt;그때 도입&lt;/b&gt;해도 늦지 않다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 &lt;b&gt;표현력이 풍부한 언어&lt;/b&gt;다. 기본값을 &amp;lsquo;클래스&amp;rsquo;로 두지 말자. 먼저 &lt;b&gt;함수/데이터클래스/딕셔너리/모듈&lt;/b&gt;로 풀고, 정말 필요할 때 &lt;b&gt;클래스&lt;/b&gt;를 쓰자. 미래의 나, 그리고 팀 동료가 고마워할 것이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;한 줄 요약&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;&lt;b&gt;정말 클래스가 필요한가?&lt;/b&gt;&amp;rdquo; &amp;mdash; 이 질문 하나면, 코드가 훨씬 가벼워진다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;함께보면 좋은글&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.02.20 - [Python/Clean Code Series(클린코드)] - FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756786660559&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;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&quot; data-og-description=&quot;소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  SOLID는 로버트 C. 마틴(일명 &amp;quot;Uncle Bob&amp;quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bs5O4H/hyZGiNdJv9/MMokwdM18eqxpKs4XnjqSK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cqZrYm/hyZGnAY4HJ/YKGaf7VY20X9onepMIErW1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bs5O4H/hyZGiNdJv9/MMokwdM18eqxpKs4XnjqSK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cqZrYm/hyZGnAY4HJ/YKGaf7VY20X9onepMIErW1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  SOLID는 로버트 C. 마틴(일명 &quot;Uncle Bob&quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.01.15 - [Python/정보] - 시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756786674337&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&quot; data-og-description=&quot;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/V5EBQ/hyZDS9PMbj/1bdu212ours9ZoalHOrIjK/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/oRVKG/hyZGexhuhk/sRTj3EKKHXzA6Bgky9w3dk/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/V5EBQ/hyZDS9PMbj/1bdu212ours9ZoalHOrIjK/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/oRVKG/hyZGexhuhk/sRTj3EKKHXzA6Bgky9w3dk/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.03.19 - [Architecture] - 2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756786688318&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;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&quot; data-og-description=&quot;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b84gsB/hyZGgPoChg/rVKiKnivKZ8qDZ5TIJ6zAK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/NoVfo/hyZDL3XE0v/vSkuC0ryIvlzoYw5UQb8E0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b84gsB/hyZGgPoChg/rVKiKnivKZ8qDZ5TIJ6zAK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/NoVfo/hyZDL3XE0v/vSkuC0ryIvlzoYw5UQb8E0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/Clean Code Series(클린코드)</category>
      <category>dataclass</category>
      <category>DTO</category>
      <category>OOP</category>
      <category>Python</category>
      <category>모듈디자인</category>
      <category>코드리팩토링</category>
      <category>테스트용이성</category>
      <category>파이썬함수</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/238</guid>
      <comments>https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B3%BC%ED%95%9C-%EC%B6%94%EC%83%81%ED%99%94-%EB%A9%88%EC%B6%94%EA%B8%B0#entry238comment</comments>
      <pubDate>Tue, 2 Sep 2025 13:13:08 +0900</pubDate>
    </item>
    <item>
      <title>ChatGPT&amp;middot;Claude 구독료 아끼는 똑똑한 결제 가이드</title>
      <link>https://intelloper.tistory.com/entry/ChatGPT%C2%B7Claude-%EA%B5%AC%EB%8F%85%EB%A3%8C-%EC%95%84%EB%81%BC%EB%8A%94-%EB%98%91%EB%98%91%ED%95%9C-%EA%B2%B0%EC%A0%9C-%EA%B0%80%EC%9D%B4%EB%93%9C</link>
      <description>&lt;h1&gt;ChatGPT&amp;middot;Claude 구독료 아끼는 똑똑한 결제 가이드&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매달 $2라도 아끼고, 환율 출렁임에도 멘탈 지키는 방법. (※ 법&amp;middot;정책 준수는 필수!)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;먼저, 용어를 아주 쉽게 정리할게요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;인앱 결제(IAP)&lt;/b&gt;: 앱 안에서 하는 결제. 일부 서비스는 &lt;b&gt;국가별 고정 가격&lt;/b&gt;을 둬서 환율 변동과 무관하게 같은 금액으로 결제되기도 해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부가가치세(VAT)&lt;/b&gt;: 한국에서 해외 디지털 서비스 결제 시 붙는 &lt;b&gt;약 10% 세금&lt;/b&gt;. 결제 마지막 단계에서 슬쩍 올라가서 $20 &amp;rarr; $22가 되는 그 친구.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해외 결제 수수료&lt;/b&gt;: 카드사에서 해외 결제 시 추가하는 &lt;b&gt;환전/브랜드 수수료&lt;/b&gt;. 0.5~2%대가 흔해요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고정 현지 통화 가격(Local Pricing)&lt;/b&gt;: 제공업체가 특정 국가에 &lt;b&gt;고정 금액&lt;/b&gt;을 책정해 환율이 올라가도 결제액이 변하지 않게 하는 정책.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트래블 월렛 카드(Travel Wallet)&lt;/b&gt;: 여러 통화를 &lt;b&gt;미리 충전&lt;/b&gt;해 두고 해외 결제 수수료 없이 쓰기 좋은 카드/앱.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9Sf68/btsQeVBP0N6/gRavR6CXbkKWxNrXklEHiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9Sf68/btsQeVBP0N6/gRavR6CXbkKWxNrXklEHiK/img.png&quot; data-alt=&quot;Flat style infographic showing IAP vs. Web checkout: $20 plan becoming $22 with VAT, arrows explaining taxes and fees, pastel colors, clean icons, Korean won and US dollar symbols&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9Sf68/btsQeVBP0N6/gRavR6CXbkKWxNrXklEHiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9Sf68%2FbtsQeVBP0N6%2FgRavR6CXbkKWxNrXklEHiK%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Flat style infographic showing IAP vs. Web checkout: $20 plan becoming $22 with VAT, arrows explaining taxes and fees, pastel colors, clean icons, Korean won and US dollar symbols&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 contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;TL;DR&lt;/h2&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;는 환율 + 10% VAT + 카드 해외 수수료로 &lt;b&gt;표시가보다 더 비싸질 수 있음&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인앱 결제&lt;/b&gt;는 국가별 &lt;b&gt;고정 현지 가격&lt;/b&gt;을 쓰는 경우가 있어 &lt;b&gt;환율 영향&amp;darr;&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;일부 사용자는 &lt;b&gt;미국 스토어 기준 가격&lt;/b&gt;으로 구독해 **$20 고정(추가 VAT 無)**을 경험.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트래블 월렛&lt;/b&gt;에 달러를 &lt;b&gt;유리한 환율일 때 충전&lt;/b&gt;해 두면 카드 수수료도 줄일 수 있음.&lt;/li&gt;
&lt;li&gt;가능하면 **연간 결제(예: 월 환산 $17)**로 더 절약.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚖️ &lt;b&gt;중요&lt;/b&gt;: 계정 지역/세금/결제 정책은 서비스&amp;middot;스토어 정책과 각국 법령에 따라 달라요. &lt;b&gt;본인 책임 하에 확인&lt;/b&gt;하세요.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 $20가 결제 단계에서 $22가 될까?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;표시가 $20&lt;/b&gt;(예: Pro 플랜) &amp;rarr; 결제 단계에서 **VAT(약 10%)**와 &lt;b&gt;해외 결제 수수료&lt;/b&gt;가 더해져 &lt;b&gt;$22&lt;/b&gt; 수준으로 나옵니다.&lt;/li&gt;
&lt;li&gt;환율이 오르면 원화 결제 총액도 같이 오르는 &lt;b&gt;가변 구조&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tRwj0/btsQhvBySKe/RKXtywUojufWazncvcZHd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tRwj0/btsQhvBySKe/RKXtywUojufWazncvcZHd1/img.png&quot; data-alt=&quot;Minimal line chart climbing upward labeled 'Exchange Rate', with small receipt icons showing $20 &amp;amp;rarr; $22, subtle red accent, clean UI dashboard style&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tRwj0/btsQhvBySKe/RKXtywUojufWazncvcZHd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtRwj0%2FbtsQhvBySKe%2FRKXtywUojufWazncvcZHd1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Minimal line chart climbing upward labeled 'Exchange Rate', with small receipt icons showing $20 &amp;rarr; $22, subtle red accent, clean UI dashboard style&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;인앱 결제가 유리한 이유 (케이스 공유)&lt;/h2&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;b&gt;환율 변동과 무관&lt;/b&gt;하게 정해진 금액으로 결제됩니다.&lt;/li&gt;
&lt;li&gt;사용자 사례: &lt;b&gt;미국 스토어 계정&lt;/b&gt;으로 인앱 결제 시 &lt;b&gt;$20 고정&lt;/b&gt;으로 청구돼, &lt;b&gt;국내 10% VAT나 추가 해외 수수료 없이&lt;/b&gt; 결제된 것을 확인.&lt;/li&gt;
&lt;li&gt;여기에 &lt;b&gt;트래블 월렛 카드&lt;/b&gt;를 연결해 &lt;b&gt;달러를 미리 충전&lt;/b&gt;(환율이 낮을 때)해 두면, 매달 청구 시 &lt;b&gt;불필요한 카드 수수료&lt;/b&gt;를 피할 수 있어요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLI4Qo/btsQfg6NhO0/RXGzDd4L9AdGZckvQwvJ91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLI4Qo/btsQfg6NhO0/RXGzDd4L9AdGZckvQwvJ91/img.png&quot; data-alt=&quot;Isometric smartphone with app store receipt showing $20 flat price, a shield icon labeled 'No extra fees', soft gradients, modern fintech look.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLI4Qo/btsQfg6NhO0/RXGzDd4L9AdGZckvQwvJ91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLI4Qo%2FbtsQfg6NhO0%2FRXGzDd4L9AdGZckvQwvJ91%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Isometric smartphone with app store receipt showing $20 flat price, a shield icon labeled 'No extra fees', soft gradients, modern fintech look.&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;약 $2(원화 3천 원대)&lt;/b&gt; 절약.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;고환율 시기&lt;/b&gt;에도 구독료가 &lt;b&gt;요동치지 않음&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연간 결제까지 더하면, 단가가 더 내려갑니다&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예: 월별 $20 대신 &lt;b&gt;연간 결제 시 월 환산 $17&lt;/b&gt;처럼 &lt;b&gt;장기 할인가&lt;/b&gt;가 제공되는 경우가 있어요.&lt;/li&gt;
&lt;li&gt;현재 일부 서비스는 &lt;b&gt;연간 결제가 웹에서만 가능&lt;/b&gt;할 수 있습니다. 인앱 고정가와의 &lt;b&gt;유불리를 비교&lt;/b&gt;하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doCtlX/btsQhcCja3h/lyxnMVY5CxzTi5xP1ih1O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doCtlX/btsQhcCja3h/lyxnMVY5CxzTi5xP1ih1O0/img.png&quot; data-alt=&quot;Calendar with 12 pages flipping into a single annual plan tag reading '$17/mo (annual)', friendly green checkmarks, clean editorial illustration.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doCtlX/btsQhcCja3h/lyxnMVY5CxzTi5xP1ih1O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoCtlX%2FbtsQhcCja3h%2FlyxnMVY5CxzTi5xP1ih1O0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Calendar with 12 pages flipping into a single annual plan tag reading '$17/mo (annual)', friendly green checkmarks, clean editorial illustration.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;합법&amp;middot;정책 체크리스트 (꼭 읽어주세요)&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글은 &lt;b&gt;가성비 결제 구조를 이해&lt;/b&gt;하는 데 도움을 주려는 정보 공유입니다. 실제 결제 전 아래를 확인하세요.&lt;/p&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;서비스 약관 &amp;amp; 앱마켓 정책&lt;/b&gt;: 계정 지역 설정, 결제 수단, 가족 공유, 환불 규정 등 위반 시 &lt;b&gt;서비스 제한&lt;/b&gt;이 있을 수 있어요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세법 준수&lt;/b&gt;: 각 국가의 &lt;b&gt;디지털 세금/VAT 규정&lt;/b&gt;이 다릅니다. 사업자/프리랜서는 &lt;b&gt;세금계산서&amp;middot;증빙&lt;/b&gt; 이슈도 함께 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해외 결제 리스크&lt;/b&gt;: 카드 분실&amp;middot;분쟁&amp;middot;청구 통화와의 환율 차이 등 &lt;b&gt;분쟁 처리 조건&lt;/b&gt;을 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H5CBN/btsQgQM0yTl/SOz9fkfhbWoW9f0CkKktvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H5CBN/btsQgQM0yTl/SOz9fkfhbWoW9f0CkKktvK/img.png&quot; data-alt=&quot;Compliance checklist on a clipboard with icons for tax, terms, and security, muted blue palette, approachable style.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H5CBN/btsQgQM0yTl/SOz9fkfhbWoW9f0CkKktvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH5CBN%2FbtsQgQM0yTl%2FSOz9fkfhbWoW9f0CkKktvK%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;1024&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Compliance checklist on a clipboard with icons for tax, terms, and security, muted blue palette, approachable style.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;한눈에 보는 실천 팁&lt;/h2&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; vs &lt;b&gt;웹 결제 총액&lt;/b&gt;(VAT+수수료 포함)을 &lt;b&gt;월/년 기준&lt;/b&gt;으로 직접 비교하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트래블 월렛&lt;/b&gt;: 해외 결제 수수료가 &lt;b&gt;0%에 가까운 카드/앱&lt;/b&gt;을 찾아 달러를 &lt;b&gt;저점일 때 충전&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프로모션/크레딧&lt;/b&gt;: 학할인, 번들, 파트너 크레딧을 &lt;b&gt;놓치지 않기&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;연간 결제&lt;/b&gt;가 가능하면 &lt;b&gt;총액&lt;/b&gt;으로 비교해 &lt;b&gt;실질 단가&lt;/b&gt;를 낮추세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매달 $2라도 꾸준히 아끼면 1년이면 점심 한 끼 값이 됩니다. 고정가 인앱 결제, 트래블 월렛 충전, 연간 결제 조합으로 &lt;b&gt;환율 스트레스와 불필요한 수수료&lt;/b&gt;를 줄여 보세요. 다만, &lt;b&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;&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;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.03.05 - [생성AI/ChatGPT] - 시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1756786535135&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&quot; data-og-description=&quot;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &amp;quot;코드를 짜줘&amp;quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cVBUuI/hyZDXpLfNK/TyDiofkqFFsKLYJiS0y3Vk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cL8BmX/hyZGgu5ffa/qZOg8fIc704VxL4Q6iyoc0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cVBUuI/hyZDXpLfNK/TyDiofkqFFsKLYJiS0y3Vk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cL8BmX/hyZGgu5ffa/qZOg8fIc704VxL4Q6iyoc0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &quot;코드를 짜줘&quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>생성AI/ChatGPT</category>
      <category>ChatGPT</category>
      <category>ChatGPT&amp;middot;Claude 구독료 아끼는 똑똑한 결제 가이드</category>
      <category>claude</category>
      <category>VAT</category>
      <category>고정환율</category>
      <category>구독절약</category>
      <category>연간결제</category>
      <category>인앱결제</category>
      <category>트래블월렛</category>
      <category>환율관리</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/237</guid>
      <comments>https://intelloper.tistory.com/entry/ChatGPT%C2%B7Claude-%EA%B5%AC%EB%8F%85%EB%A3%8C-%EC%95%84%EB%81%BC%EB%8A%94-%EB%98%91%EB%98%91%ED%95%9C-%EA%B2%B0%EC%A0%9C-%EA%B0%80%EC%9D%B4%EB%93%9C#entry237comment</comments>
      <pubDate>Tue, 2 Sep 2025 11:54:56 +0900</pubDate>
    </item>
    <item>
      <title>✨ PyTorch와 CUDA를 이용한 GPU 메모리 관리 마스터하기: CUDA 캐싱 할당자 완벽 활용 가이드 ✨</title>
      <link>https://intelloper.tistory.com/entry/PyTorch-CUDA-GPU-memory-management</link>
      <description>&lt;div id=&quot;chat-history&quot;&gt;
&lt;div id=&quot;dc79791dda07991d&quot;&gt;
&lt;div id=&quot;model-response-message-contentr_dc79791dda07991d&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2MCTy/btsNbnVq1ze/NiFqvF8F5Bz8I37jxV9CuK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2MCTy/btsNbnVq1ze/NiFqvF8F5Bz8I37jxV9CuK/img.webp&quot; data-alt=&quot;PyTorch와 CUDA를 이용한 GPU 메모리 관리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2MCTy/btsNbnVq1ze/NiFqvF8F5Bz8I37jxV9CuK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2MCTy%2FbtsNbnVq1ze%2FNiFqvF8F5Bz8I37jxV9CuK%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;PyTorch와 CUDA를 이용한 GPU 메모리 관리&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p data-sourcepos=&quot;7:1-7:76&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;7:1-7:76&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;7:1-7:76&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch로 대규모 딥러닝 모델을 훈련하거나 대용량 데이터셋을 다루어 본 경험이 있다면, 아래와 같은 메시지가 매우 익숙할 것입니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 512.00 MiB. GPU 0 has a total capacity of 79.32 GiB of which 401.56 MiB is free.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;13:1-13:160&quot; data-ke-size=&quot;size16&quot;&gt;바로 그 악명 높은 &lt;b&gt;CUDA out of memory (OOM)&lt;/b&gt; 오류입니다!   이 오류는 GPU가 텐서를 위한 공간을 할당하려 할 때 메모리가 부족하면 발생하며, 특히 모델을 세심하게 튜닝하고 코드를 최적화하는 데 많은 시간을 투자했을 때 마주하면 매우 답답할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;13:1-13:160&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;20:1-20:183&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch가 GPU 메모리 사용량을 어떻게 최적화하는지 깊이 파고들어 보고, 내부 시스템 중 일부를 조정하여 GPU 클러스터의 성능을 최대한 끌어올리는 방법을 알아보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;22:1-22:21&quot; data-ke-size=&quot;size26&quot;&gt;  GPU 메모리 관리의 중요성&lt;/h2&gt;
&lt;p data-sourcepos=&quot;24:1-24:196&quot; data-ke-size=&quot;size16&quot;&gt;기하급수적으로 증가하는 데이터셋과 점점 더 정교해지는 모델의 시대에, GPU 메모리의 효율적인 사용은 최우선 과제가 되었습니다. GPU가 아무리 강력하더라도 내장된 메모리는 항상 제한 요소입니다. 이로 인해 모든 메모리 할당 및 해제는 생각보다 더 큰 영향을 미칩니다. 연구자들이 대규모 모델을 훈련할 때 자주 겪는 몇 가지 어려움은 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;26:3-32:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;26:3-26:79&quot;&gt;&lt;b&gt;  제한된 메모리 용량:&lt;/b&gt; 본질적으로 물리적인 한계입니다. 훈련 단계나 데이터가 메모리에 맞지 않으면 훈련이 진행되지 않습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;27:3-27:93&quot;&gt;&lt;b&gt;⏳ 계산 비효율성:&lt;/b&gt; GPU는 데이터 전송을 기다리거나 다른 GPU가 작업을 수행하기를 기다리는 대신, 행렬 계산에 대부분의 시간을 사용해야 이상적입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:3-28:125&quot;&gt;&lt;b&gt;  통신 오버헤드:&lt;/b&gt; 통신에 소요되는 시간은 GPU가 유휴 상태이므로 낭비되는 시간입니다. 이를 최소화하려면 노드 간(느림) 및 노드 내(빠름) 통신 대역폭을 최대한 활용하고, 가급적 계산과 중첩시켜야 합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;29:3-29:152&quot;&gt;&lt;b&gt;  메모리 단편화:&lt;/b&gt; 잦은 메모리 할당/해제 (cudaMalloc 및 cudaFree 사용)는 GPU 메모리를 심하게 조각냅니다(단편화). 이는 심각한 문제인데, 사용 가능한 총 메모리가 상당하더라도 원하는 크기의 메모리를 할당하지 못할 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;30:3-30:70&quot;&gt;&lt;b&gt;⏱️ 할당 오버헤드:&lt;/b&gt; 잦은 할당/해제는 메모리 단편화뿐만 아니라 상당한 지연 시간(latency)을 추가합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;31:3-32:0&quot;&gt;&lt;b&gt;  동적 워크로드:&lt;/b&gt; 다양한 배치 크기, 동적 아키텍처 또는 다양한 크기의 입력을 처리하는 모델은 런타임 시 성능 저하 없이 적응할 수 있는 유연한 메모리 관리가 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;33:1-33:151&quot; data-ke-size=&quot;size16&quot;&gt;이러한 요인들을 이해하면 PyTorch의 **CUDA 캐싱 할당자(Caching Allocator)**가 메모리 관리 시스템에서 핵심적인 역할을 하는 이유를 알 수 있습니다. 이 할당자는 메모리 할당 오버헤드를 최소화하면서 단편화 및 지연 할당 문제를 해결합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;35:1-35:30&quot; data-ke-size=&quot;size26&quot;&gt;  PyTorch CUDA 캐싱 할당자 이해하기&lt;/h2&gt;
&lt;p data-sourcepos=&quot;37:1-37:71&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch 프로파일러를 사용하여 Llama 1B 모델을 훈련할 때 PyTorch가 메모리를 어떻게 할당하는지 살펴보겠습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;41:1-41:33&quot; data-ke-size=&quot;size16&quot;&gt;2단계부터 4단계까지의 메모리 사용 패턴은 매우 유사합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-sourcepos=&quot;43:1-46:0&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-sourcepos=&quot;43:1-43:57&quot;&gt;&lt;b&gt;순전파 (Forward Pass):&lt;/b&gt; 활성화(activation) 값이 빠르게 증가합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;44:1-44:89&quot;&gt;&lt;b&gt;역전파 (Backward Pass):&lt;/b&gt; 그래디언트(gradient)가 쌓이고, 그래디언트 계산에 사용된 저장된 활성화 값들은 점진적으로 지워집니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;45:1-46:0&quot;&gt;&lt;b&gt;최적화 (Optimization):&lt;/b&gt; 모든 그래디언트가 필요한 최적화 단계를 수행하고, 다음 순전파를 시작하기 전에 옵티마이저 상태(optimizer state)를 업데이트합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-sourcepos=&quot;47:1-47:42&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;그런데 왜 첫 번째 단계는 후속 단계들과 매우 다르게 보일까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;49:1-49:165&quot; data-ke-size=&quot;size16&quot;&gt;바로 이 지점에서 PyTorch의 &lt;b&gt;CUDA 캐싱 할당자&lt;/b&gt;가 작동하기 시작합니다! 첫 번째 단계에서 할당자는 후속 단계의 속도를 높이기 위해 미리 메모리 블록을 할당하고 캐싱합니다. 이렇게 하면 후속 단계에서는 사용 가능한 메모리 블록을 다시 검색할 필요 없이 빠르게 재사용할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;51:1-51:292&quot; data-ke-size=&quot;size16&quot;&gt;이 할당자는 기본적으로 PyTorch 런타임과 저수준 CUDA 드라이버 사이의 &quot;지능적인&quot; 중개자 역할을 수행하며, 가능한 경우 해제된 메모리 청크를 재사용하여 GPU 메모리의 할당 및 해제를 신중하게 관리합니다. 이를 통해 비용이 많이 드는 시스템 호출 (cudaMalloc, cudaFree)을 줄이고 성능을 유지합니다. 텐서가 더 이상 필요하지 않게 되면 해당 메모리는 즉시 GPU로 반환되지 않고, 나중에 재사용하기 위해 **내부 풀(pool)**에 저장됩니다. (기본적으로 메모리 풀링 기법입니다.)&lt;/p&gt;
&lt;p data-sourcepos=&quot;53:1-53:33&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;55:3-58:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;55:3-55:74&quot;&gt;&lt;b&gt;  훈련 속도 향상:&lt;/b&gt; 캐시에서 메모리를 재사용하는 것이 매번 cudaMalloc을 호출하는 것보다 훨씬 빠릅니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;56:3-56:68&quot;&gt;&lt;b&gt;  단편화 감소:&lt;/b&gt; 메모리 블록을 재활용하여 큰 연속 메모리 영역 확보 경쟁을 최소화하고 단편화를 줄입니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;57:3-58:0&quot;&gt;&lt;b&gt;⏱️ 지연 시간 감소:&lt;/b&gt; PyTorch CPU 실행은 종종 GPU 실행보다 앞서 진행되는데, 캐싱 할당자는 풀링 메커니즘을 통해 미리 메모리를 준비하여 실행 중 지연 시간을 숨기는 데 도움을 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;59:1-59:32&quot; data-ke-size=&quot;size26&quot;&gt; ️ CUDA 캐싱 할당자가 메모리를 관리하는 방법&lt;/h2&gt;
&lt;p data-sourcepos=&quot;61:1-61:42&quot; data-ke-size=&quot;size16&quot;&gt;이 시스템의 메모리 관리는 다음과 같은 주요 구성 요소로 나눌 수 있습니다:&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;63:1-63:31&quot; data-ke-size=&quot;size23&quot;&gt;1. 메모리 풀링 (Memory Pooling)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;65:1-65:136&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch에서 텐서를 해제할 때, 할당자는 메모리를 즉시 GPU로 반환하는 대신 캡처하여 **풀(pool)**에 저장합니다. 이 캐시된 메모리는 향후 할당 요청에 즉시 사용 가능하며, cudaMalloc 호출 오버헤드를 줄입니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;67:1-67:47&quot; data-ke-size=&quot;size23&quot;&gt;2. 재사용 및 지연 해제 (Reuse and Delayed Freeing)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;69:1-69:113&quot; data-ke-size=&quot;size16&quot;&gt;메모리 블록을 캐싱하여 요구 사항이 맞는 텐서에 즉시 &lt;b&gt;재사용&lt;/b&gt;합니다. &quot;지연 해제&quot;는 메모리가 낭비되지 않도록 하며, 캐시된 블록으로 요청을 충족할 수 없을 때만 CUDA에 새 메모리를 요청합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;71:1-71:41&quot; data-ke-size=&quot;size23&quot;&gt;3. 단편화 완화 (Fragmentation Mitigation)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;73:1-73:107&quot; data-ke-size=&quot;size16&quot;&gt;할당자는 메모리 블록을 통합하기 위해 적극적으로 작동합니다. 최근 해제된 메모리를 재사용하고 스마트 캐시를 유지 관리함으로써 &lt;b&gt;단편화 가능성&lt;/b&gt;을 줄여 더 연속적인 메모리 공간을 확보합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;75:1-75:51&quot; data-ke-size=&quot;size23&quot;&gt;4. 할당 정책 균형 조정 (Balancing Allocation Policies)&lt;/h3&gt;
&lt;p data-sourcepos=&quot;77:1-77:100&quot; data-ke-size=&quot;size16&quot;&gt;크고 작은 메모리 요청을 구별하고 별도의 전략을 유지합니다. 작은 블록은 효율적으로 캐시하고, 큰 블록은 캐시 공간 독점을 방지하며 즉각적인 재사용과 가용성 간의 균형을 맞춥니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;79:1-79:27&quot; data-ke-size=&quot;size26&quot;&gt;  이것이 사용자에게 어떤 이점을 줄까요?&lt;/h2&gt;
&lt;p data-sourcepos=&quot;81:1-81:48&quot; data-ke-size=&quot;size16&quot;&gt;할당자는 훈련뿐만 아니라 추론(inference)에서도 상당한 성능 향상을 제공합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;83:3-87:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;83:3-83:68&quot;&gt;&lt;b&gt;⚡ 더 빠른 메모리 할당:&lt;/b&gt; cudaMalloc 호출 감소로 할당 오버헤드가 줄어 반복 시간이 단축됩니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;84:3-84:65&quot;&gt;&lt;b&gt;  최적화된 리소스 사용:&lt;/b&gt; 메모리 효율성 증대로 메모리 제약이 심한 GPU에서도 실험이 가능해집니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;85:3-85:58&quot;&gt;&lt;b&gt;  단편화 감소:&lt;/b&gt; 지속적인 재사용/재활용으로 단편화가 억제되어 일관된 성능을 제공합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;86:3-87:0&quot;&gt;&lt;b&gt;  개발자를 위한 간소화된 워크플로우:&lt;/b&gt; 할당자가 내부적으로 작동하므로 개발자는 수동 메모리 관리 부담에서 벗어나 모델 개발에 더 집중할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;88:1-88:18&quot; data-ke-size=&quot;size26&quot;&gt;  고급 메모리 관리 기법&lt;/h2&gt;
&lt;p data-sourcepos=&quot;90:1-90:55&quot; data-ke-size=&quot;size16&quot;&gt;캐싱 할당자가 많은 일을 하지만, 다음과 같은 전략으로 메모리 사용량을 더욱 최적화할 수 있습니다:&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;92:1-92:32&quot; data-ke-size=&quot;size23&quot;&gt;1. 메모리 스냅샷으로 사용량 사전 모니터링  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;94:1-94:38&quot; data-ke-size=&quot;size16&quot;&gt;GPU 메모리 사용 현황 파악이 중요합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;94:1-94:38&quot; data-ke-size=&quot;size16&quot;&gt;내장 함수를 사용하세요:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import torch

# 현재 할당된 GPU 메모리 (활성 텐서가 사용하는 메모리)
print(f&quot;할당된 메모리: {torch.cuda.memory_allocated() / (1024 ** 2):.2f} MB&quot;)
# PyTorch 캐싱 할당자에 의해 예약된 총 GPU 메모리 (캐시 포함)
print(f&quot;예약된 메모리 (캐시 포함): {torch.cuda.memory_reserved() / (1024 ** 2):.2f} MB&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;105:1-105:98&quot; data-ke-size=&quot;size16&quot;&gt;PyTorch는 &lt;b&gt;메모리 스냅샷&lt;/b&gt; 생성 및 시각화 도구를 제공하여 메모리 소비 패턴, 최대 소비 지점, 단편화, 누수 등을 파악하는 데 도움을 줍니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;107:1-107:81&quot; data-ke-size=&quot;size16&quot;&gt;복잡하다면 _memory_viz.py 도구로 **플레임 그래프(flame graph)**를 생성할 수도 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;109:3-110:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;109:3-110:0&quot;&gt;&lt;b&gt;(참고)&lt;/b&gt; 프로파일러 사용 가이드: &lt;a href=&quot;https://pytorch.org/blog/understanding-gpu-memory-1/&quot;&gt;PyTorch 공식 블로그 게시물&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;111:1-111:19&quot; data-ke-size=&quot;size23&quot;&gt;2. 캐시 사전 관리  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;113:1-113:50&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;torch.cuda.empty_cache()
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;119:1-119:159&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ &lt;b&gt;주의:&lt;/b&gt; 이 함수는 캐시된 미사용 메모리만 해제합니다. 현재 사용 중인 텐서의 메모리는 해제하지 않습니다. 또한, 캐시를 비우면 다음에 큰 메모리 블록이 필요할 때 다시 cudaMalloc을 호출해야 하므로 성능 저하가 발생할 수 있습니다. 신중하게 사용해야 합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;121:1-121:30&quot; data-ke-size=&quot;size23&quot;&gt;3. CUDA 메모리 할당자 사용자 정의 ⚙️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;123:1-123:77&quot; data-ke-size=&quot;size16&quot;&gt;PYTORCH_CUDA_ALLOC_CONF 환경 변수로 캐싱 할당자 동작(최대 캐시 크기, 할당 전략 등)을 미세 조정할 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;125:3-126:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;125:3-126:0&quot;&gt;&lt;b&gt;(참고)&lt;/b&gt; 자세한 내용: &lt;a href=&quot;https://www.google.com/search?q=https://pytorch.org/docs/stable/notes/cuda.html%23cuda-memory-management&quot;&gt;PyTorch 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;127:1-127:73&quot; data-ke-size=&quot;size16&quot;&gt;더 고급 사용자는 &lt;b&gt;사용자 정의 CUDA 메모리 할당자&lt;/b&gt;를 통합할 수도 있습니다. (CUDA 및 PyTorch 내부 지식 필요)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;129:3-130:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;129:3-130:0&quot;&gt;&lt;b&gt;(참고)&lt;/b&gt; 구현 가이드: &lt;a href=&quot;https://www.google.com/search?q=https://pytorch.org/docs/stable/cpp_extension.html%23custom-cuda-allocator&quot;&gt;여기&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;131:1-131:20&quot; data-ke-size=&quot;size23&quot;&gt;4. 대규모 프로파일링  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;133:1-133:149&quot; data-ke-size=&quot;size16&quot;&gt;NVIDIA GPU 사용 시 &lt;b&gt;Nsight Systems&lt;/b&gt; 및 &lt;b&gt;Nsight Compute&lt;/b&gt; 같은 도구가 유용합니다. GPU의 메모리 및 계산 처리 방식에 대한 저수준 통찰력을 제공하여 미묘한 성능 병목 현상을 식별하는 데 도움이 됩니다.&amp;nbsp;&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;135:1-135:19&quot; data-ke-size=&quot;size23&quot;&gt;5. 동적 할당 전략  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;137:1-137:92&quot; data-ke-size=&quot;size16&quot;&gt;미래에는 메모리 사용 패턴을 예측하고 리소스를 사전 할당하는 적응형 전략, CPU/GPU 통합 메모리 아키텍처 등이 중요해질 것입니다. 관련 연구 동향을 주시하세요.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;139:1-139:32&quot; data-ke-size=&quot;size23&quot;&gt;6. 코드 및 훈련 최적화 (핵심 전략 요약) ✨&lt;/h3&gt;
&lt;p data-sourcepos=&quot;141:1-141:21&quot; data-ke-size=&quot;size16&quot;&gt;이전 글들에서 다룬 내용의 요약입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;143:3-149:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;143:3-143:143&quot;&gt;&lt;b&gt;6.1) 혼합 정밀도 훈련 (Mixed Precision Training):&lt;/b&gt; 16비트(FP16)와 32비트(FP32) 계산을 함께 사용하여 메모리 사용량을 줄이고 속도를 높입니다. (Nvidia Apex 또는 내장 torch.amp 사용)&lt;/li&gt;
&lt;li data-sourcepos=&quot;144:3-144:117&quot;&gt;&lt;b&gt;6.2) 그래디언트 체크포인팅 (Gradient Checkpointing):&lt;/b&gt; 메모리를 절약하기 위해 순전파 중 일부 활성화 값만 저장하고 역전파 시 재계산합니다. 매우 깊은 네트워크에 유용합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;145:3-145:125&quot;&gt;&lt;b&gt;6.3) 배치 크기 및 모델 아키텍처 조정:&lt;/b&gt; 메모리 한계에 도달하면 배치 크기를 줄이고 (필요시 &lt;b&gt;그래디언트 누적(gradient accumulation)&lt;/b&gt; 사용), 메모리 효율적인 모델 구조를 고려합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;146:3-146:104&quot;&gt;&lt;b&gt;6.4) 메모리 최적화 라이브러리 활용:&lt;/b&gt; &lt;b&gt;PyTorch Lightning&lt;/b&gt;과 같은 라이브러리는 효율적인 데이터 로딩 등 모범 사례를 통합하여 개발 복잡성을 줄여줍니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;147:3-149:0&quot;&gt;&lt;b&gt;6.5) 제자리 연산 사용 (In-Place Operations):&lt;/b&gt; add_(), relu_()처럼 밑줄(_)로 끝나는 연산은 새 텐서를 생성하지 않고 입력을 직접 수정하여 메모리를 절약합니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;148:7-149:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;148:7-149:0&quot;&gt;⚠️ &lt;b&gt;주의:&lt;/b&gt; 제자리 연산은 계산 그래프를 방해하고 그래디언트 계산을 복잡하게 만들 수 있어 &lt;b&gt;훈련 중에는 일반적으로 권장되지 않습니다.&lt;/b&gt; 하지만, 그래디언트 추적이 필요 없는 &lt;b&gt;추론(inference)&lt;/b&gt; 시나리오나 계산 그래프에서 분리된(detached) 텐서에는 유용할 수 있습니다. 코드 명확성을 위해 선별적으로 사용해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;152:1-152:8&quot; data-ke-size=&quot;size26&quot;&gt;  요약&lt;/h2&gt;
&lt;p data-sourcepos=&quot;154:1-154:149&quot; data-ke-size=&quot;size16&quot;&gt;효율적인 GPU 메모리 관리는 고성능 딥러닝 시스템의 핵심입니다. 단순히 GPU를 추가하는 것보다 기존 리소스의 성능을 최적화하는 것이 중요합니다. PyTorch의 &lt;b&gt;CUDA 캐싱 할당자&lt;/b&gt; 작동 방식을 이해하면 성능 향상을 위한 귀중한 통찰력을 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;156:1-156:163&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심은 프로덕션 규모로 모델을 배포할 때 GPU 메모리 사용량을 사전에 모니터링하고 미세 조정하는 것입니다.&lt;/b&gt; 여기에는 코드 최적화, 환경 변수 설정, 때로는 자체 사용자 정의 메모리 할당자 구현까지 포함될 수 있습니다. 현명한 메모리 관리로 GPU의 잠재력을 최대한 발휘하세요!  &lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div data-node-type=&quot;input-area&quot;&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Manus AI + Ollama] OpenManus 로컬에서 설치 및 실행해보자&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1744039772278&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;[Manus AI + Ollama] OpenManus 로컬에서 설치 및 실행해보자&quot; data-og-description=&quot;Manus AI 에대해서 모른다면 요거 한번 훑고 갑시당Manus AI 에 대하여 빠르게 아라보자&amp;nbsp;Manus AI 에 대하여 빠르게 아라보자중국, 새로운 자율 AI '마누스 AI' 출시!Manus는 마음과 행동을 연결하는 일반 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5UBnS/hyYCbVxBGi/cqf6ky2fXq9D6oA0Fmafi0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cc1ii7/hyYA6guxab/VQO96cKW7KXObn3x0gWKK1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bbbb4T/hyYBawqPzH/pU5631iCP6jh4fCWy0Igvk/img.png?width=568&amp;amp;height=610&amp;amp;face=0_0_568_610&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5UBnS/hyYCbVxBGi/cqf6ky2fXq9D6oA0Fmafi0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cc1ii7/hyYA6guxab/VQO96cKW7KXObn3x0gWKK1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bbbb4T/hyYBawqPzH/pU5631iCP6jh4fCWy0Igvk/img.png?width=568&amp;amp;height=610&amp;amp;face=0_0_568_610');&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;[Manus AI + Ollama] OpenManus 로컬에서 설치 및 실행해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Manus AI 에대해서 모른다면 요거 한번 훑고 갑시당Manus AI 에 대하여 빠르게 아라보자&amp;nbsp;Manus AI 에 대하여 빠르게 아라보자중국, 새로운 자율 AI '마누스 AI' 출시!Manus는 마음과 행동을 연결하는 일반&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/modern-NLP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;현대 NLP - 토큰화, 임베딩, 텍스트 분류&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744039787692&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;현대 NLP - 토큰화, 임베딩, 텍스트 분류&quot; data-og-description=&quot;주요 용어 요약NLP (자연어 처리): 컴퓨터가 인간 언어를 이해하고 생성하도록 돕는 기술LLM (대형 언어 모델): 텍스트 생성 및 이해에 사용되는 대규모 모델NLTK (Natural Language Toolkit): 텍스트 분석에&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/modern-NLP&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/modern-NLP&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TXhB0/hyYCdTnJgY/vbZ7dMsolZDONUnEz8IAQk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bS38bO/hyYCjeX0VB/GR89F9n9cOqB6pv3nHAvqk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/modern-NLP&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/modern-NLP&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TXhB0/hyYCdTnJgY/vbZ7dMsolZDONUnEz8IAQk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bS38bO/hyYCjeX0VB/GR89F9n9cOqB6pv3nHAvqk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;현대 NLP - 토큰화, 임베딩, 텍스트 분류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주요 용어 요약NLP (자연어 처리): 컴퓨터가 인간 언어를 이해하고 생성하도록 돕는 기술LLM (대형 언어 모델): 텍스트 생성 및 이해에 사용되는 대규모 모델NLTK (Natural Language Toolkit): 텍스트 분석에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DeepSeek R-1 우분투에서 써보기 feat.Ollama&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1744039952252&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;DeepSeek R-1 우분투에서 써보기 feat.Ollama&quot; data-og-description=&quot;DeepSeek에 대해서 모른다면 밑에 글 빠르게 훑어보자딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)우선 긴글을 싫어하는 당신을 위한 요&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7h35b/hyYB67L6NY/yTlkXaDZfuzeQ409N6tRHk/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bhRbeB/hyYBba1sIf/g9ndVTYIxxqSJNSLEvNvhk/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bV6r37/hyYCdshC4b/8i52r9o3ih16nlv687ACh0/img.png?width=1217&amp;amp;height=1222&amp;amp;face=0_0_1217_1222&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7h35b/hyYB67L6NY/yTlkXaDZfuzeQ409N6tRHk/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bhRbeB/hyYBba1sIf/g9ndVTYIxxqSJNSLEvNvhk/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bV6r37/hyYCdshC4b/8i52r9o3ih16nlv687ACh0/img.png?width=1217&amp;amp;height=1222&amp;amp;face=0_0_1217_1222');&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;DeepSeek R-1 우분투에서 써보기 feat.Ollama&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DeepSeek에 대해서 모른다면 밑에 글 빠르게 훑어보자딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)우선 긴글을 싫어하는 당신을 위한 요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>AI/ML*DL Study</category>
      <category>cuda out of memory (oom)</category>
      <category>cuda 캐싱 할당자가 메모리를 관리하는 방법</category>
      <category>gpu 메모리 관리의 중요성</category>
      <category>pytorch cuda 캐싱 할당자 이해하기</category>
      <category>pytorch와 cuda를 이용한 gpu 메모리 관리</category>
      <category>pytorch와 cuda를 이용한 gpu 메모리 관리 마스터하기: cuda 캐싱 할당자 완벽 활용 가이드</category>
      <category>단편화 완화 (fragmentation mitigation)</category>
      <category>메모리 풀링 (memory pooling)</category>
      <category>재사용 및 지연 해제 (reuse and delayed freeing)</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/236</guid>
      <comments>https://intelloper.tistory.com/entry/PyTorch-CUDA-GPU-memory-management#entry236comment</comments>
      <pubDate>Tue, 8 Apr 2025 00:33:51 +0900</pubDate>
    </item>
    <item>
      <title>시니어 파이썬 개발자가 되기위한 7가지 개념!  </title>
      <link>https://intelloper.tistory.com/entry/seven-python-concepts-to-be-senior-developer</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgcMcf/btsM7hUMoPW/nHQ7Fs9gaVPEEKUE5sdqM1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgcMcf/btsM7hUMoPW/nHQ7Fs9gaVPEEKUE5sdqM1/img.webp&quot; data-alt=&quot;시니어 파이썬 개발자가 되기위한 7가지 개념&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgcMcf/btsM7hUMoPW/nHQ7Fs9gaVPEEKUE5sdqM1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgcMcf%2FbtsM7hUMoPW%2FnHQ7Fs9gaVPEEKUE5sdqM1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시니어 파이썬 개발자가 되기위한 7가지 개념&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div id=&quot;model-response-message-contentr_31058d9f52d920ee&quot;&gt;
&lt;p data-sourcepos=&quot;5:1-5:99&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;5:1-5:99&quot; data-ke-size=&quot;size16&quot;&gt;파이썬 스크립트 작성, 프로젝트 빌드, 애플리케이션 배포 경험이 있으신가요? 좋습니다! 하지만 파이썬을 &lt;span&gt;*정말로*&lt;/span&gt; 깊이 이해한다는 것은 언어의 핵심 메커니즘과 고급 기능을 파악하는 데 있습니다. 여기, 평범한 파이썬 코더와 숙련된 파이썬 전문가를 구분 짓는 7가지 중요한 개념을 소개합니다. 만약 이 개념들이 익숙하고 직관적으로 느껴진다면, 축하드립니다! 당신은 이미 파이썬을 &quot;꽤 잘 다루는&quot; 수준을 넘어섰을 가능성이 높습니다.  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;9:1-9:43&quot; data-ke-size=&quot;size23&quot;&gt;1. 메타클래스 (Metaclasses): 클래스를 동적으로 만들기 ✨&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;메타클래스는 파이썬의 숨겨진 마법 중 하나로, 클래스를 생성하는 규칙 자체를 프로그래밍 방식으로 정의할 수 있게 해줍니다. &lt;span&gt;`type`&lt;/span&gt;의 서브클래스를 만들어 클래스 생성 과정을 커스터마이징하는 강력한 도구죠.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span&gt;예시: 모든 메서드에 문서화 문자열(docstring)을 강제하는 메타클래스&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# 모든 메서드가 설명을 위한 docstring을 갖도록 강제하는 메타클래스
class DocstringRequiredMeta(type):
    def __new__(cls, name, bases, dct):
        print(f&quot;--- 메타클래스 실행: '{name}' 클래스 생성 중 ---&quot;)
        # 클래스의 속성(메서드 등)을 순회
        for key, value in dct.items():
            # 함수/메서드인데 docstring이 없는 경우
            if callable(value) and not getattr(value, '__doc__'):
                raise TypeError(f&quot;메서드 '{key}'에는 설명(docstring)이 반드시 필요합니다.&quot;)
        print(&quot;--- 모든 메서드 검증 완료 ---&quot;)
        # 검증 후, 부모 메타클래스(type)를 통해 클래스 생성
        return super().__new__(cls, name, bases, dct)

# 메타클래스를 사용하여 API 핸들러 클래스 정의
class APIHandler(metaclass=DocstringRequiredMeta):
    def get_user(self, user_id):
        &quot;&quot;&quot;지정된 ID의 사용자 정보를 조회합니다.&quot;&quot;&quot;
        print(f&quot;사용자 {user_id} 정보 조회...&quot;)
        # ... 실제 로직 ...
        return {&quot;id&quot;: user_id, &quot;name&quot;: &quot;Dummy User&quot;}

    def process_data(self, data):
        # 아래 메서드는 docstring이 없어서 TypeError 발생!
        # &quot;&quot;&quot;데이터를 처리합니다.&quot;&quot;&quot; # 이 줄 주석 해제하면 정상 동작
        print(&quot;데이터 처리 중...&quot;)
        # ... 실제 로직 ...
        return {&quot;status&quot;: &quot;processed&quot;}

# 사용 예시 (클래스 정의 시점에서 에러 발생)
try:
    # APIHandler 클래스 정의 시 process_data 메서드 때문에 에러 발생
    handler = APIHandler()
    user = handler.get_user(123)
    print(user)
except TypeError as e:
    print(f&quot;\n클래스 정의 중 오류 발생: {e}&quot;)

# process_data에 docstring을 추가하면 정상적으로 클래스가 생성됩니다.
print(&quot;\n(만약 process_data에 docstring이 있었다면) 클래스 인스턴스 생성 및 메서드 호출 가능&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;39:1-40:130&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;39:1-40:130&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;58:1-59:148&quot; data-ke-size=&quot;size16&quot;&gt;메타클래스는 Django ORM이나 SQLAlchemy 같은 프레임워크에서 모델 정의 시 규칙을 강제하거나, 클래스 생성 시점에 코드를 자동으로 추가하는 등 고급 패턴 구현에 핵심적인 역할을 합니다. 코드의 일관성을 유지하고 반복 작업을 줄이는 데 매우 유용합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;model-response-message-contentr_dc47f4cc51da1179&quot;&gt;
&lt;h2 data-sourcepos=&quot;63:1-63:57&quot; data-ke-size=&quot;size26&quot;&gt;2. 컨텍스트 매니저 (Context Managers): with 문의 진정한 힘  ➡️ &lt;/h2&gt;
&lt;p data-sourcepos=&quot;65:1-65:162&quot; data-ke-size=&quot;size16&quot;&gt;with open(...) 구문은 파일 처리 시 매우 유용하지만, 컨텍스트 매니저의 활용 범위는 훨씬 넓습니다. 데이터베이스 연결, 네트워크 소켓, 락(Lock) 등 명시적인 설정(setup)과 정리(teardown)가 필요한 모든 종류의 리소스를 안전하고 깔끔하게 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;65:1-65:162&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;67:1-67:32&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: 임시 API 세션을 관리하는 컨텍스트 매니저&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import time
import random

# 가상의 외부 API 클라이언트 라이브러리라고 가정
class ExternalServiceClient:
    def __init__(self, api_key):
        self.api_key = api_key
        self._session_active = False
        print(f&quot;클라이언트 초기화 (API 키: ...{api_key[-4:]})&quot;)

    def connect(self):
        print(&quot;API 서버에 연결 시도 중...&quot;)
        time.sleep(0.5) # 네트워크 지연 시뮬레이션
        self._session_active = True
        print(&quot;✅ 연결 성공! 세션 활성화됨.&quot;)
        return self # 연결된 클라이언트 객체 반환

    def disconnect(self):
        print(&quot;API 서버 연결 종료 중...&quot;)
        time.sleep(0.2)
        self._session_active = False
        print(&quot;  연결 종료됨.&quot;)

    def call_api(self, endpoint):
        if not self._session_active:
            raise ConnectionError(&quot;API 세션이 활성화되지 않았습니다.&quot;)
        print(f&quot;  엔드포인트 '{endpoint}' 호출 중...&quot;)
        time.sleep(0.3)
        if random.random() &amp;lt; 0.2: # 20% 확률로 실패
             raise TimeoutError(&quot;API 호출 시간 초과&quot;)
        return {&quot;data&quot;: f&quot;Response from {endpoint}&quot;}

# 컨텍스트 매니저 클래스
class ApiSessionManager:
    def __init__(self, api_key):
        self.api_key = api_key
        self.client = None

    def __enter__(self):
        print(&quot;\n[컨텍스트 시작] __enter__ 호출됨&quot;)
        self.client = ExternalServiceClient(self.api_key)
        # 연결된 클라이언트 객체를 반환하여 'with' 블록 내에서 사용 가능하게 함
        return self.client.connect()

    def __exit__(self, exc_type, exc_val, exc_tb):
        # exc_type: 예외 타입 (예외 없으면 None)
        # exc_val: 예외 값 (예외 없으면 None)
        # exc_tb: 트레이스백 (예외 없으면 None)
        print(&quot;\n[컨텍스트 종료] __exit__ 호출됨&quot;)
        if exc_type:
            print(f&quot;⚠️ 예외 발생: {exc_type.__name__} - {exc_val}&quot;)
            print(&quot;   (리소스 정리만 수행)&quot;)
        else:
            print(&quot;   정상적으로 블록 실행 완료.&quot;)

        if self.client:
            self.client.disconnect() # 리소스 정리 (연결 해제)
        # True를 반환하면 'with' 블록 밖으로 예외가 전파되지 않음
        # False나 None을 반환 (또는 아무것도 반환 안함)하면 예외 전파됨
        # return False # 예외를 다시 발생시키려면

# 사용 예시
api_key = &quot;secr3t_k3y_12345&quot;

try:
    print(&quot;--- API 세션 시작 ---&quot;)
    # ApiSessionManager가 클라이언트 연결 및 해제를 자동으로 관리
    with ApiSessionManager(api_key) as api_client:
        print(&quot;\n[with 블록 내부]&quot;)
        response1 = api_client.call_api(&quot;/users&quot;)
        print(f&quot;   응답 1: {response1}&quot;)
        response2 = api_client.call_api(&quot;/products&quot;)
        print(f&quot;   응답 2: {response2}&quot;)
        # 아래 줄 주석 해제 시 일부러 예외 발생
        # response3 = api_client.call_api(&quot;/invalid_endpoint_that_fails&quot;)
    print(&quot;\n--- API 세션 정상 종료 ---&quot;)

except (ConnectionError, TimeoutError) as e:
    print(f&quot;\n--- API 호출 중 문제 발생 ---&quot;)
    print(f&quot;처리된 예외: {e}&quot;)
except Exception as e:
     print(f&quot;\n--- 예상치 못한 오류 발생 ---: {e}&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;155:1-156:142&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;155:1-156:142&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;155:1-156:142&quot; data-ke-size=&quot;size16&quot;&gt;컨텍스트 매니저를 사용하면 리소스 누수(파일 핸들, 네트워크 소켓 등을 닫지 않는 경우)를 방지하고, 예외 발생 시에도 안정적으로 리소스를 정리할 수 있습니다. 트랜잭션 관리, 임시 설정 변경 등 다양한 상황에서 코드의 안정성과 가독성을 크게 높여줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;160:1-160:34&quot; data-ke-size=&quot;size26&quot;&gt;3. 파라미터가 있는 데코레이터: 맞춤형 기능 추가  &lt;/h2&gt;
&lt;p data-sourcepos=&quot;162:1-162:126&quot; data-ke-size=&quot;size16&quot;&gt;데코레이터는 함수를 감싸 기능을 추가하는 강력한 도구입니다. 여기에 파라미터를 전달할 수 있게 만들면, 재사용 가능하고 설정 가능한 데코레이터를 만들 수 있습니다. 이를 위해서는 함수를 세 단계로 중첩하는 패턴이 일반적입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;162:1-162:126&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;164:1-164:39&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: 실행 시간을 로깅하고 임계값 초과 시 경고하는 데코레이터&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import time
import functools # 원본 함수의 메타데이터 유지를 위해 사용

def log_execution_time(threshold_seconds=1.0):
    &quot;&quot;&quot;
    함수 실행 시간을 측정하고, 지정된 임계값(threshold_seconds)을 초과하면
    경고 로그를 출력하는 데코레이터 팩토리.
    &quot;&quot;&quot;
    # 1. 데코레이터 팩토리: 파라미터(threshold_seconds)를 받음
    def decorator(func):
        # 2. 실제 데코레이터: 꾸밀 함수(func)를 받음
        @functools.wraps(func) # 원본 함수의 이름, docstring 등 유지
        def wrapper(*args, **kwargs):
            # 3. 래퍼 함수: 원본 함수의 인자를 받아 실행 전후 로직 추가
            start_time = time.perf_counter() # 정밀한 시간 측정 시작
            print(f&quot;--- 함수 '{func.__name__}' 실행 시작 ---&quot;)
            try:
                result = func(*args, **kwargs) # 원본 함수 실행
                end_time = time.perf_counter()
                elapsed_time = end_time - start_time
                print(f&quot;--- 함수 '{func.__name__}' 실행 완료 (소요 시간: {elapsed_time:.4f}초) ---&quot;)

                # 임계값 초과 확인
                if elapsed_time &amp;gt; threshold_seconds:
                    print(f&quot;⚠️ 경고: '{func.__name__}' 실행 시간({elapsed_time:.4f}초)이 임계값({threshold_seconds}초)을 초과했습니다!&quot;)
                return result
            except Exception as e:
                print(f&quot;  오류: 함수 '{func.__name__}' 실행 중 예외 발생 - {e}&quot;)
                raise # 원본 예외를 다시 발생시킴
        return wrapper
    return decorator

# 데코레이터 사용 예시
@log_execution_time(threshold_seconds=0.5) # 0.5초 초과 시 경고
def process_large_data(size_mb):
    &quot;&quot;&quot;대용량 데이터 처리 시뮬레이션&quot;&quot;&quot;
    print(f&quot;{size_mb}MB 데이터 처리 중...&quot;)
    # 처리 시간 시뮬레이션 (0.1초 ~ 1.1초 사이)
    simulated_delay = 0.1 + random.random()
    time.sleep(simulated_delay)
    print(&quot;데이터 처리 완료.&quot;)
    return {&quot;status&quot;: &quot;success&quot;, &quot;processed_mb&quot;: size_mb}

@log_execution_time(threshold_seconds=0.2) # 0.2초 초과 시 경고
def quick_calculation(a, b):
    &quot;&quot;&quot;빠른 계산 수행&quot;&quot;&quot;
    print(&quot;빠른 계산 수행 중...&quot;)
    time.sleep(0.05) # 짧은 지연
    return a + b

# 함수 호출
print(&quot;\n=== 대용량 데이터 처리 호출 ===&quot;)
process_large_data(500)

print(&quot;\n=== 빠른 계산 호출 ===&quot;)
quick_calculation(10, 20)

print(&quot;\n=== 다시 대용량 데이터 처리 (경고 발생 가능) ===&quot;)
process_large_data(1000) # 이번엔 경고가 나올 확률 높음
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;228:1-229:109&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;228:1-229:109&quot; data-ke-size=&quot;size16&quot;&gt;파라미터화된 데코레이터는 로깅 레벨 설정, 재시도 횟수 지정, API 속도 제한 설정, 접근 권한 검사 등 다양한 시나리오에서 코드 중복 없이 유연하게 기능을 추가하고 재사용할 수 있게 해줍니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;233:1-233:43&quot; data-ke-size=&quot;size26&quot;&gt;4. asyncio를 이용한 동시성 처리: I/O 기다림의 효율화 ⚡&lt;/h2&gt;
&lt;p data-sourcepos=&quot;235:1-235:175&quot; data-ke-size=&quot;size16&quot;&gt;파이썬의 asyncio는 스레드나 프로세스 없이도 동시성(Concurrency)을 구현하는 강력한 방법입니다. 특히 네트워크 요청, 파일 입출력 등 I/O 작업이 많은 애플리케이션에서 빛을 발합니다. async/await 문법과 이벤트 루프를 통해 non-blocking I/O를 효율적으로 관리합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;235:1-235:175&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;237:1-237:45&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: 여러 비동기 작업(데이터베이스 조회, 외부 API 호출) 동시 실행&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import asyncio
import time
import random

async def query_database(query):
    &quot;&quot;&quot;데이터베이스 조회 시뮬레이션 (비동기 I/O 대기)&quot;&quot;&quot;
    print(f&quot;⏳ DB 조회 시작: {query}&quot;)
    # 실제로는 비동기 DB 드라이버가 I/O 대기
    delay = random.uniform(0.5, 1.5) # 0.5초 ~ 1.5초 대기
    await asyncio.sleep(delay)
    print(f&quot;✅ DB 조회 완료: {query} (결과: ...)&quot;)
    return f&quot;Result for '{query}' after {delay:.2f}s&quot;

async def call_external_api(service_name):
    &quot;&quot;&quot;외부 API 호출 시뮬레이션 (비동기 네트워크 I/O 대기)&quot;&quot;&quot;
    print(f&quot;  외부 API 호출 시작: {service_name}&quot;)
    # 실제로는 aiohttp 같은 라이브러리가 I/O 대기
    delay = random.uniform(0.8, 2.0) # 0.8초 ~ 2.0초 대기
    await asyncio.sleep(delay)
    print(f&quot;✅ 외부 API 응답 수신: {service_name}&quot;)
    return f&quot;Response from {service_name} after {delay:.2f}s&quot;

async def main_async_task():
    &quot;&quot;&quot;메인 비동기 실행 함수&quot;&quot;&quot;
    start_time = time.perf_counter()
    print(&quot;--- 비동기 작업 시작 ---&quot;)

    # 여러 비동기 작업을 태스크로 생성 (바로 실행되지 않고 예약됨)
    task_db_users = asyncio.create_task(query_database(&quot;SELECT * FROM users&quot;))
    task_api_weather = asyncio.create_task(call_external_api(&quot;Weather Service&quot;))
    task_db_products = asyncio.create_task(query_database(&quot;SELECT * FROM products&quot;))
    task_api_stock = asyncio.create_task(call_external_api(&quot;Stock Price Service&quot;))

    # 모든 태스크가 완료될 때까지 동시에 실행하고 기다림
    print(&quot;--- 작업 동시 실행 대기 중... ---&quot;)
    results = await asyncio.gather(
        task_db_users,
        task_api_weather,
        task_db_products,
        task_api_stock
    )

    end_time = time.perf_counter()
    print(&quot;\n--- 모든 비동기 작업 완료 ---&quot;)
    print(f&quot;총 소요 시간: {end_time - start_time:.2f}초&quot;)

    print(&quot;\n--- 결과 ---&quot;)
    for i, result in enumerate(results):
        print(f&quot;결과 {i+1}: {result}&quot;)

# 비동기 이벤트 루프를 실행하여 main_async_task 코루틴 실행
if __name__ == &quot;__main__&quot;:
    # Python 3.7+ 에서는 asyncio.run() 사용 권장
    asyncio.run(main_async_task())
    # 만약 위 작업들을 순차적으로 실행했다면 총 3.6초(0.5+0.8+0.5+0.8) 이상 걸렸을 것!
    # 동시 실행 덕분에 가장 오래 걸리는 작업 시간(약 2.0초) 정도로 단축됨.
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;298:1-299:144&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;298:1-299:144&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;298:1-299:144&quot; data-ke-size=&quot;size16&quot;&gt;asyncio는 수많은 동시 I/O 작업을 스레드를 사용하는 것보다 훨씬 적은 메모리와 CPU 오버헤드로 처리할 수 있게 해줍니다. 현대적인 웹 프레임워크(FastAPI, Sanic 등), 네트워크 서비스, 실시간 데이터 처리 시스템 구축에 필수적입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;303:1-303:42&quot; data-ke-size=&quot;size26&quot;&gt;5. 디스크립터 (Descriptors): 속성 접근 제어 마스터  &lt;/h2&gt;
&lt;p data-sourcepos=&quot;305:1-305:189&quot; data-ke-size=&quot;size16&quot;&gt;파이썬의 @property, @classmethod, @staticmethod와 같은 내장 기능들은 사실 디스크립터 프로토콜을 기반으로 구현되어 있습니다. 디스크립터를 직접 구현하면 클래스 속성에 접근(get, set, delete)할 때 특정 로직(유효성 검사, 값 변환, 로깅 등)을 실행하도록 섬세하게 제어할 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;305:1-305:189&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;307:1-307:31&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: 양수 값만 허용하는 속성을 위한 디스크립터&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class PositiveNumber:
    &quot;&quot;&quot;
    속성에 양수(0 포함)만 할당되도록 강제하는 디스크립터.
    &quot;&quot;&quot;
    def __set_name__(self, owner_class, property_name):
        # 디스크립터가 할당된 속성 이름을 저장 (예: 'width', 'height')
        # 이 이름은 인스턴스의 __dict__에 값을 저장/조회할 때 사용됨
        print(f&quot;--- 디스크립터 초기화: '{owner_class.__name__}' 클래스의 '{property_name}' 속성 ---&quot;)
        self.property_name = property_name

    def __get__(self, instance, owner_class):
        # 속성 값을 읽으려고 할 때 호출됨
        # instance: 디스크립터를 포함하는 객체 (예: Rectangle 객체 r)
        # owner_class: 디스크립터를 포함하는 클래스 (예: Rectangle 클래스)
        if instance is None:
            # 클래스 자체에서 속성에 접근할 때 (e.g., Rectangle.width)
            return self
        # 인스턴스의 내부 딕셔너리에서 값을 찾아 반환 (없으면 None)
        value = instance.__dict__.get(self.property_name, None)
        print(f&quot;   [__get__] '{self.property_name}' 값 조회: {value}&quot;)
        return value

    def __set__(self, instance, value):
        # 속성에 값을 할당하려고 할 때 호출됨
        print(f&quot;   [__set__] '{self.property_name}'에 '{value}' 할당 시도...&quot;)
        # 유효성 검사: 숫자인지, 0 이상인지 확인
        if not isinstance(value, (int, float)):
            raise TypeError(f&quot;'{self.property_name}' 속성에는 숫자만 할당할 수 있습니다.&quot;)
        if value &amp;lt; 0:
            raise ValueError(f&quot;'{self.property_name}' 속성에는 0 이상의 값만 할당할 수 있습니다.&quot;)

        # 유효성 검사 통과 시, 인스턴스의 __dict__에 값 저장
        instance.__dict__[self.property_name] = value
        print(f&quot;   [__set__] 성공: '{self.property_name}' = {value}&quot;)

# 디스크립터를 사용하는 클래스
class Rectangle:
    # width와 height 속성에 PositiveNumber 디스크립터 인스턴스를 할당
    width = PositiveNumber()
    height = PositiveNumber()

    def __init__(self, width, height):
        print(f&quot;\n--- Rectangle 인스턴스 생성 ({width}, {height}) ---&quot;)
        # 생성자에서 할당 시에도 디스크립터의 __set__이 호출됨
        self.width = width
        self.height = height
        print(&quot;--- 인스턴스 생성 완료 ---&quot;)

    def area(self):
        # 넓이 계산 시 디스크립터의 __get__이 호출됨
        print(&quot;\n--- 넓이 계산 시작 ---&quot;)
        return self.width * self.height

# 사용 예시
print(&quot;=== 유효한 값으로 객체 생성 ===&quot;)
r1 = Rectangle(10, 20)
print(f&quot;사각형 넓이: {r1.area()}&quot;)

print(&quot;\n=== 속성 값 변경 (유효) ===&quot;)
r1.width = 15 # __set__ 호출 -&amp;gt; 유효성 검사 통과
print(f&quot;변경된 너비: {r1.width}&quot;) # __get__ 호출

print(&quot;\n=== 유효하지 않은 값 할당 시도 (음수) ===&quot;)
try:
    r1.height = -5 # __set__ 호출 -&amp;gt; ValueError 발생
except ValueError as e:
    print(f&quot;오류 발생: {e}&quot;)

print(&quot;\n=== 유효하지 않은 값 할당 시도 (문자열) ===&quot;)
try:
    r1.width = &quot;invalid&quot; # __set__ 호출 -&amp;gt; TypeError 발생
except TypeError as e:
    print(f&quot;오류 발생: {e}&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;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;385:1-386:159&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;385:1-386:159&quot; data-ke-size=&quot;size16&quot;&gt;디스크립터는 ORM(Object-Relational Mapper) 라이브러리에서 모델 필드의 데이터 유효성 검사, 타입 변환, 데이터베이스 컬럼 매핑 등을 구현하는 데 핵심적으로 사용됩니다. @property보다 더 복잡한 속성 관리 로직을 재사용 가능한 형태로 만들 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;390:1-390:33&quot; data-ke-size=&quot;size26&quot;&gt;6. __slots__를 이용한 메모리 최적화  &lt;/h2&gt;
&lt;p data-sourcepos=&quot;392:1-392:225&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 파이썬 클래스의 인스턴스는 속성을 동적으로 저장하기 위해 __dict__라는 딕셔너리를 사용합니다. 하지만 수백만 개의 작은 인스턴스를 생성해야 하는 경우, 이 __dict__가 차지하는 메모리 오버헤드가 상당할 수 있습니다. __slots__를 클래스에 정의하면, 인스턴스가 사용할 속성을 미리 고정하고 __dict__를 생성하지 않아 메모리 사용량을 크게 줄일 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;392:1-392:225&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;394:1-394:31&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: Point 클래스의 메모리 사용량 비교&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import sys

# 일반적인 Point 클래스 (각 인스턴스가 __dict__를 가짐)
class PointRegular:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.label = &quot;default&quot; # 동적 속성 추가 가능

# __slots__를 사용한 Point 클래스 (__dict__ 없음)
class PointSlotted:
    # 인스턴스가 가질 속성을 문자열 리스트로 명시
    __slots__ = ['x', 'y']

    def __init__(self, x, y):
        self.x = x
        self.y = y
        # __slots__에 없는 속성은 기본적으로 추가 불가
        # self.label = &quot;default&quot; # 이 줄은 AttributeError 발생시킴

# 많은 수의 인스턴스 생성
num_instances = 100000
print(f&quot;--- {num_instances:,}개의 인스턴스 생성 비교 ---&quot;)

# Regular Point 인스턴스 리스트 생성
regular_points = [PointRegular(i, i*2) for i in range(num_instances)]
# Slotted Point 인스턴스 리스트 생성
slotted_points = [PointSlotted(i, i*2) for i in range(num_instances)]

# 대표 인스턴스 크기 비교 (환경/버전에 따라 약간 다를 수 있음)
sample_regular = regular_points[0]
sample_slotted = slotted_points[0]

print(f&quot;\n--- 단일 인스턴스 크기 비교 (sys.getsizeof) ---&quot;)
size_regular = sys.getsizeof(sample_regular)
# Regular 인스턴스는 __dict__도 가지고 있음
size_regular_dict = sys.getsizeof(sample_regular.__dict__)
size_slotted = sys.getsizeof(sample_slotted)
# Slotted 인스턴스는 __dict__가 없음
# sys.getsizeof(sample_slotted.__dict__) # AttributeError 발생

print(f&quot;PointRegular 인스턴스 크기: {size_regular} 바이트 (내부 __dict__ 크기: {size_regular_dict} 바이트)&quot;)
print(f&quot;PointSlotted 인스턴스 크기: {size_slotted} 바이트 (__dict__ 없음)&quot;)
print(f&quot;메모리 절약 (인스턴스당): 약 {size_regular - size_slotted} 바이트&quot;)

# 전체 리스트의 대략적인 메모리 사용량 비교 (gc 모듈 등으로 더 정확히 측정 가능)
# 여기서는 단순 계산으로 추정
total_mem_regular_approx = size_regular * num_instances
total_mem_slotted_approx = size_slotted * num_instances
print(f&quot;\n--- 전체 인스턴스 예상 메모리 (단순 계산) ---&quot;)
print(f&quot;Regular Points 총 메모리: 약 {total_mem_regular_approx / (1024**2):.2f} MB&quot;)
print(f&quot;Slotted Points 총 메모리: 약 {total_mem_slotted_approx / (1024**2):.2f} MB&quot;)
print(f&quot;총 메모리 절약 추정치: 약 {(total_mem_regular_approx - total_mem_slotted_approx) / (1024**2):.2f} MB&quot;)


# 동적 속성 추가 시도
print(&quot;\n--- 동적 속성 추가 가능 여부 ---&quot;)
sample_regular.z = 100 # Regular 인스턴스는 __dict__가 있어 가능
print(f&quot;PointRegular에 'z' 속성 추가 가능: {sample_regular.z}&quot;)

try:
    sample_slotted.z = 100 # Slotted 인스턴스는 __slots__에 없으므로 불가능
except AttributeError as e:
    print(f&quot;PointSlotted에 'z' 속성 추가 시도 중 오류: {e}&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;464:1-465:170&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;464:1-465:170&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;464:1-465:170&quot; data-ke-size=&quot;size16&quot;&gt;__slots__는 대규모 데이터 처리, 과학 계산, 게임 개발 등 수많은 객체를 메모리에 로드해야 하는 상황에서 메모리 사용량을 최적화하고 속성 접근 속도를 약간 향상시키는 데 유용합니다. 다만, 동적으로 속성을 추가할 수 없고 다중 상속 시 주의가 필요하다는 제약 사항을 이해하고 사용해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;469:1-469:60&quot; data-ke-size=&quot;size26&quot;&gt;7. GIL (Global Interpreter Lock) 이해하기: 파이썬 동시성의 한계와 극복  &lt;/h2&gt;
&lt;p data-sourcepos=&quot;471:1-471:238&quot; data-ke-size=&quot;size16&quot;&gt;GIL은 CPython(가장 널리 사용되는 파이썬 구현체)의 내부 메커니즘으로, 한 번에 단 하나의 스레드만이 파이썬 바이트코드를 실행할 수 있도록 제어하는 락(Lock)입니다. 이 때문에 순수하게 CPU 연산만 많이 하는 작업(CPU-bound task)의 경우, 여러 스레드를 사용해도 멀티코어 CPU의 이점을 완전히 활용하지 못하고 실제로는 병렬(parallel) 실행이 아닌 동시(concurrent) 실행에 그칩니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;471:1-471:238&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;473:1-473:184&quot; data-ke-size=&quot;size16&quot;&gt;I/O 작업(네트워크, 디스크 읽기/쓰기 등) 중에는 스레드가 GIL을 해제하므로, I/O-bound 작업에서는 스레딩이 여전히 효과적입니다. CPU-bound 작업의 진정한 병렬 처리를 위해서는 multiprocessing 모듈(별도의 프로세스를 사용하므로 GIL 제약을 받지 않음)이나 C 확장 모듈 등을 사용해야 합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;473:1-473:184&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;475:1-475:51&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: CPU 집약적 작업(소수 찾기)을 스레딩 vs 멀티프로세싱으로 실행 시간 비교&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import time
import threading
import multiprocessing
import math

# CPU를 많이 사용하는 작업: 주어진 범위 내의 소수 개수 찾기
def count_primes_in_range(start, end):
    count = 0
    # print(f&quot;Worker (PID: {multiprocessing.current_process().pid}, TID: {threading.get_ident()}) starting range {start}-{end}&quot;)
    if start &amp;lt; 2: start = 2
    for num in range(start, end + 1):
        is_prime = True
        # 간단한 소수 판별 로직 (최적화되지 않음)
        for i in range(2, int(math.sqrt(num)) + 1):
            if num % i == 0:
                is_prime = False
                break
        if is_prime:
            count += 1
    # print(f&quot;Worker (PID: {multiprocessing.current_process().pid}) finished range {start}-{end}, found {count} primes.&quot;)
    return count

# 실행 설정
MAX_NUMBER = 200000  # 소수를 찾을 최대 숫자 (값을 늘리면 차이가 더 명확해짐)
NUM_WORKERS = 4    # 사용할 스레드 또는 프로세스 개수
chunk_size = MAX_NUMBER // NUM_WORKERS

# 작업을 나눌 범위 계산
ranges = []
for i in range(NUM_WORKERS):
    range_start = i * chunk_size + 1
    range_end = (i + 1) * chunk_size if i &amp;lt; NUM_WORKERS - 1 else MAX_NUMBER
    ranges.append((range_start, range_end))

print(f&quot;--- 소수 찾기 작업 (1 ~ {MAX_NUMBER:,}) ---&quot;)
print(f&quot;사용할 워커 수: {NUM_WORKERS}&quot;)
print(f&quot;작업 분할 범위: {ranges}&quot;)

# 1. 스레딩 사용 (GIL의 영향으로 병렬 처리 효과 미미)
print(f&quot;\n--- {NUM_WORKERS}개 스레드로 실행 시작 ---&quot;)
start_time_thread = time.perf_counter()
threads = []
thread_results = [0] * NUM_WORKERS # 스레드 결과를 저장할 리스트 (직접 반환 어려움)

# 스레드 결과 저장을 위한 헬퍼 함수
def thread_worker(index, start, end):
    thread_results[index] = count_primes_in_range(start, end)

for i in range(NUM_WORKERS):
    t = threading.Thread(target=thread_worker, args=(i, ranges[i][0], ranges[i][1]))
    threads.append(t)
    t.start()

for t in threads:
    t.join() # 모든 스레드가 끝날 때까지 대기

total_primes_thread = sum(thread_results)
end_time_thread = time.perf_counter()
print(f&quot;스레딩 총 소요 시간: {end_time_thread - start_time_thread:.2f} 초&quot;)
print(f&quot;찾은 소수 개수 (스레딩): {total_primes_thread:,}&quot;)

print(&quot;-&quot; * 30)

# 2. 멀티프로세싱 사용 (GIL 우회하여 병렬 처리 가능)
print(f&quot;\n--- {NUM_WORKERS}개 프로세스로 실행 시작 ---&quot;)
start_time_process = time.perf_counter()

# 프로세스 풀을 사용하여 작업을 분배하고 결과 수집
with multiprocessing.Pool(processes=NUM_WORKERS) as pool:
    # 각 프로세스에 count_primes_in_range 함수와 인자(범위)를 전달
    process_results = pool.starmap(count_primes_in_range, ranges)

total_primes_process = sum(process_results)
end_time_process = time.perf_counter()
print(f&quot;멀티프로세싱 총 소요 시간: {end_time_process - start_time_process:.2f} 초&quot;)
print(f&quot;찾은 소수 개수 (멀티프로세싱): {total_primes_process:,}&quot;)


# 결과 비교 (멀티코어 환경에서는 멀티프로세싱이 훨씬 빠름)
print(&quot;\n--- 실행 시간 비교 ---&quot;)
if end_time_process - start_time_process &amp;lt; end_time_thread - start_time_thread:
     print(&quot;✅ 멀티프로세싱이 스레딩보다 더 빨랐습니다 (CPU-bound 작업에서 예상된 결과).&quot;)
else:
     print(&quot;  스레딩과 멀티프로세싱 속도 차이가 크지 않거나 스레딩이 더 빨랐습니다 (작업량이 적거나 시스템 환경에 따라 다를 수 있음).&quot;)

&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;565:1-566:159&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  왜 중요할까요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-sourcepos=&quot;565:1-566:159&quot; data-ke-size=&quot;size16&quot;&gt;GIL의 존재와 그 영향을 이해하는 것은 파이썬 애플리케이션의 성능을 최적화하는 데 매우 중요합니다. 작업의 특성(CPU-bound vs I/O-bound)에 따라 스레딩, 멀티프로세싱, asyncio 중 적절한 동시성 모델을 선택하는 능력이 고성능 애플리케이션 개발의 핵심입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;570:1-570:34&quot; data-ke-size=&quot;size26&quot;&gt;  최종 도전: 개념들을 제대로 이해하고 따라오셨나요?&lt;/h2&gt;
&lt;p data-sourcepos=&quot;572:1-572:124&quot; data-ke-size=&quot;size16&quot;&gt;이 7가지 개념이 더 이상 낯설거나 어렵게 느껴지지 않는다면, 당신은 이미 파이썬 생태계에서 고급 레벨로 나아가고 있는 것입니다. 하지만 진정한 전문성은 이 도구들을 언제, 왜 사용해야 하는지를 아는 데서 나옵니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;574:1-579:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;574:1-574:56&quot;&gt;프레임워크 수준의 추상화나 클래스 생성 로직 제어가 필요하다면 &lt;b&gt;메타클래스&lt;/b&gt;를 고려해 보세요.&lt;/li&gt;
&lt;li data-sourcepos=&quot;575:1-575:69&quot;&gt;수많은 네트워크 요청이나 파일 처리를 효율적으로 다뤄야 한다면 &lt;b&gt;asyncio&lt;/b&gt;가 강력한 해답이 될 수 있습니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;576:1-576:64&quot;&gt;데이터 모델의 유효성 검사나 속성 접근 시 특정 로직을 일관되게 적용하고 싶다면 &lt;b&gt;디스크립터&lt;/b&gt;가 유용합니다.&lt;/li&gt;
&lt;li data-sourcepos=&quot;577:1-577:58&quot;&gt;메모리 사용량이 매우 중요하고 객체 구조가 고정적이라면 &lt;b&gt;__slots__&lt;/b&gt;를 활용해 보세요.&lt;/li&gt;
&lt;li data-sourcepos=&quot;578:1-579:0&quot;&gt;성능 병목 현상을 분석할 때 &lt;b&gt;GIL&lt;/b&gt;의 영향을 인지하고, 작업 유형에 맞는 동시성 전략(스레딩, 멀티프로세싱, asyncio)을 선택하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;580:1-580:101&quot; data-ke-size=&quot;size16&quot;&gt;파이썬의 장점은 그 유연성과 강력함에 있습니다. 하지만 모든 문제에 가장 복잡한 해결책이 필요한 것은 아닙니다. 이 고급 개념들을 현명하게, 적재적소에 사용하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;580:1-580:101&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;582:1-582:77&quot; data-ke-size=&quot;size16&quot;&gt;꾸준히 실험하고, 코드를 읽고, 배우면서 '파이썬을 꽤 잘하는' 수준을 넘어 진정한 '파이썬 전문가'로 성장해 나가시기를 응원합니다!  &lt;/p&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;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;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743692201553&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&quot; data-og-description=&quot;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cSvcgE/hyYCbtPkHA/YMMRcxahVjoe7DZgVb69Tk/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cidIf4/hyYxFKy5Uk/6PJeVktyMNJ6RqUyWVRMak/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cSvcgE/hyYCbtPkHA/YMMRcxahVjoe7DZgVb69Tk/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/cidIf4/hyYxFKy5Uk/6PJeVktyMNJ6RqUyWVRMak/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743692210293&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dN7ELe/hyYxHn2Ykh/ThkluKa3fnZa32Zm08bcA0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cKjlAk/hyYyPMJ7Si/eryWvR4TAf3YKf0GqeFav0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dN7ELe/hyYxHn2Ykh/ThkluKa3fnZa32Zm08bcA0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cKjlAk/hyYyPMJ7Si/eryWvR4TAf3YKf0GqeFav0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-list-vs-deque&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python 팁] list는 아는데 deque 모르면 주니어.&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743692225843&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;[Python 팁] list는 아는데 deque 모르면 주니어.&quot; data-og-description=&quot;우리는 매일 코드에서 리스트(list)를 사용하죠. 하지만 많은 개발자들이 아주 간단하면서도 코드를 더 빠르고 효율적으로 만들어 줄 리스트 트릭을 놓치고 있다는 사실, 알고 계셨나요?  저도 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-list-vs-deque&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-list-vs-deque&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c2vIHW/hyYBdexnIA/5egaH89ocIDcPEZtNW0bJ0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/jjZSW/hyYxPfgovy/waw6TkkKJck79yeTWAGnCk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-list-vs-deque&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-list-vs-deque&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c2vIHW/hyYBdexnIA/5egaH89ocIDcPEZtNW0bJ0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/jjZSW/hyYxPfgovy/waw6TkkKJck79yeTWAGnCk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Python 팁] list는 아는데 deque 모르면 주니어.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우리는 매일 코드에서 리스트(list)를 사용하죠. 하지만 많은 개발자들이 아주 간단하면서도 코드를 더 빠르고 효율적으로 만들어 줄 리스트 트릭을 놓치고 있다는 사실, 알고 계셨나요?  저도&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/정보</category>
      <category>고급 파이썬</category>
      <category>시니어 파이썬 개발</category>
      <category>파이썬 asyncio</category>
      <category>파이썬 contextmanager</category>
      <category>파이썬 decorator</category>
      <category>파이썬 GIL</category>
      <category>파이썬 metaclass</category>
      <category>파이썬 slots</category>
      <category>파이썬 with</category>
      <category>파이썬 디스크립터</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/235</guid>
      <comments>https://intelloper.tistory.com/entry/seven-python-concepts-to-be-senior-developer#entry235comment</comments>
      <pubDate>Thu, 3 Apr 2025 23:59:09 +0900</pubDate>
    </item>
    <item>
      <title>[Backend 면접 대비 시리즈] 2025년 백엔드 / 서버 엔지니어 면접 대비 가이드</title>
      <link>https://intelloper.tistory.com/entry/2025-backend-interview-guide</link>
      <description>&lt;div id=&quot;chat-history&quot;&gt;
&lt;div id=&quot;1d3fc958c875f012&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;model-response-message-contentr_1d3fc958c875f012&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMRNl/btsM8i6udTF/fJARfu5L2ktkhzx7DiS81k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMRNl/btsM8i6udTF/fJARfu5L2ktkhzx7DiS81k/img.webp&quot; data-alt=&quot;[Backend 면접 대비 시리즈] 2025년 백엔드 / 서버 엔지니어 면접 대비 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMRNl/btsM8i6udTF/fJARfu5L2ktkhzx7DiS81k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMRNl%2FbtsM8i6udTF%2FfJARfu5L2ktkhzx7DiS81k%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Backend 면접 대비 시리즈] 2025년 백엔드 / 서버 엔지니어 면접 대비 가이드&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 data-sourcepos=&quot;7:1-7:8&quot; data-ke-size=&quot;size26&quot;&gt;1. 서론&lt;/h2&gt;
&lt;p data-sourcepos=&quot;9:1-9:241&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발 및 서버 엔지니어링 분야는 기술이 끊임없이 발전하며, 전문가에게 요구되는 역량도 지속적으로 변화하고 있습니다. 2025년 면접을 준비하는 것은 이러한 &lt;b&gt;기술 변화&lt;/b&gt;와 &lt;b&gt;채용 시장의 요구 사항&lt;/b&gt;을 정확히 파악하는 데서 시작됩니다. 숙련된 전문가 수요 증가에 따라, 채용 과정은 기술력뿐 아니라 &lt;b&gt;문제 해결 능력, 시스템 설계 능력, 협업 능력&lt;/b&gt; 등 다양한 측면을 종합적으로 평가하는 방향으로 심화되고 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;11:1-11:87&quot; data-ke-size=&quot;size16&quot;&gt;본 가이드는 2025년 백엔드 개발자 및 서버 엔지니어 면접 성공을 위해 필요한 &lt;b&gt;핵심 기술 지식&lt;/b&gt;과 &lt;b&gt;효과적인 준비 전략&lt;/b&gt;을 포괄적으로 제시합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;15:1-15:19&quot; data-ke-size=&quot;size26&quot;&gt;2. 백엔드 개발의 기초  &lt;/h2&gt;
&lt;h3 data-sourcepos=&quot;17:1-17:21&quot; data-ke-size=&quot;size23&quot;&gt;2.1. 백엔드 프로그래밍 언어&lt;/h3&gt;
&lt;p data-sourcepos=&quot;19:1-19:64&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발의 핵심은 프로그래밍 언어의 능숙한 활용입니다. 2025년에도 널리 사용될 주요 언어는 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;21:1-25:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;21:1-21:68&quot;&gt;&lt;b&gt;Java:&lt;/b&gt; 견고성, 확장성, 광범위한 엔터프라이즈 생태계. 대규모/복잡 애플리케이션 강점. 스레드 기반 동시성.&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:1-22:97&quot;&gt;&lt;b&gt;Python:&lt;/b&gt; 간결한 문법, 빠른 개발 속도, 풍부한 라이브러리 (Django, Flask, 데이터 과학). GIL로 인한 CPU 바인딩 스레딩 성능 제한 가능성.&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:1-23:59&quot;&gt;&lt;b&gt;Go:&lt;/b&gt; 뛰어난 성능, 고루틴 기반 효율적 동시성 처리. 네트워크 서비스, 클라우드 인프라 적합.&lt;/li&gt;
&lt;li data-sourcepos=&quot;24:1-25:0&quot;&gt;&lt;b&gt;Node.js:&lt;/b&gt; JavaScript 기반, 비동기 이벤트 기반 아키텍처. I/O 집약적 앱, 실시간 통신 매우 적합.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;26:1-26:17&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주요 백엔드 언어 비교:&lt;/b&gt;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 133px;&quot; border=&quot;1&quot; data-sourcepos=&quot;28:1-33:132&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;width: 10.2326%; height: 19px;&quot;&gt;&lt;b&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;Java&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 21.7442%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;Go&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 24.4186%; height: 19px; text-align: center;&quot;&gt;&lt;b&gt;Node.js&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot; data-sourcepos=&quot;30:1-30:122&quot;&gt;
&lt;td style=&quot;width: 10.2326%; height: 38px;&quot; data-sourcepos=&quot;30:1-30:11&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%; height: 38px;&quot; data-sourcepos=&quot;30:13-30:34&quot;&gt;견고함, 확장성, 엔터프라이즈 생태계&lt;/td&gt;
&lt;td style=&quot;width: 21.7442%; height: 38px;&quot; data-sourcepos=&quot;30:36-30:61&quot;&gt;간결함, 빠른 개발, 풍부한 라이브러리&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%; height: 38px;&quot; data-sourcepos=&quot;30:63-30:87&quot;&gt;고성능, 효율적 동시성, 시스템 프로그래밍&lt;/td&gt;
&lt;td style=&quot;width: 24.4186%; height: 38px;&quot; data-sourcepos=&quot;30:89-30:120&quot;&gt;JavaScript 기반, 비동기 이벤트, I/O 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-sourcepos=&quot;31:1-31:164&quot;&gt;
&lt;td style=&quot;width: 10.2326%; height: 19px;&quot; data-sourcepos=&quot;31:1-31:8&quot;&gt;&lt;b&gt;성능&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%; height: 19px;&quot; data-sourcepos=&quot;31:10-31:41&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;width: 21.7442%; height: 19px;&quot; data-sourcepos=&quot;31:43-31:81&quot;&gt;중간&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%; height: 19px;&quot; data-sourcepos=&quot;31:83-31:120&quot;&gt;매우 높음&lt;/td&gt;
&lt;td style=&quot;width: 24.4186%; height: 19px;&quot; data-sourcepos=&quot;31:122-31:162&quot;&gt;높음 (I/O)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-sourcepos=&quot;32:1-32:162&quot;&gt;
&lt;td style=&quot;width: 10.2326%; height: 19px;&quot; data-sourcepos=&quot;32:1-32:12&quot;&gt;&lt;b&gt;동시성 모델&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%; height: 19px;&quot; data-sourcepos=&quot;32:14-32:44&quot;&gt;스레드&lt;/td&gt;
&lt;td style=&quot;width: 21.7442%; height: 19px;&quot; data-sourcepos=&quot;32:46-32:81&quot;&gt;스레드 (GIL 제한)&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%; height: 19px;&quot; data-sourcepos=&quot;32:83-32:121&quot;&gt;고루틴&lt;/td&gt;
&lt;td style=&quot;width: 24.4186%; height: 19px;&quot; data-sourcepos=&quot;32:123-32:160&quot;&gt;이벤트 루프&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 38px;&quot; data-sourcepos=&quot;33:1-33:132&quot;&gt;
&lt;td style=&quot;width: 10.2326%; height: 38px;&quot; data-sourcepos=&quot;33:1-33:11&quot;&gt;&lt;b&gt;주요 활용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 19.5349%; height: 38px;&quot; data-sourcepos=&quot;33:13-33:35&quot;&gt;엔터프라이즈 앱, 안드로이드&lt;/td&gt;
&lt;td style=&quot;width: 21.7442%; height: 38px;&quot; data-sourcepos=&quot;33:37-33:65&quot;&gt;웹 개발, 데이터 과학, 머신러닝&lt;/td&gt;
&lt;td style=&quot;width: 23.9535%; height: 38px;&quot; data-sourcepos=&quot;33:67-33:94&quot;&gt;네트워크 서비스, 클라우드 인프라&lt;/td&gt;
&lt;td style=&quot;width: 24.4186%; height: 38px;&quot; data-sourcepos=&quot;33:96-33:130&quot;&gt;웹 개발 (실시간, I/O), API 서버&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;p data-sourcepos=&quot;35:1-35:158&quot; data-ke-size=&quot;size16&quot;&gt;최근 &lt;b&gt;마이크로서비스&lt;/b&gt; 및 &lt;b&gt;클라우드 네이티브&lt;/b&gt; 애플리케이션 추세는 언어 선택에 영향을 미칩니다. &lt;b&gt;Go&lt;/b&gt;와 &lt;b&gt;Node.js&lt;/b&gt;는 이러한 환경에서 뛰어난 성능과 동시성 모델로 선호도가 높아지는 경향이 있습니다. 경량화되고 효율적인 통신, 분산 워크로드 관리에 유리합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-sourcepos=&quot;37:1-37:19&quot; data-ke-size=&quot;size23&quot;&gt;2.2. 데이터베이스  ️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;39:1-39:36&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스는 데이터의 효율적 저장, 검색, 관리에 필수적입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;41:1-61:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;41:1-43:74&quot;&gt;&lt;b&gt;관계형 데이터베이스 (RDBMS):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;42:5-43:74&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;42:5-42:51&quot;&gt;&lt;b&gt;MySQL:&lt;/b&gt; 사용 편의성, 대규모 커뮤니티, 웹 애플리케이션에 널리 사용.&lt;/li&gt;
&lt;li data-sourcepos=&quot;43:5-43:74&quot;&gt;&lt;b&gt;PostgreSQL:&lt;/b&gt; 확장성, 고급 기능, SQL 표준 준수율 높음. 복잡 데이터 모델, 고 무결성 요구 시 적합.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;44:1-47:31&quot;&gt;&lt;b&gt;데이터베이스 설계 원칙:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;45:5-47:31&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;45:5-45:23&quot;&gt;스키마 설계, 데이터 타입 선정&lt;/li&gt;
&lt;li data-sourcepos=&quot;46:5-46:27&quot;&gt;관계 설정 (1:1, 1:N, N:M)&lt;/li&gt;
&lt;li data-sourcepos=&quot;47:5-47:31&quot;&gt;기본 키(PK), 외래 키(FK) 설정 중요성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;48:1-50:33&quot;&gt;&lt;b&gt;정규화 (Normalization):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;49:5-50:33&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;49:5-49:47&quot;&gt;데이터 중복 제거 및 무결성 향상 (1NF, 2NF, 3NF, BCNF).&lt;/li&gt;
&lt;li data-sourcepos=&quot;50:5-50:33&quot;&gt;정규화 vs 비정규화(반정규화) 균형 이해 중요.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;51:1-53:27&quot;&gt;&lt;b&gt;인덱싱 (Indexing):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;52:5-53:27&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;52:5-52:36&quot;&gt;쿼리 성능 향상 핵심 기술 (B-tree, 해시 등).&lt;/li&gt;
&lt;li data-sourcepos=&quot;53:5-53:27&quot;&gt;읽기/쓰기 성능 간 트레이드오프 고려.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;54:1-57:20&quot;&gt;&lt;b&gt;쿼리 최적화 (Query Optimization):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;55:5-57:20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;55:5-55:22&quot;&gt;EXPLAIN 계획 활용.&lt;/li&gt;
&lt;li data-sourcepos=&quot;56:5-56:13&quot;&gt;조인 최적화.&lt;/li&gt;
&lt;li data-sourcepos=&quot;57:5-57:20&quot;&gt;비효율적 쿼리 구조 지양.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;58:1-61:0&quot;&gt;&lt;b&gt;NoSQL 데이터베이스:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;59:5-61:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;59:5-59:74&quot;&gt;&lt;b&gt;MongoDB:&lt;/b&gt; 문서 지향, 유연성/확장성 뛰어남. 스키마리스, 쉬운 모델 변경, 높은 쓰기 처리량 요구 시 적합.&lt;/li&gt;
&lt;li data-sourcepos=&quot;60:5-61:0&quot;&gt;&lt;b&gt;Redis:&lt;/b&gt; 인메모리 데이터 저장소. 캐시, 메시지 브로커, 실시간 데이터 처리 등 활용. 빠른 속도, 다양한 데이터 구조 지원.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;62:1-62:97&quot; data-ke-size=&quot;size16&quot;&gt;고도의 확장성과 유연한 데이터 모델 요구 증가로 &lt;b&gt;NoSQL&lt;/b&gt;의 중요성이 커지고 있습니다. 각 데이터베이스의 특징을 이해하고 상황에 맞게 선택/사용하는 능력이 중요합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;64:1-64:20&quot; data-ke-size=&quot;size23&quot;&gt;2.3. 서버 아키텍처  ️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;66:1-66:40&quot; data-ke-size=&quot;size16&quot;&gt;서버 아키텍처는 시스템 성능, 확장성, 유지보수성에 큰 영향을 미칩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;68:1-83:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;68:1-70:26&quot;&gt;&lt;b&gt;Monolithic 아키텍처:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;69:5-70:26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;69:5-69:25&quot;&gt;단일 코드베이스. 초기 개발 단순.&lt;/li&gt;
&lt;li data-sourcepos=&quot;70:5-70:26&quot;&gt;규모 커질수록 확장/유지보수 어려움.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;71:1-75:28&quot;&gt;&lt;b&gt;Microservices (MSA) 아키텍처:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;72:5-75:28&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;72:5-72:23&quot;&gt;작고 독립적인 서비스들의 모음.&lt;/li&gt;
&lt;li data-sourcepos=&quot;73:5-73:21&quot;&gt;개별 개발/배포/확장 가능.&lt;/li&gt;
&lt;li data-sourcepos=&quot;74:5-74:29&quot;&gt;장점: 확장성, 장애 격리, 기술 다양성.&lt;/li&gt;
&lt;li data-sourcepos=&quot;75:5-75:28&quot;&gt;단점: 배포/모니터링/통신 복잡성 증가.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;76:1-83:0&quot;&gt;&lt;b&gt;MSA 설계 고려 사항:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;77:5-83:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;77:5-77:15&quot;&gt;서비스 분해 전략&lt;/li&gt;
&lt;li data-sourcepos=&quot;78:5-78:15&quot;&gt;API 게이트웨이&lt;/li&gt;
&lt;li data-sourcepos=&quot;79:5-79:12&quot;&gt;로드 밸런싱&lt;/li&gt;
&lt;li data-sourcepos=&quot;80:5-80:15&quot;&gt;서비스 디스커버리&lt;/li&gt;
&lt;li data-sourcepos=&quot;81:5-81:34&quot;&gt;서비스 간 통신 (REST, gRPC, 메시지 큐)&lt;/li&gt;
&lt;li data-sourcepos=&quot;82:5-83:0&quot;&gt;분산 트랜잭션 및 데이터 일관성 유지 전략&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;84:1-84:98&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마이크로서비스 아키텍처&lt;/b&gt;는 대규모 애플리케이션 구축의 주된 흐름입니다. 면접에서는 MSA 장점과 구현/관리의 어려움에 대한 이해도를 묻는 질문이 자주 출제될 수 있습니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;86:1-86:23&quot; data-ke-size=&quot;size23&quot;&gt;2.4. API 설계 및 개발 &amp;harr;️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;88:1-88:36&quot; data-ke-size=&quot;size16&quot;&gt;API는 분산 시스템 및 클라이언트-서버 통신의 핵심 요소입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;90:1-105:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;90:1-94:26&quot;&gt;&lt;b&gt;RESTful API:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;91:5-94:26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;91:5-91:24&quot;&gt;무상태(Stateless) 통신.&lt;/li&gt;
&lt;li data-sourcepos=&quot;92:5-92:20&quot;&gt;URI 통한 리소스 식별.&lt;/li&gt;
&lt;li data-sourcepos=&quot;93:5-93:53&quot;&gt;표준 HTTP 메서드 활용 (GET, POST, PUT, DELETE, PATCH).&lt;/li&gt;
&lt;li data-sourcepos=&quot;94:5-94:26&quot;&gt;표현 방식 (JSON, XML 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;95:1-98:42&quot;&gt;&lt;b&gt;GraphQL:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;96:5-98:42&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;96:5-96:33&quot;&gt;클라이언트가 필요한 데이터만 요청하는 쿼리 언어.&lt;/li&gt;
&lt;li data-sourcepos=&quot;97:5-97:43&quot;&gt;Over-fetching / Under-fetching 문제 해결.&lt;/li&gt;
&lt;li data-sourcepos=&quot;98:5-98:42&quot;&gt;주요 개념: 스키마 정의 언어(SDL), 쿼리, 뮤테이션, 구독.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;99:1-105:0&quot;&gt;&lt;b&gt;API 보안 고려 사항:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;100:5-105:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;100:5-100:41&quot;&gt;인증 (Authentication): OAuth 2.0, JWT&lt;/li&gt;
&lt;li data-sourcepos=&quot;101:5-101:35&quot;&gt;권한 부여 (Authorization): RBAC 등&lt;/li&gt;
&lt;li data-sourcepos=&quot;102:5-102:34&quot;&gt;입력 유효성 검사 (Input Validation)&lt;/li&gt;
&lt;li data-sourcepos=&quot;103:5-103:29&quot;&gt;민감 데이터 암호화 (전송 중, 저장 시)&lt;/li&gt;
&lt;li data-sourcepos=&quot;104:5-105:0&quot;&gt;일반적 API 취약점 방지 (SQL Injection, XSS 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;106:1-106:65&quot; data-ke-size=&quot;size16&quot;&gt;면접에서는 RESTful 원칙, GraphQL 특징 및 차이점, 안전한 API 개발을 위한 보안 지식이 필수적입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;110:1-110:23&quot; data-ke-size=&quot;size26&quot;&gt;3. 서버 엔지니어링 및 운영  ️&lt;/h2&gt;
&lt;h3 data-sourcepos=&quot;112:1-112:24&quot; data-ke-size=&quot;size23&quot;&gt;3.1. 클라우드 컴퓨팅 플랫폼 ☁️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;114:1-114:67&quot; data-ke-size=&quot;size16&quot;&gt;클라우드는 현대 서버 인프라의 핵심입니다. 주요 제공업체(AWS, Azure, GCP)와 핵심 서비스를 이해해야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;116:1-122:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;116:1-117:72&quot;&gt;&lt;b&gt;AWS (Amazon Web Services):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;117:5-117:72&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;117:5-117:72&quot;&gt;EC2 (가상 머신), S3 (객체 스토리지), RDS/DynamoDB (데이터베이스), VPC (가상 네트워크) 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;118:1-119:85&quot;&gt;&lt;b&gt;Azure (Microsoft Azure):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;119:5-119:85&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;119:5-119:85&quot;&gt;Azure VMs, Blob Storage, Azure SQL Database/Cosmos DB, Azure Virtual Network 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;120:1-122:0&quot;&gt;&lt;b&gt;GCP (Google Cloud Platform):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;121:5-122:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;121:5-122:0&quot;&gt;Compute Engine, Cloud Storage, Cloud SQL/Bigtable, Virtual Private Cloud 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;123:1-123:66&quot; data-ke-size=&quot;size16&quot;&gt;핵심 서비스 이해, 백엔드 애플리케이션/서버 운영 활용 방안 설명, 플랫폼별 특징/장단점 비교 분석 능력이 중요합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;125:1-125:19&quot; data-ke-size=&quot;size23&quot;&gt;3.2. 컨테이너 기술  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;127:1-127:32&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너 기술은 애플리케이션 배포 및 관리를 혁신했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;129:1-138:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;129:1-132:40&quot;&gt;&lt;b&gt;Docker:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;130:5-132:40&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;130:5-130:29&quot;&gt;Dockerfile 기반 이미지 빌드.&lt;/li&gt;
&lt;li data-sourcepos=&quot;131:5-131:33&quot;&gt;컨테이너 생성 및 관리 (실행, 중지, 재시작).&lt;/li&gt;
&lt;li data-sourcepos=&quot;132:5-132:40&quot;&gt;Docker Compose 이용한 멀티 컨테이너 앱 관리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;133:1-138:0&quot;&gt;&lt;b&gt;Kubernetes (K8s):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;134:5-138:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;134:5-134:23&quot;&gt;컨테이너 오케스트레이션 시스템.&lt;/li&gt;
&lt;li data-sourcepos=&quot;135:5-135:54&quot;&gt;핵심 개념: Pod, Deployment, Service, Namespace 등 이해.&lt;/li&gt;
&lt;li data-sourcepos=&quot;136:5-136:26&quot;&gt;수평적 Pod 자동 확장 (HPA).&lt;/li&gt;
&lt;li data-sourcepos=&quot;137:5-138:0&quot;&gt;기본적인 클러스터 관리 방법.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;139:1-139:103&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너는 이식성, 확장성, 격리성을 향상시키며 현대 배포/확장 전략의 핵심입니다. Docker/K8s 장점, 활용 사례, 오케스트레이션 및 관리 방법에 대한 질문이 나올 수 있습니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;141:1-141:19&quot; data-ke-size=&quot;size23&quot;&gt;3.3. 네트워킹 기초  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;143:1-143:28&quot; data-ke-size=&quot;size16&quot;&gt;서버 엔지니어에게 네트워킹 기초 지식은 필수입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;145:1-158:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;145:1-148:35&quot;&gt;&lt;b&gt;DNS (Domain Name System):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;146:5-148:35&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;146:5-146:19&quot;&gt;DNS 해석 과정 이해.&lt;/li&gt;
&lt;li data-sourcepos=&quot;147:5-147:54&quot;&gt;DNS 서버 유형 (Recursive, Root, TLD, Authoritative).&lt;/li&gt;
&lt;li data-sourcepos=&quot;148:5-148:35&quot;&gt;주요 DNS 레코드 (A, CNAME, MX) 이해.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;149:1-152:35&quot;&gt;&lt;b&gt;HTTP/HTTPS:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;150:5-152:35&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;150:5-150:18&quot;&gt;프로토콜 차이점 이해.&lt;/li&gt;
&lt;li data-sourcepos=&quot;151:5-151:25&quot;&gt;HTTPS에서 SSL/TLS 역할.&lt;/li&gt;
&lt;li data-sourcepos=&quot;152:5-152:35&quot;&gt;표준 포트 (HTTP: 80, HTTPS: 443).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;153:1-158:0&quot;&gt;&lt;b&gt;IP 주소 체계:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;154:5-158:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;154:5-154:19&quot;&gt;IPv4 vs IPv6.&lt;/li&gt;
&lt;li data-sourcepos=&quot;155:5-155:26&quot;&gt;IP 주소 클래스 (A, B, C).&lt;/li&gt;
&lt;li data-sourcepos=&quot;156:5-156:35&quot;&gt;사설(Private) vs 공인(Public) IP.&lt;/li&gt;
&lt;li data-sourcepos=&quot;157:5-158:0&quot;&gt;서브네팅(Subnetting) 개념.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;159:1-159:45&quot; data-ke-size=&quot;size16&quot;&gt;네트워킹 지식은 서버 연결 문제 진단, 설정 구성, 보안 통신 보장에 중요합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;161:1-161:24&quot; data-ke-size=&quot;size23&quot;&gt;3.4. 서버 성능 및 모니터링  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;163:1-163:33&quot; data-ke-size=&quot;size16&quot;&gt;최적의 서버 성능 유지는 안정성과 사용자 경험에 직결됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;165:1-175:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;165:1-167:61&quot;&gt;&lt;b&gt;모니터링:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;166:5-167:61&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;166:5-166:68&quot;&gt;주요 성능 지표 이해 (CPU 사용률, 메모리 사용량, 디스크 I/O, 네트워크 지연 시간, 앱별 메트릭 등).&lt;/li&gt;
&lt;li data-sourcepos=&quot;167:5-167:61&quot;&gt;모니터링 도구 사용 경험 (Prometheus, Grafana, Datadog, Nagios 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;168:1-171:19&quot;&gt;&lt;b&gt;튜닝:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;169:5-171:19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;169:5-169:17&quot;&gt;커널 파라미터 조정.&lt;/li&gt;
&lt;li data-sourcepos=&quot;170:5-170:20&quot;&gt;애플리케이션 설정 최적화.&lt;/li&gt;
&lt;li data-sourcepos=&quot;171:5-171:19&quot;&gt;데이터베이스 쿼리 튜닝.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;172:1-175:0&quot;&gt;&lt;b&gt;문제 해결:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;173:5-175:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;173:5-173:33&quot;&gt;성능 저하/장애 발생 시 체계적 접근 방식 숙지.&lt;/li&gt;
&lt;li data-sourcepos=&quot;174:5-175:0&quot;&gt;단계: 문제 식별 -&amp;gt; 원인 가설 -&amp;gt; 가설 검증 -&amp;gt; 해결 방안 수립/실행 -&amp;gt; 기능 검증 -&amp;gt; 문서화 -&amp;gt; 근본 원인 분석 (RCA).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;176:1-176:62&quot; data-ke-size=&quot;size16&quot;&gt;서버 상태 지속 모니터링, 성능 병목 식별/튜닝, 장애 발생 시 신속 대응으로 시스템 가용성 확보가 중요합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;178:1-178:18&quot; data-ke-size=&quot;size23&quot;&gt;3.5. 백엔드 보안  &lt;/h3&gt;
&lt;p data-sourcepos=&quot;180:1-180:43&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 시스템 보안은 사용자 데이터 보호 및 시스템 안정성에 가장 중요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;182:1-190:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;182:1-190:0&quot;&gt;&lt;b&gt;핵심 고려 사항:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;183:5-190:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;183:5-183:42&quot;&gt;안전한 코딩 관행 (Secure Coding Practices).&lt;/li&gt;
&lt;li data-sourcepos=&quot;184:5-184:35&quot;&gt;입력 유효성 검사 (Input Validation).&lt;/li&gt;
&lt;li data-sourcepos=&quot;185:5-185:31&quot;&gt;출력 인코딩 (Output Encoding).&lt;/li&gt;
&lt;li data-sourcepos=&quot;186:5-186:56&quot;&gt;암호화 (Encryption): 전송 중(In-transit), 저장 시(At-rest).&lt;/li&gt;
&lt;li data-sourcepos=&quot;187:5-187:29&quot;&gt;접근 제어 (Access Control).&lt;/li&gt;
&lt;li data-sourcepos=&quot;188:5-188:35&quot;&gt;정기적인 보안 감사 (Security Audits).&lt;/li&gt;
&lt;li data-sourcepos=&quot;189:5-190:0&quot;&gt;일반적 백엔드 취약점 인지 (SQL Injection, XSS, CSRF 등).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;191:1-191:86&quot; data-ke-size=&quot;size16&quot;&gt;보안은 기술뿐 아니라 정책 준수 및 보안 문화 조성과도 관련됩니다. 면접에서는 보안 지식과 안전한 시스템 구축/운영 경험에 대한 질문이 나올 수 있습니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;193:1-193:20&quot; data-ke-size=&quot;size23&quot;&gt;3.6. 서버 운영체제  ️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;195:1-195:28&quot; data-ke-size=&quot;size16&quot;&gt;서버 OS 선택은 배포 환경에 큰 영향을 미칩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;197:1-202:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;197:1-198:42&quot;&gt;&lt;b&gt;Linux vs Windows Server:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;198:5-198:42&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;198:5-198:42&quot;&gt;비용, 성능, 보안, 사용 편의성, 기술 호환성 등 장단점 이해.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;199:1-202:0&quot;&gt;&lt;b&gt;환경별 특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;200:5-202:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;200:5-200:50&quot;&gt;Linux: CLI(Command-Line Interface) 사용 경험 중요.&lt;/li&gt;
&lt;li data-sourcepos=&quot;201:5-202:0&quot;&gt;Windows Server: GUI(Graphical User Interface) 기반 관리 도구 사용 경험 유용.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;203:1-203:48&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 요구 사항과 조직 선호도에 따라 적절한 OS 선택 및 관리 능력이 필요합니다.&lt;/p&gt;
&lt;h3 data-sourcepos=&quot;205:1-205:24&quot; data-ke-size=&quot;size23&quot;&gt;3.7. 자동화를 위한 스크립팅 ⚙️&lt;/h3&gt;
&lt;p data-sourcepos=&quot;207:1-207:39&quot; data-ke-size=&quot;size16&quot;&gt;스크립팅 능력은 서버 관리 효율성 향상과 수동 오류 감소에 중요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;209:1-214:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;209:1-209:45&quot;&gt;&lt;b&gt;주요 스크립팅 언어:&lt;/b&gt; Bash, Python, PowerShell 등.&lt;/li&gt;
&lt;li data-sourcepos=&quot;210:1-214:0&quot;&gt;&lt;b&gt;활용 분야:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;211:5-214:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;211:5-211:15&quot;&gt;서버 프로비저닝.&lt;/li&gt;
&lt;li data-sourcepos=&quot;212:5-212:16&quot;&gt;애플리케이션 배포.&lt;/li&gt;
&lt;li data-sourcepos=&quot;213:5-214:0&quot;&gt;정기 유지 관리 작업 자동화.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;215:1-215:38&quot; data-ke-size=&quot;size16&quot;&gt;자동화는 생산성 향상 및 대규모 인프라의 효율적 관리에 필수적입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;219:1-219:28&quot; data-ke-size=&quot;size26&quot;&gt;4. 면접 과정에서 뛰어난 역량 발휘하기  &lt;/h2&gt;
&lt;h3 data-sourcepos=&quot;221:1-221:25&quot; data-ke-size=&quot;size23&quot;&gt;4.1. 일반적인 코딩 면접 문제 유형&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;223:1-226:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;223:1-223:74&quot;&gt;&lt;b&gt;핵심 주제:&lt;/b&gt; 자료 구조 (배열, 연결 리스트, 트리, 그래프, 해시 테이블), 알고리즘 (정렬, 검색, 동적 프로그래밍).&lt;/li&gt;
&lt;li data-sourcepos=&quot;224:1-224:56&quot;&gt;&lt;b&gt;문제 해결 전략:&lt;/b&gt; 문제 이해 -&amp;gt; 문제 분해 -&amp;gt; 해결 방안 고안 -&amp;gt; 구현 -&amp;gt; 테스트.&lt;/li&gt;
&lt;li data-sourcepos=&quot;225:1-226:0&quot;&gt;&lt;b&gt;중요:&lt;/b&gt; 사고 과정을 면접관에게 명확하게 설명하는 능력.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;227:1-227:21&quot; data-ke-size=&quot;size23&quot;&gt;4.2. 동시성 문제 처리 전략&lt;/h3&gt;
&lt;p data-sourcepos=&quot;229:1-229:45&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 시스템은 동시 요청 처리가 빈번하므로 동시성 문제 해결 능력이 중요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;231:1-233:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;231:1-231:55&quot;&gt;&lt;b&gt;핵심 개념:&lt;/b&gt; 스레드, 락 (비관적/낙관적), 비동기 프로그래밍, 스레드 안전 자료 구조.&lt;/li&gt;
&lt;li data-sourcepos=&quot;232:1-233:0&quot;&gt;&lt;b&gt;대비:&lt;/b&gt; 레이스 컨디션(Race Condition), 데드락(Deadlock) 등 일반적 동시성 문제 방지 및 해결 전략 숙지.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;234:1-234:28&quot; data-ke-size=&quot;size23&quot;&gt;4.3. 데이터베이스 상호 작용 최적화 전략&lt;/h3&gt;
&lt;p data-sourcepos=&quot;236:1-236:34&quot; data-ke-size=&quot;size16&quot;&gt;효율적인 DB 상호 작용은 백엔드 성능에 큰 영향을 미칩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;238:1-243:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;238:1-243:0&quot;&gt;&lt;b&gt;핵심 전략:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;239:5-243:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;239:5-239:18&quot;&gt;효과적인 인덱싱 전략.&lt;/li&gt;
&lt;li data-sourcepos=&quot;240:5-240:40&quot;&gt;쿼리 최적화 (SELECT * 피하기, 효율적 조인 등).&lt;/li&gt;
&lt;li data-sourcepos=&quot;241:5-241:33&quot;&gt;캐싱 메커니즘 (Redis, Memcached).&lt;/li&gt;
&lt;li data-sourcepos=&quot;242:5-243:0&quot;&gt;데이터베이스 샤딩 (대규모 앱).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;244:1-244:18&quot; data-ke-size=&quot;size23&quot;&gt;4.4. 시스템 설계 면접&lt;/h3&gt;
&lt;p data-sourcepos=&quot;246:1-246:38&quot; data-ke-size=&quot;size16&quot;&gt;고수준 사고 능력과 확장 가능/견고한 시스템 설계 능력을 평가합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;248:1-255:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;248:1-248:45&quot;&gt;&lt;b&gt;대비 시나리오:&lt;/b&gt; URL 단축기, 소셜 미디어 피드, 채팅 앱 설계 등.&lt;/li&gt;
&lt;li data-sourcepos=&quot;249:1-255:0&quot;&gt;&lt;b&gt;접근 방식 연습:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;250:5-255:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;250:5-250:16&quot;&gt;요구 사항 명확화.&lt;/li&gt;
&lt;li data-sourcepos=&quot;251:5-251:16&quot;&gt;고수준 설계 개요.&lt;/li&gt;
&lt;li data-sourcepos=&quot;252:5-252:21&quot;&gt;컴포넌트 상호 작용 상세화.&lt;/li&gt;
&lt;li data-sourcepos=&quot;253:5-253:19&quot;&gt;확장성 및 안정성 고려.&lt;/li&gt;
&lt;li data-sourcepos=&quot;254:5-255:0&quot;&gt;트레이드오프 논의.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-sourcepos=&quot;256:1-256:25&quot; data-ke-size=&quot;size23&quot;&gt;4.5. 행동 면접 질문 및 답변 전략&lt;/h3&gt;
&lt;p data-sourcepos=&quot;258:1-258:49&quot; data-ke-size=&quot;size16&quot;&gt;과거 경험을 통해 소프트 스킬(문제 해결, 팀워크, 의사소통, 리더십 등)을 평가합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;260:1-266:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;260:1-264:36&quot;&gt;&lt;b&gt;STAR 기법 활용:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;261:5-264:36&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;261:5-261:37&quot;&gt;&lt;b&gt;S&lt;/b&gt;ituation (상황): 구체적인 상황 설명.&lt;/li&gt;
&lt;li data-sourcepos=&quot;262:5-262:33&quot;&gt;&lt;b&gt;T&lt;/b&gt;ask (과업): 맡았던 역할이나 목표.&lt;/li&gt;
&lt;li data-sourcepos=&quot;263:5-263:43&quot;&gt;&lt;b&gt;A&lt;/b&gt;ction (행동): 목표 달성을 위해 취한 구체적 행동.&lt;/li&gt;
&lt;li data-sourcepos=&quot;264:5-264:36&quot;&gt;&lt;b&gt;R&lt;/b&gt;esult (결과): 행동의 결과와 배운 점.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;265:1-266:0&quot;&gt;&lt;b&gt;대비 질문 유형:&lt;/b&gt; 문제 해결 경험, 팀워크 경험, 새로운 기술 학습 경험, 어려운 상황 대처 경험 등.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-sourcepos=&quot;269:1-269:10&quot; data-ke-size=&quot;size26&quot;&gt;5. 결론 ✅&lt;/h2&gt;
&lt;p data-sourcepos=&quot;271:1-271:145&quot; data-ke-size=&quot;size16&quot;&gt;2025년 백엔드 개발자 및 서버 엔지니어 면접은 &lt;b&gt;광범위한 기술 지식&lt;/b&gt;과 &lt;b&gt;실제 문제 해결 능력&lt;/b&gt;을 종합적으로 평가할 것입니다. 본 가이드에서 제시된 주요 기술 주제들을 숙지하고 효과적인 면접 준비 전략을 활용한다면 성공적인 결과를 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;273:1-273:77&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지속적인 학습&lt;/b&gt;과 &lt;b&gt;최신 기술 동향&lt;/b&gt;에 대한 관심은 필수이며, 꾸준한 연습을 통해 자신감을 가지고 면접에 임하는 것이 중요합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Backend 면접 질문 시리즈] 마이크로서비스 아키텍처: 현대 소프트웨어 개발의 핵심 트렌드&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1743673884740&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;[Backend 면접 질문 시리즈] 마이크로서비스 아키텍처: 현대 소프트웨어 개발의 핵심 트렌드&quot; data-og-description=&quot;Intro. 면접에서 나오는 질문은 보편적으로 중요한 개념이며 하루 아침에 이해되고 외워 지는게 아닙니다. 평소에 꾸준히 지식을 습득하고 이해하는것이 중요합니다.&amp;nbsp;&amp;nbsp;마이크로서비스 아키텍처&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bx4SkP/hyYA94gGkl/IedPGjkIKIWPDCc5kCLQl0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ZVd1L/hyYxEkxv95/YfPyIeZ27xZ3KGahRIhHM1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/0FUXy/hyYxRRIMRc/ml9bmtPy6AWFoe4yWZMU00/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/about-microservice&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bx4SkP/hyYA94gGkl/IedPGjkIKIWPDCc5kCLQl0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ZVd1L/hyYxEkxv95/YfPyIeZ27xZ3KGahRIhHM1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/0FUXy/hyYxRRIMRc/ml9bmtPy6AWFoe4yWZMU00/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;[Backend 면접 질문 시리즈] 마이크로서비스 아키텍처: 현대 소프트웨어 개발의 핵심 트렌드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Intro. 면접에서 나오는 질문은 보편적으로 중요한 개념이며 하루 아침에 이해되고 외워 지는게 아닙니다. 평소에 꾸준히 지식을 습득하고 이해하는것이 중요합니다.&amp;nbsp;&amp;nbsp;마이크로서비스 아키텍처&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/SQL-NoSQL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Backend 면접 질문 시리즈] SQL과 NoSQL 데이터베이스의 차이점을 설명해 주시겠습니까? 언제 무엇을 선택하시겠습니까?&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743673892521&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;[Backend 면접 질문 시리즈]  SQL과 NoSQL 데이터베이스의 차이점을 설명해 주시겠습니까? 언제 무엇&quot; data-og-description=&quot;Intro. 면접에서 나오는 질문은 보편적으로 중요한 개념이며 하루 아침에 이해되고 외워 지는게 아닙니다. 평소에 꾸준히 지식을 습득하고 이해하는것이 중요합니다.&amp;nbsp;SQL과 NoSQL 데이터베이스는 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/SQL-NoSQL&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/SQL-NoSQL&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cbH5QD/hyYxHheX9M/TMGGo94ZI3mLdK9b7ECAn0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c1N2rd/hyYBhBdo5D/cUfRp8kiZSDcVW7j3w656K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bxTyjm/hyYBa9UICL/gt0m1vjEuITSDCUVAjNco0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/SQL-NoSQL&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/SQL-NoSQL&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cbH5QD/hyYxHheX9M/TMGGo94ZI3mLdK9b7ECAn0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/c1N2rd/hyYBhBdo5D/cUfRp8kiZSDcVW7j3w656K/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bxTyjm/hyYBa9UICL/gt0m1vjEuITSDCUVAjNco0/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;[Backend 면접 질문 시리즈] SQL과 NoSQL 데이터베이스의 차이점을 설명해 주시겠습니까? 언제 무엇&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Intro. 면접에서 나오는 질문은 보편적으로 중요한 개념이며 하루 아침에 이해되고 외워 지는게 아닙니다. 평소에 꾸준히 지식을 습득하고 이해하는것이 중요합니다.&amp;nbsp;SQL과 NoSQL 데이터베이스는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743673907721&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;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&quot; data-og-description=&quot;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dMu904/hyYA5Oi23L/li3QOPWYMfi15PEfnE5grK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/THkJD/hyYxPGl4gD/fbb3tR9cW6Hx0Jeib6iCt0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dMu904/hyYA5Oi23L/li3QOPWYMfi15PEfnE5grK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/THkJD/hyYxPGl4gD/fbb3tR9cW6Hx0Jeib6iCt0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;/div&gt;</description>
      <category>BACKEND/기술 면접 시리즈</category>
      <category>2025 backend 면접 대비</category>
      <category>2025 백엔드 개발자 면접 대비</category>
      <category>최신 backend 개발자 면접 완벽 가이드</category>
      <category>최신 백엔드 면접 가이드</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/234</guid>
      <comments>https://intelloper.tistory.com/entry/2025-backend-interview-guide#entry234comment</comments>
      <pubDate>Thu, 3 Apr 2025 18:55:51 +0900</pubDate>
    </item>
    <item>
      <title>[Frontend 면접 대비 시리즈] 2025 최신 Frontend 개발자 면접 완벽 대비 가이드</title>
      <link>https://intelloper.tistory.com/entry/2025-frontend-interview-guide</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dYiklg/btsM5vTVole/TggsFFxuVKnMeFF2gatfgk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dYiklg/btsM5vTVole/TggsFFxuVKnMeFF2gatfgk/img.webp&quot; data-alt=&quot;2025 최신 Frontend 개발자 면접 완벽 대비 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dYiklg/btsM5vTVole/TggsFFxuVKnMeFF2gatfgk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdYiklg%2FbtsM5vTVole%2FTggsFFxuVKnMeFF2gatfgk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2025 최신 Frontend 개발자 면접 완벽 대비 가이드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div id=&quot;chat-history&quot;&gt;
&lt;div id=&quot;0bb5f20ec983e86f&quot;&gt;
&lt;div id=&quot;model-response-message-contentr_0bb5f20ec983e86f&quot;&gt;
&lt;h2 data-sourcepos=&quot;1:1-1:35&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-sourcepos=&quot;5:1-5:33&quot; data-ke-size=&quot;size26&quot;&gt;서론: 변화하는 Frontend 개발 면접 환경  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-sourcepos=&quot;7:1-7:186&quot; data-ke-size=&quot;size16&quot;&gt;Frontend 개발 분야는 끊임없이 진화하고 있으며, 면접에서 요구하는 역량도 빠르게 변화하고 있습니다. 새로운 프레임워크, 라이브러리, 도구가 지속적으로 등장하며&amp;sup1;, 이제 면접은 단순한 &lt;b&gt;코딩 능력&lt;/b&gt;을 넘어 &lt;b&gt;아키텍처 설계&lt;/b&gt;, &lt;b&gt;성능 최적화&lt;/b&gt;, **사용자 경험(UX)**에 대한 깊이 있는 이해를 평가하는 추세입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;9:1-9:139&quot; data-ke-size=&quot;size16&quot;&gt;따라서, &lt;b&gt;최신 기술 동향&lt;/b&gt;을 꾸준히 학습하고 면접에 철저히 대비하는 것이 중요합니다. 이 가이드는 Frontend 개발자 면접 준비를 위한 종합적인 로드맵을 제공하여, 여러분이 자신감을 가지고 면접에 임할 수 있도록 돕는 것을 목표로 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;13:1-13:28&quot; data-ke-size=&quot;size23&quot;&gt; ️ 핵심 Frontend 기술 마스터하기&lt;/h3&gt;
&lt;p data-sourcepos=&quot;15:1-15:77&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTML, CSS, JavaScript&lt;/b&gt;는 Frontend 개발의 근간이며, 이에 대한 탄탄한 이해는 모든 면접의 필수 조건입니다.&lt;/p&gt;
&lt;h4 data-sourcepos=&quot;17:1-17:27&quot; data-ke-size=&quot;size20&quot;&gt;  HTML: 기본 개념 및 주요 질문&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;19:1-33:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;19:1-25:0&quot;&gt;**시맨틱 HTML 태그와 그 중요성 (SEO &amp;amp; 접근성)**
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;20:5-25:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;20:5-20:41&quot;&gt;콘텐츠의 의미를 명확히 설명하여 코드 가독성과 유지보수성 향상&lt;/li&gt;
&lt;li data-sourcepos=&quot;21:5-21:29&quot;&gt;검색 엔진 최적화(&lt;b&gt;SEO&lt;/b&gt;)에 기여&lt;/li&gt;
&lt;li data-sourcepos=&quot;22:5-22:35&quot;&gt;웹 접근성 향상 (스크린 리더 등 보조 기술 지원)&lt;/li&gt;
&lt;li data-sourcepos=&quot;23:5-23:86&quot;&gt;주요 태그: &amp;lt;header&amp;gt;, &amp;lt;nav&amp;gt;, &amp;lt;article&amp;gt;, &amp;lt;aside&amp;gt;, &amp;lt;footer&amp;gt; 등&lt;/li&gt;
&lt;li data-sourcepos=&quot;24:5-25:0&quot;&gt;면접관 Tip: 시맨틱 HTML 질문은 코드의 구조적 의미와 유지보수성, 접근성에 대한 이해도를 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;26:1-29:0&quot;&gt;&lt;b&gt;HTML 폼과 유효성 검사&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;27:5-29:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;27:5-27:45&quot;&gt;다양한 입력 타입 (type)과 속성 (attribute) 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;28:5-29:0&quot;&gt;HTML5 속성 및 JavaScript를 이용한 클라이언트 측 유효성 검사 방법 숙지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;30:1-33:0&quot;&gt;**DOM (Document Object Model)**
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;31:5-33:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;31:5-31:27&quot;&gt;HTML 문서 구조를 트리 형태로 표현&lt;/li&gt;
&lt;li data-sourcepos=&quot;32:5-33:0&quot;&gt;JavaScript를 이용한 동적 DOM 요소 접근 및 조작 능력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;34:1-34:25&quot; data-ke-size=&quot;size20&quot;&gt;  CSS: 주요 개념 및 스타일링&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;36:1-56:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;36:1-41:0&quot;&gt;&lt;b&gt;CSS 박스 모델&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;37:5-41:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;37:5-37:65&quot;&gt;구성 요소: 콘텐츠(content), 패딩(padding), 테두리(border), 마진(margin)&lt;/li&gt;
&lt;li data-sourcepos=&quot;38:5-38:34&quot;&gt;각 속성이 요소 크기와 간격에 미치는 영향 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;39:5-39:49&quot;&gt;box-sizing 속성 (특히 border-box) 이해 및 활용&lt;/li&gt;
&lt;li data-sourcepos=&quot;40:5-41:0&quot;&gt;면접관 Tip: 박스 모델의 각 속성 상호작용 방식과 레이아웃 제어 능력은 필수 평가 항목입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;42:1-45:0&quot;&gt;&lt;b&gt;CSS 선택자와 명시도&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;43:5-45:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;43:5-43:54&quot;&gt;다양한 선택자 유형 (클래스, ID, 태그, 속성, 가상 클래스, 가상 요소) 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;44:5-45:0&quot;&gt;스타일 충돌 시 적용 우선순위를 결정하는 &lt;b&gt;명시도(Specificity)&lt;/b&gt; 규칙 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;46:1-50:0&quot;&gt;**반응형 디자인 원칙과 기술 (미디어 쿼리)**
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;47:5-50:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;47:5-47:31&quot;&gt;다양한 화면 크기에 맞춰 레이아웃 조정 능력&lt;/li&gt;
&lt;li data-sourcepos=&quot;48:5-48:42&quot;&gt;**미디어 쿼리(@media)**를 사용한 조건부 스타일링 숙지&lt;/li&gt;
&lt;li data-sourcepos=&quot;49:5-50:0&quot;&gt;면접관 Tip: 다양한 기기 환경을 고려한 반응형 디자인 구현 능력은 필수입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;51:1-56:0&quot;&gt;&lt;b&gt;CSS 레이아웃 모델: Flexbox와 Grid&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;52:5-56:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;52:5-52:41&quot;&gt;&lt;b&gt;Flexbox&lt;/b&gt;: 1차원 레이아웃, 아이템 정렬에 유용&lt;/li&gt;
&lt;li data-sourcepos=&quot;53:5-53:44&quot;&gt;&lt;b&gt;Grid&lt;/b&gt;: 2차원 (행/열) 기반의 복잡한 레이아웃에 적합&lt;/li&gt;
&lt;li data-sourcepos=&quot;54:5-54:33&quot;&gt;각 모델의 주요 속성과 적절한 사용 사례 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;55:5-56:0&quot;&gt;면접관 Tip: 각 레이아웃 모델의 장단점을 비교하고 상황에 맞는 선택 기준을 설명할 수 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-sourcepos=&quot;57:1-57:66&quot; data-ke-size=&quot;size20&quot;&gt;JavaScript: 핵심 개념과 동작 원리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;59:1-84:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;59:1-67:0&quot;&gt;&lt;b&gt;ES6+ 주요 기능&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;60:5-67:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;60:5-60:36&quot;&gt;let, const: 블록 스코프 변수 선언&lt;/li&gt;
&lt;li data-sourcepos=&quot;61:5-61:32&quot;&gt;화살표 함수 (=&amp;gt;): 간결한 함수 구문&lt;/li&gt;
&lt;li data-sourcepos=&quot;62:5-62:40&quot;&gt;템플릿 리터럴 (``): 향상된 문자열 처리&lt;/li&gt;
&lt;li data-sourcepos=&quot;63:5-63:33&quot;&gt;구조 분해 할당: 배열/객체 데이터 추출 용이&lt;/li&gt;
&lt;li data-sourcepos=&quot;64:5-64:40&quot;&gt;스프레드/레스트 연산자 (...): 유연한 데이터 조작&lt;/li&gt;
&lt;li data-sourcepos=&quot;65:5-65:42&quot;&gt;모듈 (import/export): 체계적인 코드 구성&lt;/li&gt;
&lt;li data-sourcepos=&quot;66:5-67:0&quot;&gt;면접관 Tip: 현대 JavaScript 개발의 기본이므로 최신 기능에 대한 깊은 이해가 필요합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;68:1-72:0&quot;&gt;&lt;b&gt;핵심 개념: 클로저, 프로토타입, this 키워드&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;69:5-72:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;69:5-69:38&quot;&gt;스코프와 &lt;b&gt;클로저(Closure)&lt;/b&gt; 동작 방식 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;70:5-70:48&quot;&gt;&lt;b&gt;프로토타입(Prototype)&lt;/b&gt; 기반 상속 및 프로토타입 체인 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;71:5-72:0&quot;&gt;다양한 실행 컨텍스트에서 &lt;b&gt;this&lt;/b&gt; 키워드의 동작 방식 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;73:1-78:0&quot;&gt;&lt;b&gt;비동기 JavaScript: Promise와 Async/Await&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;74:5-78:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;74:5-74:111&quot;&gt;&lt;b&gt;Promise&lt;/b&gt;: 비동기 작업 처리 객체, 상태(pending, fulfilled, rejected)와 .then(), .catch(), .finally() 메서드 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;75:5-75:61&quot;&gt;&lt;b&gt;Async/Await&lt;/b&gt;: Promise 기반의 더 깔끔하고 동기적인 비동기 코드 작성 문법&lt;/li&gt;
&lt;li data-sourcepos=&quot;76:5-76:48&quot;&gt;비동기 처리 시 문제점 (콜백 지옥, 에러 처리 등) 및 해결 방안 숙지&lt;/li&gt;
&lt;li data-sourcepos=&quot;77:5-78:0&quot;&gt;면접관 Tip: Promise와 Async/Await의 동작 원리와 차이점, 에러 처리 방식을 명확히 이해하고 설명할 수 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;79:1-84:0&quot;&gt;&lt;b&gt;JavaScript 이벤트 루프: 동시성 모델 이해&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;80:5-84:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;80:5-80:41&quot;&gt;JavaScript의 단일 스레드 특성과 논블로킹 동작 원리&lt;/li&gt;
&lt;li data-sourcepos=&quot;81:5-81:96&quot;&gt;구성 요소: 콜 스택(Call Stack), 태스크 큐(Task Queue / Macrotask Queue), 마이크로태스크 큐(Microtask Queue)&lt;/li&gt;
&lt;li data-sourcepos=&quot;82:5-82:38&quot;&gt;작업 실행 순서 (마이크로태스크 &amp;gt; 매크로태스크) 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;83:5-84:0&quot;&gt;면접관 Tip: 이벤트 루프에 대한 깊은 이해는 성능 최적화와 비동기 문제 해결 능력의 척도가 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;87:1-87:30&quot; data-ke-size=&quot;size23&quot;&gt;⚛️ 주요 Frontend 프레임워크 심층 분석&lt;/h3&gt;
&lt;p data-sourcepos=&quot;89:1-89:74&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;React, Angular, Vue.js&lt;/b&gt;와 같은 주요 프레임워크 경험은 대부분의 Frontend 개발 직무에서 필수적입니다.&lt;/p&gt;
&lt;h4 data-sourcepos=&quot;91:1-91:10&quot; data-ke-size=&quot;size20&quot;&gt;React&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;93:1-99:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;93:1-93:47&quot;&gt;&lt;b&gt;컴포넌트 기반 아키텍처&lt;/b&gt;와 &lt;b&gt;가상 DOM(Virtual DOM)&lt;/b&gt; 개념&lt;/li&gt;
&lt;li data-sourcepos=&quot;94:1-94:13&quot;&gt;&lt;b&gt;JSX&lt;/b&gt; 문법&lt;/li&gt;
&lt;li data-sourcepos=&quot;95:1-97:56&quot;&gt;&lt;b&gt;React Hooks&lt;/b&gt; (핵심: useState, useEffect, useContext 등) 상태 관리 및 사이드 이펙트 처리
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;96:5-97:56&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;96:5-96:25&quot;&gt;다양한 내장 훅의 용도와 규칙 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;97:5-97:56&quot;&gt;면접관 Tip: Hooks는 함수형 컴포넌트의 표준이므로 숙련도를 중요하게 평가합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;98:1-99:0&quot;&gt;&lt;b&gt;React 생태계&lt;/b&gt;: 라우팅(&lt;b&gt;React Router&lt;/b&gt;), 상태 관리(&lt;b&gt;Redux, Zustand, React Query&lt;/b&gt;), 테스팅(&lt;b&gt;React Testing Library, Jest&lt;/b&gt;) 등 주요 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;100:1-100:12&quot; data-ke-size=&quot;size20&quot;&gt;Angular&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;102:1-107:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;102:1-102:28&quot;&gt;&lt;b&gt;모듈 기반 아키텍처 (NgModules)&lt;/b&gt;&lt;/li&gt;
&lt;li data-sourcepos=&quot;103:1-103:28&quot;&gt;핵심 요소: &lt;b&gt;컴포넌트, 템플릿, 서비스&lt;/b&gt;&lt;/li&gt;
&lt;li data-sourcepos=&quot;104:1-104:41&quot;&gt;**의존성 주입 (DI - Dependency Injection)**&lt;/li&gt;
&lt;li data-sourcepos=&quot;105:1-105:35&quot;&gt;&lt;b&gt;RxJS&lt;/b&gt;를 이용한 반응형 프로그래밍 및 비동기 처리&lt;/li&gt;
&lt;li data-sourcepos=&quot;106:1-107:0&quot;&gt;&lt;b&gt;Angular CLI&lt;/b&gt;: 프로젝트 생성 및 개발 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;108:1-108:11&quot; data-ke-size=&quot;size20&quot;&gt;Vue.js&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;110:1-115:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;110:1-110:29&quot;&gt;&lt;b&gt;점진적 프레임워크&lt;/b&gt; 접근 방식과 쉬운 통합&lt;/li&gt;
&lt;li data-sourcepos=&quot;111:1-111:42&quot;&gt;&lt;b&gt;컴포넌트 기반 아키텍처&lt;/b&gt;와 **단일 파일 컴포넌트 (SFCs)**&lt;/li&gt;
&lt;li data-sourcepos=&quot;112:1-112:52&quot;&gt;&lt;b&gt;Composition API&lt;/b&gt;: 컴포넌트 로직 구성 (React Hooks와 유사)&lt;/li&gt;
&lt;li data-sourcepos=&quot;113:1-113:22&quot;&gt;라우팅: &lt;b&gt;Vue Router&lt;/b&gt;&lt;/li&gt;
&lt;li data-sourcepos=&quot;114:1-115:0&quot;&gt;상태 관리: &lt;b&gt;Vuex&lt;/b&gt; (또는 Pinia와 같은 최신 대안)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;116:1-116:30&quot; data-ke-size=&quot;size20&quot;&gt;비교 분석: 어떤 프레임워크를 선택해야 할까?&lt;/h4&gt;
&lt;p data-sourcepos=&quot;118:1-118:97&quot; data-ke-size=&quot;size16&quot;&gt;각 프레임워크는 고유한 강점과 약점을 가집니다. 프로젝트 요구 사항, 팀의 기술 스택, 성능 목표 등을 고려하여 최적의 프레임워크를 선택하는 기준을 이해하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;120:1-120:26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;표 1: Frontend 프레임워크 비교&lt;/b&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-sourcepos=&quot;122:1-130:112&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-sourcepos=&quot;122:1-122:157&quot;&gt;
&lt;td&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;React&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Angular&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Vue.js&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;124:1-124:111&quot;&gt;
&lt;td data-sourcepos=&quot;124:1-124:10&quot;&gt;&lt;b&gt;아키텍처&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;124:12-124:44&quot;&gt;컴포넌트 기반, 라이브러리&lt;/td&gt;
&lt;td data-sourcepos=&quot;124:46-124:76&quot;&gt;컴포넌트 기반, 프레임워크&lt;/td&gt;
&lt;td data-sourcepos=&quot;124:78-124:109&quot;&gt;컴포넌트 기반, 점진적 프레임워크&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;125:1-125:140&quot;&gt;
&lt;td data-sourcepos=&quot;125:1-125:11&quot;&gt;&lt;b&gt;학습 곡선&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;125:13-125:54&quot;&gt;보통&lt;/td&gt;
&lt;td data-sourcepos=&quot;125:56-125:95&quot;&gt;높음&lt;/td&gt;
&lt;td data-sourcepos=&quot;125:97-125:138&quot;&gt;쉬움 ~ 보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;126:1-126:138&quot;&gt;
&lt;td data-sourcepos=&quot;126:1-126:11&quot;&gt;&lt;b&gt;상태 관리&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;126:13-126:52&quot;&gt;유연함 (Redux, Zustand, Context API 등)&lt;/td&gt;
&lt;td data-sourcepos=&quot;126:54-126:93&quot;&gt;내장 (Services, RxJS), NgRx&lt;/td&gt;
&lt;td data-sourcepos=&quot;126:95-126:136&quot;&gt;내장 (Composition API, Vuex/Pinia)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;127:1-127:144&quot;&gt;
&lt;td data-sourcepos=&quot;127:1-127:9&quot;&gt;&lt;b&gt;라우팅&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;127:11-127:54&quot;&gt;React Router&lt;/td&gt;
&lt;td data-sourcepos=&quot;127:56-127:95&quot;&gt;내장&lt;/td&gt;
&lt;td data-sourcepos=&quot;127:97-127:142&quot;&gt;Vue Router&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;128:1-128:138&quot;&gt;
&lt;td data-sourcepos=&quot;128:1-128:9&quot;&gt;&lt;b&gt;템플릿&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;128:11-128:54&quot;&gt;JSX&lt;/td&gt;
&lt;td data-sourcepos=&quot;128:56-128:93&quot;&gt;HTML + Angular 디렉티브&lt;/td&gt;
&lt;td data-sourcepos=&quot;128:95-128:136&quot;&gt;HTML + Vue 디렉티브&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;129:1-129:130&quot;&gt;
&lt;td data-sourcepos=&quot;129:1-129:14&quot;&gt;&lt;b&gt;커뮤니티/생태계&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;129:16-129:54&quot;&gt;크고 활발함&lt;/td&gt;
&lt;td data-sourcepos=&quot;129:56-129:89&quot;&gt;크고 엔터프라이즈 중심&lt;/td&gt;
&lt;td data-sourcepos=&quot;129:91-129:128&quot;&gt;성장 중이며 유연함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;130:1-130:112&quot;&gt;
&lt;td data-sourcepos=&quot;130:1-130:14&quot;&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;130:16-130:50&quot;&gt;SPA, UI 라이브러리, 모바일 앱(Native)&lt;/td&gt;
&lt;td data-sourcepos=&quot;130:52-130:77&quot;&gt;대규모 애플리케이션, 엔터프라이즈 앱&lt;/td&gt;
&lt;td data-sourcepos=&quot;130:79-130:110&quot;&gt;SPA, 인터랙티브 UI, 프로그레시브 앱&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;p data-sourcepos=&quot;132:1-132:90&quot; data-ke-size=&quot;size16&quot;&gt;이 표는 주요 프레임워크 간의 핵심 차이를 간결하게 보여주며, 면접 시 비교 질문에 답하고 Frontend 환경에 대한 폭넓은 이해를 보여주는 데 유용합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;136:1-136:17&quot; data-ke-size=&quot;size23&quot;&gt;  상태 관리의 중요성&lt;/h3&gt;
&lt;p data-sourcepos=&quot;138:1-138:157&quot; data-ke-size=&quot;size16&quot;&gt;Frontend 애플리케이션에서 &lt;b&gt;상태(State)&lt;/b&gt; 는 UI의 동작과 렌더링을 결정하는 데이터(사용자 입력, API 응답 등)를 의미합니다. 효과적인 상태 관리는 일관되고 예측 가능한 애플리케이션 동작을 보장하고, 유지보수성과 확장성을 향상시키는 데 필수적입니다.&lt;/p&gt;
&lt;h4 data-sourcepos=&quot;140:1-140:20&quot; data-ke-size=&quot;size20&quot;&gt;로컬 상태 vs. 전역 상태&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;142:1-144:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;142:1-142:67&quot;&gt;&lt;b&gt;로컬 상태&lt;/b&gt;: 특정 컴포넌트 내에서만 사용되는 상태 (예: React useState, Vue data)&lt;/li&gt;
&lt;li data-sourcepos=&quot;143:1-144:0&quot;&gt;&lt;b&gt;전역 상태&lt;/b&gt;: 여러 컴포넌트 간에 공유되어야 하는 상태 (예: 사용자 인증 정보, 테마 설정)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;145:1-145:19&quot; data-ke-size=&quot;size20&quot;&gt;주요 상태 관리 라이브러리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;147:1-160:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;147:1-150:34&quot;&gt;&lt;b&gt;Redux&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;148:5-150:34&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;148:5-148:46&quot;&gt;핵심: Store, Actions, Reducers, Dispatch&lt;/li&gt;
&lt;li data-sourcepos=&quot;149:5-149:26&quot;&gt;단방향 데이터 흐름, 불변성 원칙&lt;/li&gt;
&lt;li data-sourcepos=&quot;150:5-150:34&quot;&gt;Redux Toolkit으로 간소화된 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;151:1-153:20&quot;&gt;&lt;b&gt;Zustand&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;152:5-153:20&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;152:5-152:41&quot;&gt;Hooks 기반의 단순하고 직관적인 Store 생성 및 사용&lt;/li&gt;
&lt;li data-sourcepos=&quot;153:5-153:20&quot;&gt;최소한의 보일러플레이트&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;154:1-156:63&quot;&gt;&lt;b&gt;Context API (React)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;155:5-156:63&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;155:5-155:47&quot;&gt;React 내장 기능, Prop Drilling 문제 해결에 유용&lt;/li&gt;
&lt;li data-sourcepos=&quot;156:5-156:63&quot;&gt;createContext, Provider, Consumer/useContext 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;157:1-160:0&quot;&gt;&lt;b&gt;React Query (TanStack Query)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;158:5-160:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;158:5-158:49&quot;&gt;서버 상태 관리에 특화 (데이터 Fetching, Caching, 동기화)&lt;/li&gt;
&lt;li data-sourcepos=&quot;159:5-160:0&quot;&gt;Queries (데이터 조회), Mutations (데이터 변경), Cache 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;161:1-161:23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;표 2: 상태 관리 라이브러리 비교&lt;/b&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-sourcepos=&quot;163:1-170:136&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-sourcepos=&quot;163:1-163:164&quot;&gt;
&lt;td&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Redux&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Zustand&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Context API&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;React Query (TanStack Query)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;165:1-165:149&quot;&gt;
&lt;td data-sourcepos=&quot;165:1-165:9&quot;&gt;&lt;b&gt;복잡성&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;165:11-165:45&quot;&gt;높음&lt;/td&gt;
&lt;td data-sourcepos=&quot;165:47-165:73&quot;&gt;낮음&lt;/td&gt;
&lt;td data-sourcepos=&quot;165:75-165:111&quot;&gt;보통&lt;/td&gt;
&lt;td data-sourcepos=&quot;165:113-165:147&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;166:1-166:151&quot;&gt;
&lt;td data-sourcepos=&quot;166:1-166:13&quot;&gt;&lt;b&gt;보일러플레이트&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;166:15-166:48&quot;&gt;상당함&lt;/td&gt;
&lt;td data-sourcepos=&quot;166:50-166:75&quot;&gt;최소화&lt;/td&gt;
&lt;td data-sourcepos=&quot;166:77-166:113&quot;&gt;보통&lt;/td&gt;
&lt;td data-sourcepos=&quot;166:115-166:149&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;167:1-167:151&quot;&gt;
&lt;td data-sourcepos=&quot;167:1-167:11&quot;&gt;&lt;b&gt;학습 곡선&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;167:13-167:47&quot;&gt;높음&lt;/td&gt;
&lt;td data-sourcepos=&quot;167:49-167:75&quot;&gt;쉬움&lt;/td&gt;
&lt;td data-sourcepos=&quot;167:77-167:113&quot;&gt;보통&lt;/td&gt;
&lt;td data-sourcepos=&quot;167:115-167:149&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;168:1-168:133&quot;&gt;
&lt;td data-sourcepos=&quot;168:1-168:11&quot;&gt;&lt;b&gt;전역 상태&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;168:13-168:46&quot;&gt;탁월함&lt;/td&gt;
&lt;td data-sourcepos=&quot;168:48-168:73&quot;&gt;탁월함&lt;/td&gt;
&lt;td data-sourcepos=&quot;168:75-168:102&quot;&gt;작은 규모 전역 상태에 적합&lt;/td&gt;
&lt;td data-sourcepos=&quot;168:104-168:131&quot;&gt;탁월함 (특히 서버 상태)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;169:1-169:154&quot;&gt;
&lt;td data-sourcepos=&quot;169:1-169:14&quot;&gt;&lt;b&gt;React 통합&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;169:16-169:50&quot;&gt;react-redux 필요&lt;/td&gt;
&lt;td data-sourcepos=&quot;169:52-169:78&quot;&gt;내장 (Hooks)&lt;/td&gt;
&lt;td data-sourcepos=&quot;169:80-169:116&quot;&gt;내장&lt;/td&gt;
&lt;td data-sourcepos=&quot;169:118-169:152&quot;&gt;내장 (Hooks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;170:1-170:136&quot;&gt;
&lt;td data-sourcepos=&quot;170:1-170:9&quot;&gt;&lt;b&gt;생태계&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;170:11-170:39&quot;&gt;성숙하고 광범위함&lt;/td&gt;
&lt;td data-sourcepos=&quot;170:41-170:66&quot;&gt;성장 중&lt;/td&gt;
&lt;td data-sourcepos=&quot;170:68-170:101&quot;&gt;React 코어 일부&lt;/td&gt;
&lt;td data-sourcepos=&quot;170:103-170:134&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;p data-sourcepos=&quot;172:1-172:69&quot; data-ke-size=&quot;size16&quot;&gt;이 표는 주요 상태 관리 옵션을 비교하여, 프로젝트 규모와 요구사항에 맞는 기술 선택 및 면접 시 논의에 도움을 줍니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;174:1-174:104&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  대규모 애플리케이션을 위한 상태 관리 모범 사례:&lt;/b&gt; 상태 구조화, 셀렉터 사용, 불필요한 리렌더링 방지 등 성능 최적화 전략을 이해하는 것이 중요합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;178:1-178:15&quot; data-ke-size=&quot;size23&quot;&gt;⏳ 비동기 작업 탐색&lt;/h3&gt;
&lt;h4 data-sourcepos=&quot;180:1-180:19&quot; data-ke-size=&quot;size20&quot;&gt;Promise와 생명 주기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;182:1-186:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;182:1-182:32&quot;&gt;비동기 작업의 최종 완료 또는 실패를 나타내는 객체&lt;/li&gt;
&lt;li data-sourcepos=&quot;183:1-183:48&quot;&gt;상태: 대기(Pending), 이행(Fulfilled), 거부(Rejected)&lt;/li&gt;
&lt;li data-sourcepos=&quot;184:1-184:46&quot;&gt;결과 처리: .then(), .catch(), .finally()&lt;/li&gt;
&lt;li data-sourcepos=&quot;185:1-186:0&quot;&gt;정적 메서드: Promise.all(), Promise.race() 등&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;187:1-187:30&quot; data-ke-size=&quot;size20&quot;&gt;Async/Await: 더 깔끔한 비동기 코드&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;189:1-192:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;189:1-189:60&quot;&gt;async 함수와 await 키워드를 사용하여 Promise 기반 코드를 동기식 코드처럼 작성&lt;/li&gt;
&lt;li data-sourcepos=&quot;190:1-190:37&quot;&gt;try...catch 블록을 이용한 자연스러운 오류 처리&lt;/li&gt;
&lt;li data-sourcepos=&quot;191:1-192:0&quot;&gt;*이해: Async/Await는 Promise 위에 구축된 문법 설탕(Syntactic Sugar)입니다. 각 방식의 장단점과 사용 시점을 이해해야 합니다.*&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-sourcepos=&quot;193:1-193:30&quot; data-ke-size=&quot;size20&quot;&gt;JavaScript 이벤트 루프: 동시성 이해&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;195:1-199:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;195:1-195:36&quot;&gt;JavaScript 엔진이 비동기 작업을 처리하는 메커니즘&lt;/li&gt;
&lt;li data-sourcepos=&quot;196:1-196:41&quot;&gt;구성 요소: 콜 스택, 태스크 큐(매크로태스크), 마이크로태스크 큐&lt;/li&gt;
&lt;li data-sourcepos=&quot;197:1-197:67&quot;&gt;작업 실행 순서: 동기 코드 실행 &amp;rarr; 모든 마이크로태스크 실행 &amp;rarr; 태스크 큐에서 하나의 매크로태스크 실행 &amp;rarr; 반복&lt;/li&gt;
&lt;li data-sourcepos=&quot;198:1-199:0&quot;&gt;이해: 이벤트 루프는 JavaScript의 논블로킹 특성을 가능하게 하는 핵심 개념입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;202:1-202:31&quot; data-ke-size=&quot;size23&quot;&gt;✅ Frontend 테스팅을 통한 코드 품질 보장&lt;/h3&gt;
&lt;p data-sourcepos=&quot;204:1-204:36&quot; data-ke-size=&quot;size16&quot;&gt;테스팅은 안정적이고 예측 가능한 애플리케이션 구축에 필수적입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;206:1-222:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;206:1-211:0&quot;&gt;&lt;b&gt;Frontend 테스트 유형&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;207:5-211:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;207:5-207:35&quot;&gt;&lt;b&gt;단위 테스트&lt;/b&gt;: 개별 함수 또는 컴포넌트 테스트&lt;/li&gt;
&lt;li data-sourcepos=&quot;208:5-208:43&quot;&gt;&lt;b&gt;통합 테스트&lt;/b&gt;: 여러 컴포넌트 또는 모듈 간의 상호작용 테스트&lt;/li&gt;
&lt;li data-sourcepos=&quot;209:5-209:63&quot;&gt;&lt;b&gt;E2E (End-to-End) 테스트&lt;/b&gt;: 실제 사용자 시나리오 기반 전체 애플리케이션 흐름 테스트&lt;/li&gt;
&lt;li data-sourcepos=&quot;210:5-211:0&quot;&gt;&lt;b&gt;테스팅 피라미드&lt;/b&gt;: 각 테스트 유형의 비율과 중요성 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;212:1-216:0&quot;&gt;&lt;b&gt;주요 테스팅 도구 및 프레임워크&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;213:5-216:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;213:5-213:47&quot;&gt;&lt;b&gt;Jest&lt;/b&gt;: JavaScript 및 React 단위 테스트 프레임워크&lt;/li&gt;
&lt;li data-sourcepos=&quot;214:5-214:52&quot;&gt;&lt;b&gt;React Testing Library&lt;/b&gt;: 사용자 관점의 컴포넌트 테스트 강조&lt;/li&gt;
&lt;li data-sourcepos=&quot;215:5-216:0&quot;&gt;&lt;b&gt;Cypress&lt;/b&gt;: 강력한 E2E 테스팅 도구&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;217:1-220:0&quot;&gt;&lt;b&gt;효과적인 테스트 케이스 작성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;218:5-220:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;218:5-218:40&quot;&gt;명확하고 유지보수 가능하며 충분한 커버리지를 갖춘 테스트 작성&lt;/li&gt;
&lt;li data-sourcepos=&quot;219:5-220:0&quot;&gt;엣지 케이스 및 오류 상황 테스트 중요성 인지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;221:1-222:0&quot;&gt;이해: 다양한 테스트 전략과 도구 사용 경험을 구체적으로 설명할 수 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;225:1-225:21&quot; data-ke-size=&quot;size23&quot;&gt;⚡ 성능 및 사용자 경험 최적화&lt;/h3&gt;
&lt;p data-sourcepos=&quot;227:1-227:22&quot; data-ke-size=&quot;size16&quot;&gt;빠르고 쾌적한 사용자 경험은 필수입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;229:1-243:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;229:1-235:0&quot;&gt;**주요 웹 성능 지표 (Core Web Vitals 등)**
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;230:5-235:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;230:5-230:56&quot;&gt;&lt;b&gt;LCP (Largest Contentful Paint)&lt;/b&gt;: 가장 큰 콘텐츠 로딩 시간&lt;/li&gt;
&lt;li data-sourcepos=&quot;231:5-231:88&quot;&gt;&lt;b&gt;FID (First Input Delay) / INP (Interaction to Next Paint)&lt;/b&gt;: 최초 입력 지연 / 상호작용 응답성&lt;/li&gt;
&lt;li data-sourcepos=&quot;232:5-232:61&quot;&gt;&lt;b&gt;CLS (Cumulative Layout Shift)&lt;/b&gt;: 누적 레이아웃 이동 (시각적 안정성)&lt;/li&gt;
&lt;li data-sourcepos=&quot;233:5-233:52&quot;&gt;&lt;b&gt;FCP (First Contentful Paint)&lt;/b&gt;: 첫 콘텐츠 렌더링 시간&lt;/li&gt;
&lt;li data-sourcepos=&quot;234:5-235:0&quot;&gt;&lt;b&gt;TTI (Time to Interactive)&lt;/b&gt;: 상호작용 가능 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;236:1-241:0&quot;&gt;&lt;b&gt;최적화 기법&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;237:5-241:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;237:5-237:48&quot;&gt;&lt;b&gt;코드 분할(Code Splitting)&lt;/b&gt;: 초기 로딩 번들 크기 축소&lt;/li&gt;
&lt;li data-sourcepos=&quot;238:5-238:54&quot;&gt;&lt;b&gt;지연 로딩(Lazy Loading)&lt;/b&gt;: 이미지 등 비필수 리소스 로딩 시점 지연&lt;/li&gt;
&lt;li data-sourcepos=&quot;239:5-239:61&quot;&gt;&lt;b&gt;자산 최적화&lt;/b&gt;: 이미지 압축 및 반응형 이미지 사용, CSS/JS 파일 최소화 및 압축&lt;/li&gt;
&lt;li data-sourcepos=&quot;240:5-241:0&quot;&gt;&lt;b&gt;브라우저 캐싱 전략&lt;/b&gt; 활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;242:1-243:0&quot;&gt;이해: 웹사이트 로딩 속도 개선 및 사용자 경험 향상 방법을 이해하고 적용할 수 있음을 보여줘야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;246:1-246:24&quot; data-ke-size=&quot;size23&quot;&gt;♿ 접근 가능한 웹 애플리케이션 구축&lt;/h3&gt;
&lt;p data-sourcepos=&quot;248:1-248:44&quot; data-ke-size=&quot;size16&quot;&gt;모든 사용자가 웹 콘텐츠에 동등하게 접근할 수 있도록 보장하는 것은 중요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;250:1-263:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;250:1-250:45&quot;&gt;&lt;b&gt;웹 접근성의 중요성&lt;/b&gt;: 포용성 증대, 사용자층 확대, 법적/윤리적 책임&lt;/li&gt;
&lt;li data-sourcepos=&quot;251:1-253:25&quot;&gt;&lt;b&gt;WCAG (Web Content Accessibility Guidelines) 이해&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;252:5-253:25&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;252:5-252:99&quot;&gt;4대 원칙: 인지 가능성(Perceivable), 운용 가능성(Operable), 이해 가능성(Understandable), 견고성(Robust) - &lt;b&gt;POUR&lt;/b&gt;&lt;/li&gt;
&lt;li data-sourcepos=&quot;253:5-253:25&quot;&gt;준수 수준: A, AA, AAA&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;254:1-261:0&quot;&gt;&lt;b&gt;접근성 향상을 위한 실용적인 팁&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;255:5-261:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;255:5-255:27&quot;&gt;&lt;b&gt;시맨틱 HTML&lt;/b&gt;의 올바른 사용&lt;/li&gt;
&lt;li data-sourcepos=&quot;256:5-256:39&quot;&gt;이미지에 의미 있는 &lt;b&gt;대체 텍스트(alt 속성)&lt;/b&gt; 제공&lt;/li&gt;
&lt;li data-sourcepos=&quot;257:5-257:33&quot;&gt;&lt;b&gt;키보드만으로&lt;/b&gt; 모든 기능 사용 가능 보장&lt;/li&gt;
&lt;li data-sourcepos=&quot;258:5-258:24&quot;&gt;충분한 &lt;b&gt;색상 대비&lt;/b&gt; 유지&lt;/li&gt;
&lt;li data-sourcepos=&quot;259:5-259:69&quot;&gt;복잡한 UI에 &lt;b&gt;ARIA(Accessible Rich Internet Applications) 속성&lt;/b&gt; 사용&lt;/li&gt;
&lt;li data-sourcepos=&quot;260:5-261:0&quot;&gt;명확한 &lt;b&gt;레이블&lt;/b&gt;을 통한 폼 접근성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;262:1-263:0&quot;&gt;이해: 구체적인 WCAG 지침과 이를 코드 레벨에서 구현하는 방법을 설명할 준비가 되어 있어야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;266:1-266:15&quot; data-ke-size=&quot;size23&quot;&gt;⚙️ 개발 환경 구축&lt;/h3&gt;
&lt;p data-sourcepos=&quot;268:1-268:28&quot; data-ke-size=&quot;size16&quot;&gt;효율적인 개발을 위한 환경 설정 능력이 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;270:1-278:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;270:1-273:29&quot;&gt;&lt;b&gt;필수 도구 및 구성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;271:5-273:29&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;271:5-271:49&quot;&gt;&lt;b&gt;Node.js&lt;/b&gt; 및 패키지 매니저 (&lt;b&gt;npm/yarn/pnpm&lt;/b&gt;)&lt;/li&gt;
&lt;li data-sourcepos=&quot;272:5-272:31&quot;&gt;코드 에디터 (예: &lt;b&gt;VS Code&lt;/b&gt;)&lt;/li&gt;
&lt;li data-sourcepos=&quot;273:5-273:29&quot;&gt;&lt;b&gt;브라우저 개발자 도구&lt;/b&gt; 활용 능력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;274:1-278:0&quot;&gt;&lt;b&gt;빌드 도구 소개&lt;/b&gt;: Webpack, Parcel, Vite
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;275:5-278:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;275:5-275:36&quot;&gt;&lt;b&gt;Webpack&lt;/b&gt;: 강력한 설정 기반 모듈 번들러&lt;/li&gt;
&lt;li data-sourcepos=&quot;276:5-276:45&quot;&gt;&lt;b&gt;Parcel&lt;/b&gt;: 설정 없는(Zero-config) 간편한 번들러&lt;/li&gt;
&lt;li data-sourcepos=&quot;277:5-278:0&quot;&gt;&lt;b&gt;Vite&lt;/b&gt;: 빠르고 현대적인 빌드 도구 (네이티브 ES 모듈 기반)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-sourcepos=&quot;279:1-279:26&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;표 3: Frontend 빌드 도구 비교&lt;/b&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-sourcepos=&quot;281:1-289:86&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-sourcepos=&quot;281:1-281:130&quot;&gt;
&lt;td&gt;&lt;b&gt;기능&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Webpack&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Parcel&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Vite&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;283:1-283:97&quot;&gt;
&lt;td data-sourcepos=&quot;283:1-283:8&quot;&gt;&lt;b&gt;구성&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;283:10-283:39&quot;&gt;고도로 구성 가능&lt;/td&gt;
&lt;td data-sourcepos=&quot;283:41-283:63&quot;&gt;기본적으로 제로 구성&lt;/td&gt;
&lt;td data-sourcepos=&quot;283:65-283:95&quot;&gt;vite.config.js 통한 구성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;284:1-284:116&quot;&gt;
&lt;td data-sourcepos=&quot;284:1-284:11&quot;&gt;&lt;b&gt;학습 곡선&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;284:13-284:47&quot;&gt;높음&lt;/td&gt;
&lt;td data-sourcepos=&quot;284:49-284:78&quot;&gt;쉬움&lt;/td&gt;
&lt;td data-sourcepos=&quot;284:80-284:114&quot;&gt;보통&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;285:1-285:99&quot;&gt;
&lt;td data-sourcepos=&quot;285:1-285:11&quot;&gt;&lt;b&gt;빌드 속도&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;285:13-285:35&quot;&gt;대규모 프로젝트에서 느릴 수 있음&lt;/td&gt;
&lt;td data-sourcepos=&quot;285:37-285:66&quot;&gt;빠름&lt;/td&gt;
&lt;td data-sourcepos=&quot;285:68-285:97&quot;&gt;매우 빠름 (개발 시)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;286:1-286:110&quot;&gt;
&lt;td data-sourcepos=&quot;286:1-286:9&quot;&gt;&lt;b&gt;HMR&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;286:11-286:45&quot;&gt;지원&lt;/td&gt;
&lt;td data-sourcepos=&quot;286:47-286:74&quot;&gt;기본 지원&lt;/td&gt;
&lt;td data-sourcepos=&quot;286:76-286:108&quot;&gt;매우 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;287:1-287:108&quot;&gt;
&lt;td data-sourcepos=&quot;287:1-287:11&quot;&gt;&lt;b&gt;코드 분할&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;287:13-287:47&quot;&gt;지원&lt;/td&gt;
&lt;td data-sourcepos=&quot;287:49-287:74&quot;&gt;기본 지원 (자동)&lt;/td&gt;
&lt;td data-sourcepos=&quot;287:76-287:106&quot;&gt;기본 지원 (자동)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;288:1-288:111&quot;&gt;
&lt;td data-sourcepos=&quot;288:1-288:14&quot;&gt;&lt;b&gt;플러그인 생태계&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;288:16-288:44&quot;&gt;성숙하고 광범위함&lt;/td&gt;
&lt;td data-sourcepos=&quot;288:46-288:74&quot;&gt;성장 중&lt;/td&gt;
&lt;td data-sourcepos=&quot;288:76-288:109&quot;&gt;성장 중&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-sourcepos=&quot;289:1-289:86&quot;&gt;
&lt;td data-sourcepos=&quot;289:1-289:14&quot;&gt;&lt;b&gt;주요 사용 사례&lt;/b&gt;&lt;/td&gt;
&lt;td data-sourcepos=&quot;289:16-289:38&quot;&gt;복잡한 애플리케이션, 사용자 정의 빌드&lt;/td&gt;
&lt;td data-sourcepos=&quot;289:40-289:58&quot;&gt;간단한 ~ 중간 규모 프로젝트&lt;/td&gt;
&lt;td data-sourcepos=&quot;289:60-289:84&quot;&gt;최신 프레임워크 (React, Vue 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;Sheets로 내보내기&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-sourcepos=&quot;291:1-291:61&quot; data-ke-size=&quot;size16&quot;&gt;이 표는 주요 빌드 도구의 특징을 비교하여 면접 시 빌드 프로세스에 대한 이해도를 보여주는 데 유용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;293:1-294:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;293:1-294:0&quot;&gt;&lt;b&gt;빌드 프로세스 이해&lt;/b&gt;: 개발된 코드를 프로덕션 환경에 배포하기 위한 번들링, 최적화, 트랜스파일링 등의 과정을 이해해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;297:1-297:21&quot; data-ke-size=&quot;size23&quot;&gt;  Git을 활용한 버전 관리&lt;/h3&gt;
&lt;p data-sourcepos=&quot;299:1-299:35&quot; data-ke-size=&quot;size16&quot;&gt;팀 협업과 코드 관리에 필수적인 Git 활용 능력이 요구됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;301:1-306:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;301:1-301:100&quot;&gt;&lt;b&gt;기본 Git 명령어&lt;/b&gt;: init, clone, add, commit, push, pull, branch, checkout, merge 등&lt;/li&gt;
&lt;li data-sourcepos=&quot;302:1-302:73&quot;&gt;&lt;b&gt;협업을 위한 브랜칭 전략&lt;/b&gt;: Git Flow, GitHub Flow, GitLab Flow 등 일반적인 워크플로우 이해&lt;/li&gt;
&lt;li data-sourcepos=&quot;303:1-304:0&quot;&gt;&lt;b&gt;효과적인 병합 충돌(Merge Conflict) 처리&lt;/b&gt;: 원인 파악 및 해결 전략 숙지, 명확한 커밋 메시지의 중요성 인지&lt;/li&gt;
&lt;li data-sourcepos=&quot;305:1-306:0&quot;&gt;이해: Git을 이용한 코드 변경 이력 관리, 협업 방식, 충돌 해결 능력에 대한 질문이 나올 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;309:1-309:32&quot; data-ke-size=&quot;size23&quot;&gt;  일반적인 Frontend 코딩 면접 문제 해결&lt;/h3&gt;
&lt;p data-sourcepos=&quot;311:1-311:31&quot; data-ke-size=&quot;size16&quot;&gt;실제 코딩 능력을 평가하는 문제 해결 능력이 중요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;313:1-326:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;313:1-315:41&quot;&gt;&lt;b&gt;문제 유형 및 패턴 이해&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;314:5-315:41&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;314:5-314:49&quot;&gt;Frontend 관련 자료구조 및 알고리즘 (배열, 객체, 문자열 조작 등)&lt;/li&gt;
&lt;li data-sourcepos=&quot;315:5-315:41&quot;&gt;흔한 패턴: 이벤트 위임, 메모이제이션, 디바운싱/쓰로틀링 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;316:1-318:28&quot;&gt;&lt;b&gt;코딩 챌린지 접근 전략&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;317:5-318:28&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;317:5-317:36&quot;&gt;문제 정확히 이해하기, 질문하기, 사고 과정 설명하기&lt;/li&gt;
&lt;li data-sourcepos=&quot;318:5-318:28&quot;&gt;문제를 작은 단위로 나누어 접근하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;319:1-324:0&quot;&gt;&lt;b&gt;자주 묻는 코딩 문제 예시&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;320:5-324:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;320:5-320:36&quot;&gt;UI 컴포넌트 구현 (캐러셀, 드롭다운, 모달 등)&lt;/li&gt;
&lt;li data-sourcepos=&quot;321:5-321:22&quot;&gt;DOM 조작 및 이벤트 처리&lt;/li&gt;
&lt;li data-sourcepos=&quot;322:5-322:39&quot;&gt;JavaScript 알고리즘 문제 (문자열/배열 처리 등)&lt;/li&gt;
&lt;li data-sourcepos=&quot;323:5-324:0&quot;&gt;Promise, Async/Await 기반 비동기 로직 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;325:1-326:0&quot;&gt;*이해: LeetCode, Programmers, Frontend Mentor 등 플랫폼을 통한 꾸준한 연습이 필요합니다.*&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;329:1-329:19&quot; data-ke-size=&quot;size23&quot;&gt; ️ 행동 면접 질문 대비&lt;/h3&gt;
&lt;p data-sourcepos=&quot;331:1-331:31&quot; data-ke-size=&quot;size16&quot;&gt;기술 역량 외에 소프트 스킬과 문화 적합성도 평가됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;333:1-346:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;333:1-333:70&quot;&gt;&lt;b&gt;면접관의 의도 이해&lt;/b&gt;: 과거 경험을 통해 문제 해결 능력, 팀워크, 학습 태도, 의사소통 방식 등을 파악하려는 목적&lt;/li&gt;
&lt;li data-sourcepos=&quot;334:1-338:16&quot;&gt;&lt;b&gt;일반적인 행동 질문 카테고리&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;335:5-338:16&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;335:5-335:27&quot;&gt;과거 경험 (도전, 성공, 실패 사례)&lt;/li&gt;
&lt;li data-sourcepos=&quot;336:5-336:17&quot;&gt;팀워크 및 협업 능력&lt;/li&gt;
&lt;li data-sourcepos=&quot;337:5-337:22&quot;&gt;문제 해결 및 의사 결정 과정&lt;/li&gt;
&lt;li data-sourcepos=&quot;338:5-338:16&quot;&gt;학습 및 성장 경험&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;339:1-344:0&quot;&gt;&lt;b&gt;STAR 기법을 이용한 효과적인 답변 구성&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-sourcepos=&quot;340:5-344:0&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-sourcepos=&quot;340:5-340:36&quot;&gt;&lt;b&gt;Situation (상황)&lt;/b&gt;: 어떤 상황이었는가?&lt;/li&gt;
&lt;li data-sourcepos=&quot;341:5-341:41&quot;&gt;&lt;b&gt;Task (과제)&lt;/b&gt;: 당신의 역할이나 목표는 무엇이었는가?&lt;/li&gt;
&lt;li data-sourcepos=&quot;342:5-342:35&quot;&gt;&lt;b&gt;Action (행동)&lt;/b&gt;: 어떤 행동을 취했는가?&lt;/li&gt;
&lt;li data-sourcepos=&quot;343:5-344:0&quot;&gt;&lt;b&gt;Result (결과)&lt;/b&gt;: 그 결과는 어떠했는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-sourcepos=&quot;345:1-346:0&quot;&gt;이해: 자신의 경험을 STAR 기법에 맞춰 구체적인 사례로 준비하고, 핵심 역량을 잘 드러낼 수 있도록 연습해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;349:1-349:35&quot; data-ke-size=&quot;size23&quot;&gt;  꾸준한 학습: Frontend 생태계에서 앞서나가기&lt;/h3&gt;
&lt;p data-sourcepos=&quot;351:1-351:131&quot; data-ke-size=&quot;size16&quot;&gt;Frontend 분야는 빠르게 변화하므로, 새로운 기술, 트렌드, 모범 사례를 &lt;b&gt;지속적으로 학습&lt;/b&gt;하는 것이 매우 중요합니다. 기술 블로그, 컨퍼런스, 온라인 강의, 오픈 소스 참여 등을 통해 최신 정보를 습득하고 성장해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-sourcepos=&quot;355:1-355:37&quot; data-ke-size=&quot;size23&quot;&gt;  결론: 다음 Frontend 개발자 면접에서 성공하기!&lt;/h3&gt;
&lt;p data-sourcepos=&quot;357:1-357:130&quot; data-ke-size=&quot;size16&quot;&gt;이 가이드에서 다룬 핵심 기술, 프레임워크, 상태 관리, 비동기 처리, 테스팅, 최적화, 접근성, 개발 환경, 버전 관리, 코딩 문제 해결 및 행동 질문 대비는 성공적인 Frontend 개발자 면접을 위한 탄탄한 기초가 될 것입니다.&lt;/p&gt;
&lt;p data-sourcepos=&quot;359:1-359:78&quot; data-ke-size=&quot;size16&quot;&gt;무엇보다 중요한 것은 &lt;b&gt;꾸준한 연습&lt;/b&gt;과 &lt;b&gt;철저한 준비&lt;/b&gt;입니다. 자신감을 가지고 면접에 임하여 원하는 결과를 얻으시기를 바랍니다!  &lt;/p&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;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;b&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Frontend 면접 대비 시리즈] 익숙함에 속지말자 try...catch 함정!&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743674196761&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;[Frontend 면접 대비 시리즈] 익숙함에 속지말자 try...catch 함정!&quot; data-og-description=&quot;문제 상황: 단순해 보이는 질문에 함정이 숨어있다자바스크립트의 try...catch는 일반적으로 코드 블록 내의 오류를 안전하게 잡아내는 구조로 많이 사용됩니다.저 역시 동기적인(synchronous) 코드에&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dIm2EM/hyYyNnM6IZ/4Apa6jb3hqsTOLQKAVfqH0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/d4w5xO/hyYyLKh1A8/aTe8DK0eJ00FgFSpCnSIuk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dIm2EM/hyYyNnM6IZ/4Apa6jb3hqsTOLQKAVfqH0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/d4w5xO/hyYyLKh1A8/aTe8DK0eJ00FgFSpCnSIuk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Frontend 면접 대비 시리즈] 익숙함에 속지말자 try...catch 함정!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제 상황: 단순해 보이는 질문에 함정이 숨어있다자바스크립트의 try...catch는 일반적으로 코드 블록 내의 오류를 안전하게 잡아내는 구조로 많이 사용됩니다.저 역시 동기적인(synchronous) 코드에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743674202789&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;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&quot; data-og-description=&quot;javascript 코딩 경험이 많다면 다 겪어봤을 개념들 입니다. 정확한 명칭은 생각이 안나도 개념과 흐름은 어느정도 파악하고 있는분들께는 한번더 전체적인 개념 정립에 도움이 될것입니다.&amp;nbsp;면접&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eQKmm/hyYCcGdY7e/gt292Nssy306HM9kRhpjRk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/9PdDo/hyYxJsB0v1/7Ol9oJDvnyQ4jE6gzOV921/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eQKmm/hyYCcGdY7e/gt292Nssy306HM9kRhpjRk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/9PdDo/hyYxJsB0v1/7Ol9oJDvnyQ4jE6gzOV921/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;javascript 코딩 경험이 많다면 다 겪어봤을 개념들 입니다. 정확한 명칭은 생각이 안나도 개념과 흐름은 어느정도 파악하고 있는분들께는 한번더 전체적인 개념 정립에 도움이 될것입니다.&amp;nbsp;면접&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/code-smell&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743674235016&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;[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜&quot; data-og-description=&quot;소프트웨어 개발에서 깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 견고하고 확장 가능한 애플리케이션을 만드는 데 필수적입니다.&amp;nbsp;하지만 경험이 많은 개발자조차도 무심코 &amp;quot;코드 스멜(&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/code-smell&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/code-smell&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UP1v8/hyYB7x84Ga/XJYbebaiOF31t3J7hoy95k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cwBIz4/hyYCgV99EO/vYDUDSQcXjcPy84RKiL7yk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/code-smell&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/code-smell&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UP1v8/hyYB7x84Ga/XJYbebaiOF31t3J7hoy95k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cwBIz4/hyYCgV99EO/vYDUDSQcXjcPy84RKiL7yk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발에서 깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 견고하고 확장 가능한 애플리케이션을 만드는 데 필수적입니다.&amp;nbsp;하지만 경험이 많은 개발자조차도 무심코 &quot;코드 스멜(&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>FRONTEND/기술 면접 시리즈</category>
      <category>2025 frontend 면접 대비</category>
      <category>2025 프론트엔드 개발자 면접 대비</category>
      <category>최신 frontend 개발자 면접 완벽 대비 가이드</category>
      <category>최신 프론트 엔드 면접 질문</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/233</guid>
      <comments>https://intelloper.tistory.com/entry/2025-frontend-interview-guide#entry233comment</comments>
      <pubDate>Thu, 3 Apr 2025 18:00:57 +0900</pubDate>
    </item>
    <item>
      <title>[Frontend 면접 대비 시리즈] 익숙함에 속지말자 try...catch 함정!</title>
      <link>https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y5L9N/btsM2oNSWXZ/AU8cQXfxtYCEB8p9XBeB0k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y5L9N/btsM2oNSWXZ/AU8cQXfxtYCEB8p9XBeB0k/img.webp&quot; data-alt=&quot;[Frontend 면접 대비 시리즈] 익숙함에 속지말자 try...catch 함정!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y5L9N/btsM2oNSWXZ/AU8cQXfxtYCEB8p9XBeB0k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY5L9N%2FbtsM2oNSWXZ%2FAU8cQXfxtYCEB8p9XBeB0k%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Frontend 면접 대비 시리즈] 익숙함에 속지말자 try...catch 함정!&lt;/figcaption&gt;
&lt;/figure&gt;
&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;b&gt;try...catch&lt;/b&gt;는 일반적으로 코드 블록 내의 오류를 안전하게 잡아내는 구조로 많이 사용됩니다.&lt;br /&gt;저 역시 동기적인(synchronous) 코드에서는 자신 있게 사용해왔습니다. 그런데 아래 두 가지 코드가 제시되었을 때, 예상치 못한 문제가 발생했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 1: setTimeout과 try...catch&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;try {
  setTimeout(() =&amp;gt; {
    throw new Error('err');
  }, 200);
} catch (err) {
  console.log(err);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;코드 2: Promise와 try...catch&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;try {
  Promise.resolve().then(() =&amp;gt; {
    throw new Error('err');
  });
} catch (err) {
  console.log(err);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 &quot;try...catch면 오류를 잡아낼 텐데?&quot;라는 생각에 당황했지만, 실제로는 예상과 달리 오류가 잡히지 않았습니다.&lt;br /&gt;이때 저는 &lt;b&gt;익숙함이 오히려 안일함을 낳는다&lt;/b&gt;는 교훈을 뼈저리게 느꼈습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;핵심 깨달음: 비동기와 동기 오류 처리의 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 try...catch의 동작 원리를 다시 분석해보았습니다. 그 결과 중요한 사실을 깨달았습니다.&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;br /&gt;try...catch는 &lt;b&gt;동기적 코드 블록&lt;/b&gt;에서 발생한 오류를 처리할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비동기 처리의 한계:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;setTimeout&lt;/b&gt;과 같이 비동기 함수는 콜백이 이벤트 큐에 예약되므로, try...catch 블록 실행 시점과 오류 발생 시점이 다릅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Promise&lt;/b&gt; 역시 비동기적으로 동작하기 때문에, .then() 내에서 발생한 오류는 try...catch 범위 밖에서 발생합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 한계로 인해 비동기 코드에서 발생한 오류는 일반적인 try...catch로 처리할 수 없음을 알게 되었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결책: 비동기 오류 처리를 위한 올바른 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 환경에서 오류를 효과적으로 처리하기 위해서는 &lt;b&gt;Promise&lt;/b&gt;나 &lt;b&gt;async/await&lt;/b&gt; 등의 패턴을 활용해야 합니다.&lt;br /&gt;아래는 개선된 코드 예시입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수정된 코드 1: setTimeout과 Promise 사용&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;new Promise((resolve, reject) =&amp;gt; {
  setTimeout(() =&amp;gt; {
    try {
      throw new Error('err');
    } catch (err) {
      reject(err); // 오류를 Promise로 전달
    }
  }, 200);
})
  .then(() =&amp;gt; {
    // 성공 시 실행
  })
  .catch((err) =&amp;gt; {
    console.log(err); // 여기서 오류를 잡음
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포인트:&lt;/b&gt;&lt;br /&gt;setTimeout 콜백 내부에서 try...catch를 사용하여 발생한 오류를 reject로 전달한 후, .catch()에서 처리합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수정된 코드 2: Promise와 async/await 사용&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 1: Promise 체이닝&lt;/h4&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;Promise.resolve()
  .then(() =&amp;gt; {
    throw new Error('err');
  })
  .catch((err) =&amp;gt; {
    console.log(err); // 여기서 오류를 잡음
  });
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방법 2: async/await 활용&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;async function handleError() {
  try {
    await Promise.resolve().then(() =&amp;gt; {
      throw new Error('err');
    });
  } catch (err) {
    console.log(err); // 여기서 오류를 잡음
  }
}

handleError();
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;포인트:&lt;/b&gt;&lt;br /&gt;async/await를 사용하면 비동기 코드도 마치 동기 코드처럼 처리할 수 있어, try...catch를 자연스럽게 활용할 수 있습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;b&gt;비동기 오류 처리&lt;/b&gt;에 대한 이해 부족이 단순한 실수로 이어졌지만, 이를 통해 &lt;b&gt;지속적인 학습&lt;/b&gt;과 &lt;b&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;&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;b&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025.03.31 - [FRONTEND/기술 면접 시리즈] - [Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743465487944&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;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&quot; data-og-description=&quot;javascript 코딩 경험이 많다면 다 겪어봤을 개념들 입니다. 정확한 명칭은 생각이 안나도 개념과 흐름은 어느정도 파악하고 있는분들께는 한번더 전체적인 개념 정립에 도움이 될것입니다.&amp;nbsp;면접&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/baIkYz/hyYxH80iHe/tdlBdHonrTj0iiXGlkxbYk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/HOznb/hyYA9JxHcw/oMCTdM9HMxjevFSomksMWK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/frontend-javascript-interview-series&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/baIkYz/hyYxH80iHe/tdlBdHonrTj0iiXGlkxbYk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/HOznb/hyYA9JxHcw/oMCTdM9HMxjevFSomksMWK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;javascript 코딩 경험이 많다면 다 겪어봤을 개념들 입니다. 정확한 명칭은 생각이 안나도 개념과 흐름은 어느정도 파악하고 있는분들께는 한번더 전체적인 개념 정립에 도움이 될것입니다.&amp;nbsp;면접&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/react-debounce&quot;&gt;[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743465571423&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;[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)&quot; data-og-description=&quot;React에서 디바운스(Debounce) 구현하기React 애플리케이션을 개발하다 보면, 상태(state)가 빠르게 여러 번 변경될 때 불필요한 렌더링이나 성능 저하를 방지해야 할 상황이 종종 발생합니다. 이럴 때 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qvRoq/hyYyQYnDDi/rKwOel7lKkOtFcOrOOVbI1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/iZuMk/hyYyT8FQ6D/0DjrGtkCxd9H4XKxyK9XFk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/react-debounce&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qvRoq/hyYyQYnDDi/rKwOel7lKkOtFcOrOOVbI1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/iZuMk/hyYyT8FQ6D/0DjrGtkCxd9H4XKxyK9XFk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React에서 디바운스(Debounce) 구현하기React 애플리케이션을 개발하다 보면, 상태(state)가 빠르게 여러 번 변경될 때 불필요한 렌더링이나 성능 저하를 방지해야 할 상황이 종종 발생합니다. 이럴 때&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743465576623&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bfT6T3/hyYyTU7pPN/t3kFcZINTYmcszeykcEq3K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/vJnI6/hyYyH8e05H/YzY1THCo7BZBMu5DVnkIF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bfT6T3/hyYyTU7pPN/t3kFcZINTYmcszeykcEq3K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/vJnI6/hyYyH8e05H/YzY1THCo7BZBMu5DVnkIF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>FRONTEND/기술 면접 시리즈</category>
      <category>javascript try catch 함정</category>
      <category>javascript 비동기 오류 처리 질문</category>
      <category>js try catch 면접 질문</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/232</guid>
      <comments>https://intelloper.tistory.com/entry/frontend-interview-series-try-catch-trick#entry232comment</comments>
      <pubDate>Tue, 1 Apr 2025 13:32:59 +0900</pubDate>
    </item>
    <item>
      <title>[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드</title>
      <link>https://intelloper.tistory.com/entry/frontend-javascript-interview-series</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgBGQ0/btsM14VUN1F/LxwlX42DHMujGQke6dPljk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgBGQ0/btsM14VUN1F/LxwlX42DHMujGQke6dPljk/img.webp&quot; data-alt=&quot;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgBGQ0/btsM14VUN1F/LxwlX42DHMujGQke6dPljk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgBGQ0%2FbtsM14VUN1F%2FLxwlX42DHMujGQke6dPljk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Frontend 면접 대비 시리즈] 자바스크립트 마스터 종합 가이드&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;javascript 코딩 경험이 많다면 다 겪어봤을 개념들 입니다. 정확한 명칭은 생각이 안나도 개념과 흐름은 어느정도 파악하고 있는분들께는 한번더 전체적인 개념 정립에 도움이 될것입니다.&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;면접에서 자주 등장하는 자바스크립트 개념을 정리하고, 실전에서 활용할 수 있도록 예제 코드와 설명을 제공합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;1. 메모리 관리&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트가 메모리를 어떻게 처리하는지 이해하면 최적화된 코드를 작성할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Hoisting (호이스팅)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수와 함수 선언이 실행 컨텍스트 생성 단계에서 어떻게 끌어올려지는지 살펴봅니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;console.log(x); // undefined
var x = 10;

sayHello(); // &quot;Hello&quot;
function sayHello() {
    console.log(&quot;Hello&quot;);
}

console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 20;

console.log(add(1, 2)); // TypeError: add is not a function
var add = function(a, b) {
    return a + b;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; 변수 선언은 호이스팅되지만 값 할당은 호이스팅되지 않기 때문에 undefined가 출력됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Lexical Scope (어휘적 스코프)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트가 어휘적 환경에서 변수 접근성을 어떻게 결정하는지 이해하세요.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function outer() {
    var x = 10;
    function inner() {
        console.log(x); // 10
    }
    inner();
}
outer();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; 내부 함수 inner는 자신을 포함하는 외부 스코프 outer의 변수 x에 접근할 수 있습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Closures (클로저)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클로저는 함수가 부모 함수 실행 후에도 변수에 접근할 수 있도록 합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function outerFunc() {
    var count = 0;
    return function() {
        count++;
        return count;
    };
}
var counter = outerFunc();
console.log(counter()); // 1
console.log(counter()); // 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; count 변수는 outerFunc가 종료된 후에도 counter 함수가 유지하면서 값을 증가시킬 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;Scope &amp;amp; Closure Chaining (스코프 및 클로저 체이닝)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;중첩 스코프의 개념과 클로저를 사용하여 private 변수와 캡슐화를 만드는 방법을 깊이 탐구하세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function outer() {
    var privateVar = &quot;secret&quot;;
    return function inner() {
        return privateVar;
    };
}
var getSecret = outer();
console.log(getSecret()); // &quot;secret&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;privateVar&lt;/span&gt;&lt;span&gt;는 외부에서 직접 접근할 수 없으며, &lt;/span&gt;&lt;span&gt;inner&lt;/span&gt;&lt;span&gt; 함수를 통해서만 접근할 수 있어 캡슐화를 구현합니다.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;2. 런타임 환경&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 코드가 실행되는 방식을 이해하면 성능 최적화와 디버깅에 도움이 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Execution Context (실행 컨텍스트)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 실행 컨텍스트 스택을 이해하고 코드가 어떻게 실행되는지 살펴보세요.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function outer() {
    console.log(&quot;Outer start&quot;);
    function inner() {
        console.log(&quot;Inner&quot;);
    }
    inner();
    console.log(&quot;Outer end&quot;);
}
outer();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; outer가 실행되면 inner가 호출되고, 실행이 끝나면 컨텍스트가 스택에서 제거됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Event Loop (이벤트 루프)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 루프를 통해 비동기 작업이 어떻게 처리되는지 이해하세요.&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;console.log(&quot;Sync 1&quot;);
setTimeout(() =&amp;gt; console.log(&quot;Async&quot;), 0);
console.log(&quot;Sync 2&quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; 동기 코드가 먼저 실행되고, setTimeout의 콜백은 이벤트 루프를 통해 나중에 실행됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;Microtask Queue (마이크로태스크 큐)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;마이크로태스크 큐와 특정 작업이 다른 작업보다 우선적으로 처리되는 방식을 이해하세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;Promise.resolve().then(() =&amp;gt; console.log(&quot;Microtask&quot;));
console.log(&quot;Sync&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;console.log(&quot;Sync&quot;)&lt;/span&gt;&lt;span&gt;가 먼저 실행된 후, 마이크로태스크 큐에 있던 &lt;/span&gt;&lt;span&gt;Promise.then()&lt;/span&gt;&lt;span&gt;이 실행되면서 &lt;/span&gt;&lt;span&gt;Microtask&lt;/span&gt;&lt;span&gt;가 출력됩니다&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;Callback Queue (콜백 큐)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;콜백이 자바스크립트에서 어떻게 처리되는지와 비동기 작업 관리를 위한 사용법을 탐구하세요.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;setTimeout(() =&amp;gt; console.log(&quot;Callback&quot;), 0);
console.log(&quot;Sync&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;console.log(&quot;Sync&quot;)&lt;/span&gt;&lt;span&gt;가 먼저 실행되고, &lt;/span&gt;&lt;span&gt;setTimeout&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;3. 비동기 처리&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기 작업을 효율적으로 다루는 것은 프론트엔드 개발에서 매우 중요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Promises (프로미스)&lt;/h3&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const promise = new Promise((resolve) =&amp;gt; {
    setTimeout(() =&amp;gt; resolve(&quot;Done&quot;), 1000);
});
promise.then((result) =&amp;gt; console.log(result)); // &quot;Done&quot; after 1 second
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; 프로미스는 비동기 작업 완료 후 .then()을 사용하여 결과를 처리합니다.&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;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp;Callbacks (콜백)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜백은 비동기 코드의 흐름을 제어하는 중요한 개념입니다. 비동기 작업이 완료된 후 실행될 함수를 인자로 전달하여, 원하는 시점에 실행할 수 있도록 합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 예제 코드&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function fetchData(callback) {
    setTimeout(() =&amp;gt; callback(&quot;Data received&quot;), 1000);
}
fetchData((data) =&amp;gt; console.log(data)); // &quot;Data received&quot; after 1 second
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&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;fetchData 함수는 1초 후에 데이터를 가져오는 시뮬레이션을 합니다.&lt;/li&gt;
&lt;li&gt;setTimeout을 사용하여 1초 후 callback(&quot;Data received&quot;)을 실행합니다.&lt;/li&gt;
&lt;li&gt;fetchData를 호출할 때, 콜백 함수 (data) =&amp;gt; console.log(data)를 전달하므로 &lt;b&gt;1초 후 &quot;Data received&quot;가 출력됩니다.&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-ke-size=&quot;size23&quot;&gt;  Async/Await (비동기/대기)&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;async function fetchData() {
    const response = await new Promise((resolve) =&amp;gt; {
        setTimeout(() =&amp;gt; resolve(&quot;Data&quot;), 1000);
    });
    console.log(response); // &quot;Data&quot; after 1 second
}
fetchData();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; await를 사용하여 동기 코드처럼 비동기 처리를 쉽게 이해할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;i&gt;&lt;u&gt;&lt;b&gt;4. 객체 참조&lt;/b&gt;&lt;/u&gt;&lt;/i&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트의 객체 지향적 특성을 이해하면 보다 강력한 코드 작성이 가능합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  'this' 키워드&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const obj = {
    name: &quot;John&quot;,
    greet: function() {
        console.log(this.name);
    }
};
obj.greet(); // &quot;John&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; this는 obj를 가리키므로 name 속성에 접근할 수 있습니다.&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;  Prototypes (프로토타입)&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function Person(name) {
    this.name = name;
}
Person.prototype.greet = function() {
    console.log(`Hello, ${this.name}`);
};
const person = new Person(&quot;Alice&quot;);
person.greet(); // &quot;Hello, Alice&quot;
&lt;/code&gt;&lt;/pre&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;__proto__ 와 프로토타입 체인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 프로토타입 기반의 객체 지향 언어입니다. 모든 객체는 __proto__ 속성을 가지며, 이를 통해 프로토타입 체인을 따라가면서 상속된 속성이나 메서드를 찾을 수 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000;&quot; data-ke-size=&quot;size20&quot;&gt;✅ 예제 코드&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot;&gt;&lt;code&gt;function Person() {}
const person = new Person();
console.log(person.__proto__ === Person.prototype); // true
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&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;Person 생성자를 사용해 person 객체를 생성합니다.&lt;/li&gt;
&lt;li&gt;person.__proto__는 Person.prototype을 참조하므로 true가 출력됩니다.&lt;/li&gt;
&lt;li&gt;이를 통해 person 객체는 Person.prototype에 정의된 메서드나 속성에 접근할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  참고:&lt;/b&gt;&lt;br /&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;  Call, Apply, Bind&lt;/h3&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function greet() {
    console.log(`Hello, ${this.name}`);
}
const obj = { name: &quot;John&quot; };
greet.call(obj); // &quot;Hello, John&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;설명:&lt;/b&gt; call()을 사용하여 this를 obj로 설정할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743399286776&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;[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)&quot; data-og-description=&quot;React에서 디바운스(Debounce) 구현하기React 애플리케이션을 개발하다 보면, 상태(state)가 빠르게 여러 번 변경될 때 불필요한 렌더링이나 성능 저하를 방지해야 할 상황이 종종 발생합니다. 이럴 때 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bzwfe9/hyYxOmAuZf/kNB5IMBWRgTY650Rhk1yS0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/rjYE3/hyYyPrq3dn/JbtK9B5KYjtP1lOwBcal31/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/react-debounce&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/react-debounce&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bzwfe9/hyYxOmAuZf/kNB5IMBWRgTY650Rhk1yS0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/rjYE3/hyYyPrq3dn/JbtK9B5KYjtP1lOwBcal31/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[React 성능 개선] 불필요한 렌더링 대폭 감소 시키기! (feat.Debounce)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React에서 디바운스(Debounce) 구현하기React 애플리케이션을 개발하다 보면, 상태(state)가 빠르게 여러 번 변경될 때 불필요한 렌더링이나 성능 저하를 방지해야 할 상황이 종종 발생합니다. 이럴 때&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/JSON-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JSON 성능 최적화&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743399326027&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;JSON 성능 최적화&quot; data-og-description=&quot;JSON은 웹 개발에 널리 채택되고 있지만 속도 문제가 없는 것은 아닙니다. 이 형식은 사람이 읽을 수 있는 특성으로 인해 데이터 페이로드(전송되는 '순수한 데이터')가 커지고 처리 시간이 느려&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/JSON-optimization&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/JSON-optimization&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vIFaS/hyYyT8qU8Y/bqrJlWqCWzVigeCCpCrRh0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ZywNU/hyYyMO1iiW/dqWwnwuoepwUyGHqbSarKK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/JSON-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/JSON-optimization&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vIFaS/hyYyT8qU8Y/bqrJlWqCWzVigeCCpCrRh0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/ZywNU/hyYyMO1iiW/dqWwnwuoepwUyGHqbSarKK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;JSON 성능 최적화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JSON은 웹 개발에 널리 채택되고 있지만 속도 문제가 없는 것은 아닙니다. 이 형식은 사람이 읽을 수 있는 특성으로 인해 데이터 페이로드(전송되는 '순수한 데이터')가 커지고 처리 시간이 느려&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743399255253&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7ZwVW/hyYyVZudMU/K5LeGGx8jmMAs47bFCFND1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/PpiOu/hyYyH70dZk/79DALdAv7Z9msdCS01m2IK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7ZwVW/hyYyVZudMU/K5LeGGx8jmMAs47bFCFND1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/PpiOu/hyYyH70dZk/79DALdAv7Z9msdCS01m2IK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>FRONTEND/기술 면접 시리즈</category>
      <category>front 면접 질문</category>
      <category>frontend 면접 질문</category>
      <category>javascript 면접 질문</category>
      <category>프론트엔드 면접 대비</category>
      <category>프론트엔드 면접 질문</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/231</guid>
      <comments>https://intelloper.tistory.com/entry/frontend-javascript-interview-series#entry231comment</comments>
      <pubDate>Mon, 31 Mar 2025 15:33:03 +0900</pubDate>
    </item>
    <item>
      <title>RESTful API 설계 주의점! API 경로 충돌 분석 및 해결 방안</title>
      <link>https://intelloper.tistory.com/entry/restful-api-path-tip</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame344811.webp&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNu4ES/btsMYM0IwLe/WE0lH5p7bi31HuK8TKFXB1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNu4ES/btsMYM0IwLe/WE0lH5p7bi31HuK8TKFXB1/img.webp&quot; data-alt=&quot;RESTful API 설계팁&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNu4ES/btsMYM0IwLe/WE0lH5p7bi31HuK8TKFXB1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNu4ES%2FbtsMYM0IwLe%2FWE0lH5p7bi31HuK8TKFXB1%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;512&quot; height=&quot;512&quot; data-filename=&quot;Frame344811.webp&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RESTful API 설계팁&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;API 경로 충돌 분석 및 해결 방안&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 보고서는 &lt;b&gt;API 엔드포인트 경로 간 충돌 가능성을 분석&lt;/b&gt;하고, &lt;b&gt;발생 원인&lt;/b&gt;과 &lt;b&gt;해결 방안&lt;/b&gt;을 제시합니다. 특히 두 그룹의 경로를 비교하여 충돌이 발생할 수 있는 경우와 그에 따른 개선 방법을 상세하게 설명합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 포인트&lt;/h2&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;br /&gt;두 번째 경로 그룹(예: &lt;b&gt;/{variable1}/{variable2}&lt;/b&gt;와 &lt;b&gt;/download/{fileName}&lt;/b&gt;)은 특정 요청(예: /download/file.txt)에서 양쪽 모두 일치할 수 있으므로 충돌 가능성이 높습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;충돌 미발생 사례&lt;/b&gt;:&lt;br /&gt;첫 번째 경로 그룹(예: &lt;b&gt;/get-author-collections/{userID}/{start}/{limit}&lt;/b&gt;와 &lt;b&gt;/get-collection-posts/{collectionID}/{start}/{limit}&lt;/b&gt;)은 고정된 경로 구간이 서로 다르므로 충돌하지 않습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정의 순서의 영향&lt;/b&gt;:&lt;br /&gt;두 번째 그룹의 경우 경로가 정의된 순서에 따라 매칭되는 엔드포인트가 달라질 수 있으므로, 의도하지 않은 결과를 초래할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상세 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 문제 정의 및 배경&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 서버에서 동적 경로 매개변수를 사용할 때, 경로 패턴이 겹치는 경우 우선순위에 따라 어느 엔드포인트가 호출될지 결정됩니다.&lt;br /&gt;보다 일반적인 경로가 특정 경로 패턴을 포함하게 되면 충돌이 발생할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 첫 번째 경로 그룹: &lt;b&gt;&lt;i&gt;&lt;u&gt;충돌 없음&lt;/u&gt;&lt;/i&gt;&lt;/b&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;/get-author-collections/{userID}/{start}/{limit}&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/get-collection-posts/{collectionID}/{start}/{limit}&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분석&lt;/b&gt;:&lt;br /&gt;두 경로 모두 고정된 시작 문자열(get-author-collections vs. get-collection-posts)을 포함하고 있으므로,&lt;br /&gt;URL이 /get-author-collections/123/0/10 또는 /get-collection-posts/456/0/10과 같이 명확히 구분됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시 코드 (FastAPI)&lt;/b&gt;:위 예시에서는 고정된 경로 부분 덕분에 두 엔드포인트가 서로 명확히 구분되므로 충돌이 발생하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1743030585407&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;''' 충돌 발생 X '''
from fastapi import FastAPI
app = FastAPI() 


@app.get(&quot;/get-author-collections/{userID}/{start}/{limit}&quot;) 
async def get_author_collections(userID: int, start: int, limit: int): 
	return {&quot;userID&quot;: userID, &quot;start&quot;: start, &quot;limit&quot;: limit} 


@app.get(&quot;/get-collection-posts/{collectionID}/{start}/{limit}&quot;)
async def get_collection_posts(collectionID: int, start: int, limit: int): 
	return {&quot;collectionID&quot;: collectionID, &quot;start&quot;: start, &quot;limit&quot;: limit}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 두 번째 경로 그룹: &lt;i&gt;&lt;u&gt;&lt;b&gt;충돌 가능성 있음&lt;/b&gt;&lt;/u&gt;&lt;/i&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;/{variable1}/{variable2}&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;/download/{fileName}&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;문제 상황 분석&lt;/b&gt;:&lt;br /&gt;예를 들어, /download/file.txt 요청 시 다음과 같이 두 경로에 모두 매칭될 수 있습니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/{variable1}/{variable2} &amp;rarr; variable1 = &quot;download&quot;, variable2 = &quot;file.txt&quot;&lt;/li&gt;
&lt;li&gt;/download/{fileName} &amp;rarr; fileName = &quot;file.txt&quot;&lt;/li&gt;
&lt;/ul&gt;
이 경우, FastAPI는 경로가 정의된 순서에 따라 첫 번째 매칭된 엔드포인트를 호출하므로, 의도하지 않은 결과를 초래할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예시 코드 (문제 상황)&lt;/b&gt;:위와 같이 정의할 경우, /download/file.txt 요청은 general_route에 매칭될 가능성이 높습니다(정의 순서에 따라).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1743030547514&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;''' 충돌 발생 O '''
from fastapi import FastAPI 
app = FastAPI() # 일반 경로 


@app.get(&quot;/{variable1}/{variable2}&quot;) 
async def general_route(variable1: str, variable2: str): 
    return {&quot;variable1&quot;: variable1, &quot;variable2&quot;: variable2} # 특정 경로 
    
    
@app.get(&quot;/download/{fileName}&quot;) 
async def download_file(fileName: str): 
	return {&quot;fileName&quot;: fileName}&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 방안&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1.경로 정의 순서 조정&lt;/b&gt;:&lt;br /&gt;보다 구체적인 경로(/download/{fileName})를 먼저 정의하여 충돌 가능성을 줄일 수 있습니다.&lt;b&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;&lt;b&gt;예시 코드 (순서 조정)&lt;/b&gt;:&lt;/p&gt;
&lt;pre style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

# 구체적인 경로를 먼저 정의
@app.get(&quot;/download/{fileName}&quot;)
async def download_file(fileName: str):
    return {&quot;fileName&quot;: fileName}

@app.get(&quot;/{variable1}/{variable2}&quot;)
async def general_route(variable1: str, variable2: str):
    return {&quot;variable1&quot;: variable1, &quot;variable2&quot;: variable2}
&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;b&gt;2. 경로 재설계&lt;/b&gt;:&lt;br /&gt;일반 경로의 패턴을 변경하여 특정 경로와 겹치지 않도록 할 수 있습니다.&lt;br /&gt;예를 들어, 일반 경로를 /images/{variable1}/{variable2}와 같이 명시적으로 구분하면 충돌을 방지할 수 있습니다.&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;b&gt;예시 코드 (경로 재설계)&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

# 변경된 일반 경로
@app.get(&quot;/images/{variable1}/{variable2}&quot;)
async def image_route(variable1: str, variable2: str):
    return {&quot;variable1&quot;: variable1, &quot;variable2&quot;: variable2}

@app.get(&quot;/download/{fileName}&quot;)
async def download_file(fileName: str):
    return {&quot;fileName&quot;: fileName}
&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;&lt;b&gt;3. 경로 제약 조건 적용&lt;/b&gt;:&lt;br /&gt;경로 매개변수에 정규 표현식 등의 제약 조건을 추가하여, 특정 값(예: &quot;download&quot;)이 일반 경로 매개변수로 들어가지 않도록 제한할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서는 variable1에 &quot;download&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;&lt;b&gt;예시 코드 (경로 제약 조건 적용)&lt;/b&gt;:&lt;/p&gt;
&lt;pre style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot;&gt;&lt;code&gt;from fastapi import FastAPI, Path

app = FastAPI()

@app.get(&quot;/download/{fileName}&quot;)
async def download_file(fileName: str):
    return {&quot;fileName&quot;: fileName}

@app.get(&quot;/{variable1}/{variable2}&quot;)
async def general_route(
    variable1: str = Path(..., regex=&quot;^(?!download$).*$&quot;),
    variable2: str = Path(...)
):
    return {&quot;variable1&quot;: variable1, &quot;variable2&quot;: variable2}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;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;/get-author-collections/123/0/10/&lt;br /&gt;get-collection-posts/456/0/10&lt;/td&gt;
&lt;td&gt;/download/file.txt&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;있음 (일부 URL에서 양쪽 경로에 모두 매칭됨)&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 contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&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;은 /download/file.txt와 같이 URL에 따라 양쪽 모두 일치할 가능성이 있으므로,&lt;br /&gt;&lt;b&gt;정의 순서 변경&lt;/b&gt;, &lt;b&gt;경로 재설계&lt;/b&gt; 또는 &lt;b&gt;경로 제약 조건&lt;/b&gt;을 적용하여 충돌 문제를 예방해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이와 같이 API 경로의 설계와 정의 순서에 주의하면, 의도하지 않은 동작이나 디버깅의 어려움을 크게 줄일 수 있습니다.&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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743031151863&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;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&quot; data-og-description=&quot;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hPpzp/hyYyRIUOU9/26MJQzitYhxuen3tKDY3c1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bF7QjY/hyYvnWZxFs/OsM98qP8tkl5IMKVd0imY0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/2025-microservice-design-pattern&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hPpzp/hyYyRIUOU9/26MJQzitYhxuen3tKDY3c1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bF7QjY/hyYvnWZxFs/OsM98qP8tkl5IMKVd0imY0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/modern-python-project-manage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Modern Python Project] 현대적 파이썬 프로젝트 관리, 개발법에 대하여&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743031163872&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;[Modern Python Project] 현대적 파이썬 프로젝트 관리, 개발법에 대하여&quot; data-og-description=&quot;파이썬 프로젝트를 현대적으로 관리하고 개발하는 방법에 대해 이야기해보려 합니다.&amp;nbsp;여러 회사와 프로젝트에서 파이썬을 사용하면서 발견한 몇 가지 성가시고, 유지보수가 어렵고, 구식인 관&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/modern-python-project-manage&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/modern-python-project-manage&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/t2mry/hyYuhplq6a/KrfMyRPh3IEfGhbZf6BIKk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c2v14R/hyYue0xZDX/zYPkEgrr2EmVTRZrYUNU1k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/modern-python-project-manage&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/modern-python-project-manage&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/t2mry/hyYuhplq6a/KrfMyRPh3IEfGhbZf6BIKk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c2v14R/hyYue0xZDX/zYPkEgrr2EmVTRZrYUNU1k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Modern Python Project] 현대적 파이썬 프로젝트 관리, 개발법에 대하여&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;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1743031192736&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;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&quot; data-og-description=&quot;소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  SOLID는 로버트 C. 마틴(일명 &amp;quot;Uncle Bob&amp;quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/R1x2v/hyYuiWbiZD/cMDnkz1xQioxkqw5Q1zL31/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/b1RyHO/hyYxHtcOtp/UUvHqJR7rQjjbfKYaDO8nk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/R1x2v/hyYuiWbiZD/cMDnkz1xQioxkqw5Q1zL31/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/b1RyHO/hyYxHtcOtp/UUvHqJR7rQjjbfKYaDO8nk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  SOLID는 로버트 C. 마틴(일명 &quot;Uncle Bob&quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Architecture</category>
      <category>api 경로 설계</category>
      <category>api 경로 충돌 분석 및 해결 방안</category>
      <category>api 충돌</category>
      <category>restapi 설계 주의점</category>
      <category>restful api 경로 설계</category>
      <category>restful api 설계팁</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/230</guid>
      <comments>https://intelloper.tistory.com/entry/restful-api-path-tip#entry230comment</comments>
      <pubDate>Thu, 27 Mar 2025 08:25:55 +0900</pubDate>
    </item>
    <item>
      <title>2025년에 꼭 알아야 할 5가지 마이크로서비스 디자인 패턴 (Python FastAPI 예시 포함)</title>
      <link>https://intelloper.tistory.com/entry/2025-microservice-design-pattern</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMIOFZ/btsMOhBJIYQ/E4ygM7y1rdGnHAikaA2lQ0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMIOFZ/btsMOhBJIYQ/E4ygM7y1rdGnHAikaA2lQ0/img.webp&quot; data-alt=&quot;마이크로서비스 디자인 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMIOFZ/btsMOhBJIYQ/E4ygM7y1rdGnHAikaA2lQ0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMIOFZ%2FbtsMOhBJIYQ%2FE4ygM7y1rdGnHAikaA2lQ0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&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;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;0045ff5b-b230-4b12-bf82-d1be5d791b08&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h2 data-end=&quot;32&quot; data-start=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;마이크로서비스의 복잡성을 해결하는 필수 디자인 패턴&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스는 현대 소프트웨어 개발의 핵심으로 자리 잡았습니다. 하나의 거대한 애플리케이션 대신 작고 독립적인 서비스들로 시스템을 구성하면 &lt;b&gt;유연성과 확장성&lt;/b&gt;을 극대화할 수 있죠. 하지만 이런 장점에는 대가가 따릅니다. 서비스 간 통신, 데이터 관리, 장애 처리 등 복잡성이 증가하기 때문입니다. 이때 &lt;b&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;이 글에서는 &lt;b&gt;2025년에 주목해야 할 5가지 마이크로서비스 디자인 패턴&lt;/b&gt;을 소개합니다. 단순한 개념 설명에 그치지 않고, &lt;b&gt;Python FastAPI&lt;/b&gt;를 활용한 실제 예제와 모범 사례까지 함께 제공하니 실무에서도 바로 적용할 수 있을 것입니다. 초보 개발자든, 경험 많은 개발자든 이 패턴들이 여러분의 프로젝트를 한 단계 발전시키는 데 도움이 될 거라 확신합니다. 자, 시작해볼까요?&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. API 게이트웨이 패턴 (API Gateway Pattern)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✨ 개념&lt;/h3&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;API 게이트웨이 패턴&lt;/b&gt;은 이런 혼란을 해결하기 위해 &lt;b&gt;모든 클라이언트 요청이 통과하는 단일 진입점&lt;/b&gt;을 제공합니다. API 게이트웨이가 각 요청을 분석하고 적절한 서비스로 전달한 뒤, 여러 서비스의 응답을 조합하여 클라이언트에게 반환하는 방식입니다.&lt;/p&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;클라이언트가 API 게이트웨이에 요청을 보냅니다. (예: /orders)&lt;/li&gt;
&lt;li&gt;API 게이트웨이가 요청을 분석하고 필요한 서비스로 전달합니다.&lt;/li&gt;
&lt;li&gt;여러 서비스의 응답을 하나로 합쳐 클라이언트에 반환합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 예제 (FastAPI 활용)&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;from fastapi import FastAPI, APIRouter
import requests

app = FastAPI()
user_router = APIRouter()
order_router = APIRouter()

@user_router.get(&quot;/users/{user_id}&quot;)
async def get_user(user_id: str):
    response = requests.get(f&quot;http://user-service/users/{user_id}&quot;)
    return response.json()

@order_router.get(&quot;/orders/{order_id}&quot;)
async def get_order(order_id: str):
    response = requests.get(f&quot;http://order-service/orders/{order_id}&quot;)
    return response.json()

app.include_router(user_router, prefix=&quot;/users&quot;)
app.include_router(order_router, prefix=&quot;/orders&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서는 API 게이트웨이가 /users 요청을 사용자 서비스로, /orders 요청을 주문 서비스로 라우팅합니다. 클라이언트는 내부 서비스를 몰라도 게이트웨이를 통해 접근할 수 있습니다.&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;: OAuth2나 JWT를 활용해 인증과 인가를 추가하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장애 대비&lt;/b&gt;: 다음에 소개할 &lt;b&gt;서킷 브레이커 패턴&lt;/b&gt;을 결합하여 안정성을 높이세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 사가 패턴 (Saga Pattern)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✨ 개념&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로서비스 환경에서는 &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;/li&gt;
&lt;li&gt;재고 서비스에서 물품을 차감&lt;/li&gt;
&lt;li&gt;주문 서비스에서 주문을 생성&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 중간에 한 서비스가 실패하면? 데이터 불일치 문제가 발생할 수 있습니다. &lt;b&gt;사가 패턴&lt;/b&gt;은 분산 트랜잭션을 안전하게 관리하는 기법으로, &lt;b&gt;각 서비스가 독립적으로 단계를 처리하고, 실패 시 롤백(보상 트랜잭션)을 수행&lt;/b&gt;할 수 있도록 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 예제 (FastAPI 활용, 안무 기반 사가)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class OrderCreatedEvent(BaseModel):
    order_id: str
    user_id: str
    items: list[str]

@app.post(&quot;/orders&quot;)
async def create_order(order: OrderCreatedEvent):
    publish_event(&quot;order_created&quot;, order.dict())
    return {&quot;message&quot;: &quot;Order created&quot;}

def handle_order_created_event(event):
    payment_request = {&quot;order_id&quot;: event[&quot;order_id&quot;], &quot;amount&quot;: calculate_amount(event[&quot;items&quot;])}
    payment_service.process_payment(payment_request)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서는 주문이 생성되면 order_created 이벤트를 발행하고, 이를 감지한 &lt;b&gt;결제 서비스&lt;/b&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;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 서킷 브레이커 패턴 (Circuit Breaker Pattern)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✨ 개념&lt;/h3&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;b&gt;특정 서비스가 일정 횟수 이상 실패하면 추가 요청을 차단&lt;/b&gt;하고, 일정 시간이 지난 후 다시 정상 요청을 시도하는 방식으로 동작합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 예제 (FastAPI + circuitbreaker 활용)&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI, HTTPException
from circuitbreaker import circuit, CircuitBreakerError
import requests

app = FastAPI()

@circuit(failure_threshold=5, recovery_timeout=30)
def get_user(user_id: str):
    response = requests.get(f&quot;http://user-service/users/{user_id}&quot;)
    if response.status_code != 200:
        raise HTTPException(status_code=503, detail=&quot;Service Unavailable&quot;)
    return response.json()

@app.get(&quot;/users/{user_id}&quot;)
async def read_user(user_id: str):
    try:
        return get_user(user_id)
    except CircuitBreakerError:
        return {&quot;user&quot;: &quot;default&quot;, &quot;name&quot;: &quot;Guest&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드에서는 사용자 서비스가 일정 횟수 이상 실패하면 &lt;b&gt;기본 사용자 정보&lt;/b&gt;를 반환하여 장애가 확산되지 않도록 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 이벤트 소싱 패턴 (Event Sourcing Pattern)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 시스템은 현재 상태만 저장합니다. 예를 들어, 계좌 잔고가 10만 원이라면 그게 전부죠. 하지만 &lt;b&gt;잔고가 어떻게 변했는지 알고 싶다면?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;**이벤트 소싱 패턴(Event Sourcing Pattern)**은 상태 변화를 이벤트로 기록하여 과거 이력을 완벽히 재구성할 수 있도록 해줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  이벤트 소싱 패턴이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 덮어쓰지 않고, 모든 변화를 이벤트로 저장합니다. 이후 이벤트를 순서대로 재생하면 현재 상태를 도출할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 예제: FastAPI로 이벤트 저장&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class OrderCreatedEvent(BaseModel):
    order_id: str
    user_id: str
    items: list[str]

# 간단한 이벤트 저장소
event_store = []

# 주문 생성 엔드포인트
@app.post(&quot;/orders&quot;)
async def create_order(order: OrderCreatedEvent):
    event_store.append(order.dict())
    return {&quot;message&quot;: &quot;Order created&quot;}

# 현재 상태 재구성 함수
def get_current_state():
    state = {}
    for event in event_store:
        # 이벤트 적용 로직 (예: state 업데이트)
        pass
    return state
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 주문 이벤트를 저장하고, 나중에 이벤트를 재생하여 주문 상태를 확인할 수 있습니다.&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;b&gt;이벤트 저장소&lt;/b&gt;: Apache Kafka나 EventStoreDB 같은 도구를 활용하세요.&lt;/p&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 스트랭글러 피그 패턴 (Strangler Fig Pattern)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래된 모놀리식 시스템을 유지보수하기 어렵지만, 한 번에 마이크로서비스로 전환하는 것은 위험 부담이 큽니다. **스트랭글러 피그 패턴(Strangler Fig Pattern)**은 레거시 시스템을 점진적으로 교체하는 전략입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  스트랭글러 피그 패턴이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모놀리스의 기능을 하나씩 마이크로서비스로 옮깁니다. 마치 나무를 감싸며 자라는 **스트랭글러 피그(Strangler Fig)**처럼, 새로운 시스템이 점점 커지면서 기존 시스템을 대체합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 적용 방법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ 교체할 기능(예: 사용자 관리)을 선정합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ 해당 기능을 새로운 마이크로서비스로 개발합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ API 게이트웨이를 통해 요청을 새 서비스로 라우팅합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  실전 예제: FastAPI로 점진적 전환&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from fastapi import FastAPI

app = FastAPI()

# 기존 모놀리스 엔드포인트
@app.get(&quot;/users/{user_id}&quot;)
async def get_user_old(user_id: str):
    return {&quot;user&quot;: user_id, &quot;source&quot;: &quot;monolith&quot;}

# 새로운 마이크로서비스 엔드포인트
@app.get(&quot;/new/users/{user_id}&quot;)
async def get_user_new(user_id: str):
    return {&quot;user&quot;: user_id, &quot;source&quot;: &quot;microservice&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 처음에는 /users를 사용하다가 점차 /new/users로 전환하며 모놀리스를 줄여나갑니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  모범 사례&lt;/h3&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;p data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;문서화&lt;/b&gt;: 팀원들이 진행 상황을 쉽게 이해할 수 있도록 기록을 남기세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 5가지 패턴은 마이크로서비스의 복잡성을 줄이고, 확장 가능하며 안정적인 시스템을 만드는 데 큰 도움이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;API 게이트웨이&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;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;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;&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;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;a href=&quot;https://intelloper.tistory.com/entry/code-smell&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742369685146&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;[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜&quot; data-og-description=&quot;소프트웨어 개발에서 깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 견고하고 확장 가능한 애플리케이션을 만드는 데 필수적입니다.&amp;nbsp;하지만 경험이 많은 개발자조차도 무심코 &amp;quot;코드 스멜(&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/code-smell&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/code-smell&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dJH2g5/hyYuqE7rrv/tJbPeLlGYyKWVQ508SQnxK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/wkN6M/hyYqUAXyJh/tpcFc1rNFG3emaffWHt4s0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/code-smell&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/code-smell&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dJH2g5/hyYuqE7rrv/tJbPeLlGYyKWVQ508SQnxK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/wkN6M/hyYqUAXyJh/tpcFc1rNFG3emaffWHt4s0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발에서 깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 견고하고 확장 가능한 애플리케이션을 만드는 데 필수적입니다.&amp;nbsp;하지만 경험이 많은 개발자조차도 무심코 &quot;코드 스멜(&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742369725903&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cntTss/hyYukZdUM6/1fo7qhPYwwQbN5ZYMqTKF1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/ccEYxD/hyYqWZY3GI/t1xk0an4M29XsD58MboUB0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cntTss/hyYukZdUM6/1fo7qhPYwwQbN5ZYMqTKF1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/ccEYxD/hyYqWZY3GI/t1xk0an4M29XsD58MboUB0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Backend 면접 질문 시리즈] 마이크로서비스 아키텍처: 현대 소프트웨어 개발의 핵심 트렌드&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742369766435&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;[Backend 면접 질문 시리즈] 마이크로서비스 아키텍처: 현대 소프트웨어 개발의 핵심 트렌드&quot; data-og-description=&quot;Intro. 면접에서 나오는 질문은 보편적으로 중요한 개념이며 하루 아침에 이해되고 외워 지는게 아닙니다. 평소에 꾸준히 지식을 습득하고 이해하는것이 중요합니다.&amp;nbsp;&amp;nbsp;마이크로서비스 아키텍처&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IkKVy/hyYupsHjlq/8ewjwK9tnxuxXwhGm0FPO0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cuCcEV/hyYud6RE5h/0qfZCt4hLLuQb9irSVTEqk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bJv3U2/hyYr3RRAZo/QnNi9T0XKaJEK0fc6qwOj0/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/about-microservice&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/about-microservice&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IkKVy/hyYupsHjlq/8ewjwK9tnxuxXwhGm0FPO0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cuCcEV/hyYud6RE5h/0qfZCt4hLLuQb9irSVTEqk/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bJv3U2/hyYr3RRAZo/QnNi9T0XKaJEK0fc6qwOj0/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;[Backend 면접 질문 시리즈] 마이크로서비스 아키텍처: 현대 소프트웨어 개발의 핵심 트렌드&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Intro. 면접에서 나오는 질문은 보편적으로 중요한 개념이며 하루 아침에 이해되고 외워 지는게 아닙니다. 평소에 꾸준히 지식을 습득하고 이해하는것이 중요합니다.&amp;nbsp;&amp;nbsp;마이크로서비스 아키텍처&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Architecture</category>
      <category>fast api microservice pattern</category>
      <category>fastapi 마이크로 서비스 디자인 패턴</category>
      <category>python fastapi</category>
      <category>마이크로서비스 디자인 패턴</category>
      <category>마이크로서비스 모범 사례</category>
      <category>사가 패턴</category>
      <category>서킷 브레이커</category>
      <category>스트랭글러 피그 패턴</category>
      <category>이벤트 소싱 패턴</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/229</guid>
      <comments>https://intelloper.tistory.com/entry/2025-microservice-design-pattern#entry229comment</comments>
      <pubDate>Wed, 19 Mar 2025 16:43:45 +0900</pubDate>
    </item>
    <item>
      <title>[Window git 설치 에러] git : 'git' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인 식되지 않습니다.</title>
      <link>https://intelloper.tistory.com/entry/git-git-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8-%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4</link>
      <description>&lt;pre id=&quot;code_1742263206428&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(base) PS C:\Users\Administrator&amp;gt; choco install git -y
Chocolatey v2.4.3
Installing the following packages:
git
By installing, you accept licenses for the packages.
Downloading package from source 'https://community.chocolatey.org/api/v2/'
Progress: Downloading chocolatey-compatibility.extension 1.0.0... 100%

chocolatey-compatibility.extension v1.0.0 [Approved]

...

Enjoy using Chocolatey? Explore more amazing features to take your
experience to the next level at
 https://chocolatey.org/compare
(base) PS C:\Users\Administrator&amp;gt; git --version
git : 'git' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인 
식되지 않습니다. 이름이 정확한지 확인하고 경로가 포함된 경우 경로가 올바른지 검증한 다  
음 다시 시도하십시오.
위치 줄:1 문자:1
+ git --version
+ ~~~
    + CategoryInfo          : ObjectNotFound: (git:String) [], CommandNotFoundExceptio  
   n
    + FullyQualifiedErrorId : CommandNotFoundException

(base) PS C:\Users\Administrator&amp;gt; client_loop: send disconnect: Broken pipe&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;785&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mbnXh/btsMNsI3b4l/yb7o2wTTUgGWvpzYkfM1gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mbnXh/btsMNsI3b4l/yb7o2wTTUgGWvpzYkfM1gK/img.png&quot; data-alt=&quot;'[Window git 설치 에러] git : 'git' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인 식되지 않습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mbnXh/btsMNsI3b4l/yb7o2wTTUgGWvpzYkfM1gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmbnXh%2FbtsMNsI3b4l%2Fyb7o2wTTUgGWvpzYkfM1gK%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;700&quot; height=&quot;185&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'[Window git 설치 에러] git : 'git' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인 식되지 않습니다.&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;chocolatey로 git 설치 했는데도 git 이 적용되지 않는다면.&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git이 설치되었지만, git 명령어가 인식되지 않는 이유는 &lt;b&gt;환경 변수(PATH)가 즉시 반영되지 않았기 때문&lt;/b&gt;입니다. 이를 해결하는 방법을 시도해 보세요.&lt;/h2&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. PowerShell 다시 열기 (가장 간단한 방법)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git이 정상적으로 설치되었지만, 현재 PowerShell에서 환경 변수(PATH)가 갱신되지 않았을 수 있습니다. &lt;b&gt;PowerShell을 닫고 다시 관리자 권한으로 실행한 후 git --version을 입력해 보세요.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. 환경 변수 강제 새로고침&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell에서 다음 명령어를 실행하여 환경 변수를 즉시 반영할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;refreshenv
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음 다시 git --version을 실행해 보세요.&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. Git이 설치된 경로 수동 추가&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위 방법이 안 되면, Git이 설치된 경로가 환경 변수(PATH)에 추가되지 않았을 가능성이 있습니다. 다음 단계를 따라 확인하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(1) Git이 설치된 경로 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git이 설치된 기본 경로는 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Program Files\Git\cmd
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 경로에 Git이 있는지 확인하려면 PowerShell에서 실행하세요.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;Test-Path &quot;C:\Program Files\Git\cmd\git.exe&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과가 True라면, Git이 해당 경로에 설치되어 있습니다.&lt;/li&gt;
&lt;li&gt;결과가 False라면, Git이 다른 곳에 설치되었을 가능성이 있으므로 확인해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;(2) 환경 변수에 Git 경로 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell에서 다음 명령어를 실행하여 Git의 cmd 경로를 환경 변수에 추가합니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable(&quot;Path&quot;, $env:Path + &quot;;C:\Program Files\Git\cmd&quot;, [System.EnvironmentVariableTarget]::Machine)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 다음, &lt;b&gt;PowerShell을 다시 열고&lt;/b&gt; git --version을 실행해 보세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. 컴퓨터 재부팅&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 모든 방법을 시도했는데도 git이 인식되지 않는다면 &lt;b&gt;컴퓨터를 재부팅&lt;/b&gt;한 후 다시 실행해 보세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;640&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kRYic/btsMObfKuIa/fkupRArGlCDfXihEwCEPZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kRYic/btsMObfKuIa/fkupRArGlCDfXihEwCEPZk/img.png&quot; data-alt=&quot;git --version
git version 2.48.1.windows.1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kRYic/btsMObfKuIa/fkupRArGlCDfXihEwCEPZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkRYic%2FbtsMObfKuIa%2FfkupRArGlCDfXihEwCEPZk%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;700&quot; height=&quot;70&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git --version
git version 2.48.1.windows.1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;u&gt;&lt;b&gt;참고: 저는 3-2번 실행하고 재부팅 하니까 해결되었어요!&lt;/b&gt;&lt;/u&gt;&lt;/span&gt;&lt;/h4&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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742263562081&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ttMjq/hyYrSJeUtk/qgWSPlwXftFanRJJk0kkqK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/b6f07I/hyYqdN5z3M/ja5YKvf2wKq4ZB9fYU1A6K/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/M375l/hyYqSiRo90/wERQyQnX5xIqFUvYmqV2p0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ttMjq/hyYrSJeUtk/qgWSPlwXftFanRJJk0kkqK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/b6f07I/hyYqdN5z3M/ja5YKvf2wKq4ZB9fYU1A6K/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/M375l/hyYqSiRo90/wERQyQnX5xIqFUvYmqV2p0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot;&gt;[JavaScript] 프론트엔드 개발자를 위한 함수형 프로그래밍(functional programming)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742263562967&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;[JavaScript] 프론트엔드 개발자를 위한 함수형 프로그래밍(functional programming)&quot; data-og-description=&quot;JavaScript 개발자를 위한 함수형 프로그래밍JavaScript는 다양한 스타일로 코드를 작성할 수 있는 유연한 언어입니다. 명령형(imperative), 객체 지향(object-oriented), 그리고 함수형(functional) 프로그래밍 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ABGzy/hyYr0m669g/M6fhg1HaXxCpfToE9iWqE1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/rQCtN/hyYvfXm6em/hOa4OK878gj8JMFOfsZf11/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cJNjvm/hyYukxXCZd/Fp5yphyFHjPRq8IbRZL0nk/img.png?width=1536&amp;amp;height=1536&amp;amp;face=0_0_1536_1536&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ABGzy/hyYr0m669g/M6fhg1HaXxCpfToE9iWqE1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/rQCtN/hyYvfXm6em/hOa4OK878gj8JMFOfsZf11/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/cJNjvm/hyYukxXCZd/Fp5yphyFHjPRq8IbRZL0nk/img.png?width=1536&amp;amp;height=1536&amp;amp;face=0_0_1536_1536');&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;[JavaScript] 프론트엔드 개발자를 위한 함수형 프로그래밍(functional programming)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript 개발자를 위한 함수형 프로그래밍JavaScript는 다양한 스타일로 코드를 작성할 수 있는 유연한 언어입니다. 명령형(imperative), 객체 지향(object-oriented), 그리고 함수형(functional) 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742263560588&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8FJdS/hyYujTl0Ca/57oAkmzVsBFiBoTSgwnGEk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/zydxQ/hyYvoNycnm/8acGQbP64bspVTZKqB9Bc1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8FJdS/hyYujTl0Ca/57oAkmzVsBFiBoTSgwnGEk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/zydxQ/hyYvoNycnm/8acGQbP64bspVTZKqB9Bc1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>WINDOW-SERVER/ELLOR LOG</category>
      <category>+ categoryinfo          : objectnotfound: (git:string) []</category>
      <category>+ fullyqualifiederrorid : commandnotfoundexception</category>
      <category>commandnotfoundexceptio</category>
      <category>git 실행 에러</category>
      <category>git 용어가 cmdlet 함수 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인 식되지 않습니다.</category>
      <category>window git error</category>
      <category>window git 명령어 안됨</category>
      <category>window git 설치</category>
      <category>window git 실행 안됨</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/228</guid>
      <comments>https://intelloper.tistory.com/entry/git-git-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8-%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4#entry228comment</comments>
      <pubDate>Tue, 18 Mar 2025 11:08:56 +0900</pubDate>
    </item>
    <item>
      <title>[Code Smell] 흠흠 코드에서 냄새나는데? 개발자라면 반드시 알아야 할 코드 스멜</title>
      <link>https://intelloper.tistory.com/entry/code-smell</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uI0Ta/btsMNJQ4dbv/GWP16xPR5bQBQRFLL0dSmk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uI0Ta/btsMNJQ4dbv/GWP16xPR5bQBQRFLL0dSmk/img.webp&quot; data-alt=&quot;개발자라면 반드시 알아야 할 코드 스멜&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uI0Ta/btsMNJQ4dbv/GWP16xPR5bQBQRFLL0dSmk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuI0Ta%2FbtsMNJQ4dbv%2FGWP16xPR5bQBQRFLL0dSmk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 경험이 많은 개발자조차도 무심코 &quot;코드 스멜(Code Smells)&quot;을 만들어낼 수 있습니다. 코드 스멜은 코드베이스에서 더 깊은 문제를 암시하는 신호이며, 이를 방치하면 기술 부채, 성능 저하, 유지보수 비용 증가로 이어질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 흔히 나타나는 10가지 코드 스멜을 소개하고, 각각의 문제점과 해결 방법을 알아보겠습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 중복 코드 (Duplicate Code)&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;/li&gt;
&lt;li&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;중복된 코드를 재사용 가능한 함수, 클래스, 또는 모듈로 리팩토링하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DRY(Don&amp;rsquo;t Repeat Yourself) 원칙&lt;/b&gt;을 적용하여 반복을 최소화하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 긴 메서드 (Long Methods)&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;/li&gt;
&lt;li&gt;**단일 책임 원칙(SRP, Single Responsibility Principle)**을 위반할 가능성이 높습니다.&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;메서드를 더 작고 명확한 역할을 가진 메서드로 분리하세요.&lt;/li&gt;
&lt;li&gt;가독성과 재사용성을 높이기 위해 적절한 이름을 부여하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 큰 클래스 (Large Classes)&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;/li&gt;
&lt;li&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;클래스를 역할별로 나누어 &lt;b&gt;단일 책임 원칙&lt;/b&gt;을 적용하세요.&lt;/li&gt;
&lt;li&gt;관련 기능을 별도의 클래스로 이동하여 응집도를 높이세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 기능 편애 (Feature Envy)&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;특정 메서드가 다른 클래스의 데이터를 과도하게 참조하면 **캡슐화(encapsulation)**가 약해집니다.&lt;/li&gt;
&lt;li&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;해당 메서드를 가장 많이 사용하는 클래스로 이동하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;객체 지향 원칙(OOP)을 준수&lt;/b&gt;하여 데이터와 동작을 함께 관리하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 갓 오브젝트 (God Object)&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;/li&gt;
&lt;li&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;갓 오브젝트의 책임을 여러 개의 작은 클래스로 나누세요.&lt;/li&gt;
&lt;li&gt;역할별로 클래스를 분리하여 결합도를 낮추고 응집도를 높이세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 스위치 문 (Switch Statements)&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;/li&gt;
&lt;li&gt;**개방/폐쇄 원칙(OCP, Open/Closed Principle)**을 위반하여 확장성이 떨어집니다.&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;**다형성(Polymorphism)**을 활용해 조건문을 없애고 클래스로 대체하세요.&lt;/li&gt;
&lt;li&gt;**전략 패턴(Strategy Pattern)**을 사용하여 유연성을 높이세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 샷건 수술 (Shotgun Surgery)&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;/li&gt;
&lt;li&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;관련 기능을 한 곳으로 모아 **응집도(Cohesion)**를 높이세요.&lt;/li&gt;
&lt;li&gt;특정 기능을 담당하는 클래스를 만들어 변경 범위를 최소화하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 데이터 뭉치 (Data Clumps)&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;/li&gt;
&lt;li&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;관련된 데이터들을 하나의 &lt;b&gt;객체(Object)&lt;/b&gt; 또는 **구조체(Struct)**로 묶어 관리하세요.&lt;/li&gt;
&lt;li&gt;데이터의 의미를 명확하게 하고 재사용성을 높이세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 기본형 집착 (Primitive Obsession)&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;기본 데이터 타입(int, string 등)을 과도하게 사용하면 코드의 의미가 명확하지 않습니다.&lt;/li&gt;
&lt;li&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;의미 있는 **값 객체(Value Object)**를 만들어 도메인 개념을 명확히 표현하세요.&lt;/li&gt;
&lt;li&gt;**열거형(Enum)**을 사용해 가독성을 개선하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 죽은 코드 (Dead Code)&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;/li&gt;
&lt;li&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;정기적으로 **정적 분석 도구(Static Analysis Tools)**를 사용하여 불필요한 코드를 제거하세요.&lt;/li&gt;
&lt;li&gt;주석 처리된 코드 대신 버전 관리 시스템을 활용하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;p data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;정기적인 코드 리뷰(Code Review)를 수행하세요.&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;자동화된 테스트(Automated Testing)로 코드 품질을 검증하세요.&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;클린 코드 원칙과 디자인 패턴을 학습하고 적용하세요.&lt;/b&gt;&lt;br /&gt;✔ &lt;b&gt;기술 부채를 방치하지 말고 지속적으로 개선하세요.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  마무리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 스멜을 인식하고 해결하는 능력은 모든 소프트웨어 엔지니어에게 필수적인 기술입니다. 리팩토링을 통해 문제를 해결하면 코드가 더욱 깨끗하고 유지보수 가능하게 변합니다. 정기적인 코드 개선을 통해 건강한 코드베이스를 유지하세요!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742198818114&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;[Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일&quot; data-og-description=&quot;왜 클린 코드가 중요한가요?클린 코드는 단순히 &amp;quot;잘 보이는 코드&amp;quot;를 넘어, 협업의 효율성을 높이고 유지보수를 쉽게 만들어줍니다. 가독성이 높은 코드는 버그를 줄이고, 코드 리뷰 시간을 단축&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bjkEEr/hyYrQYZAjC/veoiMWj5dRNiF3NTkhjAt1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/boQ2iY/hyYqSCTeuE/9diSwsRcIu34kAgsMTilF1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bjkEEr/hyYrQYZAjC/veoiMWj5dRNiF3NTkhjAt1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/boQ2iY/hyYqSCTeuE/9diSwsRcIu34kAgsMTilF1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;왜 클린 코드가 중요한가요?클린 코드는 단순히 &quot;잘 보이는 코드&quot;를 넘어, 협업의 효율성을 높이고 유지보수를 쉽게 만들어줍니다. 가독성이 높은 코드는 버그를 줄이고, 코드 리뷰 시간을 단축&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742198791811&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742198876028&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&quot; data-og-description=&quot;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cGmqM3/hyYqWFrDrB/Fdc5sIdj5fWad6BdPkf7N1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/MIX3x/hyYujeDRqP/aHuAjz6kLkcvq27K4ES8yk/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cGmqM3/hyYqWFrDrB/Fdc5sIdj5fWad6BdPkf7N1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/MIX3x/hyYujeDRqP/aHuAjz6kLkcvq27K4ES8yk/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Architecture</category>
      <category>가독성</category>
      <category>기술부채</category>
      <category>리팩토링</category>
      <category>소프트웨어설계</category>
      <category>유지보수</category>
      <category>코드리뷰</category>
      <category>코드스멜</category>
      <category>클린코드</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/227</guid>
      <comments>https://intelloper.tistory.com/entry/code-smell#entry227comment</comments>
      <pubDate>Mon, 17 Mar 2025 17:09:31 +0900</pubDate>
    </item>
    <item>
      <title>PM2 Window server error (C:\PROGRAM FILES\NODEJS\NPM.CMD:1, :: Created by npm, please don't edit manually., SyntaxError: Unexpected token ':')</title>
      <link>https://intelloper.tistory.com/entry/PM2-Window-server-error-CPROGRAM-FILESNODEJSNPMCMD1-Created-by-npm-please-dont-edit-manually-SyntaxError-Unexpected-token</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ Windows 10에서 발생하는 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 같은 명령어를 &lt;b&gt;Windows 10&lt;/b&gt;에서 실행하면 문제가 발생할 수 있어요. 예를 들어, pm2 ls로 상태를 확인하면 &lt;b&gt;errored&lt;/b&gt; 상태가 뜨면서 다음과 같은 오류가 발생할 수 있습니다:&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zElE5/btsMLZue3vO/FKfBNq0gC9TSQTF1zWL5s1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zElE5/btsMLZue3vO/FKfBNq0gC9TSQTF1zWL5s1/img.png&quot; data-alt=&quot;C:\PROGRAM FILES\NODEJS\NPM.CMD:1, :: Created by npm, please don't edit manually., SyntaxError: Unexpected token ':'&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zElE5/btsMLZue3vO/FKfBNq0gC9TSQTF1zWL5s1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzElE5%2FbtsMLZue3vO%2FFKfBNq0gC9TSQTF1zWL5s1%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;700&quot; height=&quot;272&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;C:\PROGRAM FILES\NODEJS\NPM.CMD:1, :: Created by npm, please don't edit manually., SyntaxError: Unexpected token ':'&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;C:\Users\Administrator\.pm2\logs\testame-out.log last 15 lines:
C:\Users\Administrator\.pm2\logs\testame-error.log last 15 lines:
0|testame  | C:\PROGRAM FILES\NODEJS\NPM.CMD:1
0|testame  | :: Created by npm, please don't edit manually.
0|testame  | ^
0|testame  |
0|testame  | SyntaxError: Unexpected token ':'
0|testame  |     at Object.compileFunction (node:vm:360:18)
0|testame  |     at wrapSafe (node:internal/modules/cjs/loader:1088:15)
0|testame  |     at Module._compile (node:internal/modules/cjs/loader:1123:27)
0|testame  |     at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
0|testame  |     at Module.load (node:internal/modules/cjs/loader:1037:32)
0|testame  |     at Module._load (node:internal/modules/cjs/loader:878:12)
0|testame  |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
0|testame  |     at node:internal/main/run_main_module:23:47
0|testame  |
0|testame  | Node.js v18.12.0&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&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;Windows에서 PM2가 npm 명령어를 직접 실행할 때 &lt;b&gt;호환성 문제&lt;/b&gt;가 발생하기 때문이에요. 따라서 약간의 우회 작업이 필요합니다!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ Windows 10에서 PM2 해결 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows에서 PM2를 정상적으로 사용하려면 다음 단계를 따라주세요:&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 프로젝트 루트에 app.js 생성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;app.js라는 파일을 프로젝트 폴더에 만들어주세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ app.js에 실행 코드 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 app.js에 입력하세요. 이 코드는 npm run start를 실행하는 역할을 합니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const exec = require('child_process').exec;
const path = require('path');

const client = exec('npm run start', {
  windowsHide: true,
  cwd: path.join(__dirname, './'),
});

client.stdout.pipe(process.stdout);
client.stderr.pipe(process.stderr);
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ PM2로 실행하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMD(명령 프롬프트)에서 프로젝트 폴더로 이동한 후, 다음 명령어를 입력하세요:&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;pm2 start app.js
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 오류 없이 정상적으로 서버가 실행됩니다!  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  리눅스 vs Windows 사용법 비교&lt;/h2&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;pm2 start npm --name &quot;appName&quot; -- run start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Windows&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;app.js 파일을 만들어 실행해야 함 (pm2 start app.js)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;리눅스는 바로 실행 가능하지만, Windows에서는 추가 설정이 필요&lt;/b&gt;하다는 점을 기억하세요!  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PM2는 서버 운영을 &lt;b&gt;더 쉽고 안정적으로&lt;/b&gt; 만들어주는 멋진 도구예요. 하지만 운영체제에 따라 사용법이 약간 다를 수 있으니, 환경에 맞는 설정을 적용하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PM2를 잘 활용해서 여러분의 프로젝트를 &lt;b&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;&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;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742191331625&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dnUH9I/hyYqNIrEIc/xiHTKi9LSvKa6KgkP8ovn1/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/fBuS9/hyYqbo4YUP/5zkvtW21SqqjAPIcURXeb0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bWav1P/hyYup0cAR3/JcGBh3nrMC9TVPMZ3ZGkRK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dnUH9I/hyYqNIrEIc/xiHTKi9LSvKa6KgkP8ovn1/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/fBuS9/hyYqbo4YUP/5zkvtW21SqqjAPIcURXeb0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bWav1P/hyYup0cAR3/JcGBh3nrMC9TVPMZ3ZGkRK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[JavaScript] 프론트엔드 개발자를 위한 함수형 프로그래밍(functional programming)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742191341280&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;[JavaScript] 프론트엔드 개발자를 위한 함수형 프로그래밍(functional programming)&quot; data-og-description=&quot;JavaScript 개발자를 위한 함수형 프로그래밍JavaScript는 다양한 스타일로 코드를 작성할 수 있는 유연한 언어입니다. 명령형(imperative), 객체 지향(object-oriented), 그리고 함수형(functional) 프로그래밍 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xMYzJ/hyYqbbz9De/FlMcgt6g7gkUSuPwykM9rk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bLftQJ/hyYrVssprR/U8o2LUkikKKRnGDRckunE0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/msC80/hyYugCc5UQ/ellnAO60V6zKKj4CEdP2VK/img.png?width=1536&amp;amp;height=1536&amp;amp;face=0_0_1536_1536&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/javascript-functional-programming&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xMYzJ/hyYqbbz9De/FlMcgt6g7gkUSuPwykM9rk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bLftQJ/hyYrVssprR/U8o2LUkikKKRnGDRckunE0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/msC80/hyYugCc5UQ/ellnAO60V6zKKj4CEdP2VK/img.png?width=1536&amp;amp;height=1536&amp;amp;face=0_0_1536_1536');&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;[JavaScript] 프론트엔드 개발자를 위한 함수형 프로그래밍(functional programming)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript 개발자를 위한 함수형 프로그래밍JavaScript는 다양한 스타일로 코드를 작성할 수 있는 유연한 언어입니다. 명령형(imperative), 객체 지향(object-oriented), 그리고 함수형(functional) 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742191357785&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>WINDOW-SERVER/ELLOR LOG</category>
      <category>0|testame  | :: created by npm</category>
      <category>0|testame  | syntaxerror: unexpected token ':'</category>
      <category>please don't edit manually.</category>
      <category>pm2</category>
      <category>window pm2 안되요</category>
      <category>window server pm2</category>
      <category>window10 pm2</category>
      <category>wndow pm2 에러</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/226</guid>
      <comments>https://intelloper.tistory.com/entry/PM2-Window-server-error-CPROGRAM-FILESNODEJSNPMCMD1-Created-by-npm-please-dont-edit-manually-SyntaxError-Unexpected-token#entry226comment</comments>
      <pubDate>Mon, 17 Mar 2025 15:03:10 +0900</pubDate>
    </item>
    <item>
      <title>'pm2'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다.</title>
      <link>https://intelloper.tistory.com/entry/pm2%EC%9D%80%EB%8A%94-%EB%82%B4%EB%B6%80-%EB%98%90%EB%8A%94-%EC%99%B8%EB%B6%80-%EB%AA%85%EB%A0%B9-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%98%90%EB%8A%94%EB%B0%B0%EC%B9%98-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EC%95%84%EB%8B%99%EB%8B%88%EB%8B%A4</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Window CMD에서 'pm2'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 해결법.&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;pm2를 글로벌(-g)로 설치했지만, cmd에서 실행되지 않는 경우 &lt;b&gt;환경 변수(PATH) 문제&lt;/b&gt;일 가능성이 높음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  해결 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1️⃣ 현재 npm 글로벌 경로 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 pm2가 어느 경로에 있는지 확인:&lt;/p&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;npm root -g
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;출력 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Users\Administrator\AppData\Roaming\npm\node_modules
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  pm2 실행 파일(pm2.cmd)은 C:\Users\Administrator\AppData\Roaming\npm에 있을 가능성이 높음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2️⃣ npm bin -g 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;npm bin -g
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;출력 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Users\Administrator\AppData\Roaming\npm
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  이 경로가 **환경 변수(PATH)**에 포함되어 있어야 pm2를 실행할 수 있음.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3️⃣ 환경 변수(PATH)에 npm 경로 추가&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;자동으로 추가하기 (CMD에서 실행)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;setx PATH &quot;%PATH%;C:\Users\Administrator\AppData\Roaming\npm&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  C:\Users\Administrator\AppData\Roaming\npm은 위에서 npm bin -g 실행 후 확인한 경로로 변경해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;CMD를 다시 열고 pm2 list 실행!&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;pm2 list
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 실행되면 해결 완료!  &lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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;u&gt;&lt;b&gt;아래처럼 에러가 뜬다면!&lt;/b&gt;&lt;/u&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;setx PATH &quot;%PATH%;C:\Users\Administrator\AppData\Roaming\npm&quot;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;'setx'은(는)&amp;nbsp;내부&amp;nbsp;또는&amp;nbsp;외부&amp;nbsp;명령,&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로그램,&amp;nbsp;또는&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;배치&amp;nbsp;파일이&amp;nbsp;아닙니다.&lt;/b&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;803&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmNbKi/btsMMHfd3v2/N5BF71w9L3XH5jOzpxSDqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmNbKi/btsMMHfd3v2/N5BF71w9L3XH5jOzpxSDqk/img.png&quot; data-alt=&quot;'setx'은(는)&amp;amp;nbsp;내부&amp;amp;nbsp;또는&amp;amp;nbsp;외부&amp;amp;nbsp;명령,&amp;amp;nbsp;실행할&amp;amp;nbsp;수&amp;amp;nbsp;있는&amp;amp;nbsp;프로그램,&amp;amp;nbsp;또는 배치&amp;amp;nbsp;파일이&amp;amp;nbsp;아닙니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmNbKi/btsMMHfd3v2/N5BF71w9L3XH5jOzpxSDqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmNbKi%2FbtsMMHfd3v2%2FN5BF71w9L3XH5jOzpxSDqk%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;700&quot; height=&quot;136&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;'setx'은(는)&amp;nbsp;내부&amp;nbsp;또는&amp;nbsp;외부&amp;nbsp;명령,&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로그램,&amp;nbsp;또는 배치&amp;nbsp;파일이&amp;nbsp;아닙니다.&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;setx PATH &quot;%PATH%;C:\Windows\System32\WindowsPowerShell\v1.0&quot;setx : 'setx' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다.&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742188856196&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;setx PATH &amp;quot;%PATH%;C:\Windows\System32\WindowsPowerShell\v1.0&amp;quot;setx : 'setx' 용어가 cmdlet, 함수, 스크립트 파일 또는 &quot; data-og-description=&quot;'setx'&amp;nbsp;용어가&amp;nbsp;cmdlet,&amp;nbsp;함수,&amp;nbsp;스크립트&amp;nbsp;파일&amp;nbsp;또는&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로그램&amp;nbsp;이름으로&amp;nbsp;인식되지&amp;nbsp;않습니다.후.. cmd에서 powershell 딱치면 넘어가야되는데 그거 되게 하는게 힘들죠? 제 솔루션 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cVGINx/hyYrYiom6q/ijAumlRPgLUmAK9tVZ8rW0/img.png?width=800&amp;amp;height=102&amp;amp;face=0_0_800_102,https://scrap.kakaocdn.net/dn/cAyMfz/hyYulcqIVX/nCK1mQv2RwjZ6yvki5ca81/img.png?width=800&amp;amp;height=102&amp;amp;face=0_0_800_102&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cVGINx/hyYrYiom6q/ijAumlRPgLUmAK9tVZ8rW0/img.png?width=800&amp;amp;height=102&amp;amp;face=0_0_800_102,https://scrap.kakaocdn.net/dn/cAyMfz/hyYulcqIVX/nCK1mQv2RwjZ6yvki5ca81/img.png?width=800&amp;amp;height=102&amp;amp;face=0_0_800_102');&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;setx PATH &quot;%PATH%;C:\Windows\System32\WindowsPowerShell\v1.0&quot;setx : 'setx' 용어가 cmdlet, 함수, 스크립트 파일 또는&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;'setx'&amp;nbsp;용어가&amp;nbsp;cmdlet,&amp;nbsp;함수,&amp;nbsp;스크립트&amp;nbsp;파일&amp;nbsp;또는&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로그램&amp;nbsp;이름으로&amp;nbsp;인식되지&amp;nbsp;않습니다.후.. cmd에서 powershell 딱치면 넘어가야되는데 그거 되게 하는게 힘들죠? 제 솔루션&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;powershell에서 **시스템 환경 변수(PATH)**에 npm 글로벌 경로를 추가해보세요.&lt;/p&gt;
&lt;pre id=&quot;code_1742188882628&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;powershell&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1742188888254&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable(&quot;PATH&quot;, $env:PATH + &quot;;C:\Users\Administrator\AppData\Roaming\npm&quot;, [System.EnvironmentVariableTarget]::Machine)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1742188927724&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 재부팅
C:\Windows\System32\shutdown.exe /r /f /t 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWcWVw/btsMNKPCfj6/rkKvi8ALKNka2o41vle3Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWcWVw/btsMNKPCfj6/rkKvi8ALKNka2o41vle3Y0/img.png&quot; data-alt=&quot;[System.Environment]::SetEnvironmentVariable(&amp;quot;PATH&amp;quot;, $env:PATH + &amp;quot;;C:\Users\Administrator\AppData\Roaming\npm&amp;quot;, [System.EnvironmentVariableTarget]::Machine)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWcWVw/btsMNKPCfj6/rkKvi8ALKNka2o41vle3Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWcWVw%2FbtsMNKPCfj6%2FrkKvi8ALKNka2o41vle3Y0%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;700&quot; height=&quot;86&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[System.Environment]::SetEnvironmentVariable(&quot;PATH&quot;, $env:PATH + &quot;;C:\Users\Administrator\AppData\Roaming\npm&quot;, [System.EnvironmentVariableTarget]::Machine)&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 contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;b&gt;4️⃣ 직접 환경 변수 수정 (수동 방법)&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Win + R &amp;rarr; sysdm.cpl 입력 후 Enter&lt;/li&gt;
&lt;li&gt;고급 탭 &amp;rarr; 환경 변수&lt;/li&gt;
&lt;li&gt;시스템 변수에서 Path 선택 &amp;rarr; 편집&lt;/li&gt;
&lt;li&gt;&quot;C:\Users\Administrator\AppData\Roaming\npm&quot; 추가&lt;/li&gt;
&lt;li&gt;&lt;b&gt;CMD 다시 실행 후&lt;/b&gt; pm2 list 실행&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 pm2가 정상적으로 실행될 것임!  &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;b&gt;&lt;br /&gt;추천 드리는 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742189259128&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/W7ve4/hyYrUtyIVq/gS3FY2mWBXBGqk8PMUho80/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/fD8nC/hyYqUAEK3o/M1JQyaH9W0ZmsQ4jnOyg91/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/W7ve4/hyYrUtyIVq/gS3FY2mWBXBGqk8PMUho80/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/fD8nC/hyYqUAEK3o/M1JQyaH9W0ZmsQ4jnOyg91/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;[Python/정보] - 시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742189254800&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742189257262&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dnUH9I/hyYqNIrEIc/xiHTKi9LSvKa6KgkP8ovn1/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/fBuS9/hyYqbo4YUP/5zkvtW21SqqjAPIcURXeb0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bWav1P/hyYup0cAR3/JcGBh3nrMC9TVPMZ3ZGkRK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dnUH9I/hyYqNIrEIc/xiHTKi9LSvKa6KgkP8ovn1/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/fBuS9/hyYqbo4YUP/5zkvtW21SqqjAPIcURXeb0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bWav1P/hyYup0cAR3/JcGBh3nrMC9TVPMZ3ZGkRK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>WINDOW-SERVER/ELLOR LOG</category>
      <category>$env:path + &amp;quot;;c:\users\administrator\appdata\roaming\npm&amp;quot;</category>
      <category>'setx'은(는) 내부 또는 외부 명령</category>
      <category>setx path &amp;quot;%path%;c:\users\administrator\appdata\roaming\npm&amp;quot;</category>
      <category>window pm2 설치</category>
      <category>[system.environmentvariabletarget]::machine)</category>
      <category>[system.environment]::setenvironmentvariable(&amp;quot;path&amp;quot;</category>
      <category>또는 배치 파일이 아닙니다.</category>
      <category>윈도우 pm2 설치</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/225</guid>
      <comments>https://intelloper.tistory.com/entry/pm2%EC%9D%80%EB%8A%94-%EB%82%B4%EB%B6%80-%EB%98%90%EB%8A%94-%EC%99%B8%EB%B6%80-%EB%AA%85%EB%A0%B9-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%98%90%EB%8A%94%EB%B0%B0%EC%B9%98-%ED%8C%8C%EC%9D%BC%EC%9D%B4-%EC%95%84%EB%8B%99%EB%8B%88%EB%8B%A4#entry225comment</comments>
      <pubDate>Mon, 17 Mar 2025 14:26:27 +0900</pubDate>
    </item>
    <item>
      <title>[Python 팁] list는 아는데 deque 모르면 주니어.</title>
      <link>https://intelloper.tistory.com/entry/python-list-vs-deque</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Frame34478.webp&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5gSQq/btsMNBdSZJ2/9O3rl9XoJPxFxzvkTsdyP0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5gSQq/btsMNBdSZJ2/9O3rl9XoJPxFxzvkTsdyP0/img.webp&quot; data-alt=&quot;[Python 팁] list는 아는데 deque 모르면 주니어.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5gSQq/btsMNBdSZJ2/9O3rl9XoJPxFxzvkTsdyP0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5gSQq%2FbtsMNBdSZJ2%2F9O3rl9XoJPxFxzvkTsdyP0%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;512&quot; height=&quot;512&quot; data-filename=&quot;Frame34478.webp&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Python 팁] list는 아는데 deque 모르면 주니어.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;우리는 매일 코드에서 리스트(list)를 사용하죠. 하지만 많은 개발자들이 아주 간단하면서도 코드를 더 빠르고 효율적으로 만들어 줄 리스트 트릭을 놓치고 있다는 사실, 알고 계셨나요?  &lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;저도 이 방법을 1년 넘게 무시했었는데요, 어느 날 제 실수를 깨닫고 나서부터는 이 간단한 기술에 푹 빠졌습니다. 오늘은 여러분께 리스트의 문제점을 설명하고, 그 해결책을 소개한 뒤, 실제 증거까지 보여드릴게요.&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;그럼, 시작해 볼까요?  &lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  리스트의 문제: 느린 연산 속도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 리스트는 정말 훌륭합니다. 하지만 딱 한 가지 약점이 있죠:&lt;br /&gt;&lt;b&gt;시작 부분에서 요소를 삽입하거나 삭제할 때 속도가 느리다&lt;/b&gt;는 점입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 볼까요? 다음과 같은 리스트가 있다고 해봅시다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;numbers = [1, 2, 3, 4, 5]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에 맨 앞에 숫자를 추가하려면 이렇게 하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;numbers.insert(0, 99)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 리스트는 [99, 1, 2, 3, 4, 5]가 되겠죠.&lt;br /&gt;하지만 여기서 문제는, 파이썬이 99를 추가하기 위해 기존의 모든 요소를 오른쪽으로 한 칸씩 밀어야 한다는 점이에요.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;작은 리스트라면 큰 문제가 없지만, 리스트가 커질수록 속도 저하가 심각해집니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 해결책: deque를 활용하세요!  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다행히 파이썬에는 이 문제를 해결할 수 있는 &lt;b&gt;비밀 병기&lt;/b&gt;가 있습니다. 바로 **collections 모듈의 deque(double-ended queue, 양방향 큐)**입니다.&lt;br /&gt;deque는 양쪽 끝에서의 삽입과 삭제를 빠르게 처리하도록 최적화되어 있어요.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용법은 매우 간단합니다.  &lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from collections import deque
numbers = deque([1, 2, 3, 4, 5])
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 맨 앞에 숫자를 추가하려면?&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;numbers.appendleft(99)
print(numbers)  # deque([99, 1, 2, 3, 4, 5])
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;놀랍게도, deque는 요소를 밀거나 기다릴 필요 없이 &lt;b&gt;즉시 삽입&lt;/b&gt;을 완료합니다.  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ 왜 deque가 더 빠를까요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 차이를 이해하려면 리스트와 deque의 내부 구조를 알아야 합니다.  &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  리스트(list) vs. deque&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;리스트 (list)&lt;/td&gt;
&lt;td&gt;배열 (array)&lt;/td&gt;
&lt;td&gt;⏳ O(n) (느림)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;deque&lt;/td&gt;
&lt;td&gt;연결 리스트 (linked list)&lt;/td&gt;
&lt;td&gt;⚡ O(1) (빠름)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  속도 비교 테스트&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 비교해 보았습니다. 리스트와 deque의 &lt;b&gt;맨 앞 삽입 속도&lt;/b&gt;를 측정해 보면?&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;from collections import deque
import time

# 큰 리스트 생성
size = 100_000
lst = list(range(size))
dq = deque(range(size))

# 리스트 삽입 속도
start = time.time()
lst.insert(0, -1)
end = time.time()
print(f&quot;리스트 insert(0, -1) 수행 시간: {end - start:.6f}초&quot;)

# deque 삽입 속도
start = time.time()
dq.appendleft(-1)
end = time.time()
print(f&quot;deque appendleft(-1) 수행 시간: {end - start:.6f}초&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로, deque의 삽입 속도가 &lt;b&gt;리스트보다 훨씬 빠르다&lt;/b&gt;는 걸 확인할 수 있습니다.  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  언제 deque를 써야 할까요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 deque의 장점을 알았으니, 언제 사용하면 좋을지 정리해 볼게요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ deque를 추천하는 경우:&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;**큐(queue)**처럼 빠른 연산이 필요한 경우&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;b&gt;맨 뒤에서 요소를 추가/삭제&lt;/b&gt;할 때&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임의 접근(예: list[i])이 자주 필요&lt;/b&gt;할 때 (deque는 인덱스 접근이 리스트보다 느립니다)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 간단한 트릭 하나만 알아도, &lt;b&gt;코드의 효율성을 크게 높일 수 있습니다.&lt;/b&gt;  &lt;br /&gt;저는 deque를 발견한 뒤로 리스트의 단점을 보완하며 더 스마트하게 코드를 작성하고 있습니다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분도 &lt;b&gt;다음 프로젝트에서 리스트 연산이 느리다고 느껴진다면, deque를 한 번 시도해 보세요.&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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742170853266&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&quot; data-og-description=&quot;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wb8lb/hyYueqOHiN/qMPSabFXPuqOJs5sEBsjb1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cRWYBo/hyYumPU9iU/VgyNHNo5rGvsAQd9o8uYo1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wb8lb/hyYueqOHiN/qMPSabFXPuqOJs5sEBsjb1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cRWYBo/hyYumPU9iU/VgyNHNo5rGvsAQd9o8uYo1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742170866387&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bHYC0c/hyYqP7jn6e/zRT8kaAlSDF4gAFBThIQk1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/brsChl/hyYrPFHyON/1bZTEecvy3FEGRq5XQge2K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(Python 성능 향상) concurrent.futures 동시 프로그래밍 모듈로 속도 개선해보자!&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1742170891682&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;(Python 성능 향상) concurrent.futures 동시 프로그래밍 모듈로 속도 개선해보자!&quot; data-og-description=&quot;성능에 대해서는 프로그램을 만들고 나서나 기능 개발이 완료되고 나서나 작동이 잘되는것을 확인했는데 속도가 아쉽다면 항상 고민을 하게 됩니다.우리는 더 나은 품질에 빠릿빠릿한 프로그&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/8x9cL/hyYuljaCUv/nRWmWWFtRusjHuAHpy4gs1/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/u7c7a/hyYqP7joiu/LM84i93RK3T4zMP9uBTaYK/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/2gbrP/hyYrS3uNnJ/QKDBFEBDpYA7KfLlqK7JzK/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/8x9cL/hyYuljaCUv/nRWmWWFtRusjHuAHpy4gs1/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/u7c7a/hyYqP7joiu/LM84i93RK3T4zMP9uBTaYK/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/2gbrP/hyYrS3uNnJ/QKDBFEBDpYA7KfLlqK7JzK/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532');&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;(Python 성능 향상) concurrent.futures 동시 프로그래밍 모듈로 속도 개선해보자!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;성능에 대해서는 프로그램을 만들고 나서나 기능 개발이 완료되고 나서나 작동이 잘되는것을 확인했는데 속도가 아쉽다면 항상 고민을 하게 됩니다.우리는 더 나은 품질에 빠릿빠릿한 프로그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/문법</category>
      <category>deque</category>
      <category>Python deque</category>
      <category>python list</category>
      <category>python list 느림</category>
      <category>python 대용량 리스트</category>
      <category>python 대용량 배열</category>
      <category>python 대용량 처리</category>
      <category>python 빠른 list</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/224</guid>
      <comments>https://intelloper.tistory.com/entry/python-list-vs-deque#entry224comment</comments>
      <pubDate>Mon, 17 Mar 2025 09:22:55 +0900</pubDate>
    </item>
    <item>
      <title>setx PATH &amp;quot;%PATH%;C:\Windows\System32\WindowsPowerShell\v1.0&amp;quot;setx : 'setx' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다.</title>
      <link>https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%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;&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;1245&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chqofD/btsMKCSVIxT/KUwlc0uhBcWVppTwUwxE7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chqofD/btsMKCSVIxT/KUwlc0uhBcWVppTwUwxE7K/img.png&quot; data-alt=&quot;window CMD Error: 'setx' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chqofD/btsMKCSVIxT/KUwlc0uhBcWVppTwUwxE7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchqofD%2FbtsMKCSVIxT%2FKUwlc0uhBcWVppTwUwxE7K%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;1245&quot; height=&quot;159&quot; data-origin-width=&quot;1245&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window CMD Error: 'setx' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는 프로그램 이름으로 인식되지 않습니다.&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: #ee2323;&quot;&gt;&lt;b&gt;'setx'&amp;nbsp;용어가&amp;nbsp;cmdlet,&amp;nbsp;함수,&amp;nbsp;스크립트&amp;nbsp;파일&amp;nbsp;또는&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;프로그램&amp;nbsp;이름으로&amp;nbsp;인식되지&amp;nbsp;않습니다.&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;후.. cmd에서 powershell 딱치면 넘어가야되는데 그거 되게 하는게 힘들죠? 제 솔루션 따라해봅시다.&lt;/b&gt;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;우선 PowerShell 접속부터 해봅시다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id=&quot;toc-link-0&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;전체 경로로 PowerShell 실행하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위 방법이 작동하지 않거나 시스템을 재시작해야 하는 상황이라면, &lt;b&gt;전체 경로&lt;/b&gt;를 사용하여 PowerShell을 바로 실행할 수 있습니다. 아래 명령어를 입력하세요:&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1741940943552&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe​&lt;/code&gt;&lt;/pre&gt;
&lt;br /&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어를 실행하면 PowerShell이 바로 실행됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-origin-height=&quot;168&quot; data-origin-width=&quot;1016&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci5KeE/btsMKqkxZdF/RCEJqJSTXlg1g30yZn9fW0/img.png&quot; width=&quot;1016&quot; height=&quot;168&quot; data-phocus-index=&quot;1&quot; data-origin-height=&quot;168&quot; data-origin-width=&quot;1016&quot; /&gt;&lt;/figure&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;혹시나 powershell에서 오류 났다면&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setx 명령어가 인식되지 않는 오류가 발생하는 이유는 &lt;b&gt;PowerShell&lt;/b&gt;에서 setx 명령어를 사용할 수 없기 때문입니다. setx는 **cmd**에서만 작동하는 명령어입니다. &lt;b&gt;PowerShell&lt;/b&gt;에서는 setx가 기본적으로 사용할 수 없고, 대신 **[System.Environment]::SetEnvironmentVariable**을 사용하여 환경 변수를 설정해야 합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&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;b&gt;[PowerShell에서!!] PATH에 PowerShell 경로 추가하기 이걸로 해결!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PowerShell에서 setx와 동일한 작업을 하려면, &lt;b&gt;다음 명령어&lt;/b&gt;를 사용하여 PATH 환경 변수에 PowerShell 경로를 추가할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;[System.Environment]::SetEnvironmentVariable(&quot;PATH&quot;, $env:PATH + &quot;;C:\Windows\System32\WindowsPowerShell\v1.0&quot;, [System.EnvironmentVariableTarget]::Machine)
&lt;/code&gt;&lt;/pre&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;$env:PATH&lt;/b&gt;: 현재 시스템 환경 변수인 PATH를 가져옵니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;;C:\Windows\System32\WindowsPowerShell\v1.0&lt;/b&gt;: PowerShell 경로를 추가합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[System.EnvironmentVariableTarget]::Machine&lt;/b&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;b&gt;PowerShell을 관리자 권한으로 실행&lt;/b&gt;해야 합니다. 그렇지 않으면 환경 변수 변경이 실패할 수 있습니다.&lt;/li&gt;
&lt;li&gt;명령을 실행한 후 새로운 &lt;b&gt;cmd&lt;/b&gt; 또는 &lt;b&gt;PowerShell&lt;/b&gt; 세션을 시작해야 변경된 PATH 환경 변수가 반영됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;u&gt;&lt;i&gt;&lt;b&gt;재부팅 꼭하세요&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/span&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;PowerShell에서는 setx를 사용할 수 없으므로, 위의 방법을 사용하여 &lt;b&gt;PATH 환경 변수&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;&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;b&gt;&lt;br /&gt;추천 드리는 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741941132993&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWWUx/hyYqNOJPOL/LTSBvJVBzf2Lyzrg7poa7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/451J2/hyYr4vCncL/biezMNy7lM86rQBbnT7oVk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWWUx/hyYqNOJPOL/LTSBvJVBzf2Lyzrg7poa7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/451J2/hyYr4vCncL/biezMNy7lM86rQBbnT7oVk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;[Python/정보] - 시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741941135933&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl1XrU/hyYqQLtknC/KAM6Pe4UG33QKVYK6rXmTK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/otMkU/hyYqOz7haE/jfBHP8c7qOo5yHhJuQSlF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl1XrU/hyYqQLtknC/KAM6Pe4UG33QKVYK6rXmTK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/otMkU/hyYqOz7haE/jfBHP8c7qOo5yHhJuQSlF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741941137513&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ed8wx/hyYqMI658r/xLPuhNVtuJ4TB3Zc8ja3Ck/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/MH4c3/hyYrWxysQR/OG8DqUa41K7yVfElZsD370/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/BinGQ/hyYqapCo2X/nbhrnJHfbkGwWgGF8baerK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ed8wx/hyYqMI658r/xLPuhNVtuJ4TB3Zc8ja3Ck/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/MH4c3/hyYrWxysQR/OG8DqUa41K7yVfElZsD370/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/BinGQ/hyYqapCo2X/nbhrnJHfbkGwWgGF8baerK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&amp;nbsp;&lt;/p&gt;</description>
      <category>WINDOW-SERVER/ELLOR LOG</category>
      <category>$env:path + &amp;quot;;c:\windows\system32\windowspowershell\v1.0&amp;quot;</category>
      <category>c:\windows\system32\windowspowershell\v1.0\powershell.exe​</category>
      <category>setx path &amp;quot;%path%;c:\windows\system32\windowspowershell\v1.0&amp;quot;setx : 'setx' 용어가 cmdlet</category>
      <category>[system.environmentvariabletarget]::machine)</category>
      <category>[system.environment]::setenvironmentvariable(&amp;quot;path&amp;quot;</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/223</guid>
      <comments>https://intelloper.tistory.com/entry/setx-%EC%9A%A9%EC%96%B4%EA%B0%80-cmdlet-%ED%95%A8%EC%88%98-%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%8C%8C%EC%9D%BC-%EB%98%90%EB%8A%94-%EC%8B%A4%ED%96%89%ED%95%A0-%EC%88%98-%EC%9E%88%EB%8A%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%9D%B4%EB%A6%84%EC%9C%BC%EB%A1%9C-%EC%9D%B8%EC%8B%9D%EB%90%98%EC%A7%80-%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4#entry223comment</comments>
      <pubDate>Fri, 14 Mar 2025 17:34:38 +0900</pubDate>
    </item>
    <item>
      <title>[WINDOW CLI]Window Server에서 CMD에서 NVM 설치해보자</title>
      <link>https://intelloper.tistory.com/entry/WINDOW-CMD-NVM-install</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqymZB/btsMLLnSEsw/XLUW4yxM0jiW3VN91CZCX0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqymZB/btsMLLnSEsw/XLUW4yxM0jiW3VN91CZCX0/img.webp&quot; data-alt=&quot;[WINDOW CLI]Window Server에서 CMD에서 NVM 설치해보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqymZB/btsMLLnSEsw/XLUW4yxM0jiW3VN91CZCX0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqymZB%2FbtsMLLnSEsw%2FXLUW4yxM0jiW3VN91CZCX0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[WINDOW CLI]Window Server에서 CMD에서 NVM 설치해보자&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;&lt;b&gt;명령 프롬프트(cmd)에서 직접 NVM을 설치하는 방법&lt;/b&gt;을 알려드리겠습니다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. NVM 설치 파일 다운로드 (명령어 사용)&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;cmd를 열고 아래 명령어 실행해서 최신 설치 파일 다운로드:&amp;nbsp;  &lt;b&gt;설명:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;curl -LO는 파일을 다운로드하는 명령어입니다.&lt;/li&gt;
&lt;li&gt;최신 버전의 nvm-setup.exe를 현재 디렉터리에 다운로드합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li class=&quot;awk&quot;&gt;&lt;code&gt;curl -LO https://github.com/coreybutler/nvm-windows/releases/latest/download/nvm-setup.exe
&lt;/code&gt;&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;1221&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnzhTI/btsMKqqUNLn/irOXeZKuw8tBxOyZ9fLKj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnzhTI/btsMKqqUNLn/irOXeZKuw8tBxOyZ9fLKj1/img.png&quot; data-alt=&quot;window cmd nvm install&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnzhTI/btsMKqqUNLn/irOXeZKuw8tBxOyZ9fLKj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnzhTI%2FbtsMKqqUNLn%2FirOXeZKuw8tBxOyZ9fLKj1%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;1221&quot; height=&quot;142&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd nvm install&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. NVM 설치 파일 실행 (명령어 사용)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드한 nvm-setup.exe를 실행하려면:&lt;/p&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;start nvm-setup.exe
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjM3ZC/btsMKvlnuiQ/P8o3TpOFk4Tzv8APxslZck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjM3ZC/btsMKvlnuiQ/P8o3TpOFk4Tzv8APxslZck/img.png&quot; data-alt=&quot;window cmd nvm-setup.exe install&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjM3ZC/btsMKvlnuiQ/P8o3TpOFk4Tzv8APxslZck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjM3ZC%2FbtsMKvlnuiQ%2FP8o3TpOFk4Tzv8APxslZck%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;845&quot; height=&quot;94&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd nvm-setup.exe install&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 실행하면 GUI 설치 창이 뜰 거야. 여기서 일반적인 설치 과정을 따라가면 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 설치 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 &lt;u&gt;&lt;i&gt;&lt;b&gt;cmd를 다시 열고&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd 다시 안열면 아래처럼 nvm 실행 오류 납니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lb2O6/btsMLyIrS0y/TSndT6wI6BYJlr0aTiK7sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lb2O6/btsMLyIrS0y/TSndT6wI6BYJlr0aTiK7sk/img.png&quot; data-alt=&quot;window cmd nvm version error&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lb2O6/btsMLyIrS0y/TSndT6wI6BYJlr0aTiK7sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLb2O6%2FbtsMLyIrS0y%2FTSndT6wI6BYJlr0aTiK7sk%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;601&quot; height=&quot;65&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd nvm version error&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;nvm version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;65&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctX2BZ/btsMKcGo4vS/GCxBkX8itJxQvddf0T2NHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctX2BZ/btsMKcGo4vS/GCxBkX8itJxQvddf0T2NHk/img.png&quot; data-alt=&quot;window cmd nvm version running&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctX2BZ/btsMKcGo4vS/GCxBkX8itJxQvddf0T2NHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctX2BZ%2FbtsMKcGo4vS%2FGCxBkX8itJxQvddf0T2NHk%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;601&quot; height=&quot;65&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;65&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd nvm version running&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 실행해서 정상적으로 설치되었는지 확인합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;%NVM_HOME%과 %NVM_SYMLINK%가 정상적으로 설정되지 않아서 NVM이 settings.txt 파일을 찾지 못하는 상태입니다.아래 방법을 그대로 따라 해보세요!  &lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  1️⃣ 환경 변수 직접 설정 (CMD에서 적용이 안 되는 문제 해결)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령 프롬프트(cmd)에서는 %NVM_HOME%이 바로 적용되지 않는 경우가 있습니다.&lt;br /&gt;아래 명령어를 실행해 수동으로 값을 설정해줍니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;set NVM_HOME=C:\nvm
set NVM_SYMLINK=C:\Program Files\nodejs
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;제대로 설정됐는지 확인:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;code&gt;echo %NVM_HOME%
echo %NVM_SYMLINK%
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과가 C:\nvm과 C:\Program Files\nodejs로 나와야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  2️⃣ 환경 변수 시스템에 영구 저장 (재부팅해도 유지됨)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음으로, 환경 변수를 영구적으로 등록해줍니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;setx NVM_HOME &quot;C:\nvm&quot; /M
setx NVM_SYMLINK &quot;C:\Program Files\nodejs&quot; /M
setx PATH &quot;%NVM_HOME%;%NVM_SYMLINK%;&quot; /M
&lt;/code&gt;&lt;/pre&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;/M 옵션은 시스템 전체에 적용되도록 설정하는 거야.&lt;/li&gt;
&lt;li&gt;이렇게 하면 새로운 cmd를 열었을 때도 환경 변수가 유지돼.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;새로운 cmd 창을 열고 다시 확인:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;dos&quot;&gt;&lt;code&gt;echo %NVM_HOME%
echo %NVM_SYMLINK%
&lt;/code&gt;&lt;/pre&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;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7Kqw/btsMJkrJAJB/1sX5G9J7DAlKgkHdOjECX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7Kqw/btsMJkrJAJB/1sX5G9J7DAlKgkHdOjECX1/img.png&quot; data-alt=&quot;window cmd echo NVM_HOME, NVM_SYMLINK&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7Kqw/btsMJkrJAJB/1sX5G9J7DAlKgkHdOjECX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7Kqw%2FbtsMJkrJAJB%2F1sX5G9J7DAlKgkHdOjECX1%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;662&quot; height=&quot;142&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd echo NVM_HOME, NVM_SYMLINK&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;u&gt;  만약 여전히 %NVM_HOME% 그대로 나오면 &lt;b&gt;Windows를 재부팅하고 다시 시도&lt;/b&gt;해 보세요.&lt;/u&gt;&lt;/i&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;b&gt;재부팅 명령어:&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741935866987&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;C:\Windows\System32\shutdown.exe /r /f /t 0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  3️⃣ settings.txt 파일 수동 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 C:\nvm\settings.txt 파일을 만들어주자.&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;mkdir C:\nvm
echo root: C:\nvm &amp;gt; C:\nvm\settings.txt
echo path: C:\Program Files\nodejs &amp;gt;&amp;gt; C:\nvm\settings.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;파일이 잘 생성되었는지 확인:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;type C:\nvm\settings.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  root: C:\nvm&lt;br /&gt;  path: C:\Program Files\nodejs&lt;br /&gt;이렇게 표시되면 정상적으로 설정된 거야.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  4️⃣ NVM 다시 실행&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 nvm install을 실행해봐.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;nvm install 18.17.1
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되면 사용하고 싶은 Node.js 버전을 적용해야 해.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;nvm use 18.17.1
node -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q321O/btsMKPqUfo4/ePwdkAiqvJfxI6XygeAq0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q321O/btsMKPqUfo4/ePwdkAiqvJfxI6XygeAq0K/img.png&quot; data-alt=&quot;window cmd nvm install&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q321O/btsMKPqUfo4/ePwdkAiqvJfxI6XygeAq0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq321O%2FbtsMKPqUfo4%2FePwdkAiqvJfxI6XygeAq0K%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;676&quot; height=&quot;167&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd nvm install&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;70&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bby2lw/btsMKIeqp4K/vskLBdHoH3jyS9NKI0xJB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bby2lw/btsMKIeqp4K/vskLBdHoH3jyS9NKI0xJB0/img.png&quot; data-alt=&quot;window cmd node -v&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bby2lw/btsMKIeqp4K/vskLBdHoH3jyS9NKI0xJB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbby2lw%2FbtsMKIeqp4K%2FvskLBdHoH3jyS9NKI0xJB0%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;631&quot; height=&quot;70&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;70&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;window cmd node -v&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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741937999311&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWWUx/hyYqNOJPOL/LTSBvJVBzf2Lyzrg7poa7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/451J2/hyYr4vCncL/biezMNy7lM86rQBbnT7oVk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWWUx/hyYqNOJPOL/LTSBvJVBzf2Lyzrg7poa7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/451J2/hyYr4vCncL/biezMNy7lM86rQBbnT7oVk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/정보] - 시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741937989306&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl1XrU/hyYqQLtknC/KAM6Pe4UG33QKVYK6rXmTK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/otMkU/hyYqOz7haE/jfBHP8c7qOo5yHhJuQSlF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl1XrU/hyYqQLtknC/KAM6Pe4UG33QKVYK6rXmTK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/otMkU/hyYqOz7haE/jfBHP8c7qOo5yHhJuQSlF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741938013818&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ed8wx/hyYqMI658r/xLPuhNVtuJ4TB3Zc8ja3Ck/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/MH4c3/hyYrWxysQR/OG8DqUa41K7yVfElZsD370/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/BinGQ/hyYqapCo2X/nbhrnJHfbkGwWgGF8baerK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ed8wx/hyYqMI658r/xLPuhNVtuJ4TB3Zc8ja3Ck/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/MH4c3/hyYrWxysQR/OG8DqUa41K7yVfElZsD370/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/BinGQ/hyYqapCo2X/nbhrnJHfbkGwWgGF8baerK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>WINDOW-SERVER/installation</category>
      <category>window cmd nvm install</category>
      <category>window cmd nvm 설치</category>
      <category>window nvm 설치</category>
      <category>[window cli]window server에서 cmd에서 nvm 설치해보자</category>
      <category>윈도우 cmd nvm 설치</category>
      <category>윈도우 nvm</category>
      <category>윈도우 nvm 설치</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/222</guid>
      <comments>https://intelloper.tistory.com/entry/WINDOW-CMD-NVM-install#entry222comment</comments>
      <pubDate>Fri, 14 Mar 2025 16:56:25 +0900</pubDate>
    </item>
    <item>
      <title>[WINDOW CLI]CMD에서 chocolatey 설치하기</title>
      <link>https://intelloper.tistory.com/entry/WINDOW-CMD-chocolatey-install</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yg6Cw/btsMMcSGJM3/ahstcbeG8tZjnYS4JArITk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yg6Cw/btsMMcSGJM3/ahstcbeG8tZjnYS4JArITk/img.webp&quot; data-alt=&quot;[WINDOW CLI]CMD에서 chocolatey 설치하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yg6Cw/btsMMcSGJM3/ahstcbeG8tZjnYS4JArITk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYg6Cw%2FbtsMMcSGJM3%2FahstcbeG8tZjnYS4JArITk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[WINDOW CLI]CMD에서 chocolatey 설치하기&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;&lt;b&gt;전체 경로로 PowerShell 실행하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위 방법이 작동하지 않거나 시스템을 재시작해야 하는 상황이라면, &lt;b&gt;전체 경로&lt;/b&gt;를 사용하여 PowerShell을 바로 실행할 수 있습니다. 아래 명령어를 입력하세요:&lt;/p&gt;
&lt;pre class=&quot;taggerscript&quot;&gt;&lt;code&gt;C:\Windows\System32\WindowsPowerShell\v1.0\powershell.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;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이 명령어를 실행하면 PowerShell이 바로 실행됩니다.&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;1016&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci5KeE/btsMKqkxZdF/RCEJqJSTXlg1g30yZn9fW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci5KeE/btsMKqkxZdF/RCEJqJSTXlg1g30yZn9fW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci5KeE/btsMKqkxZdF/RCEJqJSTXlg1g30yZn9fW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci5KeE%2FbtsMKqkxZdF%2FRCEJqJSTXlg1g30yZn9fW0%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;1016&quot; height=&quot;168&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;powershell&quot;로 실행 시키고 싶다면:&lt;/p&gt;
&lt;pre id=&quot;code_1741936653920&quot; class=&quot;taggerscript&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;set PATH=%PATH%;C:\Windows\System32\WindowsPowerShell\v1.0
powershell&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chocolatey는 Windows에서 패키지 관리자를 통해 소프트웨어를 설치하는 도구입니다. Chocolatey를 사용하여 소프트웨어를 설치하려면 먼저 Chocolatey가 설치되어 있어야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Chocolatey 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chocolatey가 설치되지 않았다면, 아래 명령어로 설치할 수 있습니다. 관리자 권한으로 &lt;b&gt;PowerShell&lt;/b&gt;을 실행한 후, 다음 명령어를 입력하세요:&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.SecurityProtocolType]::Tls12; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 Chocolatey를 자동으로 설치합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/betLvh/btsMKeYUVro/QDjtKcPUSDKzKAlCaPZNl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/betLvh/btsMKeYUVro/QDjtKcPUSDKzKAlCaPZNl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/betLvh/btsMKeYUVro/QDjtKcPUSDKzKAlCaPZNl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbetLvh%2FbtsMKeYUVro%2FQDjtKcPUSDKzKAlCaPZNl0%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;1248&quot; height=&quot;348&quot; data-origin-width=&quot;1248&quot; data-origin-height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Chocolatey 확인&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1741934679381&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;choco -v&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Chocolatey 경로가 환경 변수에 추가되지 않은 경우&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;366&quot; data-start=&quot;234&quot; data-ke-size=&quot;size16&quot;&gt;Chocolatey는 일반적으로 C:\ProgramData\Chocolatey\bin 경로에 설치됩니다. 이 경로가 PATH 환경 변수에 제대로 추가되지 않으면 cmd에서 choco 명령어를 인식하지 못할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;388&quot; data-start=&quot;368&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;환경 변수에 경로 추가 방법:&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;388&quot; data-start=&quot;368&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;388&quot; data-start=&quot;368&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cmd에서 경로 추가하기 (현재 세션에만 적용)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741934722882&quot; class=&quot;routeros&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;set PATH=%PATH%;C:\ProgramData\Chocolatey\bin&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;&lt;b&gt;영구적으로 경로 추가하기&lt;/b&gt; setx 명령어가 작동하지 않거나 cmd에서 사용이 불가능한 경우, 레지스트리나 PowerShell을 통해 환경 변수에 경로를 추가할 수 있습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;Chocolatey로 소프트웨어 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Chocolatey가 설치된 후, choco install 명령어로 원하는 소프트웨어를 설치할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 1: &lt;b&gt;Google Chrome 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;choco install googlechrome
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 2: &lt;b&gt;Visual Studio Code 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;choco install vscode
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 3: &lt;b&gt;Git 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;choco install git
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 4: &lt;b&gt;Node.js 설치&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;choco install nodejs
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;설치 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치한 프로그램이 잘 설치되었는지 확인하려면, 프로그램 이름을 실행하거나 choco list 명령어로 설치된 패키지 목록을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;choco list --local-only
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m75Uy/btsMKBM6nbW/WkM1bbUXzcFOAISmXjoPG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m75Uy/btsMKBM6nbW/WkM1bbUXzcFOAISmXjoPG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m75Uy/btsMKBM6nbW/WkM1bbUXzcFOAISmXjoPG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm75Uy%2FbtsMKBM6nbW%2FWkM1bbUXzcFOAISmXjoPG0%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;980&quot; height=&quot;64&quot; data-origin-width=&quot;980&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;설치된 프로그램 업그레이드&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치된 프로그램을 업그레이드하려면 아래 명령어를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;choco upgrade &amp;lt;package_name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, Visual Studio Code를 업그레이드하려면:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;choco upgrade vscode
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 해서 Chocolatey로 소프트웨어를 간편하게 설치할 수 있습니다!&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;b&gt;&lt;br /&gt;추천 드리는 글&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741938045501&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hWWUx/hyYqNOJPOL/LTSBvJVBzf2Lyzrg7poa7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/451J2/hyYr4vCncL/biezMNy7lM86rQBbnT7oVk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hWWUx/hyYqNOJPOL/LTSBvJVBzf2Lyzrg7poa7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/451J2/hyYr4vCncL/biezMNy7lM86rQBbnT7oVk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;[Python/정보] - 시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741938047243&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bl1XrU/hyYqQLtknC/KAM6Pe4UG33QKVYK6rXmTK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/otMkU/hyYqOz7haE/jfBHP8c7qOo5yHhJuQSlF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bl1XrU/hyYqQLtknC/KAM6Pe4UG33QKVYK6rXmTK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/otMkU/hyYqOz7haE/jfBHP8c7qOo5yHhJuQSlF0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #0070d1;&quot; href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741938049030&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Ed8wx/hyYqMI658r/xLPuhNVtuJ4TB3Zc8ja3Ck/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/MH4c3/hyYrWxysQR/OG8DqUa41K7yVfElZsD370/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/BinGQ/hyYqapCo2X/nbhrnJHfbkGwWgGF8baerK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Ed8wx/hyYqMI658r/xLPuhNVtuJ4TB3Zc8ja3Ck/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/MH4c3/hyYrWxysQR/OG8DqUa41K7yVfElZsD370/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/BinGQ/hyYqapCo2X/nbhrnJHfbkGwWgGF8baerK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&amp;nbsp;&lt;/p&gt;</description>
      <category>WINDOW-SERVER/installation</category>
      <category>chocolatey</category>
      <category>chocolatey cmd</category>
      <category>chocolatey 설치</category>
      <category>cmd chocolatey 설치</category>
      <category>windos chocolatey 설치</category>
      <category>window chocolatey install</category>
      <category>window cli chocolatey 설치</category>
      <category>윈도우 chocolatey</category>
      <category>윈도우 chocolatey 설치</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/221</guid>
      <comments>https://intelloper.tistory.com/entry/WINDOW-CMD-chocolatey-install#entry221comment</comments>
      <pubDate>Fri, 14 Mar 2025 16:54:46 +0900</pubDate>
    </item>
    <item>
      <title>[Modern Python Project] 현대적 파이썬 프로젝트 관리, 개발법에 대하여</title>
      <link>https://intelloper.tistory.com/entry/modern-python-project-manage</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGkUDL/btsMJ1LyCEw/Mo3rBiT74WD39NRkOVR99k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGkUDL/btsMJ1LyCEw/Mo3rBiT74WD39NRkOVR99k/img.webp&quot; data-alt=&quot;[Modern Python Project] 현대적 파이썬 프로젝트 관리, 개발법에 대하여&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGkUDL/btsMJ1LyCEw/Mo3rBiT74WD39NRkOVR99k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGkUDL%2FbtsMJ1LyCEw%2FMo3rBiT74WD39NRkOVR99k%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Modern Python Project] 현대적 파이썬 프로젝트 관리, 개발법에 대하여&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;파이썬 프로젝트를 현대적으로 관리하고 개발하는 방법에 대해 이야기해보려 합니다.&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;여러 회사와 프로젝트에서 파이썬을 사용하면서 발견한 몇 가지 성가시고, 유지보수가 어렵고, 구식인 관행들이 있습니다. 이제 이런 낡은 방식은 그만두고, 더 나은 방법을 함께 알아보죠!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;requirements.txt 대신 pyproject.toml 사용하기&lt;/li&gt;
&lt;li&gt;Poetry나 UV 같은 파이썬 버전 및 프로젝트 관리자 활용&lt;/li&gt;
&lt;li&gt;타입 힌트(Type Hints) 적용&lt;/li&gt;
&lt;li&gt;함수 독스트링에 Raises 섹션 추가&lt;/li&gt;
&lt;li&gt;Pydantic 모델로 데이터 관리&lt;/li&gt;
&lt;li&gt;Ruff 같은 린터와 포맷터 도입&lt;/li&gt;
&lt;li&gt;unittest 대신 Pytest 사용&lt;/li&gt;
&lt;li&gt;프로젝트에 몰래 적용해볼 만한 &quot;핫 테이크&quot; 팁&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼 바로 시작해볼까요?&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. requirements.txt 대신 pyproject.toml을 사용하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 README.md에 &amp;ldquo;pip install -r requirements.txt로 종속성을 설치하세요&amp;rdquo;라고 쓰는 건 그만두세요. requirements.txt는 단순히 관행일 뿐입니다. 대신 pyproject.toml을 사용하세요!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 pyproject.toml인가요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;깔끔하다&lt;/b&gt; &amp;ndash; 프로젝트 정보와 종속성을 한 파일에서 관리할 수 있습니다.&lt;br /&gt;✅ &lt;b&gt;유연하다&lt;/b&gt; &amp;ndash; 개발용(dev) 종속성이나 선택적 종속성을 쉽게 추가할 수 있습니다.&lt;br /&gt;✅ &lt;b&gt;현대적이다&lt;/b&gt; &amp;ndash; 최신 파이썬 도구들과 완벽하게 호환됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;사용법 예시&lt;/h3&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;[project]
name = &quot;my_app&quot;
version = &quot;0.1.0&quot;
dependencies = [
    &quot;fastapi&amp;gt;=0.68.0&quot;,
    &quot;pandas&amp;gt;=1.3.0&quot;,
]

[build-system]
requires = [&quot;setuptools&quot;, &quot;wheel&quot;]
build-backend = &quot;setuptools.build_meta&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 pip install . 명령어로 프로젝트와 종속성을 설치할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Poetry나 UV 같은 파이썬 프로젝트 관리자를 사용하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;venv를 직접 관리하는 대신 &lt;b&gt;Poetry&lt;/b&gt;나 &lt;b&gt;UV&lt;/b&gt; 같은 도구를 사용하세요. 프로젝트 관리를 훨씬 쉽게 만들어줍니다.&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;b&gt;효율적이다&lt;/b&gt; &amp;ndash; 반복 작업을 자동화하여 시간을 절약할 수 있습니다.&lt;br /&gt;  &lt;b&gt;안정적이다&lt;/b&gt; &amp;ndash; 전역 종속성 충돌을 방지할 수 있습니다.&lt;br /&gt;⚡ &lt;b&gt;빠르다&lt;/b&gt; &amp;ndash; 특히 UV는 엄청나게 빠릅니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 타입 힌트(Type Hints)를 사용하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 힌트를 사용하면 코드 가독성이 향상되고, ruff나 mypy 같은 도구가 버그를 미리 잡을 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 타입 힌트 없는 코드:&lt;/p&gt;
&lt;pre class=&quot;stata&quot;&gt;&lt;code&gt;def check_scores(scores):
    total = 0
    for score in scores:
        total += score
    return total / len(scores)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 타입 힌트를 추가한 코드:&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from typing import List

def check_scores(scores: List[float]) -&amp;gt; float:
    &quot;&quot;&quot;학생 점수 리스트의 평균을 계산합니다.&quot;&quot;&quot;
    return sum(scores) / len(scores)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 함수 독스트링에 Raises 섹션을 추가하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외를 문서화하면 유지보수가 훨씬 쉬워집니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import csv
from typing import List

def read_csv_data(file_path: str) -&amp;gt; List[str]:
    &quot;&quot;&quot;CSV 파일에서 첫 번째 열 데이터를 읽습니다.

    Args:
        file_path (str): CSV 파일 경로

    Raises:
        FileNotFoundError: 파일이 없을 경우
        csv.Error: CSV 형식이 맞지 않을 경우

    Returns:
        List[str]: 첫 번째 열 데이터 리스트
    &quot;&quot;&quot;
    with open(file_path, 'r') as f:
        reader = csv.reader(f)
        return [row[0] for row in reader]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Pydantic 모델로 데이터를 전달하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리 대신 &lt;b&gt;Pydantic 모델&lt;/b&gt;을 사용하면 코드가 깔끔해지고 데이터 유효성 검사를 자동으로 수행할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;from pydantic import BaseModel

class UserSettings(BaseModel):
    username: str
    email: str
    active: bool

def update_user(settings: UserSettings):
    pass  # 사용자 설정 업데이트 로직
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Ruff 같은 린터와 포맷터를 사용하세요&lt;/h2&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 코드 스타일을 깔끔하게 유지하려면 &lt;span&gt;ruff&lt;/span&gt;를 추천합니다. 속도가 빠르고, &lt;span&gt;Black&lt;/span&gt; 스타일을 따르며, 사소한 실수도 잘 잡아줍니다.&lt;/p&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 예시&lt;/h3&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;pyproject.toml&lt;/span&gt;에 이렇게 추가하세요:&lt;/p&gt;
&lt;/div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;[tool.ruff]
line-length = 88
select = [&quot;E&quot;, &quot;F&quot;, &quot;W&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. unittest 대신 Pytest를 사용하세요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unittest도 나쁘지 않지만, pytest는 더 간결하고 강력합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def multiply(a, b):
    return a * b

def test_multiply():
    assert multiply(2, 3) == 6
    assert multiply(0, 5) == 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 pytest test_file.py를 실행하면 테스트가 시작됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 프로젝트에 몰래 넣을 수 있는 &quot;핫 테이크&quot;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;orjson&lt;/b&gt; &amp;ndash; 기본 json보다 훨씬 빠릅니다.&lt;br /&gt;✨ &lt;b&gt;f-strings&lt;/b&gt; &amp;ndash; f&quot;안녕 {name}&quot;처럼 간결하게 작성하세요.&lt;br /&gt;  &lt;b&gt;pathlib&lt;/b&gt; &amp;ndash; os.path 대신 사용하세요.&lt;br /&gt;  &lt;b&gt;click&lt;/b&gt; &amp;ndash; CLI 프로그램을 쉽게 만들 수 있습니다.&lt;br /&gt;  &lt;b&gt;파이썬 3.8+&lt;/b&gt; &amp;ndash; 최신 버전으로 업그레이드하세요!&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;&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-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741923136117&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&quot; data-og-description=&quot;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/HMlHc/hyYqMbbA2J/9ddVPwwG2PX35OPuL5ALtK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/b8HR4T/hyYqRXSrRV/gXBPQKg6ZGiZ0msR4jvPj1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/HMlHc/hyYqMbbA2J/9ddVPwwG2PX35OPuL5ALtK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/b8HR4T/hyYqRXSrRV/gXBPQKg6ZGiZ0msR4jvPj1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741923115707&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;[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들&quot; data-og-description=&quot;파이썬 3.13 버전은 특히 머신러닝(ML)과 인공지능(AI) 분야에서 혁신적인 변화를 가져올 업데이트를 포함하고 있어보여 또 정리해보았습니다.&amp;nbsp;파이썬은 간단한 문법, 풍부한 라이브러리, 그리고 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Python-313&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Python-313&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5Eko8/hyYp86ngFe/nK3nDKSZEI1umyXL3KgCt1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/FxO1H/hyYqOfNbob/7NY8Z6FWNgLarnK6Bx75rk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Python-313&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5Eko8/hyYp86ngFe/nK3nDKSZEI1umyXL3KgCt1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/FxO1H/hyYqOfNbob/7NY8Z6FWNgLarnK6Bx75rk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬 3.13 버전은 특히 머신러닝(ML)과 인공지능(AI) 분야에서 혁신적인 변화를 가져올 업데이트를 포함하고 있어보여 또 정리해보았습니다.&amp;nbsp;파이썬은 간단한 문법, 풍부한 라이브러리, 그리고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-MongoDB-aggregation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python]에서 MongoDB 집계 파이프 사용법 정리(MongoDB aggregation)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741923104650&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;[Python]에서 MongoDB 집계 파이프 사용법 정리(MongoDB aggregation)&quot; data-og-description=&quot;MongoDB 집계 파이프라인 개요MongoDB의 집계 파이프라인(Aggregation Pipeline) 은 데이터를 단계별로 처리하여 필터링, 그룹화, 정렬 및 변환하는 강력한 분석 기능을 제공합니다. SQL의 GROUP BY와 유사하&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Python-MongoDB-aggregation&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Python-MongoDB-aggregation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/TGeDb/hyYrPyoY6Z/wJdQKxQBSqZubzmuahOINk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bgWQAE/hyYqW5XC9g/IlakonFkMaNfkrckq8Y5Kk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-MongoDB-aggregation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Python-MongoDB-aggregation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/TGeDb/hyYrPyoY6Z/wJdQKxQBSqZubzmuahOINk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bgWQAE/hyYqW5XC9g/IlakonFkMaNfkrckq8Y5Kk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Python]에서 MongoDB 집계 파이프 사용법 정리(MongoDB aggregation)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB 집계 파이프라인 개요MongoDB의 집계 파이프라인(Aggregation Pipeline) 은 데이터를 단계별로 처리하여 필터링, 그룹화, 정렬 및 변환하는 강력한 분석 기능을 제공합니다. SQL의 GROUP BY와 유사하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/정보</category>
      <category>poetry</category>
      <category>pyproject.toml</category>
      <category>python pydantic</category>
      <category>python ruff</category>
      <category>python type hints</category>
      <category>python unittest</category>
      <category>[modern python project] 현대적 파이썬 프로젝트 관리</category>
      <category>현대파이썬</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/220</guid>
      <comments>https://intelloper.tistory.com/entry/modern-python-project-manage#entry220comment</comments>
      <pubDate>Fri, 14 Mar 2025 12:36:44 +0900</pubDate>
    </item>
    <item>
      <title>[Manus AI + Ollama] OpenManus 로컬에서 설치 및 실행해보자</title>
      <link>https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0YKz4/btsMK0ybsla/bDil8B9qN3w6X1SfgoK7Kk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0YKz4/btsMK0ybsla/bDil8B9qN3w6X1SfgoK7Kk/img.webp&quot; data-alt=&quot;[Manus AI + Ollama] OpenManus 로컬에서 설치 및 실행해보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0YKz4/btsMK0ybsla/bDil8B9qN3w6X1SfgoK7Kk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0YKz4%2FbtsMK0ybsla%2FbDil8B9qN3w6X1SfgoK7Kk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Manus AI + Ollama] OpenManus 로컬에서 설치 및 실행해보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Manus AI 에대해서 모른다면 요거 한번 훑고 갑시당&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Manus-AI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Manus AI 에 대하여 빠르게 아라보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741916589025&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;Manus AI 에 대하여 빠르게 아라보자&quot; data-og-description=&quot;중국, 새로운 자율 AI '마누스 AI' 출시!Manus는 마음과 행동을 연결하는 일반 AI 에이전트입니다. 생각하는 것뿐만 아니라 결과를 제공합니다. Manus는 일과 삶에서 다양한 작업에 능숙하며, 휴식을 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Manus-AI&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Manus-AI&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q6s1I/hyYqXwZMJz/vRGUpMJv1xnbn14o2kmZC1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/I3R10/hyYrPSHxHA/fCikQ5V5xMDkyJC647biI1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/O1Zhf/hyYqYbwiQV/XRgA9cPgKw4e1p1rYhr3Ck/img.png?width=1231&amp;amp;height=946&amp;amp;face=0_0_1231_946&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Manus-AI&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Manus-AI&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q6s1I/hyYqXwZMJz/vRGUpMJv1xnbn14o2kmZC1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/I3R10/hyYrPSHxHA/fCikQ5V5xMDkyJC647biI1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/O1Zhf/hyYqYbwiQV/XRgA9cPgKw4e1p1rYhr3Ck/img.png?width=1231&amp;amp;height=946&amp;amp;face=0_0_1231_946');&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;Manus AI 에 대하여 빠르게 아라보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;중국, 새로운 자율 AI '마누스 AI' 출시!Manus는 마음과 행동을 연결하는 일반 AI 에이전트입니다. 생각하는 것뿐만 아니라 결과를 제공합니다. Manus는 일과 삶에서 다양한 작업에 능숙하며, 휴식을&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;h2 data-ke-size=&quot;size26&quot;&gt;OpenManus에 대하여.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;OpenManus&lt;/b&gt;는 Manus의 오픈소스 버전으로, 혁신적인 &lt;b&gt;모듈형 에이전트 시스템&lt;/b&gt;을 기반으로 합니다. 이는 여러 전문가 팀이 협력하는 네트워크처럼 작동합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OpenManus의 주요 에이전트&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;PlanningAgent&lt;/b&gt;: 복잡한 작업을 명확하고 실행 가능한 단계로 분해하는 전략 전문가입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ToolCallAgent&lt;/b&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;b&gt;모듈 자유 조합&lt;/b&gt;: 개발자는 필요에 따라 기능을 조합해 자신만의 AI 어시스턴트를 만들 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최상위 모델 통합&lt;/b&gt;: &lt;b&gt;Claude 3.5&lt;/b&gt;, &lt;b&gt;Qwen VL Plus&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python 코드 실행기: 코드를 생성하고 즉시 실행.&lt;/li&gt;
&lt;li&gt;인터넷 검색 도구: 정보를 자동으로 수집 및 분석.&lt;/li&gt;
&lt;li&gt;브라우저 자동화: 웹 페이지와 인간처럼 상호작용.&lt;/li&gt;
&lt;li&gt;파일 처리 시스템: 파일을 자동으로 생성 및 관리.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;OpenManus의 빠른 개발 비결&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenManus는 &lt;b&gt;MetaGPT&lt;/b&gt;의 오픈소스 기반 위에 브라우저 도구 체인을 결합해 단 &lt;b&gt;3시간 만에&lt;/b&gt; 핵심 시스템을 완성했습니다. 이는 기존 코드와 에이전트 툴킷을 활용한 결과로, 놀라운 효율성을 보여줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;OpenManus 로컬 환경 구성&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenManus의 주요 디자인을 간략히 이해한 후, 로컬 환경에서 배포해보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Python 가상 환경 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenManus 실행을 위해 Python 가상 환경을 설정합니다. 먼저, &lt;b&gt;Conda&lt;/b&gt;를 설치한 후, 아래 명령어를 실행하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Conda 가상 환경 생성 및 활성화&lt;/h3&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;conda create -n OpenManus python=3.12
conda activate OpenManus
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 &lt;b&gt;venv&lt;/b&gt;를 사용할 수도 있습니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;python -m venv myenv
myenv\Scripts\activate  # (Windows)
source myenv/bin/activate  # (Mac/Linux)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 저장소 복제 및 종속성 설치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenManus 저장소를 복제한 후, 종속성을 설치합니다.&lt;/p&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone https://github.com/mannaandpoem/OpenManus.git
cd OpenManus
pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 빅 모델 API 구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenManus의 기본 빅 모델로 &lt;b&gt;QwQ-32B&lt;/b&gt;를 사용합니다. 설정을 위해 아래 단계를 따라 주세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성 파일 복사&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;cp config/config.example.toml config/config.toml
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 로컬 Ollama 서비스 실행&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-4o는 비용이 발생하므로, &lt;b&gt;로컬 Ollama 서비스&lt;/b&gt;를 사용합니다. 원하는 모델을 자유롭게 선택할 수 있지만, &lt;b&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;&lt;b&gt;ollama dependencies 설치&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741915523350&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo apt install pciutils lshw&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;b&gt;ollama download&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741914742903&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -fsSL https://ollama.com/install.sh | sh&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;b&gt;ollama version 확인&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741914775056&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ollama -v&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;46&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bORv7w/btsMJ1Ludye/mmmAkgtenxEdSureKKQuH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bORv7w/btsMJ1Ludye/mmmAkgtenxEdSureKKQuH0/img.png&quot; data-alt=&quot;ollama version check&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bORv7w/btsMJ1Ludye/mmmAkgtenxEdSureKKQuH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbORv7w%2FbtsMJ1Ludye%2FmmmAkgtenxEdSureKKQuH0%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;349&quot; height=&quot;46&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;46&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ollama version check&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #171717; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. OpenManus 가동시키기 위한 LLM 설치&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;ollama run qwq
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;69&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvvHDe/btsMKyB2NHb/U8MrB1EtdRsUUMNwEIkjG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvvHDe/btsMKyB2NHb/U8MrB1EtdRsUUMNwEIkjG0/img.png&quot; data-alt=&quot;ollama running qwq model&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvvHDe/btsMKyB2NHb/U8MrB1EtdRsUUMNwEIkjG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvvHDe%2FbtsMKyB2NHb%2FU8MrB1EtdRsUUMNwEIkjG0%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;879&quot; height=&quot;69&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;69&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ollama running qwq model&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1741914825783&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ollama run minicpm-v&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;1002&quot; data-origin-height=&quot;243&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2hDIr/btsMIMu3yo1/iqkaRZLWYFB67Et2a5IxyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2hDIr/btsMIMu3yo1/iqkaRZLWYFB67Et2a5IxyK/img.png&quot; data-alt=&quot;ollama running minicpm-v model&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2hDIr/btsMIMu3yo1/iqkaRZLWYFB67Et2a5IxyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2hDIr%2FbtsMIMu3yo1%2FiqkaRZLWYFB67Et2a5IxyK%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;1002&quot; height=&quot;243&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;243&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ollama running minicpm-v model&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. API 키 및 설정 추가&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모델을 다운로드한 후, config/config.toml 파일을 열어 API 키와 사용자 설정을 추가하세요.&lt;/p&gt;
&lt;pre id=&quot;code_1741921809741&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vim config/config.toml&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bysaxo/btsMJoUJa7I/l3EYgUyIxDL00kx9oQfKo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bysaxo/btsMJoUJa7I/l3EYgUyIxDL00kx9oQfKo0/img.png&quot; data-alt=&quot;open manus config setting&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bysaxo/btsMJoUJa7I/l3EYgUyIxDL00kx9oQfKo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbysaxo%2FbtsMJoUJa7I%2Fl3EYgUyIxDL00kx9oQfKo0%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;610&quot; data-origin-width=&quot;568&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;open manus config setting&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_1741921793733&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo vim app/tool/browser_use_tool.py&lt;/code&gt;&lt;/pre&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;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcsur3/btsMI3Q6cGG/iILx3HVEmS39wM2kRTdaYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcsur3/btsMI3Q6cGG/iILx3HVEmS39wM2kRTdaYk/img.png&quot; data-alt=&quot;open manus headless setting&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcsur3/btsMI3Q6cGG/iILx3HVEmS39wM2kRTdaYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcsur3%2FbtsMI3Q6cGG%2FiILx3HVEmS39wM2kRTdaYk%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;644&quot; height=&quot;426&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;426&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;open manus headless setting&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. OpenManus 실행&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 명령어를 입력하여 OpenManus를 실행하세요.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;python main.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 OpenManus가 정상적으로 실행됩니다!  &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;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;color: #000000;&quot;&gt;&lt;code&gt;I need a 7-day Japan itinerary for April 15-23 from Seattle, with a $2500-5000 budget for my fianc&amp;eacute;e and me. We love historical sites, hidden gems, and Japanese culture (kendo, tea ceremonies, Zen meditation). We want to see Nara's deer and explore cities on foot. I plan to propose during this trip and need a special location recommendation. Please provide a detailed itinerary and a simple HTML travel handbook with maps, attraction descriptions, essential Japanese phrases, and travel tips we can reference throughout our journey.
&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DeepSeek R-1 우분투에서 써보기 feat.Ollama&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741921632557&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;DeepSeek R-1 우분투에서 써보기 feat.Ollama&quot; data-og-description=&quot;DeepSeek에 대해서 모른다면 밑에 글 빠르게 훑어보자딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)우선 긴글을 싫어하는 당신을 위한 요&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dBQMlv/hyYqL4ozQ7/LTI9LNZdctan3KkvVffSE1/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/P5AiG/hyYqMI3qFC/WM4GDFwwlaPKgL1gIWtuvk/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bzdeTk/hyYrVei15i/SSpnKoJRENnSdyiSavHEvK/img.png?width=1217&amp;amp;height=1222&amp;amp;face=0_0_1217_1222&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dBQMlv/hyYqL4ozQ7/LTI9LNZdctan3KkvVffSE1/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/P5AiG/hyYqMI3qFC/WM4GDFwwlaPKgL1gIWtuvk/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/bzdeTk/hyYrVei15i/SSpnKoJRENnSdyiSavHEvK/img.png?width=1217&amp;amp;height=1222&amp;amp;face=0_0_1217_1222');&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;DeepSeek R-1 우분투에서 써보기 feat.Ollama&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DeepSeek에 대해서 모른다면 밑에 글 빠르게 훑어보자딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)우선 긴글을 싫어하는 당신을 위한 요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741921638610&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;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&quot; data-og-description=&quot;우선 긴글을 싫어하는 당신을 위한 요약 부터 고고  DeepSeek R1 요약  DeepSeek R1이란?중국의 AI 기업 DeepSeek에서 개발한 최신 AI 모델.OpenAI의 o1 모델과 동급 성능을 보이면서도 98% 저렴함.오픈소&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/2nooW/hyYr2qYDYi/wWP3p9wVYuje1YpAJXP7v1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2Wqlz/hyYrWK4DKW/0rqkYcKmDFqU9hwtw1bM20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/uZ5zE/hyYr000fzG/pkPBE029UZUkkBYM4OykgK/img.png?width=700&amp;amp;height=512&amp;amp;face=0_0_700_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/2nooW/hyYr2qYDYi/wWP3p9wVYuje1YpAJXP7v1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/2Wqlz/hyYrWK4DKW/0rqkYcKmDFqU9hwtw1bM20/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/uZ5zE/hyYr000fzG/pkPBE029UZUkkBYM4OykgK/img.png?width=700&amp;amp;height=512&amp;amp;face=0_0_700_512');&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;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우선 긴글을 싫어하는 당신을 위한 요약 부터 고고  DeepSeek R1 요약  DeepSeek R1이란?중국의 AI 기업 DeepSeek에서 개발한 최신 AI 모델.OpenAI의 o1 모델과 동급 성능을 보이면서도 98% 저렴함.오픈소&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741921648635&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;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&quot; data-og-description=&quot;최근 OpenAI는 GPT-4.5를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다. &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cP5Erk/hyYr3pS8iE/uR65bkB9Gv1KAkHke3COG0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/btGh2a/hyYqP6O7O9/ZXCoyBFaIZE6szuNRKJ6mK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cP5Erk/hyYr3pS8iE/uR65bkB9Gv1KAkHke3COG0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/btGh2a/hyYqP6O7O9/ZXCoyBFaIZE6szuNRKJ6mK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 OpenAI는 GPT-4.5를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>생성AI/인공지능 활용</category>
      <category>manus ai</category>
      <category>manus ai 로컬</category>
      <category>manus ai 로컬 실행</category>
      <category>manusai 직접 돌리기</category>
      <category>Ollama</category>
      <category>ollama로 manusai 실행하기</category>
      <category>openmanus</category>
      <category>openmanus 로컬</category>
      <category>[manus ai + ollama] openmanus 로컬에서 설치 및 실행해보자</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/219</guid>
      <comments>https://intelloper.tistory.com/entry/Manus-AI-Ollama-OpenManus#entry219comment</comments>
      <pubDate>Fri, 14 Mar 2025 12:08:10 +0900</pubDate>
    </item>
    <item>
      <title>[Python]에서 MongoDB 집계 파이프 사용법 정리(MongoDB aggregation)</title>
      <link>https://intelloper.tistory.com/entry/Python-MongoDB-aggregation</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN6XZg/btsMI5ngDTM/kbS75OJUPawf1Gh4Dzxod1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN6XZg/btsMI5ngDTM/kbS75OJUPawf1Gh4Dzxod1/img.webp&quot; data-alt=&quot;[Python]에서 MongoDB 집계 파이프 사용법 정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN6XZg/btsMI5ngDTM/kbS75OJUPawf1Gh4Dzxod1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN6XZg%2FbtsMI5ngDTM%2FkbS75OJUPawf1Gh4Dzxod1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Python]에서 MongoDB 집계 파이프 사용법 정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MongoDB 집계 파이프라인 개요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB의 &lt;b&gt;집계 파이프라인(Aggregation Pipeline)&lt;/b&gt; 은 데이터를 단계별로 처리하여 필터링, 그룹화, 정렬 및 변환하는 강력한 분석 기능을 제공합니다. SQL의 GROUP BY와 유사하지만, 더 복잡하고 유연한 데이터 조작이 가능합니다.&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;b&gt;&quot;products&quot;&lt;/b&gt; 데이터베이스의 &lt;b&gt;&quot;laptops&quot;&lt;/b&gt; 컬렉션을 사용합니다. 이 컬렉션에는 200개의 노트북 데이터가 저장되어 있으며, 문서에는 brand(브랜드), in_stock(재고 상태), 그리고 attributes(속성 배열) 등의 정보가 포함되어 있습니다. 속성 배열에는 &quot;8GB&quot;, &quot;16GB&quot;와 같은 메모리 크기 정보가 문자열 형태로 저장될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  환경 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python에서 MongoDB를 사용하려면 &lt;b&gt;PyMongo&lt;/b&gt; 라이브러리가 필요합니다. 로컬 MongoDB 서버에 연결하는 기본 코드 예제는 다음과 같습니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client['products']
collection = db['laptops']
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Tip:&lt;/b&gt;&lt;br /&gt;데이터를 로드하는 방법으로는 JSON 파일을 임포트하는 것 외에도, &lt;b&gt;Docker를 사용한 로컬 MongoDB 실행&lt;/b&gt; 또는 &lt;b&gt;MongoDB Atlas 무료 티어&lt;/b&gt; 활용이 가능합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  [$group] 기본 집계: 문서 개수 세기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬렉션의 총 문서 개수를 구하는 간단한 예제입니다.&lt;br /&gt;MongoDB 쉘에서는 countDocuments()를 사용할 수 있지만, 집계 파이프라인을 통해서도 동일한 결과를 얻을 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;pipeline = [
    {'$group': {'_id': None, 'total': {'$count': {}}}}
]

result = list(collection.aggregate(pipeline))
print(&quot;Total number of laptops:&quot;, result[0]['total'])
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  결과 예시:&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{&quot;_id&quot;: null, &quot;total&quot;: 200}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  $group 단계에서 _id: None 으로 설정하면 모든 문서를 하나의 그룹으로 묶고, $count 연산자로 문서 개수를 계산합니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  [$count] 브랜드별 노트북 개수 구하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 브랜드별 노트북 수를 계산하려면 $group 단계를 사용하여 브랜드(brand) 필드를 기준으로 그룹화합니다:&lt;/p&gt;
&lt;pre class=&quot;dart&quot;&gt;&lt;code&gt;pipeline = [
    {'$group': {'_id': '$brand', 'count': {'$count': {}}}}
]

result = list(collection.aggregate(pipeline))
print(&quot;Laptop counts by brand:&quot;, result)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  결과 예시:&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
    {&quot;_id&quot;: &quot;HP&quot;, &quot;count&quot;: 50},
    {&quot;_id&quot;: &quot;Dell&quot;, &quot;count&quot;: 40},
    {&quot;_id&quot;: &quot;Lenovo&quot;, &quot;count&quot;: 30}
]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&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;&quot;$brand&quot;: &lt;b&gt;문서에서 브랜드 필드 값&lt;/b&gt;을 가져옵니다.&lt;/li&gt;
&lt;li&gt;$count: 각 그룹에 속한 문서 개수를 계산합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  정렬: $sort 단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브랜드별 노트북 개수를 &lt;b&gt;내림차순 정렬(많은 브랜드 순)&lt;/b&gt; 하려면 $sort 단계를 추가하면 됩니다:&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;pipeline = [
    {'$group': {'_id': '$brand', 'count': {'$count': {}}}},
    {'$sort': {'count': -1}}  # count 값을 기준으로 내림차순 정렬
]

result = list(collection.aggregate(pipeline))
print(&quot;Sorted laptop counts by brand:&quot;, result)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  결과 예시:&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
    {&quot;_id&quot;: &quot;HP&quot;, &quot;count&quot;: 50},
    {&quot;_id&quot;: &quot;Dell&quot;, &quot;count&quot;: 40},
    {&quot;_id&quot;: &quot;Lenovo&quot;, &quot;count&quot;: 30}
]
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&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;$sort: {'count': -1} &amp;rarr; count 값을 기준으로 &lt;b&gt;내림차순&lt;/b&gt; 정렬&lt;/li&gt;
&lt;li&gt;$sort: {'count': 1} &amp;rarr; count 값을 기준으로 &lt;b&gt;오름차순&lt;/b&gt; 정렬&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  필터링: $match 단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;재고가 있는 노트북(in_stock: true)만 필터링하려면 $match 단계를 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;pipeline = [
    {'$match': {'in_stock': True}},  # 재고가 있는 문서만 필터링
    {'$group': {'_id': '$brand', 'count': {'$count': {}}}},
    {'$sort': {'count': -1}}  # 브랜드별 노트북 개수를 내림차순 정렬
]

result = list(collection.aggregate(pipeline))
print(&quot;In-stock laptop counts by brand:&quot;, result)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  $match 단계 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$match는 특정 조건을 만족하는 문서만 다음 단계로 전달하는 역할을 합니다.&lt;/li&gt;
&lt;li&gt;$match 단계를 여러 번 사용할 수도 있으며, 예를 들어 &lt;b&gt;재고가 10개 이상인 브랜드&lt;/b&gt;만 출력하려면 추가 필터링을 적용할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  배열 처리: $unwind 단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 문서의 &lt;b&gt;속성 배열(attributes)&lt;/b&gt; 이 다음과 같이 저장되어 있다고 가정합니다.&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{&quot;_id&quot;: 1, &quot;brand&quot;: &quot;HP&quot;, &quot;attributes&quot;: [&quot;8GB&quot;, &quot;16GB&quot;]}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 $unwind를 사용하여 &lt;b&gt;각 배열 요소를 개별 문서로 변환&lt;/b&gt;해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;pipeline = [
    {'$unwind': '$attributes'}
]

result = list(collection.aggregate(pipeline))
print(&quot;Unwound attributes:&quot;, result[:5])  # 처음 5개만 출력
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  $unwind 적용 후 결과:&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{&quot;_id&quot;: 1, &quot;brand&quot;: &quot;HP&quot;, &quot;attributes&quot;: &quot;8GB&quot;}
{&quot;_id&quot;: 1, &quot;brand&quot;: &quot;HP&quot;, &quot;attributes&quot;: &quot;16GB&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  $unwind 단계 설명&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;배열을 처리해야 하는 경우 $unwind가 필수적이며, 이후의 분석이 훨씬 쉬워집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문서 재구성: $project 단계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 attributes 필드에 저장된 &lt;b&gt;메모리 크기(&quot;8GB&quot;, &quot;16GB&quot; 등)&lt;/b&gt; 에서 &quot;GB&quot;를 제거하고, 이를 &lt;b&gt;정수형 데이터&lt;/b&gt;로 변환해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;pipeline = [
    {'$unwind': '$attributes'},
    {'$project': {
        'brand': 1,
        'memory': {
            '$let': {
                'vars': {
                    'mem': { '$trim': { 'input': '$attributes', 'chars': 'GB' } },
                },
                'in': { '$toInt': '$$mem' }
            }
        }
    }}
]

result = list(collection.aggregate(pipeline))
print(&quot;Projected memory values:&quot;, result[:5])  # 처음 5개 출력
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  $project 단계 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$trim: &quot;GB&quot; 문자열을 제거하여 숫자만 남김.&lt;/li&gt;
&lt;li&gt;$toInt: 문자열을 정수형으로 변환.&lt;/li&gt;
&lt;li&gt;$let: 변수(mem)를 사용하여 변환 과정을 단계적으로 수행.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;이제 메모리를 숫자로 변환했기 때문에, 크기 비교 및 정렬이 정확하게 가능합니다!&lt;/b&gt;&lt;br /&gt;(&quot;8GB&quot; &amp;gt; &quot;16GB&quot; 같은 오류 방지)&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  브랜드별 최대 메모리 찾기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 앞서 배운 $unwind, $project, $group, $sort 단계를 &lt;b&gt;모두 결합&lt;/b&gt;하여,&lt;br /&gt;&lt;b&gt;브랜드별 최대 메모리 크기&lt;/b&gt;를 찾아보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;nsis&quot;&gt;&lt;code&gt;pipeline = [
    {'$unwind': '$attributes'},
    {'$project': {
        'brand': 1,
        'memory': {
            '$let': {
                'vars': {
                    'mem': { '$trim': { 'input': '$attributes', 'chars': 'GB' } },
                },
                'in': { '$toInt': '$$mem' }
            }
        }
    }},
    {'$group': {
        '_id': '$brand',
        'max_memory': { '$max': '$memory' }
    }},
    {'$sort': {'max_memory': -1}}  # 내림차순 정렬
]

result = list(collection.aggregate(pipeline))
print(&quot;Maximum memory by brand:&quot;, result)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  출력 예시:&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[
    {&quot;_id&quot;: &quot;HP&quot;, &quot;max_memory&quot;: 32},
    {&quot;_id&quot;: &quot;Lenovo&quot;, &quot;max_memory&quot;: 32},
    {&quot;_id&quot;: &quot;Dell&quot;, &quot;max_memory&quot;: 16}
]
&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;1️⃣ $unwind: 배열을 개별 요소로 변환&lt;br /&gt;2️⃣ $project: &quot;GB&quot;를 제거하고 정수형 데이터로 변환&lt;br /&gt;3️⃣ $group: 브랜드별 최대 메모리 값 계산&lt;br /&gt;4️⃣ $sort: 내림차순 정렬&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제까지 배운 &lt;b&gt;MongoDB 집계 파이프라인의 주요 기능&lt;/b&gt;을 정리해 봅시다.&lt;/p&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;$group&lt;/td&gt;
&lt;td&gt;문서를 그룹화하고 집계 수행&lt;/td&gt;
&lt;td&gt;브랜드별 노트북 개수 계산&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$sort&lt;/td&gt;
&lt;td&gt;특정 필드를 기준으로 정렬&lt;/td&gt;
&lt;td&gt;카운트 내림차순 정렬&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$match&lt;/td&gt;
&lt;td&gt;특정 조건을 만족하는 문서만 필터링&lt;/td&gt;
&lt;td&gt;재고가 있는 노트북만 필터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$unwind&lt;/td&gt;
&lt;td&gt;배열을 개별 요소로 변환&lt;/td&gt;
&lt;td&gt;속성 배열 분해&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;$project&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;p data-ke-size=&quot;size16&quot;&gt;MongoDB 집계 파이프라인을 활용하면 데이터를 더욱 효율적으로 처리하고, 복잡한 분석도 쉽게 수행할 수 있습니다.&lt;br /&gt;이제 직접 실습해 보며 &lt;b&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;&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-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MongoDB 성능 개선을 위한 점검 (DB 프로파일링 / db.setProfilingLevel)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741845569030&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;MongoDB 성능 개선을 위한 점검 (DB 프로파일링 / db.setProfilingLevel)&quot; data-og-description=&quot;⚠️ 성능에 영향을 주는 쿼리를 확인하기 위한 용도일뿐, 이 자체로 성능을 개선하는 것과는 무관합니다.(오히려 프로파일링 활성화 모드일때 성능을 더 잡아먹음. 프로파일링 완료 후 반드시 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bWUX10/hyYqXwMMp6/cBwOt0K7WgIwb65GKAji11/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/RqXXG/hyYqRi15NY/gkrQLbanUJuv7760v521bK/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/J0McX/hyYrPZhXkj/CuLx3bSKk6a6PVAeVGA7QK/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bWUX10/hyYqXwMMp6/cBwOt0K7WgIwb65GKAji11/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/RqXXG/hyYqRi15NY/gkrQLbanUJuv7760v521bK/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/J0McX/hyYrPZhXkj/CuLx3bSKk6a6PVAeVGA7QK/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496');&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;MongoDB 성능 개선을 위한 점검 (DB 프로파일링 / db.setProfilingLevel)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 성능에 영향을 주는 쿼리를 확인하기 위한 용도일뿐, 이 자체로 성능을 개선하는 것과는 무관합니다.(오히려 프로파일링 활성화 모드일때 성능을 더 잡아먹음. 프로파일링 완료 후 반드시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741845575507&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;MongoDB  성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&quot; data-og-description=&quot;인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다.&amp;nbsp;MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vVPJ4/hyYqM24q9o/GjfiHgpzo704WtQzw2A3VK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/c06tAj/hyYqcHwzcH/zqzWsupQqhlLMMHK1cLywk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/ciplNZ/hyYqOfxOP5/TpCIFLJswcDiWlC9jxflOK/img.png?width=1280&amp;amp;height=719&amp;amp;face=0_0_1280_719&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vVPJ4/hyYqM24q9o/GjfiHgpzo704WtQzw2A3VK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/c06tAj/hyYqcHwzcH/zqzWsupQqhlLMMHK1cLywk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/ciplNZ/hyYqOfxOP5/TpCIFLJswcDiWlC9jxflOK/img.png?width=1280&amp;amp;height=719&amp;amp;face=0_0_1280_719');&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;MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다.&amp;nbsp;MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741845601664&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&quot; data-og-description=&quot;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cthVGa/hyYqPZPDSx/e0vV7WqdWThL68BMfKyufK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cenCxj/hyYqPFworx/o7SJx6d4KZu20BcYgCYx3K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cthVGa/hyYqPZPDSx/e0vV7WqdWThL68BMfKyufK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/cenCxj/hyYqPFworx/o7SJx6d4KZu20BcYgCYx3K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>MongoDB/성능</category>
      <category>mongodb aggregation</category>
      <category>mongodb pipeline</category>
      <category>mongodb 집계</category>
      <category>mongodb 집계 파이프라인</category>
      <category>python mongodb aggregation</category>
      <category>[python]에서 mongodb 집계 파이프 사용법 정리(mongodb aggregation)</category>
      <category>파이썬 mongodb 집계</category>
      <category>파이썬 mongodb 파이프라인</category>
      <category>파이썬 파이프라인</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/218</guid>
      <comments>https://intelloper.tistory.com/entry/Python-MongoDB-aggregation#entry218comment</comments>
      <pubDate>Thu, 13 Mar 2025 15:02:54 +0900</pubDate>
    </item>
    <item>
      <title>RequestsDependencyWarning: urllib3 (2.2.1) or chardet (None)/charset_normalizer (3.4.0) doesn't match a supported version!</title>
      <link>https://intelloper.tistory.com/entry/RequestsDependencyWarning-urllib3-chardet</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;RequestsDependencyWarning:&amp;nbsp;urllib3&amp;nbsp;(2.2.1)&amp;nbsp;or&amp;nbsp;chardet&amp;nbsp;(None)/charset_normalizer&amp;nbsp;(3.4.0)&amp;nbsp;doesn't&amp;nbsp;match&amp;nbsp;a&amp;nbsp;supported&amp;nbsp;version!&lt;br /&gt;&amp;nbsp;&amp;nbsp;warnings.warn(&quot;urllib3&amp;nbsp;({})&amp;nbsp;or&amp;nbsp;chardet&amp;nbsp;({})/charset_normalizer&amp;nbsp;({})&amp;nbsp;doesn't&amp;nbsp;match&amp;nbsp;a&amp;nbsp;supported&amp;nbsp;&quot;&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;742&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebuugj/btsMILIDAFt/a2gIKmXESdLJ7H2os0rSd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebuugj/btsMILIDAFt/a2gIKmXESdLJ7H2os0rSd0/img.png&quot; data-alt=&quot;RequestsDependencyWarning about urllib3 (2.2.1) or chardet (None)/charset_normalizer (3.4.0) doesn't match a supported version&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebuugj/btsMILIDAFt/a2gIKmXESdLJ7H2os0rSd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Febuugj%2FbtsMILIDAFt%2Fa2gIKmXESdLJ7H2os0rSd0%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;742&quot; height=&quot;120&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;RequestsDependencyWarning about urllib3 (2.2.1) or chardet (None)/charset_normalizer (3.4.0) doesn't match a supported version&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&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;이 오류는 Requests 라이브러리의 종속성 버전(urllib3, chardet, charset_normalizer)이 지원되는 버전과 맞지 않을 때 발생할 수 있습니다.&lt;/li&gt;
&lt;li&gt;최신 버전으로 업데이트하면 해결될 가능성이 높습니다.&lt;/li&gt;
&lt;li&gt;chardet가 설치되지 않은 경우, charset_normalizer가 사용되며, 이는 Python 3에서 선호됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;해결 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;RequestsDependencyWarning: urllib3 (2.2.1) or chardet (None)/charset_normalizer (3.4.0) doesn't match a supported version!&quot; 오류는 Requests 라이브러리가 사용하는 종속성(urllib3, chardet, charset_normalizer)의 버전이 지원되는 범위와 맞지 않을 때 나타납니다. 이 문제를 해결하려면 종속성을 최신 버전으로 업데이트하고, 필요에 따라 chardet를 제거하는 것이 좋습니다. 아래 단계를 따라 문제를 해결하세요.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Steps to Fix&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. chardet 제거 (설치된 경우):&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;chardet가 설치되어 있으면 제거하세요. Python 3에서는 charset_normalizer가 선호되므로 충돌을 방지합니다.&lt;/li&gt;
&lt;li&gt;명령어:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741823710400&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip uninstall chardet&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;b&gt;2. urllib3와 charset_normalizer 업데이트:&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;urllib3와 charset_normalizer를 최신 버전으로 업데이트하세요. 최신 버전은 일반적으로 Requests와 호환됩니다.&lt;/li&gt;
&lt;li&gt;명령어:&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741823716715&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install --upgrade urllib3 charset_normalizer&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;b&gt;3. Requests 업데이트:&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;Requests 라이브러리도 최신 버전으로 업데이트하세요. 이는 종속성 호환성을 보장합니다.&lt;/li&gt;
&lt;li&gt;명령어:&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741823723684&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install --upgrade requests&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Unexpected Detail&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;흥미롭게도, 이 경고는 종종 정보성 메시지로 간주될 수 있으며, 실제로 프로그램 실행에 영향을 미치지 않을 수 있습니다. 하지만 사용자 경험을 개선하려면 위 단계를 따라 문제를 해결하는 것이 좋습니다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Python/ERROR LOG</category>
      <category>requestsdependencywarning: urllib3 (2.2.1) or chardet (none)/charset_normalizer (3.4.0) doesn't match a supported version!</category>
      <category>warnings.warn(&amp;quot;urllib3 ({}) or chardet ({})/charset_normalizer ({}) doesn't match a supported &amp;quot;</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/217</guid>
      <comments>https://intelloper.tistory.com/entry/RequestsDependencyWarning-urllib3-chardet#entry217comment</comments>
      <pubDate>Thu, 13 Mar 2025 08:57:26 +0900</pubDate>
    </item>
    <item>
      <title>[프롬프트 그래프팅]에 대하여 아라보자 (실행 방법 포함, 딥리서치 이김)</title>
      <link>https://intelloper.tistory.com/entry/prompt-grafting</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y69bd/btsMIs9YFTC/8KMGyVLUMaEXRgXRHUzUw0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y69bd/btsMIs9YFTC/8KMGyVLUMaEXRgXRHUzUw0/img.webp&quot; data-alt=&quot;[프롬프트 그래프팅]에 대하여 아라보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y69bd/btsMIs9YFTC/8KMGyVLUMaEXRgXRHUzUw0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy69bd%2FbtsMIs9YFTC%2F8KMGyVLUMaEXRgXRHUzUw0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[프롬프트 그래프팅]에 대하여 아라보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  주요 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;**프롬프트 그래프팅(Prompt Grafting)**은 Perplexity AI의 시스템 프롬프트를 ChatGPT-o3-mini에 적용하여 두 모델의 강점을 결합하는 기법입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Perplexity AI의 연구 능력&lt;/b&gt;과 &lt;b&gt;ChatGPT의 추론 능력&lt;/b&gt;을 활용하여 더 나은 연구 에세이를 생성할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;실행 방법&lt;/b&gt;: Perplexity AI의 시스템 프롬프트를 확보하고, 이를 ChatGPT-o3-mini의 시스템 메시지로 설정한 후 활용하는 방식입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;한계점&lt;/b&gt;: ChatGPT-o3-mini는 실시간 웹 검색 기능이 제한적이므로 최신 정보 제공에는 어려움이 있을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;법적/윤리적 고려&lt;/b&gt;: 유출된 시스템 프롬프트 사용에는 법적, 윤리적 문제가 있을 수 있으므로 개인적/교육적 용도로만 활용하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  프롬프트 그래프팅이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프롬프트 그래프팅은 &lt;b&gt;한 AI 모델의 시스템 프롬프트를 다른 AI 모델의 첫 메시지로 사용하여 특정 스타일과 기능을 모방하는 기술&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법을 활용하면 &lt;b&gt;Perplexity AI의 연구 및 출처 기반 응답 능력&lt;/b&gt;과 &lt;b&gt;ChatGPT의 논리적 사고 및 해석 능력&lt;/b&gt;을 결합할 수 있습니다. 특히, 역사적 주제와 같이 &lt;b&gt;시간 민감도가 낮은 주제에서 더 깊이 있는 연구 기반의 에세이를 생성&lt;/b&gt;하는 데 효과적입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실행 방법: 단계별 가이드&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1️⃣ Perplexity AI의 시스템 프롬프트 확보&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ Perplexity AI의 시스템 프롬프트는 유출된 문서를 통해 얻을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 아래 GitHub 저장소에서 해당 프롬프트를 찾고 복사하세요: ➡️ &lt;a href=&quot;https://github.com/jujumilk3/leaked-system-prompts/blob/main/perplexity.ai_gpt4_20240311.md&quot;&gt;GitHub 링크&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이 프롬프트는 &lt;b&gt;사용자 요청 처리, 연구 수행, 응답 구조화 방법 등에 대한 지침&lt;/b&gt;을 포함하고 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2️⃣ ChatGPT-o3-mini에서 새 채팅 열기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;ChatGPT 플랫폼 접속 후, o3-mini 모델을 선택&lt;/b&gt;하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;커스텀 시스템 메시지 설정 지원 여부를 확인&lt;/b&gt;하세요. ➡️ 최신 버전(2025년 3월 11일 기준)에서는 대부분 지원됩니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3️⃣ 시스템 메시지 설정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ ChatGPT 인터페이스에서 &lt;b&gt;&quot;커스텀 지침(Custom Instructions)&quot;&lt;/b&gt; 또는 유사한 설정을 찾으세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;복사한 Perplexity AI 시스템 프롬프트를 해당 필드에 붙여넣고 저장&lt;/b&gt;하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이제 ChatGPT-o3-mini가 Perplexity의 연구 지침을 기반으로 응답을 제공하도록 설정됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4️⃣ 채팅 상호작용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이제 원하는 질문을 입력하여 &lt;b&gt;Perplexity의 연구 방식과 ChatGPT의 논리적 분석을 결합한 응답을 받을 수 있습니다.&lt;/b&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;&quot;프랑스 혁명의 주요 원인에 대한 연구 에세이를 작성해줘.&quot;&lt;/li&gt;
&lt;li&gt;&quot;일본 근대사에서 메이지 유신의 경제적 영향 분석해줘.&quot;&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 주요 고려사항 및 한계&lt;/h2&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;✅ ChatGPT-o3-mini는 Perplexity AI처럼 &lt;b&gt;실시간 웹 검색 기능이 부족&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ Perplexity AI는 실시간 정보 검색이 가능하지만, ChatGPT-o3-mini는 &lt;b&gt;사전 학습된 데이터&lt;/b&gt;를 기반으로 응답합니다. ➡️ 역사적 주제에는 적합하지만, &lt;b&gt;최신 뉴스나 실시간 경제 데이터 검색에는 한계&lt;/b&gt;가 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;✅ ChatGPT-o3-mini는 &lt;b&gt;2023년 이후 데이터 접근이 제한적&lt;/b&gt;일 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 중요한 정보는 별도로 검증하는 것이 필요합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;✅ Perplexity AI의 시스템 프롬프트는 유출된 정보이므로 &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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;✅ Perplexity AI의 시스템 프롬프트는 해당 모델에 최적화된 것이므로, ChatGPT-o3-mini에 적용 시 일부 &lt;b&gt;지침이 완전히 작동하지 않을 수 있음&lt;/b&gt;을 고려해야 합니다. ✅ 필요에 따라 **프롬프트 내용을 일부 수정(예: Perplexity 전용 명령어 제거)**하는 것이 좋습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  비교 분석: 프롬프트 그래프팅 vs 딥 리서치&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기준 프롬프트 그래프팅(PG) 딥 리서치(DR)&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;/td&gt;
&lt;td&gt;10초&lt;/td&gt;
&lt;td&gt;10분 이상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;  단어 수&lt;/td&gt;
&lt;td&gt;5,800 단어&lt;/td&gt;
&lt;td&gt;8,000 단어&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;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;PG는 속도와 학술적 깊이에서 우수&lt;/b&gt;하지만, &lt;b&gt;DR은 최신 정보 제공에 강점&lt;/b&gt;이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 역사적 주제에서는 &lt;b&gt;PG가 더 나은 결과를 제공&lt;/b&gt;한다는 테스트 결과가 있었습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  실전 테스트 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 아래 질문을 ChatGPT-o3-mini에 입력하고 응답을 확인하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;질문 예시:&lt;/b&gt; &quot;프랑스 혁명의 주요 원인에 대한 에세이를 작성해줘.&quot;&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;응답이 Perplexity의 시스템 프롬프트 지침에 따라 &lt;b&gt;출처가 명확히 인용&lt;/b&gt;되고 &lt;b&gt;구조적으로 정리된 형태&lt;/b&gt;인지 확인하세요.&lt;/li&gt;
&lt;li&gt;ChatGPT-o3-mini의 &lt;b&gt;추론 능력이 추가적으로 적용되었는지 평가&lt;/b&gt;해 보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  주요 인용 자료&lt;/h2&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;a href=&quot;https://github.com/jujumilk3/leaked-system-prompts/blob/main/perplexity.ai_gpt4_20240311.md&quot;&gt;Perplexity AI 시스템 프롬프트 유출 GitHub 저장소&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://www.theneurondaily.com/p/the-new-chatgpt-o3-mini&quot;&gt;ChatGPT o3-mini 모델 소개&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://aidisruptor.ai/p/how-to-use-chatgpts-deep-research&quot;&gt;ChatGPT 딥 리서치 기능 사용법&lt;/a&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;a href=&quot;https://www.perplexity.ai/hub/faq/prompting-tips-and-examples-on-perplexity&quot;&gt;Perplexity AI 프롬프팅 팁 및 예시&lt;/a&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741763627770&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;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&quot; data-og-description=&quot;최근 OpenAI는 GPT-4.5를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다. &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/O4LIe/hyYqYIP3yK/ZMGKc1I9rf5z1QLGpWK0xk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/byrqXe/hyYrS9lAzb/MEF78Yh1zKT5sIzpcukGeK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/O4LIe/hyYqYIP3yK/ZMGKc1I9rf5z1QLGpWK0xk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/byrqXe/hyYrS9lAzb/MEF78Yh1zKT5sIzpcukGeK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 OpenAI는 GPT-4.5를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;어려운 논문 한번에 파악 하는법 (feat.ChatGPT4)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741763688988&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;어려운 논문 한번에 파악 하는법 (feat.ChatGPT4)&quot; data-og-description=&quot;안녕하세요. 여러분들이 논문을 봤을때 보통 드는 느낌과 생각이 무었인가요? 저는 보통 영어로 되어 있어서 이거 언제 번역해서 읽지?' '이거 대충 어떤 논문이지?' 라는 생각부터 들어요. gpt4 pl&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bX1rwG/hyYqXwv3cG/Y2tzUGxIEVDsvddmGIAUfk/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/ldrP9/hyYqQjQnlZ/qRMdgDxkLOwkiC7UKlyfH1/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/8Gxb1/hyYr1kUtSN/BO83b9ZI1lfLZJT5YhZKK1/img.png?width=1572&amp;amp;height=1798&amp;amp;face=0_0_1572_1798&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bX1rwG/hyYqXwv3cG/Y2tzUGxIEVDsvddmGIAUfk/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/ldrP9/hyYqQjQnlZ/qRMdgDxkLOwkiC7UKlyfH1/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/8Gxb1/hyYr1kUtSN/BO83b9ZI1lfLZJT5YhZKK1/img.png?width=1572&amp;amp;height=1798&amp;amp;face=0_0_1572_1798');&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;어려운 논문 한번에 파악 하는법 (feat.ChatGPT4)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 여러분들이 논문을 봤을때 보통 드는 느낌과 생각이 무었인가요? 저는 보통 영어로 되어 있어서 이거 언제 번역해서 읽지?' '이거 대충 어떤 논문이지?' 라는 생각부터 들어요. gpt4 pl&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741763746607&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&quot; data-og-description=&quot;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &amp;quot;코드를 짜줘&amp;quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zFgng/hyYqapclBO/VQgEetypPPYDksBzvCNGkK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/Fga0x/hyYrRihTb5/Qmsu22Plt8SZQbcEq0Z5kk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zFgng/hyYqapclBO/VQgEetypPPYDksBzvCNGkK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/Fga0x/hyYrRihTb5/Qmsu22Plt8SZQbcEq0Z5kk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &quot;코드를 짜줘&quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>생성AI/인공지능 활용</category>
      <category>chatgpt o3-mini</category>
      <category>perplexity ai</category>
      <category>prompt grafting</category>
      <category>[프롬프트 그래프팅]에 대하여 아라보자</category>
      <category>딥리서치</category>
      <category>프롬프트 그래프팅</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/216</guid>
      <comments>https://intelloper.tistory.com/entry/prompt-grafting#entry216comment</comments>
      <pubDate>Wed, 12 Mar 2025 16:16:06 +0900</pubDate>
    </item>
    <item>
      <title>Manus AI 에 대하여 빠르게 아라보자</title>
      <link>https://intelloper.tistory.com/entry/Manus-AI</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7OjMd/btsMGNm577C/sTr4q81FOQuRpL9PwCvcD1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7OjMd/btsMGNm577C/sTr4q81FOQuRpL9PwCvcD1/img.webp&quot; data-alt=&quot;Manus AI 에 대하여 빠르게 아라보자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7OjMd/btsMGNm577C/sTr4q81FOQuRpL9PwCvcD1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7OjMd%2FbtsMGNm577C%2FsTr4q81FOQuRpL9PwCvcD1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Manus AI 에 대하여 빠르게 아라보자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;중국, 새로운 자율 AI '마누스 AI' 출시!&lt;/h1&gt;
&lt;div style=&quot;background-color: #ffffff; color: #34322d; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #000000; text-align: center;&quot;&gt;Manus는 마음과 행동을 연결하는 일반 AI 에이전트입니다. 생각하는 것뿐만 아니라 결과를 제공합니다. Manus는 일과 삶에서 다양한 작업에 능숙하며, 휴식을 취하는 동안 모든 것을 완료합니다.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bw5Y4N/btsMHSuBPVz/qm0dO84RLVzVVuwhgA7DMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bw5Y4N/btsMHSuBPVz/qm0dO84RLVzVVuwhgA7DMK/img.png&quot; data-alt=&quot;manus ai use cases&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bw5Y4N/btsMHSuBPVz/qm0dO84RLVzVVuwhgA7DMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbw5Y4N%2FbtsMHSuBPVz%2Fqm0dO84RLVzVVuwhgA7DMK%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;768&quot; height=&quot;630&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;manus ai use cases&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;요약부터 START&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[요약]&lt;/b&gt;&lt;/h4&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;b&gt;Manus AI의 독특함&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  자율성&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 기존 챗봇과 달리, &lt;/span&gt;&lt;span&gt;&lt;b&gt;Manus는 사용자의 지속적인 입력 없이도 클라우드에서 독립적으로 작업&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 수행함&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  다중 에이전트 시스템&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 계획, 실행, 검증 에이전트로 나뉘어 복잡한 작업을 &lt;/span&gt;&lt;span&gt;&lt;b&gt;병렬 처리함&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&amp;rarr; 예: 이력서 심사와 주식 분석을 동시에 진행!&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  실제 활용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 테슬라 주식 조사를 맡기면 데이터를 분석하고 보고서를 작성하는 등 &lt;/span&gt;&lt;span&gt;&lt;b&gt;실무 능력이 뛰어남&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;b&gt;성과와 경쟁력&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  GAIA 벤치마크&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 86.5% 정확도로 OpenAI(74.3%)를 제침&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  외부 도구 활용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: API 통합 성공률 89% (GPT-4는 41%).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;⚡ 데모 성과&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;10,000개 이력서를 &lt;/span&gt;&lt;span&gt;&lt;b&gt;8분 만에 스캔&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;React 웹사이트를 1시간 내 구축&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;b&gt;현황과 시장 반응&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  제한된 접근&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 초대 코드나 대기자 명단으로만 이용 가능 &amp;rarr; &lt;/span&gt;&lt;a href=&quot;https://manus.im&quot;&gt;&lt;span&gt;Manus 공식 사이트&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a href=&quot;https://manus.im/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://manus.im/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741757963540&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;Manus&quot; data-og-description=&quot;Manus is a general AI agent that turns your thoughts into actions. It excels at various tasks in work and life, getting everything done while you rest.&quot; data-og-host=&quot;manus.im&quot; data-og-source-url=&quot;https://manus.im/&quot; data-og-url=&quot;https://manus.im/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rkZhG/hyYrO6V6uN/SjmPTmBiWK9ieJKGhPpIT0/img.png?width=1241&amp;amp;height=655&amp;amp;face=0_0_1241_655,https://scrap.kakaocdn.net/dn/Ck6cR/hyYrYV0SO5/FCIPa6S1n0eKfPCe4y7ei0/img.png?width=1241&amp;amp;height=655&amp;amp;face=0_0_1241_655&quot;&gt;&lt;a href=&quot;https://manus.im/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://manus.im/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rkZhG/hyYrO6V6uN/SjmPTmBiWK9ieJKGhPpIT0/img.png?width=1241&amp;amp;height=655&amp;amp;face=0_0_1241_655,https://scrap.kakaocdn.net/dn/Ck6cR/hyYrYV0SO5/FCIPa6S1n0eKfPCe4y7ei0/img.png?width=1241&amp;amp;height=655&amp;amp;face=0_0_1241_655');&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;Manus&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Manus is a general AI agent that turns your thoughts into actions. It excels at various tasks in work and life, getting everything done while you rest.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;manus.im&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;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  금융 시장 반응&lt;/b&gt;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;발표 후 &lt;/span&gt;&lt;span&gt;&lt;b&gt;48시간 내 AI 관련 ETF에 120억 달러 유입&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;알리바바 주가 7.2% 상승&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&lt;b&gt;미래와 영향&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;  일자리 변화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 2027년까지 비물리적 직업의 &lt;/span&gt;&lt;span&gt;&lt;b&gt;23% 자동화 예상&lt;/b&gt;&lt;/span&gt;&lt;span&gt; (법률, 회계, 저널리즘 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;⚖️ 윤리 문제&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 자율 의사결정의 &lt;/span&gt;&lt;span&gt;&lt;b&gt;공정성 논란&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &amp;rarr; 해결책으로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;설명 가능성 API&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 등 제안&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt; ️ 계획&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 화웨이와 협력해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;NeuROM 칩&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 개발, 2025년 오픈 소스 공개 목표&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;본문 GO&lt;/b&gt;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스스로 생각하고, 행동하며, 일하는 AI가 등장하다!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날 아침, 커피를 마시며 주식 트렌드를 조사하고, 다음 여행을 계획하며, 난해한 코드를 디버깅하기 위해 수십 개의 탭을 여는 대신, AI가 스스로 이 모든 작업을 해결한다고 상상해보세요. 꿈처럼 들리지만, 중국의 최신 혁신 &lt;b&gt;마누스 AI&lt;/b&gt; 덕분에 이러한 미래가 현실로 다가오고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발자로서 AI의 발전을 지켜본 저는, 간단한 챗봇에서 ChatGPT 같은 고급 모델로의 도약을 목격해왔습니다. 하지만 &lt;b&gt;마누스 AI&lt;/b&gt;는 완전히 새로운 차원의 도약을 예고합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A3ZgV/btsMHywfBvv/5Sod2hpkBSQPNKw6DvkfHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A3ZgV/btsMHywfBvv/5Sod2hpkBSQPNKw6DvkfHk/img.png&quot; data-alt=&quot;manus.ai processing image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A3ZgV/btsMHywfBvv/5Sod2hpkBSQPNKw6DvkfHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA3ZgV%2FbtsMHywfBvv%2F5Sod2hpkBSQPNKw6DvkfHk%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;1231&quot; height=&quot;946&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;manus.ai processing image&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 contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마누스 AI란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중국은 AI 경쟁에서 강력한 행보를 보이며, &lt;b&gt;마누스 AI&lt;/b&gt;를 차세대 혁신 기술로 내세우고 있습니다. 비밀스러운 개발팀과 주요 투자자의 지원을 받는 이 AI는 단순한 질문 응답을 넘어, &lt;b&gt;자율적으로 사고하고 행동하는 AI 에이전트&lt;/b&gt;로 설계되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전통적인 AI 모델과 달리, 마누스 AI는 &lt;b&gt;사용자의 지속적인 입력 없이도 작업을 이해하고 실행하며, 웹을 탐색하고 정보를 수집하여 목표를 달성&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 마누스 AI에게 **&quot;테슬라 주식의 최고 투자 기회를 조사해줘&quot;**라고 요청하면, 단순한 정보 제공이 아니라 실시간 데이터를 분석하고, 전문가 의견을 비교하며, 심층적인 보고서를 제공하는 방식입니다. &lt;b&gt;손가락 하나 까딱하지 않아도 AI가 모든 일을 해내는 것이죠!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ky5ee/btsMIFackTe/BB1IoZT63YrMMsyOwsF6tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ky5ee/btsMIFackTe/BB1IoZT63YrMMsyOwsF6tK/img.png&quot; data-alt=&quot;manus ai process done for make 7-Day Japan Itinerary with Proposal Ideas&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ky5ee/btsMIFackTe/BB1IoZT63YrMMsyOwsF6tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fky5ee%2FbtsMIFackTe%2FBB1IoZT63YrMMsyOwsF6tK%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;768&quot; height=&quot;590&quot; data-origin-width=&quot;1231&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;manus ai process done for make 7-Day Japan Itinerary with Proposal Ideas&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마누스 AI, 화제의 중심에 서다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초대 전용 웹 미리보기로 등장한 마누스 AI는 출시 직후 엄청난 관심을 받았습니다. AI 커뮤니티는 물론, 기술 애호가들까지도 이 AI가 진정으로 어떤 능력을 갖췄는지 확인하고 싶어 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보고서에 따르면 마누스 AI는 &lt;b&gt;GAIA 벤치마크&lt;/b&gt;에서 OpenAI의 연구 모델을 능가했다고 합니다. GAIA 벤치마크는 AI의 추론 및 작업 실행 능력을 평가하는 테스트로, 마누스 AI가 &lt;b&gt;새로운 기준을 세우고 있을 가능성&lt;/b&gt;을 시사합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마누스 AI의 강력한 기능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마누스 AI가 특별한 이유는 다음과 같습니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;자율적 의사결정&lt;/b&gt;: 간단한 지시만 주면, AI가 최적의 해결 방법을 찾아 실행합니다. 마치 능숙한 디지털 비서를 둔 것과 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;클라우드 기반 비동기 작업&lt;/b&gt;: 장치에 연결할 필요 없이, AI가 백그라운드에서 작업을 완료하고 나중에 결과를 제공하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;고급 웹 브라우징 및 실행 기능&lt;/b&gt;: 실시간 데이터 수집, 출처 확인, 분석까지 수행하는 능력은 기존 AI 모델을 넘어섭니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;산업 전반의 영향력&lt;/b&gt;: 연구, 보고서 작성, 코드 디버깅 등 다양한 분야에서 활용될 가능성이 큽니다. 이는 특히 개발자들에게 &lt;b&gt;게임 체인저&lt;/b&gt;가 될 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;AI의 미래는?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마누스 AI는 단순한 AI 도우미를 넘어 &lt;b&gt;진정한 AI 자율성&lt;/b&gt;의 가능성을 제시합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 AI가 인간의 개입 없이도 작업을 수행하고 의사결정을 내릴 수 있다면, 이는 산업 혁신을 넘어 &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;p data-ke-size=&quot;size16&quot;&gt;AI는 이미 코딩 지원의 필수 도구가 되었으며, 마누스 AI는 이를 더욱 발전시킬 가능성이 큽니다. 우리는 앞으로의 발전을 면밀히 지켜볼 필요가 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;글로벌 AI 경쟁의 격화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI, Google DeepMind, 그리고 이제 &lt;b&gt;중국의 마누스 AI&lt;/b&gt;까지 AI 기술 전쟁이 더욱 치열해지고 있습니다. 마누스 AI가 과연 그 대담한 주장에 부응할지 여부는 시간이 지나야 알겠지만, 한 가지는 확실합니다:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;AI의 미래는 챗봇을 넘어, 자율적이고 결정을 내리는 AI 에이전트로 이동하고 있다!&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  앞으로 어떻게 될까요?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 기술이 빠르게 발전함에 따라, 마누스 AI 같은 시스템이 우리의 일상을 어떻게 변화시킬지 기대됩니다. 우리는 새로운 AI 혁신 시대의 문 앞에 서 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;여러분의 생각은 어떠신가요?&lt;/b&gt; AI의 자율성이 기대되시나요, 아니면 우려가 되시나요? 댓글로 여러분의 의견을 나눠주세요!&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;b&gt;함께보면 좋은글&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741758407742&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;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&quot; data-og-description=&quot;우선 긴글을 싫어하는 당신을 위한 요약 부터 고고  DeepSeek R1 요약  DeepSeek R1이란?중국의 AI 기업 DeepSeek에서 개발한 최신 AI 모델.OpenAI의 o1 모델과 동급 성능을 보이면서도 98% 저렴함.오픈소&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bd2u5e/hyYr0TPtle/lpQ0dDpSnt4r4TN2bKKGYK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dK6MZc/hyYq0tcSQU/0ZEezkAcMH73zeVsRieVP1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fuDoD/hyYqTnjZxr/kDDM6Zvr6psQubaPrLD9sK/img.png?width=700&amp;amp;height=512&amp;amp;face=0_0_700_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bd2u5e/hyYr0TPtle/lpQ0dDpSnt4r4TN2bKKGYK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dK6MZc/hyYq0tcSQU/0ZEezkAcMH73zeVsRieVP1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fuDoD/hyYqTnjZxr/kDDM6Zvr6psQubaPrLD9sK/img.png?width=700&amp;amp;height=512&amp;amp;face=0_0_700_512');&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;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;우선 긴글을 싫어하는 당신을 위한 요약 부터 고고  DeepSeek R1 요약  DeepSeek R1이란?중국의 AI 기업 DeepSeek에서 개발한 최신 AI 모델.OpenAI의 o1 모델과 동급 성능을 보이면서도 98% 저렴함.오픈소&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Grok3에 대해서 빠르게 아라보자 (요약본)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741758413996&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;Grok3에 대해서 빠르게 아라보자 (요약본)&quot; data-og-description=&quot;  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(LLM)로, 이전 버전인&amp;nbsp;Grok 2에 비해&amp;nbsp;비약적인 성능 향상을 이루었습니다  . Elon Musk는 이를 &amp;quot;지구에서 가장 똑똑한 AI&amp;quot;라고 표현했으&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bLzlOB/hyYqZVmCc1/SIXU6Z7zAfT5ybpo7P5mwK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/sHPJA/hyYqM2MOtV/DOXE3NJUGZlUXeD12LOxC0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bLzlOB/hyYqZVmCc1/SIXU6Z7zAfT5ybpo7P5mwK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/sHPJA/hyYqM2MOtV/DOXE3NJUGZlUXeD12LOxC0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Grok3에 대해서 빠르게 아라보자 (요약본)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(LLM)로, 이전 버전인&amp;nbsp;Grok 2에 비해&amp;nbsp;비약적인 성능 향상을 이루었습니다  . Elon Musk는 이를 &quot;지구에서 가장 똑똑한 AI&quot;라고 표현했으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Grok 3] AI 스케일링의 새로운 기준  &lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741758420132&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;[Grok 3] AI 스케일링의 새로운 기준  &quot; data-og-description=&quot;Grok 3가 뭔지 모른다면 이 글 참고 go [AI/AI 정보] - Grok3에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;Grok3에 대해서 빠르게 아라보자 (요약본)  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bX5Ik8/hyYrXbI4kw/Zdjai766mKB3rJ3zHgWTX0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c91pIf/hyYq0zS2pB/bRTTKF8hMHmUrvbt669NEK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bRRg5t/hyYrW4Ys6N/7GtHevyPZ6cIl8DIbL1HUK/img.jpg?width=700&amp;amp;height=493&amp;amp;face=0_0_700_493&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bX5Ik8/hyYrXbI4kw/Zdjai766mKB3rJ3zHgWTX0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c91pIf/hyYq0zS2pB/bRTTKF8hMHmUrvbt669NEK/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bRRg5t/hyYrW4Ys6N/7GtHevyPZ6cIl8DIbL1HUK/img.jpg?width=700&amp;amp;height=493&amp;amp;face=0_0_700_493');&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;[Grok 3] AI 스케일링의 새로운 기준  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Grok 3가 뭔지 모른다면 이 글 참고 go [AI/AI 정보] - Grok3에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;Grok3에 대해서 빠르게 아라보자 (요약본)  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DeepSeek R-1 우분투에서 써보기 feat.Ollama&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741758426279&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;DeepSeek R-1 우분투에서 써보기 feat.Ollama&quot; data-og-description=&quot;DeepSeek에 대해서 모른다면 밑에 글 빠르게 훑어보자딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)우선 긴글을 싫어하는 당신을 위한 요&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gtIed/hyYqYoC5nB/nXncN5PtBwAugstWkvdyQ1/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/cB3fCB/hyYqM2MOA9/OG78QhP5zmg3hlWPOEcKBK/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/Gc317/hyYqaCIAgR/WdE5KjFvg5qgDWaTJhLPI1/img.png?width=1217&amp;amp;height=1222&amp;amp;face=0_0_1217_1222&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/DeepSeek-ubuntu-test&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gtIed/hyYqYoC5nB/nXncN5PtBwAugstWkvdyQ1/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/cB3fCB/hyYqM2MOA9/OG78QhP5zmg3hlWPOEcKBK/img.png?width=800&amp;amp;height=468&amp;amp;face=0_0_800_468,https://scrap.kakaocdn.net/dn/Gc317/hyYqaCIAgR/WdE5KjFvg5qgDWaTJhLPI1/img.png?width=1217&amp;amp;height=1222&amp;amp;face=0_0_1217_1222');&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;DeepSeek R-1 우분투에서 써보기 feat.Ollama&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DeepSeek에 대해서 모른다면 밑에 글 빠르게 훑어보자딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;딥시크(DeepSeek)에 대해서 빠르게 아라보자 (요약본)우선 긴글을 싫어하는 당신을 위한 요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>AI/AI 정보</category>
      <category>AI Agent</category>
      <category>manus ai</category>
      <category>manus ai 에 대하여 빠르게 아라보자</category>
      <category>open ai</category>
      <category>마누스 ai</category>
      <category>자율 AI</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/215</guid>
      <comments>https://intelloper.tistory.com/entry/Manus-AI#entry215comment</comments>
      <pubDate>Wed, 12 Mar 2025 14:56:35 +0900</pubDate>
    </item>
    <item>
      <title>MongoDB 에러 대응 총정리 (/etc/mongod.conf (code=exited, status=1/FAILURE))</title>
      <link>https://intelloper.tistory.com/entry/MongoDB-error-defence</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzo4QY/btsMGB56Q9G/sbno5PVRoRkeqi8R1g4wJ1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzo4QY/btsMGB56Q9G/sbno5PVRoRkeqi8R1g4wJ1/img.webp&quot; data-alt=&quot;MongoDB 에러 대응 총정리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzo4QY/btsMGB56Q9G/sbno5PVRoRkeqi8R1g4wJ1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzo4QY%2FbtsMGB56Q9G%2Fsbno5PVRoRkeqi8R1g4wJ1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MongoDB 에러 대응 총정리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;color: #0090e1; text-align: start;&quot;&gt;
&lt;div style=&quot;color: #0090e1;&quot;&gt;
&lt;div style=&quot;color: #0090e1;&quot;&gt;
&lt;div style=&quot;color: #0090e1;&quot;&gt;
&lt;div style=&quot;color: #222222;&quot;&gt;
&lt;div style=&quot;color: #0090e1;&quot;&gt;
&lt;div style=&quot;color: #0090e1;&quot;&gt;
&lt;div style=&quot;color: #0090e1;&quot;&gt;
&lt;h2 style=&quot;color: #222222;&quot; data-nodeid=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;systemctl status mongod&amp;nbsp;출력 결과를 바탕으로 MongoDB가 갑자기 꺼진 문제를 분석하고 해결하는 방법을 단계별로 자세히 설명드리겠습니다.&lt;/span&gt;&lt;/h2&gt;
&lt;h2 style=&quot;color: #222222;&quot; data-nodeid=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; color: #333333;&quot;&gt;원인 분석 방법, 조치 방법, 그리고 Python으로 자동 재시작하는 방법까지 모두!&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1741579723710&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;times; mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sat 2025-03-08 13:18:42 KST; 1 day 21h ago
       Docs: https://docs.mongodb.org/manual
    Process: 2491485 ExecStart=/usr/bin/mongod --config /etc/mongod.conf (code=exited, status=1/FAILURE)
   Main PID: 2491485 (code=exited, status=1/FAILURE)
        CPU: 13min 3.358s&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WowOt/btsMFvrXOhw/1bhcMHoKg8OKkCkEnDc8Ik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WowOt/btsMFvrXOhw/1bhcMHoKg8OKkCkEnDc8Ik/img.png&quot; data-alt=&quot;/etc/mongod.conf (code=exited, status=1/FAILURE)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WowOt/btsMFvrXOhw/1bhcMHoKg8OKkCkEnDc8Ik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWowOt%2FbtsMFvrXOhw%2F1bhcMHoKg8OKkCkEnDc8Ik%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;1035&quot; height=&quot;189&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;189&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;/etc/mongod.conf (code=exited, status=1/FAILURE)&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 style=&quot;color: #222222;&quot; data-nodeid=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-nodeid=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 원인 분석 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB가 갑자기 꺼진 이유를 파악하려면 로그와 시스템 상태를 점검해야 합니다. 아래 단계를 따라 진행하세요.&lt;/p&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;7&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(1) MongoDB 로그 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB는 기본적으로&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;/var/log/mongodb/mongod.log&lt;/span&gt;에 로그를 남깁니다. 오류의 원인을 찾기 위해 다음 명령어를 실행하세요:&lt;/p&gt;
&lt;pre class=&quot;stata&quot; style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;9&quot;&gt;&lt;code&gt;sudo cat /var/log/mongodb/mongod.log | tail -n 100
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;11&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;tail -n 100: &lt;/span&gt;최근 100줄을 확인합니다. 필요하면 숫자를 조정해 더 많은 로그를 볼 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;13&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;-&amp;nbsp;&lt;/span&gt;로그에서 &quot;ERROR&quot;, &quot;FATAL&quot;, &quot;crash&quot; 같은 키워드를 찾으세요.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;13&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;13&quot;&gt;&lt;b&gt;예상 원인 예시:&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;15&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;-&amp;nbsp;&lt;/span&gt;디스크 공간 부족&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;no space left on device&amp;nbsp;&lt;/span&gt;메시지가 보이면 디스크가 꽉 찼을 가능성이 높습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;17&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;-&amp;nbsp;&lt;/span&gt;권한 문제&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;permission denied&lt;/span&gt;가 보이면 MongoDB가 필요한 파일에 접근하지 못한 경우입니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;19&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;-&amp;nbsp;&lt;/span&gt;설정 오류&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;/etc/mongod.conf&lt;/span&gt;&amp;nbsp;파일의 설정 문제로 실패할 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;21&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: left;&quot;&gt;-&amp;nbsp;&lt;/span&gt;메모리 부족&lt;/b&gt;: OOM(Out Of Memory) Killer가 MongoDB를 종료했을 가능성도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;23&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(2) 시스템 저널 확인&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;systemctl status&lt;/span&gt;에 &quot;journal has been rotated&quot;라는 메시지가 있으므로, 전체 로그를 확인하려면&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;journalctl&lt;/span&gt;을 사용하세요:&lt;/p&gt;
&lt;pre class=&quot;css&quot; style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;25&quot;&gt;&lt;code&gt;sudo journalctl -u mongod.service --since &quot;2025-03-08 13:00:00&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;26&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;27&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;--since:&lt;/span&gt; 문제가 발생한 시간(2025-03-08 13:18:42 KST) 직전부터 로그를 확인합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;29&quot;&gt;여기서도 오류 메시지를 주의 깊게 보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;31&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;(3) 리소스 점검&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;33&quot;&gt;&lt;b&gt;디스크 공간&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;df -h&lt;/span&gt;로 디스크 사용량을 확인하세요. MongoDB 데이터 디렉토리(기본:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;/var/lib/mongodb&lt;/span&gt;)가 꽉 찼는지 확인합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;35&quot;&gt;&lt;b&gt;메모리&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;free -m&lt;/span&gt;으로 사용 가능한 메모리를 점검하세요. 메모리가 부족하면 MongoDB가 종료될 수 있습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;37&quot;&gt;&lt;b&gt;CPU&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;top&lt;/span&gt;&amp;nbsp;또는&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;htop&lt;/span&gt;으로 CPU 부하를 확인하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;39&quot; data-ke-size=&quot;size20&quot;&gt;출력 결과 분석&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;40&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;41&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Active: failed (Result: exit-code)&lt;/span&gt;와&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;status=1/FAILURE&lt;/span&gt;는 MongoDB가 비정상적으로 종료되었음을 나타냅니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;43&quot;&gt;- 정확한 원인은 로그에서 확인해야 하지만, 일반적인 실패 원인은 위와 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-nodeid=&quot;46&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 조치 방법&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;47&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원인에 따라 아래 조치를 적용하세요.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;48&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) 디스크 공간 부족&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;디스크가 꽉 찼다면, 불필요한 파일을 삭제하거나 디스크를 확장하세요:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741579167174&quot; class=&quot;crystal&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 du -h /var/lib/mongodb | sort -rh | head -n 10&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;span style=&quot;letter-spacing: 0px;&quot;&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 data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정리 후 MongoDB 재시작:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;49&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;58&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo systemctl restart mongod&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;59&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) 권한 문제&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;데이터 디렉토리와 로그 파일의 권한을 확인하고 수정:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;60&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;63&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo chown -R mongodb:mongodb /var/lib/mongodb&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;63&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo chown -R mongodb:mongodb /var/log/mongodb&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;재시작:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;60&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;66&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo systemctl restart mongod&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;67&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(3) 설정 오류&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;/etc/mongod.conf&amp;nbsp;파일을 열어 확인:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741579286914&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nano /etc/mongod.conf&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;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;bindIp,&amp;nbsp;port,&amp;nbsp;dbPath&lt;/span&gt;&amp;nbsp;등이 올바른지 점검하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;수정 후 저장하고 재시작:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741579280628&quot; class=&quot;ebnf&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 systemctl restart mongod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;78&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(4) 메모리 부족&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;dmesg | grep -i &quot;killed&quot;&lt;/span&gt;로 OOM Killer가 MongoDB를 종료했는지 확인하세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해결책:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Swap 공간 추가:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;79&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;82&quot;&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;84&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;87&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo fallocate -l 2G /swapfile&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;87&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo chmod 600 /swapfile&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;87&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo mkswap /swapfile&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;87&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sudo swapon /swapfile&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MongoDB 메모리 제한 설정(/etc/mongod.conf에 추가):&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741579387881&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;storage: 
	wiredTiger: 
    	engineConfig: 
        	cacheSizeGB: 1 # 메모리 사용량 제한 (예: 1GB)&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;span style=&quot;color: #000000;&quot;&gt;재시작:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741579919594&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl restart mongod&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;94&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(5) 서비스 상태 확인&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;95&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;96&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;재시작 후 상태를 확인하세요:&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1741579441605&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl status mongod&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-ke-list-type=&quot;disc&quot; data-nodeid=&quot;99&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;100&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;Active: active (running)&lt;/span&gt;이 나타나면 성공입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-nodeid=&quot;103&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. Python으로 MongoDB 자동 재시작 구현&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;104&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;MongoDB가 꺼졌을 때 자동으로 재시작하려면 Python 스크립트를 작성해 모니터링 및 조치를 자동화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;105&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예제 코드&lt;/span&gt;&lt;/h4&gt;
&lt;pre class=&quot;python&quot; style=&quot;background-color: #f4f7f8;&quot; data-nodeid=&quot;106&quot;&gt;&lt;code&gt;import subprocess
import time
from pymongo import MongoClient
import logging
# 로깅 설정
logging.basicConfig(filename='mongodb_monitor.log', level=logging.INFO,
                    format='%(asctime)s - %(message)s')
def is_mongodb_running():
    &quot;&quot;&quot;MongoDB 서비스 상태 확인&quot;&quot;&quot;
    result = subprocess.run(['systemctl', 'is-active', 'mongod'], 
                           capture_output=True, text=True)
    return result.stdout.strip() == 'active'
def restart_mongodb():
    &quot;&quot;&quot;MongoDB 서비스 재시작&quot;&quot;&quot;
    try:
        subprocess.run(['sudo', 'systemctl', 'restart', 'mongod'], check=True)
        logging.info(&quot;MongoDB 재시작 성공&quot;)
        return True
    except subprocess.CalledProcessError as e:
        logging.error(f&quot;MongoDB 재시작 실패: {e}&quot;)
        return False
def check_mongodb_connection():
    &quot;&quot;&quot;MongoDB 연결 테스트&quot;&quot;&quot;
    try:
        client = MongoClient('mongodb://localhost:27017/', serverSelectionTimeoutMS=2000)
        client.server_info()  # 연결 테스트
        return True
    except Exception as e:
        logging.warning(f&quot;MongoDB 연결 실패: {e}&quot;)
        return False
def monitor_mongodb():
    &quot;&quot;&quot;MongoDB 모니터링 및 자동 재시작&quot;&quot;&quot;
    while True:
        if not is_mongodb_running():
            logging.warning(&quot;MongoDB가 실행 중이 아님. 재시작 시도.&quot;)
            if restart_mongodb():
                time.sleep(5)  # 재시작 후 대기
                if check_mongodb_connection():
                    logging.info(&quot;MongoDB 정상 동작 확인&quot;)
                else:
                    logging.error(&quot;MongoDB 재시작 후에도 연결 실패&quot;)
            else:
                logging.error(&quot;MongoDB 재시작 실패&quot;)
        else:
            if not check_mongodb_connection():
                logging.warning(&quot;MongoDB 연결 문제 감지. 재시작 시도.&quot;)
                restart_mongodb()
        time.sleep(60)  # 1분마다 체크
if __name__ == &quot;__main__&quot;:
    logging.info(&quot;MongoDB 모니터링 시작&quot;)
    monitor_mongodb()
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;실행 방법&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. 필요한 패키지 설치:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741577651041&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install pymongo&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 스크립트 저장: 예를 들어&amp;nbsp;monitor_mongodb.py로 저장.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 실행 권한 부여:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741577643835&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;chmod +x monitor_mongodb.py&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. 백그라운드 실행:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741577634763&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nohup python3 monitor_mongodb.py &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #222222;&quot; data-nodeid=&quot;107&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. 로그 확인:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741577628265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tail -f mongodb_monitor.log&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;123&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;동작 설명&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-nodeid=&quot;124&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;125&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;is_mongodb_running():&amp;nbsp;systemctl&lt;/span&gt;으로 서비스 상태를 확인합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;127&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;restart_mongodb():&lt;/span&gt; 서비스를 재시작하고 결과를 로깅합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;129&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;check_mongodb_connection():&lt;/span&gt; MongoDB에 연결을 시도해 정상 동작 여부를 확인합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;131&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;monitor_mongodb():&lt;/span&gt; 1분마다 상태를 체크하고, 필요 시 재시작을 시도합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #222222;&quot; data-nodeid=&quot;133&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;추가 설정&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;sudo 권한&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;sudo&lt;/span&gt;를 비밀번호 없이 실행하려면&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;/etc/sudoers&lt;/span&gt;에 아래를 추가하세요:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741577889140&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;your_username ALL=(ALL) NOPASSWD: /bin/systemctl restart mongod&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #222222;&quot; data-ke-list-type=&quot;disc&quot; data-nodeid=&quot;138&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;139&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;your_username&lt;/span&gt;을 실제 사용자 이름으로 변경하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;서비스로 등록&lt;/b&gt;: 스크립트를 systemd 서비스로 만들어 부팅 시 자동 실행되게 할 수 있습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741577979401&quot; class=&quot;awk&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 nano /etc/systemd/system/mongodb-monitor.service&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;내용:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741578143012&quot; class=&quot;routeros&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;[Unit] 
Description=MongoDB Monitor Service 
After=network.target 

[Service] 
ExecStart=/usr/bin/python3 /path/to/monitor_mongodb.py 
Restart=always 
User=your_username 

[Install] 
WantedBy=multi-user.target&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;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;활성화:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741578183298&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl enable mongodb-monitor
sudo systemctl start mongodb-monitor&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #222222;&quot; data-nodeid=&quot;149&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 종합 대응 요약&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #222222;&quot; data-nodeid=&quot;150&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;151&quot;&gt;&lt;b&gt;로그 분석&lt;/b&gt;:&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;/var/log/mongodb/mongod.log&lt;/span&gt;와&amp;nbsp;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;journalctl&lt;/span&gt;로 원인 파악.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;153&quot;&gt;&lt;b&gt;문제 해결&lt;/b&gt;: 디스크, 권한, 설정, 메모리 문제를 점검하고 수정.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;155&quot;&gt;&lt;b&gt;자동화&lt;/b&gt;: Python 스크립트로 모니터링 및 재시작 설정.&lt;/li&gt;
&lt;li style=&quot;list-style-type: none;&quot; data-nodeid=&quot;157&quot;&gt;&lt;b&gt;모니터링&lt;/b&gt;: 서비스 상태와 로그를 주기적으로 확인.&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>MongoDB/ERROR LOG</category>
      <category>/var/lib/mongodb</category>
      <category>execstart=/usr/bin/mongod --config /etc/mongod.conf (code=exited status=1/failure)</category>
      <category>mongod.log</category>
      <category>mongod.service</category>
      <category>mongodb error</category>
      <category>mongodb 에러 대응 총정리</category>
      <category>pip install pymongo</category>
      <category>sudo systemctl restart mongod</category>
      <category>systemctl status mongod</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/214</guid>
      <comments>https://intelloper.tistory.com/entry/MongoDB-error-defence#entry214comment</comments>
      <pubDate>Mon, 10 Mar 2025 13:22:01 +0900</pubDate>
    </item>
    <item>
      <title>현대 NLP - 토큰화, 임베딩, 텍스트 분류</title>
      <link>https://intelloper.tistory.com/entry/modern-NLP</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oK6RE/btsMDa9poEn/VFIEEFTmdU35fmMxTkXbW1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oK6RE/btsMDa9poEn/VFIEEFTmdU35fmMxTkXbW1/img.webp&quot; data-alt=&quot;현대 NLP - 토큰화, 임베딩, 텍스트 분류 text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oK6RE/btsMDa9poEn/VFIEEFTmdU35fmMxTkXbW1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoK6RE%2FbtsMDa9poEn%2FVFIEEFTmdU35fmMxTkXbW1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현대 NLP - 토큰화, 임베딩, 텍스트 분류 text image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;주요 용어 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;NLP (자연어 처리)&lt;/b&gt;: 컴퓨터가 인간 언어를 이해하고 생성하도록 돕는 기술&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LLM (대형 언어 모델)&lt;/b&gt;: 텍스트 생성 및 이해에 사용되는 대규모 모델&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NLTK (Natural Language Toolkit)&lt;/b&gt;: 텍스트 분석에 유용한 자연어 처리 도구킷&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SpaCy&lt;/b&gt;: 고성능 NLP 라이브러리로 효율적인 텍스트 처리를 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;n-grams&lt;/b&gt;: 텍스트 내에서 반복되는 n개의 단어 시퀀스&lt;/li&gt;
&lt;li&gt;&lt;b&gt;word clouds&lt;/b&gt;: 텍스트에서 자주 등장하는 단어를 시각적으로 표현&lt;/li&gt;
&lt;li&gt;&lt;b&gt;tokenization (토큰화)&lt;/b&gt;: 텍스트를 의미 있는 작은 단위(토큰)로 분리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;embeddings (임베딩)&lt;/b&gt;: 단어를 숫자 벡터로 변환해 의미 관계를 포착&lt;/li&gt;
&lt;li&gt;&lt;b&gt;transformers (트랜스포머)&lt;/b&gt;: 어텐션 메커니즘 기반 모델로 문맥 이해에 강력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;attention mechanism (어텐션 메커니즘)&lt;/b&gt;: 모델이 입력의 관련 부분에 집중하도록 지원&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BERT&lt;/b&gt;: 양방향 인코더 표현(Bidirectional Encoder Representations from Transformers)을 사용하는 사전 학습 언어 모델&lt;/li&gt;
&lt;li&gt;&lt;b&gt;IMDB&lt;/b&gt;: 영화 리뷰 데이터셋을 제공하는 인터넷 영화 데이터베이스&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 소개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 코드를 활용해 현대 자연어 처리(NLP)를 배우는 여정에 오신 것을 환영합니다. NLP는 컴퓨터가 인간 언어를 이해하고 생성하도록 돕는 기술로, 최근 &lt;b&gt;대형 언어 모델 (LLM)&lt;/b&gt; 덕분에 눈부신 발전을 이루었습니다. 현대 기술 덕분에 컴퓨터와의 대화가 마치 사람과 이야기하는 것처럼 자연스럽게 느껴집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거에는 &lt;b&gt;NLTK&lt;/b&gt;와 &lt;b&gt;SpaCy&lt;/b&gt; 같은 도구를 사용해 텍스트에서 패턴을 찾고, 키워드를 추출하며, &lt;b&gt;n-grams&lt;/b&gt;을 활용해 문맥을 분석했습니다. 또한, 아름다운 &lt;b&gt;word clouds&lt;/b&gt;도 큰 인기를 끌었죠.&lt;br /&gt;하지만 이제는 전통적인 도구와 더불어 LLM을 다루기 위한 현대적인 NLP 기법들이 필요해졌습니다. 이번 글에서는 이러한 최신 기법들을 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 현대 NLP 개념&lt;/h2&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;b&gt;토큰화 (Tokenization)&lt;/b&gt;: LLM이 텍스트를 어떻게 처리하는지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임베딩 (Embedding)&lt;/b&gt;: 단어를 숫자 벡터로 변환하는 방법&lt;/li&gt;
&lt;li&gt;&lt;b&gt;어텐션 메커니즘 (Attention Mechanism)&lt;/b&gt;: 트랜스포머 모델 내 작동 원리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BERT 세밀 조정 (Fine-tuning BERT)&lt;/b&gt;: 텍스트 분류 작업에 적용하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. LLM이 텍스트를 처리하는 방법: 토큰화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인간이 언어를 배우는 과정처럼, 컴퓨터도 텍스트를 입력받아 가장 의미 있는 작은 단위인 &lt;b&gt;토큰&lt;/b&gt;으로 분리합니다.&lt;br /&gt;예를 들어, 인간이 소리를 듣고 단어와 의미를 연결해 어휘력을 확장하는 것처럼, 컴퓨터는 텍스트를 단어 또는 단어의 일부로 쪼갭니다. 그리고 나서 각 토큰을 숫자 벡터로 변환하여 &lt;b&gt;임베딩&lt;/b&gt; 단계에서 단어 간 관계를 이해하게 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python 예제: BERT 토크나이저 사용&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from transformers import BertTokenizer

# BERT 토크나이저 로드
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)

# 샘플 텍스트
text = &quot;AI is transforming the future of technology.&quot;

# 텍스트 토큰화
tokens = tokenizer(text, return_tensors=&quot;pt&quot;, padding=True, truncation=True)
print(tokens)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;{'input_ids': tensor([[ 101, 7414, 2003, 12345, 1996, 2490, 1997, 2931, 1012, 102]]),
 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]),
 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 단어는 고유한 &lt;b&gt;ID&lt;/b&gt;로 변환되며, ID 101은 &lt;b&gt;[CLS]&lt;/b&gt; 토큰(문장 전체 의미 캡처), ID 102는 &lt;b&gt;[SEP]&lt;/b&gt; 토큰(문장 구분) 역할을 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 임베딩이란 무엇인가&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;br /&gt;뉴욕과 로스앤젤레스라는 도시 이름만으로는 그 위치 관계가 모호하지만, 좌표를 알면 두 도시가 같은 나라 내 반대편에 위치함을 파악할 수 있습니다. 임베딩은 각 토큰에 좌표를 부여해 의미적 거리를 이해하도록 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;의미 프로필&lt;/b&gt;:&lt;br /&gt;임베딩 벡터의 각 숫자는 단어의 특정 의미적 특성을 나타냅니다. 예를 들어, 3차원 벡터에서 &quot;dog&quot;의 임베딩이 [0.8, 0.2, 0.1]라면, 이는 &quot;동물&quot; 개념에서는 높게, &quot;음식&quot;에서는 낮게, &quot;행동&quot;에서는 매우 낮은 점수를 받음을 의미합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python 예제: BERT를 통한 임베딩 생성&lt;/h3&gt;
&lt;pre class=&quot;nix&quot;&gt;&lt;code&gt;from transformers import AutoTokenizer, AutoModel
import torch

# 토크나이저와 모델 로드
tokenizer = AutoTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)
model = AutoModel.from_pretrained(&quot;bert-base-uncased&quot;)

# 샘플 텍스트
text = &quot;AI is transforming the future of technology.&quot;

# 텍스트 토큰화
tokens = tokenizer(text, return_tensors=&quot;pt&quot;, padding=True, truncation=True)

# 모델을 사용해 임베딩 생성 (gradients 계산 불필요)
with torch.no_grad():
    output = model(**tokens)

# [CLS] 토큰 임베딩 사용
embedding = output.last_hidden_state[:, 0, :]
print(embedding)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력된 숫자 텐서는 LLM이 문장의 의미를 다른 텍스트와 연결해 복잡한 출력을 생성하는 데 사용됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 임베딩이 NLP 작업에서 중요한 이유&lt;/h2&gt;
&lt;p 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;BERT&lt;/b&gt;와 같은 트랜스포머 모델의 임베딩은 문맥적 의미까지 포착합니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Words to Numbers | AI generated image from Meta, 2025&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://meta.ai/&quot;&gt;meta.ai&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 트랜스포머의 어텐션 메커니즘 작동 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유명 논문 *&quot;Attention is All You Need&quot;*에서 제안된 어텐션 메커니즘은 쿼리와 키-값 쌍을 입력받아, 관련성이 높은 부분에 집중하여 출력(값의 가중치 합)을 생성하는 방식입니다.&lt;br /&gt;즉, LLM에 질문(쿼리)을 하면, 모델은 학습된 레이블 정보(키와 값) 중 질문과 관련성이 높은 부분을 찾아내어 답변을 생성합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. BERT 세밀 조정: 텍스트 분류 실습&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영화 리뷰 분류 작업에 &lt;b&gt;BERT&lt;/b&gt;를 활용하기 위해, &lt;b&gt;IMDB&lt;/b&gt; 데이터셋을 사용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Python 예제: IMDB 데이터셋을 활용한 텍스트 분류 준비&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import torch
from transformers import BertTokenizer, BertForSequenceClassification
from datasets import load_dataset

# 토크나이저 로드
tokenizer = BertTokenizer.from_pretrained(&quot;bert-base-uncased&quot;)

# IMDB 데이터셋 로드
dataset = load_dataset(&quot;imdb&quot;)

# 토큰화 함수 정의
def tokenize_function(examples):
    return tokenizer(examples[&quot;text&quot;], padding=&quot;max_length&quot;, truncation=True, max_length=128)

# 데이터셋 토큰화
tokenized_datasets = dataset.map(tokenize_function, batched=True)

# 학습 데이터 일부 선택 (샘플용)
train_dataset = tokenized_datasets[&quot;train&quot;].shuffle(seed=42).select(range(20))
test_dataset = tokenized_datasets[&quot;test&quot;].shuffle(seed=42).select(range(10))

# 이후 모델 로드 및 학습 설정은 생략합니다.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 현대 NLP의 핵심 개념들을 다루었습니다.&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;어텐션 메커니즘&lt;/b&gt;의 원리&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BERT&lt;/b&gt;를 활용한 텍스트 분류 실습&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 모든 과정을 통해 LLM이 텍스트 쿼리를 입력받아 놀라운 결과를 생성하는 과정을 쉽게 이해할 수 있기를 바랍니다. 마지막으로, &lt;b&gt;Jay Alammar&lt;/b&gt;의 &lt;a href=&quot;https://jalammar.github.io/illustrated-bert/&quot;&gt;BERT Visual Guide&lt;/a&gt;를 참고하여 시각화 자료도 함께 살펴보시길 추천드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 콘텐츠가 마음에 드셨다면, 데이터 과학 관련 더 많은 글을 위해 저를 팔로우해주세요!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Key Citations&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.analyticsvidhya.com/blog/2021/09/an-explanatory-guide-to-bert-tokenizer/&quot;&gt;An Explanatory Guide to BERT Tokenizer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://neptune.ai/blog/word-embeddings-guide&quot;&gt;The Ultimate Guide to Word Embeddings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.baeldung.com/cs/attention-mechanism-transformers&quot;&gt;Attention Mechanism in the Transformers Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackabuse.com/text-classification-with-bert-tokenizer-and-tf-2-0-in-python/&quot;&gt;Text Classification with BERT Tokenizer and TF 2.0 in Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jalammar.github.io/illustrated-bert/&quot;&gt;BERT Visual Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://meta.ai/&quot;&gt;Words to Numbers Image&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이와 같이 정돈된 포스트가 독자들이 현대 NLP의 핵심 원리와 기술들을 이해하는 데 큰 도움이 되길 바랍니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;함께보면 좋은 글&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741248320786&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;[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들&quot; data-og-description=&quot;파이썬 3.13 버전은 특히 머신러닝(ML)과 인공지능(AI) 분야에서 혁신적인 변화를 가져올 업데이트를 포함하고 있어보여 또 정리해보았습니다.&amp;nbsp;파이썬은 간단한 문법, 풍부한 라이브러리, 그리고 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Python-313&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Python-313&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eMy7H/hyYm6njoMt/6QfmPX0WwTDv8P4PCo1Ck0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/EqdgW/hyYnbhROSs/W1ckzrT8RZ3UtdK5B7rpW0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Python-313&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eMy7H/hyYm6njoMt/6QfmPX0WwTDv8P4PCo1Ck0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/EqdgW/hyYnbhROSs/W1ckzrT8RZ3UtdK5B7rpW0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬 3.13 버전은 특히 머신러닝(ML)과 인공지능(AI) 분야에서 혁신적인 변화를 가져올 업데이트를 포함하고 있어보여 또 정리해보았습니다.&amp;nbsp;파이썬은 간단한 문법, 풍부한 라이브러리, 그리고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/MLMachine-Learning-%EC%A7%A7%EC%9D%80-Review&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;ML(Machine Learning) 짧은 Review&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741248331525&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;ML(Machine Learning) 짧은 Review&quot; data-og-description=&quot;이미지 프로세싱 쪽을 공부하다보면 자연스럽게 머신러닝을 접하게 됩니다. 특히 요즘처럼 스마트폰 카메라와 AI를 적용한 어플리케이션들이 나오면서 관심이 있는 분들은 관련 기술분야를 찾&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/MLMachine-Learning-%EC%A7%A7%EC%9D%80-Review&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/MLMachine-Learning-%EC%A7%A7%EC%9D%80-Review&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b2BDqH/hyYm2d8LLd/1mxZyziEnROfkXO1bdIKt1/img.png?width=666&amp;amp;height=136&amp;amp;face=168_78_206_120,https://scrap.kakaocdn.net/dn/6CsVP/hyYm5PtH2h/gYF4GUIpIecstzmERBAKoK/img.png?width=666&amp;amp;height=136&amp;amp;face=168_78_206_120,https://scrap.kakaocdn.net/dn/bbwPJh/hyYmThjHgJ/hVVTL1GGkxWBLY9ZrYZwwk/img.png?width=574&amp;amp;height=158&amp;amp;face=37_3_564_155&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/MLMachine-Learning-%EC%A7%A7%EC%9D%80-Review&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/MLMachine-Learning-%EC%A7%A7%EC%9D%80-Review&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b2BDqH/hyYm2d8LLd/1mxZyziEnROfkXO1bdIKt1/img.png?width=666&amp;amp;height=136&amp;amp;face=168_78_206_120,https://scrap.kakaocdn.net/dn/6CsVP/hyYm5PtH2h/gYF4GUIpIecstzmERBAKoK/img.png?width=666&amp;amp;height=136&amp;amp;face=168_78_206_120,https://scrap.kakaocdn.net/dn/bbwPJh/hyYmThjHgJ/hVVTL1GGkxWBLY9ZrYZwwk/img.png?width=574&amp;amp;height=158&amp;amp;face=37_3_564_155');&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;ML(Machine Learning) 짧은 Review&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이미지 프로세싱 쪽을 공부하다보면 자연스럽게 머신러닝을 접하게 됩니다. 특히 요즘처럼 스마트폰 카메라와 AI를 적용한 어플리케이션들이 나오면서 관심이 있는 분들은 관련 기술분야를 찾&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Grok 3] AI 스케일링의 새로운 기준  &lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741248413557&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;[Grok 3] AI 스케일링의 새로운 기준  &quot; data-og-description=&quot;Grok 3가 뭔지 모른다면 이 글 참고 go [AI/AI 정보] - Grok3에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;Grok3에 대해서 빠르게 아라보자 (요약본)  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mcw4Y/hyYp8KKE6o/FxFkBQDOmOZ2VkzKUW04Nk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bSiROc/hyYp8DY2x2/tS1a6kHNc8XNerveBqLsqk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dMSG0V/hyYndfGlgj/0KVhADE0JRNKteklIOOLxk/img.jpg?width=700&amp;amp;height=493&amp;amp;face=0_0_700_493&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-scaling&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mcw4Y/hyYp8KKE6o/FxFkBQDOmOZ2VkzKUW04Nk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bSiROc/hyYp8DY2x2/tS1a6kHNc8XNerveBqLsqk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dMSG0V/hyYndfGlgj/0KVhADE0JRNKteklIOOLxk/img.jpg?width=700&amp;amp;height=493&amp;amp;face=0_0_700_493');&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;[Grok 3] AI 스케일링의 새로운 기준  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Grok 3가 뭔지 모른다면 이 글 참고 go [AI/AI 정보] - Grok3에 대해서 빠르게 아라보자 (요약본)&amp;nbsp;Grok3에 대해서 빠르게 아라보자 (요약본)  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>AI/ML*DL Study</category>
      <category>bertmodel</category>
      <category>datascience</category>
      <category>embeddings</category>
      <category>largelanguagemodels</category>
      <category>nlptutorial</category>
      <category>pythoncode</category>
      <category>textclassification</category>
      <category>tokenization</category>
      <category>Transformers</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/213</guid>
      <comments>https://intelloper.tistory.com/entry/modern-NLP#entry213comment</comments>
      <pubDate>Thu, 6 Mar 2025 17:07:31 +0900</pubDate>
    </item>
    <item>
      <title>AI 시대에도 여전히 소프트웨어 개발자가 필요한 이유</title>
      <link>https://intelloper.tistory.com/entry/future-of-developers-in-AI-generation</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YnsSU/btsMB1Mhipx/9cS7r6knVjwTDPMoysTYlK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YnsSU/btsMB1Mhipx/9cS7r6knVjwTDPMoysTYlK/img.webp&quot; data-alt=&quot;AI가 개발자 대체한다고? text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YnsSU/btsMB1Mhipx/9cS7r6knVjwTDPMoysTYlK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYnsSU%2FbtsMB1Mhipx%2F9cS7r6knVjwTDPMoysTYlK%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AI가 개발자 대체한다고? text image&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;h3 data-ke-size=&quot;size23&quot;&gt;AI가 완벽한 프로덕션 코드까지 자동으로 만들어낼 수 있을까요? 현실은 다릅니다. 대부분의 개발자는 하루에 몇 시간밖에 코딩하지 않습니다. &lt;a href=&quot;https://www.software.com/reports/code-time-report#:~:text=last%2030%20days.-,Few%20developers%20code%20more%20than%202%20hours%20per%20day,1%20hour%20per%20day%20coding&quot;&gt;이 그래프&lt;/a&gt;를 보면, 그들의 주요 업무는 코딩이 아니라 회의, 사양 협의, 문제 해결 등입니다.&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYdOiR/btsMC0sngjT/YszAhwyl48qkDKz2jzlkO1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYdOiR/btsMC0sngjT/YszAhwyl48qkDKz2jzlkO1/img.webp&quot; data-alt=&quot;출처: https://www.software.com/reports/code-time-report#:~:text=last%2030%20days.-,Few%20developers%20code%20more%20than%202%20hours%20per%20day,1%20hour%20per%20day%20coding&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYdOiR/btsMC0sngjT/YszAhwyl48qkDKz2jzlkO1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYdOiR%2FbtsMC0sngjT%2FYszAhwyl48qkDKz2jzlkO1%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;600&quot; height=&quot;423&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: https://www.software.com/reports/code-time-report#:~:text=last%2030%20days.-,Few%20developers%20code%20more%20than%202%20hours%20per%20day,1%20hour%20per%20day%20coding&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;진정한 소프트웨어 엔지니어가 AI에 의해 대체될 것이라는 주장은 2025년의 소프트웨어 개발 현실을 간과한 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&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;을 합니다. 최신 API를 배우는 것이 중요한 게 아니라, 변하는 요구사항을 이해하고 해결하는 것이 핵심입니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  AI의 역할&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT나 Copilot 같은 AI 도구는 사양을 받아 코드를 생성할 수 있습니다. 하지만 AI는 &lt;b&gt;올바른 질문을 하지 않습니다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 사용자의 미완성 아이디어를 그대로 따르며, 프로그램이 실제로 어떻게 작동해야 하는지 명확하게 하지 못합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 호텔 예약 시스템을 만들 때, 제품 소유자는 Expedia를 참고하고 싶어 한다고 가정합니다. 하지만 중요한 것은 그 아이디어를 실현하는 방법이고, 그 역할은 개발자의 몫입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 단순한 예외 처리는 할 수 있어도, &lt;b&gt;사용자 경험과 비즈니스 관점에서의 복잡한 문제 해결은 어렵습니다&lt;/b&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; &amp;zwj;  개발자의 미래&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 발전하면서 개발자의 역할도 변화할 것입니다. 하지만 이는 위기가 아니라 &lt;b&gt;기회&lt;/b&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;&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;p data-ke-size=&quot;size16&quot;&gt;특히, 주니어 개발자들에게는 새로운 도전이 될 수 있습니다. 전통적으로 초급 개발자는 AI가 자동화할 수 있는 단순한 작업을 통해 경험을 쌓았습니다. 이제는 업계가 &lt;b&gt;어떻게 신입 개발자를 온보딩하고 멘토링할지 고민해야 할 때&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚠️ 진짜 위협&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발의 가장 큰 위협은 AI가 아닙니다.&lt;/p&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;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 개발 환경을 혁신할 것이지만, 코드가 저절로 완벽하게 만들어지는 블랙박스는 아닙니다.&lt;/p&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;AI 시대에도 뛰어난 개발자는 더욱 중요한 존재가 될 것입니다. 변화에 적응하지 못하는 기업들은 그에 따른 대가를 치르게 될 것입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741245535451&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&quot; data-og-description=&quot;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &amp;quot;코드를 짜줘&amp;quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOChk2/hyYm77uQu5/PoxS2iK31ItKGHeZ1zhoi0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/ed6HGx/hyYmKkgzeZ/GDY5muARRkCoLICO6NJc7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOChk2/hyYm77uQu5/PoxS2iK31ItKGHeZ1zhoi0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/ed6HGx/hyYmKkgzeZ/GDY5muARRkCoLICO6NJc7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &quot;코드를 짜줘&quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741245544985&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;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&quot; data-og-description=&quot;최근 OpenAI는 GPT-4.5를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다. &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOMaTV/hyYnbhQ9uN/m4auOYGniuzO8EtPim0X91/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bCZeGl/hyYm2yq4t0/WnNolzg2TYAyl7RmAyvk00/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOMaTV/hyYnbhQ9uN/m4auOYGniuzO8EtPim0X91/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bCZeGl/hyYm2yq4t0/WnNolzg2TYAyl7RmAyvk00/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 OpenAI는 GPT-4.5를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741245569557&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dojGnx/hyYm5vaYjF/VRfKzLjOTwyPCdhLjB2dKk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dlRxCz/hyYmNnRBlH/ba6vkT3AalzeqPyxelhpP0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dojGnx/hyYm5vaYjF/VRfKzLjOTwyPCdhLjB2dKk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dlRxCz/hyYmNnRBlH/ba6vkT3AalzeqPyxelhpP0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>AI/AI 정보</category>
      <category>ai 개발자 대체</category>
      <category>ai 시대에도 여전히 소프트웨어 개발자가 필요한 이유</category>
      <category>ai 코딩</category>
      <category>AI 프로그래밍</category>
      <category>future of development work</category>
      <category>softwaredevelopment</category>
      <category>개발자 ai로 대체</category>
      <category>개발자 실직</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/212</guid>
      <comments>https://intelloper.tistory.com/entry/future-of-developers-in-AI-generation#entry212comment</comments>
      <pubDate>Thu, 6 Mar 2025 16:20:33 +0900</pubDate>
    </item>
    <item>
      <title>Git을 시니어 엔지니어처럼 사용하기</title>
      <link>https://intelloper.tistory.com/entry/how-to-use-git-senior</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esng2T/btsMA5nS5Lb/Rz5pCPA1RFh48H4glWKsU1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esng2T/btsMA5nS5Lb/Rz5pCPA1RFh48H4glWKsU1/img.webp&quot; data-alt=&quot;시니어 개발자 Git 사용법 text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esng2T/btsMA5nS5Lb/Rz5pCPA1RFh48H4glWKsU1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fesng2T%2FbtsMA5nS5Lb%2FRz5pCPA1RFh48H4glWKsU1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시니어 개발자 Git 사용법 text image&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;단순히 git add . &amp;amp;&amp;amp; git commit -m &quot;update&quot; &amp;amp;&amp;amp; git push만 사용하고 있다면, 아직 Git의 진정한 잠재력을 경험하지 못한 것입니다.&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;Git은 개발자가 필수적으로 사용해야 하는 강력한 도구입니다. 이 글에서는 Git을 보다 효과적으로 활용하는 방법을 소개합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Git 로그 살펴보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 git log 명령어는 너무 많은 정보를 제공해 가독성이 떨어집니다. 프로젝트에서 무슨 일이 일어나고 있는지 &lt;b&gt;고수준에서 한눈에 이해할 수 있는 방법&lt;/b&gt;이 필요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741220507592&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lBQIU/btsMBU0iUjs/p2CLzXsjNgCBqyQUdOZnRk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lBQIU/btsMBU0iUjs/p2CLzXsjNgCBqyQUdOZnRk/img.webp&quot; data-alt=&quot;git log printed in terminal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lBQIU/btsMBU0iUjs/p2CLzXsjNgCBqyQUdOZnRk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlBQIU%2FbtsMBU0iUjs%2Fp2CLzXsjNgCBqyQUdOZnRk%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;600&quot; height=&quot;420&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git log printed in terminal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가독성 높은 Git 로그 활용하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 사용하면 프로젝트의 Git 커밋을 보다 명확하게 확인할 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;git log --graph --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%an%C(reset)%C(bold yellow)%d%C(reset) %C(dim white)- %s%C(reset)' --all
&lt;/code&gt;&lt;/pre&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;b&gt;--graph&lt;/b&gt;: 브랜치의 분기와 병합을 시각적으로 보여줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;--format&lt;/b&gt;: 커밋 해시, 작성자, 날짜, 브랜치 정보를 깔끔하게 정리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;--all&lt;/b&gt;: 로컬 및 원격 브랜치의 모든 커밋을 포함합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkxZvE/btsMB6MYaAq/OoWivb4Ei88pouJbblDMJK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkxZvE/btsMB6MYaAq/OoWivb4Ei88pouJbblDMJK/img.webp&quot; data-alt=&quot;git log --graph --format used on terminal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkxZvE/btsMB6MYaAq/OoWivb4Ei88pouJbblDMJK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkxZvE%2FbtsMB6MYaAq%2FOoWivb4Ei88pouJbblDMJK%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;1215&quot; height=&quot;631&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git log --graph --format used on terminal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 옵션은 &lt;a href=&quot;https://git-scm.com/docs/git-log&quot;&gt;git-log 공식 문서&lt;/a&gt;에서 확인하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;특정 커밋의 변경 사항 이해하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 커밋에서 어떤 변경이 이루어졌는지 확인하고 싶을 때 git show 명령어를 사용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;커밋 요약 보기&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git show &amp;lt;commit&amp;gt; --stat
&lt;/code&gt;&lt;/pre&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;1108&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJzDd/btsMCB6MhyN/Ch9fSSg2GHHlIlrCNbPUW1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJzDd/btsMCB6MhyN/Ch9fSSg2GHHlIlrCNbPUW1/img.webp&quot; data-alt=&quot;git show commit used on terminal&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJzDd/btsMCB6MhyN/Ch9fSSg2GHHlIlrCNbPUW1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJzDd%2FbtsMCB6MhyN%2FCh9fSSg2GHHlIlrCNbPUW1%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;1108&quot; height=&quot;436&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;git show commit used on terminal&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특정 파일 변경 사항 확인하기&lt;/h3&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;git show &amp;lt;commit&amp;gt; -- &amp;lt;파일경로&amp;gt;
&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;더 자세한 정보는 &lt;a href=&quot;https://git-scm.com/docs/git-show&quot;&gt;git-show 공식 문서&lt;/a&gt;에서 참고하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;병합 충돌 해결하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 프로젝트를 하다 보면 브랜치를 병합할 때 충돌이 발생하는 경우가 많습니다. 이때 merge와 rebase를 적절히 활용하는 것이 중요합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;병합(Merge) vs 리베이스(Rebase)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;git merge&lt;/h4&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;git merge origin/main your-branch
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;merge는 두 브랜치를 하나의 병합 커밋으로 통합합니다.&lt;/li&gt;
&lt;li&gt;기존 기록을 유지하면서 변경 사항을 추가하는 방식입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;git rebase&lt;/h4&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;git rebase origin/main your-branch
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rebase는 내 브랜치의 기반을 최신 main 브랜치의 커밋 위로 이동시킵니다.&lt;/li&gt;
&lt;li&gt;merge보다 깔끔한 커밋 히스토리를 유지할 수 있습니다.&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;b&gt;rebase&lt;/b&gt;: 협업 중일 때, 최신 main의 변경 사항을 내 브랜치에 반영하고 싶을 때.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;merge&lt;/b&gt;: 기능이 완료된 브랜치를 main에 통합할 때.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 방법의 장단점을 이해하고 상황에 맞게 활용하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Git은 단순한 버전 관리 도구가 아니라 강력한 협업 도구입니다. 위에서 소개한 방법들을 익혀두면 보다 효율적으로 Git을 사용할 수 있습니다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741221742093&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dfxOlG/hyYm8FkiqR/LI4MVChxvSrse9bbM9WzT1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bwF6ZY/hyYm7Nc98E/ekCVB6YoozxOEFyszxdb7K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dfxOlG/hyYm8FkiqR/LI4MVChxvSrse9bbM9WzT1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bwF6ZY/hyYm7Nc98E/ekCVB6YoozxOEFyszxdb7K/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741221749322&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&quot; data-og-description=&quot;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &amp;quot;코드를 짜줘&amp;quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bOChk2/hyYm77uQu5/PoxS2iK31ItKGHeZ1zhoi0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/ed6HGx/hyYmKkgzeZ/GDY5muARRkCoLICO6NJc7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bOChk2/hyYm77uQu5/PoxS2iK31ItKGHeZ1zhoi0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/ed6HGx/hyYmKkgzeZ/GDY5muARRkCoLICO6NJc7k/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &quot;코드를 짜줘&quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://intelloper.tistory.com/entry/DevOps-automation-scripts&quot;&gt;DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741221718716&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;DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화&quot; data-og-description=&quot;DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화DevOps 엔지니어로서 가장 중요한 목표 중 하나는 효율성을 높이고 반복적인 작업을 줄이는 것입니다.Bash 스크립트를 활용하면 시스템 관리&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/DevOps-automation-scripts&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/DevOps-automation-scripts&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/G0M6v/hyYmKduAXu/XUx7JKi9L7pTjTuTCKH8fk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/uuE4s/hyYm0HjdXs/iUgLD8JyhOGMq5GrmKO8p1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/DevOps-automation-scripts&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/DevOps-automation-scripts&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/G0M6v/hyYmKduAXu/XUx7JKi9L7pTjTuTCKH8fk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/uuE4s/hyYm0HjdXs/iUgLD8JyhOGMq5GrmKO8p1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화DevOps 엔지니어로서 가장 중요한 목표 중 하나는 효율성을 높이고 반복적인 작업을 줄이는 것입니다.Bash 스크립트를 활용하면 시스템 관리&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Linux/Shell</category>
      <category>git</category>
      <category>git 사용법</category>
      <category>git 잘쓰는법</category>
      <category>git을 시니어 엔지니어처럼 사용하기</category>
      <category>고급 git</category>
      <category>고급 git 사용법</category>
      <category>버전관리</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/211</guid>
      <comments>https://intelloper.tistory.com/entry/how-to-use-git-senior#entry211comment</comments>
      <pubDate>Thu, 6 Mar 2025 09:40:43 +0900</pubDate>
    </item>
    <item>
      <title>GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유</title>
      <link>https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K4FHA/btsMBz21xCk/darBXuW4781yJS9WySkrG0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K4FHA/btsMBz21xCk/darBXuW4781yJS9WySkrG0/img.webp&quot; data-alt=&quot;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K4FHA/btsMBz21xCk/darBXuW4781yJS9WySkrG0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK4FHA%2FbtsMBz21xCk%2FdarBXuW4781yJS9WySkrG0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GPT-4.5와 (CoT, Chain of Thought) 혁명: AI가 '작업 과정'을 보여줘야 하는 이유&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;최근 OpenAI는 &lt;b&gt;GPT-4.5&lt;/b&gt;를 출시하며 AI 기술의 새로운 시대를 열었습니다. 이 모델은 자연스럽고 빠른 대화 능력을 갖추고 있지만, 답변의 과정은 명확히 설명하지 않는다는 점에서 한계를 가집니다. 반면, 경쟁사인 Anthropic, Google, DeepSeek 등은 &lt;b&gt;체인 오브 쏘트(CoT, Chain of Thought)&lt;/b&gt; 접근법을 채택하며 AI의 사고 과정을 단계별로 보여주는 방식으로 차별화를 꾀하고 있습니다.&lt;/p&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;CoT가 산업을 어떻게 변화시키는가?&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GPT-4.5의 설계 전략과 의도&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI 신뢰성과 미래&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과연 AI가 단순히 빠른 답변을 제공하는 것이 중요할까요, 아니면 신뢰할 수 있는 근거까지 보여주는 것이 더 중요할까요? 함께 알아보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;체인 오브 쏘트(CoT)란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT는 AI가 인간의 문제 해결 방식을 모방한 혁신적인 설계입니다. 단순히 정답을 내놓는 것이 아니라, 문제 해결 과정을 단계별로 분석하고, 오류를 수정하며 최종 답을 도출하는 방식이죠.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CoT의 작동 원리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT는 다음과 같은 방식으로 동작합니다:&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;br /&gt;예를 들어, &quot;전기 자동차의 환경 영향을 평가하라&quot;는 질문이 주어지면, CoT 모델은 다음과 같은 과정을 거칩니다:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;전기 자동차&quot;와 &quot;탄소 발자국&quot; 정의&lt;/li&gt;
&lt;li&gt;제조 시 배출량과 휘발유 자동차 비교&lt;/li&gt;
&lt;li&gt;배터리 생산과 장기 연료 절감 효과 분석&lt;/li&gt;
&lt;li&gt;최종 결론 도출 및 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기술적 기반&lt;/b&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;: AI가 자신의 추론을 스스로 검토하고 오류를 감지하는 기능&lt;/li&gt;
&lt;li&gt;&lt;b&gt;스크래치패드 메모리&lt;/b&gt;: AI가 추론 과정을 기록하고 검토하는 방식 (예: Google의 Gemini 모델)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CoT의 실제 적용 사례&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT는 다양한 분야에서 혁신을 일으키고 있습니다:&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;교육&lt;/b&gt;: 학생의 학습 수준에 맞춰 문제 해결 과정을 단계별로 설명&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CoT가 AI 산업의 게임 체인저인 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT가 주목받는 이유는 간단합니다. &lt;b&gt;AI의 투명성과 신뢰성을 높이기 때문입니다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 오류 감소&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT 모델은 중간 과정에서 오류를 잡아낼 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 AI: &quot;재생 에너지는 2030년까지 화석 연료를 대체할 것이다.&quot;&lt;/li&gt;
&lt;li&gt;CoT AI: &quot;현재 태양광 도입률을 고려하면 현실적으로 2040년이 더 적절함. 결론 수정.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과&lt;/b&gt;: DeepSeek의 CoT 모델은 기존 AI보다 사실적 오류가 40% 감소했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 투명성을 통한 신뢰 구축&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;법률가가 CoT 기반 AI를 활용해 계약서를 작성하면, 법적 논리를 직접 검토할 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;왜 7조를 우선시했나? &amp;rarr; 미국 통일상법전 3.2절과 일치하기 때문.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. 복잡한 의사결정 지원&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT는 논리가 필요한 작업에서 특히 강력한 역할을 합니다:&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;: Python을 Java보다 선택한 이유를 설명&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신약 개발&lt;/b&gt;: 분자와 단백질의 상호작용을 단계별로 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;GPT-4.5 vs. CoT 모델: 설계의 차이&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenAI의 GPT-4.5는 &lt;b&gt;빠르고 매끄러운 답변&lt;/b&gt;을 목표로 설계되었습니다. 반면, CoT 모델은 AI의 사고 과정을 드러내는 데 집중합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;GPT-4.5가 선택한 전략&lt;/b&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;: CoT 방식은 답변을 생성하는 데 2~5초의 추가 시간이 걸릴 수 있음&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;: CoT 모델은 더 많은 컴퓨팅 자원을 요구&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;CoT 방식의 단점?&lt;/b&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CoT의 미래 전망&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CoT 방식은 앞으로 더욱 발전할 가능성이 높습니다. 특히 다음과 같은 분야에서 강력한 영향력을 미칠 것입니다:&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;AI 규제와 법적 요구 증가&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2025년 시행될 &lt;b&gt;EU AI 책임법&lt;/b&gt;은 AI의 의사 결정 과정을 투명하게 기록할 것을 요구할 가능성이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;교육 혁신&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CoT 기반 AI 튜터는 학생의 이해 수준에 맞춰 맞춤형 설명을 제공할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI와 인간의 협업 강화&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 AI의 추론 과정에 직접 개입할 수 있는 인터페이스가 등장할 가능성 높음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;멀티모달 AI와의 결합&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;AI 투명성에 대한 요구는 피할 수 없다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GPT-4.5는 뛰어난 모델입니다. 자연스러운 문장을 생성하고, 빠르게 정보를 제공합니다. 하지만 그 과정이 투명하지 않다면 우리는 AI의 답변을 어디까지 신뢰할 수 있을까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, CoT 모델은 &lt;b&gt;설명이 필요한 분야&lt;/b&gt;에서 점점 더 필수적인 기술이 되고 있습니다. 특히 의료, 법률, 과학 연구 같은 분야에서는 AI의 추론 과정이 필수적이죠.&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;우리는 단순히 &quot;그럴듯한 답변&quot;을 원하나요?&lt;/li&gt;
&lt;li&gt;아니면 &quot;신뢰할 수 있는 답변&quot;을 원하나요?&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI가 점점 더 똑똑해질수록, &lt;b&gt;그 과정을 보여달라는 요구&lt;/b&gt;는 더욱 커질 것입니다. 그리고 언젠가는 OpenAI도 이 변화의 흐름을 거스를 수 없게 될 것입니다.&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;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;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741163440544&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&quot; data-og-description=&quot;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &amp;quot;코드를 짜줘&amp;quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/55mLs/hyYm4JwPlu/M3uI7998qr4KbkcWxycxw0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bWHfTi/hyYmTagrf2/LT5IVcZqK2ff4TMkQoNwLk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/55mLs/hyYm4JwPlu/M3uI7998qr4KbkcWxycxw0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/bWHfTi/hyYmTagrf2/LT5IVcZqK2ff4TMkQoNwLk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;상위 1% 개발자의 비밀 프레임워크  ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법을 공유하려 합니다.단순히 &quot;코드를 짜줘&quot;라고 묻는 수준을 넘어서, AI를 여러분의 개인 아키텍트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;어려운 논문 한번에 파악 하는법 (feat.ChatGPT4)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741163422429&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;어려운 논문 한번에 파악 하는법 (feat.ChatGPT4)&quot; data-og-description=&quot;안녕하세요. 여러분들이 논문을 봤을때 보통 드는 느낌과 생각이 무었인가요? 저는 보통 영어로 되어 있어서 이거 언제 번역해서 읽지?' '이거 대충 어떤 논문이지?' 라는 생각부터 들어요. gpt4 pl&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/crdWfX/hyYnawdtmf/g6pC87Aj9kCuhKjUVHiItk/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/cNI27i/hyYm61D2aV/akekchhQfjueiWV6cs6P5K/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/bkFgok/hyYnabUtdA/WwAnIOgS7k1RfQNW2UpkF1/img.png?width=1572&amp;amp;height=1798&amp;amp;face=0_0_1572_1798&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%96%B4%EB%A0%A4%EC%9A%B4-%EB%85%BC%EB%AC%B8-%ED%95%9C%EB%B2%88%EC%97%90-%ED%8C%8C%EC%95%85-%ED%95%98%EB%8A%94%EB%B2%95-featChatGPT4-1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/crdWfX/hyYnawdtmf/g6pC87Aj9kCuhKjUVHiItk/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/cNI27i/hyYm61D2aV/akekchhQfjueiWV6cs6P5K/img.png?width=800&amp;amp;height=915&amp;amp;face=0_0_800_915,https://scrap.kakaocdn.net/dn/bkFgok/hyYnabUtdA/WwAnIOgS7k1RfQNW2UpkF1/img.png?width=1572&amp;amp;height=1798&amp;amp;face=0_0_1572_1798');&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;어려운 논문 한번에 파악 하는법 (feat.ChatGPT4)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;안녕하세요. 여러분들이 논문을 봤을때 보통 드는 느낌과 생각이 무었인가요? 저는 보통 영어로 되어 있어서 이거 언제 번역해서 읽지?' '이거 대충 어떤 논문이지?' 라는 생각부터 들어요. gpt4 pl&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>생성AI/ChatGPT</category>
      <category>Chain of Thought</category>
      <category>chainofthought</category>
      <category>chat gpt cot</category>
      <category>chatgpt 4.5 cot</category>
      <category>gpt4.5</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/210</guid>
      <comments>https://intelloper.tistory.com/entry/GPT-45-Chain-of-Thought#entry210comment</comments>
      <pubDate>Wed, 5 Mar 2025 17:32:01 +0900</pubDate>
    </item>
    <item>
      <title>MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017</title>
      <link>https://intelloper.tistory.com/entry/MongoNetworkError-connect-ECONNREFUSED</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;1086&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmNncB/btsMCp6ffZL/kwiD1zDtiZHRSSy1AKxzH0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmNncB/btsMCp6ffZL/kwiD1zDtiZHRSSy1AKxzH0/img.webp&quot; data-alt=&quot;MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmNncB/btsMCp6ffZL/kwiD1zDtiZHRSSy1AKxzH0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmNncB%2FbtsMCp6ffZL%2FkwiD1zDtiZHRSSy1AKxzH0%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;1860&quot; height=&quot;1086&quot; data-origin-width=&quot;1860&quot; data-origin-height=&quot;1086&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27017&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;MongoDB 에러와의 사투, 그리고 재시작 성공기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB 서버 오류와 이를 해결한 과정을 공유하려고 합니다. 어떤 문제가 발생했는지, 그리고 어떻게 해결했는지 하나씩 살펴보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 발생: MongoDB가 갑자기 멈추다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 날 갑자기 MongoDB 서버가 멈췄다는 사실을 알게 되었습니다. 당황한 마음에 우선 시스템 상태를 확인하기 위해 터미널에서 다음 명령어를 입력했습니다:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;systemctl status mongod
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, 다음과 같은 로그가 출력되었습니다:&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;✖ mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sat 2025-03-01 13:46:16 KST; 4 days ago
       Docs: https://docs.mongodb.org/manual
   Main PID: 1313 (code=exited, status=1/FAILURE)
        CPU: 13min 46.266s
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Active: failed라는 메시지가 보이는 것으로 보아 서비스가 완전히 멈춰버린 상태였습니다. exit-code를 보면 어떤 오류로 인해 프로세스가 종료된 것으로 보이지만, 정확한 원인은 바로 파악하기 어려웠어요. 게다가 로그에 &quot;journal has been rotated&quot;라는 메시지가 표시되어 있어 과거 로그가 일부 사라진 상태였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 중요한 것은 &lt;b&gt;MongoDB가 멈춰있다&lt;/b&gt;는 사실이었으므로, 일단 서비스를 재시작해 보기로 했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;해결 과정: systemctl로 재시작 시도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MongoDB 서비스를 다시 실행하기 위해 다음 명령어를 입력했습니다:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;systemctl restart mongod
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 시스템이 인증을 요구했습니다:&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to restart 'mongod.service'.
Authenticating as: user,,, (user)
Password:
&lt;/code&gt;&lt;/pre&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;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ApCs6/btsMC6kPviM/LMrnZ0dVNkfkbAu3TJM6U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ApCs6/btsMC6kPviM/LMrnZ0dVNkfkbAu3TJM6U0/img.png&quot; data-alt=&quot;Authentication is required to restart 'mongod.service'.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ApCs6/btsMC6kPviM/LMrnZ0dVNkfkbAu3TJM6U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FApCs6%2FbtsMC6kPviM%2FLMrnZ0dVNkfkbAu3TJM6U0%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;610&quot; height=&quot;94&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Authentication is required to restart 'mongod.service'.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 다시 상태를 확인해 보았습니다:&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;systemctl status mongod
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 다음과 같았습니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;● mongod.service - MongoDB Database Server
     Loaded: loaded (/lib/systemd/system/mongod.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2025-03-05 15:55:37 KST; 4s ago
       Docs: https://docs.mongodb.org/manual
   Main PID: 2491485 (mongod)
     Memory: 185.9M
        CPU: 387ms
     CGroup: /system.slice/mongod.service
             └─2491485 /usr/bin/mongod --config /etc/mongod.conf

 3월 05 15:55:37 user systemd[1]: Started MongoDB Database Server.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✨ Active: active (running) ✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;드디어 MongoDB가 정상적으로 작동하기 시작했습니다! 재시작 후 4초가 지난 시점에 상태를 확인했는데, 메모리와 CPU 사용량도 정상 범위 안에 들어와 있었습니다. 문제 해결 성공!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;br /&gt;systemctl status 명령어를 활용한 로그 확인이 문제 해결의 첫 단계였습니다. 비록 이번에는 정확한 오류 원인을 파악하진 못했지만, 로그 분석이 문제 해결의 핵심이라는 점을 깨달았습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;systemctl 명령어 활용&lt;/b&gt;&lt;br /&gt;restart와 status 명령어를 이용해 서비스를 관리하는 방법을 익혔습니다. 이는 MongoDB뿐만 아니라 다른 서비스 관리에도 유용하게 사용할 수 있을 것 같아요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;침착함의 필요성&lt;/b&gt;&lt;br /&gt;서버가 갑자기 멈췄을 때 처음에는 당황했지만, 차근차근 단계를 밟아가며 해결하니 결국 정상적으로 복구할 수 있었습니다. 패닉에 빠지지 않고 논리적으로 접근하는 것이 중요하다는 걸 깨달았어요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 MongoDB 서버는 정상적으로 동작하고 있으며, 데이터베이스도 무사히 돌아가고 있습니다. 이번 경험은 단순한 오류 해결 이상의 의미가 있었습니다. 시스템 관리의 기본을 익히고, 문제를 해결하는 논리적인 접근 방식을 배울 수 있었어요.&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;
&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MongoDB 성능 개선을 위한 점검 (DB 프로파일링 / db.setProfilingLevel)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741160241794&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;MongoDB 성능 개선을 위한 점검 (DB 프로파일링 / db.setProfilingLevel)&quot; data-og-description=&quot;⚠️ 성능에 영향을 주는 쿼리를 확인하기 위한 용도일뿐, 이 자체로 성능을 개선하는 것과는 무관합니다.(오히려 프로파일링 활성화 모드일때 성능을 더 잡아먹음. 프로파일링 완료 후 반드시 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dfUEa3/hyYmZhahCn/01f80JFFbVCzIhhyIyhLbk/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/yXZcD/hyYm7zu6K3/CJZ9elDxPbarTXXOszYzmk/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/Jyh4D/hyYm6AAMj1/8Wq4UkXXStkWVVQjHqXmw1/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-setProfilingLevel&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dfUEa3/hyYmZhahCn/01f80JFFbVCzIhhyIyhLbk/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/yXZcD/hyYm7zu6K3/CJZ9elDxPbarTXXOszYzmk/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496,https://scrap.kakaocdn.net/dn/Jyh4D/hyYm6AAMj1/8Wq4UkXXStkWVVQjHqXmw1/img.png?width=800&amp;amp;height=496&amp;amp;face=0_0_800_496');&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;MongoDB 성능 개선을 위한 점검 (DB 프로파일링 / db.setProfilingLevel)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;⚠️ 성능에 영향을 주는 쿼리를 확인하기 위한 용도일뿐, 이 자체로 성능을 개선하는 것과는 무관합니다.(오히려 프로파일링 활성화 모드일때 성능을 더 잡아먹음. 프로파일링 완료 후 반드시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741160252313&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;MongoDB  성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&quot; data-og-description=&quot;인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다.&amp;nbsp;MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/RFXly/hyYm34UW3B/cikHPrUceBe4gjBnnV9Skk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/JFqXe/hyYmH8JbLU/upuT7MenbXVGl2Q6eAbZxK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/ZCQQo/hyYjiowAeL/5uR72yG8Qy4jmKKSHycdNK/img.png?width=1280&amp;amp;height=719&amp;amp;face=0_0_1280_719&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/RFXly/hyYm34UW3B/cikHPrUceBe4gjBnnV9Skk/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/JFqXe/hyYmH8JbLU/upuT7MenbXVGl2Q6eAbZxK/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/ZCQQo/hyYjiowAeL/5uR72yG8Qy4jmKKSHycdNK/img.png?width=1280&amp;amp;height=719&amp;amp;face=0_0_1280_719');&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;MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다.&amp;nbsp;MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Ubuntu-MongoDB-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-%EC%B4%9D%EC%A0%95%EB%A6%ACMongoDB-Remote-Connect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Ubuntu MongoDB 원격 접속 총정리(MongoDB Remote Connect)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741160304329&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;Ubuntu MongoDB 원격 접속 총정리(MongoDB Remote Connect)&quot; data-og-description=&quot;MongoDB가 설치되어 있다는 가정하에 진행하겠습니다.  우선 터미널에서 아래의 커맨드를 입력합니다. sudo vi /etc/mongod.conf net, processMangement, security 중점으로 아래처럼 바꿔주시면 됩니다. # mongod.&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Ubuntu-MongoDB-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-%EC%B4%9D%EC%A0%95%EB%A6%ACMongoDB-Remote-Connect&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Ubuntu-MongoDB-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-%EC%B4%9D%EC%A0%95%EB%A6%ACMongoDB-Remote-Connect&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/rDERa/hyYnawcB45/3UTKuo5os3nwRDpewkjI4K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Htxkk/hyYm5IpQAs/E54AeJxstaYyqjcjf6jknK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Ubuntu-MongoDB-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-%EC%B4%9D%EC%A0%95%EB%A6%ACMongoDB-Remote-Connect&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Ubuntu-MongoDB-%EC%9B%90%EA%B2%A9-%EC%A0%91%EC%86%8D-%EC%B4%9D%EC%A0%95%EB%A6%ACMongoDB-Remote-Connect&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/rDERa/hyYnawcB45/3UTKuo5os3nwRDpewkjI4K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/Htxkk/hyYm5IpQAs/E54AeJxstaYyqjcjf6jknK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;Ubuntu MongoDB 원격 접속 총정리(MongoDB Remote Connect)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;MongoDB가 설치되어 있다는 가정하에 진행하겠습니다.  우선 터미널에서 아래의 커맨드를 입력합니다. sudo vi /etc/mongod.conf net, processMangement, security 중점으로 아래처럼 바꿔주시면 됩니다. # mongod.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>MongoDB/ERROR LOG</category>
      <category>active: failed (result: exit-code) since</category>
      <category>authenticating for org.freedesktop.systemd1.manage-units</category>
      <category>main pid: 1313 (code=exited</category>
      <category>mongonetworkerror: connect econnrefused 127.0.0.1:27017</category>
      <category>notice: journal has been rotated since unit was started</category>
      <category>output may be incomplete.</category>
      <category>status=1/failure)</category>
      <category>systemctl restart mongod</category>
      <category>systemctl status mongod</category>
      <category>&amp;times; mongod.service - mongodb database server</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/209</guid>
      <comments>https://intelloper.tistory.com/entry/MongoNetworkError-connect-ECONNREFUSED#entry209comment</comments>
      <pubDate>Wed, 5 Mar 2025 16:39:27 +0900</pubDate>
    </item>
    <item>
      <title>시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)</title>
      <link>https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF08TD/btsMCpY2yG1/QsnG9ZshMVetvfJ57XKS3k/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF08TD/btsMCpY2yG1/QsnG9ZshMVetvfJ57XKS3k/img.webp&quot; data-alt=&quot;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF08TD/btsMCpY2yG1/QsnG9ZshMVetvfJ57XKS3k/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF08TD%2FbtsMCpY2yG1%2FQsnG9ZshMVetvfJ57XKS3k%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시니어 개발자의 ChatGPT 사용법(코딩 10배 빠르게!)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;상위 1% 개발자의 비밀 프레임워크  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ChatGPT를 활용해 코딩 속도를 혁신적으로 끌어올리는 방법&lt;/b&gt;을 공유하려 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 &quot;코드를 짜줘&quot;라고 묻는 수준을 넘어서, AI를 여러분의 &lt;b&gt;개인 아키텍트&lt;/b&gt;로 만드는 법을 배워보세요. 이 글을 다 읽고 나면, 몇 주 걸릴 작업을 단 몇 시간 만에 끝내는 비법을 알게 될 것입니다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &quot;잘못된 질문&quot;은 이제 그만!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹시 ChatGPT에 이렇게 물어본 적이 있나요?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;파이썬 좀 도와줄 수 있나요?&quot;&lt;/li&gt;
&lt;li&gt;&quot;이 버그 어떻게 고치나요?&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 말씀드리자면, 이런 모호한 질문은 원하는 답을 얻기 어렵습니다. &lt;b&gt;AI는 마법사가 아닙니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 개발자의 85%는 ChatGPT를 단순한 Stack Overflow 대체재로만 사용하며 복사-붙여넣기에 그칩니다. 하지만 상위 1% 개발자는 다릅니다. 그들은 AI와 함께 &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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 빠르고 효율적인 코딩을 위한 3가지 기본 원칙&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT를 제대로 활용하려면 질문 방식부터 바꿔야 합니다. &lt;b&gt;다음 세 가지 원칙&lt;/b&gt;을 기억하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 모호함 대신 &lt;b&gt;구체성&lt;/b&gt;을 선택하세요&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI는 제공된 정보에 따라 답변의 질이 달라집니다. 그러니 최대한 &lt;b&gt;구체적으로&lt;/b&gt; 설명하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 나쁜 예: &quot;파이썬 좀 도와줄 수 있나요?&quot;&lt;br /&gt;✅ 좋은 예:&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Flask로 API를 만들고 있는데, SQLAlchemy로 PostgreSQL 연결 시 500 Internal Server Error가 발생합니다. 에러 메시지는 [OperationalError: connection failed]이며, 관련 코드는 [app.py:25-35]입니다. 원인을 분석하고 해결 방법을 제시해 주세요.&quot;&lt;/p&gt;
&lt;/blockquote&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;/li&gt;
&lt;li&gt;목표 (디버깅, 최적화, 기능 추가 등)&lt;/li&gt;
&lt;li&gt;관련 코드 조각&lt;/li&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;이렇게 질문하면 AI가 훨씬 더 &lt;b&gt;정확하고 실용적인 답변&lt;/b&gt;을 줄 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 질문 대신 &lt;b&gt;명령을 내려보세요&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChatGPT에 &quot;어떻게 하나요?&quot;라고 묻는 대신, &lt;b&gt;명확한 명령&lt;/b&gt;을 내려보세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❌ 질문: &quot;파이썬에서 데코레이터 어떻게 쓰나요?&quot;&lt;br /&gt;✅ 명령: &quot;함수의 실행 시간을 측정하는 파이썬 데코레이터를 작성해줘.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;명령형 프롬프트&lt;/b&gt;를 사용하면 AI가 &lt;b&gt;즉시 실행 가능한 코드&lt;/b&gt;를 제공합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ &lt;b&gt;점진적 구축(Build Upon) 전략 활용&lt;/b&gt;&lt;/h3&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;:&quot;TypeScript와 Express로 Node.js REST API 기본 구조를 만들어줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기능 추가&lt;/b&gt;:&quot;이 구조에 JWT 인증을 추가해줘. 리프레시 토큰과 비밀번호 재설정 기능도 포함해.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적화 요청&lt;/b&gt;:&quot;Zod를 사용해 요청 검증과 속도 제한 미들웨어를 추가해줘. 어디에 배치해야 하는지도 알려줘.&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 코드를 점진적으로 발전시키면서도, &lt;b&gt;불필요한 수정 작업을 줄일 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  상위 1% 개발자가 쓰는 ChatGPT 활용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 기본기를 넘어, &lt;b&gt;상위 개발자들이 AI를 활용해 더 큰 그림을 그리는 방법&lt;/b&gt;을 소개합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  1. 시스템 설계 청사진 그리기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 바로 요청하지 말고, &lt;b&gt;전체 시스템을 설계하는 데 AI를 활용하세요.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&quot;시니어 소프트웨어 아키텍트처럼 행동해줘.
내가 만들고 싶은 건 실시간 채팅 앱이야.

다음 단계를 통해 설계해줘:
1. 시스템 요구사항과 제약 조건
2. 핵심 아키텍처 결정 (예: 모놀리식 vs 마이크로서비스)
3. 데이터 모델과 관계
4. API 계약 설계
5. 보안 고려사항

각 단계에서 내 가정을 비판하고, 대안을 제안하며, 경험 기반 예시를 들어줘.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 AI가 &lt;b&gt;설계 단계부터 함께 고민하는 파트너&lt;/b&gt;가 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  2. 코드 구현을 위한 점진적 접근법&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;&quot;MongoDB에 채팅 메시지를 저장하려고 해. 대규모 트래픽에서 문제가 될 가능성이 있는 부분을 지적해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;구현 요청&lt;/b&gt;:&lt;/li&gt;
&lt;li&gt;&quot;이 컴포넌트를 TypeScript와 MongoDB 모범 사례를 반영하여 최적화된 코드로 작성해줘.&quot;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;코드 리뷰&lt;/b&gt;:
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;성능 최적화&lt;/li&gt;
&lt;li&gt;보안 취약점&lt;/li&gt;
&lt;li&gt;디자인 패턴 개선&lt;/li&gt;
&lt;li&gt;에러 처리 부족 여부 위 항목을 중심으로 검토해줘.&quot;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&quot;내가 작성한 코드야: [코드].&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 사용하면 AI와 함께 &lt;b&gt;개선하면서 발전하는 코드&lt;/b&gt;를 만들 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  3. 문서 탐색을 AI에게 맡기기&lt;/h3&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;&quot;React 전문가처럼 행동해줘.
useEffect를 활용한 데이터 페칭을 구현해야 해.

다음 정보를 제공해줘:
1. 관련 API 메서드/훅
2. 흔한 실수와 방지법
3. 성능 최적화 팁
4. 핵심 개념별 코드 예제&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 필요한 정보를 빠르게 얻고, 바로 적용할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&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;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;: &quot;어떻게 코딩하나요?&quot; 대신 &quot;어떻게 설계하나요?&quot;를 묻습니다. 코드뿐 아니라 설계 경험까지 얻어갑니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최초부터 품질 보장&lt;/b&gt;: AI가 가상 아키텍트 역할을 하며 코드를 검토해줍니다. 맹목적으로 복사하는 대신 이해하고 개선합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지속적 학습&lt;/b&gt;: AI와의 상호작용은 단순 작업이 아니라 마스터클래스입니다. 아키텍처 논의와 피드백을 통해 여러분의 실력이 쌓입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;흔한 오해 풀기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&quot;AI 코드는 신뢰할 수 없어요!&quot;&lt;/b&gt;&lt;br /&gt;&amp;rarr; 그래서 검토 과정을 거칩니다. AI는 도구일 뿐, 최종 판단은 여러분 몫이에요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;AI가 다 하면 내가 배우지 못해요!&quot;&lt;/b&gt;&lt;br /&gt;&amp;rarr; 오히려 이 과정은 깊은 이해를 요구합니다. 단순 복사보다 훨씬 더 배웁니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&quot;이건 부정행위 아닌가요?&quot;&lt;/b&gt;&lt;br /&gt;&amp;rarr; 시니어 개발자와 페어 프로그래밍하는 것과 다를 바 없습니다. 단지 AI가 더 빠르고 피곤하지 않을 뿐이죠.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  지금 시작하지 않으면 뒤처집니다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI를 효율적으로 활용하는 개발자와 그렇지 않은 개발자의 &lt;b&gt;격차는 매일 커지고 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 ChatGPT를 단순한 코드 생성기가 아니라 &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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;&lt;b&gt;함께보면 좋은글&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741135194698&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&quot; data-og-description=&quot;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bc6gIr/hyYm6AuKQl/7ilkXJEadgW4dER1k0N0w1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/biufwu/hyYm1Ts6DY/g1Sa7dr54lhHbaoEX01ujk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/software-architecture-patterns&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bc6gIr/hyYm6AuKQl/7ilkXJEadgW4dER1k0N0w1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/biufwu/hyYm1Ts6DY/g1Sa7dr54lhHbaoEX01ujk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 아키텍처 패턴에 대하여..소프트웨어 아키텍처는 단순히 코드를 작성하는 것을 넘어, 시스템의 구조와 설계를 결정하는 중요한 작업입니다. 올바른 아키텍처는 애플리케이션의 유&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741135233852&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&quot; data-og-description=&quot;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/BHV28/hyYmL4hiWV/fhl7KbkxJjntxB5AlLkD11/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dZcGUR/hyYm1lDlWz/B53BZXrqfh5MqxAQnn5N60/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/senior-developers-never-do&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/BHV28/hyYmL4hiWV/fhl7KbkxJjntxB5AlLkD11/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dZcGUR/hyYm1lDlWz/B53BZXrqfh5MqxAQnn5N60/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;주니어  개발자에서 멈춰 있을수만은 없다! 연차는 쌓이는데 자신의 실력도 쌓여야겠죠? 시니어 개발자들은 어떻게 하는지 탐구해봅시다.모든 시니어 개발자도 처음에는 기초적인 코딩 실력과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1741135266219&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&quot; data-og-description=&quot;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eMeUf/hyYnbIyhVP/LOQTv62FV2ozLGx0USyHA1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bnNGcO/hyYm1Ts6Zu/DCqiMK1SP1a7Fkmd6fsLx1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eMeUf/hyYnbIyhVP/LOQTv62FV2ozLGx0USyHA1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bnNGcO/hyYm1Ts6Zu/DCqiMK1SP1a7Fkmd6fsLx1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>생성AI/ChatGPT</category>
      <category>ai 코딩</category>
      <category>AI 프로그래밍</category>
      <category>ChatGPT</category>
      <category>chatgpt 개발자</category>
      <category>chatgpt 사용법</category>
      <category>chatgpt 프로그래밍</category>
      <category>gpt 잘쓰는법</category>
      <category>gpt 코딩</category>
      <category>gpt 활용법</category>
      <category>개발자 gpt 활용법</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/208</guid>
      <comments>https://intelloper.tistory.com/entry/senior-developer-ChatGPT-using#entry208comment</comments>
      <pubDate>Wed, 5 Mar 2025 09:41:28 +0900</pubDate>
    </item>
    <item>
      <title>[Python 3.13] AI와 ML 혁신을 위한 새로운 기능들</title>
      <link>https://intelloper.tistory.com/entry/Python-313</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucnUf/btsMqABA1K5/1JokRcV57pRoCKQgNMKbHK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucnUf/btsMqABA1K5/1JokRcV57pRoCKQgNMKbHK/img.webp&quot; data-alt=&quot;[Python 3.13] 새로운 기능들 text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucnUf/btsMqABA1K5/1JokRcV57pRoCKQgNMKbHK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FucnUf%2FbtsMqABA1K5%2F1JokRcV57pRoCKQgNMKbHK%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[Python 3.13] 새로운 기능들 text image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;파이썬 3.13 버전은 특히 머신러닝(ML)과 인공지능(AI) 분야에서 혁신적인 변화를 가져올 업데이트를 포함하고 있어보여 또 정리해보았습니다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 간단한 문법, 풍부한 라이브러리, 그리고 강력한 커뮤니티의 지원 덕분에 ML과 AI 개발에서 가장 널리 사용되는 언어로 자리 잡았습니다. 하지만 AI 분야가 점점 더 확장됨에 따라, 더욱 효율적이고 성능이 뛰어난 파이썬 코드에 대한 요구가 커지고 있습니다.&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;파이썬 3.13은 이러한 요구를 충족하기 위해 성능과 생산성을 향상시키는 여러 기능을 추가했으며, 특히 **자유 스레딩(Free Threading)**과 &lt;b&gt;JIT(Just-In-Time) 컴파일러&lt;/b&gt; 같은 획기적인 개선 사항이 포함되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스트에서는 파이썬 3.13에서 ML과 AI 개발에 유용한 주요 업데이트를 살펴보고, 어떻게 활용할 수 있는지 알아보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  1. 실험적인 자유 스레드(Free Threading): GIL의 한계를 넘어&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  GIL(Global Interpreter Lock)이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 오랫동안 문제로 여겨져 온 **GIL(Global Interpreter Lock)**은 멀티스레딩 작업에서 여러 스레드가 동시에 파이썬 바이트코드를 실행하지 못하게 막는 제약입니다. 이로 인해 멀티코어 CPU를 완전히 활용하지 못하고, 특히 ML 모델 훈련처럼 CPU 집약적인 작업에서 병목 현상이 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 GIL을 우회하기 위해 **멀티프로세싱(multiprocessing)**을 사용했지만, 이는 메모리 소비가 크고 코드가 복잡해지는 단점이 있었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  자유 스레드(Free Threading)의 도입&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13에서는 실험적으로 &lt;b&gt;GIL 없이 실행할 수 있는 자유 스레드 지원&lt;/b&gt;이 추가되었습니다. 이는 파이썬의 실행 모델에서 큰 변화로, 여러 스레드가 서로 다른 코어에서 동시에 실행될 수 있도록 개선되었습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  ML 작업에서의 이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;병렬 데이터 처리&lt;/b&gt;: 데이터 전처리, 특징 추출, 모델 평가 같은 CPU 집약적인 작업을 진정한 병렬 모드로 실행 가능.&lt;br /&gt;✅ &lt;b&gt;훈련 속도 향상&lt;/b&gt;: 대규모 데이터셋이나 복잡한 알고리즘 처리 속도가 빨라짐.&lt;br /&gt;✅ &lt;b&gt;멀티프로세싱 필요성 감소&lt;/b&gt;: 더 깔끔하고 효율적인 멀티스레드 코드 작성 가능.&lt;/p&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;: python3.13t 또는 python3.13t.exe 실행.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;소스 빌드 시 옵션 추가&lt;/b&gt;: --disable-gil 옵션으로 빌드.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;GIL 비활성화 확인&lt;/b&gt;:
&lt;pre class=&quot;clean&quot;&gt;&lt;code&gt;import sys
print(sys._is_gil_enabled())  # False가 나오면 GIL이 비활성화된 상태
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&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;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;GIL에 의존하는 C 확장 모듈은 재빌드 필요&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  2. JIT 컴파일러: 파이썬 성능의 새로운 도약&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  JIT 컴파일러란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JIT(Just-In-Time) 컴파일러&lt;/b&gt;는 프로그램 실행 중 자주 사용되는 코드를 기계어로 컴파일하여 성능을 개선하는 기술입니다. 기존 파이썬은 한 줄씩 해석(interpreted)되는 방식으로 실행되는데, 이는 유연하지만 ML 같은 계산 집약적인 작업에서는 속도가 느릴 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13은 실험적인 &lt;b&gt;JIT 컴파일러&lt;/b&gt;를 도입해 성능을 크게 향상시켰습니다.  &lt;/p&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;b&gt;자주 실행되는 &quot;핫 코드&quot;를 식별&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;핫 코드를 중간 표현(IR)으로 변환 후 최적화&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최적화된 코드를 기계어로 컴파일하여 빠르게 실행&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  ML과 AI에서의 이점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;훈련 루프 속도 향상&lt;/b&gt;: 반복적인 데이터 처리를 최적화.&lt;br /&gt;✅ &lt;b&gt;실시간 추론 성능 개선&lt;/b&gt;: 예측 작업의 실행 속도 단축.&lt;br /&gt;✅ &lt;b&gt;인터프리테이션 오버헤드 감소&lt;/b&gt;: 파이썬이 컴파일 언어처럼 동작 가능.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ JIT 컴파일러 활성화 방법&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;: --enable-experimental-jit 옵션 사용.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;환경 변수 설정&lt;/b&gt;:
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;export PYTHON_JIT=1  # 활성화
export PYTHON_JIT=0  # 비활성화
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚠️ 주의 사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  JIT 컴파일러 역시 실험 단계로, 안정성과 호환성을 확인한 후 사용하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span&gt;  3. 향상된 타이핑 기능&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;파이썬 3.13은 타입 시스템을 대폭 개선하여 개발자가 &lt;/span&gt;&lt;span&gt;&lt;b&gt;더 명확하고 유지보수하기 쉬우며 타입 안전한 코드&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 작성할 수 있도록 지원합니다. 특히 &lt;/span&gt;&lt;span&gt;&lt;b&gt;대규모 머신러닝(ML) 프로젝트&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서 데이터 타입의 명확성은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;런타임 오류를 줄이는 데&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 큰 역할을 합니다. 이번 업데이트에서 주목할 만한 기능들을 살펴보겠습니다.  &lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  3.1 기본값이 있는 타입 파라미터 (PEP 696)&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;  주요 내용&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;파이썬의 제네릭 타입(&lt;/span&gt;&lt;span&gt;TypeVar&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ParamSpec&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;TypeVarTuple&lt;/span&gt;&lt;span&gt;)이 이제 &lt;/span&gt;&lt;span&gt;&lt;b&gt;기본값을 지원&lt;/b&gt;&lt;/span&gt;&lt;span&gt;합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;제네릭 클래스나 함수를 정의할 때 기본 타입을 지정할 수 있어 &lt;/span&gt;&lt;span&gt;&lt;b&gt;가독성과 유지보수성이 향상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;✅ ML 코드베이스에 미치는 이점&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;간소화된 정의&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 데이터 구조, 모델, 설정 관련 &lt;/span&gt;&lt;span&gt;&lt;b&gt;제네릭 클래스&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 정의 시 보일러플레이트 코드 감소.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;가독성과 유지보수성 향상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 기본 타입을 명시하여 코드가 간결해지고 &lt;/span&gt;&lt;span&gt;&lt;b&gt;대규모 프로젝트 관리가 용이&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  3.2 폐지(deprecation) 데코레이터 (PEP 702)&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;  주요 내용&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;warnings.deprecated()&lt;/span&gt;&lt;span&gt; 데코레이터를 통해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;폐지된 함수를 명확하게 표시&lt;/b&gt;&lt;/span&gt;&lt;span&gt;할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;런타임과 타입 시스템에서 &lt;/span&gt;&lt;span&gt;&lt;b&gt;경고를 발생&lt;/b&gt;&lt;/span&gt;&lt;span&gt;시켜 유지보수를 쉽게 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;✅ 이점&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;구식 코드 명확화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 오래된 함수가 &lt;/span&gt;&lt;span&gt;&lt;b&gt;더 이상 권장되지 않음을 명확하게 알림&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;효율적인 리팩토링&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 장기 ML 프로젝트에서 &lt;/span&gt;&lt;span&gt;&lt;b&gt;폐지 관리가 간소화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;됨.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  3.3 읽기 전용 TypedDict 항목 (PEP 705)&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;  주요 내용&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;typing.ReadOnly&lt;/span&gt;&lt;span&gt;를 통해 &lt;/span&gt;&lt;span&gt;TypedDict&lt;/span&gt;&lt;span&gt;의 &lt;/span&gt;&lt;span&gt;&lt;b&gt;특정 항목을 읽기 전용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;으로 지정할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;✅ 이점&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;실수 방지&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: ML 프로젝트에서 설정 값이 &lt;/span&gt;&lt;span&gt;&lt;b&gt;우발적으로 수정되는 것을 방지&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;데이터 무결성 강화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 복잡한 ML 파이프라인에서 &lt;/span&gt;&lt;span&gt;&lt;b&gt;일관성을 유지&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는 데 유용.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;  3.4 &lt;/span&gt;&lt;span&gt;typing.TypeIs&lt;/span&gt;&lt;span&gt;를 통한 타입 좁히기 (PEP 742)&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;  주요 내용&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;typing.TypeIs&lt;/span&gt;&lt;span&gt;는 기존 &lt;/span&gt;&lt;span&gt;typing.TypeGuard&lt;/span&gt;&lt;span&gt;보다 &lt;/span&gt;&lt;span&gt;&lt;b&gt;더 직관적인 타입 좁히기&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 제공합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;✅ 이점&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정확한 타입 체크&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 실행 중 타입을 정밀하게 좁혀 &lt;/span&gt;&lt;span&gt;&lt;b&gt;안전한 코드 작성 가능&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;런타임 오류 감소&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 타입 오류를 조기에 발견해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;ML 프로젝트의 안정성 향상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;b&gt;  4. &quot;asyncio&quot;로 향상된 동시성&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI와 머신러닝(ML)에서는 실시간 데이터 처리, 모델 추론, 다중 API 상호작용 등 비동기 작업 관리가 매우 중요합니다. 파이썬 3.13은 asyncio 모듈을 개선하여 동시성과 작업 처리를 더욱 강화했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 &lt;b&gt;asyncio.TaskGroup 개선&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 비동기 작업을 묶어 관리하는 TaskGroup이 업그레이드되어, 취소와 오류 처리가 더욱 쉬워졌습니다.&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;: 복잡한 ML 파이프라인에서 작업 취소와 오류를 깔끔하게 처리할 수 있으며, 대규모 데이터셋이나 스트리밍 데이터 작업에 매우 유용합니다.  &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;4.2 &lt;b&gt;새로운 서버 관리 메서드&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server.close_clients()와 Server.abort_clients()가 추가되어 서버 연결 제어가 강화되었습니다.&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;: close_clients()로 우아하게 종료하고, abort_clients()로 강제 종료할 수 있습니다. 실시간 다중 클라이언트 처리에 적합합니다.  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;AI 서비스에 필수&lt;/b&gt;: AI-as-a-Service(AIaaS)처럼 다중 요청을 다루는 서비스의 안정성과 성능을 높입니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  5. 표준 라이브러리 업데이트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13은 ML과 AI 작업에 유용한 표준 라이브러리 개선을 제공합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.1 &lt;b&gt;base64 모듈 강화&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;base64.z85encode()와 base64.z85decode()가 추가되어 Z85 인코딩을 지원합니다. 이는 기존 base64보다 압축률이 더 높습니다.&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;: JSON API나 데이터베이스에서 공간과 대역폭을 절약할 수 있습니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.2 &lt;b&gt;copy 모듈 개선&lt;/b&gt; ✂️&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;copy.replace() 함수로 객체 복제와 수정이 간단해졌습니다.&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;: 신경망 구조나 파라미터 튜닝을 손쉽게 반복할 수 있습니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5.3 &lt;b&gt;dbm.sqlite3 모듈 추가&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQLite 기반의 경량 파일 데이터베이스 dbm.sqlite3가 신설되었습니다.&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;: 별도 서버 없이 빠르고 가볍게 사용할 수 있습니다. ⚡&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;b&gt;  6. 보안과 안정성 강화&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13은 AI 애플리케이션에 필수적인 보안과 안정성을 강화했습니다. 특히 민감 데이터와 분산 환경에서 유용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;SSL 보안 업그레이드&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ssl.create_default_context()가 더 엄격한 기본 설정으로 네트워크 통신을 안전하게 만듭니다.&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;: HTTPS 기반 클라우드 ML 서비스에서 데이터 무결성과 프라이버시를 지킬 수 있습니다.  &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;b&gt;PythonFinalizationError 추가&lt;/b&gt;  ️&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;: GPU나 대규모 데이터셋 등 자원 해제 문제를 잡아내어 안정성을 높입니다.  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;안정적 종료&lt;/b&gt;: ML 파이프라인의 자원 누수를 막고 깔끔하게 마무리하여 안정성을 보장합니다. ⚙️&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  7. 플랫폼 지원 확장&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13은 모바일과 웹까지 지원을 넓혀 ML/AI 모델 배포 범위를 키웠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;iOS와 안드로이드 지원 (PEP 730, 738)&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iOS와 안드로이드를 &lt;b&gt;Tier 3&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;: 이미지 분류, 객체 탐지 등 실시간 ML을 모바일 앱에 쉽게 적용할 수 있습니다.  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;더 넓은 사용자층&lt;/b&gt;: 모바일 AI 비서, 건강 앱 등으로 파이썬 ML을 확장하여 다양한 앱에 적용할 수 있습니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;WebAssembly(Wasm) 지원 강화&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wasm32-wasi를 &lt;b&gt;Tier 2&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;브라우저 내 AI&lt;/b&gt;: 이미지/텍스트 분석을 서버 없이 브라우저에서 처리할 수 있어 빠르고 효율적인 실행이 가능합니다. ⚡&lt;/li&gt;
&lt;li&gt;&lt;b&gt;프라이버시 중심 앱&lt;/b&gt;: 데이터 전송 없이 클라이언트 측 ML로 대화형 앱을 만들 수 있어 개인정보 보호가 강화됩니다.  ️&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;b&gt;&lt;b&gt; ️ &lt;/b&gt;8. 출시 일정 변경 (PEP 602)&amp;nbsp;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13은 지원 주기를 늘려 장기 프로젝트와 호환성을 쉽게 관리할 수 있도록 했습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;지원 기간 연장&lt;/b&gt; ⏳&lt;/h3&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;1.5년&lt;/b&gt;에서 &lt;b&gt;2년&lt;/b&gt;으로 늘어나고, 이후 &lt;b&gt;3년간 보안 업데이트&lt;/b&gt;를 제공합니다.&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;b&gt;AI 프로젝트 안정성&lt;/b&gt;: 잦은 업그레이드 없이 파이썬 3.13을 오래 안정적으로 사용할 수 있습니다.  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;업그레이드 부담 감소&lt;/b&gt;: 버전 마이그레이션이 줄어들어 ML 프로젝트 중단이 최소화됩니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;장기 프로젝트 영향&lt;/b&gt;  ️&lt;/h3&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;: 2년 지원으로 업그레이드 시기를 전략적으로 계획할 수 있습니다.  &lt;/li&gt;
&lt;li&gt;&lt;b&gt;미래 호환성 용이&lt;/b&gt;: 의료, 금융 등 안정성이 중요한 AI 프로젝트에서 버전 전환 계획이 쉬워집니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ML/AI 개발자를 위한 팁&lt;/b&gt;  &lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 3.13의 새 기능을 지금 테스트해보세요!&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;자유 스레딩, JIT 컴파일러, 향상된 타이핑, 플랫폼 지원을 개발 환경에서 확인해 보세요.  &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;실험 기능(자유 스레딩, JIT 등)은 &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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-314-released&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python 3.14 출시 - 꼭 알아야 할 5가지 주요 기능&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740120036222&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;Python 3.14 출시 - 꼭 알아야 할 5가지 주요 기능&quot; data-og-description=&quot;Python 3.14: 주요 업데이트와 새로운 기능&amp;nbsp;Python 3.14의 세 번째 알파 릴리스가 공개되면서 많은 주목을 받고 있습니다. Python 커뮤니티는 매 릴리스마다 점진적인 개선과 주요 기능 추가를 통해 개&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Python-314-released&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Python-314-released&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/kry46/hyYjj0mnS4/AYH05brG9vL4Lx8pAKGKk1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/D8tIX/hyYfLc7c0t/FR80w6lKJkzWUigd6wKU7k/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Python-314-released&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Python-314-released&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/kry46/hyYjj0mnS4/AYH05brG9vL4Lx8pAKGKk1/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/D8tIX/hyYfLc7c0t/FR80w6lKJkzWUigd6wKU7k/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;Python 3.14 출시 - 꼭 알아야 할 5가지 주요 기능&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python 3.14: 주요 업데이트와 새로운 기능&amp;nbsp;Python 3.14의 세 번째 알파 릴리스가 공개되면서 많은 주목을 받고 있습니다. Python 커뮤니티는 매 릴리스마다 점진적인 개선과 주요 기능 추가를 통해 개&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740120076121&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&quot; data-og-description=&quot;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bd1xHq/hyYfRYMCMB/c2lHr7WiQOgVmBxsIx6Tpk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/KGpoX/hyYjJ5La9n/ObCgGdXwDgyJTvLiuL7yo1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bd1xHq/hyYfRYMCMB/c2lHr7WiQOgVmBxsIx6Tpk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/KGpoX/hyYjJ5La9n/ObCgGdXwDgyJTvLiuL7yo1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/정보</category>
      <category>AI개발</category>
      <category>python 3.13</category>
      <category>python 3.14</category>
      <category>머신러닝</category>
      <category>코드최적화</category>
      <category>파이썬 3.14</category>
      <category>파이썬313</category>
      <category>파이썬최신버전</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/207</guid>
      <comments>https://intelloper.tistory.com/entry/Python-313#entry207comment</comments>
      <pubDate>Sat, 22 Feb 2025 09:00:35 +0900</pubDate>
    </item>
    <item>
      <title>DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화</title>
      <link>https://intelloper.tistory.com/entry/DevOps-automation-scripts</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LiwTA/btsMo43GOaw/zVk4sU7NsNhmXv4R1s6HT1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LiwTA/btsMo43GOaw/zVk4sU7NsNhmXv4R1s6HT1/img.webp&quot; data-alt=&quot;[DevOps]스크립트자동화 text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LiwTA/btsMo43GOaw/zVk4sU7NsNhmXv4R1s6HT1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLiwTA%2FbtsMo43GOaw%2FzVk4sU7NsNhmXv4R1s6HT1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[DevOps]스크립트자동화 text image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DevOps 엔지니어를 위한 12가지 필수 Bash 스크립트 자동화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DevOps 엔지니어로서 가장 중요한 목표 중 하나는 &lt;b&gt;효율성을 높이고 반복적인 작업을 줄이는 것&lt;/b&gt;입니다.&lt;br /&gt;Bash 스크립트를 활용하면 &lt;b&gt;시스템 관리, 모니터링, 배포&lt;/b&gt; 등의 작업을 자동화하여 &lt;b&gt;시간과 노력을 절약&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 포스트에서는 DevOps 환경에서 꼭 자동화해야 할 &lt;b&gt;12가지 Bash 스크립트&lt;/b&gt;를 소개합니다.&lt;br /&gt;이 스크립트들은 여러분의 &lt;b&gt;인프라를 더 안전하고 효율적으로 관리&lt;/b&gt;하는 데 큰 도움이 될 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 시스템 업데이트 자동화  ️&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 패키지를 정기적으로 업데이트하는 것은 &lt;b&gt;보안 및 성능 유지의 기본&lt;/b&gt;입니다.&lt;br /&gt;아래 스크립트를 사용하면 &lt;b&gt;자동으로 시스템을 업데이트&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
echo &quot;시스템 업데이트 시작...&quot;
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
echo &quot;시스템 업데이트 완료.&quot;
&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;li&gt;-y 플래그로 사용자 확인 없이 자동 승인됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;활용 팁:&lt;/b&gt;&lt;br /&gt;cron을 활용해 &lt;b&gt;매일 정기적으로 실행&lt;/b&gt;하도록 설정하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 디스크 사용량 모니터링  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 공간이 부족하면 &lt;b&gt;시스템이 멈출 위험&lt;/b&gt;이 있습니다.&lt;br /&gt;아래 스크립트를 사용하면 &lt;b&gt;디스크 사용량이 80%를 초과할 경우 경고&lt;/b&gt;를 받을 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
THRESHOLD=80
df -h | awk '{ if($5+0 &amp;gt; THRESHOLD) print $0; }' | while read output;
do
    echo &quot;⚠️ 디스크 사용량 경고: $output&quot;
done
&lt;/code&gt;&lt;/pre&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;80%를 초과하면 경고&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;br /&gt;메일 알림(mail 명령어)을 추가하면 &lt;b&gt;실시간으로 경고를 받을 수 있습니다&lt;/b&gt;.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 자동 백업  ️&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 손실은 &lt;b&gt;치명적&lt;/b&gt;입니다. 중요한 디렉토리를 주기적으로 백업하는 것이 필수입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
SOURCE=&quot;/path/to/important/data&quot;
DEST=&quot;/path/to/backup/location&quot;
TIMESTAMP=$(date +&quot;%Y%m%d%H%M%S&quot;)
tar -czvf $DEST/backup_$TIMESTAMP.tar.gz $SOURCE
echo &quot;✅ 백업 완료: $DEST/backup_$TIMESTAMP.tar.gz&quot;
&lt;/code&gt;&lt;/pre&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;중요한 데이터를 .tar.gz 형태로 압축하여 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;활용 팁:&lt;/b&gt;&lt;br /&gt;cron을 사용해 &lt;b&gt;매일 밤 자동으로 실행&lt;/b&gt;되도록 설정하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 로그 로테이션  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 파일이 계속 커지면 &lt;b&gt;디스크 공간을 차지&lt;/b&gt;하게 됩니다.&lt;br /&gt;아래 스크립트를 활용하면 &lt;b&gt;로그 파일을 정리하고 압축&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
LOG_FILE=&quot;/path/to/logfile.log&quot;
BACKUP_DIR=&quot;/path/to/log/backup&quot;
TIMESTAMP=$(date +&quot;%Y%m%d&quot;)
mv $LOG_FILE $BACKUP_DIR/log_$TIMESTAMP.log
gzip $BACKUP_DIR/log_$TIMESTAMP.log
touch $LOG_FILE
echo &quot;✅ 로그 로테이션 완료.&quot;
&lt;/code&gt;&lt;/pre&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;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;활용 팁:&lt;/b&gt;&lt;br /&gt;오래된 로그를 자동 삭제하는 기능을 추가하면 &lt;b&gt;더 깔끔한 관리&lt;/b&gt;가 가능합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. SSH 키 자동 설정  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 키를 설정하는 과정은 &lt;b&gt;번거로울 수 있습니다&lt;/b&gt;.&lt;br /&gt;아래 스크립트를 사용하면 간단하게 SSH 키를 설정할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -q -N &quot;&quot;
ssh-copy-id user@remote_server
echo &quot;✅ SSH 키 설정 완료.&quot;
&lt;/code&gt;&lt;/pre&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;RSA 키 쌍을 생성하고 원격 서버에 &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;br /&gt;SSH 키 기반 인증을 활용하면 &lt;b&gt;비밀번호 없이 자동화 작업이 가능&lt;/b&gt;합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. MySQL 데이터베이스 백업  ️&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 백업은 &lt;b&gt;절대 빼놓을 수 없는 작업&lt;/b&gt;입니다.&lt;br /&gt;아래 스크립트를 사용하면 MySQL 데이터베이스를 자동으로 백업할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
DB_NAME=&quot;my_database&quot;
USER=&quot;db_user&quot; 
PASSWORD=&quot;db_pass&quot;
BACKUP_DIR=&quot;/path/to/backup&quot;
TIMESTAMP=$(date +&quot;%Y%m%d%H%M%S&quot;)
mysqldump -u $USER -p$PASSWORD $DB_NAME &amp;gt; $BACKUP_DIR/${DB_NAME}_$TIMESTAMP.sql
echo &quot;✅ 데이터베이스 백업 완료: $BACKUP_DIR/${DB_NAME}_$TIMESTAMP.sql&quot;
&lt;/code&gt;&lt;/pre&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;mysqldump를 사용하여 &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;br /&gt;백업 파일을 **클라우드 스토리지(S3, GCP, FTP)**에 자동 업로드하도록 설정하면 더욱 안전합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Docker 정리  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 컨테이너와 이미지가 쌓이면 &lt;b&gt;디스크 공간을 차지&lt;/b&gt;하게 됩니다.&lt;br /&gt;아래 스크립트를 실행하면 &lt;b&gt;불필요한 컨테이너와 이미지를 정리&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
docker system prune -af
docker volume prune -f
echo &quot;✅ Docker 정리 완료.&quot;
&lt;/code&gt;&lt;/pre&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;활용 팁:&lt;/b&gt;&lt;br /&gt;정기적으로 실행하여 &lt;b&gt;Docker 환경을 최적화&lt;/b&gt;하세요.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. Kubernetes Pod 상태 확인  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 네임스페이스의 &lt;b&gt;Pod 상태&lt;/b&gt;를 확인하는 스크립트입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# Kubernetes pod 상태 확인
NAMESPACE=&quot;default&quot;
kubectl get pods -n $NAMESPACE
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;특징&lt;/b&gt;: 지정된 네임스페이스의 모든 Pod 상태를 표시합니다.&lt;br /&gt;  &lt;b&gt;활용 팁&lt;/b&gt;: Pod 상태 이상 시 알림을 보내는 로직을 추가하면 &lt;b&gt;모니터링이 강화&lt;/b&gt;됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. SSL 인증서 만료 확인  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSL 인증서가 만료되면 서비스 장애가 발생할 수 있습니다. 미리 점검하세요!&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;#!/bin/bash
# SSL 인증서 만료 확인 
DOMAIN=&quot;example.com&quot;
EXPIRY_DATE=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2&amp;gt;/dev/null | openssl x509 -noout -dates | grep notAfter | cut -d= -f2)
DAYS_LEFT=$(( ($(date -d &quot;$EXPIRY_DATE&quot; +%s) - $(date +%s)) / 86400 ))
echo &quot;$DOMAIN의 SSL 인증서는 $DAYS_LEFT일 후에 만료됩니다.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;특징&lt;/b&gt;: 인증서 만료까지 남은 &lt;b&gt;일수를 계산&lt;/b&gt;해 알려줍니다.&lt;br /&gt;  &lt;b&gt;활용 팁&lt;/b&gt;: 30일 미만 남았을 때 자동으로 알림을 보내도록 설정하세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. Git 자동 풀  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 자동화를 위해 &lt;b&gt;최신 코드를 서버에 반영&lt;/b&gt;하는 스크립트입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# Git 저장소에서 최신 코드 자동 풀
REPO_PATH=&quot;/path/to/repo&quot;
BRANCH=&quot;main&quot;
cd $REPO_PATH
git pull origin $BRANCH
echo &quot;$BRANCH 브랜치에서 코드 풀 완료.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;특징&lt;/b&gt;: 지정된 브랜치에서 최신 코드를 가져옵니다.&lt;br /&gt;  &lt;b&gt;활용 팁&lt;/b&gt;: CI/CD 파이프라인에 통합하면 &lt;b&gt;배포가 훨씬 간편&lt;/b&gt;해집니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 사용자 계정 관리  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 사용자를 &lt;b&gt;신속하게 추가&lt;/b&gt;하는 스크립트입니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# 새 사용자 추가
USERNAME=$1
sudo useradd -m $USERNAME 
sudo passwd $USERNAME
sudo usermod -aG sudo $USERNAME
echo &quot;사용자 $USERNAME이 추가되고 sudo 권한이 부여되었습니다.&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;특징&lt;/b&gt;: &lt;b&gt;사용자 생성, 비밀번호 설정, sudo 권한 부여&lt;/b&gt;를 한 번에 처리합니다.&lt;br /&gt;  &lt;b&gt;활용 팁&lt;/b&gt;: 스크립트를 호출할 때 &lt;b&gt;사용자 이름을 인자로 전달&lt;/b&gt;하세요.&lt;/p&gt;
&lt;pre class=&quot;haxe&quot;&gt;&lt;code&gt;./add_user.sh newuser
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;12. 서비스 상태 확인  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 서비스가 실행 중인지 &lt;b&gt;빠르게 점검&lt;/b&gt;할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;#!/bin/bash
# 특정 서비스 상태 확인 
SERVICE=$1
systemctl is-active --quiet $SERVICE &amp;amp;&amp;amp; echo &quot;$SERVICE이 실행 중입니다&quot; || echo &quot;$SERVICE이 실행 중이 아닙니다&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;특징&lt;/b&gt;: 지정된 서비스의 &lt;b&gt;실행 여부를 확인&lt;/b&gt;합니다.&lt;br /&gt;  &lt;b&gt;활용 팁&lt;/b&gt;: 서비스가 중지되었을 때 &lt;b&gt;자동 재시작&lt;/b&gt;하는 로직을 추가하면 더욱 완벽합니다.&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;systemctl restart $SERVICE
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 12가지 Bash 스크립트를 활용하면 &lt;b&gt;DevOps 작업이 한결 수월&lt;/b&gt;해집니다.&lt;br /&gt;✅ &lt;b&gt;시스템 업데이트, 모니터링, 백업, 배포 등 자동화&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;반복적인 작업을 줄여 운영 효율성을 극대화&lt;/b&gt;&lt;br /&gt;✅ &lt;b&gt;cron 또는 CI/CD 도구와 결합하여 최적의 워크플로우 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;여러분의 환경에 맞게 커스텀하여 더욱 효율적인 DevOps를 시작하세요!&lt;/b&gt;&lt;/p&gt;</description>
      <category>DevOps/우분투 자동화</category>
      <category>bash스크립트</category>
      <category>devops</category>
      <category>IT운영</category>
      <category>모니터링</category>
      <category>배포자동화</category>
      <category>백업자동화</category>
      <category>보안강화</category>
      <category>서버관리</category>
      <category>시스템운영</category>
      <category>자동화</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/206</guid>
      <comments>https://intelloper.tistory.com/entry/DevOps-automation-scripts#entry206comment</comments>
      <pubDate>Fri, 21 Feb 2025 09:09:04 +0900</pubDate>
    </item>
    <item>
      <title>[FastAPI] Celery와 RabbitMQ로 슈퍼차징하기</title>
      <link>https://intelloper.tistory.com/entry/FastAPI-Celery-RabbitMQ</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eE07q9/btsMqHTgmO3/podVfLmodogu4DmhKEItpk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eE07q9/btsMqHTgmO3/podVfLmodogu4DmhKEItpk/img.webp&quot; data-alt=&quot;[FastAPI]성능 향상feat.Celery,RabbitMQ text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eE07q9/btsMqHTgmO3/podVfLmodogu4DmhKEItpk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeE07q9%2FbtsMqHTgmO3%2FpodVfLmodogu4DmhKEItpk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;[FastAPI]성능 향상feat.Celery,RabbitMQ text image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;FastAPI 애플리케이션을 Celery와 RabbitMQ로 슈퍼차징하기&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;FastAPI 애플리케이션에 Celery와 RabbitMQ를 결합하여 백그라운드 작업을 업그레이드하는 방법&lt;/b&gt;에 대해 다뤄보겠습니다. 대용량 이미지 처리나 데이터 분석처럼 시간이 오래 걸리는 작업을 효율적으로 관리하는 방법을 찾고 계신가요? 그렇다면 이 글이 딱 맞을 거예요!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Celery와 RabbitMQ란?&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  Celery: 강력한 비동기 작업 큐&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Celery는 Python 기반의 비동기 작업 큐 시스템입니다. 쉽게 말해, **&quot;이 작업을 백그라운드에서 처리해줘!&quot;**라고 맡길 수 있는 도구죠. 예를 들어, 사용자가 웹사이트에서 이미지를 업로드했을 때, Celery가 백그라운드에서 크기 조정을 처리하도록 만들 수 있습니다.&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;작업을 &lt;b&gt;작은 단위로 분리&lt;/b&gt;하여 워커(worker)가 실행&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;  RabbitMQ: 메시지를 주고받는 중재자&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Celery가 효율적으로 작동하려면 &lt;b&gt;메시지를 전달할 브로커&lt;/b&gt;가 필요합니다. RabbitMQ는 &lt;b&gt;작업 요청을 안전하게 큐(queue)에 저장&lt;/b&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;작업 요청을 &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;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 Celery와 RabbitMQ를 사용해야 할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 웹 애플리케이션에서 &lt;b&gt;빠른 응답 시간&lt;/b&gt;은 필수입니다. 사용자가 &quot;이미지 변환&quot; 버튼을 눌렀을 때 10초 이상 기다린다면 불편하겠죠? 이런 무거운 작업을 &lt;b&gt;백그라운드로 넘기고, 사용자에게 빠르게 응답&lt;/b&gt;할 수 있도록 Celery와 RabbitMQ를 활용합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ Celery vs FastAPI의 기본 백그라운드 작업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI에도 백그라운드 작업을 처리하는 기능이 있지만, 몇 가지 한계가 있습니다:&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;FastAPI 백그라운드 작업&lt;/b&gt;은 API 서버에 종속되어 서버가 꺼지면 작업도 중단됨.&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;p data-ke-size=&quot;size16&quot;&gt;반면, &lt;b&gt;Celery는&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;워커(worker)로 확장 가능&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RabbitMQ 설정하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RabbitMQ를 쉽게 설치하려면 &lt;b&gt;Docker&lt;/b&gt;를 사용하는 것이 편합니다. 먼저 RabbitMQ 컨테이너를 실행해볼까요?&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ RabbitMQ 설치 및 실행&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;docker pull rabbitmq:3-management
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RabbitMQ 관리 UI&lt;/b&gt;에 접속하려면 브라우저에서 http://localhost:15672/로 이동하세요.&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;ID&lt;/b&gt;: guest / &lt;b&gt;PW&lt;/b&gt;: guest&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;FastAPI와 Celery &amp;amp; RabbitMQ 통합하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Celery를 FastAPI와 연결하고, &lt;b&gt;이미지 크기 조정&lt;/b&gt;을 백그라운드에서 처리하는 예제를 만들어 보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 1. 의존성 설치&lt;/h3&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;pip install fastapi celery pillow
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fastapi: API 서버&lt;/li&gt;
&lt;li&gt;celery: 백그라운드 작업 처리&lt;/li&gt;
&lt;li&gt;pillow: 이미지 크기 조정을 위한 라이브러리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 2. Celery 설정 (celery_main.py)&lt;/h3&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;from celery import Celery
from PIL import Image
import io

celery_app = Celery(
    &quot;celery_main&quot;,
    broker=&quot;amqp://guest:guest@localhost:5672//&quot;,
    backend=&quot;rpc://&quot;
)

celery_app.conf.update(result_expires=3600)  # 결과는 1시간 후 만료

@celery_app.task
def resize_image_task(image_data: bytes, width: int, height: int):
    img = Image.open(io.BytesIO(image_data))
    resized_img = img.resize((width, height))
    output = io.BytesIO()
    resized_img.save(output, format=&quot;PNG&quot;)
    print(f&quot;Image resized to {width}x{height}&quot;)
    return {&quot;width&quot;: width, &quot;height&quot;: height, &quot;status&quot;: &quot;resized&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 3. FastAPI 앱 만들기 (main.py)&lt;/h3&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;from fastapi import FastAPI, UploadFile
from celery.result import AsyncResult
from celery_main import resize_image_task

app = FastAPI()

@app.post(&quot;/resize-image/&quot;)
async def resize_image(file: UploadFile, width: int = 100, height: int = 100):
    image_data = await file.read()
    task = resize_image_task.delay(image_data, width, height)
    return {&quot;task_id&quot;: task.id}

@app.get(&quot;/task-status/{task_id}&quot;)
async def get_task_status(task_id: str):
    task_result = AsyncResult(task_id)
    return {&quot;task_id&quot;: task_id, &quot;status&quot;: task_result.status, &quot;result&quot;: task_result.result}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 4. 실행하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1️⃣ Celery 워커 실행&lt;/h4&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;celery -A celery_main.celery_app worker --loglevel=info
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2️⃣ FastAPI 서버 실행&lt;/h4&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;uvicorn main:app --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;API 테스트하기&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  이미지 크기 조정 요청 (POST /resize-image/)&lt;/h3&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;task_id&quot;: &quot;629071be-b12e-45f1-a796-347a941b4a39&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  작업 상태 확인 (GET /task-status/{task_id})&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  처리 중일 때:&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;task_id&quot;: &quot;629071be-b12e-45f1-a796-347a941b4a39&quot;,
  &quot;status&quot;: &quot;PENDING&quot;,
  &quot;result&quot;: null
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  완료 시:&lt;/h4&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;{
  &quot;task_id&quot;: &quot;418afe12-1e78-49cd-b335-59f189325be5&quot;,
  &quot;status&quot;: &quot;SUCCESS&quot;,
  &quot;result&quot;: {
    &quot;width&quot;: 100,
    &quot;height&quot;: 100,
    &quot;status&quot;: &quot;resized&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리하며  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI에 Celery와 RabbitMQ를 결합하면 &lt;b&gt;백그라운드 작업이 훨씬 강력해집니다&lt;/b&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;&amp;nbsp;&lt;/p&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740033872758&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&quot; data-og-description=&quot;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/mw3Rf/hyYfBIdNSB/rp5QroOuHosZ13gEykMqC1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c7haP0/hyYjxD7vjy/1ymEtpkxkyKeOP0Oy61KO1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-performance-optimizing&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/mw3Rf/hyYfBIdNSB/rp5QroOuHosZ13gEykMqC1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c7haP0/hyYjxD7vjy/1ymEtpkxkyKeOP0Oy61KO1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740033894023&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;MongoDB  성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&quot; data-og-description=&quot;인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다.&amp;nbsp;MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해 &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/tSr6A/hyYfVNrP3o/dMX4K0OVI8NnXZQOCJCAg1/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/Gxrjj/hyYf2eIZqI/sK5y2KnB3IVrWp7KXRMT9K/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/cvudm6/hyYjrKHABk/VH5p8sdv5LkrPkBVdoiCGk/img.png?width=1280&amp;amp;height=719&amp;amp;face=0_0_1280_719&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/mongodb-indexing-optimization&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/tSr6A/hyYfVNrP3o/dMX4K0OVI8NnXZQOCJCAg1/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/Gxrjj/hyYf2eIZqI/sK5y2KnB3IVrWp7KXRMT9K/img.png?width=800&amp;amp;height=449&amp;amp;face=0_0_800_449,https://scrap.kakaocdn.net/dn/cvudm6/hyYjrKHABk/VH5p8sdv5LkrPkBVdoiCGk/img.png?width=1280&amp;amp;height=719&amp;amp;face=0_0_1280_719');&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;MongoDB 성능 개선! 빠른 속도 튜닝!을 위한 DB 인덱싱 적용 db.collection.createIndex&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;인덱싱은 데이터베이스 성능 최적화의 핵심이며, 제대로 사용하면 쿼리 속도를 크게 향상시킬 수 있습니다.&amp;nbsp;MongoDB 인덱싱이란?인덱싱은 데이터베이스 테이블의 검색 속도를 향상시키기 위해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740033849355&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;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&quot; data-og-description=&quot;소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  SOLID는 로버트 C. 마틴(일명 &amp;quot;Uncle Bob&amp;quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EOu8R/hyYjF3d2cn/TKvrtLIPcRfCDS01OQMsNk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c7BAic/hyYjugm4Ku/XRdBxxHxGFlNAZJ9YeLeO1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-SOLID&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EOu8R/hyYjF3d2cn/TKvrtLIPcRfCDS01OQMsNk/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/c7BAic/hyYjugm4Ku/XRdBxxHxGFlNAZJ9YeLeO1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어 설계에서 중요한 SOLID 원칙을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  SOLID는 로버트 C. 마틴(일명 &quot;Uncle Bob&quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;</description>
      <category>Python/성능</category>
      <category>celery</category>
      <category>FastAPI</category>
      <category>python 백그라운드작업</category>
      <category>python 비동기처리</category>
      <category>rabbitmq</category>
      <category>고성능서버</category>
      <category>분산처리</category>
      <category>큐시스템</category>
      <category>확장성</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/205</guid>
      <comments>https://intelloper.tistory.com/entry/FastAPI-Celery-RabbitMQ#entry205comment</comments>
      <pubDate>Thu, 20 Feb 2025 19:00:33 +0900</pubDate>
    </item>
    <item>
      <title>동시성(Concurrency) vs 병렬성(Parallelism): 차이점 한 번에 정리!</title>
      <link>https://intelloper.tistory.com/entry/concurrency-vs-parallelism</link>
      <description>&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;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kKDUZ/btsMol5t41f/jfKAszKVKzH7XWoBmg7Bik/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kKDUZ/btsMol5t41f/jfKAszKVKzH7XWoBmg7Bik/img.webp&quot; data-alt=&quot;동시성(Concurrency) vs 병렬성(Parallelism)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kKDUZ/btsMol5t41f/jfKAszKVKzH7XWoBmg7Bik/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkKDUZ%2FbtsMol5t41f%2FjfKAszKVKzH7XWoBmg7Bik%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동시성(Concurrency) vs 병렬성(Parallelism)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 설계에서 자주 헷갈리는 개념인 **동시성(Concurrency)**과 **병렬성(Parallelism)**에 대해 이야기해보려고 합니다.&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  1. 동시성(Concurrency)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시성은 여러 작업을 동시에 &lt;b&gt;관리&lt;/b&gt;하는 개념입니다. 하지만 꼭 여러 작업이 &quot;한 번에 실행&quot;되는 건 아니에요. CPU가 빠르게 작업을 전환하며 진행 상황을 만들어가는 것이 핵심입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  예제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 음악을 들으면서 코딩을 하는 상황을 생각해보세요. 단일 CPU는 한 번에 한 작업만 처리할 수 있지만, 아주 빠르게 두 작업을 번갈아 실행하면서 우리가 &quot;동시에 된다&quot;고 느끼는 것이죠.  &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  동시성은 어떻게 작동할까?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 **컨텍스트 전환(context switching)**을 통해 동시성을 구현합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;현재 작업의 상태(레지스터, 프로그램 카운터 등)를 저장&lt;/li&gt;
&lt;li&gt;다음 작업의 상태를 불러와 실행&lt;/li&gt;
&lt;li&gt;이 과정을 초고속으로 반복!&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⚠️ 하지만 &lt;b&gt;컨텍스트 전환에는 오버헤드&lt;/b&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;: 메시지 수신, UI 업데이트, 메시지 전송을 동시에 수행&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;  파이썬 코드 예제 (threading 사용)&lt;/h3&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;import threading
import time

def task(name):
    for i in range(3):
        print(f&quot;{name} - Step {i+1}&quot;)
        time.sleep(0.5)  # 작업 대기 시뮬레이션

# 스레드 생성
t1 = threading.Thread(target=task, args=(&quot;Task A&quot;,))
t2 = threading.Thread(target=task, args=(&quot;Task B&quot;,))
t3 = threading.Thread(target=task, args=(&quot;Task C&quot;,))

# 스레드 시작
t1.start()
t2.start()
t3.start()

# 모든 스레드가 끝날 때까지 대기
t1.join()
t2.join()
t3.join()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;출력 예시 (중첩 실행):&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;Task A - Step 1
Task B - Step 1
Task C - Step 1
Task A - Step 2
Task B - Step 2
Task C - Step 2
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드가 서로 번갈아 실행되면서 동시성이 구현되는 걸 볼 수 있습니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;⚡ 2. 병렬성(Parallelism)이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬성은 여러 작업을 &lt;b&gt;진짜로 동시에 실행&lt;/b&gt;하는 것입니다. 이를 위해 작업을 여러 개의 작은 조각으로 나누고, 각 조각을 여러 CPU 코어나 GPU에 분산해서 처리합니다. 즉, 단일 CPU로는 불가능하고 &lt;b&gt;멀티코어 환경이 필수&lt;/b&gt;입니다.  ️⚙️&lt;/p&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;/li&gt;
&lt;li&gt;각 하위 작업을 별도의 코어에 할당&lt;/li&gt;
&lt;li&gt;모든 코어가 동시에 실행 후 결과를 합침&lt;/li&gt;
&lt;/ol&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;: 데이터 배치를 여러 GPU에서 병렬 훈련&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비디오 렌더링&lt;/b&gt;: 프레임을 나눠 동시에 렌더링&lt;/li&gt;
&lt;li&gt;&lt;b&gt;웹 크롤러&lt;/b&gt;: 여러 URL을 나눠 동시에 크롤링&lt;/li&gt;
&lt;li&gt;&lt;b&gt;빅 데이터 처리&lt;/b&gt;: Apache Spark로 대규모 로그 분석&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;  파이썬 코드 예제 (multiprocessing 사용)&lt;/h3&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;from multiprocessing import Pool
import time

def compute_sum(segment):
    return sum(segment)

if __name__ == &quot;__main__&quot;:
    array = list(range(1000000))  # 큰 배열
    segment_size = len(array) // 4  # 4개로 분할
    segments = [array[i:i + segment_size] for i in range(0, len(array), segment_size)]

    start_time = time.time()
    
    # 병렬 처리
    with Pool(processes=4) as pool:
        results = pool.map(compute_sum, segments)
    
    total = sum(results)
    print(f&quot;총합: {total}&quot;)
    print(f&quot;소요 시간: {time.time() - start_time:.2f}초&quot;)
&lt;/code&gt;&lt;/pre&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;배열을 4개로 나누고, 4개의 프로세스가 병렬로 합계를 계산합니다.&lt;/li&gt;
&lt;li&gt;멀티코어 CPU에서 실행하면 속도가 훨씬 빨라지는 걸 경험할 수 있어요!  &lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  3. 동시성과 병렬성의 조합&lt;/h2&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;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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  4. 언제 무엇을 사용할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 113px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style13&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;동시성(Concurrency)&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 17px; text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;병렬성(Parallelism)&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;목적&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;여러 작업을 효율적으로 관리&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;여러 작업을 동시에 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;필요 조건&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;단일 코어로도 가능&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;멀티코어 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;웹 서버, 채팅 앱&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;머신 러닝, 비디오 렌더링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;&lt;b&gt;파이썬 도구&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;threading&lt;/td&gt;
&lt;td style=&quot;height: 21px;&quot;&gt;multiprocessing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;동시성&lt;/b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;은 작업이 겹칠 때 CPU를 바쁘게 유지하며 응답성을 높이고, &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;color: #e7e9ea;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;✅&amp;nbsp;&lt;/span&gt;&lt;b&gt;병렬성&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;은 작업을 나눠 속도를 극대화해요.&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #e7e9ea;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;상황에 맞게 선택하면 시스템 성능을 최적화할 수 있답니다!&lt;/span&gt;&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 동시성과 병렬성의 차이점이 확실해졌나요?   실제 프로젝트에서 이 개념을 적용하면 성능을 최적화할 수 있습니다.&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/성능</category>
      <category>concurrency</category>
      <category>concurrencyvsparallelism</category>
      <category>parallelism</category>
      <category>techexplained</category>
      <category>동시성 병렬성</category>
      <category>멀티코어</category>
      <category>스레드와프로세스</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/204</guid>
      <comments>https://intelloper.tistory.com/entry/concurrency-vs-parallelism#entry204comment</comments>
      <pubDate>Thu, 20 Feb 2025 18:00:52 +0900</pubDate>
    </item>
    <item>
      <title>WebUI Forge 탐구: 효율적인 AI 이미지 생성의 시작</title>
      <link>https://intelloper.tistory.com/entry/about-WebUI-Forge</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnBgIL/btsMqByquS5/dmSGNmDaTEy64de2aPAPD0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnBgIL/btsMqByquS5/dmSGNmDaTEy64de2aPAPD0/img.webp&quot; data-alt=&quot;WebUI Forge text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnBgIL/btsMqByquS5/dmSGNmDaTEy64de2aPAPD0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnBgIL%2FbtsMqByquS5%2FdmSGNmDaTEy64de2aPAPD0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;WebUI Forge text image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;WebUI Forge 탐구: 효율적인 AI 이미지 생성의 시작&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  사용자 친화적인 디자인으로 창작 과정 혁신&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요, AI와 이미지 생성에 관심 있는 분들! 오늘은 빠르게 발전하는 인공지능 세계에서 주목할 만한 도구, &lt;b&gt;WebUI Forge&lt;/b&gt;를 소개하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 인터페이스는 &lt;b&gt;Stable Diffusion&lt;/b&gt; AI 모델을 활용해 창작 과정을 한층 더 효율적이고 즐겁게 만들어줍니다. 속도, 품질, 접근성을 모두 갖춘 Forge의 매력을 함께 살펴볼까요?&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;b&gt;참고 Github 주소&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/lllyasviel/stable-diffusion-webui-forge&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/lllyasviel/stable-diffusion-webui-forge&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1740025232172&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 - lllyasviel/stable-diffusion-webui-forge&quot; data-og-description=&quot;Contribute to lllyasviel/stable-diffusion-webui-forge development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/lllyasviel/stable-diffusion-webui-forge&quot; data-og-url=&quot;https://github.com/lllyasviel/stable-diffusion-webui-forge&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qb23z/hyYfRROdej/QYpJIbzqFdhYWg231S0zLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/wTGzP/hyYjoUJvYH/bqlTJfKWkwYw8j4KBOMMck/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/lllyasviel/stable-diffusion-webui-forge&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/lllyasviel/stable-diffusion-webui-forge&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qb23z/hyYfRROdej/QYpJIbzqFdhYWg231S0zLk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/wTGzP/hyYjoUJvYH/bqlTJfKWkwYw8j4KBOMMck/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 - lllyasviel/stable-diffusion-webui-forge&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Contribute to lllyasviel/stable-diffusion-webui-forge development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  WebUI Forge란 무엇일까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, &lt;b&gt;WebUI Forge&lt;/b&gt;는 Stable Diffusion이라는 강력한 AI 모델을 기반으로 이미지를 생성하고 커스터마이징할 수 있게 해주는 인터페이스입니다. A1111이나 ComfyUI 같은 기존 도구들과 비교되곤 하지만, &lt;b&gt;Forge는 사용자 친화적인 디자인과 자원 최적화에 초점을 맞춰 차별화된 경험을 제공합니다.&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;Forge의 목표는 간단합니다. ✅ &lt;b&gt;작업 속도를 높이고&lt;/b&gt; ✅ &lt;b&gt;이미지 품질을 절대 타협하지 않는 것!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 **SVD(Stable Video Diffusion)**과 &lt;b&gt;Z123&lt;/b&gt; 같은 사전 설치된 모델들이 포함되어 있습니다. 특히 &lt;b&gt;Z123&lt;/b&gt;는 3D 객체의 새로운 뷰를 생성하는 데 탁월한 AI 모델로, 이미지의 다양성과 퀄리티를 한 단계 업그레이드해줍니다. 창의력과 효율성을 동시에 원하는 분들에게 딱 맞는 도구죠!  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Mac 사용자를 위한 작은 고민&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stable Diffusion은 높은 처리 능력을 요구하기 때문에, &lt;b&gt;NVIDIA GPU&lt;/b&gt;를 지원하는 컴퓨터에서 최적의 성능을 발휘합니다. 하지만 Mac 사용자라면 아쉬운 상황이 될 수도 있어요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MacOS의 하드웨어 특성상 Stable Diffusion 같은 무거운 모델을 원활하게 실행하기 어렵습니다.&lt;/p&gt;
&lt;/blockquote&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;Mac에서도 AI 생성 모델을 활용하고 싶다면, &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;Google Colab&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;RunPod&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;PaperSpace&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Vast.AI&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 서비스를 이용하면, 고성능 GPU를 클라우드에서 빌려 사용할 수 있어요! Mac을 사용한다고 해서 AI 창작을 포기할 필요는 없습니다.  &lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; ️ Windows에서 Forge 시작하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 사용자라면 반가운 소식이 있습니다!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ForgeUI 설치는 매우 간단합니다.&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;GitHub에서 &lt;b&gt;원클릭 설치 패키지&lt;/b&gt;를 다운로드합니다.&lt;/li&gt;
&lt;li&gt;압축을 풉니다.&lt;/li&gt;
&lt;li&gt;배치 파일을 실행하면 끝! ✅&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭 몇 번으로 모든 준비가 완료됩니다!&lt;/p&gt;
&lt;/blockquote&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;GitHub 저장소를 복제하고,&lt;/li&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;각자의 스타일에 맞게 Forge를 시작해 보세요!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☁️ 클라우드에서 만나는 Forge: Google Colab&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;내 컴퓨터 사양이 부족하다면?&lt;/b&gt; Google Colab을 활용해보세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google이 제공하는 &lt;b&gt;V100, A100&lt;/b&gt; 같은 강력한 GPU를 사용하여 쾌적한 작업 환경을 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &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;Google 드라이브에 마운트&lt;/li&gt;
&lt;li&gt;Stable Diffusion 모델 업로드&lt;/li&gt;
&lt;li&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  Forge가 특별한 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebUI Forge는 단순한 이미지 생성 도구가 아닙니다. &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;A1111, ComfyUI&lt;/b&gt;와 달리, Forge는 Stable Diffusion 모델을 더욱 효율적으로 활용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;최소한의 자원&lt;/b&gt;으로 &lt;b&gt;최대의 품질과 속도&lt;/b&gt;를 제공합니다.&lt;/li&gt;
&lt;li&gt;전용 모델과 커스텀 도구들이 포함되어 있어 창작 과정이 더욱 풍부해집니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개발자든, 창작자든, 빠르고 효율적인 워크플로우를 꿈꾸는 분이라면 Forge를 적극 추천합니다!&lt;/b&gt;  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리: 창작의 미래를 열다&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebUI Forge는 단순히 빠르고 강력한 도구가 아니라, &lt;b&gt;스마트한 자원 활용의 가치를 보여주는 혁신적인 솔루션&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;고품질 AI 이미지 생성&lt;/b&gt;을 원한다면? ✅ &lt;b&gt;쉽고 빠르게 시작하고 싶다면?&lt;/b&gt; ✅ &lt;b&gt;효율적인 워크플로우를 만들고 싶다면?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;지금 바로 WebUI Forge를 시작해보세요!&lt;/b&gt;&lt;/p&gt;</description>
      <category>생성AI/이미지 생성 AI 정보</category>
      <category>AI</category>
      <category>ai-image-generator</category>
      <category>ai기반예술</category>
      <category>ai기반창작</category>
      <category>AI이미지생성</category>
      <category>artificial-intelligence</category>
      <category>stable-diffusion</category>
      <category>stable-diffusion-model</category>
      <category>webuiforge</category>
      <category>생성형AI</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/203</guid>
      <comments>https://intelloper.tistory.com/entry/about-WebUI-Forge#entry203comment</comments>
      <pubDate>Thu, 20 Feb 2025 13:28:02 +0900</pubDate>
    </item>
    <item>
      <title>FastAPI와 함께하는 SOLID 원칙: Python으로 깔끔한 코드 작성하기</title>
      <link>https://intelloper.tistory.com/entry/FastAPI-SOLID</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYeIoW/btsMoZ8dE1c/1N6uKHNVUOAYgZktbFUu00/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYeIoW/btsMoZ8dE1c/1N6uKHNVUOAYgZktbFUu00/img.webp&quot; data-alt=&quot;FastAPI S.O.L.I.D&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYeIoW/btsMoZ8dE1c/1N6uKHNVUOAYgZktbFUu00/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYeIoW%2FbtsMoZ8dE1c%2F1N6uKHNVUOAYgZktbFUu00%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FastAPI S.O.L.I.D&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소프트웨어 설계에서 중요한 &lt;b&gt;SOLID 원칙&lt;/b&gt;을 FastAPI와 Python을 활용해 어떻게 적용할 수 있는지 알아보겠습니다.  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SOLID&lt;/b&gt;는 로버트 C. 마틴(일명 &quot;Uncle Bob&quot;)이 제안한 5가지 설계 원칙으로, 코드를 더 깔끔하고 유지보수하기 쉽도록 도와줍니다. 특히 객체 지향 프로그래밍과 API 개발에서 빛을 발하죠. ✨&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;b&gt;온라인 서점의 도서 재고 관리 API&lt;/b&gt;를 예제로 삼아 각 원칙을 하나씩 살펴보겠습니다. 이미 FastAPI로 API를 만들어 본 경험이 있는 분들을 위해, 기초적인 설명은 건너뛰고 실전 적용에 집중하겠습니다.   그럼 시작해볼까요?  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  예제 시나리오: 온라인 서점 재고 관리 시스템&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 만들 API는 온라인 서점에서 도서를 관리하는 시스템입니다. 이 API는 다음 기능을 제공해야 합니다:&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;b&gt;SOLID 원칙을 하나씩 적용하며&lt;/b&gt; 코드를 설계해 보겠습니다.  ️&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1️⃣ 단일 책임 원칙 (SRP): 한 가지 일만 잘하자  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원칙:&lt;/b&gt; &quot;클래스는 단 하나의 책임만 가져야 하며, 변경 이유도 하나여야 한다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, 한 클래스가 너무 많은 일을 하면 안 됩니다! ❌ 예를 들어, 도서 데이터를 정의하는 일과 도서를 관리하는 로직을 한꺼번에 처리하면 코드가 복잡해지겠죠?   그래서 이 둘을 &lt;b&gt;분리&lt;/b&gt;해 보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 적용 예시&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;from pydantic import BaseModel

#   도서 데이터 모델
class Book(BaseModel):
    book_id: int
    title: str
    price: float
    stock: int

#   도서 관리 로직
class BookManager:
    def __init__(self):
        self.book_list = []

    def register_book(self, book: Book):
        self.book_list.append(book)

    def edit_book(self, book_id: int, new_book: Book):
        for idx, item in enumerate(self.book_list):
            if item.book_id == book_id:
                self.book_list[idx] = new_book
                return True
        return False
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ Book은 &lt;b&gt;데이터 구조만 정의&lt;/b&gt;하고, BookManager는 &lt;b&gt;도서 관리 로직만 담당&lt;/b&gt;합니다.   ✅ 이렇게 하면 코드가 훨씬 &lt;b&gt;깔끔&lt;/b&gt;해지고, 유지보수도 쉬워집니다!  ️&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2️⃣ 개방/폐쇄 원칙 (OCP): 확장은 OK, 수정은 NO  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원칙:&lt;/b&gt; &quot;클래스는 확장에 열려 있고 수정에는 닫혀 있어야 한다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 코드를 &lt;b&gt;수정하지 않고&lt;/b&gt;도 새로운 기능을 추가할 수 있어야 합니다.  ️ 예를 들어, 도서에 &lt;b&gt;할인 기능&lt;/b&gt;을 추가하고 싶다면, BookManager를 직접 고치는 대신 &lt;b&gt;확장&lt;/b&gt;하는 방식으로 해결할 수 있습니다. ✅&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 적용 예시&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;class SaleBookManager(BookManager):
    def apply_sale(self, book_id: int, sale_rate: float):
        book = self.find_book(book_id)
        if book:
            book.price *= (1 - sale_rate / 100)
            return True
        return False
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ BookManager를 &lt;b&gt;수정하지 않고&lt;/b&gt; SaleBookManager에서 기능을 추가!   ✅ 기존 코드를 건드리지 않고도 기능을 확장했으니 &lt;b&gt;OCP를 잘 지켰다!&lt;/b&gt; ✅&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3️⃣ 리스코프 치환 원칙 (LSP): 부모와 자식의 조화  &lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원칙:&lt;/b&gt; &quot;하위 클래스는 상위 클래스로 대체될 수 있어야 하며, 프로그램 동작이 바뀌면 안 된다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해, SaleBookManager가 BookManager를 &lt;b&gt;완벽하게 대체할 수 있어야&lt;/b&gt; 합니다.  &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 적용 예시&lt;/h3&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;def handle_book(manager: BookManager):
    book = Book(book_id=1, title=&quot;Python Guide&quot;, price=30000, stock=5)
    manager.register_book(book)
    return manager.find_book(1)

# 두 클래스 모두 문제없이 동작 ✅
basic_manager = BookManager()
sale_manager = SaleBookManager()

print(handle_book(basic_manager))  # 정상 출력 ✅
print(handle_book(sale_manager))   # 정상 출력 ✅
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ BookManager를 기대하는 곳에서 SaleBookManager도 &lt;b&gt;문제없이 동작&lt;/b&gt;   ✅ LSP를 충족했으니 &lt;b&gt;안전한 상속&lt;/b&gt;을 적용한 셈!&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4️⃣ 인터페이스 분리 원칙 (ISP): 필요한 것만 가져가자 ✂️&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원칙:&lt;/b&gt; &quot;클라이언트가 사용하지 않는 인터페이스에 강제로 의존하지 않아야 한다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큰 인터페이스를 만들기보다, &lt;b&gt;작고 명확한 인터페이스&lt;/b&gt;로 나누는 것이 좋습니다.  ️&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 적용 예시&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod

class BookRecorder(ABC):
    @abstractmethod
    def record(self, book: Book) -&amp;gt; Book:
        pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 이렇게 필요한 기능만 &lt;b&gt;분리&lt;/b&gt;해서 구현하면 &lt;b&gt;불필요한 코드 작성을 줄일 수 있습니다!&lt;/b&gt;  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5️⃣ 의존성 역전 원칙 (DIP): 추상화에 의존하자  ️&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원칙:&lt;/b&gt; &quot;고수준 모듈은 저수준 모듈에 의존하면 안 된다. 둘 다 추상화에 의존해야 한다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 구현(예: 데이터베이스)에 의존하지 않고, **인터페이스(추상화)**에 의존하도록 설계합니다.  &lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 적용 예시&lt;/h3&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class BookManager:
    def __init__(self, storage: BookStorage):
        self.storage = storage
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ BookManager는 BookStorage라는 &lt;b&gt;추상 인터페이스&lt;/b&gt;에 의존! ✅ ✅ PostgreSQL, MongoDB 등 다양한 저장소로 쉽게 교체 가능!  &lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  마무리: SOLID로 더 나은 코드를!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FastAPI와 SOLID 원칙을 결합하면 &lt;b&gt;유지보수와 확장이 쉬운 API&lt;/b&gt;를 만들 수 있습니다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✔ &lt;b&gt;책임 분리(SRP)&lt;/b&gt; ✔ &lt;b&gt;확장성(OCP)&lt;/b&gt; ✔ &lt;b&gt;안전한 상속(LSP)&lt;/b&gt; ✔ &lt;b&gt;유연한 인터페이스(ISP)&lt;/b&gt; ✔ &lt;b&gt;추상화 의존(DIP)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 원칙들을 적용하면 코드 품질이 올라가고, 변화에 유연하게 대처할 수 있습니다.  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ 여러분의 &lt;b&gt;다음 FastAPI 프로젝트&lt;/b&gt;에서 SOLID를 적용해 보세요!  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽어주셔서 감사합니다!  &amp;nbsp;&lt;/p&gt;</description>
      <category>Python/Clean Code Series(클린코드)</category>
      <category>fastapi solid 원칙</category>
      <category>fastapi 개방/폐쇄 원칙 (ocp)</category>
      <category>fastapi 단일 책임 원칙 (srp)</category>
      <category>fastapi 리스코프 치환 원칙 (lsp)</category>
      <category>fastapi 의존성 역전 원칙 (dip)</category>
      <category>fastapi 인터페이스 분리 원칙 (isp)</category>
      <category>fastapi와 함께하는 solid 원칙: python으로 깔끔한 코드 작성하기</category>
      <category>python solid 원칙</category>
      <category>solid</category>
      <category>책임 분리(srp) 확장성(ocp) 안전한 상속(lsp) 유연한 인터페이스(isp) 추상화 의존(dip)</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/202</guid>
      <comments>https://intelloper.tistory.com/entry/FastAPI-SOLID#entry202comment</comments>
      <pubDate>Thu, 20 Feb 2025 11:00:05 +0900</pubDate>
    </item>
    <item>
      <title>  프로덕션 환경에서 절대 실행하면 안 되는 위험한 리눅스 명령어 (진짜로 하지 마세요)  </title>
      <link>https://intelloper.tistory.com/entry/dangerous-commands-in-linux</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&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;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CbmKS/btsMo1LCL7q/07GH5esTBILZnn3MXhQCT1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CbmKS/btsMo1LCL7q/07GH5esTBILZnn3MXhQCT1/img.webp&quot; data-alt=&quot;위험한 리눅스 명령어 절대 실행 X text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CbmKS/btsMo1LCL7q/07GH5esTBILZnn3MXhQCT1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCbmKS%2FbtsMo1LCL7q%2F07GH5esTBILZnn3MXhQCT1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;위험한 리눅스 명령어 절대 실행 X text image&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;br /&gt;프로덕션 환경에서 리눅스를 다루다 보면, &lt;/span&gt;&lt;span&gt;&lt;b&gt;사소한 실수 하나가 시스템 전체를 뒤흔들 수 있습니다.&lt;/b&gt;&lt;/span&gt;&lt;span&gt;   &quot;이제 문제없겠지!&quot;라고 안심하는 순간, &lt;/span&gt;&lt;span&gt;&lt;b&gt;모든 것이 꼬여버리는 경험&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&amp;hellip; 혹시 겪어보신 적 있나요? 저는 그런 아찔한 순간을 몇 번 경험했습니다. &lt;/span&gt;&lt;span&gt;&lt;b&gt;한 번의 잘못된 키 입력으로 서버가 혼란에 빠지는 그 느낌, 공감하시죠?&lt;/b&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 data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;오늘은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;리눅스에서 절대 실행하면 안 되는 위험한 명령어들&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 소개해 드리겠습니다.   이 명령어들은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;여러분의 평온한 저녁 시간을 서버 복구와 긴급 메시지 작성 시간으로 바꿔놓을 수도 있어요.&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 그런 상황은 피하고 싶으시죠?  &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;자, 그럼 함께 살펴보러 가볼까요?  &lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;rm -rf /&lt;/b&gt;   시스템 자폭 버튼&lt;/h3&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;rm -rf /
&lt;/code&gt;&lt;/pre&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;-r : &lt;b&gt;재귀적으로 모든 파일 삭제&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;-f : &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;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;결과:&lt;/b&gt; 운영체제를 포함한 &lt;b&gt;모든 파일이 흔적도 없이 사라집니다.&lt;/b&gt;  &amp;zwj; &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;rm 실행 전 &lt;b&gt;경로를 두 번, 세 번 확인&lt;/b&gt;하세요.  &lt;/li&gt;
&lt;li&gt;safe-rm 같은 도구를 설치하면 실수를 줄일 수 있어요.&lt;/li&gt;
&lt;li&gt;절대 sudo와 함께 무심코 실행하지 마세요! ⚠️&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;mkfs&lt;/b&gt;   디스크 포맷 대참사&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;mkfs.ext4 /dev/sda
&lt;/code&gt;&lt;/pre&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;mkfs는 &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;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;lsblk  ️ 나 fdisk -l로 디스크 상태를 확인하세요.&lt;/li&gt;
&lt;li&gt;프로덕션 환경에서는 웬만하면 mkfs 사용을 피하는 게 좋습니다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;이게 정말 필요한가?&amp;rdquo;를 &lt;b&gt;세 번 고민&lt;/b&gt;해 보세요.  &lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;:(){ :|:&amp;amp; };:&lt;/b&gt; ☠️ 포크 폭탄&lt;/h3&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;:(){ :|:&amp;amp; };:
&lt;/code&gt;&lt;/pre&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;실행 후 프로세스가 끝없이 생성되면서 CPU와 메모리를 초토화시킵니다.  &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;ulimit -u 1000 등으로 &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;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;보너스 농담&lt;/b&gt;: &quot;포크 폭탄이 실패한 이유? &lt;b&gt;혼자 감당할 수 없었기 때문!&lt;/b&gt;  &quot;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;dd if=/dev/zero of=/dev/sda bs=1M&lt;/b&gt;  ️ 데이터 소멸기&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;dd if=/dev/zero of=/dev/sda bs=1M
&lt;/code&gt;&lt;/pre&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;dd는 &lt;b&gt;디스크 이미지를 만들거나 데이터를 복사&lt;/b&gt;하는 명령어지만...&lt;/li&gt;
&lt;li&gt;/dev/sda 같은 메인 디스크에 실행하면? &lt;b&gt;모든 데이터가 0으로 덮어쓰기&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;if=(입력)와 of=(출력)을 &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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;chmod -R 777 /&lt;/b&gt;   보안 문 활짝 열기&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;chmod -R 777 /
&lt;/code&gt;&lt;/pre&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;/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;chmod -R 777은 &lt;b&gt;절대 무작정 쓰지 마세요.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;최소한의 권한만 부여하는 것이 안전합니다.  &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;보너스 농담&lt;/b&gt;: &quot;시스템 관리자가 왜 상담을 받았냐고? &lt;b&gt;777 때문에 스트레스를 견디지 못했거든!&lt;/b&gt;  &quot;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;shutdown -h now&lt;/b&gt;   즉시 서버 종료&lt;/h3&gt;
&lt;pre class=&quot;arduino&quot;&gt;&lt;code&gt;shutdown -h now
&lt;/code&gt;&lt;/pre&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;/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;shutdown -h +5 ⏳처럼 &lt;b&gt;유예 시간을 두고&lt;/b&gt; 종료하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. &lt;b&gt;find / -type f -exec rm -f {} ;&lt;/b&gt;  ️ 천천히, 확실하게 파괴&lt;/h3&gt;
&lt;pre class=&quot;elm&quot;&gt;&lt;code&gt;find / -type f -exec rm -f {} \;
&lt;/code&gt;&lt;/pre&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;/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;find 실행 전 -print로 &lt;b&gt;어떤 파일이 선택되는지 확인&lt;/b&gt;하세요.  &lt;/li&gt;
&lt;li&gt;특정 디렉토리에서 실행하고 싶다면 /important_folder 대신 /home/user 같은 곳을 선택하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;  &lt;b&gt;결론: &quot;그런 실수&quot;를 저지르지 마세요!&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스는 강력하지만, 신중하지 않으면 큰 문제가 발생할 수 있습니다. ⚠️&lt;br /&gt;아래 명령어들은 잘못 입력하면 돌이킬 수 없는 혼란을 초래할 수 있어요.  &lt;/p&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;✔ &lt;b&gt;실행 전 두 번 확인하세요.&lt;/b&gt; 확신이 없다면 가상 환경에서 먼저 테스트하세요.  ️&lt;br /&gt;✔ &lt;b&gt;&amp;ldquo;이게 정말 내가 원하는 결과인가?&amp;rdquo;&lt;/b&gt; 스스로 점검하는 습관을 들이세요.  &lt;br /&gt;✔ &lt;b&gt;프로덕션 서버는 안전이 최우선!&lt;/b&gt; 안정적인 운영을 위해 신중하게 관리하세요.  ✨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전하고 즐거운 리눅스 생활 되시길 바랍니다.  ️ &lt;/p&gt;</description>
      <category>Linux/Shell</category>
      <category>chmod</category>
      <category>mkfs</category>
      <category>SHUTDOWN</category>
      <category>리눅스</category>
      <category>백업필수</category>
      <category>보안주의</category>
      <category>서버관리</category>
      <category>시스템관리</category>
      <category>프로덕션 환경에서 절대 실행하면 안 되는 위험한 리눅스 명령어</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/201</guid>
      <comments>https://intelloper.tistory.com/entry/dangerous-commands-in-linux#entry201comment</comments>
      <pubDate>Thu, 20 Feb 2025 09:06:59 +0900</pubDate>
    </item>
    <item>
      <title>[Grok 3] AI 스케일링의 새로운 기준  </title>
      <link>https://intelloper.tistory.com/entry/Grok3-scaling</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lgg44/btsMnPLidMw/rCuBvtOkpsxR1A8OK71Nbk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lgg44/btsMnPLidMw/rCuBvtOkpsxR1A8OK71Nbk/img.webp&quot; data-alt=&quot;Grok 3: AI 스케일링의 새로운 기준 text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lgg44/btsMnPLidMw/rCuBvtOkpsxR1A8OK71Nbk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flgg44%2FbtsMnPLidMw%2FrCuBvtOkpsxR1A8OK71Nbk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Grok 3: AI 스케일링의 새로운 기준 text image&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 contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Grok 3가 뭔지 모른다면 이 글 참고 go&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; [AI/AI 정보] - Grok3에 대해서 빠르게 아라보자 (요약본)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739939920213&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;Grok3에 대해서 빠르게 아라보자 (요약본)&quot; data-og-description=&quot;  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(LLM)로, 이전 버전인&amp;nbsp;Grok 2에 비해&amp;nbsp;비약적인 성능 향상을 이루었습니다  . Elon Musk는 이를 &amp;quot;지구에서 가장 똑똑한 AI&amp;quot;라고 표현했으&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bxPVOY/hyYjpTvbvy/MXlJqHSka5Ok96C8o61DC1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/gLsLI/hyYfVNh98b/Wl2mCkwXslXd77P7PKYLD1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/Grok3-summary&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bxPVOY/hyYjpTvbvy/MXlJqHSka5Ok96C8o61DC1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/gLsLI/hyYfVNh98b/Wl2mCkwXslXd77P7PKYLD1/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;Grok3에 대해서 빠르게 아라보자 (요약본)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;  Grok 3란 무엇인가?Grok 3는 xAI가 개발한 최신 대형 언어 모델(LLM)로, 이전 버전인&amp;nbsp;Grok 2에 비해&amp;nbsp;비약적인 성능 향상을 이루었습니다  . Elon Musk는 이를 &quot;지구에서 가장 똑똑한 AI&quot;라고 표현했으&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;⚡ Grok 3: 또 한 번 입증된 '쓴 교훈' ⚡&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  TL;DR (요약)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok 3의 성공은 **'더 나은 알고리즘'**보다 **'더 큰 스케일'**이 AI 발전을 이끄는 핵심 요소임을 입증합니다  . DeepSeek 같은 &lt;b&gt;최적화 중심의 접근&lt;/b&gt;도 강력했지만, 결국 &lt;b&gt;대규모 컴퓨팅 자원을 활용&lt;/b&gt;한 모델이&lt;b&gt; 더 나은 성과&lt;/b&gt;를 거두었습니다  . 이는 **AI 연구에서 스케일링 법칙(Scaling Laws)**이 여전히 유효함을 보여줍니다  .&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  I. AI 발전을 지배하는 스케일링 법칙&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Grok 3는 &lt;b&gt;현재 가장 강력한 AI 모델&lt;/b&gt; 중 하나로 평가받고 있습니다  . Grok 2에서 3로의 발전 속도는 &lt;b&gt;스케일링 법칙&lt;/b&gt;이 AI 발전을 이끄는 핵심 동력임을 다시금 상기시켜줍니다  .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;벤치마크 결과에 따르면, Grok 3는 &lt;b&gt;수학&lt;/b&gt;, &lt;b&gt;코딩&lt;/b&gt;, &lt;b&gt;과학&lt;/b&gt; 등 다양한 분야에서 OpenAI, DeepMind, Anthropic 모델과 &lt;b&gt;대등하거나 더 나은 성능&lt;/b&gt;을 보여줍니다  . 이는 단순한 알고리즘적 개선만으로는 달성할 수 없는 성과이며, &lt;b&gt;대규모 GPU 클러스터&lt;/b&gt;에서 학습한 모델의 장점을 명확하게 드러냅니다  .&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kINZd/btsMnB0HtOK/u3KkJSKUGl5A2xAe1RDk60/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kINZd/btsMnB0HtOK/u3KkJSKUGl5A2xAe1RDk60/img.jpg&quot; data-alt=&quot;grok3 benchmarks&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kINZd/btsMnB0HtOK/u3KkJSKUGl5A2xAe1RDk60/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkINZd%2FbtsMnB0HtOK%2Fu3KkJSKUGl5A2xAe1RDk60%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;700&quot; height=&quot;475&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;grok3 benchmarks&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A3VhE/btsMm5BbFuA/pz0KAmP4dcIfCpdURrxea0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A3VhE/btsMm5BbFuA/pz0KAmP4dcIfCpdURrxea0/img.jpg&quot; data-alt=&quot;grok3 LMSYS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A3VhE/btsMm5BbFuA/pz0KAmP4dcIfCpdURrxea0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA3VhE%2FbtsMm5BbFuA%2Fpz0KAmP4dcIfCpdURrxea0%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;700&quot; height=&quot;493&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;grok3 LMSYS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXRsmD/btsMolbK61n/UlenGnAMBUrtVGDVJE7dA1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXRsmD/btsMolbK61n/UlenGnAMBUrtVGDVJE7dA1/img.jpg&quot; data-alt=&quot;grok3 Test time compute&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXRsmD/btsMolbK61n/UlenGnAMBUrtVGDVJE7dA1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXRsmD%2FbtsMolbK61n%2FUlenGnAMBUrtVGDVJE7dA1%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;700&quot; height=&quot;472&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;grok3 Test time compute&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;⚙️ II. DeepSeek: '최적화'만으로는 한계가 있다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DeepSeek&lt;/b&gt;는 &lt;b&gt;50K개의 Nvidia Hopper GPU&lt;/b&gt;를 사용하여 AI 모델을 훈련했으며, &lt;b&gt;100K+ H100 GPU&lt;/b&gt;를 활용한 xAI와 비교하면 규모가 작습니다  . 하지만 DeepSeek는 &lt;b&gt;전체 스택을 최적화&lt;/b&gt;하며 이 격차를 최소화하는 데 성공했습니다  .&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일각에서는 &quot;&lt;b&gt;GPU 수가 AI 성능에 결정적이지 않다&lt;/b&gt;&quot;는 주장이 있었지만, 이는 **'쓴 교훈'**의 본질을 오해한 것입니다 ⚠️. 최적화는 중요한 요소이지만, 선택할 수 있다면 &lt;b&gt;연산 능력을 확장&lt;/b&gt;하는 것이 더 효과적입니다  . DeepSeek도 더 많은 GPU를 사용할 수 있었다면 더 뛰어난 모델을 만들었을 것입니다  .&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  III. xAI가 증명한 '스케일링 &amp;gt; 최적화'&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xAI는 &lt;b&gt;DeepSeek&lt;/b&gt;와 달리 &lt;b&gt;대규모 GPU 활용&lt;/b&gt;에 집중했습니다  . Grok 3는 &lt;b&gt;Colossus 슈퍼컴퓨터&lt;/b&gt;에서 학습되었으며, &lt;b&gt;CUDA 커널을 직접 튜닝하거나 새로운 알고리즘적 트릭&lt;/b&gt;을 추가하지 않았음에도 압도적인 성능을 보여주었습니다 ✨. 이는 **'쓴 교훈'**이 AI 발전에서 여전히 유효함을 시사하며, &lt;b&gt;대규모 연산 자원 확보&lt;/b&gt;가 &lt;b&gt;최적화&lt;/b&gt;보다 더 중요한 전략임을 증명합니다  .&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  IV. 스케일링 패러다임의 변화: 사전 학습에서 사후 학습으로&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2024년을 기점으로 AI 훈련 방식에는 큰 변화가 있었습니다  .&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;⏳ 사전 학습(Pre-training) 시대 (2019~2024)&lt;/b&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; 방대한 데이터를 학습시키는 방식이 주류였습니다  . GPT-2(15억 개 파라미터)에서 GPT-4(1.76조 개 파라미터)까지의 성장은 이 접근법을 극단적으로 밀어붙인 결과였습니다  .&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;  사후 학습(Post-training) 시대 (2024~?)&lt;/b&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;b&gt;Reinforcement Learning&lt;/b&gt;과 &lt;b&gt;Supervised Fine-tuning&lt;/b&gt; 기법을 결합하여, &lt;b&gt;더 효율적인 AI 모델&lt;/b&gt;이 빠르게 등장할 수 있었습니다 ⚡.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 변화는 xAI와 DeepSeek 같은 후발주자들에게 유리한 환경을 제공했으며, &lt;b&gt;Grok 3의 급격한 발전&lt;/b&gt;을 가능하게 했습니다  .&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  V. 스케일링이 AI의 미래를 결정한다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AI 산업의 방향성은 이제 &lt;b&gt;더욱 명확해졌습니다&lt;/b&gt;  . 단순한 최적화보다는 &lt;b&gt;대규모 연산 자원 확보&lt;/b&gt;가 AI 모델 성능을 결정하는 핵심 요소가 되었습니다  . xAI는 이를 명확히 이해하고 있으며, 앞으로도 지속적으로 GPU 클러스터를 확장할 계획입니다  ️.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면, &lt;b&gt;DeepSeek&lt;/b&gt;처럼 제한된 연산 자원 내에서 최적화를 극대화하는 접근도 중요한 의미를 가지지만, &lt;b&gt;AI 개발 경쟁에서 살아남으려면 더 많은 연산 능력을 확보하는 것&lt;/b&gt;이 필수적입니다  .&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;  결론: AI는 '스케일링의 게임'이다&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Grok 3의 성공&lt;/b&gt;은 AI 연구에서 **'더 많이, 더 크게'**가 여전히 유효한 전략임을 입증했습니다  . DeepSeek의 혁신적인 접근법도 가치가 있지만, 결국 AI의 진보는 &lt;b&gt;연산 자원의 크기&lt;/b&gt;에 의해 좌우됩니다 ⚖️. 앞으로의 AI 경쟁에서 승리하기 위해서는 &lt;b&gt;최적화뿐만 아니라 대규모 컴퓨팅 자원을 확보하는 것&lt;/b&gt;이 핵심 전략이 될 것입니다  .&lt;/p&gt;</description>
      <category>AI/AI 정보</category>
      <category>ai스케일링</category>
      <category>deepseek</category>
      <category>grok</category>
      <category>grok 3 ai 스케일링의 새로운 기준</category>
      <category>grok 학습</category>
      <category>grok3\</category>
      <category>h100</category>
      <category>reinforcement learning</category>
      <category>XAI</category>
      <category>대형언어모델</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/200</guid>
      <comments>https://intelloper.tistory.com/entry/Grok3-scaling#entry200comment</comments>
      <pubDate>Wed, 19 Feb 2025 13:43:04 +0900</pubDate>
    </item>
    <item>
      <title>Grok3에 대해서 빠르게 아라보자 (요약본)</title>
      <link>https://intelloper.tistory.com/entry/Grok3-summary</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi5OIM/btsMn0TslSs/NyXqHQ4HfckuXmqhUuEKxk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi5OIM/btsMn0TslSs/NyXqHQ4HfckuXmqhUuEKxk/img.webp&quot; data-alt=&quot;grok3 요약본 text image&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi5OIM/btsMn0TslSs/NyXqHQ4HfckuXmqhUuEKxk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi5OIM%2FbtsMn0TslSs%2FNyXqHQ4HfckuXmqhUuEKxk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;grok3 요약본 text image&lt;/figcaption&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;b&gt;  Grok 3란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Grok 3&lt;/b&gt;는 xAI가 개발한 최신 대형 언어 모델(LLM)로, 이전 버전인&amp;nbsp;&lt;b&gt;Grok 2&lt;/b&gt;에 비해&amp;nbsp;&lt;b&gt;비약적인 성능 향상&lt;/b&gt;을 이루었습니다  . Elon Musk는 이를 &quot;지구에서 가장 똑똑한 AI&quot;라고 표현했으며, Grok 3는 OpenAI, Google DeepMind, Anthropic 등 주요 경쟁사 모델과&amp;nbsp;&lt;b&gt;동등하거나 우위를 점하는&lt;/b&gt;&amp;nbsp;성과를 보여주었습니다  .&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Grok 3&lt;/b&gt;는 단순한 데이터 처리가 아닌, 인간처럼 데이터를 이해하고, 추론하고, 감정적으로 반응할 수 있는 AI 시스템을 만들기 위해 설계되었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;특히&amp;nbsp;&lt;b&gt;수학, 코딩, 과학 분야에서 강력한 성능&lt;/b&gt;을 발휘하며, LMSys Arena에서도&amp;nbsp;&lt;b&gt;최상위권&lt;/b&gt;을 차지했습니다  .&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Grok 3의 가장 큰 특징은&amp;nbsp;&lt;b&gt;거대한 연산 자원을 활용한 학습&lt;/b&gt;입니다. xAI는 미국 테네시주 멤피스에 위치한&amp;nbsp;&lt;b&gt;100K H100 GPU&lt;/b&gt;&amp;nbsp;기반의&amp;nbsp;&lt;b&gt;Colossus 슈퍼컴퓨터&lt;/b&gt;를 사용하여 Grok 3를 훈련했으며, 이를 통해 최신 AI 트렌드인&amp;nbsp;&lt;b&gt;Post-training&lt;/b&gt;&amp;nbsp;기법을 극대화했습니다  . 이 모델의 성공은 **'Bitter Lesson'**을 다시 한번 증명한 사례로 평가받고 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Grok3: 세 가지 모드로 혁신적인 AI 경험 제공&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Grok3는 세 가지 모드로 사용자의 요구를 충족시킵니다:&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Normal Mode&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 사고와 추론을 통해 빠르고 직관적인 답변 제공.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Research Mode&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;웹에서 실시간 데이터를 통합하여 최신 정보를 바탕으로 답변을 생성.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;DeepSeek Chat&lt;/b&gt;처럼 논리 전개 과정을 실시간으로 확인할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Big Brain Mode&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;복잡한 문제를 해결하는 고급 모드로, 깊이 있는 분석이 필요한 작업을 처리합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&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-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;X 플랫폼&lt;/b&gt;: SNS 연동&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&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-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 모델 외에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Grok3 mini&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Reasoning Beta&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모델도 제공&lt;/li&gt;
&lt;li&gt;유료 티어 (&lt;b&gt;Premium+&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SuperGrok&lt;/b&gt;)로 고급 기능 해금 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o-mini&quot; data-message-id=&quot;78b0ea0a-0779-47b7-88c7-00b80ce3caae&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 data-end=&quot;283&quot; data-start=&quot;270&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;478&quot; data-start=&quot;284&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;328&quot; data-start=&quot;284&quot;&gt;&lt;b&gt;자기 조직화 신경망&lt;/b&gt;: 명시적 지침 없이 환경에서 학습하고 스스로 개선&lt;/li&gt;
&lt;li data-end=&quot;370&quot; data-start=&quot;329&quot;&gt;&lt;b&gt;문맥 인식&lt;/b&gt;: 단어와 문장의 의미를 사회적, 문화적 맥락에서 이해&lt;/li&gt;
&lt;li data-end=&quot;401&quot; data-start=&quot;371&quot;&gt;&lt;b&gt;감정 지능&lt;/b&gt;: 감정 인식 및 공감적 반응 제공&lt;/li&gt;
&lt;li data-end=&quot;439&quot; data-start=&quot;402&quot;&gt;&lt;b&gt;평생 학습&lt;/b&gt;: 지속적인 학습과 경험을 통해 점진적으로 개선&lt;/li&gt;
&lt;li data-end=&quot;478&quot; data-start=&quot;440&quot;&gt;&lt;b&gt;윤리적 추론&lt;/b&gt;: 공정성, 존중, 프라이버시를 고려한 의사결정&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;493&quot; data-start=&quot;480&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;685&quot; data-start=&quot;494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;533&quot; data-start=&quot;494&quot;&gt;&lt;b&gt;헬스케어&lt;/b&gt;: 질병 진단, 치료법 추천, 환자와 공감적 상호작용&lt;/li&gt;
&lt;li data-end=&quot;572&quot; data-start=&quot;534&quot;&gt;&lt;b&gt;고객 서비스&lt;/b&gt;: 감정적 지능을 갖춘 대화형 AI 서비스 제공&lt;/li&gt;
&lt;li data-end=&quot;606&quot; data-start=&quot;573&quot;&gt;&lt;b&gt;교육&lt;/b&gt;: 개인화된 학습 경험을 통해 교육 격차 해소&lt;/li&gt;
&lt;li data-end=&quot;643&quot; data-start=&quot;607&quot;&gt;&lt;b&gt;자율 시스템&lt;/b&gt;: 윤리적 의사결정이 가능한 자율 주행 차량&lt;/li&gt;
&lt;li data-end=&quot;685&quot; data-start=&quot;644&quot;&gt;&lt;b&gt;창의적 산업&lt;/b&gt;: 예술과 디자인 분야에서 협업과 창의적 콘텐츠 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;701&quot; data-start=&quot;687&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;833&quot; data-start=&quot;702&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;765&quot; data-start=&quot;702&quot;&gt;&lt;b&gt;편향&lt;/b&gt;: AI 시스템이 학습하는 데이터에 따라 결과가 편향될 수 있어, 지속적인 데이터 품질 관리가 필요&lt;/li&gt;
&lt;li data-end=&quot;833&quot; data-start=&quot;766&quot;&gt;&lt;b&gt;해석 가능성&lt;/b&gt;: Grok3가 어떻게 결론에 도달하는지 이해하기 어려운 점이 문제로, 투명한 의사결정 과정이 중요&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-end=&quot;845&quot; data-start=&quot;835&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-is-last-node=&quot;&quot; data-end=&quot;1055&quot; data-start=&quot;846&quot; data-ke-size=&quot;size16&quot;&gt;Grok3는 인간과 유사한 인지와 감정 지능을 결합하여 AI의 새로운 가능성을 열어가고 있습니다. 아직 해결해야 할 과제가 있지만, Grok3는 우리의 기술 사용 방식을 근본적으로 변화시킬 수 있는 잠재력을 가지고 있습니다. AI가 점점 더 우리의 삶에 통합됨에 따라, Grok3는 단순한 데이터 처리 이상을 넘어 우리가 서로 상호작용하는 방식에 깊은 영향을 미칠 것입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>AI/AI 정보</category>
      <category>Google Deepmind</category>
      <category>grok2</category>
      <category>grok3</category>
      <category>grok3 요약</category>
      <category>h100</category>
      <category>OpenAI</category>
      <category>X</category>
      <category>일론머스크</category>
      <category>자기조직화신경망</category>
      <category>트위터</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/199</guid>
      <comments>https://intelloper.tistory.com/entry/Grok3-summary#entry199comment</comments>
      <pubDate>Wed, 19 Feb 2025 13:31:34 +0900</pubDate>
    </item>
    <item>
      <title>시니어 개발자가 알아야 할 15가지 고급 React 기술</title>
      <link>https://intelloper.tistory.com/entry/15-react-high-skills</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;37&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;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ta4xV/btsMhdLJ1D4/eXbJyFkZ9esws8N1O0c6W0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ta4xV/btsMhdLJ1D4/eXbJyFkZ9esws8N1O0c6W0/img.webp&quot; data-alt=&quot;React 15가지 고급 기술 Text img&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ta4xV/btsMhdLJ1D4/eXbJyFkZ9esws8N1O0c6W0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fta4xV%2FbtsMhdLJ1D4%2FeXbJyFkZ9esws8N1O0c6W0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;React 15가지 고급 기술 Text img&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;React 애플리케이션이 점점 더 복잡해짐에 따라, 초기에 사용하던 패턴들이 점차 한계를 드러낼 수 있습니다. 예를 들어, 간단한 MVP는 잘 작동하지만 시간이 지나면서 성능 문제나 상태 관리의 복잡성이 커질 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;이러한 문제는 주니어 개발자가 시니어로 성장하면서 마주하는 자연스러운 과정입니다. 다행히도, React에서 복잡한 문제를 해결할 수 있는 고급 기술들이 존재합니다.&lt;/p&gt;
&lt;p data-end=&quot;253&quot; data-start=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;421&quot; data-start=&quot;255&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 &lt;b&gt;useCallback&lt;/b&gt;과 &lt;b&gt;ref&lt;/b&gt;의 효과적인 활용법부터 &lt;b&gt;Suspense&lt;/b&gt;를 활용한 데이터 패칭, &lt;b&gt;가상화&lt;/b&gt;, &lt;b&gt;에러 핸들링&lt;/b&gt;, &lt;b&gt;성능 최적화&lt;/b&gt;까지 총 15가지 기법을 소개합니다. 글을 다 읽고 나면 더 탄탄한 React 개발 역량을 가질 수 있을 것입니다.&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;1. &lt;b&gt;useCallback을 사용하여 서비스 참조 유지하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useCallback은 이벤트 핸들러에서 함수 참조를 유지하는 데 주로 사용됩니다. 이를 통해 불필요한 리렌더링을 방지할 수 있습니다. 고급 개발에서는 이 패턴을 확장하여 WebSocket이나 Worker와 같은 지속적인 리소스의 참조를 유지하는 데 활용할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function createConnection() {
  // 예를 들어, WebSocket 연결 설정
  return { sendMessage: (message) =&amp;gt; console.log('Message sent:', message) };
}

function useConnection() {
  const connection = useRef(createConnection());

  // sendMessage 함수가 매번 새로 만들어지지 않도록 안정화
  const sendMessage = useCallback((message) =&amp;gt; {
    connection.current.sendMessage(message);
  }, []);

  return sendMessage;
}

function App() {
  const send = useConnection();
  return &amp;lt;button onClick={() =&amp;gt; send('Hello World!')}&amp;gt;Send Message&amp;lt;/button&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;b&gt;상태 대신 ref를 사용하여 간결한 코드 작성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 값을 useState로 관리할 필요는 없습니다. useRef를 사용하면 렌더링과 관계없이 내부적으로 값을 유지할 수 있습니다. 예를 들어, UI와 무관하게 카운터 값을 증가시키는 경우 useRef를 사용하는 것이 더 효율적입니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function Counter() {
  const count = useRef(0);

  const increaseCount = () =&amp;gt; {
    count.current += 1;
    console.log('Current count:', count.current);
  };

  return &amp;lt;button onClick={increaseCount}&amp;gt;Increment&amp;lt;/button&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. &lt;b&gt;Suspense와 글로벌 리소스 캐시를 활용한 데이터 패칭&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 패칭을 할 때, 일반적으로 useEffect와 로딩 상태를 수동으로 관리합니다. 하지만 &lt;b&gt;Suspense&lt;/b&gt;를 사용하면 이러한 로직을 간소화할 수 있습니다. 데이터가 아직 로드되지 않았다면 해당 컴포넌트는 자동으로 &quot;대기 상태&quot;로 전환됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function createDataResource(fetchData) {
  let status = 'loading';
  let result;
  const promise = fetchData().then(
    (data) =&amp;gt; {
      status = 'success';
      result = data;
    },
    (error) =&amp;gt; {
      status = 'failure';
      result = error;
    }
  );

  return {
    fetch() {
      if (status === 'loading') throw promise;
      if (status === 'failure') throw result;
      return result;
    },
  };
}

const userResource = createDataResource(() =&amp;gt;
  fetch('/api/user').then((response) =&amp;gt; response.json())
);

function UserProfile() {
  const user = userResource.fetch();
  return &amp;lt;div&amp;gt;Welcome, {user.name}!&amp;lt;/div&amp;gt;;
}

function App() {
  return (
    &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading...&amp;lt;/div&amp;gt;}&amp;gt;
      &amp;lt;UserProfile /&amp;gt;
    &amp;lt;/Suspense&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;Suspense와 동적 import 및 미리 로딩&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React.lazy()를 사용하여 컴포넌트를 지연 로딩할 수 있습니다. 이를 개선하여, 사용자가 컴포넌트를 필요로 할 때 빠르게 로딩되도록 미리 데이터를 가져오는 방법을 적용할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const Chart = React.lazy(() =&amp;gt; import('./Chart'));

function usePreloadChart() {
  useEffect(() =&amp;gt; {
    import('./Chart'); // 미리 컴포넌트 로드
  }, []);
}

function Dashboard() {
  usePreloadChart();

  return (
    &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading chart...&amp;lt;/div&amp;gt;}&amp;gt;
      &amp;lt;Chart /&amp;gt;
    &amp;lt;/Suspense&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;자동 재시도하는 오류 경계(Error Boundaries)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱에서 네트워크 요청이나 지연 로딩된 컴포넌트가 실패할 수 있습니다. 기존의 오류 경계는 대체 UI를 표시하지만, 이를 개선하여 일정 시간 후 자동으로 재시도하도록 만들 수 있습니다. 이렇게 하면 일시적인 오류를 원활하게 복구할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import { useState, useEffect } from 'react';

function useRetryErrorBoundary() {
  const [hasError, setHasError] = useState(false);
  const [retries, setRetries] = useState(0);

  const resetError = () =&amp;gt; {
    setHasError(false);
    setRetries((prevRetries) =&amp;gt; prevRetries + 1);
  };

  useEffect(() =&amp;gt; {
    if (hasError) {
      const retryTimeout = setTimeout(resetError, 3000);
      return () =&amp;gt; clearTimeout(retryTimeout);
    }
  }, [hasError]);

  return { hasError, setHasError, retries };
}

function RetryErrorBoundary({ children }) {
  const { hasError, setHasError, retries } = useRetryErrorBoundary();

  const handleError = () =&amp;gt; {
    setHasError(true);
  };

  if (hasError) {
    return &amp;lt;div&amp;gt;Retrying...&amp;lt;/div&amp;gt;;
  }

  return children(retries, handleError);
}

function ProblematicComponent({ retries, onError }) {
  useEffect(() =&amp;gt; {
    if (retries &amp;lt; 2) {
      onError();
    }
  }, [retries, onError]);

  return &amp;lt;div&amp;gt;Loaded after {retries} retries&amp;lt;/div&amp;gt;;
}

// 사용법
function App() {
  return (
    &amp;lt;RetryErrorBoundary&amp;gt;
      {(retries, onError) =&amp;gt; &amp;lt;ProblematicComponent retries={retries} onError={onError} /&amp;gt;}
    &amp;lt;/RetryErrorBoundary&amp;gt;
  );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;동적 항목 높이를 가진 리스트 가상화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트 항목이 동적으로 높이를 가지는 경우, &lt;b&gt;react-window&lt;/b&gt;와 함께 &lt;b&gt;useRef&lt;/b&gt;를 사용하여 항목의 크기를 추적하고 가상화할 수 있습니다. 이렇게 하면 메모리 사용량을 줄이고 렌더링 성능을 개선할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import { VariableSizeList as List } from 'react-window';

function useItemSize(items) {
  const sizeMap = useRef({});
  const setItemSize = (index) =&amp;gt; (el) =&amp;gt; {
    if (el) {
      const height = el.getBoundingClientRect().height;
      sizeMap.current[index] = height;
    }
  };
  const getSize = (index) =&amp;gt; sizeMap.current[index] || 50;
  return { setItemSize, getSize };
}

function VariableHeightList({ items }) {
  const { setItemSize, getSize } = useItemSize(items);

  return (
    &amp;lt;List height={400} itemCount={items.length} itemSize={getSize} width={300}&amp;gt;
      {({ index, style }) =&amp;gt; (
        &amp;lt;div style={style} ref={setItemSize(index)}&amp;gt;
          {items[index]}
        &amp;lt;/div&amp;gt;
      )}
    &amp;lt;/List&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. &lt;b&gt;복잡한 UI 흐름을 위한 상태 머신(State Machine) 사용&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI 상태가 복잡해지면 조건문을 많이 사용하게 되는데, &lt;b&gt;XState&lt;/b&gt;를 사용하면 상태와 전환을 명확히 정의할 수 있어 유지보수성이 높아집니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import { useMachine } from '@xstate/react';
import { createMachine } from 'xstate';

const formMachine = createMachine({
  initial: 'editing',
  states: {
    editing: { on: { SUBMIT: 'validating' } },
    validating: {
      invoke: {
        src: 'validateForm',
        onDone: 'success',
        onError: 'failure',
      },
    },
    success: {},
    failure: {},
  },
});

function Form() {
  const [state, send] = useMachine(formMachine, {
    services: { validateForm: async () =&amp;gt; {/* 검증 로직 */} },
  });

  return (
    &amp;lt;button onClick={() =&amp;gt; send('SUBMIT')}&amp;gt;
      {state.value === 'editing' ? 'Submit' : state.value}
    &amp;lt;/button&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8. useTransition과 작업 큐를 이용한 제어된 동시성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React 18에서 useTransition을 활용하면 특정 상태 업데이트를 &quot;비긴급(non-urgent)&quot;으로 처리할 수 있습니다. 이를 통해 대량의 데이터를 가져오거나 무거운 계산을 수행할 때 UI가 멈추지 않고 반응성을 유지할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function ComplexUI() {
  const [isPending, startTransition] = useTransition();
  const [data, setData] = useState([]);
  
  function loadMore() {
    startTransition(() =&amp;gt; {
      setData((old) =&amp;gt; [...old, ...generateMoreData()]);
    });
  }

  return (
    &amp;lt;&amp;gt;
      &amp;lt;button onClick={loadMore}&amp;gt;더 보기&amp;lt;/button&amp;gt;
      {isPending &amp;amp;&amp;amp; &amp;lt;span&amp;gt;데이터 로딩 중...&amp;lt;/span&amp;gt;}
      &amp;lt;List data={data} /&amp;gt;
    &amp;lt;/&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9. useImperativeHandle을 사용한 제어 가능한 컴포넌트 API 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 컴포넌트가 자식 컴포넌트를 직접 제어해야 할 때 useImperativeHandle을 사용하면 부모가 자식 컴포넌트의 특정 메서드만 호출할 수 있도록 깔끔한 API를 설계할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const FancyInput = forwardRef((props, ref) =&amp;gt; {
  const inputRef = useRef();
  useImperativeHandle(ref, () =&amp;gt; ({
    focus: () =&amp;gt; inputRef.current.focus(),
    getValue: () =&amp;gt; inputRef.current.value,
  }));

  return &amp;lt;input ref={inputRef} {...props} /&amp;gt;;
});

function Parent() {
  const fancyRef = useRef();

  return (
    &amp;lt;&amp;gt;
      &amp;lt;FancyInput ref={fancyRef} /&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; fancyRef.current.focus()}&amp;gt;입력 필드 포커스&amp;lt;/button&amp;gt;
    &amp;lt;/&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;10. 커스텀 훅을 활용한 점진적 하이드레이션 (Progressive Hydration)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSR을 사용하면 빠르게 콘텐츠를 사용자에게 제공할 수 있지만, 큰 앱을 한 번에 하이드레이션하면 초기 상호작용이 느려질 수 있습니다. 페이지의 비핵심 부분을 지연시켜 하이드레이션하면 초기 로드를 더 빠르게 유지할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function useProgressiveHydration(delay = 1000) {
  const [hydrated, setHydrated] = useState(false);

  useEffect(() =&amp;gt; {
    const t = setTimeout(() =&amp;gt; setHydrated(true), delay);
    return () =&amp;gt; clearTimeout(t);
  }, [delay]);

  return hydrated;
}

function HeavyComponent() {
  const hydrated = useProgressiveHydration();
  return hydrated ? &amp;lt;ExpensiveTree /&amp;gt; : &amp;lt;Placeholder /&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;11. 포털과 Suspense를 조합하여 무거운 모달 최적화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모달은 종종 크고 복잡하여, 처음부터 로딩하면 번들 크기가 커지고 성능이 저하될 수 있습니다. 이를 해결하기 위해 모달을 지연 로딩하고, 포털을 사용하여 메인 DOM 밖에서 렌더링하면 성능을 최적화할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const HeavyModal = lazy(() =&amp;gt; import('./HeavyModal'));

function PortalModal({ open }) {
  return open
    ? createPortal(
        &amp;lt;Suspense fallback={&amp;lt;div&amp;gt;Loading Modal...&amp;lt;/div&amp;gt;}&amp;gt;
          &amp;lt;HeavyModal /&amp;gt;
        &amp;lt;/Suspense&amp;gt;,
        document.body
      )
    : null;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;12. 부드러운 레이아웃 측정을 위한 useLayoutEffect 활용&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useEffect는 화면을 그린 후 실행되므로 대부분의 경우 충분하지만, 특정 요소의 위치나 크기를 즉시 조정해야 할 때는 useLayoutEffect를 사용해야 합니다. 이를 통해 화면 깜빡임 없이 매끄러운 UI 업데이트가 가능합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;function Popover({ anchorRef }) {
  const popoverRef = useRef();

  useLayoutEffect(() =&amp;gt; {
    const anchorRect = anchorRef.current.getBoundingClientRect();
    popoverRef.current.style.top = `${anchorRect.bottom}px`;
  }, [anchorRef]);

  return &amp;lt;div ref={popoverRef} className=&quot;popover&quot;&amp;gt;Content&amp;lt;/div&amp;gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;13. React Profiler API를 활용한 동적 성능 최적화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;React Profiler API를 사용하면 렌더링 시간을 측정하고 성능이 느린 컴포넌트를 감지할 수 있습니다. 이를 통해 메모이제이션 임계값을 조정하거나 업데이트를 지연 처리하는 최적화 전략을 적용할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;import { unstable_Profiler as Profiler } from 'react';

function DynamicTuner() {
  const [threshold, setThreshold] = useState(10);

  function onRender(id, phase, actualDuration) {
    if (actualDuration &amp;gt; threshold) {
      // 성능 데이터를 기반으로 동적 최적화 수행
      setThreshold((t) =&amp;gt; t + 5);
    }
  }

  return (
    &amp;lt;Profiler id=&quot;App&quot; onRender={onRender}&amp;gt;
      &amp;lt;MyAppComponents /&amp;gt;
    &amp;lt;/Profiler&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;14. Immer와 useReducer를 활용한 불변 상태 관리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;useReducer를 사용하면 상태 업데이트를 예측 가능하게 만들 수 있습니다. Immer를 활용하면 불변성을 유지하면서 객체를 직접 수정하는 듯한 코드를 작성할 수 있습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;pf&quot;&gt;&lt;code&gt;import produce from 'immer';

function reducer(state, action) {
  return produce(state, (draft) =&amp;gt; {
    if (action.type === 'ADD_ITEM') {
      draft.items.push(action.payload);
    }
  });
}

function ComplexList() {
  const [state, dispatch] = useReducer(reducer, { items: [] });

  return (
    &amp;lt;button onClick={() =&amp;gt; dispatch({ type: 'ADD_ITEM', payload: 'X' })}&amp;gt;
      Add Item
    &amp;lt;/button&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;15. 윈도잉(Windowing)과 포털(Portals)을 활용한 대형 SVG/캔버스 요소의 효율적인 렌더링&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대형 SVG나 캔버스를 다룰 때 렌더링 성능을 최적화하기 위해서는 필요한 부분만 렌더링하는 방식이 유효합니다. 리스트 가상화와 비슷한 개념으로, 윈도잉을 사용하여 필요한 부분만 렌더링하고 포털을 활용해 UI를 분리합니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제 코드:&lt;/h4&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;function Segment({ color, target }) {
  return createPortal(
    &amp;lt;svg width=&quot;200&quot; height=&quot;100&quot;&amp;gt;&amp;lt;rect width=&quot;200&quot; height=&quot;100&quot; fill={color} /&amp;gt;&amp;lt;/svg&amp;gt;,
    target
  );
}

export default function App() {
  const containerRef = useRef(null);
  const [visible, setVisible] = useState([0, 1]);

  useEffect(() =&amp;gt; {
    const onScroll = () =&amp;gt; {
      const start = Math.floor(containerRef.current.scrollTop / 100);
      setVisible([start, start + 1]);
    };

    containerRef.current.addEventListener('scroll', onScroll);
    return () =&amp;gt; containerRef.current.removeEventListener('scroll', onScroll);
  }, []);

  return (
    &amp;lt;div ref={containerRef} style={{ height: 200, overflowY: 'auto' }}&amp;gt;
      {[...Array(10)].map((_, i) =&amp;gt; &amp;lt;div key={i} id={'seg' + i} style={{ height: 100 }} /&amp;gt;)}
      {visible.map((i) =&amp;gt; (
        &amp;lt;Segment key={i} color={i % 2 ? 'blue' : 'green'} target={document.getElementById('seg' + i)} /&amp;gt;
      ))}
    &amp;lt;/div&amp;gt;
  );
}
&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;</description>
      <category>REACT/성능</category>
      <category>PerformanceOptimization</category>
      <category>react clean code</category>
      <category>React 성능 개선</category>
      <category>React18</category>
      <category>reactprofiler</category>
      <category>suspense</category>
      <category>useLayoutEffect</category>
      <category>useTransition</category>
      <category>시니어 개발자가 알아야 할 15가지 고급 react 기술</category>
      <category>시니어 프론트엔드 개발자</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/198</guid>
      <comments>https://intelloper.tistory.com/entry/15-react-high-skills#entry198comment</comments>
      <pubDate>Thu, 13 Feb 2025 09:33:34 +0900</pubDate>
    </item>
    <item>
      <title>디스코드가 WebSocket 트래픽을 절반으로 줄인 비밀</title>
      <link>https://intelloper.tistory.com/entry/WebSocket-traffic-optimization</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w9weI/btsMdKLeQv1/4LMA5YfADOwtPhnFdgbngk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w9weI/btsMdKLeQv1/4LMA5YfADOwtPhnFdgbngk/img.webp&quot; data-alt=&quot;&amp;quot;WebSocket 트래픽을 절반으로 줄인 비밀&amp;quot; text img&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w9weI/btsMdKLeQv1/4LMA5YfADOwtPhnFdgbngk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw9weI%2FbtsMdKLeQv1%2F4LMA5YfADOwtPhnFdgbngk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;WebSocket 트래픽을 절반으로 줄인 비밀&quot; text img&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실시간 최적화의 혁신 전략&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드의 기술 페이지를 읽으며 디스코드가 어떻게 WebSocket 트래픽을 거의 절반으로 줄였는지 알아보았습니다. 디스코드가 사용한 스마트한 기법들과 우리가 개발자로서 배울 수 있는 교훈들을 알아봅시다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  문제점&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드의 사용자 수가 증가함에 따라 WebSocket 대역폭 사용량도 급증했으며, 이는 특히 &lt;b&gt;모바일 기기&lt;/b&gt;나 &lt;b&gt;느린 네트워크&lt;/b&gt;를 사용하는 사용자들에게 영향을 미쳤습니다.&lt;/p&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; JSON 데이터 형식이 불필요한 오버헤드 추가&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;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 디스코드의 엔지니어들은 &lt;b&gt;고품질 사용자 경험&lt;/b&gt;을 유지하면서 WebSocket 트래픽을 최적화하는 데 집중했습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  디스코드의 접근 방식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스코드는 다음과 같은 &lt;b&gt;4가지 전략&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;&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;각 전략을 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 이진 데이터 형식으로 전환&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; JSON은 사람이 읽기 쉽지만 메시지 크기가 큼&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결책:&lt;/b&gt; 오버헤드를 줄이기 위해 &lt;b&gt;MessagePack&lt;/b&gt; 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 왜 MessagePack인가?&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL4XL6/btsMft81QPo/epDBzVOTkRIY8eAUjHYISK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL4XL6/btsMft81QPo/epDBzVOTkRIY8eAUjHYISK/img.jpg&quot; data-alt=&quot;Format of MessagePack&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL4XL6/btsMft81QPo/epDBzVOTkRIY8eAUjHYISK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL4XL6%2FbtsMft81QPo%2FepDBzVOTkRIY8eAUjHYISK%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;512&quot; height=&quot;384&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Format of MessagePack&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON 대비 &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;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;서버: msgpack-lite로 메시지 인코딩&lt;/li&gt;
&lt;li&gt;클라이언트: MessagePack 호환 라이브러리로 디코딩&lt;/li&gt;
&lt;/ul&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;35% 감소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;직렬화/역직렬화 효율성 향상, 지연 시간 거의 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 메시지 압축 구현&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;b&gt;per-message Deflate&lt;/b&gt; 압축 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/faye/permessage-deflate-node&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/faye/permessage-deflate-node&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739318388251&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 - faye/permessage-deflate-node: Per-message DEFLATE compression extension for WebSocket connections&quot; data-og-description=&quot;Per-message DEFLATE compression extension for WebSocket connections - faye/permessage-deflate-node&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/faye/permessage-deflate-node&quot; data-og-url=&quot;https://github.com/faye/permessage-deflate-node&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dpAxtF/hyYb8e3DO9/87Iie8wk7XpRmjKdLs6Ry0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bdSKjg/hyYfWD0Vtf/AoEiUXJPNwdSpTlk1JYgT0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/faye/permessage-deflate-node&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/faye/permessage-deflate-node&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dpAxtF/hyYb8e3DO9/87Iie8wk7XpRmjKdLs6Ry0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bdSKjg/hyYfWD0Vtf/AoEiUXJPNwdSpTlk1JYgT0/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 - faye/permessage-deflate-node: Per-message DEFLATE compression extension for WebSocket connections&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Per-message DEFLATE compression extension for WebSocket connections - faye/permessage-deflate-node&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;h4 data-ke-size=&quot;size20&quot;&gt;✅ 왜 per-message Deflate인가?&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개별 WebSocket 메시지 압축 가능&lt;/li&gt;
&lt;li&gt;대부분의 브라우저와 라이브러리에서 지원&lt;/li&gt;
&lt;/ul&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;추가로 25% 감소&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;약간의 CPU 사용 증가, 그러나 대역폭 절감 효과가 더 큼&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ 데이터 동기화 최적화&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;b&gt;선택적 동기화 전략&lt;/b&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;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;{
  &quot;id&quot;: &quot;ef23r24grewg&quot;,
  &quot;name&quot;: &quot;Siyeon&quot;,
  &quot;status&quot;: &quot;waiting&quot;,
  &quot;lastActive&quot;: &quot;2024-2-12T05:04:10Z&quot;
}&lt;/code&gt;&lt;/pre&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;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;{
  &quot;id&quot;: &quot;ef23r24grewg&quot;,
  &quot;status&quot;: &quot;ongoing&quot;
}&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;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ 델타 업데이트 활용&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;b&gt;델타 업데이트&lt;/b&gt;로 이전 상태 대비 변경 사항만 전송&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✍️ 예시 (JSON Patch)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;원본:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ &quot;tasks&quot;: [&quot;todo&quot;, &quot;in-progress&quot;, &quot;done&quot;] }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;업데이트:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;{ &quot;tasks&quot;: [&quot;todo&quot;, &quot;review&quot;, &quot;done&quot;, &quot;archived&quot;] }&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;델타:&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;[
  { &quot;op&quot;: &quot;replace&quot;, &quot;path&quot;: &quot;/tasks/1&quot;, &quot;value&quot;: &quot;review&quot; },
  { &quot;op&quot;: &quot;add&quot;, &quot;path&quot;: &quot;/tasks/3&quot;, &quot;value&quot;: &quot;archived&quot; }
]&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; 지원&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;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;/li&gt;
&lt;li&gt;&lt;b&gt;구형 클라이언트 호환성&lt;/b&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;해결: WebSocket 핸드셰이크에서 &lt;b&gt;버전 협상&lt;/b&gt; 도입&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이진 데이터 디버깅 어려움&lt;/b&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;해결: 내부 디버깅 도구 개발, 개발 단계에서는 JSON 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;WebSocket 트래픽 50% 감소&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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; MessagePack, Protobuf 활용&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;디스코드의 최적화 사례는 실시간 시스템 개발에 있어 &lt;/span&gt;&lt;span&gt;&lt;b&gt;강력한 인사이트&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;&quot;작은 최적화가 모여, 큰 변화를 만듭니다.&quot;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여러분이 비슷한 문제에 직면해 있다면, 디스코드의 접근 방식을 참고해 보세요. 작은 개선들이 쌓여 여러분의 애플리케이션을 더 빠르고 효율적으로 성장시킬 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;끝까지 읽어주셔서 감사합니다!&lt;/span&gt;&lt;/p&gt;</description>
      <category>BACKEND/기법</category>
      <category>websocket</category>
      <category>websocket 트래픽</category>
      <category>네트워크최적화</category>
      <category>데이터최적화</category>
      <category>디스코드가 websocket 트래픽을 절반으로 줄인 비밀</category>
      <category>디스코드성능최적화</category>
      <category>백엔드 성능</category>
      <category>실시간데이터처리</category>
      <category>실시간통신</category>
      <category>트래픽을 줄이는법</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/197</guid>
      <comments>https://intelloper.tistory.com/entry/WebSocket-traffic-optimization#entry197comment</comments>
      <pubDate>Wed, 12 Feb 2025 09:15:44 +0900</pubDate>
    </item>
    <item>
      <title>파이썬 &amp;quot;&amp;quot;&amp;quot; 삼중 따옴표 출력 문제 해결! (feat.dedent)</title>
      <link>https://intelloper.tistory.com/entry/python-textwrap-dedent</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RNExT/btsMejyzT4l/pfABAVsSRn4kBV5rS7n9xk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RNExT/btsMejyzT4l/pfABAVsSRn4kBV5rS7n9xk/img.webp&quot; data-alt=&quot;&amp;quot;python library textwrap dedent&amp;quot; text img&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RNExT/btsMejyzT4l/pfABAVsSRn4kBV5rS7n9xk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRNExT%2FbtsMejyzT4l%2FpfABAVsSRn4kBV5rS7n9xk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;python library textwrap dedent&quot; text img&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;mdash; dedent()로 깔끔한 문자열 만들기 꿀팁 &amp;mdash;&lt;/h2&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;❌ &lt;b&gt;문제 상황: 잘못된 문자열 출력&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이메일 템플릿을 생성하는 파이썬 스크립트를 작성 중 문제가 생겼어요.&lt;br /&gt;코드는 대략 이렇게 생겼어요:&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def generate_email():
    return &quot;&quot;&quot;
    Hello User,  
    Your account will be deactivated soon.  
    Please update your information to continue using our service.  
    Regards,  
    Customer Care Team  
    &quot;&quot;&quot;

print(generate_email())
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;겉보기엔 아무 문제 없어 보이죠?&lt;br /&gt;하지만 &lt;b&gt;출력 결과&lt;/b&gt;를 확인한 순간...  &lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;    Hello User,  
    Your account will be deactivated soon.  
    Please update your information to continue using our service.  
    Regards,  
    Customer Care Team  
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어라?  &lt;br /&gt;&lt;b&gt;원래 기대한 결과&lt;/b&gt;는 이랬어야 했는데요:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Hello User,  
Your account will be deactivated soon.  
Please update your information to continue using our service.  
Regards,  
Customer Care Team  
&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;❗️ &lt;b&gt;문제의 원인: 삼중 따옴표(&quot;&quot;&quot;)의 함정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 &lt;b&gt;삼중 따옴표(&quot;&quot;&quot;)로 감싼 문자열&lt;/b&gt;은&lt;br /&gt;그 안의 &lt;b&gt;들여쓰기(Indentation)&lt;/b&gt; 를 그대로 유지합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 함수 내부에 문자열을 작성하면,&lt;br /&gt;&lt;b&gt;함수의 들여쓰기까지 문자열에 포함&lt;/b&gt;되어버리죠.&lt;br /&gt;결과적으로 각 줄 앞에 불필요한 공백이 생기는 것입니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ &lt;b&gt;해결 방법: dedent()의 마법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문제를 해결하기 위해 수동으로 공백을 지웠다면&amp;hellip;&lt;br /&gt;오늘부터는 &lt;b&gt;더 쉽고 깔끔한 방법&lt;/b&gt;을 사용하세요!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로, textwrap 모듈의 &lt;b&gt;dedent()&lt;/b&gt; 함수를 활용하는 것입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;수정된 코드:&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from textwrap import dedent  

def generate_email():  
    return dedent(&quot;&quot;&quot;  
        Hello User,  
        Your account will be deactivated soon.  
        Please update your information to continue using our service.  
        Regards,  
        Customer Care Team  
    &quot;&quot;&quot;)

print(generate_email())
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;결과:&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Hello User,  
Your account will be deactivated soon.  
Please update your information to continue using our service.  
Regards,  
Customer Care Team  
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와우!  &lt;br /&gt;&lt;b&gt;불필요한 공백 없이 깔끔한 결과&lt;/b&gt;가 출력됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;dedent()란?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;dedent()는 &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;p data-ke-size=&quot;size16&quot;&gt;textwrap은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파이썬 표준 라이브러리&lt;/b&gt;에 포함되어 있기 때문에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;따로 설치할 필요가 없습니다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 아래와 같이 바로 import 해서 사용하면 됩니다:&lt;/p&gt;
&lt;pre style=&quot;background-color: #f8f8f8; color: #383a42;&quot;&gt;&lt;code&gt;from textwrap import dedent

def generate_message():
    return dedent(&quot;&quot;&quot;
        Hello there,
        This message is formatted correctly!
        Have a great day!
    &quot;&quot;&quot;)

print(generate_message())
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅&lt;span&gt;&amp;nbsp;&lt;/span&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;파이썬 2.7 이상&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파이썬 3.x&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버전에서는 기본적으로 포함되어 있습니다.&lt;/li&gt;
&lt;li&gt;만약 ModuleNotFoundError가 발생한다면, 파이썬 환경 설정에 문제가 있을 수 있습니다. 이 경우에는 가상 환경 설정을 다시 확인해보세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&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;b&gt;dedent()가 유용한 상황들&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ &lt;b&gt;SQL 쿼리 작성 시&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;query = dedent(&quot;&quot;&quot;
    SELECT name, email
    FROM customers
    WHERE is_active = TRUE
    ORDER BY created_at DESC;
&quot;&quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ &lt;b&gt;로그 메시지 포맷팅 시&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;log_message = dedent(&quot;&quot;&quot;
    [WARNING] Disk space is running low!
    Please clear unnecessary files to avoid system issues.
&quot;&quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ &lt;b&gt;HTML, Markdown, 이메일 템플릿 생성 시&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;html = dedent(&quot;&quot;&quot;
    &amp;lt;html&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;h2&amp;gt;Thank You for Registering!&amp;lt;/h2&amp;gt;
            &amp;lt;p&amp;gt;Your account has been successfully created.&amp;lt;/p&amp;gt;
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&quot;&quot;&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4️⃣ &lt;b&gt;긴 Docstring 작성 시&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def process_data():
    &quot;&quot;&quot;
    This function processes raw data from various sources.
    It cleans, transforms, and prepares the data for analysis.
    &quot;&quot;&quot;
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  &lt;b&gt;마무리: 알고 나면 너무 쉬운 dedent()&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 &lt;b&gt;오랜기간 동안 파이썬을 사용&lt;/b&gt;했지만, 이 작은 팁을 모르고 있었어요. print할때 여백을 맞추기 위 밑의 코드처럼 사용했었는데요.&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739242936427&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def generate_email():
    return &quot;&quot;&quot;
Hello User,  
Your account will be deactivated soon.  
Please update your information to continue using our service.  
Customer Care Team  
&quot;&quot;&quot;
print(generate_email())&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;저와 같은 문제를 알고 있다가 해결되셨다면 공감 눌러주세요!&lt;/p&gt;</description>
      <category>Python/라이브러리</category>
      <category>dedent</category>
      <category>Python</category>
      <category>python &amp;quot;&amp;quot;&amp;quot;</category>
      <category>python clean code</category>
      <category>python textwrap dedent</category>
      <category>python triplequotes</category>
      <category>textwrap</category>
      <category>파이썬 문자열포맷</category>
      <category>파이썬 삼중따옴표 프린트</category>
      <category>파이썬팁</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/196</guid>
      <comments>https://intelloper.tistory.com/entry/python-textwrap-dedent#entry196comment</comments>
      <pubDate>Tue, 11 Feb 2025 12:05:52 +0900</pubDate>
    </item>
    <item>
      <title>[SW Architecture] 소프트웨어 아키텍처 패턴들을 탐구해보자</title>
      <link>https://intelloper.tistory.com/entry/software-architecture-patterns</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcYDRb/btsMd2jvQp5/F5aT4hYU8LkPf3lKGqGH91/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcYDRb/btsMd2jvQp5/F5aT4hYU8LkPf3lKGqGH91/img.webp&quot; data-alt=&quot;소프트웨어 아키텍트 패턴 탐구&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcYDRb/btsMd2jvQp5/F5aT4hYU8LkPf3lKGqGH91/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcYDRb%2FbtsMd2jvQp5%2FF5aT4hYU8LkPf3lKGqGH91%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;소프트웨어 아키텍트 패턴 탐구&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;소프트웨어 아키텍처 패턴에 대하여..&lt;/h1&gt;
&lt;p 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;b&gt;성능&lt;/b&gt; 등을 크게 향상시킬 수 있습니다. 하지만 모든 상황에 적합한 만능 아키텍처는 존재하지 않으며, 각 상황에 맞는 아키텍처 패턴을 선택하는 것이 중요합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소프트웨어 아키텍처 선택 시 고려해야 할 요소&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;성능 (Performance)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성 (Scalability)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;탄력성 (Elasticity)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유연성 (Flexibility)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;단순성 (Simplicity)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;신뢰성 (Reliability)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 (Cost)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;팀의 기술 역량 (Team Technical Capability)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 요소를 고려하여 적합한 아키텍처 패턴을 선택하는 것이 중요합니다. 이 글에서는 내가 가장 선호하는 아키텍처 패턴들과 그들이 어떻게 실용적으로 적용될 수 있는지에 대해 이야기해 보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. &lt;b&gt;Bounded Contexts (경계 컨텍스트)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Bounded Context&lt;/b&gt;는 도메인 주도 설계(DDD)에서 나온 개념이지만, DDD를 사용하지 않는 프로젝트에서도 널리 활용됩니다. 이 개념은 애플리케이션 내에서 서로 다른 도메인 모델들이 &lt;b&gt;명확히 구분되도록&lt;/b&gt; 도와줍니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bounded Context란?&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;/h4&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;b&gt;Catalogue (카탈로그)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Ordering (주문)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Payments (결제)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Identity (사용자 인증)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Bounded Context를 정의하면, 시스템이 확장되더라도 복잡성 증가를 효율적으로 관리할 수 있습니다. 또한, &lt;b&gt;모놀리식 아키텍처에서 마이크로서비스로의 전환&lt;/b&gt;이 용이해집니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;Clean Architecture와 Bounded Context&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Clean Architecture&lt;/b&gt;는 도메인 중심 아키텍처를 강조합니다. 도메인을 중심으로 시스템을 설계하고, 각 &lt;b&gt;Bounded Context&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;Vertical Slice Architecture (수직 분할 아키텍처)&lt;/b&gt;&lt;/h2&gt;
&lt;p 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;Bounded Context&lt;/b&gt;의 정의가 핵심이 됩니다.&lt;/p&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;가 용이합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &lt;b&gt;Event Storming (이벤트 스토밍)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이벤트 스토밍&lt;/b&gt;은 Bounded Context를 정의하는 데 매우 유용한 기법입니다. 이 방법은 팀이 &lt;b&gt;도메인 모델을 시각화&lt;/b&gt;하고, 시스템의 주요 &lt;b&gt;이벤트들&lt;/b&gt;을 파악할 수 있도록 도와줍니다. 특히 &lt;b&gt;도메인 주도 설계&lt;/b&gt;를 채택하거나 복잡한 시스템을 모델링할 때 강력한 도구가 됩니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. &lt;b&gt;사이드카 (Sidecar)&lt;/b&gt;&lt;/h2&gt;
&lt;p 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;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;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예시: 서비스 메시 (Service Mesh)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 메시는 사이드카 개념을 확장한 형태로, 모든 애플리케이션이 자체 사이드카 프록시를 사용하여 통신합니다. 이를 통해 트래픽을 &lt;b&gt;표준화된 방식&lt;/b&gt;으로 관리할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. &lt;b&gt;퍼블리셔-서브스크라이버 (Publisher-Subscriber)&lt;/b&gt;&lt;/h2&gt;
&lt;p 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;/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;/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;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;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. &lt;b&gt;애플리케이션 게이트웨이 (Application Gateway)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;애플리케이션 게이트웨이&lt;/b&gt;는 네트워크 트래픽을 여러 애플리케이션으로 &lt;b&gt;라우팅&lt;/b&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;SSL 종료&lt;/b&gt;와 &lt;b&gt;웹 애플리케이션 방화벽(WAF)&lt;/b&gt; 기능을 추가할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. &lt;b&gt;마이크로서비스 (Microservices)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마이크로서비스&lt;/b&gt;는 애플리케이션을 &lt;b&gt;독립적인 서비스&lt;/b&gt;로 분할하는 아키텍처입니다. 각 서비스는 &lt;b&gt;자체 API&lt;/b&gt;와 &lt;b&gt;데이터베이스&lt;/b&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;b&gt;확장성&lt;/b&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;b&gt;확장&lt;/b&gt;이 필요할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. &lt;b&gt;마이크로프론트엔드 (Microfrontends)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마이크로프론트엔드&lt;/b&gt;는 마이크로서비스와 유사하게 웹 애플리케이션을 여러 개의 작은 &lt;b&gt;프론트엔드&lt;/b&gt;로 분리하는 접근 방식입니다. 이 방법을 통해 각 팀은 독립적으로 UI를 개발하고 배포할 수 있습니다.&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;여러 팀이 웹 애플리케이션 UI의 다양한 섹션을 유지보수해야 할 때&lt;/li&gt;
&lt;li&gt;각 섹션을 &lt;b&gt;독립적으로 배포&lt;/b&gt;할 필요가 있을 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. &lt;b&gt;명령과 조회 책임 분리 (CQRS)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CQRS&lt;/b&gt;는 데이터 쓰기 측과 읽기 측을 분리하여 각 부분에 대해 &lt;b&gt;최적화된 기술&lt;/b&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;Write Side&lt;/b&gt;와 &lt;b&gt;Read Side&lt;/b&gt;에 대해 다른 데이터베이스 기술을 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Eventual Consistency&lt;/b&gt;를 사용하여 두 측면 간의 &lt;b&gt;일관성&lt;/b&gt;을 유지합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. &lt;b&gt;폴리글롯 아키텍처 (Polyglot Architecture)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;폴리글롯 아키텍처&lt;/b&gt;는 각 Bounded Context에 &lt;b&gt;최적화된 기술&lt;/b&gt;을 선택하여 시스템을 구축하는 방식입니다. 이를 통해 각 서비스가 독립적으로 최적화되며, 복잡한 시스템을 &lt;b&gt;효율적으로 관리&lt;/b&gt;할 수 있습니다.&lt;/p&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; Redis로 성능 최적화&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주문:&lt;/b&gt; PostgreSQL로 관계형 일관성 유지&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결제:&lt;/b&gt; CQRS와 이벤트 소싱을 사용한 복잡한 결제 흐름 모델링&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p 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;</description>
      <category>Architecture</category>
      <category>bounded contexts</category>
      <category>clean architecture</category>
      <category>event storming (이벤트 스토밍)</category>
      <category>ublisher-subscriber</category>
      <category>vertical slice architecture (수직 분할 아키텍처)</category>
      <category>모던소프트웨어</category>
      <category>사이드카 (sidecar)</category>
      <category>소프트웨어설계</category>
      <category>소프트웨어아키텍처</category>
      <category>아키텍처패턴</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/195</guid>
      <comments>https://intelloper.tistory.com/entry/software-architecture-patterns#entry195comment</comments>
      <pubDate>Tue, 11 Feb 2025 01:26:55 +0900</pubDate>
    </item>
    <item>
      <title>[파이썬 싱글톤 패턴] 클래스 속성을 이용한 싱글톤 패턴</title>
      <link>https://intelloper.tistory.com/entry/python-singleton-pattern</link>
      <description>&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;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZlXzA/btsMdIrJAV6/86wvUeuNSz1XSoKXuxD0Q1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZlXzA/btsMdIrJAV6/86wvUeuNSz1XSoKXuxD0Q1/img.webp&quot; data-alt=&quot;python 디자인 패턴 싱글톤 패턴 text on the img and generated by AI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZlXzA/btsMdIrJAV6/86wvUeuNSz1XSoKXuxD0Q1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZlXzA%2FbtsMdIrJAV6%2F86wvUeuNSz1XSoKXuxD0Q1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;python 디자인 패턴 싱글톤 패턴 text on the img and generated by AI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h1&gt;Python 클래스 속성을 이용한 싱글톤 패턴 구현&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 싱글톤 패턴이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글톤 패턴(Singleton Pattern)은 &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;b&gt;로그 기록 시스템&lt;/b&gt; 등에서 유용하게 사용됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 싱글톤 패턴 구현 방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬에서 싱글톤 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 &lt;b&gt;간단한 방법&lt;/b&gt; 중 하나는 &lt;b&gt;클래스 속성&lt;/b&gt;을 이용하는 것입니다. 이 방식은 클래스 내에 단 하나의 인스턴스만 존재하도록 보장하며, 해당 인스턴스에 대한 접근을 제공합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Singleton 클래스 구현&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 Singleton 클래스를 구현한 예제입니다. 이 클래스는 __new__ 메서드를 활용하여 &lt;b&gt;인스턴스를 한 번만 생성&lt;/b&gt;하고, 이후에는 &lt;b&gt;동일한 인스턴스&lt;/b&gt;를 반환합니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import threading

class Singleton:
    _instance = None  # 클래스 속성으로 싱글톤 인스턴스를 저장
    _lock = threading.Lock()  # 동기화를 위한 Lock

    def __new__(cls, *args, **kwargs):
        with cls._lock:  # 락을 이용해 스레드 안전성 보장
            if not cls._instance:  # 인스턴스가 아직 생성되지 않았을 때
                print(&quot;Creating new instance&quot;)
                cls._instance = super().__new__(cls, *args, **kwargs)
            else:
                print(&quot;Using existing instance&quot;)
        return cls._instance  # 항상 동일한 인스턴스를 반환

    def __init__(self, value1, value2):
        if not hasattr(self, 'initialized'):  # 이미 초기화된 경우에만 초기화
            self.value1 = value1
            self.value2 = value2
            self.initialized = True  # 초기화가 완료되었음을 표시
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 예제 실행 및 설명&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음은 위의 Singleton 클래스를 사용한 예제입니다. 두 개의 인스턴스를 생성해도 &lt;b&gt;동일한 인스턴스&lt;/b&gt;를 반환하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;# 첫 번째 인스턴스 생성
a = Singleton(10, 20)
print(f&quot;a.value1: {a.value1}, a.value2: {a.value2}&quot;)  # 출력: a.value1: 10, a.value2: 20

# 두 번째 인스턴스 생성 시도
b = Singleton(30, 40)
print(f&quot;b.value1: {b.value1}, b.value2: {b.value2}&quot;)  # 출력: b.value1: 10, b.value2: 20 (a와 동일한 인스턴스)

# a와 b는 동일한 인스턴스
print(a is b)  # 출력: True

# 값을 변경해도 두 인스턴스가 동일하게 반영됨
a.value1 = 42
print(f&quot;a.value1: {a.value1}, b.value1: {b.value1}&quot;)  # 출력: a.value1: 42, b.value1: 42
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 실행 결과&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Creating new instance
a.value1: 10, a.value2: 20
Using existing instance
b.value1: 10, b.value2: 20
True
a.value1: 42, b.value1: 42
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 코드 설명&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;클래스 속성 _instance&lt;/b&gt;: 이 속성은 Singleton 클래스의 &lt;b&gt;단 하나의 인스턴스&lt;/b&gt;를 저장합니다. 인스턴스가 없을 때만 새 객체를 생성하고, 이후에는 동일한 객체를 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;__new__ 메서드&lt;/b&gt;: 객체가 생성될 때 호출되며, 인스턴스를 처음 생성할 때만 super().__new__()를 호출하여 새로운 객체를 생성합니다. 이미 인스턴스가 존재한다면 &lt;b&gt;기존 객체&lt;/b&gt;를 반환합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;_lock&lt;/b&gt;: threading.Lock()을 사용하여 &lt;b&gt;멀티스레드 환경&lt;/b&gt;에서 동시 접근을 방지하고, &lt;b&gt;스레드 안전성&lt;/b&gt;을 보장합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;__init__ 메서드&lt;/b&gt;: 객체가 처음 생성될 때 값을 설정합니다. initialized 플래그를 사용하여 객체가 이미 초기화된 경우에는 초기화 코드가 반복되지 않도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 싱글톤 패턴의 활용&lt;/h2&gt;
&lt;p 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;h2 data-ke-size=&quot;size26&quot;&gt;8. 주의사항 및 확장 가능성&lt;/h2&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;: 기본 구현은 멀티스레드 환경에서 안전하지 않습니다. 위 코드에서는 threading.Lock()을 사용하여 동기화를 처리했지만, 더 복잡한 동시성 요구사항이 있을 경우 추가적인 동기화 기법이 필요할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초기화 논리&lt;/b&gt;: __init__ 메서드는 객체가 생성될 때마다 호출되기 때문에, 초기화 코드를 __new__ 메서드로 옮길 수도 있습니다. 이를 통해 인스턴스가 처음 생성될 때만 초기화가 이루어지도록 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 결론&lt;/h2&gt;
&lt;p 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;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 스타일링된 블로그 형식은 &lt;b&gt;코드와 설명의 구분&lt;/b&gt;을 명확히 하고, 중요한 부분을 강조하여 &lt;b&gt;독자의 이해를 돕는&lt;/b&gt; 데 초점을 맞췄습니다. 가독성이 향상되고, 내용이 더욱 흥미롭게 다가갈 것입니다.&lt;/p&gt;</description>
      <category>Python/디자인 패턴</category>
      <category>Python</category>
      <category>python singleton pattern</category>
      <category>디자인패턴</category>
      <category>소프트웨어디자인</category>
      <category>소프트웨어엔지니어링</category>
      <category>스레드안전성</category>
      <category>싱글톤패턴</category>
      <category>클래스속성</category>
      <category>파이썬코딩</category>
      <category>프로그래밍패턴</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/194</guid>
      <comments>https://intelloper.tistory.com/entry/python-singleton-pattern#entry194comment</comments>
      <pubDate>Mon, 10 Feb 2025 16:19:51 +0900</pubDate>
    </item>
    <item>
      <title>E: The repository ' https://download.docker.com/linux/ubuntu jammy InRelease' is not signed.(우분투 docker 설치시 에러)</title>
      <link>https://intelloper.tistory.com/entry/repository-docker-ubuntu-jammy-InRelease-is-not-signed</link>
      <description>&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;Frame34427.webp&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeayWP/btsMd9PZavV/NcYdyH5apYEaa8WkFMrXtk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeayWP/btsMd9PZavV/NcYdyH5apYEaa8WkFMrXtk/img.webp&quot; data-alt=&quot;ubuntu docker install error text with whale img generated by AI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeayWP/btsMd9PZavV/NcYdyH5apYEaa8WkFMrXtk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeeayWP%2FbtsMd9PZavV%2FNcYdyH5apYEaa8WkFMrXtk%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;512&quot; height=&quot;512&quot; data-filename=&quot;Frame34427.webp&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ubuntu docker install error text with whale img generated by AI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshotfrom2025-02-1013-38-28.webp&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAuwuM/btsMbXRcLcE/Mb1Tu5DKVAAVuF4eRQakFK/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAuwuM/btsMbXRcLcE/Mb1Tu5DKVAAVuF4eRQakFK/img.webp&quot; data-alt=&quot;W: GPG error: https://download.docker.com/linux/ubuntu jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAuwuM/btsMbXRcLcE/Mb1Tu5DKVAAVuF4eRQakFK/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAuwuM%2FbtsMbXRcLcE%2FMb1Tu5DKVAAVuF4eRQakFK%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;1236&quot; height=&quot;249&quot; data-filename=&quot;Screenshotfrom2025-02-1013-38-28.webp&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;249&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;W: GPG error: https://download.docker.com/linux/ubuntu jammy InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;우분투에서 Docker 설치할때 아래와 같은 에러가난다면!!!&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;W:&amp;nbsp;&lt;a href=&quot;https://dl.winehq.org/wine-builds/ubuntu/dists/focal/InRelease:&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dl.winehq.org/wine-builds/ubuntu/dists/focal/InRelease:&lt;/a&gt;&amp;nbsp;Key&amp;nbsp;is&amp;nbsp;stored&amp;nbsp;in&amp;nbsp;legacy&amp;nbsp;trusted.gpg&amp;nbsp;keyring&amp;nbsp;(/etc/apt/trusted.gpg),&amp;nbsp;see&amp;nbsp;the&amp;nbsp;DEPRECATION&amp;nbsp;section&amp;nbsp;in&amp;nbsp;apt-key(8)&amp;nbsp;for&amp;nbsp;details.&lt;br /&gt;W:&amp;nbsp;GPG&amp;nbsp;error:&lt;a href=&quot;https://download.docker.com/linux/ubuntu&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://download.docker.com/linux/ubuntu&lt;/a&gt;&amp;nbsp;jammy&amp;nbsp;InRelease:&amp;nbsp;The&amp;nbsp;following&amp;nbsp;signatures&amp;nbsp;couldn't&amp;nbsp;be&amp;nbsp;verified&amp;nbsp;because&amp;nbsp;the&amp;nbsp;public&amp;nbsp;key&amp;nbsp;is&amp;nbsp;not&amp;nbsp;available:&amp;nbsp;NO_PUBKEY&amp;nbsp;7EA0A9C3F273FCD8&lt;br /&gt;E:&amp;nbsp;The&amp;nbsp;repository&amp;nbsp;'&amp;nbsp;&lt;a href=&quot;https://download.docker.com/linux/ubuntu&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://download.docker.com/linux/ubuntu&lt;/a&gt;&amp;nbsp;jammy&amp;nbsp;InRelease'&amp;nbsp;is&amp;nbsp;not&amp;nbsp;signed.&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_1739163995872&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; sudo rm -rf /var/lib/apt/lists/*
 sudo apt-get update&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;docker 공식문서 보고 해결했습니다.&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Set up Docker's&lt;span&gt;&amp;nbsp;&lt;/span&gt;apt&lt;span&gt;&amp;nbsp;&lt;/span&gt;repository.
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  &quot;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &amp;amp;&amp;amp; echo &quot;${UBUNTU_CODENAME:-$VERSION_CODENAME}&quot;) stable&quot; | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
sudo apt-get update&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Install the Docker packages.
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;To install the latest version, run:&lt;/p&gt;
&lt;div data-pagefind-ignore=&quot;&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;Verify that the installation is successful by running the&lt;span&gt;&amp;nbsp;&lt;/span&gt;hello-world&lt;span&gt;&amp;nbsp;&lt;/span&gt;image:
&lt;div&gt;
&lt;div style=&quot;background-color: #ffffff;&quot;&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;$ sudo docker run hello-world
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;This command downloads a test image and runs it in a container. When the container runs, it prints a confirmation message and exits.&lt;/span&gt;&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&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;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;참고: &lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.docker.com/engine/install/ubuntu/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739168506958&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;Ubuntu&quot; data-og-description=&quot;Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.&quot; data-og-host=&quot;docs.docker.com&quot; data-og-source-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; data-og-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JReaj/hyYfV5TmrR/qU8bG0IyYsg3tl0GxoZGok/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260&quot;&gt;&lt;a href=&quot;https://docs.docker.com/engine/install/ubuntu/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.docker.com/engine/install/ubuntu/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JReaj/hyYfV5TmrR/qU8bG0IyYsg3tl0GxoZGok/img.jpg?width=2400&amp;amp;height=1260&amp;amp;face=0_0_2400_1260');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Ubuntu&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.docker.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Ubuntu/ERROR LOG</category>
      <category>and is therefore disabled by default.</category>
      <category>e: the repository 'https://download.docker.com/linux/ubuntu bionic inrelease' is not signed.</category>
      <category>e: the repository 'https://download.docker.com/linux/ubuntu jammy inrelease' is not signed.</category>
      <category>n: see apt-secure(8) manpage for repository creation and user configuration details.</category>
      <category>n: updating from such a repository can't be done securely</category>
      <category>see the deprecation section in apt-key(8) for details.</category>
      <category>ubuntu 22.04 cannot install docker</category>
      <category>w: gpg error: https://download.docker.com/linux/ubuntu jammy inrelease: the following signatures couldn't be verified because the public key is not available: no_pubkey 7ea0a9c3f273fcd8</category>
      <category>w: https://dl.winehq.org/wine-builds/ubuntu/dists/focal/inrelease: key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg)</category>
      <category>우분투 docker 설치 에러</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/193</guid>
      <comments>https://intelloper.tistory.com/entry/repository-docker-ubuntu-jammy-InRelease-is-not-signed#entry193comment</comments>
      <pubDate>Mon, 10 Feb 2025 15:25:00 +0900</pubDate>
    </item>
    <item>
      <title>시니어 개발자들은 이런거 안한대요. (개발자 물경력 방지)</title>
      <link>https://intelloper.tistory.com/entry/senior-developers-never-do</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTvmwa/btsMcAtFaBI/UTFg01mjqdUulFh2Yyi1b0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTvmwa/btsMcAtFaBI/UTFg01mjqdUulFh2Yyi1b0/img.webp&quot; data-alt=&quot;시니어 개발자는 이런거 안한대요 text img generated by AI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTvmwa/btsMcAtFaBI/UTFg01mjqdUulFh2Yyi1b0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTvmwa%2FbtsMcAtFaBI%2FUTFg01mjqdUulFh2Yyi1b0%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시니어 개발자는 이런거 안한대요 text img generated by AI&lt;/figcaption&gt;
&lt;/figure&gt;
&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;b&gt;설계 패턴, 아키텍처 원칙, 고급 프로그래밍 개념, 도메인 지식&lt;/b&gt;을 익히며 성장하고, 제품의 큰 그림을 이해하는 시니어 개발자로 발전하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⚙️ 과도한 아키텍처 설계 (Overengineering the Project Architecture)&lt;/h3&gt;
&lt;p 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;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;❌ 불필요한 마이크로서비스 사용&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;# 작은 프로젝트에 불필요한 마이크로서비스 구조
class UserService:
    def create_user(self, data):
        pass

class ProductService:
    def add_product(self, product):
        pass

# ✅ 간단한 모놀리식 구조로 개선
class App:
    def create_user(self, data):
        pass

    def add_product(self, product):
        pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 단순하면서도 확장 가능하고 유지 보수가 쉬운 아키텍처&lt;/b&gt;를 선호합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  &quot;완벽한&quot; 코드를 작성하려는 과도한 집착 (Overengineering the Codebase)&lt;/h3&gt;
&lt;p 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;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;❌ 과도하게 설계된 코드&lt;/h4&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from abc import ABC, abstractmethod

class UnitConverter(ABC):
    @abstractmethod
    def convert(self, value):
        pass

class FahrenheitToCelsiusConverter(UnitConverter):
    def convert(self, fahrenheit):
        return (fahrenheit - 32) * 5 / 9

converter = FahrenheitToCelsiusConverter()
print(converter.convert(250))  # 121.11
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 간단한 코드&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;def f2c(fahrenheit):
    return (fahrenheit - 32) * 5 / 9

print(f2c(250))  # 121.11
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 유지 보수성과 가독성을 고려하여 불필요한 복잡성을 피합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; ️ 기술 부채를 무시하는 태도 (Ignoring Growing Technical Debt)&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;/h4&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;user_data = fetch_data()
if user_data != None and len(user_data) &amp;gt; 0:
    process(user_data)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 리팩토링 후 개선된 코드&lt;/h4&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;def is_valid_data(data):
    return data is not None and len(data) &amp;gt; 0

user_data = fetch_data()
if is_valid_data(user_data):
    process(user_data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 지속적으로 코드 리팩토링과 리뷰를 통해 기술 부채를 관리합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  나쁜 코드를 주석으로 숨기기 (Using Comments to Hide Bad Code)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;주석&lt;/b&gt;은 코드의 가독성을 높이지만, &lt;b&gt;잘못된 코드를 정당화하는 용도&lt;/b&gt;로 사용해서는 안 됩니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;❌ 나쁜 예&lt;/h4&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;# 이니셜 포함 이름 생성
fullname = input(&quot;Fullname: &quot;)
p = fullname.strip().split(&quot; &quot;)
name = &quot;&quot;.join([n[0].upper() + &quot;.&quot; if i &amp;lt; len(p) - 1 else &quot; &quot; + p[-1].title() for i, n in enumerate(p)])
print(name)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 개선된 코드&lt;/h4&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;def format_name_with_initials(fullname):
    parts = fullname.strip().split(&quot; &quot;)
    initials = &quot;.&quot;.join([part[0].upper() for part in parts[:-1]])
    return f&quot;{initials}. {parts[-1].title()}&quot;

fullname = input(&quot;Fullname: &quot;)
print(format_name_with_initials(fullname))
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 주석 없이도 이해할 수 있는 깔끔한 코드를 작성합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;⏳ 구식 기술에 집착하기 (Sticking to Old-fashioned Technologies)&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;❌ 구식 jQuery&lt;/h4&gt;
&lt;pre class=&quot;arcade&quot;&gt;&lt;code&gt;$('#button').on('click', function() {
    alert('Clicked!');
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 최신 JavaScript&lt;/h4&gt;
&lt;pre class=&quot;coffeescript&quot;&gt;&lt;code&gt;const button = document.getElementById('button');
button.addEventListener('click', () =&amp;gt; alert('Clicked!'));
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 새로운 기술 트렌드를 따라가며 역량을 확장합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;✅ 소프트웨어 테스트를 소홀히 하기 (Not Prioritizing Software Testing)&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;  Python 단위 테스트 예제&lt;/h4&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;import unittest

def add(a, b):
    return a + b

class TestAddFunction(unittest.TestCase):
    def test_add(self):
        self.assertEqual(add(2, 3), 5)

if __name__ == '__main__':
    unittest.main()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;테스트를 통해 코드의 안정성을 보장하고 버그를 줄일 수 있습니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  표준 및 일반적인 관행 무시하기 (Avoiding Standard and General Practices)&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;❌ 비표준 React 이벤트 처리&lt;/h4&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
    buttonRef.current.addEventListener('click', handleClick);
    return () =&amp;gt; buttonRef.current.removeEventListener('click', handleClick);
}, []);
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 권장 방식&lt;/h4&gt;
&lt;pre class=&quot;hsp&quot;&gt;&lt;code&gt;return &amp;lt;button onClick={handleClick}&amp;gt;Click Me&amp;lt;/button&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 협업과 유지 보수를 고려하여 표준 관행을 따릅니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  하드웨어 성능을 믿고 성능 최적화를 소홀히 하기 (Ignoring Performance Factors Because of Modern Hardware)&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;/h4&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;result = []
for i in range(1000000):
    result.append(i * 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;✅ 최적화된 코드&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;result = [i * 2 for i in range(1000000)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;시니어 개발자는 하드웨어 성능에 의존하지 않고, 효율적인 코드를 작성합니다.&lt;/b&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 흔한 실수를 피함으로써 &lt;b&gt;시니어 개발자&lt;/b&gt;는 자신의 전문성을 유지하고, 협업 환경을 개선하며, &lt;b&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;&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;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;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/Clean Code Series(클린코드)] - [Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739119465949&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;[Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일&quot; data-og-description=&quot;왜 클린 코드가 중요한가요?클린 코드는 단순히 &amp;quot;잘 보이는 코드&amp;quot;를 넘어, 협업의 효율성을 높이고 유지보수를 쉽게 만들어줍니다. 가독성이 높은 코드는 버그를 줄이고, 코드 리뷰 시간을 단축&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/m5Uzd/hyYcfx6hV9/fkEGWL0D4Bzc5uvn182RP0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dp2wVF/hyYcjN4lHr/AmgwBDa4lHSmIM4F5hBt90/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-clean-code-12sections&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/m5Uzd/hyYcfx6hV9/fkEGWL0D4Bzc5uvn182RP0/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/dp2wVF/hyYcjN4lHr/AmgwBDa4lHSmIM4F5hBt90/img.jpg?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;왜 클린 코드가 중요한가요?클린 코드는 단순히 &quot;잘 보이는 코드&quot;를 넘어, 협업의 효율성을 높이고 유지보수를 쉽게 만들어줍니다. 가독성이 높은 코드는 버그를 줄이고, 코드 리뷰 시간을 단축&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Javascript/Clean Code Series(클린코드)] - [TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739119513286&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&quot; data-og-description=&quot;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5yFvu/hyYcihiqII/UckXTpPkP14kYIbkQTAOh0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/2F8lm/hyYcklTJKC/hLyMfGanrrxyGtyJ6ysmfK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/hLblz/hyYcesoUxf/n14UNjsy26NkrLUBurUJhk/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/typescript-solid-principal&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5yFvu/hyYcihiqII/UckXTpPkP14kYIbkQTAOh0/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/2F8lm/hyYcklTJKC/hLyMfGanrrxyGtyJ6ysmfK/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768,https://scrap.kakaocdn.net/dn/hLblz/hyYcesoUxf/n14UNjsy26NkrLUBurUJhk/img.png?width=768&amp;amp;height=768&amp;amp;face=0_0_768_768');&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;[TypeScript] 프론트엔드 개발자를 위한 SOLID 원칙. (feat.타입스크립트)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;S.O.L.I.D 원칙 타입스크립트 코드 예제로 이해하기깨끗하고 유지보수하기 쉬운 코드를 작성하는 것은 단순히 동작하는 코드를 작성하는 것만큼 중요합니다.S.O.L.I.D 원칙은 시간이 지나도 쉽게 조&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/정보] - 시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739119544518&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&quot; data-og-description=&quot;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/zudw5/hyYccg5Fx9/NMKQoTaWUUPth9YmsDVK6k/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/nRlTI/hyYcjAv6oQ/YK5wLCIx1KM5j3sfZ8T7H0/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%EC%8B%9C%EB%8B%88%EC%96%B4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EA%B0%9C%EB%B0%9C%EC%9E%90%EB%A1%9C-%EB%82%98%EC%95%84%EA%B0%80%EA%B8%B0%EC%9C%84%ED%95%9C-10%EA%B0%80%EC%A7%80-%EA%B0%9C%EB%85%90&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/zudw5/hyYccg5Fx9/NMKQoTaWUUPth9YmsDVK6k/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/nRlTI/hyYcjAv6oQ/YK5wLCIx1KM5j3sfZ8T7H0/img.jpg?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&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;시니어 파이썬 개발자로 나아가기위한 10가지 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;AI 웹앱 개발자로서 Python은 이제 너무 중요한 언어인것 같습니다. &amp;nbsp;주력 언어로 Javascript와 Python은 계속 이어질것 같고 Python을 좀 더 딥하게 이해하고 숙달하기 위해 중요 개념들을 정리해봅니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/정보</category>
      <category>ignoring growing technical debt</category>
      <category>overengineering the codebase</category>
      <category>using comments to hide bad code</category>
      <category>개발자 물경력</category>
      <category>과도한 아키텍처 설계 (overengineering the project architecture)</category>
      <category>성능 최적화</category>
      <category>시니어 개발자</category>
      <category>시니어 개발자 되는법</category>
      <category>시니어 개발자들은 이런거 안한대요. (개발자 물 경력 방지)</category>
      <category>주니어 개발자</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/192</guid>
      <comments>https://intelloper.tistory.com/entry/senior-developers-never-do#entry192comment</comments>
      <pubDate>Mon, 10 Feb 2025 01:47:13 +0900</pubDate>
    </item>
    <item>
      <title>Python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법</title>
      <link>https://intelloper.tistory.com/entry/python-performance-optimizing</link>
      <description>&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;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ncipt/btsMcc0BALl/JeQYOTzGdsOksb4ue6HmV1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ncipt/btsMcc0BALl/JeQYOTzGdsOksb4ue6HmV1/img.webp&quot; data-alt=&quot;python 성능 향상 img generated by AI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ncipt/btsMcc0BALl/JeQYOTzGdsOksb4ue6HmV1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcipt%2FbtsMcc0BALl%2FJeQYOTzGdsOksb4ue6HmV1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;python 성능 향상 img generated by AI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 코드가 느려서 답답한 경험, 누구나 한 번쯤 있죠?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제가 사용한 주요 Python 성능 최적화 방법들을 공유하려고 합니다. 이 방법들을 통해 여러분도 Python 스크립트를 빠르게 만들 수 있을 것입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 성능 병목 구간 찾기: 프로파일링부터 시작&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능을 개선하기 전에, 무엇이 문제인지를 아는 것이 가장 중요합니다. 코드에서 병목이 되는 부분을 정확히 찾아내야 효과적인 최적화를 할 수 있죠. 이를 위해 Python의 cProfile을 사용해 프로파일링을 진행해봅시다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;import cProfile

def process_file():
    # 로그 파일 처리
    read_log_file()
    analyze_data()

def read_log_file():
    # 파일 읽기 작업
    pass

def analyze_data():
    # 데이터 분석 작업
    pass

if __name__ == &quot;__main__&quot;:
    cProfile.run('process_file()')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cProfile을 사용하면, 각 함수가 호출된 횟수와 실행 시간을 알 수 있어 성능 저하의 원인을 파악하는 데 유용합니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 내장 함수 활용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python의 내장 함수들은 대부분 C로 구현되어 있어 성능이 매우 뛰어납니다. 반복문을 직접 작성하기보다는 내장 함수를 사용하는 것이 성능을 높이는 지름길이죠. 예를 들어, collections.Counter를 사용하면 리스트에서 아이템의 빈도수를 쉽게 계산할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;capnproto&quot;&gt;&lt;code&gt;from collections import Counter

# 리스트에서 아이템 빈도수 계산
word_counts = Counter(words_list)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직접 반복문을 작성하는 것보다 한 줄로 간단히 해결할 수 있어 코드도 깔끔해지고 성능도 향상됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. NumPy로 반복 연산 최적화하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수치 연산이 많이 포함된 작업에서는 NumPy를 사용하는 것이 아주 큰 차이를 만들어냅니다. NumPy는 C로 작성된 배열을 사용하여 빠른 수치 연산을 지원합니다. 예를 들어, 리스트 컴프리헨션으로 값을 두 배로 만드는 작업은 NumPy로 처리하면 훨씬 빠릅니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import numpy as np

# NumPy 배열 생성 후 연산
numbers = np.linspace(1, 1_000_000, num=1_000_000)
doubled_numbers = numbers * 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 NumPy를 사용하면, 수백만 개의 데이터 처리도 순식간에 끝납니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 리스트 컴프리헨션 활용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순한 변환 작업이라면 전통적인 for 루프 대신 리스트 컴프리헨션을 사용하는 것이 더 효율적입니다. 컴프리헨션은 내부적으로 C로 최적화되어 있어 성능이 좋습니다.&lt;/p&gt;
&lt;pre class=&quot;maxima&quot;&gt;&lt;code&gt;# 전통적인 방법
squares = []
for num in range(10_000):
    squares.append(num**2)

# 리스트 컴프리헨션
squares = [num**2 for num in range(10_000)]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간결한 코드로 성능도 향상되므로, 가능하면 리스트 컴프리헨션을 사용하는 것이 좋습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. Numba로 JIT 컴파일 사용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적인 연산이 많은 코드에서는 Numba의 JIT(Just-In-Time) 컴파일러를 활용하면 성능을 크게 개선할 수 있습니다. Numba는 Python 코드를 기계어로 컴파일하여 실행 속도를 비약적으로 향상시킵니다.&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;from numba import jit

@jit
def calculate_square_and_cube(data):
    result = 0
    for number in data:
        result += number**2 + number**3
    return result
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Numba를 사용하면 복잡한 수학 연산이 포함된 코드도 훨씬 더 빠르게 실행됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;6. 반복 계산 결과 캐싱하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 호출되는 계산 함수는 functools.lru_cache를 활용해 캐싱하면 성능을 크게 개선할 수 있습니다. 이미 계산한 값을 저장해두고, 다시 같은 계산을 할 때는 캐시된 값을 사용하는 방식입니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;from functools import lru_cache

@lru_cache(maxsize=None)
def factorial(n):
    if n == 0:
        return 1
    return n * factorial(n - 1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복되는 함수 호출에서 캐싱을 적용하면, 성능이 크게 향상됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;7. 더 효율적인 데이터 구조 사용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트에서 in 연산을 사용해 반복적으로 요소를 찾는 작업은 비효율적입니다. 이럴 땐 set이나 dict를 사용하면 훨씬 빠른 검색이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 비효율적인 방식
if item in large_list:
    ...

# 더 효율적인 방식
large_set = set(large_list)
if item in large_set:
    ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;set은 평균적으로 O(1)의 시간 복잡도를 가지고 있어 큰 데이터에서도 빠른 검색을 보장합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;8. 병렬 처리 활용하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 CPU 코어를 사용할 수 있다면, multiprocessing이나 joblib을 활용해 작업을 병렬로 처리하는 것이 성능을 크게 개선할 수 있는 방법입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from multiprocessing import Pool

def compute_square(number):
    return number ** 2

if __name__ == &quot;__main__&quot;:
    data = range(1_000_000)
    with Pool(4) as pool:
        results = pool.map(compute_square, data)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멀티코어 환경에서는 병렬 처리가 매우 유효합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;9. 전역 변수 피하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 변수는 Python이 여러 네임스페이스에서 검색해야 하므로 성능을 저하시킬 수 있습니다. 지역 변수를 사용하면 성능을 개선하고, 코드도 더 깔끔해집니다.&lt;/p&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;# 전역 변수 사용
counter = 0

def update_counter(data):
    global counter
    for item in data:
        counter += 1

# 지역 변수 사용
def update_counter(data):
    local_counter = 0
    for item in data:
        local_counter += 1
    return local_counter
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전역 변수를 피하고 지역 변수로 대체하는 것이 성능 개선에 도움이 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10. Python 인터프리터 선택&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyPy는 JIT 컴파일러를 포함한 Python 인터프리터로, 숫자 계산이 많은 코드에서 성능을 크게 향상시킬 수 있습니다. CPython에 비해 상당한 성능 향상을 기대할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;pypy my_script.py
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PyPy는 특히 수학 연산이 많은 코드에서 뛰어난 성능을 발휘합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 성능 최적화는 단순히 코드를 더 효율적으로 만드는 작업이 아니라, 올바른 도구와 기법을 활용하는 과정입니다. 프로파일링을 통해 병목 구간을 찾아내고, NumPy, Numba, 캐싱, 병렬 처리 등을 적절히 조합하면 실행 속도를 크게 개선할 수 있습니다. 이러한 방법들을 활용하여 여러분의 Python 코드를 더 빠르고 효율적으로 만들어 보세요!&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;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/성능] - FastAPI 성능 최적화하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738947663372&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;FastAPI 성능 최적화하기&quot; data-og-description=&quot;FastAPI 애플리케이션의 성능을 개선하기 위해 많은 자료를 찾아보고 정리해봅니다.예제 소개다음은 FastAPI의 기본적인 엔드포인트 예제입니다.  Product라는 Pydantic 모델을 정의하고, products 리스트&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/FastAPI-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/hhrCI/hyYcjfGFeS/q8hlgWKULJQRIoekYVuK30/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fm431/hyYci8UMDV/u3Xkk7BMYGirPPAxdDBwp1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/FastAPI-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/FastAPI-%EC%84%B1%EB%8A%A5-%EC%B5%9C%EC%A0%81%ED%99%94%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/hhrCI/hyYcjfGFeS/q8hlgWKULJQRIoekYVuK30/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/fm431/hyYci8UMDV/u3Xkk7BMYGirPPAxdDBwp1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;FastAPI 성능 최적화하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;FastAPI 애플리케이션의 성능을 개선하기 위해 많은 자료를 찾아보고 정리해봅니다.예제 소개다음은 FastAPI의 기본적인 엔드포인트 예제입니다.  Product라는 Pydantic 모델을 정의하고, products 리스트&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/TTLCache-vs-DiskCache&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/성능] - [Python 성능]  ️ TTLCache vs DiskCache: 이미지 캐싱 속도 비교와 최적화 방법&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738947671893&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;[Python 성능]  ️ TTLCache vs DiskCache: 이미지 캐싱 속도 비교와 최적화 방법&quot; data-og-description=&quot;이미지 또는 대용량 데이터를 빠르게 로드하려면 캐싱(Cache) 을 활용해야 합니다. 그런데 FastAPI에서 이미지를 캐싱할 때, TTLCache(메모리 캐시)와 DiskCache(디스크 캐시) 중 어떤 것이 더 나을까요?✔&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/TTLCache-vs-DiskCache&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/TTLCache-vs-DiskCache&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/5KeQy/hyYb6OaLGn/SoWpvlZUNXnHVI4WJok9Qk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/8Z1aP/hyYb7zx9OC/q1xiXiSkcDVpmpTlPnjhh1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/blHXRs/hyYciA48qU/qfinO5AgOvUNsW6RZtNeT0/img.png?width=1536&amp;amp;height=1536&amp;amp;face=0_0_1536_1536&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/TTLCache-vs-DiskCache&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/TTLCache-vs-DiskCache&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/5KeQy/hyYb6OaLGn/SoWpvlZUNXnHVI4WJok9Qk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/8Z1aP/hyYb7zx9OC/q1xiXiSkcDVpmpTlPnjhh1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/blHXRs/hyYciA48qU/qfinO5AgOvUNsW6RZtNeT0/img.png?width=1536&amp;amp;height=1536&amp;amp;face=0_0_1536_1536');&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;[Python 성능]  ️ TTLCache vs DiskCache: 이미지 캐싱 속도 비교와 최적화 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;이미지 또는 대용량 데이터를 빠르게 로드하려면 캐싱(Cache) 을 활용해야 합니다. 그런데 FastAPI에서 이미지를 캐싱할 때, TTLCache(메모리 캐시)와 DiskCache(디스크 캐시) 중 어떤 것이 더 나을까요?✔&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/성능] - (Python 성능 향상) concurrent.futures 동시 프로그래밍 모듈로 속도 개선해보자!&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738947690613&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;(Python 성능 향상) concurrent.futures 동시 프로그래밍 모듈로 속도 개선해보자!&quot; data-og-description=&quot;성능에 대해서는 프로그램을 만들고 나서나 기능 개발이 완료되고 나서나 작동이 잘되는것을 확인했는데 속도가 아쉽다면 항상 고민을 하게 됩니다.우리는 더 나은 품질에 빠릿빠릿한 프로그&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eSkqu/hyYb52ODs9/OiimWr2S5IucfAzw2jAVRK/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/fOXRB/hyYb6OaL02/UfiDdQFy4lYrrz03khTpN0/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/bRPBLP/hyYcdNhYSe/EpCShsMrRmZuk3ZKnYzcU1/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-concurrent-futures&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eSkqu/hyYb52ODs9/OiimWr2S5IucfAzw2jAVRK/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/fOXRB/hyYb6OaL02/UfiDdQFy4lYrrz03khTpN0/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532,https://scrap.kakaocdn.net/dn/bRPBLP/hyYcdNhYSe/EpCShsMrRmZuk3ZKnYzcU1/img.png?width=248&amp;amp;height=532&amp;amp;face=0_0_248_532');&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;(Python 성능 향상) concurrent.futures 동시 프로그래밍 모듈로 속도 개선해보자!&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;성능에 대해서는 프로그램을 만들고 나서나 기능 개발이 완료되고 나서나 작동이 잘되는것을 확인했는데 속도가 아쉽다면 항상 고민을 하게 됩니다.우리는 더 나은 품질에 빠릿빠릿한 프로그&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;&amp;nbsp;&lt;/p&gt;</description>
      <category>Python/성능</category>
      <category>numba로 jit 컴파일 사용하기</category>
      <category>numpy로 반복 연산 최적화하기</category>
      <category>python optimize</category>
      <category>python performance increase</category>
      <category>python 성능 향상: 3배 더 빠른 스크립트로 바꾸는 방법</category>
      <category>python 인터프리터</category>
      <category>파이썬 collections.counter</category>
      <category>파이썬 cprofile</category>
      <category>파이썬 리스트 컴프리헨션</category>
      <category>파이썬 성능 향상</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/191</guid>
      <comments>https://intelloper.tistory.com/entry/python-performance-optimizing#entry191comment</comments>
      <pubDate>Sun, 9 Feb 2025 08:00:38 +0900</pubDate>
    </item>
    <item>
      <title>[Python/Clean Code Series(클린코드)] 12가지 프로덕션급 Python 클린 코드 스타일</title>
      <link>https://intelloper.tistory.com/entry/python-clean-code-12sections</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgZN8F/btsMb0lCYXL/1kH2A4mk2NZrm6a1CQKHC1/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgZN8F/btsMb0lCYXL/1kH2A4mk2NZrm6a1CQKHC1/img.webp&quot; data-alt=&quot;python clean code img generated by AI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgZN8F/btsMb0lCYXL/1kH2A4mk2NZrm6a1CQKHC1/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgZN8F%2FbtsMb0lCYXL%2F1kH2A4mk2NZrm6a1CQKHC1%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;python clean code img generated by AI&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;왜 클린 코드가 중요한가요?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클린 코드는 단순히 &quot;잘 보이는 코드&quot;를 넘어, 협업의 효율성을 높이고 유지보수를 쉽게 만들어줍니다. 가독성이 높은 코드는 버그를 줄이고, 코드 리뷰 시간을 단축하며, 새로운 개발자가 프로젝트에 빠르게 적응할 수 있도록 도와줍니다. 프로덕션 환경에서는 특히 코드의 명확성과 일관성이 중요한데, 이는 시스템의 안정성과 직결되기 때문입니다.&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;h2 data-ke-size=&quot;size26&quot;&gt;평소에 클린코드에 대한 지식을 리마인드하고 지속적으로 코딩 실력을 다져줘야합니다.&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;아래의 글도 같이 보시고 리마인드해보세요.&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;&lt;a href=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EA%B8%B0%EB%B3%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/Clean Code Series(클린코드)] - 파이썬 클린코드 기본&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738945504898&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;파이썬 클린코드 기본&quot; data-og-description=&quot;클린 코드는 여러가지 측면이 있지만, 그 중에서도 다른 사람이 쉽게 이해하고 유지보수할 수 있는 코드를 작성하는 것이 중요합니다. 이를 위해서는 가독성, 명확성, 간결성 등이 필요합니다. &quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EA%B8%B0%EB%B3%B8&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EA%B8%B0%EB%B3%B8&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dHT9Ky/hyYcds0bF6/K8d0JHvcKJL1qMx3R9moi1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/CO9oS/hyYb9KUpSC/nFCktL9qTa7kUXiz88Ei3K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EA%B8%B0%EB%B3%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%EA%B8%B0%EB%B3%B8&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dHT9Ky/hyYcds0bF6/K8d0JHvcKJL1qMx3R9moi1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/CO9oS/hyYb9KUpSC/nFCktL9qTa7kUXiz88Ei3K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;파이썬 클린코드 기본&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;클린 코드는 여러가지 측면이 있지만, 그 중에서도 다른 사람이 쉽게 이해하고 유지보수할 수 있는 코드를 작성하는 것이 중요합니다. 이를 위해서는 가독성, 명확성, 간결성 등이 필요합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;이번 글에서는 12가지 프로덕션급 Python 코드 스타일을 공유합니다.&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;b&gt;시작!&lt;/b&gt;&lt;/h2&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 괄호를 이용한 튜플 언패킹&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 튜플 언패킹은 이렇게 합니다:&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;a, b = (1, 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 프로덕션 코드에서는 변수 이름이 더 길어지기 때문에 괄호를 사용해 가독성을 높입니다.&lt;/p&gt;
&lt;pre class=&quot;lisp&quot;&gt;&lt;code&gt;(long_variable_name_one, long_variable_name_two) = (1, 2)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 하면 변수 이름이 길어도 더 깔끔하게 읽을 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 여러 줄 리스트 컴프리헨션&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧은 변수명을 사용하던 학생 시절과 달리, 실무에서는 더 구체적인 변수명을 씁니다. 이 때문에 리스트 컴프리헨션도 여러 줄로 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;isbl&quot;&gt;&lt;code&gt;result = [
    process_data(item)
    for item in long_descriptive_list
    if condition_met(item)
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가독성이 훨씬 좋아지죠?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 괄호를 활용한 긴 문자열 결합&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 문자열을 +로 연결하는 대신 괄호를 사용하면 더 깔끔합니다.&lt;/p&gt;
&lt;pre class=&quot;makefile&quot;&gt;&lt;code&gt;message = (
    &quot;This is a very long message &quot;
    &quot;that spans multiple lines &quot;
    &quot;for better readability.&quot;
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python은 괄호 안에서 자동으로 문자열을 이어줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 여러 줄 메서드 체이닝&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;긴 메서드 체이닝은 이렇게 줄바꿈하면 가독성이 좋아집니다.&lt;/p&gt;
&lt;pre class=&quot;clojure&quot;&gt;&lt;code&gt;(result
    .filter(condition)
    .map(transformation)
    .reduce(aggregation))
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백슬래시(\) 없이도 줄바꿈이 가능하다는 점, 기억하세요!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 중첩된 딕셔너리 인덱싱&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;딕셔너리가 깊게 중첩되면 한 줄로 쓰기 어렵습니다. 이럴 땐 이렇게 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;value = (
    data[&quot;user&quot;]
        [&quot;profile&quot;]
        [&quot;details&quot;]
        [&quot;name&quot;]
)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가독성이 훨씬 좋아지죠?&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 읽기 쉽고 정보가 풍부한 함수 작성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수는 이렇게 작성해야 가독성이 좋습니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def calculate_total_price(items: list[dict], tax_rate: float) -&amp;gt; float:
    &quot;&quot;&quot;
    주어진 항목 목록과 세금율을 기반으로 총 가격을 계산합니다.

    Args:
        items (list): 항목 목록
        tax_rate (float): 세금율

    Returns:
        float: 총 가격
    &quot;&quot;&quot;
    return sum(item[&quot;price&quot;] for item in items) * (1 + tax_rate)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입 힌트와 주석만으로도 함수의 목적이 명확해집니다.&lt;/p&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. 들여쓰기 최소화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 들여쓰기를 줄이면 코드가 더 깔끔해집니다.&lt;/p&gt;
&lt;pre class=&quot;vala&quot;&gt;&lt;code&gt;# 개선 전
if condition:
    do_something()

# 개선 후
if not condition:
    return
do_something()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;들여쓰기를 한 단계 줄이는 것만으로도 코드가 훨씬 깔끔해집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 괄호를 활용한 복잡한 조건문&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건이 길어질수록 괄호로 나눠 작성하면 가독성이 올라갑니다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;if (
    user.is_active and
    user.has_permission and
    user.subscription_valid
):
    grant_access()
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요하다면 조건을 함수로 빼는 것도 좋은 방법입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. None 값 처리하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;None으로 인한 에러를 방지하려면 이렇게 작성합니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;if dog and dog.owner and dog.owner.name == &quot;Bob&quot;:
    print(&quot;Bob's dog&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;짧고 안전한 코드입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. None 값에 대한 반복문 보호&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리스트가 None일 경우를 대비하려면 이렇게 작성하세요.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;for item in (mylist or []):
    process(item)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mylist가 None이면 빈 리스트로 대체되어 에러가 발생하지 않습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;11. 내부 메서드는 언더스코어로 시작&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클래스 내부 전용 메서드는 _로 시작하는 것이 관례입니다.&lt;/p&gt;
&lt;pre class=&quot;ruby&quot;&gt;&lt;code&gt;class DataProcessor:
    def run(self):
        self._clean()
        self._transform()

    def _clean(self):
        pass

    def _transform(self):
        pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서는 _clean()이나 _transform()을 사용하지 않도록 하는 암묵적인 신호입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;12. 데코레이터로 공통 기능 관리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복되는 코드는 데코레이터로 관리하면 효율적입니다.&lt;/p&gt;
&lt;pre class=&quot;python&quot;&gt;&lt;code&gt;def log_and_handle_errors(func):
    def wrapper(*args, **kwargs):
        try:
            print(f&quot;Running {func.__name__}&quot;)
            return func(*args, **kwargs)
        except Exception as e:
            print(f&quot;Error: {e}&quot;)
    return wrapper

@log_and_handle_errors
def process_data():
    pass
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공통 기능을 한 곳에서 관리할 수 있어 유지보수성이 높아집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-cleancode-list-comprehension&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/Clean Code Series(클린코드)] - (파이썬 클린코드) 리스트 컴프리헨션(List Comprehension)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738946247213&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;(파이썬 클린코드) 리스트 컴프리헨션(List Comprehension)&quot; data-og-description=&quot;(파이썬&amp;nbsp;클린코드)&amp;nbsp;리스트&amp;nbsp;컴프리헨션(List&amp;nbsp;Comprehension)리스트 컴프리헨션(List Comprehension) 사용하기반복문을 한 줄로 간결하게 작성할 수 있는 방법입니다.예를 들어, 1부터 10까지의 숫자 중에&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-cleancode-list-comprehension&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-cleancode-list-comprehension&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bVWOI4/hyYb7M2FZZ/lSq7ccD4NV77kTsqjPNun0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bA3xt3/hyYckMmUNL/IigEwiRPf3Fl8sjdZQHknK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/lsqG9/hyYb9qBtc5/zf4fkIVDn0wRnY8hYNt60k/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-cleancode-list-comprehension&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-cleancode-list-comprehension&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bVWOI4/hyYb7M2FZZ/lSq7ccD4NV77kTsqjPNun0/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bA3xt3/hyYckMmUNL/IigEwiRPf3Fl8sjdZQHknK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/lsqG9/hyYb9qBtc5/zf4fkIVDn0wRnY8hYNt60k/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;(파이썬 클린코드) 리스트 컴프리헨션(List Comprehension)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(파이썬&amp;nbsp;클린코드)&amp;nbsp;리스트&amp;nbsp;컴프리헨션(List&amp;nbsp;Comprehension)리스트 컴프리헨션(List Comprehension) 사용하기반복문을 한 줄로 간결하게 작성할 수 있는 방법입니다.예를 들어, 1부터 10까지의 숫자 중에&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-cleancode-lambda&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/Clean Code Series(클린코드)] - (파이썬 클린코드) 람다 함수(Lambda Function)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738946254057&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;(파이썬 클린코드) 람다 함수(Lambda Function)&quot; data-og-description=&quot;(파이썬&amp;nbsp;클린코드)&amp;nbsp;람다&amp;nbsp;함수(Lambda&amp;nbsp;Function)람다 함수(Lambda Function) 사용하기함수를 한 줄로 간결하게 작성할 수 있는 방법입니다.예를 들어, 두 개의 숫자를 더하는 함수를 람다 함수로 작성하&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/python-cleancode-lambda&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/python-cleancode-lambda&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NqQ0b/hyYb70BSAx/VUdJN16QwLPjKg0uJ8tEt1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bFONyN/hyYcds0f8Y/7FRuU0tJk0vANvA3kHikDK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bsAtEs/hyYck6JrWG/FKLD8bgv7PNFd9aKkupAMk/img.jpg?width=1024&amp;amp;height=1024&amp;amp;face=0_0_1024_1024&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/python-cleancode-lambda&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/python-cleancode-lambda&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NqQ0b/hyYb70BSAx/VUdJN16QwLPjKg0uJ8tEt1/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bFONyN/hyYcds0f8Y/7FRuU0tJk0vANvA3kHikDK/img.jpg?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bsAtEs/hyYck6JrWG/FKLD8bgv7PNFd9aKkupAMk/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;(파이썬 클린코드) 람다 함수(Lambda Function)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(파이썬&amp;nbsp;클린코드)&amp;nbsp;람다&amp;nbsp;함수(Lambda&amp;nbsp;Function)람다 함수(Lambda Function) 사용하기함수를 한 줄로 간결하게 작성할 수 있는 방법입니다.예를 들어, 두 개의 숫자를 더하는 함수를 람다 함수로 작성하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;[Python/Clean Code Series(클린코드)] - (파이썬 클린코드) 파이썬 내장 함수 사용하기&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738946269534&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;(파이썬 클린코드) 파이썬 내장 함수 사용하기&quot; data-og-description=&quot;파이썬 내장 함수를 사용하여 코드를 간결하게 작성할 수 있습니다. 예를 들어, 리스트의 합을 구하는 함수 sum을 사용하여 코드를 간결하게 작성할 수 있습니다 간단 예시 numbers = [1, 2, 3, 4, 5] sum&quot; data-og-host=&quot;intelloper.tistory.com&quot; data-og-source-url=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; data-og-url=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/emSKcu/hyYb6UWpSW/6rb7oDeldORkJIU9rKKKeK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/qGbLf/hyYceMcdor/vWud2VkgjWKePkGtybdMqK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://intelloper.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%ED%81%B4%EB%A6%B0%EC%BD%94%EB%93%9C-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%82%B4%EC%9E%A5-%ED%95%A8%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/emSKcu/hyYb6UWpSW/6rb7oDeldORkJIU9rKKKeK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/qGbLf/hyYceMcdor/vWud2VkgjWKePkGtybdMqK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&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;(파이썬 클린코드) 파이썬 내장 함수 사용하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;파이썬 내장 함수를 사용하여 코드를 간결하게 작성할 수 있습니다. 예를 들어, 리스트의 합을 구하는 함수 sum을 사용하여 코드를 간결하게 작성할 수 있습니다 간단 예시 numbers = [1, 2, 3, 4, 5] sum&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;intelloper.tistory.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;</description>
      <category>Python/Clean Code Series(클린코드)</category>
      <category>Python</category>
      <category>python clean code</category>
      <category>python/clean code series(클린코드)</category>
      <category>중첩된 딕셔너리 인덱싱</category>
      <category>파이썬 괄호를 이용한 튜플 언패킹</category>
      <category>파이썬 내부 메서드는 언더스코어로 시작</category>
      <category>파이썬 데코레이터로 공통 기능 관리</category>
      <category>파이썬 들여쓰기</category>
      <category>파이썬 여러 줄 리스트 컴프리헨션</category>
      <category>파이썬 클린코드</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/190</guid>
      <comments>https://intelloper.tistory.com/entry/python-clean-code-12sections#entry190comment</comments>
      <pubDate>Sat, 8 Feb 2025 01:41:36 +0900</pubDate>
    </item>
    <item>
      <title>[Python Library]   9개의 Python Library로 보고서 만들기</title>
      <link>https://intelloper.tistory.com/entry/python-libraries-report</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ra8Mq/btsL8Z9tVBg/oQtdhIkHHEVrlEflWA7PCk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ra8Mq/btsL8Z9tVBg/oQtdhIkHHEVrlEflWA7PCk/img.webp&quot; data-alt=&quot;python library for report img generated by AI&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ra8Mq/btsL8Z9tVBg/oQtdhIkHHEVrlEflWA7PCk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fra8Mq%2FbtsL8Z9tVBg%2FoQtdhIkHHEVrlEflWA7PCk%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;512&quot; height=&quot;512&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;python library for report img generated by AI&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;  9개의 Python 라이브러리로 원시 데이터를 바로 출판 가능한 보고서로 변환하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 분석이 끝났다면, 이제 중요한 건 &lt;b&gt;결과를 어떻게 잘 전달하느냐&lt;/b&gt;입니다. 복잡한 데이터도 깔끔한 보고서로 바꿔줄 Python 라이브러리 9가지를 소개합니다. 이 도구들을 활용하면 원시 데이터가 눈에 띄게 변신합니다.  &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ Camelot: PDF에서 표 추출하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Camelot&lt;/b&gt;은 PDF 문서에서 표를 쉽게 추출할 수 있는 강력한 라이브러리입니다. PDF 파일 경로만 지정하면, 복잡한 테이블도 깔끔하게 가져올 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;import camelot

# PDF 파일에서 테이블 추출
tables = camelot.read_pdf('sample.pdf', pages='1')  # 첫 페이지에서 테이블 추출

# 추출된 테이블 개수 확인
print(f&quot;추출된 테이블 수: {len(tables)}&quot;)

# 첫 번째 테이블 미리보기
print(tables[0].df)

# CSV로 저장
tables.export('output.csv', f='csv')
&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; 기업의 연간 보고서에서 표 데이터 추출 후 Excel로 변환&lt;/li&gt;
&lt;li&gt;&lt;b&gt;논문 데이터 분석:&lt;/b&gt; PDF 논문 속 통계 테이블 추출 후 데이터 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ Sweetviz: 데이터 분석 리포트 자동 생성기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Sweetviz&lt;/b&gt;는 데이터 분석 리포트를 자동으로 생성해주는 시각화 도구입니다. pandas 데이터프레임만 있으면, 몇 줄의 코드로 인사이트 가득한 웹 보고서를 만들 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;haskell&quot;&gt;&lt;code&gt;import sweetviz as sv
import pandas as pd

# 데이터 로드
df = pd.read_csv('data.csv')

# 분석 및 리포트 생성
report = sv.analyze(df)

# HTML 리포트 저장
report.show_html('report.html')
&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;EDA 자동화:&lt;/b&gt; 새로운 데이터셋에 대한 탐색적 분석 리포트 빠르게 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데이터 품질 검토:&lt;/b&gt; 결측치, 이상치, 데이터 분포 자동 시각화&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;revenue_unit_wrap&quot;&gt;
  &lt;div class=&quot;revenue_unit_item adsense responsive&quot;&gt;
    &lt;div class=&quot;revenue_unit_info&quot;&gt;반응형&lt;/div&gt;
    &lt;script src=&quot;//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js&quot; async=&quot;async&quot;&gt;&lt;/script&gt;
    &lt;ins class=&quot;adsbygoogle&quot; style=&quot;display: block;&quot; data-ad-host=&quot;ca-host-pub-9691043933427338&quot; data-ad-client=&quot;ca-pub-6495523701848301&quot; data-ad-format=&quot;auto&quot;&gt;&lt;/ins&gt;
    &lt;script&gt;(adsbygoogle = window.adsbygoogle || []).push({});&lt;/script&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ Tabulate: 깔끔한 표 형식으로 데이터 출력하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Tabulate&lt;/b&gt;는 데이터를 Markdown, HTML, LaTeX 등 다양한 형식의 테이블로 변환해줍니다. 보고서 작성이나 콘솔 출력에 유용합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from tabulate import tabulate

data = [
    [&quot;이름&quot;, &quot;나이&quot;, &quot;직업&quot;],
    [&quot;Alice&quot;, 30, &quot;데이터 분석가&quot;],
    [&quot;Bob&quot;, 25, &quot;개발자&quot;]
]

# Markdown 형식으로 출력
print(tabulate(data, headers=&quot;firstrow&quot;, tablefmt=&quot;github&quot;))
&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;CLI 보고서 생성:&lt;/b&gt; 커맨드라인 도구에서 깔끔한 데이터 출력&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Markdown 문서:&lt;/b&gt; GitHub README에 테이블 추가할 때 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4️⃣ PyPDF2: PDF 편집 마스터&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PyPDF2&lt;/b&gt;는 PDF 파일을 병합, 분할, 암호화/해제, 워터마크 추가 등 다양한 편집 기능을 제공합니다.&lt;/p&gt;
&lt;pre class=&quot;gradle&quot;&gt;&lt;code&gt;from PyPDF2 import PdfMerger

# PDF 병합
merger = PdfMerger()
merger.append('file1.pdf')
merger.append('file2.pdf')
merger.write('merged.pdf')
merger.close()
&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; 여러 개의 보고서를 하나의 PDF로 결합&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 문서 관리:&lt;/b&gt; PDF 파일에 암호 설정 및 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5️⃣ Yattag: HTML/XML로 깔끔한 보고서 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Yattag&lt;/b&gt;는 간결한 Python 코드로 HTML/XML 문서를 생성할 수 있는 라이브러리입니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;from yattag import Doc

# HTML 문서 생성
doc, tag, text = Doc().tagtext()
with tag('html'):
    with tag('body'):
        with tag('h1'):
            text('Python 보고서')
        with tag('p'):
            text('이것은 Yattag로 생성한 문서입니다.')

# 결과 출력
print(doc.getvalue())
&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; HTML 기반 데이터 보고서 자동 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;XML 데이터 관리:&lt;/b&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;6️⃣ PrettyTable: 콘솔에서 아름다운 테이블 출력&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PrettyTable&lt;/b&gt;은 텍스트 기반 환경에서도 읽기 쉬운 표를 출력할 수 있게 도와줍니다.&lt;/p&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;from prettytable import PrettyTable

# 테이블 생성
table = PrettyTable()
table.field_names = [&quot;이름&quot;, &quot;나이&quot;, &quot;직업&quot;]
table.add_rows([
    [&quot;Alice&quot;, 30, &quot;데이터 분석가&quot;],
    [&quot;Bob&quot;, 25, &quot;개발자&quot;]
])

# 테이블 출력
print(table)
&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; 자동화된 테스트 결과 테이블로 표시&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7️⃣ MPLD3 + Matplotlib: 대화형 데이터 시각화&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;MPLD3&lt;/b&gt;는 Matplotlib으로 만든 시각화를 웹에서 대화형으로 사용할 수 있게 해줍니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;import matplotlib.pyplot as plt
import mpld3

# 그래프 그리기
fig, ax = plt.subplots()
ax.plot([1, 2, 3, 4], [10, 20, 25, 30], marker='o')
ax.set_title(&quot;대화형 시각화 예제&quot;)

# 대화형 시각화 표시
mpld3.show()
&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; 마우스 오버 시 툴팁 제공하는 그래프 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8️⃣ WeasyPrint: HTML/CSS로 PDF 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;WeasyPrint&lt;/b&gt;는 HTML과 CSS를 기반으로 고품질 PDF를 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;import weasyprint

# HTML 파일을 PDF로 변환
weasyprint.HTML('report.html').write_pdf('output.pdf')
&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; 회사 로고와 스타일이 포함된 PDF 보고서 생성&lt;/li&gt;
&lt;li&gt;&lt;b&gt;인보이스 자동화:&lt;/b&gt; 웹 기반 인보이스를 PDF로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9️⃣ PyFPDF2: 빠르고 간단한 PDF 생성기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PyFPDF2&lt;/b&gt;는 간단한 코드로 PDF 문서를 생성할 수 있는 라이브러리입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;from fpdf import FPDF

# PDF 생성
pdf = FPDF()
pdf.add_page()
pdf.set_font(&quot;Arial&quot;, size=12)
pdf.cell(200, 10, txt=&quot;Python PDF 리포트&quot;, ln=True, align='C')

# PDF 저장
pdf.output(&quot;report.pdf&quot;)
&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; 텍스트와 이미지가 포함된 공식 문서 제작&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;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 9개의 Python 라이브러리를 활용하면 데이터 분석 결과를 더 쉽고, 빠르게, 그리고 아름답게 시각화할 수 있습니다. 여러분의 데이터가 더 빛날 수 있도록 이 도구들을 적극 활용해 보세요!  &lt;/p&gt;</description>
      <category>Python/라이브러리</category>
      <category>camelot</category>
      <category>FPDF</category>
      <category>mpld3</category>
      <category>prettytable</category>
      <category>pyfpdf2</category>
      <category>pypdf2</category>
      <category>sweetviz</category>
      <category>tabulate</category>
      <category>weasyprint</category>
      <category>yattag</category>
      <author>인텔로퍼</author>
      <guid isPermaLink="true">https://intelloper.tistory.com/189</guid>
      <comments>https://intelloper.tistory.com/entry/python-libraries-report#entry189comment</comments>
      <pubDate>Fri, 7 Feb 2025 11:19:51 +0900</pubDate>
    </item>
  </channel>
</rss>