<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Hack your life</title>
    <link>https://greatjoy.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 15 Apr 2026 03:57:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Taewon Heo</managingEditor>
    <item>
      <title>SIP 트렁킹이란?</title>
      <link>https://greatjoy.tistory.com/98</link>
      <description>&lt;h2 data-end=&quot;55&quot; data-start=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. SIP 트렁킹이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;245&quot; data-start=&quot;56&quot; data-ke-size=&quot;size16&quot;&gt;**SIP 트렁킹(SIP Trunking)**은 &lt;b&gt;PSTN(공중 교환 전화망)과 VoIP 네트워크를 연결하는 기술&lt;/b&gt;입니다. SIP(Session Initiation Protocol)를 사용하여 음성, 영상 및 메시징 데이터를 &lt;b&gt;IP 네트워크(VoIP)에서 PSTN으로, 또는 PSTN에서 IP 네트워크로 전송&lt;/b&gt;할 수 있도록 합니다.&lt;/p&gt;
&lt;p data-end=&quot;384&quot; data-start=&quot;247&quot; data-ke-size=&quot;size16&quot;&gt;과거에는 기업이 전화 통신을 위해 &lt;b&gt;PRI(Primary Rate Interface) 또는 아날로그 전화 회선&lt;/b&gt;을 사용했지만, SIP 트렁킹을 활용하면 &lt;b&gt;인터넷을 통해 음성 통화를 가능하게 하며, 기존 PSTN을 대체하는 역할&lt;/b&gt;을 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;389&quot; data-start=&quot;386&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;415&quot; data-start=&quot;391&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. SIP 트렁킹의 동작 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;518&quot; data-start=&quot;416&quot; data-ke-size=&quot;size16&quot;&gt;SIP 트렁킹은 &lt;b&gt;IP-PBX(인터넷 프로토콜 기반 교환기) 또는 VoIP 시스템과 통신사의 SIP 서버 간의 연결을 제공&lt;/b&gt;하여 음성, 영상, 메시징을 인터넷을 통해 송수신합니다.&lt;/p&gt;
&lt;p data-end=&quot;541&quot; data-start=&quot;520&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;SIP 트렁킹의 기본 흐름&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;786&quot; data-start=&quot;542&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;587&quot; data-start=&quot;542&quot;&gt;사용자가 VoIP 전화기(IP Phone) 또는 소프트폰에서 전화를 겁니다.&lt;/li&gt;
&lt;li data-end=&quot;652&quot; data-start=&quot;588&quot;&gt;IP-PBX 또는 VoIP 서버가 SIP 트렁크를 통해 SIP 제공업체(VoIP 통신사)로 통화를 전달합니다.&lt;/li&gt;
&lt;li data-end=&quot;713&quot; data-start=&quot;653&quot;&gt;SIP 제공업체는 필요한 경우 &lt;b&gt;PSTN으로 변환하여 일반 전화(유선 또는 휴대폰)로 연결&lt;/b&gt;합니다.&lt;/li&gt;
&lt;li data-end=&quot;786&quot; data-start=&quot;714&quot;&gt;반대로, 일반 전화(PSTN)에서 VoIP 사용자에게 전화가 올 경우, SIP 트렁킹을 통해 VoIP 네트워크로 전달됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;791&quot; data-start=&quot;788&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;816&quot; data-start=&quot;793&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. SIP 트렁킹 구성 요소&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;880&quot; data-start=&quot;817&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) IP-PBX (Internet Protocol - Private Branch Exchange)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1014&quot; data-start=&quot;884&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;909&quot; data-start=&quot;884&quot;&gt;기업 내에서 사용되는 VoIP 전화 시스템&lt;/li&gt;
&lt;li data-end=&quot;945&quot; data-start=&quot;913&quot;&gt;SIP 트렁킹을 사용하여 외부 통화(PSTN)와 연결됨&lt;/li&gt;
&lt;li data-end=&quot;1014&quot; data-start=&quot;949&quot;&gt;예: Asterisk, FreePBX, 3CX, Cisco Unified Communications Manager&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1045&quot; data-start=&quot;1016&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) SIP 트렁크(SIP Trunk)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1126&quot; data-start=&quot;1049&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1086&quot; data-start=&quot;1049&quot;&gt;IP-PBX와 SIP 제공업체 간의 연결을 담당하는 가상 트렁크&lt;/li&gt;
&lt;li data-end=&quot;1126&quot; data-start=&quot;1090&quot;&gt;VoIP 및 PSTN 네트워크 간 음성 및 데이터 송수신 역할&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1158&quot; data-start=&quot;1128&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) SIP 제공업체 (VoIP 사업자)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1301&quot; data-start=&quot;1162&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1185&quot; data-start=&quot;1162&quot;&gt;SIP 트렁킹을 제공하는 서비스 사업자&lt;/li&gt;
&lt;li data-end=&quot;1233&quot; data-start=&quot;1189&quot;&gt;일반 PSTN과 연결하여 VoIP 사용자가 일반 전화번호와 통화 가능하게 함&lt;/li&gt;
&lt;li data-end=&quot;1301&quot; data-start=&quot;1237&quot;&gt;예: &lt;b&gt;Twilio, Bandwidth, Plivo, Telnyx, Vonage, AT&amp;amp;T, Verizon&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1354&quot; data-start=&quot;1303&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) PSTN (Public Switched Telephone Network)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1415&quot; data-start=&quot;1358&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1379&quot; data-start=&quot;1358&quot;&gt;전통적인 유선 및 이동통신 네트워크&lt;/li&gt;
&lt;li data-end=&quot;1415&quot; data-start=&quot;1383&quot;&gt;SIP 제공업체를 통해 VoIP에서 PSTN으로 변환됨&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1420&quot; data-start=&quot;1417&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1443&quot; data-start=&quot;1422&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. SIP 트렁킹의 장점&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;1462&quot; data-start=&quot;1444&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;1) 비용 절감&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1569&quot; data-start=&quot;1466&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1528&quot; data-start=&quot;1466&quot;&gt;기존의 &lt;b&gt;ISDN PRI(Primary Rate Interface) 회선이나 아날로그 회선보다 저렴&lt;/b&gt;함.&lt;/li&gt;
&lt;li data-end=&quot;1569&quot; data-start=&quot;1532&quot;&gt;인터넷을 통해 통화하므로 국제전화 및 장거리 통화 비용을 절감.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1592&quot; data-start=&quot;1571&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;2) 유연성과 확장성&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1677&quot; data-start=&quot;1596&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1650&quot; data-start=&quot;1596&quot;&gt;물리적인 회선이 필요 없고, &lt;b&gt;필요한 만큼 SIP 채널을 유동적으로 추가 및 삭제 가능&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;1677&quot; data-start=&quot;1654&quot;&gt;기업이 성장함에 따라 쉽게 확장 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1700&quot; data-start=&quot;1679&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;3) 다중 위치 연결&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1779&quot; data-start=&quot;1704&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1744&quot; data-start=&quot;1704&quot;&gt;여러 지사 및 원격 근무자들을 단일 SIP 트렁킹을 통해 연결 가능.&lt;/li&gt;
&lt;li data-end=&quot;1779&quot; data-start=&quot;1748&quot;&gt;기존 PSTN보다 효율적인 통신 네트워크 구축 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1808&quot; data-start=&quot;1781&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;4) 음성, 영상, 메시징 지원&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1884&quot; data-start=&quot;1812&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1884&quot; data-start=&quot;1812&quot;&gt;&lt;b&gt;음성 통화뿐만 아니라 영상 통화(Video Calling), SMS, 팩스(FoIP: Fax over IP)까지 지원&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1914&quot; data-start=&quot;1886&quot; data-ke-size=&quot;size23&quot;&gt;✅ &lt;b&gt;5) 향상된 복원력 및 장애 대응&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2022&quot; data-start=&quot;1918&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1969&quot; data-start=&quot;1918&quot;&gt;클라우드 기반 SIP 트렁킹 서비스는 &lt;b&gt;백업 및 장애 조치를 쉽게 설정할 수 있음&lt;/b&gt;.&lt;/li&gt;
&lt;li data-end=&quot;2022&quot; data-start=&quot;1973&quot;&gt;한 지역의 전화 시스템이 다운되더라도 다른 지점 또는 클라우드 서비스로 라우팅 가능.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2027&quot; data-start=&quot;2024&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2069&quot; data-start=&quot;2029&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. SIP 트렁킹 vs 기존 전화 시스템(ISDN PRI)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교 항목SIP 트렁킹ISDN PRI (전통 전화 회선)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2526&quot; data-start=&quot;2070&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2526&quot; data-start=&quot;2183&quot;&gt;
&lt;tr data-end=&quot;2227&quot; data-start=&quot;2183&quot;&gt;
&lt;td&gt;&lt;b&gt;네트워크 유형&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;인터넷(IP 기반)&lt;/td&gt;
&lt;td&gt;PSTN (TDM 기반)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2279&quot; data-start=&quot;2228&quot;&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 data-end=&quot;2338&quot; data-start=&quot;2280&quot;&gt;
&lt;td&gt;&lt;b&gt;확장성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;필요에 따라 유동적으로 증가 가능&lt;/td&gt;
&lt;td&gt;23개 또는 30개 채널 단위로 추가 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2382&quot; data-start=&quot;2339&quot;&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 data-end=&quot;2419&quot; data-start=&quot;2383&quot;&gt;
&lt;td&gt;&lt;b&gt;국제전화 비용&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;저렴함 (VoIP 기반)&lt;/td&gt;
&lt;td&gt;비쌈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2469&quot; data-start=&quot;2420&quot;&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 data-end=&quot;2526&quot; data-start=&quot;2470&quot;&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;p data-end=&quot;2590&quot; data-start=&quot;2528&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;결론:&lt;/b&gt; SIP 트렁킹은 기존 전화 시스템(ISDN PRI)보다 유연하고 저렴하며, 확장성이 뛰어남.&lt;/p&gt;
&lt;hr data-end=&quot;2595&quot; data-start=&quot;2592&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2625&quot; data-start=&quot;2597&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. SIP 트렁킹을 활용한 실제 사례&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-end=&quot;2655&quot; data-start=&quot;2626&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;① 기업 내 VoIP 전화 시스템 구축&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2810&quot; data-start=&quot;2659&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2720&quot; data-start=&quot;2659&quot;&gt;대기업 및 중소기업이 &lt;b&gt;사내 전화망(IP-PBX)을 구축&lt;/b&gt;하여 모든 통화를 SIP 트렁킹을 통해 처리.&lt;/li&gt;
&lt;li data-end=&quot;2810&quot; data-start=&quot;2724&quot;&gt;예) &lt;b&gt;기업용 VoIP 서비스(Zoom Phone, Microsoft Teams Direct Routing, Cisco Webex Calling)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2831&quot; data-start=&quot;2812&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;2936&quot; data-start=&quot;2835&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2886&quot; data-start=&quot;2835&quot;&gt;SIP 트렁킹을 활용하여 고객지원센터에서 &lt;b&gt;수천 개의 동시 통화를 처리&lt;/b&gt;할 수 있음.&lt;/li&gt;
&lt;li data-end=&quot;2936&quot; data-start=&quot;2890&quot;&gt;콜센터는 SIP 트렁킹을 통해 &lt;b&gt;글로벌 고객과 저렴한 비용으로 연결 가능&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2963&quot; data-start=&quot;2938&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;3078&quot; data-start=&quot;2967&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3024&quot; data-start=&quot;2967&quot;&gt;다국적 기업이 SIP 트렁킹을 통해 &lt;b&gt;여러 국가에서 로컬 전화번호를 제공&lt;/b&gt;하고, 본사로 라우팅.&lt;/li&gt;
&lt;li data-end=&quot;3078&quot; data-start=&quot;3028&quot;&gt;원격 근무자가 인터넷을 통해 &lt;b&gt;회사의 SIP 트렁킹을 활용하여 외부와 통화 가능&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;3103&quot; data-start=&quot;3080&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;④ PSTN과 VoIP 연동&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3241&quot; data-start=&quot;3107&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3171&quot; data-start=&quot;3107&quot;&gt;기존 PSTN(일반 전화망)과 VoIP(인터넷 기반 통신) 간의 연결을 위해 SIP 트렁킹이 필수적으로 사용됨.&lt;/li&gt;
&lt;li data-end=&quot;3241&quot; data-start=&quot;3175&quot;&gt;예) &lt;b&gt;Google Voice, Twilio Voice API, WhatsApp Business Call 지원&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>통신</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/98</guid>
      <comments>https://greatjoy.tistory.com/98#entry98comment</comments>
      <pubDate>Thu, 27 Feb 2025 09:21:50 +0900</pubDate>
    </item>
    <item>
      <title>SIP 호 처리란?</title>
      <link>https://greatjoy.tistory.com/97</link>
      <description>&lt;h3 data-end=&quot;14&quot; data-start=&quot;0&quot; data-ke-size=&quot;size23&quot;&gt;SIP 호 처리란?&lt;/h3&gt;
&lt;p data-end=&quot;230&quot; data-start=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;**SIP(Session Initiation Protocol) 호 처리(Call Processing)**는 인터넷 전화(VoIP) 및 멀티미디어 세션을 설정, 유지 및 종료하는 과정에서 SIP 프로토콜이 수행하는 일련의 작업을 의미합니다. SIP는 음성, 영상, 메시징 등 다양한 실시간 커뮤니케이션을 지원하는 표준 프로토콜로, 주로 IP 네트워크 기반의 통신 시스템에서 사용됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;235&quot; data-start=&quot;232&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;258&quot; data-start=&quot;237&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. SIP 프로토콜 개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;384&quot; data-start=&quot;259&quot; data-ke-size=&quot;size16&quot;&gt;SIP는 인터넷 엔지니어링 태스크 포스(IETF)에서 정의한 응용 계층 프로토콜이며, RFC 3261을 기반으로 합니다. 주요 역할은 세션을 &lt;b&gt;설정(Invite), 수정(Reinvite), 종료(Bye)&lt;/b&gt; 하는 것입니다.&lt;/p&gt;
&lt;p data-end=&quot;420&quot; data-start=&quot;386&quot; data-ke-size=&quot;size16&quot;&gt;SIP는 아래와 같은 &lt;b&gt;네 가지 주요 기능&lt;/b&gt;을 수행합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;629&quot; data-start=&quot;421&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;474&quot; data-start=&quot;421&quot;&gt;&lt;b&gt;사용자 위치(User Location):&lt;/b&gt; 네트워크 내에서 상대방의 현재 위치를 파악&lt;/li&gt;
&lt;li data-end=&quot;529&quot; data-start=&quot;475&quot;&gt;&lt;b&gt;사용자 가용성(User Availability):&lt;/b&gt; 상대방이 통화 가능한 상태인지 확인&lt;/li&gt;
&lt;li data-end=&quot;584&quot; data-start=&quot;530&quot;&gt;&lt;b&gt;호 설정(Call Setup):&lt;/b&gt; 세션을 설정하고 미디어(음성, 영상 등) 교환을 준비&lt;/li&gt;
&lt;li data-end=&quot;629&quot; data-start=&quot;585&quot;&gt;&lt;b&gt;호 해제(Call Termination):&lt;/b&gt; 세션 종료 및 자원 해제&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;634&quot; data-start=&quot;631&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;674&quot; data-start=&quot;636&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. SIP 호 처리(Call Processing) 과정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;716&quot; data-start=&quot;675&quot; data-ke-size=&quot;size16&quot;&gt;SIP 기반의 호 처리 과정은 일반적으로 다음과 같은 단계로 이루어집니다.&lt;/p&gt;
&lt;h3 data-end=&quot;756&quot; data-start=&quot;718&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;① 세션 설정(Session Establishment)&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1263&quot; data-start=&quot;757&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;917&quot; data-start=&quot;757&quot;&gt;&lt;b&gt;Invite (초대)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;917&quot; data-start=&quot;779&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;861&quot; data-start=&quot;779&quot;&gt;발신자(UAC, User Agent Client)가 수신자(UAS, User Agent Server)에게 SIP INVITE 메시지를 보냅니다.&lt;/li&gt;
&lt;li data-end=&quot;917&quot; data-start=&quot;865&quot;&gt;메시지에는 발신자의 정보, 수신자의 정보, 세션 매체 정보(SDP 포함) 등이 포함됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1011&quot; data-start=&quot;919&quot;&gt;&lt;b&gt;100 Trying&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1011&quot; data-start=&quot;940&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1011&quot; data-start=&quot;940&quot;&gt;중간 프록시 서버 또는 수신자가 요청을 수락하기 전에 &quot;100 Trying&quot; 메시지를 반환하여 요청을 처리 중임을 알립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;1013&quot;&gt;&lt;b&gt;180 Ringing&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1099&quot; data-start=&quot;1035&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;1035&quot;&gt;수신 단말이 호출을 수락할 준비가 되면 &quot;180 Ringing&quot; 메시지를 보내어 호출이 울리고 있음을 알립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1202&quot; data-start=&quot;1101&quot;&gt;&lt;b&gt;200 OK (호 수락)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1202&quot; data-start=&quot;1125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1160&quot; data-start=&quot;1125&quot;&gt;수신자가 통화를 수락하면 &quot;200 OK&quot; 메시지를 보냅니다.&lt;/li&gt;
&lt;li data-end=&quot;1202&quot; data-start=&quot;1164&quot;&gt;이 메시지에는 수신자가 사용할 미디어 정보(SDP)가 포함됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1263&quot; data-start=&quot;1204&quot;&gt;&lt;b&gt;ACK (확인)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1263&quot; data-start=&quot;1223&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1263&quot; data-start=&quot;1223&quot;&gt;발신자가 &quot;ACK&quot; 메시지를 보내 응답을 확인하고 통화가 시작됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1268&quot; data-start=&quot;1265&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1303&quot; data-start=&quot;1270&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;② 세션 진행(Session Handling)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1486&quot; data-start=&quot;1304&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1397&quot; data-start=&quot;1304&quot;&gt;호가 설정된 후, RTP(Real-time Transport Protocol) 또는 SRTP(Secure RTP)를 통해 실시간 음성 및 영상 데이터가 전송됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1486&quot; data-start=&quot;1398&quot;&gt;세션 중에는 SIP 프로토콜을 통해 세션을 변경할 수도 있습니다. (예: 보류(Hold), 트랜스퍼(Transfer), 컨퍼런스(Conference) 등)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1491&quot; data-start=&quot;1488&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1529&quot; data-start=&quot;1493&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;③ 세션 종료(Session Termination)&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1711&quot; data-start=&quot;1530&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1623&quot; data-start=&quot;1530&quot;&gt;&lt;b&gt;BYE (호 종료 요청)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1623&quot; data-start=&quot;1554&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1587&quot; data-start=&quot;1554&quot;&gt;세션을 종료하려는 사용자가 &quot;BYE&quot; 메시지를 보냅니다.&lt;/li&gt;
&lt;li data-end=&quot;1623&quot; data-start=&quot;1591&quot;&gt;발신자 또는 수신자 중 어느 쪽이든 보낼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li data-end=&quot;1711&quot; data-start=&quot;1625&quot;&gt;&lt;b&gt;200 OK (확인)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1711&quot; data-start=&quot;1647&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1685&quot; data-start=&quot;1647&quot;&gt;상대방이 &quot;200 OK&quot; 메시지를 보내어 세션 종료를 확인합니다.&lt;/li&gt;
&lt;li data-end=&quot;1711&quot; data-start=&quot;1689&quot;&gt;미디어 세션이 해제되고, 통화 종료.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1716&quot; data-start=&quot;1713&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1745&quot; data-start=&quot;1718&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. SIP 호 처리 관련 추가 기능&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;1779&quot; data-start=&quot;1746&quot; data-ke-size=&quot;size16&quot;&gt;SIP 호 처리 과정에서 다양한 기능이 추가될 수 있습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1815&quot; data-start=&quot;1781&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1) Call Forwarding (착신 전환)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1890&quot; data-start=&quot;1819&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1850&quot; data-start=&quot;1819&quot;&gt;특정 조건에서 다른 번호로 통화를 자동 전환하는 기능&lt;/li&gt;
&lt;li data-end=&quot;1890&quot; data-start=&quot;1854&quot;&gt;SIP 프록시 서버가 INVITE 메시지를 리디렉션할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;1920&quot; data-start=&quot;1892&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2) Call Hold (통화 보류)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1993&quot; data-start=&quot;1924&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1971&quot; data-start=&quot;1924&quot;&gt;SIP의 &quot;Re-INVITE&quot; 메시지를 통해 RTP 스트림을 일시 중지할 수 있음&lt;/li&gt;
&lt;li data-end=&quot;1993&quot; data-start=&quot;1975&quot;&gt;통화 중 다른 작업 수행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2026&quot; data-start=&quot;1995&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3) Call Transfer (호 전환)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2120&quot; data-start=&quot;2030&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2073&quot; data-start=&quot;2030&quot;&gt;&lt;b&gt;Blind Transfer:&lt;/b&gt; 현재 통화를 다른 사용자에게 즉시 넘김&lt;/li&gt;
&lt;li data-end=&quot;2120&quot; data-start=&quot;2077&quot;&gt;&lt;b&gt;Attended Transfer:&lt;/b&gt; 통화 전 상대방과 연결된 후 넘김&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2153&quot; data-start=&quot;2122&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4) Call Waiting (통화 대기)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2205&quot; data-start=&quot;2157&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2205&quot; data-start=&quot;2157&quot;&gt;다른 통화를 진행 중일 때 새로운 통화를 받을 수 있도록 SIP가 여러 세션을 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;2245&quot; data-start=&quot;2207&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5) SIP Forking (다중 종단 장치 벨 울림)&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2309&quot; data-start=&quot;2249&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2309&quot; data-start=&quot;2249&quot;&gt;하나의 SIP 계정으로 여러 장치(예: 스마트폰, 데스크폰, 소프트폰 등)가 동시에 호출을 받을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2314&quot; data-start=&quot;2311&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2347&quot; data-start=&quot;2316&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;4. SIP 호 처리를 위한 주요 구성 요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;2382&quot; data-start=&quot;2348&quot; data-ke-size=&quot;size16&quot;&gt;SIP 호 처리는 다양한 네트워크 요소가 협력하여 수행됩니다.&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-end=&quot;2740&quot; data-start=&quot;2384&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2740&quot; data-start=&quot;2462&quot;&gt;
&lt;tr data-end=&quot;2528&quot; data-start=&quot;2462&quot;&gt;
&lt;td&gt;&lt;b&gt;User Agent (UA)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SIP 클라이언트 역할을 수행하는 단말기 (예: 소프트폰, IP 전화기)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2581&quot; data-start=&quot;2529&quot;&gt;
&lt;td&gt;&lt;b&gt;SIP Proxy Server&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;SIP 메시지를 라우팅하여 최적의 경로로 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2635&quot; data-start=&quot;2582&quot;&gt;
&lt;td&gt;&lt;b&gt;SIP Registrar Server&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;사용자 위치를 등록하고 위치 정보를 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2684&quot; data-start=&quot;2636&quot;&gt;
&lt;td&gt;&lt;b&gt;SIP Redirect Server&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;통화 요청을 다른 위치로 리디렉션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2740&quot; data-start=&quot;2685&quot;&gt;
&lt;td&gt;&lt;b&gt;SIP Gateway&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;PSTN(일반전화망)과 IP 네트워크 간의 SIP 변환 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-end=&quot;2745&quot; data-start=&quot;2742&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2775&quot; data-start=&quot;2747&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5. SIP 호 처리의 실제 적용 사례&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2989&quot; data-start=&quot;2776&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2823&quot; data-start=&quot;2776&quot;&gt;&lt;b&gt;VoIP 전화 서비스&lt;/b&gt; (예: Zoom, Skype, Cisco Webex)&lt;/li&gt;
&lt;li data-end=&quot;2852&quot; data-start=&quot;2824&quot;&gt;&lt;b&gt;IP-PBX 시스템&lt;/b&gt; (사내 전화망 관리)&lt;/li&gt;
&lt;li data-end=&quot;2910&quot; data-start=&quot;2853&quot;&gt;&lt;b&gt;통신 사업자(통신사) IMS 네트워크&lt;/b&gt; (예: KT, SKT, LG U+의 VoLTE 서비스)&lt;/li&gt;
&lt;li data-end=&quot;2948&quot; data-start=&quot;2911&quot;&gt;&lt;b&gt;인터넷 기반 고객 지원 센터(Contact Center)&lt;/b&gt;&lt;/li&gt;
&lt;li data-end=&quot;2989&quot; data-start=&quot;2949&quot;&gt;&lt;b&gt;기업용 UC(Unified Communications) 솔루션&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2994&quot; data-start=&quot;2991&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3008&quot; data-start=&quot;2996&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;6. 결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;3141&quot; data-start=&quot;3009&quot; data-ke-size=&quot;size16&quot;&gt;SIP 호 처리는 VoIP 및 멀티미디어 통신의 핵심 기능으로, 세션 설정, 유지, 종료를 포함하여 다양한 부가 기능을 제공합니다. 네트워크 인프라에서 SIP 프록시, 게이트웨이, PBX 등이 협력하여 안정적인 통화를 가능하게 합니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3221&quot; data-start=&quot;3143&quot; data-ke-size=&quot;size16&quot;&gt;즉, &lt;b&gt;SIP 호 처리는 인터넷 전화 및 IP 기반 통신 시스템의 &quot;전화 걸고 받는 과정&quot;을 수행하는 핵심 기술&lt;/b&gt;이라고 할 수 있습니다.&lt;/p&gt;</description>
      <category>통신</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/97</guid>
      <comments>https://greatjoy.tistory.com/97#entry97comment</comments>
      <pubDate>Thu, 27 Feb 2025 09:09:35 +0900</pubDate>
    </item>
    <item>
      <title>CentOS에서 Postgresql 설치하기</title>
      <link>https://greatjoy.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;CentOS에서 PostgreSQL을 yum을 사용하여 설치하는 방법은 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;먼저, root 사용자로 로그인합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL 패키지를 설치하기 위해 EPEL 저장소를 활성화합니다. 다음 명령을 실행합니다:&lt;span style=&quot;text-align: start;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690942900025&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo yum install epel-release&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL 패키지를 설치합니다. 다음 명령을 실행합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo yum install postgresql-server&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL 데이터베이스 클러스터를 초기화합니다. 다음 명령을 실행합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo postgresql-setup initdb&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;PostgreSQL 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다. 다음 명령을 실행합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690942937781&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo systemctl start postgresql
sudo systemctl enable postgresql&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL 서버에 액세스하기 위해 PostgreSQL 사용자 계정의 암호를 설정합니다. 다음 명령을 실행합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;sudo passwd postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL 사용자로 전환합니다. 다음 명령을 실행합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;su - postgres&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PostgreSQL 콘솔에 접속합니다. 다음 명령을 실행합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;csharp&quot; style=&quot;color: #d4d4d4; text-align: start;&quot; data-ke-language=&quot;csharp&quot;&gt;&lt;code&gt;psql&lt;/code&gt;&lt;/pre&gt;</description>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/96</guid>
      <comments>https://greatjoy.tistory.com/96#entry96comment</comments>
      <pubDate>Wed, 2 Aug 2023 11:21:19 +0900</pubDate>
    </item>
    <item>
      <title>C#으로 윈도우 서비스 개발하고 디버깅하기</title>
      <link>https://greatjoy.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Program.cs에서 프로세스의 진입점을 분기한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689987729357&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;internal static class Program
    {
        /// &amp;lt;summary&amp;gt;
        /// 해당 애플리케이션의 주 진입점입니다.
        /// &amp;lt;/summary&amp;gt;
        static void Main(string[] args)
        {
            if (Environment.UserInteractive)
            {
                Console.WriteLine(&quot;콘솔&quot;);

                Service1 service1 = new Service1();
                service1.TestStartupAndStop(args);
            }
            else
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[]
                {
                    new Service1()
                };
                ServiceBase.Run(ServicesToRun);
            }
        }
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Service1.cs (이름 다를 수 있음)에 디버깅용 함수를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1689987810373&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;internal void TestStartupAndStop(string[] args)
{
    Console.WriteLine($&quot;Service starting...&quot;);
    this.OnStart(args);
    Console.WriteLine($&quot;Service started. Press any key to stop.&quot;);
    Console.ReadKey();
    Console.WriteLine($&quot;Service stopping...&quot;);
    this.OnStop();
    Console.WriteLine($&quot;Service stopped. Closing in 5 seconds.&quot;);
    System.Threading.Thread.Sleep(5000);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 빌드 &amp;amp; 명령어로 서비스 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서비스 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) cmd를 관리자 권한으로 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) InstallUtil.exe가 위치한 경로로 이동 : cd C:\Windows\Microsoft.NET\Framework\v4.0.30319&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) cmd에서 서비스 Install : InstallUtil.exe C:\\VisualStudio프로젝트경로\Service(서비스명).exe&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;4. 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sc delete 서비스 명&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;추가로 서비스 명 설정 등 기본 프리셋은 ProjectInstaller.Designer.cs에서 아래와 같이 할 수있다.&lt;/p&gt;
&lt;pre id=&quot;code_1689988044885&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;private void InitializeComponent()
{
    this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
    // 
    // serviceProcessInstaller1
    // 
    this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
    this.serviceProcessInstaller1.Password = null;
    this.serviceProcessInstaller1.Username = null;
    this.serviceProcessInstaller1.AfterInstall += new System.Configuration.Install.InstallEventHandler(this.serviceProcessInstaller1_AfterInstall);
    // 
    // serviceInstaller1
    // 
    this.serviceInstaller1.Description = &quot;CNC Collector Installer&quot;;
    this.serviceInstaller1.DisplayName = &quot;WinSvr.CNC.Collector&quot;;
    this.serviceInstaller1.ServiceName = &quot;CNCCollector&quot;;
    // 
    // ProjectInstaller
    // 
    this.Installers.AddRange(new System.Configuration.Install.Installer[] {
    this.serviceProcessInstaller1,
    this.serviceInstaller1});

}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>코딩코딩</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/95</guid>
      <comments>https://greatjoy.tistory.com/95#entry95comment</comments>
      <pubDate>Sat, 22 Jul 2023 10:08:47 +0900</pubDate>
    </item>
    <item>
      <title>[Python] gunicorn 모듈로 flask로 개발한 api 서버 기동하기</title>
      <link>https://greatjoy.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Flask로 웹서버를 임시로 기동하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WARNING : This is a development server. Do not use it in a production deployment.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Use a production WSGI server instead.&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;개발환경과 같이 단 건의 요청을 처리하는데는 flask를 써도 상관없지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상용과 같이 high load 환경에서 flask는 분산처리가 제대로 되지 않아 요청을 처리하는데 실패하거나, 처리가 지연돼서 read timeout이 발생하기 쉽다.&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;이러한 문제를 해결하기 위해 nginx와 WSGI 서버를 사용하는 것이 정석이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우 API 서버라서 nginx를 사용하지 않고 WSGI 서버만 사용하고싶었다.&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;다른 출처에서는 gunicorn으로 flask의 app.py를 한번 더 감싸는 방법을 소개하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flask의 app.py를 gunicorn 모듈로 실행하는 방법도 있다.&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;gunicorn --workers=1 --threads=4 --bind 0:5000 --timeout=0 file_name:app&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;nohup 명령어를 이용해서 백그라운드로 실행할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/Python</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/93</guid>
      <comments>https://greatjoy.tistory.com/93#entry93comment</comments>
      <pubDate>Mon, 19 Sep 2022 18:50:07 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Unable to create process using~(Flask, Locust etc.)</title>
      <link>https://greatjoy.tistory.com/92</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Flask나 Locust와 같이 웹서버를 기동하는 경우 flask run 이나 locust 명령어 실행시 특정환경에서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fatal error in launcher: Unable to create process using &quot;실행경로&quot;와 같이 나오는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 python -m 이라는 명령어 (모듈로 인식)를 쓰면 정상적으로 동작한다.&lt;/p&gt;</description>
      <category>Computer Science/Python</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/92</guid>
      <comments>https://greatjoy.tistory.com/92#entry92comment</comments>
      <pubDate>Thu, 7 Apr 2022 20:29:46 +0900</pubDate>
    </item>
    <item>
      <title>[Python] DLL load failed while importing win32api 에러 해결(in conda env)</title>
      <link>https://greatjoy.tistory.com/91</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pip install pywin32를 설치하는 방법으로 해결이 안될때,&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;pywin32 에러.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGqm5/btryF77MSq9/H5b4trc16Yt6zadUYNlODk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGqm5/btryF77MSq9/H5b4trc16Yt6zadUYNlODk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGqm5/btryF77MSq9/H5b4trc16Yt6zadUYNlODk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGqm5%2FbtryF77MSq9%2FH5b4trc16Yt6zadUYNlODk%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;906&quot; height=&quot;198&quot; data-filename=&quot;pywin32 에러.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conda를 사용하는 경우 conda로 설치하면 해결이 될 수 있다.&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;conda install -c anaconda pywin32&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 설치하면 끝!&lt;/p&gt;</description>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/91</guid>
      <comments>https://greatjoy.tistory.com/91#entry91comment</comments>
      <pubDate>Thu, 7 Apr 2022 19:27:42 +0900</pubDate>
    </item>
    <item>
      <title>[Python] Trusted host로 pip 설치 &amp;amp; conda ssl 해제</title>
      <link>https://greatjoy.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;pip로 설치할때 네트워크에 따라 SSL: CERTIFICATE_VERIFY_FAILED가 발생하는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ssl failed.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl2bal/btryIrdqmNL/KMDPpTK5Nt4h2dLfdTKqi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl2bal/btryIrdqmNL/KMDPpTK5Nt4h2dLfdTKqi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl2bal/btryIrdqmNL/KMDPpTK5Nt4h2dLfdTKqi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl2bal%2FbtryIrdqmNL%2FKMDPpTK5Nt4h2dLfdTKqi0%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;963&quot; height=&quot;167&quot; data-filename=&quot;ssl failed.png&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 trusted host임을 명시해야되는데&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;pip --trusted-host pypi.org --trusted-host files.pythonhosted.org install 패키지명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과 같이 입력하면 설치가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;conda fail.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wgeth/btryG9YEmBx/LrkpxM70ismkvtsJgdXST0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wgeth/btryG9YEmBx/LrkpxM70ismkvtsJgdXST0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wgeth/btryG9YEmBx/LrkpxM70ismkvtsJgdXST0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwgeth%2FbtryG9YEmBx%2FLrkpxM70ismkvtsJgdXST0%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;950&quot; height=&quot;201&quot; data-filename=&quot;conda fail.png&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conda의 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conda&amp;nbsp;config&amp;nbsp;--set&amp;nbsp;ssl_verify&amp;nbsp;False&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와 같이 SSL 인증을 안하도록 바꾸고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;conda install -c anaconda 패키지명&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;</description>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/90</guid>
      <comments>https://greatjoy.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 7 Apr 2022 19:25:27 +0900</pubDate>
    </item>
    <item>
      <title>라즈베리파이 ubuntu</title>
      <link>https://greatjoy.tistory.com/89</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthContent&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6lh9l/btq2XjX7DJq/yf7mcDLVhEGINFiCrYiPdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6lh9l/btq2XjX7DJq/yf7mcDLVhEGINFiCrYiPdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6lh9l/btq2XjX7DJq/yf7mcDLVhEGINFiCrYiPdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6lh9l%2Fbtq2XjX7DJq%2Fyf7mcDLVhEGINFiCrYiPdk%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; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&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;약 2기가정도가 운영체제이고 남은 공간은 할당되지 않은 상태인데 그대로 라즈베리파이에 넣으면된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할당되지 않은 공간은 처음 부팅이 되면서 할당된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 login은 ubuntu/ubuntu로 하면된다.&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;p data-ke-size=&quot;size16&quot;&gt;우선 인터넷 연결을 위해 ip를 잡아준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 최상위 경로로 이동(cd .. 두번)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) sudo nano etc/netplan/50-cloud-init.yaml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;network: &lt;br /&gt;&amp;nbsp;&amp;nbsp;ethernets: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;enp0s3: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addresses:&amp;nbsp;[192.168.0.136/24] &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gateway4:&amp;nbsp;192.168.0.1 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nameservers: &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;addresses:&amp;nbsp;[8.8.8.8,8.8.4.4]&amp;nbsp;#네임서버&amp;nbsp;설정이&amp;nbsp;안되면&amp;nbsp;apt&amp;nbsp;upgrade가&amp;nbsp;안됨 &lt;br /&gt;&amp;nbsp;&amp;nbsp;version:&amp;nbsp;2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) sudo netplan apply : 설정 적용&lt;/p&gt;</description>
      <category>Computer Science</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/89</guid>
      <comments>https://greatjoy.tistory.com/89#entry89comment</comments>
      <pubDate>Tue, 20 Apr 2021 00:35:13 +0900</pubDate>
    </item>
    <item>
      <title>[sklearn] cython 코드 수정하기</title>
      <link>https://greatjoy.tistory.com/87</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;[sklearn]&amp;nbsp;cython&amp;nbsp;코드&amp;nbsp;수정하기&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;sklearn 패키지의 일부 알고리즘은 속도를 위해 c언어 기반의 python으로 작성되어있다.&lt;/p&gt;
&lt;p&gt;일반적으로 이 수준의 알고리즘을 변경할 일이 거의 없어서 그런지 site-package에 있는 코드는 이미 컴파일이 된 상태라서 수정이 불가능했다. &lt;span style=&quot;color: #333333;&quot;&gt;환경은 ubuntu이고 python은 3.8에서 테스트하였다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;수정을 하기 위해서는&lt;/p&gt;
&lt;p&gt;1. sklearn 의 깃 저장소에서 컴파일되지 않은 코드 _cd_fast.pyx 파일을 다운받는다.&lt;/p&gt;
&lt;p&gt;2. 컴파일된 파일과 같은 경로에 추가한다.&lt;/p&gt;
&lt;p&gt;3. &lt;span style=&quot;color: #333333;&quot;&gt;_cd_fast.pyx 를 입맛대로 바꿔서 다시 컴파일한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 의 과정을 자세히 설명하자면,&lt;/p&gt;
&lt;p&gt;우선, pyx 파일을 컴파일하기 위해 cython이 설치되어 있어야한다.&lt;/p&gt;
&lt;p&gt;그리고 setup.py 파일을 만들어 pyx 파일을 컴파일하는 코드를 추가해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1598524034117&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize(&quot;_cd_fast.pyx&quot;),
    include_dirs=[numpy.get_include()]
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;이 코드를 실행시키는 코드는 아래와 같으며, cython 문서를 참조하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1598524096201&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python setup.py build_ext --inplace&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코드 수정 과정에서 발생한 에러와 해결방법은 아래와 같다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;not allowed without gil error&lt;/h3&gt;
&lt;p&gt;cython에서는 gil (global interpreter lock) 이라는 cpu processing 방식이 존재하는데 코드 중 with nogil 이 있는곳에 코드를 임의로 수정하는 경우 아래와 같은 에러가 발생할 수 있다. 이 경우 with nogil의 코드블럭을 주석처리하면 에러가 사라진다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2020-08-27_190436.jpg&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;214&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cW8IWD/btqHsdcYwHm/niUpJ3ECJBHRNQydIzK0ck/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cW8IWD/btqHsdcYwHm/niUpJ3ECJBHRNQydIzK0ck/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cW8IWD/btqHsdcYwHm/niUpJ3ECJBHRNQydIzK0ck/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcW8IWD%2FbtqHsdcYwHm%2FniUpJ3ECJBHRNQydIzK0ck%2Fimg.jpg&quot; data-filename=&quot;2020-08-27_190436.jpg&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;214&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;gcc failed with exit status 1&lt;/h3&gt;
&lt;p&gt;컴파일 과정에서 꽤 자주 발생할 것 같은 에러이다. gcc가 설치 되어있다는 가정하에 아래와 같은 에러가 뜬다면 코드를 추가하여 해결할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1598523284634&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize(&quot;_cd_fast.pyx&quot;)
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;2020-08-27_191357.jpg&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;43&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BBDcy/btqHsbsCG6O/zYFBz1PbxHz52sChxRGAek/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BBDcy/btqHsbsCG6O/zYFBz1PbxHz52sChxRGAek/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BBDcy/btqHsbsCG6O/zYFBz1PbxHz52sChxRGAek/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBBDcy%2FbtqHsbsCG6O%2FzYFBz1PbxHz52sChxRGAek%2Fimg.jpg&quot; data-filename=&quot;2020-08-27_191357.jpg&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;43&quot; data-ke-mobilestyle=&quot;widthContent&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1598523314482&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy
from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize(&quot;_cd_fast.pyx&quot;),
    include_dirs=[numpy.get_include()]
)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;include_dirs=[numpy.get_include()]를 추가하면 에러를 해결할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/Python</category>
      <author>Taewon Heo</author>
      <guid isPermaLink="true">https://greatjoy.tistory.com/87</guid>
      <comments>https://greatjoy.tistory.com/87#entry87comment</comments>
      <pubDate>Thu, 27 Aug 2020 19:29:02 +0900</pubDate>
    </item>
  </channel>
</rss>