<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>기술 블로그 &#8211; (주)쿠빌 | Coovil Inc.</title>
	<atom:link href="https://www.coovil.net/category/tech-blog/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.coovil.net</link>
	<description>모바일 앱, 프론트엔드, 백엔드, 풀스택 SW 기술 회사</description>
	<lastBuildDate>Mon, 18 Nov 2024 08:34:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.2</generator>

<image>
	<url>https://www.coovil.net/wp-content/uploads/2024/01/cropped-cv_logo_11-32x32.png</url>
	<title>기술 블로그 &#8211; (주)쿠빌 | Coovil Inc.</title>
	<link>https://www.coovil.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>FastAPI와 완전 비동기식 구현</title>
		<link>https://www.coovil.net/fastapi-backend-full-async/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Thu, 14 Nov 2024 12:36:40 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">https://www.coovil.net/?p=3850</guid>

					<description><![CDATA[FastAPI와 비동기 방식의 백엔드 프레임워크의 장점 FastAPI는 비동기 방식으로 설계된 벡엔드 프레임워크로, 성능과 확장성 측면에서 뛰어난 장점이 있습니다. FastAPI의 비동기 처리는 Python의 asyncio 라이브러리를 기반으로 하여, 외부에서 데이터를 가져오거나 보내는 동안 기다려야 하므로 대기 시간이 많은 I/O 바운드 작업을 효율적으로 처리할 수 있도록 합니다. 이로 인해 백엔드 처리 속도가 빨라지고, 서버의 자원을 더 효율적으로 사용할 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3850" class="elementor elementor-3850">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.18.0 - 20-12-2023 */
.elementor-widget-image{text-align:center}.elementor-widget-image a{display:inline-block}.elementor-widget-image a img[src$=".svg"]{width:48px}.elementor-widget-image img{vertical-align:middle;display:inline-block}</style>												<img fetchpriority="high" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/11/cv_blog_header_16.jpg" class="attachment-full size-full wp-image-3852" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.18.0 - 20-12-2023 */
.elementor-heading-title{padding:0;margin:0;line-height:1}.elementor-widget-heading .elementor-heading-title[class*=elementor-size-]>a{color:inherit;font-size:inherit;line-height:inherit}.elementor-widget-heading .elementor-heading-title.elementor-size-small{font-size:15px}.elementor-widget-heading .elementor-heading-title.elementor-size-medium{font-size:19px}.elementor-widget-heading .elementor-heading-title.elementor-size-large{font-size:29px}.elementor-widget-heading .elementor-heading-title.elementor-size-xl{font-size:39px}.elementor-widget-heading .elementor-heading-title.elementor-size-xxl{font-size:59px}</style><h2 class="elementor-heading-title elementor-size-default">FastAPI와 비동기 방식의 백엔드 프레임워크의 장점</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			FastAPI는 비동기 방식으로 설계된 벡엔드 프레임워크로, 성능과 확장성 측면에서 뛰어난 장점이 있습니다. FastAPI의 비동기 처리는 Python의 asyncio 라이브러리를 기반으로 하여, 외부에서 데이터를 가져오거나 보내는 동안 기다려야 하므로 대기 시간이 많은 I/O 바운드 작업을 효율적으로 처리할 수 있도록 합니다. 이로 인해 백엔드 처리 속도가 빨라지고, 서버의 자원을 더 효율적으로 사용할 수 있습니다. FastAPI를 이용한 비동기 방식의 벡엔드 구현에는 다음과 같은 장점이 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2a5552e elementor-widget elementor-widget-heading" data-id="2a5552e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">높은 성능 (High Performance)</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-480a494 elementor-widget elementor-widget-html" data-id="480a494" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			비동기 방식은 동기 방식보다 더 많은 요청을 동시에 처리할 수 있기 때문에 서버의 성능이 크게 향상됩니다. 멀티스레딩이나 멀티프로세싱처럼 많은 메모리를 요구하지 않으며, 컨텍스트 스위칭으로 인한 오버헤드도 발생하지 않습니다.  FastAPI는 async/await 구문으로 비동기 작업을 구현하며,  이는 벡엔드가 여러 I/O 바운드 작업(통신, 데이터베이스 쿼리, 외부 API 호출 등)을 동시에 논블록킹으로 처리할 수 있도록 하여, 대규모 트래픽을 효율적으로 처리할 수 있게 합니다.		</div>
				</div>
				<div class="elementor-element elementor-element-8c1b306 elementor-widget elementor-widget-heading" data-id="8c1b306" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">응답 시간 단축 (Reduced Response Time)</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-a3f5046 elementor-widget elementor-widget-html" data-id="a3f5046" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			비동기 I/O는 여러 작업을 동시에 처리할 수 있기 때문에 클라이언트의 요청이 완료되는 시간을 단축시킵니다. 예를 들어, 데이터베이스에 대한 쿼리를 보내면서 다른 작업을 동시에 처리할 수 있어, 대기 시간이 줄어듭니다. 이는 클라이언트가 백엔드에 요청을 보낸 후 대기하는 시간을 줄여, 최종적으로 사용자 인터랙션에 대한 빠른 피드백을 통해  사용자 경험을 향상시킬 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2d51fd2 elementor-widget elementor-widget-heading" data-id="2d51fd2" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">자원 최적화 (Low Overhead)</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-017ceb3 elementor-widget elementor-widget-html" data-id="017ceb3" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			비동기 방식은 멀티스레딩을 사용하지 않기 때문에, 한 번에 많은 스레드를 생성하지 않아도 됩니다. 이는 서버 자원의 효율적인 활용을 가능하게 하며, 특히 서버가 수많은 요청을 동시에 처리할 때 메모리와 CPU 자원의 낭비를 줄일 수 있습니다. 또한, 비동기 방식은 각 요청을 하나의 이벤트 루프에서 처리하므로, 자원을 효율적으로 배분할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-1b92220 elementor-widget elementor-widget-heading" data-id="1b92220" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">웹 소켓과 같은 실시간 기능 지원</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-b8ac8f3 elementor-widget elementor-widget-html" data-id="b8ac8f3" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			FastAPI는 비동기 방식으로 WebSocket 연결을 쉽게 처리할 수 있습니다. 웹소켓은 클라이언트와 서버 간의 실시간 양방향 통신을 필요로 하는 애플리케이션에 적합합니다. 비동기 방식의 FastAPI는 이러한 실시간 데이터 전송을 효율적으로 처리하며, 채팅과 같은 실시간성이 중요한 애플리케이션을 개발하는데 강력한 도구가 됩니다.		</div>
				</div>
				<div class="elementor-element elementor-element-6a46c57 elementor-widget elementor-widget-heading" data-id="6a46c57" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">완전 비동기 구현이 중요한 이유</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-d86106e elementor-widget elementor-widget-html" data-id="d86106e" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			FastAPI 백엔드 개발 시 최대한 비동기적으로 구현하는 이유는 성능 최적화와 동시성 향상 때문입니다. 백엔드 애플리케이션이 I/O 바운드 작업을 많이 포함하고 있다면, 동기식 서브 모듈 사용은 비효율적인 리소스 소비와 처리 속도 저하를 초래할 수 있습니다. 동기식 서브 모듈 사용을 최소화하는 이유는 다음과 같습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-9b16f1a elementor-widget elementor-widget-heading" data-id="9b16f1a" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">I/O 바운드 작업의 비효율적인 처리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-5d1af7d elementor-widget elementor-widget-html" data-id="5d1af7d" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			FastAPI는 비동기 방식으로 구현된 프레임워크이지만, 동기식 서브 모듈을 사용할 경우 비동기 처리의 장점을 살릴 수 없습니다. 예를 들어, 데이터베이스 쿼리를 동기식으로 실행하면 다른 요청들이 해당 쿼리의 응답을 기다려야 하므로, 전체 성능이 저하될 수 있습니다. 비동기 코드에서는 await 구문을 사용하여 요청이 I/O 작업을 기다리는 동안 다른 작업을 처리할 수 있지만, 동기식 코드에서는 이를 처리할 수 없기 때문에 효율적인 성능을 제공하지 못합니다.		</div>
				</div>
				<div class="elementor-element elementor-element-7ad9046 elementor-widget elementor-widget-heading" data-id="7ad9046" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">백엔드 성능 저하</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-085f5dc elementor-widget elementor-widget-html" data-id="085f5dc" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			동기식 서브 모듈을 사용하면 각 요청마다 I/O 작업이 완료될 때까지 기다려야 하므로, 서버가 더 많은 요청을 처리할 수 없습니다. 예를 들어, 한 개의 동기식 작업이 완료될 때까지 기다려야 하므로, 요청이 대기 상태로 남게 되고, 결국 서버 자원이 낭비됩니다. 반면, 비동기 방식에서는 요청이 I/O 작업을 기다리는 동안 다른 요청을 처리할 수 있기 때문에, 서버 자원을 효율적으로 사용할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-e57e731 elementor-widget elementor-widget-heading" data-id="e57e731" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">동시성 제한</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-b4ecd04 elementor-widget elementor-widget-html" data-id="b4ecd04" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			비동기 방식은 서버가 많은 동시 연결을 처리할 수 있도록 도와줍니다. 반면, 동기식 코드에서는 연결이 대기 상태에 있을 때 서버 자원이 소모되고, 이로 인해 많은 요청을 처리하는 데 한계가 생깁니다. 이를 해결하려면 수많은 스레드를 사용해야 하며, 이로 인해 서버 성능이 저하될 수 있습니다. 비동기 방식에서는 이러한 병목 현상을 피할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-8e41086 elementor-widget elementor-widget-heading" data-id="8e41086" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">동기식 코드에서 발생하는 블로킹 문제</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-8fdaf1e elementor-widget elementor-widget-html" data-id="8fdaf1e" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			동기식 코드에서는 한 요청이 다른 요청을 블로킹할 수 있습니다. 예를 들어, 긴 시간을 소요하는 동기식 작업이 있을 경우, 이 작업이 완료될 때까지 다른 요청들은 대기 상태로 남게 됩니다. 이와 같은 블로킹 문제를 해결하려면, 비동기 코드로 작업을 재구성하여 각 작업이 병렬로 실행되도록 해야 합니다.		</div>
				</div>
				<div class="elementor-element elementor-element-5bd0a11 elementor-widget elementor-widget-heading" data-id="5bd0a11" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">실시간 처리 요구 사항을 충족하기 어려움</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-e150dea elementor-widget elementor-widget-html" data-id="e150dea" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			채팅, 주식, 게임 등 실시간 데이터를 다루는 애플리케이션은  응답 시간이 매우 중요합니다. 동기식 코드에서는 각 요청을 처리할 때마다 대기 시간이 발생할 수 있기 때문에, 실시간으로 데이터를 처리하는 데 어려움을 겪을 수 있습니다. 비동기 코드에서는 여러 작업을 동시에 처리하면서 실시간 응답을 제공할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-1b70213 elementor-widget elementor-widget-heading" data-id="1b70213" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">마무리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			FastAPI의 비동기 방식은 고성능과 효율적인 자원 관리를 가능하게 해줍니다. 완전 비동기 방식으로 백엔드 애플리케이션을 구현하면 I/O 바운드 작업에 대해 성능을 극대화할 수 있으며, 서버의 동시성도 크게 향상됩니다. 이는 실시간 처리가 중요한 애플리케이션에 적합하며, 사용자 경험 향상에도 도움을 줍니다. 따라서 FastAPI 기반의 백엔드 애플리케이션은 데이터베이스 접근을 포함하여  완전 비동기 방식으로 구현하는 것이 중요합니다. 만약 비동기 방식으로 대체가 어려워 동기식 서브 모듈을 사용할 수 밖에 없는 상황이라면 asyncio의 ThreadPoolExecutor을 활용할 수 있습니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>선언형 UI 프로그래밍의 현실적인 한계</title>
		<link>https://www.coovil.net/declarative-ui/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Wed, 10 Jan 2024 23:25:59 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3489</guid>

					<description><![CDATA[선언형 UI 프로그래밍의 한계 최근 몇 년 동안, 선언형 UI 프로그래밍이 프론트엔드 개발의 핵심이 되고 있습니다. 웹 프론트엔드 뿐만 아니라 모바일 클라이언트에서도 다양한 프레임워크들이 선언형 방식을 강조하며 코드의 간결성과 가독성을 높인다고 주장합니다. 그러나 현실의 복잡한 프로젝트에서는 선언형 프로그래밍이 가진 여러 제한과 어려움이 두드러집니다. 복잡한 비즈니스 로직 처리의 어려움 선언형 프로그래밍은 주로 UI 상태와 상호작용에 집중하며, [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3489" class="elementor elementor-3489">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_15.jpg" class="attachment-full size-full wp-image-3512" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">선언형 UI 프로그래밍의 한계</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			최근 몇 년 동안, 선언형 UI 프로그래밍이 프론트엔드 개발의 핵심이 되고 있습니다. 웹 프론트엔드 뿐만 아니라 모바일 클라이언트에서도 다양한 프레임워크들이 선언형 방식을 강조하며 코드의 간결성과 가독성을 높인다고 주장합니다. 그러나 현실의 복잡한 프로젝트에서는 선언형 프로그래밍이 가진 여러 제한과 어려움이 두드러집니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2a5552e elementor-widget elementor-widget-heading" data-id="2a5552e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">복잡한 비즈니스 로직 처리의 어려움</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-480a494 elementor-widget elementor-widget-html" data-id="480a494" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			

선언형 프로그래밍은 주로 UI 상태와 상호작용에 집중하며, 이는 간단한 UI에 적합합니다. 그러나 현실의 프로젝트에서는 종종 복잡한 비즈니스 로직이 필요합니다. 선언형 방식은 이러한 비즈니스 로직을 다루기 어렵게 만들며, 명령형 프로그래밍의 직관적인 제어가 필요할 때가 많습니다.
		</div>
				</div>
				<div class="elementor-element elementor-element-36bc9d1 elementor-widget elementor-widget-heading" data-id="36bc9d1" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">성능 문제와 추상화의 오버헤드</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-a3f5046 elementor-widget elementor-widget-html" data-id="a3f5046" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			선언형 프로그래밍은 추상화를 강조하여 유지보수성을 향상시키지만, 이로 인해 성능 문제와 불필요한 추상화가 발생할 수 있습니다. 특히 대규모 프로젝트에서는 선언형 방식이 렌더링 최적화와 관련하여 추가적인 작업을 요구할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-8c1b306 elementor-widget elementor-widget-heading" data-id="8c1b306" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">디버깅의 어려움</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-dd26dc0 elementor-widget elementor-widget-html" data-id="dd26dc0" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			선언형 코드는 내부 동작을 추상화하므로 디버깅이 어려울 수 있습니다. 프레임워크나 라이브러리에 의존하면 코드의 흐름을 이해하고 수정하기 어려울 수 있으며, 이는 버그를 찾고 해결하는 데 시간이 오래 걸리게 만듭니다.		</div>
				</div>
				<div class="elementor-element elementor-element-dd91346 elementor-widget elementor-widget-heading" data-id="dd91346" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">유연성 부족과 특수한 요구사항 다루기</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-0100204 elementor-widget elementor-widget-html" data-id="0100204" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			선언형 프로그래밍은 프레임워크가 제공하는 규칙에 따라 동작하므로 특수한 요구사항이나 커스터마이징이 어려울 수 있습니다. 복잡한 UI나 특수한 상호작용을 다뤄야 하는 프로젝트에서는 명령형 프로그래밍이 더 유연한 해결책을 제공할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-1b70213 elementor-widget elementor-widget-heading" data-id="1b70213" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">마무리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			이러한 이유로 선언형 UI 프로그래밍이 모든 프로젝트에 적합하다고 단언하는 것은 어렵습니다. 프로젝트의 특성, 요구사항, 예산에 따라 선언형과 명령형 프로그래밍 중 최선의 안을 선택하여 사용할 필요가 있습니다.<br>
<span class="blank-line-20"></span>
예를 들어 플러터(Flutter)의 경우 아이폰과 안드로이드 운영체제 용 앱을 하나의 코드 베이스로 구현할 수 있기에 각 운영체제 용 앱을 별도로 구현하는 것에 비해 적은 비용이 들어갑니다. 따라서 구현해야 할 기능에 비해 예산이 충분하지 않고 비즈니스 로직이 복잡하지 않은 경우, 앱의 퀄리티는 상대적으로 떨어지지만 비용면에서 우수한 플러터는 선언형 UI이지만 좋은 선택지가 될 수 있습니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Node.js가 적합하지 않은 경우</title>
		<link>https://www.coovil.net/when-not-to-use-nodejs/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Wed, 10 Jan 2024 05:45:30 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3473</guid>

					<description><![CDATA[Node.js가 적합하지 않은 경우 Node.js는 주로 I/O-intensive한 작업에 강점을 가지고 있어 웹 서버와 같은 네트워크 관련 작업에 매우 적합합니다. 그러나 CPU-intensive한 작업을 처리하는 데는 적합하지 않다는 사실을 고려해야 합니다. 이 글에서는 Node.js가 어떤 한계를 가지고 있는지 알아보겠습니다. Node.js의 싱글 스레드 구조 Node.js는 싱글 스레드 이벤트 루프 모델을 채택하고 있습니다. 클라이언트의 접속이나 클라이언트로부터 요청을 받는 등의 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3473" class="elementor elementor-3473">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_11.jpg" class="attachment-full size-full wp-image-3475" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">Node.js가 적합하지 않은 경우</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			Node.js는 주로 I/O-intensive한 작업에 강점을 가지고 있어 웹 서버와 같은 네트워크 관련 작업에 매우 적합합니다. 그러나 CPU-intensive한 작업을 처리하는 데는 적합하지 않다는 사실을 고려해야 합니다. 이 글에서는 Node.js가 어떤 한계를 가지고 있는지 알아보겠습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2a5552e elementor-widget elementor-widget-heading" data-id="2a5552e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">Node.js의 싱글 스레드 구조</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-480a494 elementor-widget elementor-widget-html" data-id="480a494" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			Node.js는 싱글 스레드 이벤트 루프 모델을 채택하고 있습니다. 클라이언트의 접속이나 클라이언트로부터 요청을 받는 등의 모든 이벤트는 이벤트 루프에서 처리되며, 이벤트 루프는 메인 스레드에서만 동작합니다. 이벤트 루프에서 호출하는 이벤트 핸들러는 그것이 동작하는 동안 어떠한 이벤트도 신규로 생성하거나 처리하지 못합니다. ‘이벤트 생성 -> 이벤트 처리 -> 이벤트 처리 -> 이벤트 대기’와 같이 한번에 하나씩 순차적으로 실행됩니다.		</div>
				</div>
				<div class="elementor-element elementor-element-8c1b306 elementor-widget elementor-widget-heading" data-id="8c1b306" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">블로킹 작업의 영향</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-a3f5046 elementor-widget elementor-widget-html" data-id="a3f5046" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			Node.js는 논블로킹 I/O를 통해 비동기 작업을 처리하면서 높은 동시성을 제공합니다. 그러나 CPU-intensive한 작업은 블로킹되는 경우가 많아, 다른 작업들이 대기해야 하는 상황이 발생할 수 있습니다.<br>
<span class="blank-line-20"></span>
예를 들어 메인 스레드에서 동작하는 이벤트 핸들러가 IO 블록킹이 없는 연산을 수행하면, 그동안 이벤트 루프는 먹통이 되며 클라이언트의 접속 요청이나 클라이언트의 웹API 호출 등에 대한 어떠한 신규 이벤트도 생성하지 못합니다. 이것은 매우 심각한 문제입니다. 이벤트 핸들러가 최대한 빨리 작업을 완료하도록 구현하는 것만이 이벤트 루프가 먹통이 되는 시간을 줄이는 방법입니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2d51fd2 elementor-widget elementor-widget-heading" data-id="2d51fd2" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">효율적인 다중 스레드 지원의 한계</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-017ceb3 elementor-widget elementor-widget-html" data-id="017ceb3" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			Node.js는 Worker Threads를 통해 명시적으로 멀티 스레딩을 지원하긴 하지만, 이는 일부 CPU-intensive한 작업을 별도의 스레드에서 수행하는 것에 그쳐 제한적입니다. 이벤트 루프가 먹통이 되는 문제를 피하기 위해 모든 이벤트 핸들러를 별도의 스레드에서 동작하도록 구현하는 것도 효율적인 방법은 아닙니다. 복잡한 CPU-intensive한 작업을 다루는 데는 다른 언어나 플랫폼이 더 적합할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-1b70213 elementor-widget elementor-widget-heading" data-id="1b70213" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">마무리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			Node.js는 주로 I/O-intensive한 작업을 다루는 데 적합하며, CPU-intensive한 작업에는 한계가 있습니다. pm2와 같은 프로세스 매니저를 통해 Node.js에 멀티프로세싱을 더한다고 하더라도, 이벤트 루프 블록킹 문제는 쉽게 피할 수 없습니다.<br>
<span class="blank-line-20"></span>
프로젝트의 요구사항에 따라 적절한 언어나 플랫폼을 선택하는 것이 중요합니다. CPU-intensive한 작업을 처리해야 할 경우에는 Node.js의 한계를 고려하여 대안을 고려하는 것이 좋습니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>팔콘 PHP 프레임워크 v5 설치 방법</title>
		<link>https://www.coovil.net/install-phalconphp-5/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Tue, 09 Jan 2024 22:07:42 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3400</guid>

					<description><![CDATA[팔콘 PHP 프레임워크 v5 설치 방법 팔콘 PHP에 관심이 있으나 초기 설치에 어려움을 겪는 개발자를 위하여 이 글을 작성하게 되었습니다. 특정 환경에 국한된 부분이 있으나 다른 리눅스 배포본에서도 거의 유사할 것이기에 조금이라도 도움이 되면 좋겠습니다. 대상 운영체제 ⁃ Rocky Linux release 9.3 (Blue Onyx) 설치할 PHP 버전 ⁃ 8.0 설치할 팔콘 버전 ⁃ 5.6.1 기존 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3400" class="elementor elementor-3400">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_01.jpg" class="attachment-full size-full wp-image-2915" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">팔콘 PHP 프레임워크 v5 설치 방법</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			팔콘 PHP에 관심이 있으나 초기 설치에 어려움을 겪는 개발자를 위하여 이 글을 작성하게 되었습니다. 특정 환경에 국한된 부분이 있으나 다른 리눅스 배포본에서도 거의 유사할 것이기에 조금이라도 도움이 되면 좋겠습니다.<br>
<span class="blank-line-20"></span>
<ul>
<li>대상 운영체제 ⁃ Rocky Linux release 9.3 (Blue Onyx)</li>
<li>설치할 PHP 버전 ⁃ 8.0</li>
<li>설치할 팔콘 버전 ⁃ 5.6.1</li>
</ul>		</div>
				</div>
				<div class="elementor-element elementor-element-abc9d7f elementor-widget elementor-widget-heading" data-id="abc9d7f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">기존 패키지 제거 (필요 시)</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-fd0dd90 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="fd0dd90" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="fd0dd90" id="eael-data-table-wrapper-fd0dd90" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-fd0dd90">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo dnf -y remove nginx</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Nginx ⁃ 기존 설치된 패키지 제거</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo rm -rf /etc/nginx</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Nginx ⁃ 설치 폴더 제거</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y remove httpd*</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Apache ⁃ 기존 설치된 패키지 제거</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo rm -rf /etc/httpd*</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Apache ⁃ 설치 폴더 제거</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y remove php*</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">PHP ⁃ 관련 패키지 제거</div></div>
											</td>
																										</tr>
			        						<tr>
													</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-0e14e14 elementor-widget elementor-widget-heading" data-id="0e14e14" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">EPEL 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-f1032e4 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="f1032e4" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="f1032e4" id="eael-data-table-wrapper-f1032e4" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-f1032e4">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf install -y epel-release</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo /usr/bin/crb enable</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-8878641 elementor-widget elementor-widget-heading" data-id="8878641" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">기타 툴 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-dd1acd7 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="dd1acd7" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="dd1acd7" id="eael-data-table-wrapper-dd1acd7" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-dd1acd7">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install wget</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install gcc make</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install git</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-92d142f elementor-widget elementor-widget-heading" data-id="92d142f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Nginx 설치 (필요 시)</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-338b33e fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="338b33e" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="338b33e" id="eael-data-table-wrapper-338b33e" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-338b33e">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install nginx</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-12b5ac1 elementor-widget elementor-widget-heading" data-id="12b5ac1" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PHP 8 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-9adaf38 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="9adaf38" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="9adaf38" id="eael-data-table-wrapper-9adaf38" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-9adaf38">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf module list php</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">설치 가능한 PHP 버전 표시</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf module -y switch-to php:8.0</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">PHP 8이 enabled([e])로 선택되어 있지 않은 경우</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-bcmath</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-devel</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-fpm</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-gd</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-gmp</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-mbstring</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-process</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-json</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-xml</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo dnf -y install php-zip</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-pear</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo dnf -y install php-pecl-apcu</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo dnf -y install php-opcache</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-pdo</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo dnf -y install php-mysqlnd</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">MySql(또는 MariaDB)을 사용하는 경우</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install php-pgsql</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">PostgreSQL을 사용하는 경우</div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-0e99aaf elementor-widget elementor-widget-heading" data-id="0e99aaf" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PHP 8 JIT 활성화 (PHP 7 대비 20~30% 성능 향상)</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-b2f2384 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="b2f2384" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="b2f2384" id="eael-data-table-wrapper-b2f2384" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-b2f2384">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo vi /etc/php.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">PHP 설정 파일 열기</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">; Just-In-Time (JIT)<br>
opcache.enable = 1<br>
opcache.enable_cli = 1<br>
opcache.jit = tracing<br>
opcache.jit_buffer_size = 100M<br>
opcache.jit = 1255<br>
opcache.jit_debug = 0<br>
opcache.revalidate_freq = 0<br>
opcache.validate_timestamps = 1<br>
opcache.max_accelerated_files = 10000<br>
opcache.memory_consumption = 192<br>
opcache.max_wasted_percentage = 10<br>
opcache.fast_shutdown = 1<br>
opcache.interned_strings_buffer = 16</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">php.ini 파일 끝에 다음 내용 추가</div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-be15fef elementor-widget elementor-widget-heading" data-id="be15fef" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PECL 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-a3943d2 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="a3943d2" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="a3943d2" id="eael-data-table-wrapper-a3943d2" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-a3943d2">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo dnf -y install pcre-devel</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo pecl channel-update pecl.php.net</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-cf510af elementor-widget elementor-widget-heading" data-id="cf510af" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PHP xdebug 설치 (PHP 코드 디버깅을 원하는 경우)</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-b3a9921 elementor-widget elementor-widget-text-editor" data-id="b3a9921" data-element_type="widget" data-widget_type="text-editor.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.18.0 - 20-12-2023 */
.elementor-widget-text-editor.elementor-drop-cap-view-stacked .elementor-drop-cap{background-color:#69727d;color:#fff}.elementor-widget-text-editor.elementor-drop-cap-view-framed .elementor-drop-cap{color:#69727d;border:3px solid;background-color:transparent}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap{margin-top:8px}.elementor-widget-text-editor:not(.elementor-drop-cap-view-default) .elementor-drop-cap-letter{width:1em;height:1em}.elementor-widget-text-editor .elementor-drop-cap{float:left;text-align:center;line-height:1;font-size:50px}.elementor-widget-text-editor .elementor-drop-cap-letter{display:inline-block}</style>				PHP JIT과 xdebug를 동시에 사용할 수는 없습니다. xdebug가 필요한 경우 php.ini 파일에서 opache.enable과 opache.enable_cli를 모두 0으로 설정하고, php-fpm 서비스를 재시작하여 PHP JIT을 꺼놓으시기 바랍니다.						</div>
				</div>
				<div class="elementor-element elementor-element-ffb6c17 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="ffb6c17" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="ffb6c17" id="eael-data-table-wrapper-ffb6c17" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-ffb6c17">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo printf "yes\n" | sudo pecl install xdebug</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo echo "zend_extension=xdebug.so" | sudo tee /etc/php.d/40-xdebug.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-f9daf32 elementor-widget elementor-widget-heading" data-id="f9daf32" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PHP imagick 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-7cbcf42 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="7cbcf42" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="7cbcf42" id="eael-data-table-wrapper-7cbcf42" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-7cbcf42">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install ImageMagick-devel</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo printf "yes\n" | sudo pecl install imagick</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo echo "extension=imagick.so" | sudo tee /etc/php.d/40-imagick.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-0dbb998 elementor-widget elementor-widget-heading" data-id="0dbb998" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PHP mcrypt 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-a45263b fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="a45263b" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="a45263b" id="eael-data-table-wrapper-a45263b" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-a45263b">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install libmcrypt-devel</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo printf "yes\n" | sudo pecl install mcrypt</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo echo "extension=mcrypt.so" | sudo tee /etc/php.d/40-mcrypt.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-23f307f elementor-widget elementor-widget-heading" data-id="23f307f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">PHP event 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-cd2b2b6 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="cd2b2b6" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="cd2b2b6" id="eael-data-table-wrapper-cd2b2b6" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-cd2b2b6">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install libevent-devel</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo dnf -y install openssl-devel</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo printf "yes\n" | sudo pecl install event</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo echo "extension=event.so" | sudo tee /etc/php.d/40-event.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-47b930f elementor-widget elementor-widget-heading" data-id="47b930f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Phalcon 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-13fe8ba fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="13fe8ba" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="13fe8ba" id="eael-data-table-wrapper-13fe8ba" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-13fe8ba">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd ~</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo pecl install zephir_parser</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo echo "extension=zephir_parser.so" | sudo tee /etc/php.d/40-zephir_parser.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">wget https://github.com/zephir-lang/zephir/releases/download/0.17.0/zephir.phar</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo mv zephir.phar /usr/bin/zephir</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo chmod a+x /usr/bin/zephir</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">git clone https://github.com/phalcon/cphalcon</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd cphalcon</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">git checkout tags/v5.6.1</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo zephir fullclean</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo zephir compile</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd ext</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo phpize</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo ./configure</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo make</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo make install</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd ../..</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo rm -rf cphalcon</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo echo "extension=phalcon.so" | sudo tee /etc/php.d/50-phalcon.ini</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">php --ri phalcon</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Phalcon이 잘 설치되었는지 확인</div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-9de2189 elementor-widget elementor-widget-heading" data-id="9de2189" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">Phalcon DevTools 설치</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-da3f9a7 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="da3f9a7" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="da3f9a7" id="eael-data-table-wrapper-da3f9a7" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-da3f9a7">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd ~</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> git clone https://github.com/phalcon/phalcon-devtools.git</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd phalcon-devtools</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">git checkout 2e16ea6</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">curl -s http://getcomposer.org/installer | php</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">php composer.phar install</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo rm /usr/local/bin/phalcon</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo ln -s ~/phalcon-devtools/phalcon /usr/local/bin/phalcon</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">cd ..</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"></div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> phalcon -v</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Phalcon DevTools가 잘 설치되었는지 확인</div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-80f1fa7 elementor-widget elementor-widget-heading" data-id="80f1fa7" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h4 class="elementor-heading-title elementor-size-default">서비스 등록</h4>		</div>
				</div>
				<div class="elementor-element elementor-element-1580363 fifty-fifty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="1580363" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="1580363" id="eael-data-table-wrapper-1580363" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-1580363">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">명령어</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">비고</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo systemctl enable nginx</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Nginx ⁃ 서비스 자동 실행 설정</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content"> sudo systemctl start nginx</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">Nginx ⁃ 서비스 시작</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo systemctl enable php-fpm</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">PHP FPM ⁃ 서비스 자동 실행 설정</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">sudo systemctl start php-fpm</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">PHP FPM ⁃ 서비스 시작</div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			추가적인 정보는 <a class="external" href="https://docs.phalcon.io/latest/installation/#software" rel="noopener">공식 문서</a>의 내용을 참고하시기 바랍니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>XML vs JSON 비교 ⁃ 웹 API를 위한 더 나은 선택</title>
		<link>https://www.coovil.net/xml-vs-json/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Tue, 22 Oct 2019 15:33:58 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3357</guid>

					<description><![CDATA[XML vs JSON 비교 웹 API를 위한 더 나은 선택 신규 웹 API를 만들 때 고려하는 요소에는 여러 가지가 있지만 그 중 하나가 API에 전달할 ‘인자 데이터’와 ‘응답받는 데이터’의 형식일 것입니다. 대부분의 웹 API 개발자나 웹 API 이용자들은 ‘JSON’을 인자나 응답 데이터의 형식으로 이용하는 것에 대하여 너무나도 당연하게 받아들일 정도로 JSON은 보편화되고 가장 많이 이용되는 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3357" class="elementor elementor-3357">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_09.jpg" class="attachment-full size-full wp-image-3358" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">XML vs JSON 비교<br>
웹 API를 위한 더 나은 선택 </h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			신규 웹 API를 만들 때 고려하는 요소에는 여러 가지가 있지만 그 중 하나가 API에 전달할 ‘인자 데이터’와 ‘응답받는 데이터’의 형식일 것입니다.<br>
<span class="blank-line-20"></span>
대부분의 웹 API 개발자나 웹 API 이용자들은 ‘JSON’을 인자나 응답 데이터의 형식으로 이용하는 것에 대하여 너무나도 당연하게 받아들일 정도로 JSON은 보편화되고 가장 많이 이용되는 데이터 형식입니다.<br>
<span class="blank-line-20"></span>
반면 ‘XML’은  오래되고 여전히 광범위하게 사용되지만 적어도 웹 API 관련해서는 점차 외면당하고 있는 현실입니다. 많은 개발자가 XML이 갖는 상대적 장점에 대해서 잘 모르지만 편견만으로 JSON을 맹목적으로 채택하는 것은 안타까운 일입니다.<br>
<span class="blank-line-20"></span>
이미 인터넷 상의 많은 글들이 JSON이 XML에 비해 갖고 있는 여러가지 강점에 대하여 말하고 있기 때문에 같은 내용의 글은 의미가 크게 없을 것입니다. 따라서 이 글은 거꾸로 적어도 웹 API의 인자/응답 데이터 형식으로서 XML이 JSON에 비해 어떠한 강점을 갖고 있는지 말해보려고 합니다.<br>
<span class="blank-line-20"></span>
먼저, 아래의 웹 API 개발자 관점에서 XML과 JSON을 비교한 내용을 보시기 바랍니다.		</div>
				</div>
				<div class="elementor-element elementor-element-abc9d7f elementor-widget elementor-widget-heading" data-id="abc9d7f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">XML와 JSON의 비교 ⁃ 웹 API 개발자 관점</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-fd0dd90 fourty-thirty-thirty eael-table-align-center eael-dt-th-align-left elementor-widget elementor-widget-eael-data-table" data-id="fd0dd90" data-element_type="widget" data-widget_type="eael-data-table.default">
				<div class="elementor-widget-container">
					<div class="eael-data-table-wrap" data-table_id="fd0dd90" id="eael-data-table-wrapper-fd0dd90" data-custom_responsive="false">
			<table class="tablesorter eael-data-table center" id="eael-data-table-fd0dd90">
			    <thead>
			        <tr class="table-header">
									            <th class="" id="" colspan="">
														<span class="data-table-header-text">항목</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">XML</span></th>
			        				            <th class="" id="" colspan="">
														<span class="data-table-header-text">JSON</span></th>
			        				        </tr>
			    </thead>
			  	<tbody>
											<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">메타 데이터의 비중 (메타 데이터: 실질 데이터 외에 추가되는 외적인 정보들)</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">높음 (XML 태그 때문)</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">낮음</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">파싱(Parsing)의 편의성</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">낮음 (SAX, DOM, Reader 모두 JSON과 비교했을 때 불편함)</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">높음 (JSON 문서를 '객체'나 '다중 배열'로 즉각 변환 가능)</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">파싱(Parsing) 성능</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">상대적으로 낮음</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">상대적으로 높음</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">인자 및 응답 데이터 형식의 문서화</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">일반 범용 문서 형식 및 XML 전용 문서 형식인 <a class="external" href="https://ko.wikipedia.org/wiki/XML_%EC%8A%A4%ED%82%A4%EB%A7%88_(W3C)" rel="noopener">XSD(XML Schema Definition)</a>로 작성 가능</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">일반 범용 문서 형식으로 작성됨. XSD와 유사한 <a class="external" href="https://json-schema.org/" rel="noopener">JSON Schema</a>도 있으나 아직 Draft 단계로 거의 사용되지 않음.</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">인자 및 응답 데이터의 형식 정의</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">강함 (값의 형식과 항목의 구조에 대한 명확한 정의가 가능)</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">약함 (값의 형식과 항목의 구조에 대한 명확한 정의가 어려움)</div></div>
											</td>
																										</tr>
			        						<tr>
																   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">인자 및 응답 데이터의 형식 검증</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">편리함 (임의의 XML 문서를 XSD 문서를 통해 자동화된 검증 가능)</div></div>
											</td>
																													   											<td colspan="" rowspan="" class="" id="">
												<div class="td-content-wrapper"><div class="td-content">불편함 (수동적으로 값의 형식 및 항목의 구조에 대하여 검증해야함)</div></div>
											</td>
																										</tr>
			        			    </tbody>
			</table>
		</div>
	  			</div>
				</div>
				<div class="elementor-element elementor-element-2a5552e elementor-widget elementor-widget-heading" data-id="2a5552e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">왜 여전히 XML 사용을 고려해야 하는가?</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-480a494 elementor-widget elementor-widget-html" data-id="480a494" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			XML과 JSON을 비교한 수많은 글은 이미 JSON이 XML보다 많은 강점을 갖고 있다고 말하고 있으며, 많은 개발자들 또한 이러한 내용에 공감하고 현재도 그리고 앞으로도 웹 API 입출력 형식으로 JSON을 선택할 것입니다.<br>
<span class="blank-line-20"></span>
우리는 지금까지 JSON의 비교 우위를 판단할 때 상대적으로 ‘더 적은 데이터의 양’과 상대적으로 ‘더 높은 처리 성능’ 등의 수치적 자료를 기준으로 하였습니다. 그러나 XML과 JSON을 비교하는 많은 글에서 간과하고 있지만 우리가 놓치고 있는 중요한 사실이 있습니다. 그것은 바로 데이터의 형식적 무결성 확보입니다.<br>
<span class="blank-line-20"></span>
노련한 개발자들은 이미 눈치채셨겟지만, 입력 데이터의 형식적 무결성 확보는 수치적인 약간의 성능 향상보다 더 중요하게 고려해야 하는 부분입니다. 즉, 웹 API의 입력 데이터와 출력 데이터의 무결성을 검증, 확보, 유지하는 과정은 산술적인 이익보다 시스템 동작에 더 중요할 수 있습니다.<br>
<span class="blank-line-20"></span>
1. 입출력 데이터의 무결성 확보를 위해 먼저 해야할 일은 커스텀 데이터 규약을 정의하는 문서를 작성하고 웹 API 개발자 및 이용자들과 공유하는 것입니다. 단, 이 규약 문서는 실제 프로그래밍 및 동작 단계에서 강제성이 있어야만 합니다. 강제성이 없는 문서는 그냥 메뉴얼 또는 가이드 수준일 뿐입니다.<br>
<span class="blank-line-20"></span>
2. 입력 데이터, 출력 데이터 또는 입출력 데이터 모두에 대하여 위 규약 문서를 통하여 일차적으로 자동 검증합니다. 이 과정은 규약 문서에 강제성을 제공하여 규약 문서가 실질적 영향력이 있게 만듭니다. 즉, 규약 문서는, 안따라도 상관없는 단순한 가이드 문서가 아니라 규약을 어기면 웹 API가 100% 에러를 유발하고 규약의 어느 부분을 어겼는지도 알려주는, 강력한 무결성 판단 도구가 됩니다.<br>
<span class="blank-line-20"></span>
3. 이렇게 입력, 출력, 또는 입출력 데이터에 대한 무결성이 확보되면 웹 API 개발자는 모든 문제를 웹 API의 실제 구현부로 가정할 수 있습니다. 즉, 웹 API가 오동작하였다면 그 원인 중에 적어도 ‘규약을 지키지 않은 입력 데이터가 웹 API 호출 시 인자로 입력’된 경우는 없게 됩니다. 또한 반대로 ‘출력 데이터의 무결성’ 까지 확보되면, 웹 API가 잘못된 형식의 데이터를 클라이언트에게 보내어 클라이언트가 파싱에 실패하는 경우도 사라집니다.<br>
<span class="blank-line-20"></span>
위와 같은 ‘무결성’ 부분에 있어 XML은 JSON과 비교할 수 없는 강점을 갖습니다. 특히 XML의 규약 문서로 사용되는 형식인 XSD(XML Schema Definition)는 오래된 역사에 걸맞게 잘 다듬어졌으며 정교하고 강력합니다. 웹 API 개발자 및 사용자는 웹 API의 XSD를 파일을 공유하고 확인하는 것 만으로 해당 웹 API의 호출 규약을 이해하고 문제없이 사용할 수 있습니다. 또한 웹 API 개발자는 동일한 XSD 파일을 통하여 임의의 XML 문서가 규약에 부합하는지 빠르고 편하게 자동 검증할 수 있습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-1b70213 elementor-widget elementor-widget-heading" data-id="1b70213" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">마무리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			이상 웹 API에 있어서 XML과 JSON을 비교하고, XML이 특별히 갖고 있는 수치 외적인 강점에 대하여 알아보았습니다.<br>
<span class="blank-line-20"></span>
특정 분야 또는 특정 범위라고 할지라도 모든 경우에 적용되는 정답은 없을 것입니다. 예를 들어 JSON이 대부분의 경우 XML에 비해 유리하다면 XML은 사라져야 하겠지요. 하지만 여전히 XML은 광범위하게 사용되고 있고 앞으로도 그럴 것입니다. ‘웹 API’의 범위에서도 XML은 나름의 비교 불가한 강점을 갖고 있으며 이 부분이 간과되지 않길 바라는 마음에서 이 글을 작성하였습니다. 개발자들이 본인 프로젝트를 위해 웹 API을 설계하고 개발하고자 할 때 XML의 사용에 대하여 좀 더 고민해 보는 계기가 되었으면 합니다.<br>
<span class="blank-line-20"></span>
여담으로, 쿠빌은 Rest 형식의 웹 API에 대해 XML을 주로 사용하고, WebSocket 서버와 같이 매우 간단한 인자를 갖는 경우에는 JSON을 사용합니다. 또한, XML을 입출력 형식으로 이용하는 경우라도 ‘차트 데이터’와 같이 특정 항목의 값이 큰 용량을 차지하는 경우라면 해당 자료 형식을 string으로 하고 JSON 값을 넣습니다. 만약, 그래도 값의 크기가 매우 크다면 JSON 값 자체를 gzip으로 압축하고 base64로 인코딩한 값을 넣습니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>데이터베이스 리플리케이션과 그 응용</title>
		<link>https://www.coovil.net/db-replication/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Fri, 01 Feb 2019 10:09:21 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3334</guid>

					<description><![CDATA[데이터베이스 리플리케이션이란? 데이터베이스 리플리케이션(Replication)은 실시간 복제본 데이터베이스 서버를 운용하는 것을 의미합니다. 기준이 되는 서버를 마스터 서버라 하고, 마스터 서버와 동일한 내용을 갖는 또 다른 서버를 ‘리플리카(Replica)’라 합니다. 어플리케이션은 데이터베이스에 SQL 명령을 보내 데이터를 삽입/변경/삭제하게 되는데, 마스터 서버는 SQL 명령을 수신하면 그 SQL 명령을 리플리카 서버에도 똑같이 보냅니다. 이렇게 되면 마스터 서버와 리플리카 서버의 데이터가 동일한 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3334" class="elementor elementor-3334">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2019/02/cv_blog_header_08.jpg" class="attachment-full size-full wp-image-3336" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">데이터베이스 리플리케이션이란?</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			데이터베이스 리플리케이션(Replication)은 실시간 복제본 데이터베이스 서버를 운용하는 것을 의미합니다. 기준이 되는 서버를 마스터 서버라 하고, 마스터 서버와 동일한 내용을 갖는 또 다른 서버를 ‘리플리카(Replica)’라 합니다.<br>
<span class="blank-line-20"></span>
어플리케이션은 데이터베이스에 SQL 명령을 보내 데이터를 삽입/변경/삭제하게 되는데, 마스터 서버는 SQL 명령을 수신하면 그 SQL 명령을 리플리카 서버에도 똑같이 보냅니다. 이렇게 되면 마스터 서버와 리플리카 서버의 데이터가 동일한 상태로 유지됩니다.		</div>
				</div>
				<div class="elementor-element elementor-element-abc9d7f elementor-widget elementor-widget-heading" data-id="abc9d7f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">데이터베이스 리플리케이션의 목적</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-78ddf77 elementor-widget elementor-widget-html" data-id="78ddf77" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			데이터베이스 리플리케이션은 기본적으로 데이터 안정성을 위함입니다.<br>
<span class="blank-line-20"></span>
어떠한 원인으로 인해 데이터가 손상되었을 때, 가장 기초적인 대처는 가장 최신의 백업본을 복구하여 사용하는 것입니다. 그러나 백업본을 이용한 대처는 큰 단점이 있습니다. 데이터 백업을 주기적이고 자동으로 되도록 해놓았다고 하더라도 백업된 시간과 장애가 발생한 시간 사이의 데이터 변경 사항들은 모두 소실되게 됩니다.<br>
<span class="blank-line-20"></span>
리플리카 서버는 ‘아주 약간의 딜레이가 있긴 하지만’ 거의 실시간으로 마스터 서버와 동일한 데이터를 갖고 있기 때문에, 장애 복구 시 데이터 소실이 최소화됩니다. 리플리카 서버는 마스터 서버로 승격이 가능하기에, 마스터 서버로 승격시켜 기존 마스터 서버를 대체하는 방식으로 복구가 진행됩니다. 리플리카 서버를 마스터 서버로 승격한 후, 이 새로운 마스터 서버에 대한 리플리카 서버를 생성하면 복구가 완료됩니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2a5552e elementor-widget elementor-widget-heading" data-id="2a5552e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">데이터베이스 리플리케이션의 응용</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-480a494 elementor-widget elementor-widget-html" data-id="480a494" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			리플리카 서버는 기본적으로 읽기전용으로 운용됩니다. 이러한 특성을 활용하면 데이터베이스 서버의 부하를 줄이고, 데이터베이스를 억세스하는 어플리케이션의 동작 성능을 개선할 수 있습니다.<br>
<span class="blank-line-20"></span>
어플리케이션 개발 시, 데이터의 억세스 시간이 중요한 읽기쓰기 SQL 작업은 마스터 서버에 접속하여 수행하고, 데이터의 억세스 시간이 중요하지 않는 ‘읽기전용’ 작업은 리플리카 서버에 접속하여 수행하도록 합니다.<br>
<span class="blank-line-20"></span>
예를 들어, 서비스 어플리케이션은 항시 마스터 데이터베이스 서버에서 데이터를 조작하도록 하고, ‘많은 부하가 유발될 수 있는’ 관리자 사이트의 특정 내역 조회 기능에 대해서는 리플리카 데이터베이스 서버로부터 데이터를 가져오도록 하는 것입니다.<br>
<span class="blank-line-20"></span>
이렇게 하면, 큰 규모의 데이터에서 자료를 추출하게 될 때 발생하는 데이터베이스 서버 부하를 리플리카 서버가 대신 받아 처리하기에 마스터 서버가 받게 되는 부하가 크게 줄어듭니다.		</div>
				</div>
				<div class="elementor-element elementor-element-fd4096f elementor-widget elementor-widget-heading" data-id="fd4096f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">AWS에서의 데이터베이스 리플리케이션</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-2f0f64f elementor-widget elementor-widget-html" data-id="2f0f64f" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			아마존 웹 서비스의 데이터베이스 제품인 RDS는 특정 데이터베이스 타입에 대해서 리플리케이션(Replication) 기능을 지원합니다. 복제 서버인 리플리카는 기본적으로 읽기전용입니다.<br>
<span class="blank-line-20"></span>
RDS가 리플리케이션을 지원하는 데이터베이스는 포스트그레스큐엘(Postgresql), 마이에스큐엘(MySql), 마리아DB(MariaDB) 입니다.		</div>
				</div>
				<div class="elementor-element elementor-element-1b70213 elementor-widget elementor-widget-heading" data-id="1b70213" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">마무리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			시범적인 서비스가 아닌 상용 서비스의 경우 모든 데이터는 매우 치명적이기에 데이터의 안정성을 보장하는 것은 간과해서는 안될 중요한 일입니다. 모든 서버는 언제든 장애가 발생할 수 있습니다. 중요 서비스에 대해 데이터베이스 서버 자동 백업 정책에만 의존하는 것은 너무 안일한 생각이라고 할 수 있습니다.<br>
<span class="blank-line-20"></span>
상용 서비스를 운용중이라면, 안정성과 속도라는 두 마리 토끼를 동시에 잡을 수 있는 ‘데이터베이스 리플리케이션’의 적용에 대해 적극 고민해보아야 합니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CDN이란 무엇인가? CDN 서비스의 중요성</title>
		<link>https://www.coovil.net/why-cdn/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Fri, 04 Jan 2019 08:06:54 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3291</guid>

					<description><![CDATA[CDN이란 무엇이며,왜 CDN을 사용해야 하는가? CDN은 Content Delivery Network의 약어로, 한글로는 콘텐츠 배포망으로 번역됩니다. CDN에 대하여 한번쯤 들어보신 분도 있고 처음 듣는 분도 있으실 것입니다. 중요한 것은 인터넷으로 미디어 콘텐츠를 일반 고객에게 제공하는 기업이라면, CDN은 반드시 알아야 할 기술이라는 것입니다. 이번 글에서는 CDN이 생겨난 이유에 대하여, 그 진화 단계를 하나씩 소개하는 방식으로 설명하겠습니다. 진화 0단계 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3291" class="elementor elementor-3291">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_07.jpg" class="attachment-full size-full wp-image-3292" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">CDN이란 무엇이며,<br>왜 CDN을 사용해야 하는가?</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			CDN은 Content Delivery Network의 약어로, 한글로는 콘텐츠 배포망으로 번역됩니다. CDN에 대하여 한번쯤 들어보신 분도 있고 처음 듣는 분도 있으실 것입니다. 중요한 것은 인터넷으로 미디어 콘텐츠를 일반 고객에게 제공하는 기업이라면, CDN은 반드시 알아야 할 기술이라는 것입니다. 이번 글에서는 CDN이 생겨난 이유에 대하여, 그 진화 단계를 하나씩 소개하는 방식으로 설명하겠습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-abc9d7f elementor-widget elementor-widget-heading" data-id="abc9d7f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">진화 0단계 ⁃ 웹서버 내의 미디어 콘텐츠</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-78ddf77 elementor-widget elementor-widget-html" data-id="78ddf77" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<img decoding="async" class="align-center width-400" src="/wp-content/uploads/2024/01/cv_blog_whycdn_01.jpg" alt="">
<span class="blank-line-20"></span>
기업이 직접 만들거나 또는 사용자가 직접 만들어 올린 미디어 콘텐츠를 인터넷으로 접근 가능하도록 하는 가장 쉬운 방법은 웹서버를 통하는 것입니다. 웹서버 내에 미디어 파일을 놓아두면, 브라우저와 같은 클라이언트 프로그램이 도메인에 서브 경로를 붙여 파일을 다운로드하고 표시 또는 재생하는 식입니다. 이 방법은 미디어 파일의 크기가 작고 접근 빈도도 작은 경우 별 문제가 없습니다.<br>
<span class="blank-line-20"></span>
그러나 파일 크기가 수백 메가바이트, 수 기가바이트라면 상황이 달라집니다. 다수의 클라이언트 프로그램이 동시에 수 기가바이트의 소프트웨어 설치파일이나 동영상을 받기 시작한다고 했을 때 웹서버 네트워크 카드의 대역폭 제한, 라우터의 대역폭 제한, 케이블의 대역폭 제한 또는 호스팅 업체에서 설정한 네트워크 대역폭 제한에 도달하게 됩니다. 작은 크기의 미디어 파일이라도 동시 접근량이 늘어난다면 같은 상황에 직면하게 됩니다.<br>
<span class="blank-line-20"></span>
이렇게 네트워크 대역폭 제한에 걸려버린 경우, 콘텐츠 다운로드 트래픽으로 인해 웹서버는 네트워크를 통해 들어오는 일반 요청도 받을 수 없게 되어 결국에는 어떠한 서비스도 더 이상 제공할 수 없는 ‘마비’ 상태에 빠지게 됩니다.		</div>
				</div>
				<div class="elementor-element elementor-element-2a5552e elementor-widget elementor-widget-heading" data-id="2a5552e" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">진화 1단계 ⁃ 미디어 콘텐츠 전용 서버의 사용</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-480a494 elementor-widget elementor-widget-html" data-id="480a494" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			다수의 고객에게 동시에 콘텐츠를 전달해야 하는 상용 웹 서비스의 경우 하나의 웹서버 만으로 운용될 수 없는 경우가 대다수입니다. 웹서버의 경우, 로드밸런서를 통해 트래픽을 동일한 여러 개의 웹서버로 분산하여, 각 웹서버가 받는 부하를 1/N로 줄일 수 있습니다.<br>
<span class="blank-line-20"></span>
그러나 정적인 콘텐츠가 아닌, 콘텐츠가 계속해서 추가되는 상황이라면 여러 개의 웹서버가 동일한 미디어 파일을 유지할 수 있도록 동기화 시켜야 하는 문제가 발생하게 됩니다. 그래서 다른 기능없이 오로지 미디어 콘텐츠 파일 만을 보관하고 제공하는 웹서버인 ‘미디어 콘텐츠 서버’를 별도로 만들어 이 서버가 높은 네트워크 대역폭을 지원하도록 하고, 서비스 기능을 수행하는 웹서버와 클라이언트 프로그램으로 부터의 접근이 이곳으로 일원화 되도록 합니다.<br>
<span class="blank-line-20"></span>
그러나 미디어 다운로드 트래픽이 계속 늘어난다면 어떻게 될까요? 단일 미디어 콘텐츠 전용 서버의 네트워크 대역폭을 무한대로 늘릴 수는 없습니다. 호스팅 업체의 최대 네트워크 대역폭에 도달하기도 전에 해당 서버의 네트워크 카드가 가진 대역폭 최대치에 먼저 도달하게 될 것입니다. 이럴 때는 어쩔 수 없이 미디어 콘텐츠 서버를 여러 대 운용해야 합니다. 미디어 콘텐츠 서버가 여러 대가 되면 역시 서버 간의 파일 동기화 문제가 발생합니다. 클라이언트가 어떤 임의의 내부 미디어 서버에 도달한다고 해도 같은 파일에 접근할 수 있어야 하는데 그것이 랜덤으로 (받을 수도 있고 못 받을 수도 있고) 된다면 안되니까요. 새로운 미디어 파일을 고객이 업로드하던 기업이 업로드하던 모든 미디어 콘텐츠 서버에는 동일한 시점에 동일하게 올라가야 합니다.		</div>
				</div>
				<div class="elementor-element elementor-element-fd4096f elementor-widget elementor-widget-heading" data-id="fd4096f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">진화 2단계 ⁃ 지역별 미디어 콘텐츠 전용 서버들</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-2f0f64f elementor-widget elementor-widget-html" data-id="2f0f64f" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<img decoding="async" class="align-center width-400" src="/wp-content/uploads/2024/01/cv_blog_whycdn_02.jpg" alt="">
<span class="blank-line-20"></span>
글로벌한 서비스의 경우에는 또다른 지리적 문제에 직면하게 됩니다. 문제의 원인은 지구가 크다는 것이죠. 미디어 콘텐츠 서버는 지구 어딘가 특정 지점에 위치하는데 반하여, 글로벌 서비스의 경우 지구 어느 지점에서든 접근할 수 있기 때문에 서버와 클라이언트 사이의 거리가 멀면 멀수록 통신 속도는 느려지게 됩니다.<br>
<span class="blank-line-20"></span>
결국 해법은 서버와 클라이언트 사이의 ‘거리’를 줄이는 것입니다. 다수의 미디어 콘텐츠 서버를 여러 개의 지역에 배치하여 트래픽을 분산시키는 방식입니다. 오리진(Origin) 서버라고 하는 모든 데이터의 원본 격인  미디어 서버를 구성하고 나머지 미디어 서버들이 오리진 서버로부터 데이터를 가져와 근처의 사용자에게 제공하는 것입니다. 그러나 위와 같이 파일을 동기화하고, 사용자가 근처의 서버에 접근하도록 하는 등의 처리는 중소형 기업이 감당하기에 쉬운 일이 아닙니다. 막대한 서버 비용이 들어가며, 높은 수준의 서버 관리도 필요하죠.		</div>
				</div>
				<div class="elementor-element elementor-element-1b70213 elementor-widget elementor-widget-heading" data-id="1b70213" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">진화 3단계 ⁃ 전문 콘텐츠 배포망 서비스의 등장</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-9b419a9 elementor-widget elementor-widget-html" data-id="9b419a9" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			<img decoding="async" class="align-center width-400" src="/wp-content/uploads/2024/01/cv_blog_whycdn_03.jpg" alt="">
<span class="blank-line-20"></span>
위와 같이 오리진(Origin) 서버를 두고 에지(Edge) 서버(지역별 미디어 콘텐츠 서버)를 두는 것은 정말 좋긴 하지만 생각보다 큰 규모의 작업이며 운용 비용도 만만치 않습니다. 그래서 이것을 전문적으로 서비스하는 기업들이 생겨났습니다. 이들이 제공하는 서비스가 바로 CDN 입니다. CDN 서비스는 고객사가 직접 이 모든 것을 처리하는 것에 비하여 더 저렴하고 더 편리하고 더 안정적으로 사용자에게 콘텐츠를 제공합니다. 또한 디도스 공격 등으로 인한 대규모 트래픽 증가에 대해서도 염려할 필요도 없습니다.<br>
<span class="blank-line-20"></span>
대표적인 CDN 서비스로는  ‘Akamai(아카마이) CDN’과 AWS의 ‘CloudFront(클라우드 프론트)’ 제품이 있습니다. Akamai CDN은 정말 빠르고 매우 많은 에지 서버를 갖추고 있습니다. 그러나 다른 CDN 서비스에 비해 비싸다는 단점이 있습니다. 쿠빌은 다른 AWS 제품들과의 연동성도 좋고 주요한 국가들에서 좋은 성능을 보여주는 CloudFront 제품을 추천합니다.		</div>
				</div>
				<div class="elementor-element elementor-element-838f62a elementor-widget elementor-widget-heading" data-id="838f62a" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">마무리</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-63fc397 elementor-widget elementor-widget-html" data-id="63fc397" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			지금까지 CDN 서비스가 생기게 된 과정을 하나씩 알아보았습니다. 이제 CDN 서비스가 무엇이며, 왜 사용해야 하는지 자연스럽게 알게 되셨을 것이라 생각합니다.<br>
<span class="blank-line-20"></span>
CDN은 더 이상 옵션이 아닌 필수입니다. 쿠빌은 강력한 CDN 기능을 저렴하게 종량제로 (사용량 만큼만, 발생한 트래픽 만큼만) 지불하여 사용할 수 있어 합리적인, <a class="external" href="https://aws.amazon.com/ko/cloudfront" rel="noopener">아마존의 CDN 서비스 CloudFront</a>의 사용을 추천합니다.<br>
<span class="blank-line-20"></span>
<img decoding="async" class="align-center width-200" src="/wp-content/uploads/2024/01/cv_blog_whycdn_04.png" alt="">		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHP 프레임워크 순위 ⁃ 2018년 베스트 10</title>
		<link>https://www.coovil.net/php-rank-best10-2018/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Thu, 03 Jan 2019 07:58:13 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3188</guid>

					<description><![CDATA[2018년 PHP 프레임워크 순위 베스트 10 현재까지 세계적으로 가장 인기 있는 서버 사이드 프로그래밍 언어인 PHP. PHP의 꾸준한 인기는 강력하고 다양한 PHP 프레임워크들이 있기에 가능한 일이었습니다. PHP 개발자는 최고의 PHP 프레임워크를 함께 사용함으로써 더 복잡하고 더 보안성이 우수하고 균형잡힌 웹 어플리케이션을 개발할 수 있습니다. 각각의 PHP 프레임워크는 그 자체의 크기, 동작 시 차지하는 메모리의 양, [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3188" class="elementor elementor-3188">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_06.jpg" class="attachment-full size-full wp-image-3189" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget__width-initial elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">2018년 PHP 프레임워크 순위 베스트 10</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			현재까지 세계적으로 가장 인기 있는 서버 사이드 프로그래밍 언어인 PHP. PHP의 꾸준한 인기는 강력하고 다양한 PHP 프레임워크들이 있기에 가능한 일이었습니다.<br>
<span class="blank-line-20"></span>
PHP 개발자는 최고의 PHP 프레임워크를 함께 사용함으로써 더 복잡하고 더 보안성이 우수하고 균형잡힌 웹 어플리케이션을 개발할 수 있습니다.<br>
<span class="blank-line-20"></span>
각각의 PHP 프레임워크는 그 자체의 크기, 동작 시 차지하는 메모리의 양, 동작 성능, 개발 편의성, 기능, 그리고 그것을 사용하는 개발자의 숙련도 요구 수준도 다릅니다.<br>
<span class="blank-line-20"></span>
2018년을 빛낸 최고의 PHP 프레임워크 10개에 대한 각각의 특징 및 장단점에 대해 정리하였습니다.		</div>
				</div>
				<div class="elementor-element elementor-element-3ed9f25 elementor-widget elementor-widget-toggle" data-id="3ed9f25" data-element_type="widget" data-widget_type="toggle.default">
				<div class="elementor-widget-container">
			<style>/*! elementor - v3.18.0 - 20-12-2023 */
.elementor-toggle{text-align:left}.elementor-toggle .elementor-tab-title{font-weight:700;line-height:1;margin:0;padding:15px;border-bottom:1px solid #d5d8dc;cursor:pointer;outline:none}.elementor-toggle .elementor-tab-title .elementor-toggle-icon{display:inline-block;width:1em}.elementor-toggle .elementor-tab-title .elementor-toggle-icon svg{margin-inline-start:-5px;width:1em;height:1em}.elementor-toggle .elementor-tab-title .elementor-toggle-icon.elementor-toggle-icon-right{float:right;text-align:right}.elementor-toggle .elementor-tab-title .elementor-toggle-icon.elementor-toggle-icon-left{float:left;text-align:left}.elementor-toggle .elementor-tab-title .elementor-toggle-icon .elementor-toggle-icon-closed{display:block}.elementor-toggle .elementor-tab-title .elementor-toggle-icon .elementor-toggle-icon-opened{display:none}.elementor-toggle .elementor-tab-title.elementor-active{border-bottom:none}.elementor-toggle .elementor-tab-title.elementor-active .elementor-toggle-icon-closed{display:none}.elementor-toggle .elementor-tab-title.elementor-active .elementor-toggle-icon-opened{display:block}.elementor-toggle .elementor-tab-content{padding:15px;border-bottom:1px solid #d5d8dc;display:none}@media (max-width:767px){.elementor-toggle .elementor-tab-title{padding:12px}.elementor-toggle .elementor-tab-content{padding:12px 10px}}.e-con-inner>.elementor-widget-toggle,.e-con>.elementor-widget-toggle{width:var(--container-widget-width);--flex-grow:var(--container-widget-flex-grow)}</style>		<div class="elementor-toggle">
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6591" class="elementor-tab-title" data-tab="1" role="button" aria-controls="elementor-tab-content-6591" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Laravel (라라벨)</a>
					</div>

					<div id="elementor-tab-content-6591" class="elementor-tab-content elementor-clearfix" data-tab="1" role="region" aria-labelledby="elementor-tab-title-6591"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_larabel.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://laravel.com" rel="noopener">라라벨</a>은 상대적으로 최근에 나온 PHP 프레임워크이지만, 논쟁의 여지 없이 현재 가장 인기있는 PHP 프레임워크이며, 거대한 생태계를 갖고 있습니다. 라라벨은 매 릴리즈마다 문서화되고 다수의 비디오, 튜토리얼, 블로그가 있기 때문에 쉽게 배울 수 있습니다.
[blank-line-20]
라라벨은 많은 기능들로 빠른 어플리케이션 개발을 가능하게 합니다. Artisan 컴맨드 라인 인터페이스를 통해 개발 중 유용하게 쓰일 수 있는 명령어를 제공합니다. 또한, 라라벨은 강력한 템플릿 엔진을 통해 일상적인 인증이나 캐싱, 세션, RESTful 라우팅, 큐잉을 쉽게 처리할 수 있게 합니다.
[blank-line-20]
라라벨은 여타 PHP 프레임워크에 비해 프레임워크 자체 오버해드가 매우 큰 편입니다. 매우 간단한 작업을 하는 요청의 경우, 실제 요청 처리에 걸리는 시간보다 프레임워크 및 내부 모듈의 초기화에 걸리는 시간이 더 많습니다. 개발자가 실제 사용하지 않는 모듈까지 불필요하게 모두 로드됩니다. 따라서 클라이언트로부터 빈번하게 대량의 요청이 들어오는 서비스의 경우, 프레임워크의 오버해드가 눈덩이처럼 커집니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6592" class="elementor-tab-title" data-tab="2" role="button" aria-controls="elementor-tab-content-6592" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Phalcon (팔콘)</a>
					</div>

					<div id="elementor-tab-content-6592" class="elementor-tab-content elementor-clearfix" data-tab="2" role="region" aria-labelledby="elementor-tab-title-6592"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_phalcon.jpg" alt="" />
[blank-line-20]
<a href="/phalcon-php">팔콘</a>은 C/C++에 기반하여 개발되었다는 점에서 여타 PHP 프레임워크들과는 확연히 구분되는 풀스택 PHP 프레임워크입니다. 팔콘은 웹 어플리케이션이 실제 구동하게 될 서버에 딱 맞는 프로세서 명령어로 최적화 빌드되고, 웹서버에 동적 C 모듈로 단 한번만 로드됩니다. 이미 빌드된 상태로 메모리에 로드되어 있기에, 다른 PHP 프레임워크보다 더 적은 메모리를 소모하며 더 적게 CPU를 사용하므로 프레임워크 자체의 오버해드가 매우 낮습니다.
[blank-line-20]
팔콘은 에셋 관리, 유니버셜 오토로더, 다국어 지원, 캐싱, 보안 등의 독특한 기능과 함께 로드됩니다. phalcon-devtools 컴맨드 라인 인터페이스를 통해 개발 중 유용하게 쓰일 수 있는 명령어를 제공합니다. 팔콘은 사용하기 편한 프레임워크이고 문서화도 잘 되어 있습니다. 진정 사용할 가치가 있는 프레임워크입니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6593" class="elementor-tab-title" data-tab="3" role="button" aria-controls="elementor-tab-content-6593" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Symphony (심포니)</a>
					</div>

					<div id="elementor-tab-content-6593" class="elementor-tab-content elementor-clearfix" data-tab="3" role="region" aria-labelledby="elementor-tab-title-6593"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_symfony.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://symfony.com" rel="noopener">심포니</a>는 개발자들에게 재사용 가능한 PHP 컴포넌트와 코드 세트를 제공하는 또 하나의 PHP 프레임워크입니다. 심포니는 활동적인 개발자 커뮤니티에 의해 지원되는 거대한 생태계를 갖고 있습니다.
[blank-line-20]
심포니는 규모가 큰 엔터프라이즈급 프로젝트에 가장 적합한 PHP 프레임워크입니다. 심포니의 컴포넌트는 Drupal, PHPBB, PIWIk, OROCRM과 같은 다양한 컨텐츠 관리 시스템에서 사용되며 심지어 라라벨 프레임워크에서도 사용합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6594" class="elementor-tab-title" data-tab="4" role="button" aria-controls="elementor-tab-content-6594" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Zend (젠드)</a>
					</div>

					<div id="elementor-tab-content-6594" class="elementor-tab-content elementor-clearfix" data-tab="4" role="region" aria-labelledby="elementor-tab-title-6594"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_zend.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://framework.zend.com" rel="noopener">젠드</a>는 사용자에게 친숙한 드래그-앤-드롭 편집기, 암호화 코딩 도구, 데이터베이스 연결 마법사 및 즉석 온라인 디버깅 도구와 같은 다양한 기능을 제공합니다. 젠드 <span class="" title="">편집기는 HTML, CSS 및 JavaScript와 같은 프론트 엔드 기술을 지원합니다.
[blank-line-20]
확장 가능한 프레임워크는 다양한 구성 옵션을 제공하므로 복잡한 웹 사이트에 이상적입니다. 그러나, 젠드는 다른 프레임워크에 비해 배우기가 어렵습니다.</span></div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6595" class="elementor-tab-title" data-tab="5" role="button" aria-controls="elementor-tab-content-6595" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">CodeIgniter (코드이그나이터)</a>
					</div>

					<div id="elementor-tab-content-6595" class="elementor-tab-content elementor-clearfix" data-tab="5" role="region" aria-labelledby="elementor-tab-title-6595"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_ci.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://codeigniter.com" rel="noopener">코드이그나이터</a>는 가장 오래된 프레임워크 중 하나이지만 심플하고 강력합니다. 설치가 쉬우며, 최소한의 환경 설정만 하면 됩니다. 거의 모든 공유 및 전용 호스팅 서버에서 완벽하게 작동합니다.
[blank-line-20]
코드이그나이터는 전적으로 MVC 아키텍처에 기반하여 구성되어 있지는 않습니다. 컨트롤러 클래스는 필수이지만 모델과 뷰는 선택적입니다. 코드이그나이터의 또 다른 강점은 속도입니다. 다른 프레임워크와 비교하여 데이터베이스 작업이 더 빠르게 실행됩니다. 문서화가 잘 되어 있으며 PHP 초보자를 위한 훌륭한 프레임워크입니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6596" class="elementor-tab-title" data-tab="6" role="button" aria-controls="elementor-tab-content-6596" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">CakePHP (케익PHP)</a>
					</div>

					<div id="elementor-tab-content-6596" class="elementor-tab-content elementor-clearfix" data-tab="6" role="region" aria-labelledby="elementor-tab-title-6596"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_cakephp.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://cakephp.org" rel="noopener">케익PHP</a>는 이미 10년이 넘었지만 여전히 가장 대중적인 PHP 프레임워크 중 하나입니다. 케익PHP는 속도와 안정성 및 보안성이 우수합니다. 개발자 커뮤니티로부터 큰 지원을 받아 기술적인 트랜드를 잘 따릅니다.
[blank-line-20]
케익PHP는 상용 웹 어플리케이션 개발에 적합한 현대적인 프레임워크로서 잘 문서화 되어 있으며, 폼 입력 양식 검사와 SQL 주입 방지, CSRF (Cross-site Request Forgery) 보호, XSS (Cross-Site Scripting) 방지 기능이 훌륭합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6597" class="elementor-tab-title" data-tab="7" role="button" aria-controls="elementor-tab-content-6597" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">FuelPHP (퓨얼PHP)</a>
					</div>

					<div id="elementor-tab-content-6597" class="elementor-tab-content elementor-clearfix" data-tab="7" role="region" aria-labelledby="elementor-tab-title-6597"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_fuelphp.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://www.fuelphp.com" rel="noopener">퓨얼PHP</a>는 모듈화 되어 있으며 확장이 가능한, 유연한 풀스택 PHP 프레임워크입니다. MVC 패턴을 지원할 뿐만 아니라, 진화된 형태의 HMVC(Hierarchical Model-View-Controller)를 아키텍쳐 차원에서 지원합니다. 입력 필터링, URI 필터링 및 출력 인코딩 등의 기능을 제공하여 보안 문제를 해결합니다.
[blank-line-20]
퓨얼PHP는 자체의 인증 프레임워크와 함께 많은 정교한 기능들을 갖고 있으며, 문서화도 잘 되어 있습니다. 퓨얼PHP는 다양한 형태의 엔드-투-엔드(End-to-End) 웹 솔루션을 개발하는데 적합합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6598" class="elementor-tab-title" data-tab="8" role="button" aria-controls="elementor-tab-content-6598" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Yii 2</a>
					</div>

					<div id="elementor-tab-content-6598" class="elementor-tab-content elementor-clearfix" data-tab="8" role="region" aria-labelledby="elementor-tab-title-6598"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_yii2.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://www.yiiframework.com" rel="noopener">Yii</a>는 가장 오래된 PHP 프레임워크 중 하나이며, 최신 버전인 Yii 2를 통해 많은 인기를 얻고 있습니다. Yii 2는 완전히 객체지향적이며 DRY(Do not Repeat Yourself) 코딩 개념을 기반으로 합니다. Yii 2는 강력한 레이지(Lazy) 로딩 기술을 통해 다른 프레임워크 보다 빠르게 동작하도록 만들어졌습니다.
[blank-line-20]
AJAX 및 JQuery와 통합 될 수 있으므로 대규모 웹 사이트 개발에 좋습니다. 또한 개발자가 Gii라는 웹기반의 인터페이스를 갖춘 강력한 클래스 코드 생성기를 사용하여, 필요한 코드를 대화식으로 생성할 수 있도록 합니다. Gii를 사용하면 객체지향 프로그래밍과 빠른 어플리케이션 프로토타입 개발이 가능합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6599" class="elementor-tab-title" data-tab="9" role="button" aria-controls="elementor-tab-content-6599" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Slim (슬림)</a>
					</div>

					<div id="elementor-tab-content-6599" class="elementor-tab-content elementor-clearfix" data-tab="9" role="region" aria-labelledby="elementor-tab-title-6599"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_slim.jpg" alt="" />
[blank-line-20]
<a class="external" href="http://www.slimframework.com" rel="noopener">슬림</a>은 일반적으로 RESTful API 및 RESTful 서비스를 개발하는 데 사용되는 경량의 마이크로 프레임워크입니다. 슬림은 미니멀하게 디자인된 프레임워크임에도 불구하고, 클라이언트 사이드 HTTP 캐싱, 세션 및 쿠키 라우팅, URL 라우팅, HTTP 요청을 통한 플래시 메시지 지원과 같은 다양한 기능을 제공합니다.
[blank-line-20]
슬림은 풀스택 PHP 프레임워크가 꼭 필요하지 않은, 소규모의 웹 애플리케이션 개발에 탁월합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-65910" class="elementor-tab-title" data-tab="10" role="button" aria-controls="elementor-tab-content-65910" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">PHPixie</a>
					</div>

					<div id="elementor-tab-content-65910" class="elementor-tab-content elementor-clearfix" data-tab="10" role="region" aria-labelledby="elementor-tab-title-65910"><img decoding="async" class="align-left width-300" src="/wp-content/uploads/2024/01/cv_blog_php_ranks_2018_phpixie.jpg" alt="" />
[blank-line-20]
<a class="external" href="https://phpixie.com" rel="noopener">PHPixie</a>는 읽기전용 웹 사이트를 위한 고성능 프레임워크를 만드는 것을 목표로, 2012년에 최초 릴리즈된 상대적으로 최신의 프레임워크입니다. PHPixie는 퓨얼PHP와 유사한 HMVC(Hierarchical Model-View-Controller) 디자인 패턴을 구현하고 있으며, 프레임워크 없이도 독립적으로 사용할 수 있는 컴포넌트로 구성되어 있습니다. PHPixie의 컴포넌트들은 모두 유닛 테스트를 거쳤으며, 최소한의 의존성만을 요구합니다.
[blank-line-20]
일반적인 ORM(Object-Relational Mapping), 캐싱, 입력 유효성 검사, 인증 및 권한 부여 기능을 제공합니다. PHPixie는 개발자가 HAML 마크업 언어를 사용하여 스키머 마이그레이션을 할 수 있도록 해주며, 정교한 라우팅 시스템을 만들 수 있도록 합니다.</div>
				</div>
								</div>
				</div>
				</div>
				<div class="elementor-element elementor-element-01a9b10 elementor-widget__width-initial elementor-widget elementor-widget-heading" data-id="01a9b10" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h3 class="elementor-heading-title elementor-size-default">가장 좋은 PHP 프레임워크는?</h3>		</div>
				</div>
				<div class="elementor-element elementor-element-d9cea25 elementor-widget elementor-widget-html" data-id="d9cea25" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			각 PHP 프레임워크는 장점과 함께 단점을 갖고 있으며, 서버 개발자들은 서로 다른 코딩 스타일과 환경을 갖고 있습니다.
<span class="blank-line-20"></span>
<ul>
  <li>코딩 스타일</li>
  <li>프레임워크 숙련도</li>
  <li>서버 시스템 환경</li>
  <li>프로젝트 요구사항</li>
</ul>
<span class="blank-line-20"></span>
위 조건들을 고려하여 개발팀이 처한 상황에서 최적의 프레임워크를 선정한다면, 그것이 해당 프로젝트를 위한 최고의 PHP 프레임워크가 될 것입니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>더 나은 성능을 위한 PHP 소프트웨어 스택</title>
		<link>https://www.coovil.net/php-stack/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Tue, 25 Dec 2018 00:22:15 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3129</guid>

					<description><![CDATA[PHP 서버 추천 소프트웨어 조합 램프(LAMP)는 Linux, Apache, MySQL, PHP(Perl, Python)의 머리글자를 딴 약어로, 리눅스 기반 웹호스팅에서 가장 많이 사용되는 오픈소스 서버 소프트웨어 스택입니다. 이 램프 스택에 포함된 PHP는 잘 동작하며, 서버 사이드 언어로서 역할을 충실히 수행해냅니다. 하지만 이 조합이 PHP 애플리케이션이 최고의 성능으로 동작하는 데 있어 최선은 아닙니다. 서버 머신으로부터 PHP 동작 성능을 최대로 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3129" class="elementor elementor-3129">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2018/12/cv_blog_header_10.jpg" class="attachment-full size-full wp-image-3469" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget__width-initial elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">PHP 서버 추천 소프트웨어 조합</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			램프(LAMP)는 Linux, Apache, MySQL, PHP(Perl, Python)의 머리글자를 딴 약어로, 리눅스 기반 웹호스팅에서 가장 많이 사용되는 오픈소스 서버 소프트웨어 스택입니다. 이 램프 스택에 포함된 PHP는 잘 동작하며, 서버 사이드 언어로서 역할을 충실히 수행해냅니다. 하지만 이 조합이 PHP 애플리케이션이 최고의 성능으로 동작하는 데 있어 최선은 아닙니다.<br>
<span class="blank-line-20"></span>
서버 머신으로부터 PHP 동작 성능을 최대로 끌어내기 위해서 쿠빌은 다음과 같은 소프트웨어 스택을 추천합니다.

		</div>
				</div>
				<div class="elementor-element elementor-element-3ed9f25 elementor-widget elementor-widget-toggle" data-id="3ed9f25" data-element_type="widget" data-widget_type="toggle.default">
				<div class="elementor-widget-container">
					<div class="elementor-toggle">
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6591" class="elementor-tab-title" data-tab="1" role="button" aria-controls="elementor-tab-content-6591" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Linux</a>
					</div>

					<div id="elementor-tab-content-6591" class="elementor-tab-content elementor-clearfix" data-tab="1" role="region" aria-labelledby="elementor-tab-title-6591">리눅스는 서버 용도로 제작된 배포본을 선택합니다.  데스크톱 용도의 리눅스 배포본은 불필요한 소프트웨어가 설치되어 시스템 리소스를 낭비하고 서버의 전체적인 동작 성능을 저하시킬 수 있습니다. 쿠빌은 <a class="external" href="https://rockylinux.org" rel="noopener">Rocky Linux</a>, Amazon Linux와 같은 래드햇 기반의 서버 용 리눅스 배포본을 주로 사용합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6592" class="elementor-tab-title" data-tab="2" role="button" aria-controls="elementor-tab-content-6592" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">PHP 8</a>
					</div>

					<div id="elementor-tab-content-6592" class="elementor-tab-content elementor-clearfix" data-tab="2" role="region" aria-labelledby="elementor-tab-title-6592"><p>PHP 8에 도입된 JIT(Just-In-Time) 컴파일러로 PHP는 동작 성능이 크게 향상되었습니다. JIT는 소프트웨어를 실행하는 동안 코드를 실시간으로 컴파일하여 성능을 향상시키는 기술이며, 기존의 PHP 코드베이스를 사용하면서도 성능 향상을 얻을 수 있도록 설계되었습니다.</p></div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6593" class="elementor-tab-title" data-tab="3" role="button" aria-controls="elementor-tab-content-6593" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">PHP-FPM</a>
					</div>

					<div id="elementor-tab-content-6593" class="elementor-tab-content elementor-clearfix" data-tab="3" role="region" aria-labelledby="elementor-tab-title-6593"><p>PHP-FPM(PHP FastCGI Process Manager)은 효율적인 프로세스 관리와 FastCGI 프로토콜을 통한 경량화된 통신으로 애플리케이션의 성능을 향상시키며, 프로세스 풀링과 로드 밸런싱을 통해 안정적이고 효율적인 서비스 제공을 지원합니다.</p></div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6594" class="elementor-tab-title" data-tab="4" role="button" aria-controls="elementor-tab-content-6594" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">팔콘 PHP</a>
					</div>

					<div id="elementor-tab-content-6594" class="elementor-tab-content elementor-clearfix" data-tab="4" role="region" aria-labelledby="elementor-tab-title-6594"><a href="/phalcon-php">Phalcon PHP</a> 프레임워크는 C 언어로 개발된 독특한 아키텍처를 통해 뛰어난 성능을 제공하며, 높은 확장성과 유연성을 갖춘 웹 애플리케이션 개발을 위한 강력한 도구로서 주목받고 있습니다. 이 독특한 구조는 사용자 요청을 처리하는 과정에서 매우 적은 오버헤드를 유발하며, 결과적으로 뛰어난 성능 향상을 실현합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6595" class="elementor-tab-title" data-tab="5" role="button" aria-controls="elementor-tab-content-6595" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">Nginx</a>
					</div>

					<div id="elementor-tab-content-6595" class="elementor-tab-content elementor-clearfix" data-tab="5" role="region" aria-labelledby="elementor-tab-title-6595"><a class="external" href="https://www.nginx.com" rel="noopener">Nginx</a> 웹 서버는 이벤트 기반 아키텍처를 사용해 메모리 사용량이 적고 더 빠르고 효율적으로 동작하며, 동시 접속 처리에서 Apache보다 훨씬 효율적이고 빠른 성능을 제공합니다.</div>
				</div>
							<div class="elementor-toggle-item">
					<div id="elementor-tab-title-6596" class="elementor-tab-title" data-tab="6" role="button" aria-controls="elementor-tab-content-6596" aria-expanded="false">
												<span class="elementor-toggle-icon elementor-toggle-icon-left" aria-hidden="true">
															<span class="elementor-toggle-icon-closed"><svg class="e-font-icon-svg e-fas-caret-right" viewBox="0 0 192 512" xmlns="http://www.w3.org/2000/svg"><path d="M0 384.662V127.338c0-17.818 21.543-26.741 34.142-14.142l128.662 128.662c7.81 7.81 7.81 20.474 0 28.284L34.142 398.804C21.543 411.404 0 402.48 0 384.662z"></path></svg></span>
								<span class="elementor-toggle-icon-opened"><svg class="elementor-toggle-icon-opened e-font-icon-svg e-fas-caret-up" viewBox="0 0 320 512" xmlns="http://www.w3.org/2000/svg"><path d="M288.662 352H31.338c-17.818 0-26.741-21.543-14.142-34.142l128.662-128.662c7.81-7.81 20.474-7.81 28.284 0l128.662 128.662c12.6 12.599 3.676 34.142-14.142 34.142z"></path></svg></span>
													</span>
												<a class="elementor-toggle-title" tabindex="0">포스트그레스큐엘</a>
					</div>

					<div id="elementor-tab-content-6596" class="elementor-tab-content elementor-clearfix" data-tab="6" role="region" aria-labelledby="elementor-tab-title-6596"><p><a class="external" href="https://www.postgresql.org" target="_blank" rel="noopener nofollow">PostgreSQL</a>은 현재 많은 기업과 개발자들 사이에서 인기를 얻고 있는 확장성 및 표준성을 강조하는 오픈 소스 데이터베이스입니다. PostgreSQL은 MySQL이나 MariaDB와는 다르게 엔터프라이즈급의 성능, 기능, 그리고 보안성을 제공하며, 동시에 오픈 소스로 제공되어 소규모 서비스부터 대규모 트래픽이 발생하는 대형 서비스까지 다양한 규모의 프로젝트에 대응할 수 있는 강력한 아키텍처를 갖추고 있습니다.</p></div>
				</div>
								</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>서버 모니터링 및 장애대응</title>
		<link>https://www.coovil.net/monitoring/</link>
		
		<dc:creator><![CDATA[user]]></dc:creator>
		<pubDate>Fri, 21 Dec 2018 02:26:55 +0000</pubDate>
				<category><![CDATA[기술 블로그]]></category>
		<guid isPermaLink="false">/?p=3107</guid>

					<description><![CDATA[서버 모니터링을 하는 이유 서버 트래픽은 항시 변화하며, 서버 트래픽에 따라 각종 서버 리소스의 물리적 사용 가능 용량은 계속 변화합니다. 리소스 부족 시 서버 어플리케이션은 오동작을 일으키고 서비스 전체에 장애를 초래할 수 있습니다. 또한, 서버에서 동작하는 다른 서비스 어플리케이션이 100% 항상 정상적으로 동작한다고 보장할 수는 없는 것이며, 서버 운영체제를 포함하여 어떠한 이유로든 서비스 장애는 발생할 [&#8230;]]]></description>
										<content:encoded><![CDATA[		<div data-elementor-type="wp-post" data-elementor-id="3107" class="elementor elementor-3107">
							<div class="elementor-element elementor-element-b014002 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="b014002" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
		<div class="elementor-element elementor-element-f7a9ded tech-blog e-flex e-con-boxed e-con e-parent" data-id="f7a9ded" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
				<div class="elementor-element elementor-element-65499fb box-outline elementor-widget elementor-widget-image" data-id="65499fb" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
															<img loading="lazy" decoding="async" width="1200" height="600" src="https://www.coovil.net/wp-content/uploads/2024/01/cv_blog_header_04.jpg" class="attachment-full size-full wp-image-3108" alt="" />															</div>
				</div>
				<div class="elementor-element elementor-element-c93b114 elementor-widget elementor-widget-heading" data-id="c93b114" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">서버 모니터링을 하는 이유</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-f0bbaec elementor-widget elementor-widget-html" data-id="f0bbaec" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			서버 트래픽은 항시 변화하며, 서버 트래픽에 따라 각종 서버 리소스의 물리적 사용 가능 용량은 계속 변화합니다. 리소스 부족 시 서버 어플리케이션은 오동작을 일으키고 서비스 전체에 장애를 초래할 수 있습니다. 또한, 서버에서 동작하는 다른 서비스 어플리케이션이 100% 항상 정상적으로 동작한다고 보장할 수는 없는 것이며, 서버 운영체제를 포함하여 어떠한 이유로든 서비스 장애는 발생할 수 있습니다. 기계적인 모니터링을 통하여 하루 24시간, 일주일에 7일, 매 순간 서버의 리소스 상태를 감시하고 트래픽 과잉, 메모리 부족, 디스크 부족 등 위험 상태에 도달하면 서버 관리자에게 메일 등으로 알려주어 사전 또는 사후에 대응할 수 있도록 합니다.<br>
<span class="blank-line-20"></span>
모니터링을 하는 주요 이유를 요약하면 다음과 같습니다.<br>
<span class="blank-line-20"></span>
<ul>
 	<li>서비스나 웹사이트가 항상 정상적으로 유지되도록 하기 위해</li>
 	<li>사용자 또는 고객에게 일관된 성능으로 서비스를 제공하기 위해</li>
 	<li>서비스 장애 발생 이전에 서버의 비정상적 상태을 미리 감지하여 사전에 대응하기 위해</li>
 	<li>서버 상태 기록을 통해 어떤 요일, 어떤 시간대에 사용자가 몰리는지 알고 기술적으로 그리고 마케팅적으로 이용하기 위해</li>
</ul>		</div>
				</div>
				<div class="elementor-element elementor-element-abc9d7f elementor-widget elementor-widget-heading" data-id="abc9d7f" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">장애대응을 하는 이유</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-78ddf77 elementor-widget elementor-widget-html" data-id="78ddf77" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			현재 모바일 서비스는 서버와 연동되어 동작하는 경우가 많습니다. 일반적으로 개발 아웃소싱을 줄 때 서버는 한번 만들어두면 그냥 놔두고 신경쓰지 않아도 되는 것으로 착각하기 쉽습니다. 서버 운영비를 지출하기도 아깝다고 생각하기 때문이고 별일 있겠나 싶은 마음도 있을 것입니다.<br>
<span class="blank-line-20"></span>
서비스가 활성화되지 못해 서버 트래픽이 더이상 늘어나지 않는다면 서버에도 별 문제가 발생하지 않을 것입니다. 하지만 서비스가 활성화되어 사용자 유입이 늘어나 서버 트래픽이 크게 늘어나게 되면 서버는 곧 장애 상황에 직면하게 됩니다. 언제 발생하지 모르는 서비스 장애상황에 24시간 대응하기 위해 3교대 인력을 확보하는 것도 부담스러운 일입니다. 따라서 서버 모니터링과 서버 장애대응은 전문적으로 수행할 수 있는 업체에 맡기는 것이 현명한 선택입니다.<br>
<span class="blank-line-20"></span>
장애대응을 하는 주요 이유를 요약하면 다음과 같습니다.<br>
<span class="blank-line-20"></span>
<ul>
 	<li>장애 발생 시 마다 서버를 단순 리부팅하는 원시적인 방법에서 탈피</li>
 	<li>장애 발생 시 직접 기술적인 처리가 가능한 전문인력이 대응</li>
 	<li>장애 발생 시 사전에 고객사와 협의하여 미리 정의한 '장애대응 메뉴얼'을 통해 체계적으로 대응</li>
 	<li>장애 발생 시 장애 원인을 분석하여 추후 재발 예방</li>
</ul>		</div>
				</div>
				<div class="elementor-element elementor-element-13a4972 elementor-widget elementor-widget-heading" data-id="13a4972" data-element_type="widget" data-widget_type="heading.default">
				<div class="elementor-widget-container">
			<h2 class="elementor-heading-title elementor-size-default">서버 모니터링 솔루션</h2>		</div>
				</div>
				<div class="elementor-element elementor-element-432cccb elementor-widget elementor-widget-html" data-id="432cccb" data-element_type="widget" data-widget_type="html.default">
				<div class="elementor-widget-container">
			쿠빌은 서버 모니터링을 위해 아마존 웹 서비스의 <a class="external" href="https://aws.amazon.com/ko/cloudwatch/" rel="noopener">클라우드 와치 (ClouldWatch)</a> 또는 오픈 소스 모니터링 솔루션인 <a class="external" href="http://munin-monitoring.org" rel="noopener">Munin</a>을 이용합니다.		</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-6d7f19f tech-blog e-flex e-con-boxed e-con e-parent" data-id="6d7f19f" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
		<div class="elementor-element elementor-element-fcd3401 e-con-full e-flex e-con e-child" data-id="fcd3401" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;full&quot;}">
				<div class="elementor-element elementor-element-0ca773f elementor-widget elementor-widget-image" data-id="0ca773f" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
												<figure class="wp-caption">
											<a href="https://aws.amazon.com/ko/cloudwatch" target="_blank" rel="nofollow noopener">
							<img loading="lazy" decoding="async" width="500" height="200" src="https://www.coovil.net/wp-content/uploads/2018/12/cv_blog_monitoring_01.jpg" class="attachment-full size-full wp-image-3115" alt="" />								</a>
											<figcaption class="widget-image-caption wp-caption-text">AWS CloudWatch</figcaption>
										</figure>
									</div>
				</div>
				</div>
		<div class="elementor-element elementor-element-c96479e e-con-full e-flex e-con e-child" data-id="c96479e" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;full&quot;}">
				<div class="elementor-element elementor-element-76d7efa elementor-widget elementor-widget-image" data-id="76d7efa" data-element_type="widget" data-widget_type="image.default">
				<div class="elementor-widget-container">
												<figure class="wp-caption">
											<a href="http://munin-monitoring.org" target="_blank" rel="nofollow noopener">
							<img loading="lazy" decoding="async" width="500" height="200" src="https://www.coovil.net/wp-content/uploads/2018/12/cv_blog_monitoring_02.jpg" class="attachment-full size-full wp-image-3116" alt="" />								</a>
											<figcaption class="widget-image-caption wp-caption-text">Munin</figcaption>
										</figure>
									</div>
				</div>
				</div>
					</div>
				</div>
		<div class="elementor-element elementor-element-0429c98 tech-blog-divider-edge e-flex e-con-boxed e-con e-parent" data-id="0429c98" data-element_type="container" data-settings="{&quot;content_width&quot;:&quot;boxed&quot;}" data-core-v316-plus="true">
					<div class="e-con-inner">
					</div>
				</div>
							</div>
		]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
