<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JH의 개발 기록</title>
    <link>https://jhlcpj.tistory.com/</link>
    <description>jhlcpj 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Wed, 15 Jul 2026 12:08:30 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Ejah</managingEditor>
    <item>
      <title>[20주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 89</title>
      <link>https://jhlcpj.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이프라인 모니터링&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/94</guid>
      <comments>https://jhlcpj.tistory.com/94#entry94comment</comments>
      <pubDate>Sun, 31 May 2026 19:01:25 +0900</pubDate>
    </item>
    <item>
      <title>[20주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 88</title>
      <link>https://jhlcpj.tistory.com/93</link>
      <description>&lt;h1 data-end=&quot;32&quot; data-start=&quot;0&quot; data-section-id=&quot;1xqf94r&quot;&gt;클라우드 컴퓨팅과 마이크로서비스 아키텍처 완벽 이해&lt;/h1&gt;
&lt;p data-end=&quot;60&quot; data-start=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 가장 많이 사용되는 현대 백엔드 구조&lt;/p&gt;
&lt;p data-end=&quot;256&quot; data-start=&quot;62&quot; data-ke-size=&quot;size16&quot;&gt;최근 대부분의 IT 서비스는 &amp;ldquo;클라우드 기반&amp;rdquo;으로 운영된다. 우리가 매일 사용하는 넷플릭스, 유튜브, 카카오톡, 쿠팡, 배달앱, 은행 서비스까지 거의 모두 클라우드 환경 위에서 동작하고 있다. 특히 AI 서비스와 실시간 데이터 처리, 대규모 트래픽이 중요해지면서 클라우드 컴퓨팅과 마이크로서비스 아키텍처(MSA)는 이제 선택이 아닌 필수가 되었다.&lt;/p&gt;
&lt;p data-end=&quot;319&quot; data-start=&quot;258&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 다음 내용을 중심으로 클라우드 컴퓨팅의 핵심 개념과 마이크로서비스 아키텍처를 쉽게 정리해보겠다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;466&quot; data-start=&quot;321&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;334&quot; data-start=&quot;321&quot; data-section-id=&quot;17mpzy&quot;&gt;클라우드 컴퓨팅이란?&lt;/li&gt;
&lt;li data-end=&quot;348&quot; data-start=&quot;335&quot; data-section-id=&quot;1lwqmuo&quot;&gt;클라우드의 주요 특징&lt;/li&gt;
&lt;li data-end=&quot;377&quot; data-start=&quot;349&quot; data-section-id=&quot;1on460s&quot;&gt;서비스 모델(IaaS / PaaS / SaaS)&lt;/li&gt;
&lt;li data-end=&quot;393&quot; data-start=&quot;378&quot; data-section-id=&quot;1v4jwld&quot;&gt;클라우드 경제성과 확장성&lt;/li&gt;
&lt;li data-end=&quot;413&quot; data-start=&quot;394&quot; data-section-id=&quot;16tau8j&quot;&gt;마이크로서비스 아키텍처(MSA)&lt;/li&gt;
&lt;li data-end=&quot;429&quot; data-start=&quot;414&quot; data-section-id=&quot;1fgw2zd&quot;&gt;모놀리식 구조와의 차이점&lt;/li&gt;
&lt;li data-end=&quot;447&quot; data-start=&quot;430&quot; data-section-id=&quot;1mu3i39&quot;&gt;실제 실무에서 사용하는 기술&lt;/li&gt;
&lt;li data-end=&quot;466&quot; data-start=&quot;448&quot; data-section-id=&quot;1ana2ll&quot;&gt;클라우드 환경에서의 개발 흐름&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;471&quot; data-start=&quot;468&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;489&quot; data-start=&quot;473&quot; data-section-id=&quot;zsxdxr&quot;&gt;1. 클라우드 컴퓨팅이란?&lt;/h1&gt;
&lt;p data-end=&quot;586&quot; data-start=&quot;491&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 컴퓨팅(Cloud Computing)은 인터넷을 통해 서버, 저장소, 데이터베이스, 네트워크, 소프트웨어 등의 IT 자원을 필요할 때 제공받아 사용하는 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;705&quot; data-start=&quot;588&quot; data-ke-size=&quot;size16&quot;&gt;예전에는 회사가 직접 서버 컴퓨터를 구매하고 서버실을 운영해야 했다. 하지만 클라우드 환경에서는 AWS, Azure, GCP 같은 클라우드 제공 업체가 이미 구축해 둔 인프라를 인터넷으로 빌려 사용할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;747&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;즉, 필요한 만큼만 서버를 사용하고 사용한 만큼 비용을 지불하는 구조다.&lt;/p&gt;
&lt;p data-end=&quot;773&quot; data-start=&quot;749&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 웹 서비스를 만든다고 가정해보자.&lt;/p&gt;
&lt;p data-end=&quot;781&quot; data-start=&quot;775&quot; data-ke-size=&quot;size16&quot;&gt;과거 방식:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;824&quot; data-start=&quot;782&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;792&quot; data-start=&quot;782&quot; data-section-id=&quot;7ou4qw&quot;&gt;직접 서버 구매&lt;/li&gt;
&lt;li data-end=&quot;801&quot; data-start=&quot;793&quot; data-section-id=&quot;1sfqz0h&quot;&gt;서버실 운영&lt;/li&gt;
&lt;li data-end=&quot;811&quot; data-start=&quot;802&quot; data-section-id=&quot;n75yi1&quot;&gt;네트워크 구성&lt;/li&gt;
&lt;li data-end=&quot;824&quot; data-start=&quot;812&quot; data-section-id=&quot;1qk4aah&quot;&gt;유지보수 직접 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;834&quot; data-start=&quot;826&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 방식:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;889&quot; data-start=&quot;835&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;847&quot; data-start=&quot;835&quot; data-section-id=&quot;mjmcdx&quot;&gt;AWS EC2 생성&lt;/li&gt;
&lt;li data-end=&quot;865&quot; data-start=&quot;848&quot; data-section-id=&quot;1mbsiof&quot;&gt;몇 분 만에 서버 사용 가능&lt;/li&gt;
&lt;li data-end=&quot;876&quot; data-start=&quot;866&quot; data-section-id=&quot;1cw9r84&quot;&gt;자동 확장 가능&lt;/li&gt;
&lt;li data-end=&quot;889&quot; data-start=&quot;877&quot; data-section-id=&quot;acx64s&quot;&gt;유지보수 부담 감소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;933&quot; data-start=&quot;891&quot; data-ke-size=&quot;size16&quot;&gt;이러한 특징 덕분에 스타트업부터 대기업까지 대부분 클라우드 환경을 사용한다.&lt;/p&gt;
&lt;hr data-end=&quot;938&quot; data-start=&quot;935&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;960&quot; data-start=&quot;940&quot; data-section-id=&quot;1tbjly3&quot;&gt;2. 클라우드 컴퓨팅의 주요 특징&lt;/h1&gt;
&lt;h2 data-end=&quot;1005&quot; data-start=&quot;962&quot; data-section-id=&quot;gcdgu6&quot; data-ke-size=&quot;size26&quot;&gt;2-1. 온디맨드 셀프 서비스(On-Demand Self Service)&lt;/h2&gt;
&lt;p data-end=&quot;1040&quot; data-start=&quot;1007&quot; data-ke-size=&quot;size16&quot;&gt;사용자가 직접 필요한 자원을 즉시 생성하고 사용할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;1066&quot; data-start=&quot;1042&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 AWS에서 버튼 몇 번만 누르면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1105&quot; data-start=&quot;1067&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1074&quot; data-start=&quot;1067&quot; data-section-id=&quot;u9kvz0&quot;&gt;서버 생성&lt;/li&gt;
&lt;li data-end=&quot;1086&quot; data-start=&quot;1075&quot; data-section-id=&quot;1r5www0&quot;&gt;데이터베이스 생성&lt;/li&gt;
&lt;li data-end=&quot;1096&quot; data-start=&quot;1087&quot; data-section-id=&quot;dikb1o&quot;&gt;스토리지 생성&lt;/li&gt;
&lt;li data-end=&quot;1105&quot; data-start=&quot;1097&quot; data-section-id=&quot;1ugarhd&quot;&gt;CDN 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1115&quot; data-start=&quot;1107&quot; data-ke-size=&quot;size16&quot;&gt;등이 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;1148&quot; data-start=&quot;1117&quot; data-ke-size=&quot;size16&quot;&gt;관리자 승인 없이 바로 사용할 수 있다는 점이 핵심이다.&lt;/p&gt;
&lt;hr data-end=&quot;1153&quot; data-start=&quot;1150&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1197&quot; data-start=&quot;1155&quot; data-section-id=&quot;d1ilpn&quot; data-ke-size=&quot;size26&quot;&gt;2-2. 광범위한 네트워크 접근(Broad Network Access)&lt;/h2&gt;
&lt;p data-end=&quot;1226&quot; data-start=&quot;1199&quot; data-ke-size=&quot;size16&quot;&gt;인터넷만 연결되어 있다면 어디서든 접근 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;1230&quot; data-start=&quot;1228&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1257&quot; data-start=&quot;1231&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1236&quot; data-start=&quot;1231&quot; data-section-id=&quot;20dall&quot;&gt;노트북&lt;/li&gt;
&lt;li data-end=&quot;1243&quot; data-start=&quot;1237&quot; data-section-id=&quot;dimrkc&quot;&gt;스마트폰&lt;/li&gt;
&lt;li data-end=&quot;1249&quot; data-start=&quot;1244&quot; data-section-id=&quot;2hy8v3&quot;&gt;태블릿&lt;/li&gt;
&lt;li data-end=&quot;1257&quot; data-start=&quot;1250&quot; data-section-id=&quot;1yked6j&quot;&gt;회사 PC&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1285&quot; data-start=&quot;1259&quot; data-ke-size=&quot;size16&quot;&gt;모두 동일한 클라우드 서비스를 이용할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1290&quot; data-start=&quot;1287&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1323&quot; data-start=&quot;1292&quot; data-section-id=&quot;1nlxmkx&quot; data-ke-size=&quot;size26&quot;&gt;2-3. 자원 풀링(Resource Pooling)&lt;/h2&gt;
&lt;p data-end=&quot;1370&quot; data-start=&quot;1325&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 제공 업체는 거대한 데이터센터를 운영하며 여러 사용자가 자원을 공유한다.&lt;/p&gt;
&lt;p data-end=&quot;1378&quot; data-start=&quot;1372&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1408&quot; data-start=&quot;1379&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1386&quot; data-start=&quot;1379&quot; data-section-id=&quot;1xhbdzx&quot;&gt;비용 절감&lt;/li&gt;
&lt;li data-end=&quot;1399&quot; data-start=&quot;1387&quot; data-section-id=&quot;1obpik4&quot;&gt;효율적인 자원 사용&lt;/li&gt;
&lt;li data-end=&quot;1408&quot; data-start=&quot;1400&quot; data-section-id=&quot;qpp9sy&quot;&gt;높은 가용성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1421&quot; data-start=&quot;1410&quot; data-ke-size=&quot;size16&quot;&gt;을 제공할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1426&quot; data-start=&quot;1423&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1460&quot; data-start=&quot;1428&quot; data-section-id=&quot;batfgm&quot; data-ke-size=&quot;size26&quot;&gt;2-4. 빠른 탄력성(Rapid Elasticity)&lt;/h2&gt;
&lt;p data-end=&quot;1488&quot; data-start=&quot;1462&quot; data-ke-size=&quot;size16&quot;&gt;트래픽 증가 시 자동으로 서버를 늘릴 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;1493&quot; data-start=&quot;1490&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1547&quot; data-start=&quot;1494&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1507&quot; data-start=&quot;1494&quot; data-section-id=&quot;1ab15si&quot;&gt;평소 서버 2대 운영&lt;/li&gt;
&lt;li data-end=&quot;1530&quot; data-start=&quot;1508&quot; data-section-id=&quot;ex4pyj&quot;&gt;이벤트 기간 서버 20대로 자동 확장&lt;/li&gt;
&lt;li data-end=&quot;1547&quot; data-start=&quot;1531&quot; data-section-id=&quot;1keh90s&quot;&gt;이벤트 종료 후 다시 축소&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1579&quot; data-start=&quot;1549&quot; data-ke-size=&quot;size16&quot;&gt;이를 오토스케일링(Auto Scaling)이라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;1606&quot; data-start=&quot;1581&quot; data-ke-size=&quot;size16&quot;&gt;실제 대규모 서비스에서 매우 중요한 기능이다.&lt;/p&gt;
&lt;hr data-end=&quot;1611&quot; data-start=&quot;1608&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1649&quot; data-start=&quot;1613&quot; data-section-id=&quot;13o0vv4&quot; data-ke-size=&quot;size26&quot;&gt;2-5. 측정 가능한 서비스(Measured Service)&lt;/h2&gt;
&lt;p data-end=&quot;1667&quot; data-start=&quot;1651&quot; data-ke-size=&quot;size16&quot;&gt;사용량 기반 과금이 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;1671&quot; data-start=&quot;1669&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1711&quot; data-start=&quot;1672&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1681&quot; data-start=&quot;1672&quot; data-section-id=&quot;1wkp42q&quot;&gt;CPU 사용량&lt;/li&gt;
&lt;li data-end=&quot;1689&quot; data-start=&quot;1682&quot; data-section-id=&quot;1grnun0&quot;&gt;저장 공간&lt;/li&gt;
&lt;li data-end=&quot;1700&quot; data-start=&quot;1690&quot; data-section-id=&quot;1j6uoq1&quot;&gt;네트워크 트래픽&lt;/li&gt;
&lt;li data-end=&quot;1711&quot; data-start=&quot;1701&quot; data-section-id=&quot;123x2xd&quot;&gt;API 요청 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1728&quot; data-start=&quot;1713&quot; data-ke-size=&quot;size16&quot;&gt;사용한 만큼만 비용을 낸다.&lt;/p&gt;
&lt;hr data-end=&quot;1733&quot; data-start=&quot;1730&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1751&quot; data-start=&quot;1735&quot; data-section-id=&quot;sg0ak3&quot;&gt;3. 클라우드 서비스 모델&lt;/h1&gt;
&lt;p data-end=&quot;1781&quot; data-start=&quot;1753&quot; data-ke-size=&quot;size16&quot;&gt;클라우드는 제공 범위에 따라 크게 3가지로 나뉜다.&lt;/p&gt;
&lt;hr data-end=&quot;1786&quot; data-start=&quot;1783&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1829&quot; data-start=&quot;1788&quot; data-section-id=&quot;1waxa5x&quot;&gt;3-1. IaaS (Infrastructure as a Service)&lt;/h1&gt;
&lt;p data-end=&quot;1853&quot; data-start=&quot;1831&quot; data-ke-size=&quot;size16&quot;&gt;가장 기본적인 인프라를 제공하는 형태다.&lt;/p&gt;
&lt;p data-end=&quot;1858&quot; data-start=&quot;1855&quot; data-ke-size=&quot;size16&quot;&gt;제공:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1884&quot; data-start=&quot;1859&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1863&quot; data-start=&quot;1859&quot; data-section-id=&quot;yim8c0&quot;&gt;서버&lt;/li&gt;
&lt;li data-end=&quot;1870&quot; data-start=&quot;1864&quot; data-section-id=&quot;1u3o9sk&quot;&gt;네트워크&lt;/li&gt;
&lt;li data-end=&quot;1877&quot; data-start=&quot;1871&quot; data-section-id=&quot;domev4&quot;&gt;스토리지&lt;/li&gt;
&lt;li data-end=&quot;1884&quot; data-start=&quot;1878&quot; data-section-id=&quot;1wr97w1&quot;&gt;가상머신&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1891&quot; data-start=&quot;1886&quot; data-ke-size=&quot;size16&quot;&gt;사용자는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1919&quot; data-start=&quot;1892&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1899&quot; data-start=&quot;1892&quot; data-section-id=&quot;16v66dk&quot;&gt;OS 설치&lt;/li&gt;
&lt;li data-end=&quot;1907&quot; data-start=&quot;1900&quot; data-section-id=&quot;u9kqap&quot;&gt;서버 설정&lt;/li&gt;
&lt;li data-end=&quot;1919&quot; data-start=&quot;1908&quot; data-section-id=&quot;7p76ew&quot;&gt;애플리케이션 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1935&quot; data-start=&quot;1921&quot; data-ke-size=&quot;size16&quot;&gt;등을 직접 관리해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1944&quot; data-start=&quot;1937&quot; data-ke-size=&quot;size16&quot;&gt;대표 서비스:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1989&quot; data-start=&quot;1945&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1954&quot; data-start=&quot;1945&quot; data-section-id=&quot;17n9ypl&quot;&gt;AWS EC2&lt;/li&gt;
&lt;li data-end=&quot;1978&quot; data-start=&quot;1955&quot; data-section-id=&quot;1bdfska&quot;&gt;Google Compute Engine&lt;/li&gt;
&lt;li data-end=&quot;1989&quot; data-start=&quot;1979&quot; data-section-id=&quot;1gnvl4a&quot;&gt;Azure VM&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1994&quot; data-start=&quot;1991&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2016&quot; data-start=&quot;1995&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2004&quot; data-start=&quot;1995&quot; data-section-id=&quot;14aqx2a&quot;&gt;자유도가 높음&lt;/li&gt;
&lt;li data-end=&quot;2016&quot; data-start=&quot;2005&quot; data-section-id=&quot;1nf6r08&quot;&gt;세밀한 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2021&quot; data-start=&quot;2018&quot; data-ke-size=&quot;size16&quot;&gt;단점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2032&quot; data-start=&quot;2022&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2032&quot; data-start=&quot;2022&quot; data-section-id=&quot;1j0h9fx&quot;&gt;관리 부담 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2037&quot; data-start=&quot;2034&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2074&quot; data-start=&quot;2039&quot; data-section-id=&quot;wyqj4n&quot;&gt;3-2. PaaS (Platform as a Service)&lt;/h1&gt;
&lt;p data-end=&quot;2093&quot; data-start=&quot;2076&quot; data-ke-size=&quot;size16&quot;&gt;개발 환경까지 제공하는 형태다.&lt;/p&gt;
&lt;p data-end=&quot;2112&quot; data-start=&quot;2095&quot; data-ke-size=&quot;size16&quot;&gt;사용자는 코드만 배포하면 된다.&lt;/p&gt;
&lt;p data-end=&quot;2121&quot; data-start=&quot;2114&quot; data-ke-size=&quot;size16&quot;&gt;대표 서비스:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2172&quot; data-start=&quot;2122&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2130&quot; data-start=&quot;2122&quot; data-section-id=&quot;726xlu&quot;&gt;Render&lt;/li&gt;
&lt;li data-end=&quot;2139&quot; data-start=&quot;2131&quot; data-section-id=&quot;1mrvysm&quot;&gt;Heroku&lt;/li&gt;
&lt;li data-end=&quot;2148&quot; data-start=&quot;2140&quot; data-section-id=&quot;9hnmn7&quot;&gt;Vercel&lt;/li&gt;
&lt;li data-end=&quot;2172&quot; data-start=&quot;2149&quot; data-section-id=&quot;175mx41&quot;&gt;AWS Elastic Beanstalk&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2205&quot; data-start=&quot;2174&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 Node.js 서버를 Render에 배포하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2238&quot; data-start=&quot;2206&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2213&quot; data-start=&quot;2206&quot; data-section-id=&quot;u9kuy5&quot;&gt;서버 세팅&lt;/li&gt;
&lt;li data-end=&quot;2221&quot; data-start=&quot;2214&quot; data-section-id=&quot;floupp&quot;&gt;빌드 환경&lt;/li&gt;
&lt;li data-end=&quot;2229&quot; data-start=&quot;2222&quot; data-section-id=&quot;16pe7vn&quot;&gt;HTTPS&lt;/li&gt;
&lt;li data-end=&quot;2238&quot; data-start=&quot;2230&quot; data-section-id=&quot;1j7imw9&quot;&gt;배포 자동화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2254&quot; data-start=&quot;2240&quot; data-ke-size=&quot;size16&quot;&gt;등을 플랫폼이 처리해준다.&lt;/p&gt;
&lt;p data-end=&quot;2280&quot; data-start=&quot;2256&quot; data-ke-size=&quot;size16&quot;&gt;실무에서도 빠른 배포를 위해 많이 사용한다.&lt;/p&gt;
&lt;hr data-end=&quot;2285&quot; data-start=&quot;2282&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2322&quot; data-start=&quot;2287&quot; data-section-id=&quot;1u5i0w5&quot;&gt;3-3. SaaS (Software as a Service)&lt;/h1&gt;
&lt;p data-end=&quot;2345&quot; data-start=&quot;2324&quot; data-ke-size=&quot;size16&quot;&gt;완성된 소프트웨어를 사용하는 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;2353&quot; data-start=&quot;2347&quot; data-ke-size=&quot;size16&quot;&gt;대표 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2400&quot; data-start=&quot;2354&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2361&quot; data-start=&quot;2354&quot; data-section-id=&quot;16zvg6e&quot;&gt;Gmail&lt;/li&gt;
&lt;li data-end=&quot;2370&quot; data-start=&quot;2362&quot; data-section-id=&quot;1t1y92t&quot;&gt;Notion&lt;/li&gt;
&lt;li data-end=&quot;2384&quot; data-start=&quot;2371&quot; data-section-id=&quot;1cri76i&quot;&gt;Google Docs&lt;/li&gt;
&lt;li data-end=&quot;2392&quot; data-start=&quot;2385&quot; data-section-id=&quot;178nx5q&quot;&gt;Slack&lt;/li&gt;
&lt;li data-end=&quot;2400&quot; data-start=&quot;2393&quot; data-section-id=&quot;170qsrw&quot;&gt;Figma&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2425&quot; data-start=&quot;2402&quot; data-ke-size=&quot;size16&quot;&gt;사용자는 설치 없이 바로 사용할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2430&quot; data-start=&quot;2427&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2450&quot; data-start=&quot;2432&quot; data-section-id=&quot;12q32ft&quot;&gt;4. 클라우드의 경제성과 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;2468&quot; data-start=&quot;2452&quot; data-section-id=&quot;h8tzvy&quot; data-ke-size=&quot;size26&quot;&gt;4-1. 초기 비용 절감&lt;/h2&gt;
&lt;p data-end=&quot;2486&quot; data-start=&quot;2470&quot; data-ke-size=&quot;size16&quot;&gt;서버 구매 비용이 필요 없다.&lt;/p&gt;
&lt;p data-end=&quot;2498&quot; data-start=&quot;2488&quot; data-ke-size=&quot;size16&quot;&gt;스타트업 입장에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2524&quot; data-start=&quot;2499&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2509&quot; data-start=&quot;2499&quot; data-section-id=&quot;61czw0&quot;&gt;초기 투자 감소&lt;/li&gt;
&lt;li data-end=&quot;2524&quot; data-start=&quot;2510&quot; data-section-id=&quot;1fovo95&quot;&gt;빠른 서비스 출시 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2541&quot; data-start=&quot;2526&quot; data-ke-size=&quot;size16&quot;&gt;이라는 엄청난 장점이 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2546&quot; data-start=&quot;2543&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2563&quot; data-start=&quot;2548&quot; data-section-id=&quot;csorn4&quot; data-ke-size=&quot;size26&quot;&gt;4-2. 유지보수 감소&lt;/h2&gt;
&lt;p data-end=&quot;2582&quot; data-start=&quot;2565&quot; data-ke-size=&quot;size16&quot;&gt;하드웨어 관리 부담이 줄어든다.&lt;/p&gt;
&lt;p data-end=&quot;2593&quot; data-start=&quot;2584&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 업체가:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2622&quot; data-start=&quot;2594&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2601&quot; data-start=&quot;2594&quot; data-section-id=&quot;u9eukc&quot;&gt;서버 관리&lt;/li&gt;
&lt;li data-end=&quot;2611&quot; data-start=&quot;2602&quot; data-section-id=&quot;n75ml4&quot;&gt;네트워크 관리&lt;/li&gt;
&lt;li data-end=&quot;2622&quot; data-start=&quot;2612&quot; data-section-id=&quot;m5m3yd&quot;&gt;데이터센터 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2635&quot; data-start=&quot;2624&quot; data-ke-size=&quot;size16&quot;&gt;등을 대신 처리한다.&lt;/p&gt;
&lt;hr data-end=&quot;2640&quot; data-start=&quot;2637&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2660&quot; data-start=&quot;2642&quot; data-section-id=&quot;qs81c8&quot; data-ke-size=&quot;size26&quot;&gt;4-3. 글로벌 서비스 가능&lt;/h2&gt;
&lt;p data-end=&quot;2688&quot; data-start=&quot;2662&quot; data-ke-size=&quot;size16&quot;&gt;AWS 같은 서비스는 전 세계 리전을 제공한다.&lt;/p&gt;
&lt;p data-end=&quot;2692&quot; data-start=&quot;2690&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2712&quot; data-start=&quot;2693&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2697&quot; data-start=&quot;2693&quot; data-section-id=&quot;yilrbg&quot;&gt;서울&lt;/li&gt;
&lt;li data-end=&quot;2702&quot; data-start=&quot;2698&quot; data-section-id=&quot;yi0co8&quot;&gt;도쿄&lt;/li&gt;
&lt;li data-end=&quot;2707&quot; data-start=&quot;2703&quot; data-section-id=&quot;yhyo1p&quot;&gt;미국&lt;/li&gt;
&lt;li data-end=&quot;2712&quot; data-start=&quot;2708&quot; data-section-id=&quot;yil8xh&quot;&gt;유럽&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2730&quot; data-start=&quot;2714&quot; data-ke-size=&quot;size16&quot;&gt;등에 서버를 배포할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2760&quot; data-start=&quot;2732&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 글로벌 서비스를 빠르게 구축할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2765&quot; data-start=&quot;2762&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2781&quot; data-start=&quot;2767&quot; data-section-id=&quot;1hxoi4s&quot; data-ke-size=&quot;size26&quot;&gt;4-4. 높은 가용성&lt;/h2&gt;
&lt;p data-end=&quot;2803&quot; data-start=&quot;2783&quot; data-ke-size=&quot;size16&quot;&gt;장애 발생 시 자동 복구가 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;2807&quot; data-start=&quot;2805&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2846&quot; data-start=&quot;2808&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2818&quot; data-start=&quot;2808&quot; data-section-id=&quot;1gs0gs4&quot;&gt;서버 장애 발생&lt;/li&gt;
&lt;li data-end=&quot;2833&quot; data-start=&quot;2819&quot; data-section-id=&quot;6u3w85&quot;&gt;다른 서버로 자동 전환&lt;/li&gt;
&lt;li data-end=&quot;2846&quot; data-start=&quot;2834&quot; data-section-id=&quot;xj9ocp&quot;&gt;서비스 중단 최소화&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2865&quot; data-start=&quot;2848&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 매우 중요한 요소다.&lt;/p&gt;
&lt;hr data-end=&quot;2870&quot; data-start=&quot;2867&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2889&quot; data-start=&quot;2872&quot; data-section-id=&quot;hn9470&quot;&gt;5. 클라우드와 가상화 기술&lt;/h1&gt;
&lt;p data-end=&quot;2931&quot; data-start=&quot;2891&quot; data-ke-size=&quot;size16&quot;&gt;클라우드의 핵심 기술 중 하나는 가상화(Virtualization)이다.&lt;/p&gt;
&lt;p data-end=&quot;2972&quot; data-start=&quot;2933&quot; data-ke-size=&quot;size16&quot;&gt;하나의 물리 서버를 여러 개의 가상 서버처럼 나누어 사용하는 기술이다.&lt;/p&gt;
&lt;p data-end=&quot;2980&quot; data-start=&quot;2974&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3011&quot; data-start=&quot;2981&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2992&quot; data-start=&quot;2981&quot; data-section-id=&quot;vx6wxk&quot;&gt;하나의 물리 서버&lt;/li&gt;
&lt;li data-end=&quot;3011&quot; data-start=&quot;2993&quot; data-section-id=&quot;1cz80o1&quot;&gt;여러 사용자가 독립적으로 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3021&quot; data-start=&quot;3013&quot; data-ke-size=&quot;size16&quot;&gt;가능하게 된다.&lt;/p&gt;
&lt;p data-end=&quot;3056&quot; data-start=&quot;3023&quot; data-ke-size=&quot;size16&quot;&gt;최근에는 Docker 기반 컨테이너 기술도 매우 중요해졌다.&lt;/p&gt;
&lt;hr data-end=&quot;3061&quot; data-start=&quot;3058&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3080&quot; data-start=&quot;3063&quot; data-section-id=&quot;1igbf6&quot;&gt;6. 컨테이너와 Docker&lt;/h1&gt;
&lt;p data-end=&quot;3113&quot; data-start=&quot;3082&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너는 애플리케이션 실행 환경을 패키징하는 기술이다.&lt;/p&gt;
&lt;p data-end=&quot;3128&quot; data-start=&quot;3115&quot; data-ke-size=&quot;size16&quot;&gt;Docker를 사용하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3160&quot; data-start=&quot;3129&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3140&quot; data-start=&quot;3129&quot; data-section-id=&quot;55tgl0&quot;&gt;동일한 환경 유지&lt;/li&gt;
&lt;li data-end=&quot;3149&quot; data-start=&quot;3141&quot; data-section-id=&quot;1jpjtvs&quot;&gt;배포 간소화&lt;/li&gt;
&lt;li data-end=&quot;3160&quot; data-start=&quot;3150&quot; data-section-id=&quot;uasruw&quot;&gt;실행 속도 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3169&quot; data-start=&quot;3162&quot; data-ke-size=&quot;size16&quot;&gt;이 가능하다.&lt;/p&gt;
&lt;p data-end=&quot;3174&quot; data-start=&quot;3171&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;docker build .
docker run&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3245&quot; data-start=&quot;3214&quot; data-ke-size=&quot;size16&quot;&gt;개발 환경과 운영 환경이 동일해지는 것이 핵심 장점이다.&lt;/p&gt;
&lt;hr data-end=&quot;3250&quot; data-start=&quot;3247&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3276&quot; data-start=&quot;3252&quot; data-section-id=&quot;oh5ts1&quot;&gt;7. Kubernetes와 오케스트레이션&lt;/h1&gt;
&lt;p data-end=&quot;3303&quot; data-start=&quot;3278&quot; data-ke-size=&quot;size16&quot;&gt;서비스 규모가 커지면 컨테이너 수가 많아진다.&lt;/p&gt;
&lt;p data-end=&quot;3330&quot; data-start=&quot;3305&quot; data-ke-size=&quot;size16&quot;&gt;이때 Kubernetes(K8s)가 사용된다.&lt;/p&gt;
&lt;p data-end=&quot;3335&quot; data-start=&quot;3332&quot; data-ke-size=&quot;size16&quot;&gt;역할:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3373&quot; data-start=&quot;3336&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3348&quot; data-start=&quot;3336&quot; data-section-id=&quot;lgu2it&quot;&gt;컨테이너 자동 배포&lt;/li&gt;
&lt;li data-end=&quot;3356&quot; data-start=&quot;3349&quot; data-section-id=&quot;1hocbc&quot;&gt;자동 복구&lt;/li&gt;
&lt;li data-end=&quot;3365&quot; data-start=&quot;3357&quot; data-section-id=&quot;opks6t&quot;&gt;오토스케일링&lt;/li&gt;
&lt;li data-end=&quot;3373&quot; data-start=&quot;3366&quot; data-section-id=&quot;5hnjpt&quot;&gt;로드밸런싱&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3400&quot; data-start=&quot;3375&quot; data-ke-size=&quot;size16&quot;&gt;대규모 서비스 운영에서 사실상 표준 기술이다.&lt;/p&gt;
&lt;hr data-end=&quot;3405&quot; data-start=&quot;3402&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3431&quot; data-start=&quot;3407&quot; data-section-id=&quot;127s7bo&quot;&gt;8. 마이크로서비스 아키텍처(MSA)란?&lt;/h1&gt;
&lt;p data-end=&quot;3473&quot; data-start=&quot;3433&quot; data-ke-size=&quot;size16&quot;&gt;마이크로서비스 아키텍처는 서비스를 작은 단위로 분리하여 개발하는 구조다.&lt;/p&gt;
&lt;p data-end=&quot;3494&quot; data-start=&quot;3475&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 쇼핑몰 서비스가 있다면:&lt;/p&gt;
&lt;p data-end=&quot;3504&quot; data-start=&quot;3496&quot; data-ke-size=&quot;size16&quot;&gt;모놀리식 구조:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3530&quot; data-start=&quot;3505&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3510&quot; data-start=&quot;3505&quot; data-section-id=&quot;20xvn8&quot;&gt;로그인&lt;/li&gt;
&lt;li data-end=&quot;3515&quot; data-start=&quot;3511&quot; data-section-id=&quot;yi3n5w&quot;&gt;결제&lt;/li&gt;
&lt;li data-end=&quot;3520&quot; data-start=&quot;3516&quot; data-section-id=&quot;yiksfg&quot;&gt;주문&lt;/li&gt;
&lt;li data-end=&quot;3525&quot; data-start=&quot;3521&quot; data-section-id=&quot;yilyip&quot;&gt;상품&lt;/li&gt;
&lt;li data-end=&quot;3530&quot; data-start=&quot;3526&quot; data-section-id=&quot;yilgwo&quot;&gt;알림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3551&quot; data-start=&quot;3532&quot; data-ke-size=&quot;size16&quot;&gt;모든 기능이 하나의 프로젝트에 존재&lt;/p&gt;
&lt;p data-end=&quot;3560&quot; data-start=&quot;3553&quot; data-ke-size=&quot;size16&quot;&gt;MSA 구조:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3605&quot; data-start=&quot;3561&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3569&quot; data-start=&quot;3561&quot; data-section-id=&quot;1y7e9xt&quot;&gt;인증 서비스&lt;/li&gt;
&lt;li data-end=&quot;3578&quot; data-start=&quot;3570&quot; data-section-id=&quot;15zzlug&quot;&gt;결제 서비스&lt;/li&gt;
&lt;li data-end=&quot;3587&quot; data-start=&quot;3579&quot; data-section-id=&quot;y0vsfk&quot;&gt;주문 서비스&lt;/li&gt;
&lt;li data-end=&quot;3596&quot; data-start=&quot;3588&quot; data-section-id=&quot;11uj4f1&quot;&gt;상품 서비스&lt;/li&gt;
&lt;li data-end=&quot;3605&quot; data-start=&quot;3597&quot; data-section-id=&quot;1pvt8fp&quot;&gt;채팅 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3618&quot; data-start=&quot;3607&quot; data-ke-size=&quot;size16&quot;&gt;각각 독립적으로 분리&lt;/p&gt;
&lt;hr data-end=&quot;3623&quot; data-start=&quot;3620&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3643&quot; data-start=&quot;3625&quot; data-section-id=&quot;1lghvwp&quot;&gt;9. 모놀리식 아키텍처와 비교&lt;/h1&gt;
&lt;h2 data-end=&quot;3655&quot; data-start=&quot;3645&quot; data-section-id=&quot;1lvl7pc&quot; data-ke-size=&quot;size26&quot;&gt;모놀리식 구조&lt;/h2&gt;
&lt;p data-end=&quot;3660&quot; data-start=&quot;3657&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3688&quot; data-start=&quot;3661&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3671&quot; data-start=&quot;3661&quot; data-section-id=&quot;o3875o&quot;&gt;초기 개발 쉬움&lt;/li&gt;
&lt;li data-end=&quot;3679&quot; data-start=&quot;3672&quot; data-section-id=&quot;aek5sw&quot;&gt;구조 단순&lt;/li&gt;
&lt;li data-end=&quot;3688&quot; data-start=&quot;3680&quot; data-section-id=&quot;1ra0i7o&quot;&gt;테스트 간단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3693&quot; data-start=&quot;3690&quot; data-ke-size=&quot;size16&quot;&gt;단점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3733&quot; data-start=&quot;3694&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3707&quot; data-start=&quot;3694&quot; data-section-id=&quot;18nbug1&quot;&gt;규모가 커질수록 복잡&lt;/li&gt;
&lt;li data-end=&quot;3718&quot; data-start=&quot;3708&quot; data-section-id=&quot;dgoo8t&quot;&gt;배포 부담 증가&lt;/li&gt;
&lt;li data-end=&quot;3733&quot; data-start=&quot;3719&quot; data-section-id=&quot;buqozp&quot;&gt;일부 장애가 전체 영향&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3738&quot; data-start=&quot;3735&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3753&quot; data-start=&quot;3740&quot; data-section-id=&quot;1xzgd49&quot; data-ke-size=&quot;size26&quot;&gt;마이크로서비스 구조&lt;/h2&gt;
&lt;p data-end=&quot;3758&quot; data-start=&quot;3755&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3797&quot; data-start=&quot;3759&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3769&quot; data-start=&quot;3759&quot; data-section-id=&quot;185jps9&quot;&gt;독립 배포 가능&lt;/li&gt;
&lt;li data-end=&quot;3777&quot; data-start=&quot;3770&quot; data-section-id=&quot;m7osq0&quot;&gt;장애 격리&lt;/li&gt;
&lt;li data-end=&quot;3788&quot; data-start=&quot;3778&quot; data-section-id=&quot;1uv25op&quot;&gt;팀별 개발 가능&lt;/li&gt;
&lt;li data-end=&quot;3797&quot; data-start=&quot;3789&quot; data-section-id=&quot;u5xeox&quot;&gt;확장성 우수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3802&quot; data-start=&quot;3799&quot; data-ke-size=&quot;size16&quot;&gt;단점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3838&quot; data-start=&quot;3803&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3814&quot; data-start=&quot;3803&quot; data-section-id=&quot;959fz9&quot;&gt;운영 복잡성 증가&lt;/li&gt;
&lt;li data-end=&quot;3827&quot; data-start=&quot;3815&quot; data-section-id=&quot;193dn5&quot;&gt;네트워크 통신 필요&lt;/li&gt;
&lt;li data-end=&quot;3838&quot; data-start=&quot;3828&quot; data-section-id=&quot;1w1wp5&quot;&gt;모니터링 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3843&quot; data-start=&quot;3840&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3864&quot; data-start=&quot;3845&quot; data-section-id=&quot;607v5j&quot;&gt;10. MSA에서 중요한 기술들&lt;/h1&gt;
&lt;h2 data-end=&quot;3886&quot; data-start=&quot;3866&quot; data-section-id=&quot;1o6pnau&quot; data-ke-size=&quot;size26&quot;&gt;10-1. API Gateway&lt;/h2&gt;
&lt;p data-end=&quot;3906&quot; data-start=&quot;3888&quot; data-ke-size=&quot;size16&quot;&gt;모든 요청의 진입점 역할을 한다.&lt;/p&gt;
&lt;p data-end=&quot;3911&quot; data-start=&quot;3908&quot; data-ke-size=&quot;size16&quot;&gt;기능:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3936&quot; data-start=&quot;3912&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3916&quot; data-start=&quot;3912&quot; data-section-id=&quot;yilg7h&quot;&gt;인증&lt;/li&gt;
&lt;li data-end=&quot;3922&quot; data-start=&quot;3917&quot; data-section-id=&quot;22imox&quot;&gt;라우팅&lt;/li&gt;
&lt;li data-end=&quot;3927&quot; data-start=&quot;3923&quot; data-section-id=&quot;yi0svl&quot;&gt;로깅&lt;/li&gt;
&lt;li data-end=&quot;3936&quot; data-start=&quot;3928&quot; data-section-id=&quot;12mc525&quot;&gt;트래픽 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3941&quot; data-start=&quot;3938&quot; data-ke-size=&quot;size16&quot;&gt;대표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3979&quot; data-start=&quot;3942&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3948&quot; data-start=&quot;3942&quot; data-section-id=&quot;1j3vdr9&quot;&gt;Kong&lt;/li&gt;
&lt;li data-end=&quot;3956&quot; data-start=&quot;3949&quot; data-section-id=&quot;16v2evy&quot;&gt;Nginx&lt;/li&gt;
&lt;li data-end=&quot;3979&quot; data-start=&quot;3957&quot; data-section-id=&quot;a7t8xc&quot;&gt;Spring Cloud Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3984&quot; data-start=&quot;3981&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4004&quot; data-start=&quot;3986&quot; data-section-id=&quot;ggxygl&quot; data-ke-size=&quot;size26&quot;&gt;10-2. 서비스 디스커버리&lt;/h2&gt;
&lt;p data-end=&quot;4027&quot; data-start=&quot;4006&quot; data-ke-size=&quot;size16&quot;&gt;서비스 위치를 자동으로 찾는 기술이다.&lt;/p&gt;
&lt;p data-end=&quot;4031&quot; data-start=&quot;4029&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4054&quot; data-start=&quot;4032&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4054&quot; data-start=&quot;4032&quot; data-section-id=&quot;55ae15&quot;&gt;주문 서비스가 결제 서비스 주소 탐색&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4059&quot; data-start=&quot;4056&quot; data-ke-size=&quot;size16&quot;&gt;대표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4077&quot; data-start=&quot;4060&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4068&quot; data-start=&quot;4060&quot; data-section-id=&quot;1yz4qv9&quot;&gt;Eureka&lt;/li&gt;
&lt;li data-end=&quot;4077&quot; data-start=&quot;4069&quot; data-section-id=&quot;1uwp9fk&quot;&gt;Consul&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4082&quot; data-start=&quot;4079&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4098&quot; data-start=&quot;4084&quot; data-section-id=&quot;1lak0c&quot; data-ke-size=&quot;size26&quot;&gt;10-3. 메시지 큐&lt;/h2&gt;
&lt;p data-end=&quot;4119&quot; data-start=&quot;4100&quot; data-ke-size=&quot;size16&quot;&gt;서비스 간 비동기 통신에 사용된다.&lt;/p&gt;
&lt;p data-end=&quot;4124&quot; data-start=&quot;4121&quot; data-ke-size=&quot;size16&quot;&gt;대표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4159&quot; data-start=&quot;4125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4132&quot; data-start=&quot;4125&quot; data-section-id=&quot;16rnu0e&quot;&gt;Kafka&lt;/li&gt;
&lt;li data-end=&quot;4143&quot; data-start=&quot;4133&quot; data-section-id=&quot;b8fcgq&quot;&gt;RabbitMQ&lt;/li&gt;
&lt;li data-end=&quot;4159&quot; data-start=&quot;4144&quot; data-section-id=&quot;btubd9&quot;&gt;Redis Pub/Sub&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4182&quot; data-start=&quot;4161&quot; data-ke-size=&quot;size16&quot;&gt;실시간 처리 시스템에서 매우 중요하다.&lt;/p&gt;
&lt;hr data-end=&quot;4187&quot; data-start=&quot;4184&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4212&quot; data-start=&quot;4189&quot; data-section-id=&quot;s66j4p&quot;&gt;11. 클라우드 환경에서의 데이터베이스&lt;/h1&gt;
&lt;p data-end=&quot;4238&quot; data-start=&quot;4214&quot; data-ke-size=&quot;size16&quot;&gt;클라우드에서는 관리형 DB를 자주 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;4243&quot; data-start=&quot;4240&quot; data-ke-size=&quot;size16&quot;&gt;대표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4281&quot; data-start=&quot;4244&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4253&quot; data-start=&quot;4244&quot; data-section-id=&quot;17nahuw&quot;&gt;AWS RDS&lt;/li&gt;
&lt;li data-end=&quot;4265&quot; data-start=&quot;4254&quot; data-section-id=&quot;52ydzr&quot;&gt;Cloud SQL&lt;/li&gt;
&lt;li data-end=&quot;4281&quot; data-start=&quot;4266&quot; data-section-id=&quot;md1vvl&quot;&gt;MongoDB Atlas&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4286&quot; data-start=&quot;4283&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4311&quot; data-start=&quot;4287&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4295&quot; data-start=&quot;4287&quot; data-section-id=&quot;oe0jmp&quot;&gt;백업 자동화&lt;/li&gt;
&lt;li data-end=&quot;4303&quot; data-start=&quot;4296&quot; data-section-id=&quot;m7lzsk&quot;&gt;장애 복구&lt;/li&gt;
&lt;li data-end=&quot;4311&quot; data-start=&quot;4304&quot; data-section-id=&quot;wwjvo0&quot;&gt;성능 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4335&quot; data-start=&quot;4313&quot; data-ke-size=&quot;size16&quot;&gt;직접 DB 서버를 관리하지 않아도 된다.&lt;/p&gt;
&lt;hr data-end=&quot;4340&quot; data-start=&quot;4337&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4357&quot; data-start=&quot;4342&quot; data-section-id=&quot;19gf1cz&quot;&gt;12. Redis와 캐싱&lt;/h1&gt;
&lt;p data-end=&quot;4390&quot; data-start=&quot;4359&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 성능 최적화를 위해 Redis를 자주 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;4415&quot; data-start=&quot;4392&quot; data-ke-size=&quot;size16&quot;&gt;Redis는 메모리 기반 데이터 저장소다.&lt;/p&gt;
&lt;p data-end=&quot;4422&quot; data-start=&quot;4417&quot; data-ke-size=&quot;size16&quot;&gt;사용 예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4450&quot; data-start=&quot;4423&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4431&quot; data-start=&quot;4423&quot; data-section-id=&quot;6q9pdg&quot;&gt;로그인 세션&lt;/li&gt;
&lt;li data-end=&quot;4440&quot; data-start=&quot;4432&quot; data-section-id=&quot;1imjoxs&quot;&gt;실시간 랭킹&lt;/li&gt;
&lt;li data-end=&quot;4445&quot; data-start=&quot;4441&quot; data-section-id=&quot;yik1jd&quot;&gt;캐싱&lt;/li&gt;
&lt;li data-end=&quot;4450&quot; data-start=&quot;4446&quot; data-section-id=&quot;yijqeh&quot;&gt;채팅&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4458&quot; data-start=&quot;4452&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4493&quot; data-start=&quot;4459&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4475&quot; data-start=&quot;4459&quot; data-section-id=&quot;1p99o28&quot;&gt;DB 조회 속도 500ms&lt;/li&gt;
&lt;li data-end=&quot;4493&quot; data-start=&quot;4476&quot; data-section-id=&quot;y19g4f&quot;&gt;Redis 조회 속도 5ms&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4513&quot; data-start=&quot;4495&quot; data-ke-size=&quot;size16&quot;&gt;처럼 큰 차이가 발생할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;4534&quot; data-start=&quot;4515&quot; data-ke-size=&quot;size16&quot;&gt;대규모 서비스에서는 필수에 가깝다.&lt;/p&gt;
&lt;hr data-end=&quot;4539&quot; data-start=&quot;4536&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4576&quot; data-start=&quot;4541&quot; data-section-id=&quot;5s6ufd&quot;&gt;13. CDN(Content Delivery Network)&lt;/h1&gt;
&lt;p data-end=&quot;4607&quot; data-start=&quot;4578&quot; data-ke-size=&quot;size16&quot;&gt;이미지나 정적 파일을 빠르게 제공하기 위한 기술이다.&lt;/p&gt;
&lt;p data-end=&quot;4612&quot; data-start=&quot;4609&quot; data-ke-size=&quot;size16&quot;&gt;대표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4638&quot; data-start=&quot;4613&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4625&quot; data-start=&quot;4613&quot; data-section-id=&quot;p8du48&quot;&gt;CloudFront&lt;/li&gt;
&lt;li data-end=&quot;4638&quot; data-start=&quot;4626&quot; data-section-id=&quot;ohov9h&quot;&gt;Cloudflare&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4664&quot; data-start=&quot;4640&quot; data-ke-size=&quot;size16&quot;&gt;사용자와 가까운 서버에서 데이터를 전달한다.&lt;/p&gt;
&lt;p data-end=&quot;4668&quot; data-start=&quot;4666&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4700&quot; data-start=&quot;4669&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4684&quot; data-start=&quot;4669&quot; data-section-id=&quot;bvivqc&quot;&gt;한국 사용자는 서울 서버&lt;/li&gt;
&lt;li data-end=&quot;4700&quot; data-start=&quot;4685&quot; data-section-id=&quot;1ngzv2p&quot;&gt;미국 사용자는 미국 서버&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4714&quot; data-start=&quot;4702&quot; data-ke-size=&quot;size16&quot;&gt;에서 데이터를 받는다.&lt;/p&gt;
&lt;hr data-end=&quot;4719&quot; data-start=&quot;4716&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4740&quot; data-start=&quot;4721&quot; data-section-id=&quot;13flefo&quot;&gt;14. DevOps와 CI/CD&lt;/h1&gt;
&lt;p data-end=&quot;4769&quot; data-start=&quot;4742&quot; data-ke-size=&quot;size16&quot;&gt;현대 클라우드 환경에서는 자동화가 매우 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;4778&quot; data-start=&quot;4771&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4803&quot; data-start=&quot;4779&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4787&quot; data-start=&quot;4779&quot; data-section-id=&quot;1czw2a9&quot;&gt;자동 테스트&lt;/li&gt;
&lt;li data-end=&quot;4795&quot; data-start=&quot;4788&quot; data-section-id=&quot;1ho50x&quot;&gt;자동 빌드&lt;/li&gt;
&lt;li data-end=&quot;4803&quot; data-start=&quot;4796&quot; data-section-id=&quot;1hm8al&quot;&gt;자동 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4812&quot; data-start=&quot;4805&quot; data-ke-size=&quot;size16&quot;&gt;를 의미한다.&lt;/p&gt;
&lt;p data-end=&quot;4820&quot; data-start=&quot;4814&quot; data-ke-size=&quot;size16&quot;&gt;대표 도구:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4859&quot; data-start=&quot;4821&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4837&quot; data-start=&quot;4821&quot; data-section-id=&quot;gi477k&quot;&gt;GitHub Actions&lt;/li&gt;
&lt;li data-end=&quot;4847&quot; data-start=&quot;4838&quot; data-section-id=&quot;4u2sxi&quot;&gt;Jenkins&lt;/li&gt;
&lt;li data-end=&quot;4859&quot; data-start=&quot;4848&quot; data-section-id=&quot;39xms7&quot;&gt;GitLab CI&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4867&quot; data-start=&quot;4861&quot; data-ke-size=&quot;size16&quot;&gt;예시 흐름:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;Git Push
&amp;rarr; 테스트 실행
&amp;rarr; 빌드
&amp;rarr; Docker 생성
&amp;rarr; 서버 배포&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4943&quot; data-start=&quot;4924&quot; data-ke-size=&quot;size16&quot;&gt;사람 개입 없이 자동으로 배포된다.&lt;/p&gt;
&lt;hr data-end=&quot;4948&quot; data-start=&quot;4945&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4979&quot; data-start=&quot;4950&quot; data-section-id=&quot;1xf3ctq&quot;&gt;15. 실무에서 많이 사용하는 클라우드 기술 스택&lt;/h1&gt;
&lt;p data-end=&quot;4992&quot; data-start=&quot;4981&quot; data-ke-size=&quot;size16&quot;&gt;실제 프로젝트 예시:&lt;/p&gt;
&lt;p data-end=&quot;5003&quot; data-start=&quot;4994&quot; data-ke-size=&quot;size16&quot;&gt;Frontend:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5030&quot; data-start=&quot;5004&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5011&quot; data-start=&quot;5004&quot; data-section-id=&quot;179haax&quot;&gt;React&lt;/li&gt;
&lt;li data-end=&quot;5021&quot; data-start=&quot;5012&quot; data-section-id=&quot;ekc860&quot;&gt;Next.js&lt;/li&gt;
&lt;li data-end=&quot;5030&quot; data-start=&quot;5022&quot; data-section-id=&quot;9hnmn7&quot;&gt;Vercel&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5040&quot; data-start=&quot;5032&quot; data-ke-size=&quot;size16&quot;&gt;Backend:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5069&quot; data-start=&quot;5041&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5050&quot; data-start=&quot;5041&quot; data-section-id=&quot;fjub3z&quot;&gt;Node.js&lt;/li&gt;
&lt;li data-end=&quot;5059&quot; data-start=&quot;5051&quot; data-section-id=&quot;1t09g59&quot;&gt;NestJS&lt;/li&gt;
&lt;li data-end=&quot;5069&quot; data-start=&quot;5060&quot; data-section-id=&quot;1tn0y&quot;&gt;Express&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5080&quot; data-start=&quot;5071&quot; data-ke-size=&quot;size16&quot;&gt;Database:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5101&quot; data-start=&quot;5081&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5093&quot; data-start=&quot;5081&quot; data-section-id=&quot;6zn6pa&quot;&gt;PostgreSQL&lt;/li&gt;
&lt;li data-end=&quot;5101&quot; data-start=&quot;5094&quot; data-section-id=&quot;16wc4lu&quot;&gt;MySQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5109&quot; data-start=&quot;5103&quot; data-ke-size=&quot;size16&quot;&gt;Cache:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5117&quot; data-start=&quot;5110&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5117&quot; data-start=&quot;5110&quot; data-section-id=&quot;179h5y9&quot;&gt;Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5125&quot; data-start=&quot;5119&quot; data-ke-size=&quot;size16&quot;&gt;Infra:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5153&quot; data-start=&quot;5126&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5134&quot; data-start=&quot;5126&quot; data-section-id=&quot;1u6gra4&quot;&gt;Docker&lt;/li&gt;
&lt;li data-end=&quot;5147&quot; data-start=&quot;5135&quot; data-section-id=&quot;1hb2fca&quot;&gt;Kubernetes&lt;/li&gt;
&lt;li data-end=&quot;5153&quot; data-start=&quot;5148&quot; data-section-id=&quot;1o4fv1&quot;&gt;AWS&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5166&quot; data-start=&quot;5155&quot; data-ke-size=&quot;size16&quot;&gt;Monitoring:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5189&quot; data-start=&quot;5167&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5176&quot; data-start=&quot;5167&quot; data-section-id=&quot;wkmoms&quot;&gt;Grafana&lt;/li&gt;
&lt;li data-end=&quot;5189&quot; data-start=&quot;5177&quot; data-section-id=&quot;961ble&quot;&gt;Prometheus&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5214&quot; data-start=&quot;5191&quot; data-ke-size=&quot;size16&quot;&gt;이러한 구조가 현재 매우 흔하게 사용된다.&lt;/p&gt;
&lt;hr data-end=&quot;5219&quot; data-start=&quot;5216&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5242&quot; data-start=&quot;5221&quot; data-section-id=&quot;ru5h2z&quot;&gt;16. 클라우드 시대의 개발자 역량&lt;/h1&gt;
&lt;p data-end=&quot;5270&quot; data-start=&quot;5244&quot; data-ke-size=&quot;size16&quot;&gt;이제 개발자는 단순히 코딩만 잘해서는 부족하다.&lt;/p&gt;
&lt;p data-end=&quot;5279&quot; data-start=&quot;5272&quot; data-ke-size=&quot;size16&quot;&gt;필요한 역량:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5333&quot; data-start=&quot;5280&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5287&quot; data-start=&quot;5280&quot; data-section-id=&quot;u9l7gw&quot;&gt;서버 이해&lt;/li&gt;
&lt;li data-end=&quot;5297&quot; data-start=&quot;5288&quot; data-section-id=&quot;n720fo&quot;&gt;네트워크 이해&lt;/li&gt;
&lt;li data-end=&quot;5306&quot; data-start=&quot;5298&quot; data-section-id=&quot;1u6gra4&quot;&gt;Docker&lt;/li&gt;
&lt;li data-end=&quot;5314&quot; data-start=&quot;5307&quot; data-section-id=&quot;16rabu6&quot;&gt;Linux&lt;/li&gt;
&lt;li data-end=&quot;5323&quot; data-start=&quot;5315&quot; data-section-id=&quot;1j7imw9&quot;&gt;배포 자동화&lt;/li&gt;
&lt;li data-end=&quot;5333&quot; data-start=&quot;5324&quot; data-section-id=&quot;1r02c8c&quot;&gt;클라우드 이해&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5364&quot; data-start=&quot;5335&quot; data-ke-size=&quot;size16&quot;&gt;특히 백엔드 개발자라면 클라우드 지식은 거의 필수다.&lt;/p&gt;
&lt;hr data-end=&quot;5369&quot; data-start=&quot;5366&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5385&quot; data-start=&quot;5371&quot; data-section-id=&quot;1fnx33m&quot;&gt;17. 클라우드의 미래&lt;/h1&gt;
&lt;p data-end=&quot;5418&quot; data-start=&quot;5387&quot; data-ke-size=&quot;size16&quot;&gt;앞으로 클라우드 시장은 계속 성장할 가능성이 매우 높다.&lt;/p&gt;
&lt;p data-end=&quot;5423&quot; data-start=&quot;5420&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5463&quot; data-start=&quot;5424&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5432&quot; data-start=&quot;5424&quot; data-section-id=&quot;1wco8po&quot;&gt;AI 서비스&lt;/li&gt;
&lt;li data-end=&quot;5439&quot; data-start=&quot;5433&quot; data-section-id=&quot;1v76la1&quot;&gt;빅데이터&lt;/li&gt;
&lt;li data-end=&quot;5445&quot; data-start=&quot;5440&quot; data-section-id=&quot;1o49ru&quot;&gt;IoT&lt;/li&gt;
&lt;li data-end=&quot;5456&quot; data-start=&quot;5446&quot; data-section-id=&quot;1bxgavd&quot;&gt;실시간 스트리밍&lt;/li&gt;
&lt;li data-end=&quot;5463&quot; data-start=&quot;5457&quot; data-section-id=&quot;1sziujg&quot;&gt;메타버스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5494&quot; data-start=&quot;5465&quot; data-ke-size=&quot;size16&quot;&gt;등이 성장하면서 클라우드 의존도는 더욱 커질 것이다.&lt;/p&gt;
&lt;p data-end=&quot;5531&quot; data-start=&quot;5496&quot; data-ke-size=&quot;size16&quot;&gt;또한 서버리스(Serverless) 기술도 빠르게 발전 중이다.&lt;/p&gt;
&lt;p data-end=&quot;5536&quot; data-start=&quot;5533&quot; data-ke-size=&quot;size16&quot;&gt;대표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5567&quot; data-start=&quot;5537&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5549&quot; data-start=&quot;5537&quot; data-section-id=&quot;g2qqru&quot;&gt;AWS Lambda&lt;/li&gt;
&lt;li data-end=&quot;5567&quot; data-start=&quot;5550&quot; data-section-id=&quot;1xldyyw&quot;&gt;Cloud Functions&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5594&quot; data-start=&quot;5569&quot; data-ke-size=&quot;size16&quot;&gt;서버 관리 없이 함수 단위로 실행할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;5599&quot; data-start=&quot;5596&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5606&quot; data-start=&quot;5601&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;5716&quot; data-start=&quot;5608&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 컴퓨팅은 현대 IT 서비스의 핵심 인프라다. 과거처럼 직접 서버를 구매하고 관리하는 시대는 점점 줄어들고 있으며, 이제는 필요할 때 원하는 만큼 자원을 사용하는 방식이 일반화되고 있다.&lt;/p&gt;
&lt;p data-end=&quot;5798&quot; data-start=&quot;5718&quot; data-ke-size=&quot;size16&quot;&gt;또한 서비스 규모가 커질수록 마이크로서비스 아키텍처와 컨테이너 기술, Kubernetes 같은 오케스트레이션 기술의 중요성도 함께 커지고 있다.&lt;/p&gt;
&lt;p data-end=&quot;5809&quot; data-start=&quot;5800&quot; data-ke-size=&quot;size16&quot;&gt;특히 실무에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5853&quot; data-start=&quot;5810&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5818&quot; data-start=&quot;5810&quot; data-section-id=&quot;1u6gra4&quot;&gt;Docker&lt;/li&gt;
&lt;li data-end=&quot;5826&quot; data-start=&quot;5819&quot; data-section-id=&quot;179h5y9&quot;&gt;Redis&lt;/li&gt;
&lt;li data-end=&quot;5834&quot; data-start=&quot;5827&quot; data-section-id=&quot;16wjjgq&quot;&gt;CI/CD&lt;/li&gt;
&lt;li data-end=&quot;5840&quot; data-start=&quot;5835&quot; data-section-id=&quot;1o4fv1&quot;&gt;AWS&lt;/li&gt;
&lt;li data-end=&quot;5853&quot; data-start=&quot;5841&quot; data-section-id=&quot;1hb2fca&quot;&gt;Kubernetes&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5873&quot; data-start=&quot;5855&quot; data-ke-size=&quot;size16&quot;&gt;등의 기술이 매우 자주 사용된다.&lt;/p&gt;
&lt;p data-end=&quot;5967&quot; data-start=&quot;5875&quot; data-ke-size=&quot;size16&quot;&gt;개발을 공부하는 입장에서는 단순히 &amp;ldquo;클라우드가 서버를 빌리는 것&amp;rdquo; 정도로 이해하는 것이 아니라, 실제 서비스가 어떻게 배포되고 운영되는지까지 이해하는 것이 중요하다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;6053&quot; data-start=&quot;5969&quot; data-ke-size=&quot;size16&quot;&gt;앞으로의 개발 환경은 더욱 자동화되고 분산화될 가능성이 높다. 따라서 클라우드와 MSA에 대한 이해는 현대 개발자에게 매우 중요한 경쟁력이 될 것이다.&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/93</guid>
      <comments>https://jhlcpj.tistory.com/93#entry93comment</comments>
      <pubDate>Tue, 26 May 2026 23:53:36 +0900</pubDate>
    </item>
    <item>
      <title>[19주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 87</title>
      <link>https://jhlcpj.tistory.com/92</link>
      <description>&lt;h1 data-end=&quot;27&quot; data-start=&quot;0&quot; data-section-id=&quot;knt4ub&quot;&gt;컴퓨터 네트워크와 소프트웨어공학 학습 정리&lt;/h1&gt;
&lt;h2 data-end=&quot;70&quot; data-start=&quot;28&quot; data-section-id=&quot;14tcluj&quot; data-ke-size=&quot;size26&quot;&gt;OSI 7계층부터 코드 리뷰까지, 개발자가 반드시 알아야 할 핵심 개념&lt;/h2&gt;
&lt;p data-end=&quot;190&quot; data-start=&quot;72&quot; data-ke-size=&quot;size16&quot;&gt;최근 컴퓨터 네트워크와 소프트웨어공학에 대한 학습을 진행하면서, 단순히 &amp;ldquo;인터넷이 연결된다&amp;rdquo;, &amp;ldquo;코드가 동작한다&amp;rdquo; 수준을 넘어 실제 서비스와 협업 개발에서 왜 이러한 개념들이 중요한지를 다시 느낄 수 있었다.&lt;/p&gt;
&lt;p data-end=&quot;225&quot; data-start=&quot;192&quot; data-ke-size=&quot;size16&quot;&gt;특히 이번 학습에서는 다음과 같은 주제를 중심으로 공부했다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;357&quot; data-start=&quot;227&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;244&quot; data-start=&quot;227&quot; data-section-id=&quot;1dcpxiw&quot;&gt;디지털 통신과 아날로그 통신&lt;/li&gt;
&lt;li data-end=&quot;257&quot; data-start=&quot;245&quot; data-section-id=&quot;c8gbxn&quot;&gt;OSI 7계층 모델&lt;/li&gt;
&lt;li data-end=&quot;274&quot; data-start=&quot;258&quot; data-section-id=&quot;7w56fh&quot;&gt;IP 네트워크와 주소 체계&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;275&quot; data-section-id=&quot;tvy6q8&quot;&gt;CIDR 및 서브넷 개념&lt;/li&gt;
&lt;li data-end=&quot;304&quot; data-start=&quot;291&quot; data-section-id=&quot;zbnq59&quot;&gt;TCP/IP 프로토콜&lt;/li&gt;
&lt;li data-end=&quot;318&quot; data-start=&quot;305&quot; data-section-id=&quot;d9o260&quot;&gt;소프트웨어공학의 목적&lt;/li&gt;
&lt;li data-end=&quot;332&quot; data-start=&quot;319&quot; data-section-id=&quot;1lpk8y9&quot;&gt;폭포수 모델과 애자일&lt;/li&gt;
&lt;li data-end=&quot;347&quot; data-start=&quot;333&quot; data-section-id=&quot;efqfrk&quot;&gt;코드 리뷰와 클린 코드&lt;/li&gt;
&lt;li data-end=&quot;357&quot; data-start=&quot;348&quot; data-section-id=&quot;1d35rjx&quot;&gt;코드 인스펙션&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;413&quot; data-start=&quot;359&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 위 내용을 바탕으로, 개발자가 반드시 이해해야 할 핵심 개념들을 정리해보려고 한다.&lt;/p&gt;
&lt;hr data-end=&quot;418&quot; data-start=&quot;415&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;440&quot; data-start=&quot;420&quot; data-section-id=&quot;1kz6mjt&quot;&gt;1. 디지털 통신과 아날로그 통신&lt;/h1&gt;
&lt;p data-end=&quot;501&quot; data-start=&quot;442&quot; data-ke-size=&quot;size16&quot;&gt;우리가 사용하는 인터넷, 스마트폰, 게임 서버, 스트리밍 서비스는 모두 디지털 통신 기반으로 동작한다.&lt;/p&gt;
&lt;p data-end=&quot;546&quot; data-start=&quot;503&quot; data-ke-size=&quot;size16&quot;&gt;과거에는 아날로그 통신이 중심이었다면, 현재는 대부분 디지털 방식이 사용된다.&lt;/p&gt;
&lt;p data-end=&quot;572&quot; data-start=&quot;548&quot; data-ke-size=&quot;size16&quot;&gt;디지털 통신의 대표적인 장점은 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;665&quot; data-start=&quot;574&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;584&quot; data-start=&quot;574&quot; data-section-id=&quot;1hs4c8i&quot;&gt;잡음에 강하다.&lt;/li&gt;
&lt;li data-end=&quot;607&quot; data-start=&quot;585&quot; data-section-id=&quot;o1upyw&quot;&gt;오류 검출 및 오류 정정이 가능하다.&lt;/li&gt;
&lt;li data-end=&quot;621&quot; data-start=&quot;608&quot; data-section-id=&quot;1f5wv17&quot;&gt;암호화 적용이 쉽다.&lt;/li&gt;
&lt;li data-end=&quot;642&quot; data-start=&quot;622&quot; data-section-id=&quot;1leowdk&quot;&gt;데이터 저장 및 복원이 용이하다.&lt;/li&gt;
&lt;li data-end=&quot;665&quot; data-start=&quot;643&quot; data-section-id=&quot;v90a98&quot;&gt;컴퓨터 시스템과 직접 연동하기 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;694&quot; data-start=&quot;667&quot; data-ke-size=&quot;size16&quot;&gt;특히 중요한 부분은 &amp;ldquo;오류 검출과 정정&amp;rdquo;이다.&lt;/p&gt;
&lt;p data-end=&quot;794&quot; data-start=&quot;696&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 네트워크 전송 중 데이터 일부가 손상되더라도, 디지털 통신에서는 이를 검출하거나 복구할 수 있다.&lt;br /&gt;반면 아날로그 통신은 잡음이 섞이면 원본 품질 자체가 저하된다.&lt;/p&gt;
&lt;p data-end=&quot;843&quot; data-start=&quot;796&quot; data-ke-size=&quot;size16&quot;&gt;또한 오늘날 보안 기술의 핵심인 암호화 역시 디지털 데이터 기반이기 때문에 가능하다.&lt;/p&gt;
&lt;hr data-end=&quot;848&quot; data-start=&quot;845&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;865&quot; data-start=&quot;850&quot; data-section-id=&quot;bw0yop&quot;&gt;2. OSI 7계층 모델&lt;/h1&gt;
&lt;p data-end=&quot;907&quot; data-start=&quot;867&quot; data-ke-size=&quot;size16&quot;&gt;네트워크를 공부하면 반드시 등장하는 개념이 바로 OSI 7계층 모델이다.&lt;/p&gt;
&lt;p data-end=&quot;981&quot; data-start=&quot;909&quot; data-ke-size=&quot;size16&quot;&gt;OSI(Open Systems Interconnection) 모델은 네트워크 통신 과정을 7개의 계층으로 나누어 설명한 구조이다.&lt;/p&gt;
&lt;h2 data-end=&quot;996&quot; data-start=&quot;983&quot; data-section-id=&quot;7ja5ka&quot; data-ke-size=&quot;size26&quot;&gt;OSI 7계층 구조&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;계층역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1214&quot; data-start=&quot;998&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1214&quot; data-start=&quot;1020&quot;&gt;
&lt;tr data-end=&quot;1048&quot; data-start=&quot;1020&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1026&quot; data-start=&quot;1020&quot;&gt;7계층&lt;/td&gt;
&lt;td data-end=&quot;1048&quot; data-start=&quot;1026&quot; data-col-size=&quot;sm&quot;&gt;응용 계층(Application)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1078&quot; data-start=&quot;1049&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1055&quot; data-start=&quot;1049&quot;&gt;6계층&lt;/td&gt;
&lt;td data-end=&quot;1078&quot; data-start=&quot;1055&quot; data-col-size=&quot;sm&quot;&gt;표현 계층(Presentation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1103&quot; data-start=&quot;1079&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1085&quot; data-start=&quot;1079&quot;&gt;5계층&lt;/td&gt;
&lt;td data-end=&quot;1103&quot; data-start=&quot;1085&quot; data-col-size=&quot;sm&quot;&gt;세션 계층(Session)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1130&quot; data-start=&quot;1104&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1110&quot; data-start=&quot;1104&quot;&gt;4계층&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1130&quot; data-start=&quot;1110&quot;&gt;전송 계층(Transport)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1157&quot; data-start=&quot;1131&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1137&quot; data-start=&quot;1131&quot;&gt;3계층&lt;/td&gt;
&lt;td data-end=&quot;1157&quot; data-start=&quot;1137&quot; data-col-size=&quot;sm&quot;&gt;네트워크 계층(Network)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1188&quot; data-start=&quot;1158&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1164&quot; data-start=&quot;1158&quot;&gt;2계층&lt;/td&gt;
&lt;td data-end=&quot;1188&quot; data-start=&quot;1164&quot; data-col-size=&quot;sm&quot;&gt;데이터 링크 계층(Data Link)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1214&quot; data-start=&quot;1189&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1195&quot; data-start=&quot;1189&quot;&gt;1계층&lt;/td&gt;
&lt;td data-end=&quot;1214&quot; data-start=&quot;1195&quot; data-col-size=&quot;sm&quot;&gt;물리 계층(Physical)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1219&quot; data-start=&quot;1216&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1229&quot; data-start=&quot;1221&quot; data-section-id=&quot;1hgf938&quot; data-ke-size=&quot;size26&quot;&gt;물리 계층&lt;/h2&gt;
&lt;p data-end=&quot;1266&quot; data-start=&quot;1231&quot; data-ke-size=&quot;size16&quot;&gt;실제 전기 신호나 케이블, 허브 같은 물리적인 연결을 담당한다.&lt;/p&gt;
&lt;p data-end=&quot;1271&quot; data-start=&quot;1268&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1291&quot; data-start=&quot;1272&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1276&quot; data-start=&quot;1272&quot; data-section-id=&quot;yi2f84&quot;&gt;랜선&lt;/li&gt;
&lt;li data-end=&quot;1283&quot; data-start=&quot;1277&quot; data-section-id=&quot;1x587qx&quot;&gt;광케이블&lt;/li&gt;
&lt;li data-end=&quot;1291&quot; data-start=&quot;1284&quot; data-section-id=&quot;1kh6a90&quot;&gt;전기 신호&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1296&quot; data-start=&quot;1293&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1310&quot; data-start=&quot;1298&quot; data-section-id=&quot;oixdwt&quot; data-ke-size=&quot;size26&quot;&gt;데이터 링크 계층&lt;/h2&gt;
&lt;p data-end=&quot;1328&quot; data-start=&quot;1312&quot; data-ke-size=&quot;size16&quot;&gt;프레임 단위 전송을 담당한다.&lt;/p&gt;
&lt;p data-end=&quot;1336&quot; data-start=&quot;1330&quot; data-ke-size=&quot;size16&quot;&gt;대표 기능:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1364&quot; data-start=&quot;1337&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1348&quot; data-start=&quot;1337&quot; data-section-id=&quot;1x7bdma&quot;&gt;MAC 주소 사용&lt;/li&gt;
&lt;li data-end=&quot;1356&quot; data-start=&quot;1349&quot; data-section-id=&quot;1wh9nfs&quot;&gt;오류 검출&lt;/li&gt;
&lt;li data-end=&quot;1364&quot; data-start=&quot;1357&quot; data-section-id=&quot;1twped0&quot;&gt;흐름 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1372&quot; data-start=&quot;1366&quot; data-ke-size=&quot;size16&quot;&gt;대표 장비:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1378&quot; data-start=&quot;1373&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1378&quot; data-start=&quot;1373&quot; data-section-id=&quot;2kheq8&quot;&gt;스위치&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1383&quot; data-start=&quot;1380&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1395&quot; data-start=&quot;1385&quot; data-section-id=&quot;kx7pwo&quot; data-ke-size=&quot;size26&quot;&gt;네트워크 계층&lt;/h2&gt;
&lt;p data-end=&quot;1414&quot; data-start=&quot;1397&quot; data-ke-size=&quot;size16&quot;&gt;라우팅과 IP 주소를 담당한다.&lt;/p&gt;
&lt;p data-end=&quot;1424&quot; data-start=&quot;1416&quot; data-ke-size=&quot;size16&quot;&gt;대표 프로토콜:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1436&quot; data-start=&quot;1425&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1429&quot; data-start=&quot;1425&quot; data-section-id=&quot;yhmtld&quot;&gt;IP&lt;/li&gt;
&lt;li data-end=&quot;1436&quot; data-start=&quot;1430&quot; data-section-id=&quot;1j3vxmn&quot;&gt;ICMP&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1444&quot; data-start=&quot;1438&quot; data-ke-size=&quot;size16&quot;&gt;대표 장비:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1450&quot; data-start=&quot;1445&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1450&quot; data-start=&quot;1445&quot; data-section-id=&quot;22in2s&quot;&gt;라우터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1486&quot; data-start=&quot;1452&quot; data-ke-size=&quot;size16&quot;&gt;인터넷에서 &amp;ldquo;어디로 데이터를 보낼지&amp;rdquo; 결정하는 핵심 계층이다.&lt;/p&gt;
&lt;hr data-end=&quot;1491&quot; data-start=&quot;1488&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1501&quot; data-start=&quot;1493&quot; data-section-id=&quot;1ayxc0h&quot; data-ke-size=&quot;size26&quot;&gt;전송 계층&lt;/h2&gt;
&lt;p data-end=&quot;1522&quot; data-start=&quot;1503&quot; data-ke-size=&quot;size16&quot;&gt;종단 간 통신의 신뢰성을 보장한다.&lt;/p&gt;
&lt;p data-end=&quot;1532&quot; data-start=&quot;1524&quot; data-ke-size=&quot;size16&quot;&gt;대표 프로토콜:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1544&quot; data-start=&quot;1533&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1538&quot; data-start=&quot;1533&quot; data-section-id=&quot;1o4s3z&quot;&gt;TCP&lt;/li&gt;
&lt;li data-end=&quot;1544&quot; data-start=&quot;1539&quot; data-section-id=&quot;1o4vxl&quot;&gt;UDP&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1579&quot; data-start=&quot;1546&quot; data-ke-size=&quot;size16&quot;&gt;TCP는 신뢰성을 보장하고,&lt;br /&gt;UDP는 속도를 우선시한다.&lt;/p&gt;
&lt;p data-end=&quot;1649&quot; data-start=&quot;1581&quot; data-ke-size=&quot;size16&quot;&gt;게임 서버나 실시간 스트리밍에서는 UDP가 많이 사용되며,&lt;br /&gt;웹 서비스에서는 TCP 기반 HTTP 통신이 주로 사용된다.&lt;/p&gt;
&lt;hr data-end=&quot;1654&quot; data-start=&quot;1651&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1679&quot; data-start=&quot;1656&quot; data-section-id=&quot;yl1jb6&quot;&gt;3. 데이터 링크 계층과 라우팅의 차이&lt;/h1&gt;
&lt;p data-end=&quot;1732&quot; data-start=&quot;1681&quot; data-ke-size=&quot;size16&quot;&gt;학습하면서 헷갈리기 쉬운 부분 중 하나가 데이터 링크 계층과 네트워크 계층의 역할 차이였다.&lt;/p&gt;
&lt;p data-end=&quot;1744&quot; data-start=&quot;1734&quot; data-ke-size=&quot;size16&quot;&gt;데이터 링크 계층:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1787&quot; data-start=&quot;1745&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1756&quot; data-start=&quot;1745&quot; data-section-id=&quot;1fupg1k&quot;&gt;프레임 단위 처리&lt;/li&gt;
&lt;li data-end=&quot;1771&quot; data-start=&quot;1757&quot; data-section-id=&quot;7hakru&quot;&gt;MAC 주소 기반 통신&lt;/li&gt;
&lt;li data-end=&quot;1779&quot; data-start=&quot;1772&quot; data-section-id=&quot;1wh9nfs&quot;&gt;오류 검출&lt;/li&gt;
&lt;li data-end=&quot;1787&quot; data-start=&quot;1780&quot; data-section-id=&quot;1twped0&quot;&gt;흐름 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1797&quot; data-start=&quot;1789&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 계층:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1822&quot; data-start=&quot;1798&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1808&quot; data-start=&quot;1798&quot; data-section-id=&quot;1nbvftw&quot;&gt;IP 주소 사용&lt;/li&gt;
&lt;li data-end=&quot;1814&quot; data-start=&quot;1809&quot; data-section-id=&quot;22imox&quot;&gt;라우팅&lt;/li&gt;
&lt;li data-end=&quot;1822&quot; data-start=&quot;1815&quot; data-section-id=&quot;eezg44&quot;&gt;경로 선택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1865&quot; data-start=&quot;1824&quot; data-ke-size=&quot;size16&quot;&gt;즉, 라우팅은 네트워크 계층의 역할이지 데이터 링크 계층의 역할이 아니다.&lt;/p&gt;
&lt;p data-end=&quot;1887&quot; data-start=&quot;1867&quot; data-ke-size=&quot;size16&quot;&gt;이 개념은 면접에서도 자주 등장한다.&lt;/p&gt;
&lt;hr data-end=&quot;1892&quot; data-start=&quot;1889&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1910&quot; data-start=&quot;1894&quot; data-section-id=&quot;fxhmx&quot;&gt;4. IP 주소와 CIDR&lt;/h1&gt;
&lt;p data-end=&quot;1936&quot; data-start=&quot;1912&quot; data-ke-size=&quot;size16&quot;&gt;인터넷에서 모든 장치는 IP 주소를 가진다.&lt;/p&gt;
&lt;p data-end=&quot;1941&quot; data-start=&quot;1938&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;192.168.0.1
10.0.0.1
172.16.0.1&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2022&quot; data-start=&quot;1986&quot; data-ke-size=&quot;size16&quot;&gt;IP 주소는 네트워크 상에서 장치를 식별하기 위한 주소 체계이다.&lt;/p&gt;
&lt;hr data-end=&quot;2027&quot; data-start=&quot;2024&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2039&quot; data-start=&quot;2029&quot; data-section-id=&quot;1rbvqia&quot; data-ke-size=&quot;size26&quot;&gt;CIDR이란?&lt;/h2&gt;
&lt;p data-end=&quot;2105&quot; data-start=&quot;2041&quot; data-ke-size=&quot;size16&quot;&gt;CIDR(Classless Inter-Domain Routing)은 IP 주소를 효율적으로 관리하기 위한 방식이다.&lt;/p&gt;
&lt;p data-end=&quot;2110&quot; data-start=&quot;2107&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;10.10.0.0/22&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2163&quot; data-start=&quot;2136&quot; data-ke-size=&quot;size16&quot;&gt;여기서 /22는 네트워크 비트 수를 의미한다.&lt;/p&gt;
&lt;p data-end=&quot;2179&quot; data-start=&quot;2165&quot; data-ke-size=&quot;size16&quot;&gt;서브넷 마스크로 변환하면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;accesslog&quot;&gt;&lt;code&gt;255.255.252.0&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2245&quot; data-start=&quot;2207&quot; data-ke-size=&quot;size16&quot;&gt;이러한 방식 덕분에 IP 주소를 더 유연하게 관리할 수 있게 되었다.&lt;/p&gt;
&lt;hr data-end=&quot;2250&quot; data-start=&quot;2247&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2267&quot; data-start=&quot;2252&quot; data-section-id=&quot;16kdup1&quot; data-ke-size=&quot;size26&quot;&gt;클래스 기반 주소 체계&lt;/h2&gt;
&lt;p data-end=&quot;2299&quot; data-start=&quot;2269&quot; data-ke-size=&quot;size16&quot;&gt;과거에는 다음과 같이 클래스 기반으로 주소를 나누었다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;클래스범위
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;2369&quot; data-start=&quot;2301&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;2369&quot; data-start=&quot;2324&quot;&gt;
&lt;tr data-end=&quot;2337&quot; data-start=&quot;2324&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2328&quot; data-start=&quot;2324&quot;&gt;A&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2337&quot; data-start=&quot;2328&quot;&gt;1~126&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2353&quot; data-start=&quot;2338&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2342&quot; data-start=&quot;2338&quot;&gt;B&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2353&quot; data-start=&quot;2342&quot;&gt;128~191&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;2369&quot; data-start=&quot;2354&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2358&quot; data-start=&quot;2354&quot;&gt;C&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;2369&quot; data-start=&quot;2358&quot;&gt;192~223&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2377&quot; data-start=&quot;2371&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;10.x.x.x&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2413&quot; data-start=&quot;2399&quot; data-ke-size=&quot;size16&quot;&gt;는 클래스 A에 해당한다.&lt;/p&gt;
&lt;p data-end=&quot;2443&quot; data-start=&quot;2415&quot; data-ke-size=&quot;size16&quot;&gt;하지만 현재는 CIDR 방식이 일반적으로 사용된다.&lt;/p&gt;
&lt;hr data-end=&quot;2448&quot; data-start=&quot;2445&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2463&quot; data-start=&quot;2450&quot; data-section-id=&quot;15v4ed7&quot;&gt;5. TCP와 UDP&lt;/h1&gt;
&lt;p data-end=&quot;2496&quot; data-start=&quot;2465&quot; data-ke-size=&quot;size16&quot;&gt;네트워크에서 가장 중요한 프로토콜 중 하나는 TCP이다.&lt;/p&gt;
&lt;p data-end=&quot;2505&quot; data-start=&quot;2498&quot; data-ke-size=&quot;size16&quot;&gt;TCP 특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2567&quot; data-start=&quot;2506&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2534&quot; data-start=&quot;2506&quot; data-section-id=&quot;o8qejh&quot;&gt;연결 지향(connection-oriented)&lt;/li&gt;
&lt;li data-end=&quot;2543&quot; data-start=&quot;2535&quot; data-section-id=&quot;1jyly54&quot;&gt;신뢰성 보장&lt;/li&gt;
&lt;li data-end=&quot;2551&quot; data-start=&quot;2544&quot; data-section-id=&quot;ur1dcp&quot;&gt;순서 보장&lt;/li&gt;
&lt;li data-end=&quot;2559&quot; data-start=&quot;2552&quot; data-section-id=&quot;1twped0&quot;&gt;흐름 제어&lt;/li&gt;
&lt;li data-end=&quot;2567&quot; data-start=&quot;2560&quot; data-section-id=&quot;30eizh&quot;&gt;혼잡 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2614&quot; data-start=&quot;2569&quot; data-ke-size=&quot;size16&quot;&gt;특히 TCP는 데이터를 보내기 전에 3-way handshake 과정을 수행한다.&lt;/p&gt;
&lt;hr data-end=&quot;2619&quot; data-start=&quot;2616&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2639&quot; data-start=&quot;2621&quot; data-section-id=&quot;1krv1hf&quot; data-ke-size=&quot;size26&quot;&gt;3-way Handshake&lt;/h2&gt;
&lt;p data-end=&quot;2647&quot; data-start=&quot;2641&quot; data-ke-size=&quot;size16&quot;&gt;연결 과정:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2675&quot; data-start=&quot;2649&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2655&quot; data-start=&quot;2649&quot; data-section-id=&quot;1qxt2bi&quot;&gt;SYN&lt;/li&gt;
&lt;li data-end=&quot;2668&quot; data-start=&quot;2656&quot; data-section-id=&quot;1jdon1b&quot;&gt;SYN + ACK&lt;/li&gt;
&lt;li data-end=&quot;2675&quot; data-start=&quot;2669&quot; data-section-id=&quot;1s5iiup&quot;&gt;ACK&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;2715&quot; data-start=&quot;2677&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 통해 클라이언트와 서버는 서로 연결 가능 여부를 확인한다.&lt;/p&gt;
&lt;p data-end=&quot;2754&quot; data-start=&quot;2717&quot; data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서 사이트 접속 시에도 TCP 연결이 먼저 이루어진다.&lt;/p&gt;
&lt;hr data-end=&quot;2759&quot; data-start=&quot;2756&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2770&quot; data-start=&quot;2761&quot; data-section-id=&quot;1728aug&quot; data-ke-size=&quot;size26&quot;&gt;UDP 특징&lt;/h2&gt;
&lt;p data-end=&quot;2788&quot; data-start=&quot;2772&quot; data-ke-size=&quot;size16&quot;&gt;UDP는 TCP보다 단순하다.&lt;/p&gt;
&lt;p data-end=&quot;2793&quot; data-start=&quot;2790&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2820&quot; data-start=&quot;2794&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2800&quot; data-start=&quot;2794&quot; data-section-id=&quot;1upbdix&quot;&gt;비연결형&lt;/li&gt;
&lt;li data-end=&quot;2808&quot; data-start=&quot;2801&quot; data-section-id=&quot;1xrruk9&quot;&gt;빠른 속도&lt;/li&gt;
&lt;li data-end=&quot;2820&quot; data-start=&quot;2809&quot; data-section-id=&quot;1l41y42&quot;&gt;신뢰성 보장 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2831&quot; data-start=&quot;2822&quot; data-ke-size=&quot;size16&quot;&gt;대표 사용 예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2855&quot; data-start=&quot;2832&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2836&quot; data-start=&quot;2832&quot; data-section-id=&quot;yi3p5s&quot;&gt;게임&lt;/li&gt;
&lt;li data-end=&quot;2848&quot; data-start=&quot;2837&quot; data-section-id=&quot;1c9jmq0&quot;&gt;실시간 음성 채팅&lt;/li&gt;
&lt;li data-end=&quot;2855&quot; data-start=&quot;2849&quot; data-section-id=&quot;dn9zbp&quot;&gt;스트리밍&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2880&quot; data-start=&quot;2857&quot; data-ke-size=&quot;size16&quot;&gt;실시간성이 중요한 경우 UDP가 유리하다.&lt;/p&gt;
&lt;hr data-end=&quot;2885&quot; data-start=&quot;2882&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2906&quot; data-start=&quot;2887&quot; data-section-id=&quot;1kyv0wx&quot;&gt;6. 소프트웨어공학이란 무엇인가&lt;/h1&gt;
&lt;p data-end=&quot;2936&quot; data-start=&quot;2908&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어공학은 단순히 &amp;ldquo;코딩&amp;rdquo;을 의미하지 않는다.&lt;/p&gt;
&lt;p data-end=&quot;2977&quot; data-start=&quot;2938&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어를 체계적이고 효율적으로 개발하기 위한 공학적 접근 방법이다.&lt;/p&gt;
&lt;p data-end=&quot;2985&quot; data-start=&quot;2979&quot; data-ke-size=&quot;size16&quot;&gt;핵심 목표:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3029&quot; data-start=&quot;2986&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2994&quot; data-start=&quot;2986&quot; data-section-id=&quot;1rp472o&quot;&gt;생산성 향상&lt;/li&gt;
&lt;li data-end=&quot;3002&quot; data-start=&quot;2995&quot; data-section-id=&quot;1qc6218&quot;&gt;품질 향상&lt;/li&gt;
&lt;li data-end=&quot;3013&quot; data-start=&quot;3003&quot; data-section-id=&quot;wqr578&quot;&gt;유지보수성 확보&lt;/li&gt;
&lt;li data-end=&quot;3021&quot; data-start=&quot;3014&quot; data-section-id=&quot;1xhbdzx&quot;&gt;비용 절감&lt;/li&gt;
&lt;li data-end=&quot;3029&quot; data-start=&quot;3022&quot; data-section-id=&quot;8kukh9&quot;&gt;일정 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3070&quot; data-start=&quot;3031&quot; data-ke-size=&quot;size16&quot;&gt;즉, 좋은 소프트웨어를 안정적으로 개발하기 위한 모든 활동이 포함된다.&lt;/p&gt;
&lt;hr data-end=&quot;3075&quot; data-start=&quot;3072&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3098&quot; data-start=&quot;3077&quot; data-section-id=&quot;1ft3qqm&quot;&gt;7. 소프트웨어 생명주기(SDLC)&lt;/h1&gt;
&lt;p data-end=&quot;3124&quot; data-start=&quot;3100&quot; data-ke-size=&quot;size16&quot;&gt;소프트웨어는 다음과 같은 생명주기를 가진다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3169&quot; data-start=&quot;3126&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3136&quot; data-start=&quot;3126&quot; data-section-id=&quot;1rk3j5m&quot;&gt;요구사항 분석&lt;/li&gt;
&lt;li data-end=&quot;3142&quot; data-start=&quot;3137&quot; data-section-id=&quot;1wdvsp&quot;&gt;설계&lt;/li&gt;
&lt;li data-end=&quot;3148&quot; data-start=&quot;3143&quot; data-section-id=&quot;1yirw0&quot;&gt;구현&lt;/li&gt;
&lt;li data-end=&quot;3155&quot; data-start=&quot;3149&quot; data-section-id=&quot;1n2054f&quot;&gt;테스트&lt;/li&gt;
&lt;li data-end=&quot;3161&quot; data-start=&quot;3156&quot; data-section-id=&quot;1uu9s2&quot;&gt;배포&lt;/li&gt;
&lt;li data-end=&quot;3169&quot; data-start=&quot;3162&quot; data-section-id=&quot;1xadyvl&quot;&gt;유지보수&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;3217&quot; data-start=&quot;3171&quot; data-ke-size=&quot;size16&quot;&gt;이를 SDLC(Software Development Life Cycle)라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;3253&quot; data-start=&quot;3219&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 개발보다 유지보수 비용이 훨씬 커지는 경우도 많다.&lt;/p&gt;
&lt;p data-end=&quot;3283&quot; data-start=&quot;3255&quot; data-ke-size=&quot;size16&quot;&gt;따라서 처음부터 유지보수를 고려한 설계가 중요하다.&lt;/p&gt;
&lt;hr data-end=&quot;3288&quot; data-start=&quot;3285&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3301&quot; data-start=&quot;3290&quot; data-section-id=&quot;nid6l5&quot;&gt;8. 폭포수 모델&lt;/h1&gt;
&lt;p data-end=&quot;3336&quot; data-start=&quot;3303&quot; data-ke-size=&quot;size16&quot;&gt;폭포수(Waterfall) 모델은 전통적인 개발 방법론이다.&lt;/p&gt;
&lt;p data-end=&quot;3353&quot; data-start=&quot;3338&quot; data-ke-size=&quot;size16&quot;&gt;단계를 순차적으로 진행한다.&lt;/p&gt;
&lt;p data-end=&quot;3361&quot; data-start=&quot;3355&quot; data-ke-size=&quot;size16&quot;&gt;대표 단계:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3436&quot; data-start=&quot;3362&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3377&quot; data-start=&quot;3362&quot; data-section-id=&quot;1fwf67q&quot;&gt;Requirements&lt;/li&gt;
&lt;li data-end=&quot;3387&quot; data-start=&quot;3378&quot; data-section-id=&quot;1efqw2z&quot;&gt;Design&lt;/li&gt;
&lt;li data-end=&quot;3405&quot; data-start=&quot;3388&quot; data-section-id=&quot;a7ibqi&quot;&gt;Implementation&lt;/li&gt;
&lt;li data-end=&quot;3421&quot; data-start=&quot;3406&quot; data-section-id=&quot;127gtba&quot;&gt;Verification&lt;/li&gt;
&lt;li data-end=&quot;3436&quot; data-start=&quot;3422&quot; data-section-id=&quot;hqpgn7&quot;&gt;Maintenance&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;3461&quot; data-start=&quot;3438&quot; data-ke-size=&quot;size16&quot;&gt;각 단계가 끝난 뒤 다음 단계로 이동한다.&lt;/p&gt;
&lt;hr data-end=&quot;3466&quot; data-start=&quot;3463&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3480&quot; data-start=&quot;3468&quot; data-section-id=&quot;mh5gih&quot; data-ke-size=&quot;size26&quot;&gt;폭포수 모델 장점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3516&quot; data-start=&quot;3482&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3492&quot; data-start=&quot;3482&quot; data-section-id=&quot;11imvm1&quot;&gt;문서화가 체계적&lt;/li&gt;
&lt;li data-end=&quot;3501&quot; data-start=&quot;3493&quot; data-section-id=&quot;ff62ot&quot;&gt;관리가 쉽다&lt;/li&gt;
&lt;li data-end=&quot;3516&quot; data-start=&quot;3502&quot; data-section-id=&quot;1nt4pp5&quot;&gt;대규모 프로젝트에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-end=&quot;3523&quot; data-start=&quot;3518&quot; data-section-id=&quot;1m25lp&quot; data-ke-size=&quot;size26&quot;&gt;단점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3568&quot; data-start=&quot;3525&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3537&quot; data-start=&quot;3525&quot; data-section-id=&quot;yxu70c&quot;&gt;변화 대응이 어렵다&lt;/li&gt;
&lt;li data-end=&quot;3554&quot; data-start=&quot;3538&quot; data-section-id=&quot;1ov22bh&quot;&gt;요구사항 변경 비용이 크다&lt;/li&gt;
&lt;li data-end=&quot;3568&quot; data-start=&quot;3555&quot; data-section-id=&quot;q1184s&quot;&gt;피드백 반영이 느리다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3573&quot; data-start=&quot;3570&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3590&quot; data-start=&quot;3575&quot; data-section-id=&quot;1xtniey&quot;&gt;9. 애자일(Agile)&lt;/h1&gt;
&lt;p data-end=&quot;3620&quot; data-start=&quot;3592&quot; data-ke-size=&quot;size16&quot;&gt;최근 대부분의 IT 기업은 애자일 방식을 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;3629&quot; data-start=&quot;3622&quot; data-ke-size=&quot;size16&quot;&gt;애자일 핵심:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3662&quot; data-start=&quot;3630&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3638&quot; data-start=&quot;3630&quot; data-section-id=&quot;tkmlkx&quot;&gt;빠른 피드백&lt;/li&gt;
&lt;li data-end=&quot;3646&quot; data-start=&quot;3639&quot; data-section-id=&quot;7hovb9&quot;&gt;반복 개발&lt;/li&gt;
&lt;li data-end=&quot;3654&quot; data-start=&quot;3647&quot; data-section-id=&quot;20ag4h&quot;&gt;협업 중심&lt;/li&gt;
&lt;li data-end=&quot;3662&quot; data-start=&quot;3655&quot; data-section-id=&quot;2rvjd9&quot;&gt;변화 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3671&quot; data-start=&quot;3664&quot; data-ke-size=&quot;size16&quot;&gt;대표 방법론:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3688&quot; data-start=&quot;3672&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3679&quot; data-start=&quot;3672&quot; data-section-id=&quot;178myeq&quot;&gt;Scrum&lt;/li&gt;
&lt;li data-end=&quot;3688&quot; data-start=&quot;3680&quot; data-section-id=&quot;1prvgsh&quot;&gt;Kanban&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3693&quot; data-start=&quot;3690&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3709&quot; data-start=&quot;3695&quot; data-section-id=&quot;1t3hopc&quot; data-ke-size=&quot;size26&quot;&gt;애자일이 중요한 이유&lt;/h2&gt;
&lt;p data-end=&quot;3736&quot; data-start=&quot;3711&quot; data-ke-size=&quot;size16&quot;&gt;현대 서비스는 요구사항이 매우 빠르게 변한다.&lt;/p&gt;
&lt;p data-end=&quot;3740&quot; data-start=&quot;3738&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3771&quot; data-start=&quot;3741&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3750&quot; data-start=&quot;3741&quot; data-section-id=&quot;10timwc&quot;&gt;사용자 피드백&lt;/li&gt;
&lt;li data-end=&quot;3758&quot; data-start=&quot;3751&quot; data-section-id=&quot;s7s0hx&quot;&gt;시장 변화&lt;/li&gt;
&lt;li data-end=&quot;3771&quot; data-start=&quot;3759&quot; data-section-id=&quot;txejf8&quot;&gt;비즈니스 전략 수정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3802&quot; data-start=&quot;3773&quot; data-ke-size=&quot;size16&quot;&gt;이러한 환경에서는 폭포수보다 애자일이 훨씬 유리하다.&lt;/p&gt;
&lt;hr data-end=&quot;3807&quot; data-start=&quot;3804&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3829&quot; data-start=&quot;3809&quot; data-section-id=&quot;1u6xnew&quot;&gt;10. 코드 리뷰와 코드 인스펙션&lt;/h1&gt;
&lt;p data-end=&quot;3854&quot; data-start=&quot;3831&quot; data-ke-size=&quot;size16&quot;&gt;좋은 개발 문화에서 코드 리뷰는 필수이다.&lt;/p&gt;
&lt;p data-end=&quot;3865&quot; data-start=&quot;3856&quot; data-ke-size=&quot;size16&quot;&gt;코드 리뷰 목적:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3900&quot; data-start=&quot;3866&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3873&quot; data-start=&quot;3866&quot; data-section-id=&quot;7i0czo&quot;&gt;버그 발견&lt;/li&gt;
&lt;li data-end=&quot;3881&quot; data-start=&quot;3874&quot; data-section-id=&quot;1qc6218&quot;&gt;품질 향상&lt;/li&gt;
&lt;li data-end=&quot;3889&quot; data-start=&quot;3882&quot; data-section-id=&quot;1ss50ao&quot;&gt;지식 공유&lt;/li&gt;
&lt;li data-end=&quot;3900&quot; data-start=&quot;3890&quot; data-section-id=&quot;wqrdu9&quot;&gt;유지보수성 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3933&quot; data-start=&quot;3902&quot; data-ke-size=&quot;size16&quot;&gt;중요한 점은 &amp;ldquo;사람을 공격하는 자리가 아니라는 것&amp;rdquo;이다.&lt;/p&gt;
&lt;p data-end=&quot;3956&quot; data-start=&quot;3935&quot; data-ke-size=&quot;size16&quot;&gt;리뷰 대상은 개발자가 아니라 코드이다.&lt;/p&gt;
&lt;hr data-end=&quot;3961&quot; data-start=&quot;3958&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3973&quot; data-start=&quot;3963&quot; data-section-id=&quot;11fh3o0&quot; data-ke-size=&quot;size26&quot;&gt;코드 인스펙션&lt;/h2&gt;
&lt;p data-end=&quot;4000&quot; data-start=&quot;3975&quot; data-ke-size=&quot;size16&quot;&gt;코드를 체계적으로 검토하는 공식적인 절차이다.&lt;/p&gt;
&lt;p data-end=&quot;4008&quot; data-start=&quot;4002&quot; data-ke-size=&quot;size16&quot;&gt;주요 역할:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4040&quot; data-start=&quot;4009&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4020&quot; data-start=&quot;4009&quot; data-section-id=&quot;1vlnu9d&quot;&gt;Moderator&lt;/li&gt;
&lt;li data-end=&quot;4029&quot; data-start=&quot;4021&quot; data-section-id=&quot;1wjit5p&quot;&gt;Author&lt;/li&gt;
&lt;li data-end=&quot;4040&quot; data-start=&quot;4030&quot; data-section-id=&quot;cloeyt&quot;&gt;Reviewer&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4061&quot; data-start=&quot;4042&quot; data-ke-size=&quot;size16&quot;&gt;효율적인 코드 인스펙션을 위해서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4101&quot; data-start=&quot;4062&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4072&quot; data-start=&quot;4062&quot; data-section-id=&quot;11rolkt&quot;&gt;사전 코드 공유&lt;/li&gt;
&lt;li data-end=&quot;4084&quot; data-start=&quot;4073&quot; data-section-id=&quot;9qfixt&quot;&gt;충분한 검토 시간&lt;/li&gt;
&lt;li data-end=&quot;4101&quot; data-start=&quot;4085&quot; data-section-id=&quot;o55g2t&quot;&gt;명확한 목적&lt;br /&gt;이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4106&quot; data-start=&quot;4103&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4125&quot; data-start=&quot;4108&quot; data-section-id=&quot;92omlc&quot;&gt;11. 클린 코드와 리팩토링&lt;/h1&gt;
&lt;p data-end=&quot;4153&quot; data-start=&quot;4127&quot; data-ke-size=&quot;size16&quot;&gt;좋은 코드는 단순히 &amp;ldquo;동작하는 코드&amp;rdquo;가 아니다.&lt;/p&gt;
&lt;p data-end=&quot;4165&quot; data-start=&quot;4155&quot; data-ke-size=&quot;size16&quot;&gt;좋은 코드의 조건:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4205&quot; data-start=&quot;4166&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4173&quot; data-start=&quot;4166&quot; data-section-id=&quot;2s2ubg&quot;&gt;읽기 쉽다&lt;/li&gt;
&lt;li data-end=&quot;4185&quot; data-start=&quot;4174&quot; data-section-id=&quot;j217f9&quot;&gt;유지보수하기 쉽다&lt;/li&gt;
&lt;li data-end=&quot;4196&quot; data-start=&quot;4186&quot; data-section-id=&quot;psrrvc&quot;&gt;의도가 명확하다&lt;/li&gt;
&lt;li data-end=&quot;4205&quot; data-start=&quot;4197&quot; data-section-id=&quot;p0zit9&quot;&gt;중복이 적다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4210&quot; data-start=&quot;4207&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4227&quot; data-start=&quot;4212&quot; data-section-id=&quot;9wb0k8&quot; data-ke-size=&quot;size26&quot;&gt;리팩토링이 중요한 이유&lt;/h2&gt;
&lt;p data-end=&quot;4257&quot; data-start=&quot;4229&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트가 커질수록 코드 복잡도는 빠르게 증가한다.&lt;/p&gt;
&lt;p data-end=&quot;4279&quot; data-start=&quot;4259&quot; data-ke-size=&quot;size16&quot;&gt;리팩토링 없이 기능만 계속 추가하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4322&quot; data-start=&quot;4280&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4287&quot; data-start=&quot;4280&quot; data-section-id=&quot;7hsmbt&quot;&gt;버그 증가&lt;/li&gt;
&lt;li data-end=&quot;4298&quot; data-start=&quot;4288&quot; data-section-id=&quot;1bv5b0d&quot;&gt;개발 속도 감소&lt;/li&gt;
&lt;li data-end=&quot;4322&quot; data-start=&quot;4299&quot; data-section-id=&quot;vem50p&quot;&gt;유지보수 난이도 상승&lt;br /&gt;문제가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4353&quot; data-start=&quot;4324&quot; data-ke-size=&quot;size16&quot;&gt;따라서 지속적인 리팩토링은 장기적으로 매우 중요하다.&lt;/p&gt;
&lt;hr data-end=&quot;4358&quot; data-start=&quot;4355&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4382&quot; data-start=&quot;4360&quot; data-section-id=&quot;16v3gp8&quot;&gt;12. 협업 개발에서 가장 중요한 것&lt;/h1&gt;
&lt;p data-end=&quot;4407&quot; data-start=&quot;4384&quot; data-ke-size=&quot;size16&quot;&gt;이번 학습을 통해 느낀 가장 중요한 점은:&lt;/p&gt;
&lt;blockquote data-end=&quot;4430&quot; data-start=&quot;4409&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;4430&quot; data-start=&quot;4411&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;개발은 혼자 하는 것이 아니다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;4439&quot; data-start=&quot;4432&quot; data-ke-size=&quot;size16&quot;&gt;라는 것이다.&lt;/p&gt;
&lt;p data-end=&quot;4489&quot; data-start=&quot;4441&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 역시 계층 간 협력이 필요하고,&lt;br /&gt;소프트웨어 개발 역시 팀 협업이 핵심이다.&lt;/p&gt;
&lt;p data-end=&quot;4520&quot; data-start=&quot;4491&quot; data-ke-size=&quot;size16&quot;&gt;좋은 개발자는 단순히 코드를 잘 짜는 사람이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4573&quot; data-start=&quot;4521&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4531&quot; data-start=&quot;4521&quot; data-section-id=&quot;1vi63tc&quot;&gt;구조를 이해하고&lt;/li&gt;
&lt;li data-end=&quot;4541&quot; data-start=&quot;4532&quot; data-section-id=&quot;1kh2nyw&quot;&gt;협업을 잘하고&lt;/li&gt;
&lt;li data-end=&quot;4554&quot; data-start=&quot;4542&quot; data-section-id=&quot;15ffvv8&quot;&gt;유지보수를 고려하며&lt;/li&gt;
&lt;li data-end=&quot;4573&quot; data-start=&quot;4555&quot; data-section-id=&quot;xcr022&quot;&gt;지속적으로 개선하는 사람이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4578&quot; data-start=&quot;4575&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4585&quot; data-start=&quot;4580&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;4620&quot; data-start=&quot;4587&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터 네트워크와 소프트웨어공학은 단순 이론 과목이 아니다.&lt;/p&gt;
&lt;p data-end=&quot;4633&quot; data-start=&quot;4622&quot; data-ke-size=&quot;size16&quot;&gt;실제 개발 현장에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4689&quot; data-start=&quot;4634&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4641&quot; data-start=&quot;4634&quot; data-section-id=&quot;u9hs85&quot;&gt;서버 통신&lt;/li&gt;
&lt;li data-end=&quot;4650&quot; data-start=&quot;4642&quot; data-section-id=&quot;1vvd3sg&quot;&gt;API 설계&lt;/li&gt;
&lt;li data-end=&quot;4659&quot; data-start=&quot;4651&quot; data-section-id=&quot;1imk56k&quot;&gt;실시간 게임&lt;/li&gt;
&lt;li data-end=&quot;4670&quot; data-start=&quot;4660&quot; data-section-id=&quot;j5uw30&quot;&gt;클라우드 인프라&lt;/li&gt;
&lt;li data-end=&quot;4678&quot; data-start=&quot;4671&quot; data-section-id=&quot;202gjg&quot;&gt;협업 개발&lt;/li&gt;
&lt;li data-end=&quot;4689&quot; data-start=&quot;4679&quot; data-section-id=&quot;fx2uks&quot;&gt;코드 품질 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4706&quot; data-start=&quot;4691&quot; data-ke-size=&quot;size16&quot;&gt;모든 곳에서 직접 연결된다.&lt;/p&gt;
&lt;p data-end=&quot;4711&quot; data-start=&quot;4708&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4768&quot; data-start=&quot;4712&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4721&quot; data-start=&quot;4712&quot; data-section-id=&quot;1jhzha3&quot;&gt;OSI 7계층&lt;/li&gt;
&lt;li data-end=&quot;4730&quot; data-start=&quot;4722&quot; data-section-id=&quot;6g9qgp&quot;&gt;TCP/IP&lt;/li&gt;
&lt;li data-end=&quot;4741&quot; data-start=&quot;4731&quot; data-section-id=&quot;1nbwntd&quot;&gt;IP 주소 체계&lt;/li&gt;
&lt;li data-end=&quot;4754&quot; data-start=&quot;4742&quot; data-section-id=&quot;4jcmj4&quot;&gt;소프트웨어 생명주기&lt;/li&gt;
&lt;li data-end=&quot;4760&quot; data-start=&quot;4755&quot; data-section-id=&quot;2jhqn8&quot;&gt;애자일&lt;/li&gt;
&lt;li data-end=&quot;4768&quot; data-start=&quot;4761&quot; data-section-id=&quot;v3yxy4&quot;&gt;코드 리뷰&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4801&quot; data-start=&quot;4770&quot; data-ke-size=&quot;size16&quot;&gt;이러한 개념들은 개발자의 기본 체력에 해당한다고 느꼈다.&lt;/p&gt;
&lt;p data-end=&quot;4826&quot; data-start=&quot;4803&quot; data-ke-size=&quot;size16&quot;&gt;앞으로도 단순히 &amp;ldquo;기능 구현&amp;rdquo;만이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4873&quot; data-start=&quot;4827&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4840&quot; data-start=&quot;4827&quot; data-section-id=&quot;vsq0w7&quot;&gt;왜 이렇게 설계되는지&lt;/li&gt;
&lt;li data-end=&quot;4858&quot; data-start=&quot;4841&quot; data-section-id=&quot;15xb23c&quot;&gt;왜 이런 프로세스가 필요한지&lt;/li&gt;
&lt;li data-end=&quot;4873&quot; data-start=&quot;4859&quot; data-section-id=&quot;1rhctoh&quot;&gt;왜 유지보수가 중요한지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;4898&quot; data-start=&quot;4875&quot; data-ke-size=&quot;size16&quot;&gt;를 계속 고민하면서 학습해야겠다고 느꼈다.&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/92</guid>
      <comments>https://jhlcpj.tistory.com/92#entry92comment</comments>
      <pubDate>Fri, 22 May 2026 20:24:28 +0900</pubDate>
    </item>
    <item>
      <title>[19주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 86</title>
      <link>https://jhlcpj.tistory.com/91</link>
      <description>&lt;h1 data-end=&quot;49&quot; data-start=&quot;0&quot; data-section-id=&quot;pyt6k2&quot;&gt;컴퓨터 구조부터 벡터 데이터베이스까지, 백엔드 개발자가 이해해야 하는 핵심 개념 정리&lt;/h1&gt;
&lt;p data-end=&quot;174&quot; data-start=&quot;51&quot; data-ke-size=&quot;size16&quot;&gt;최근 학습한 내용을 정리하면서 컴퓨터 구조, 운영체제, 데이터베이스, ORM, 그리고 벡터 데이터베이스까지 전체 흐름을 다시 복습해보았다.&lt;br /&gt;처음에는 각각 전혀 다른 분야처럼 느껴졌지만, 실제로는 모두 연결되어 있었다.&lt;/p&gt;
&lt;p data-end=&quot;201&quot; data-start=&quot;176&quot; data-ke-size=&quot;size16&quot;&gt;특히 백엔드 개발이나 서버 개발을 하다 보면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;312&quot; data-start=&quot;202&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;214&quot; data-start=&quot;202&quot; data-section-id=&quot;1tbf14k&quot;&gt;왜 캐시가 필요한지&lt;/li&gt;
&lt;li data-end=&quot;237&quot; data-start=&quot;215&quot; data-section-id=&quot;ajark4&quot;&gt;왜 프로세스와 스레드를 알아야 하는지&lt;/li&gt;
&lt;li data-end=&quot;257&quot; data-start=&quot;238&quot; data-section-id=&quot;1rv2mt1&quot;&gt;왜 데이터베이스 구조가 중요한지&lt;/li&gt;
&lt;li data-end=&quot;283&quot; data-start=&quot;258&quot; data-section-id=&quot;2amhgo&quot;&gt;왜 ORM이 편리하면서도 위험할 수 있는지&lt;/li&gt;
&lt;li data-end=&quot;312&quot; data-start=&quot;284&quot; data-section-id=&quot;vbo7aq&quot;&gt;왜 최근 AI 서비스들이 벡터 DB를 사용하는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;348&quot; data-start=&quot;314&quot; data-ke-size=&quot;size16&quot;&gt;이런 것들이 결국 하나의 흐름으로 이어진다는 걸 느끼게 된다.&lt;/p&gt;
&lt;p data-end=&quot;424&quot; data-start=&quot;350&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 학습한 내용을 바탕으로 컴퓨터 구조부터 운영체제, 데이터베이스, 벡터 데이터베이스까지 핵심 개념들을 정리해보려고 한다.&lt;/p&gt;
&lt;hr data-end=&quot;429&quot; data-start=&quot;426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;448&quot; data-start=&quot;431&quot; data-section-id=&quot;a5m9h0&quot;&gt;1. 컴퓨터 구조와 운영체제&lt;/h1&gt;
&lt;h2 data-end=&quot;473&quot; data-start=&quot;450&quot; data-section-id=&quot;17tjaks&quot; data-ke-size=&quot;size26&quot;&gt;컴퓨터는 어떻게 프로그램을 실행할까?&lt;/h2&gt;
&lt;p data-end=&quot;519&quot; data-start=&quot;475&quot; data-ke-size=&quot;size16&quot;&gt;우리가 작성한 코드는 결국 CPU가 이해할 수 있는 명령어로 변환되어 실행된다.&lt;/p&gt;
&lt;p data-end=&quot;527&quot; data-start=&quot;521&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;560&quot; data-start=&quot;528&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;540&quot; data-start=&quot;528&quot; data-section-id=&quot;1oinkpn&quot;&gt;JavaScript&lt;/li&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;541&quot; data-section-id=&quot;2q6buk&quot;&gt;Python&lt;/li&gt;
&lt;li data-end=&quot;556&quot; data-start=&quot;550&quot; data-section-id=&quot;1j3vxn8&quot;&gt;Java&lt;/li&gt;
&lt;li data-end=&quot;560&quot; data-start=&quot;557&quot; data-section-id=&quot;374357&quot;&gt;C&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;590&quot; data-start=&quot;562&quot; data-ke-size=&quot;size16&quot;&gt;같은 언어는 사람이 읽기 쉽게 만든 고급 언어이다.&lt;/p&gt;
&lt;p data-end=&quot;647&quot; data-start=&quot;592&quot; data-ke-size=&quot;size16&quot;&gt;하지만 CPU는 오직 기계어만 이해할 수 있기 때문에, 프로그램은 반드시 번역 과정을 거쳐야 한다.&lt;/p&gt;
&lt;p data-end=&quot;661&quot; data-start=&quot;649&quot; data-ke-size=&quot;size16&quot;&gt;이때 등장하는 개념이:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;680&quot; data-start=&quot;662&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;668&quot; data-start=&quot;662&quot; data-section-id=&quot;c27em8&quot;&gt;컴파일러&lt;/li&gt;
&lt;li data-end=&quot;680&quot; data-start=&quot;669&quot; data-section-id=&quot;17nbnkc&quot;&gt;인터프리터&lt;br /&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;685&quot; data-start=&quot;682&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;703&quot; data-start=&quot;687&quot; data-section-id=&quot;zx9936&quot;&gt;2. 컴파일러와 인터프리터&lt;/h1&gt;
&lt;h2 data-end=&quot;715&quot; data-start=&quot;705&quot; data-section-id=&quot;1i8g1ll&quot; data-ke-size=&quot;size26&quot;&gt;컴파일러 방식&lt;/h2&gt;
&lt;p data-end=&quot;742&quot; data-start=&quot;717&quot; data-ke-size=&quot;size16&quot;&gt;컴파일러는 프로그램 전체를 한 번에 번역한다.&lt;/p&gt;
&lt;p data-end=&quot;752&quot; data-start=&quot;744&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 언어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;762&quot; data-start=&quot;753&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;756&quot; data-start=&quot;753&quot; data-section-id=&quot;374357&quot;&gt;C&lt;/li&gt;
&lt;li data-end=&quot;762&quot; data-start=&quot;757&quot; data-section-id=&quot;1o4fuz&quot;&gt;C++&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;767&quot; data-start=&quot;764&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;815&quot; data-start=&quot;768&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;780&quot; data-start=&quot;768&quot; data-section-id=&quot;1tjq9ks&quot;&gt;실행 속도가 빠르다&lt;/li&gt;
&lt;li data-end=&quot;803&quot; data-start=&quot;781&quot; data-section-id=&quot;473mq6&quot;&gt;실행 전에 오류를 많이 검출 가능하다&lt;/li&gt;
&lt;li data-end=&quot;815&quot; data-start=&quot;804&quot; data-section-id=&quot;y5vn9d&quot;&gt;최적화에 유리하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;821&quot; data-start=&quot;817&quot; data-ke-size=&quot;size16&quot;&gt;하지만:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;854&quot; data-start=&quot;822&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;854&quot; data-start=&quot;822&quot; data-section-id=&quot;140qfxb&quot;&gt;운영체제나 CPU 구조가 달라지면 다시 컴파일해야 한다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;862&quot; data-start=&quot;856&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;900&quot; data-start=&quot;863&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;877&quot; data-start=&quot;863&quot; data-section-id=&quot;x6xp9i&quot;&gt;Windows용 exe&lt;/li&gt;
&lt;li data-end=&quot;900&quot; data-start=&quot;878&quot; data-section-id=&quot;xx097n&quot;&gt;Mac용 실행 파일&lt;br /&gt;은 서로 다르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;905&quot; data-start=&quot;902&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;918&quot; data-start=&quot;907&quot; data-section-id=&quot;xevcqp&quot; data-ke-size=&quot;size26&quot;&gt;인터프리터 방식&lt;/h2&gt;
&lt;p data-end=&quot;942&quot; data-start=&quot;920&quot; data-ke-size=&quot;size16&quot;&gt;인터프리터는 한 줄씩 읽으면서 실행한다.&lt;/p&gt;
&lt;p data-end=&quot;952&quot; data-start=&quot;944&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 언어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;974&quot; data-start=&quot;953&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;961&quot; data-start=&quot;953&quot; data-section-id=&quot;2q6buk&quot;&gt;Python&lt;/li&gt;
&lt;li data-end=&quot;974&quot; data-start=&quot;962&quot; data-section-id=&quot;1oinkpn&quot;&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;979&quot; data-start=&quot;976&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1017&quot; data-start=&quot;980&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;993&quot; data-start=&quot;980&quot; data-section-id=&quot;38fs75&quot;&gt;플랫폼 독립성이 좋다&lt;/li&gt;
&lt;li data-end=&quot;1006&quot; data-start=&quot;994&quot; data-section-id=&quot;16p6635&quot;&gt;개발 속도가 빠르다&lt;/li&gt;
&lt;li data-end=&quot;1017&quot; data-start=&quot;1007&quot; data-section-id=&quot;1nrgy5&quot;&gt;디버깅이 편하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1023&quot; data-start=&quot;1019&quot; data-ke-size=&quot;size16&quot;&gt;하지만:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1042&quot; data-start=&quot;1024&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1042&quot; data-start=&quot;1024&quot; data-section-id=&quot;1qdkxlg&quot;&gt;실행 속도가 상대적으로 느리다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1074&quot; data-start=&quot;1044&quot; data-ke-size=&quot;size16&quot;&gt;실제로 Python이 C보다 느린 이유도 여기에 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1079&quot; data-start=&quot;1076&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1096&quot; data-start=&quot;1081&quot; data-section-id=&quot;6w8jnu&quot;&gt;3. RISC와 CISC&lt;/h1&gt;
&lt;p data-end=&quot;1119&quot; data-start=&quot;1098&quot; data-ke-size=&quot;size16&quot;&gt;CPU 구조에서도 중요한 개념이 있다.&lt;/p&gt;
&lt;p data-end=&quot;1124&quot; data-start=&quot;1121&quot; data-ke-size=&quot;size16&quot;&gt;바로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1138&quot; data-start=&quot;1125&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1131&quot; data-start=&quot;1125&quot; data-section-id=&quot;1j4ew1v&quot;&gt;RISC&lt;/li&gt;
&lt;li data-end=&quot;1138&quot; data-start=&quot;1132&quot; data-section-id=&quot;1j40bqq&quot;&gt;CISC&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1143&quot; data-start=&quot;1140&quot; data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;1148&quot; data-start=&quot;1145&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1157&quot; data-start=&quot;1150&quot; data-section-id=&quot;1xvz727&quot; data-ke-size=&quot;size26&quot;&gt;CISC&lt;/h2&gt;
&lt;p data-end=&quot;1191&quot; data-start=&quot;1159&quot; data-ke-size=&quot;size16&quot;&gt;Complex Instruction Set Computer&lt;/p&gt;
&lt;p data-end=&quot;1196&quot; data-start=&quot;1193&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1248&quot; data-start=&quot;1197&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1209&quot; data-start=&quot;1197&quot; data-section-id=&quot;1at2yvr&quot;&gt;명령어 종류가 많다&lt;/li&gt;
&lt;li data-end=&quot;1233&quot; data-start=&quot;1210&quot; data-section-id=&quot;1tv06wg&quot;&gt;하나의 명령어가 복잡한 작업 수행 가능&lt;/li&gt;
&lt;li data-end=&quot;1248&quot; data-start=&quot;1234&quot; data-section-id=&quot;w33qb7&quot;&gt;대표적으로 x86 계열&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1253&quot; data-start=&quot;1250&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1271&quot; data-start=&quot;1254&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1271&quot; data-start=&quot;1254&quot; data-section-id=&quot;19w9fwz&quot;&gt;코드 길이가 짧아질 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1276&quot; data-start=&quot;1273&quot; data-ke-size=&quot;size16&quot;&gt;단점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1292&quot; data-start=&quot;1277&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1292&quot; data-start=&quot;1277&quot; data-section-id=&quot;v0344k&quot;&gt;하드웨어 구조가 복잡하다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1297&quot; data-start=&quot;1294&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1306&quot; data-start=&quot;1299&quot; data-section-id=&quot;1xwc7wu&quot; data-ke-size=&quot;size26&quot;&gt;RISC&lt;/h2&gt;
&lt;p data-end=&quot;1340&quot; data-start=&quot;1308&quot; data-ke-size=&quot;size16&quot;&gt;Reduced Instruction Set Computer&lt;/p&gt;
&lt;p data-end=&quot;1345&quot; data-start=&quot;1342&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1396&quot; data-start=&quot;1346&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1358&quot; data-start=&quot;1346&quot; data-section-id=&quot;19e32xc&quot;&gt;단순한 명령어 위주&lt;/li&gt;
&lt;li data-end=&quot;1379&quot; data-start=&quot;1359&quot; data-section-id=&quot;mzv9j&quot;&gt;Load / Store 구조 사용&lt;/li&gt;
&lt;li data-end=&quot;1396&quot; data-start=&quot;1380&quot; data-section-id=&quot;lpm28l&quot;&gt;ARM 계열에서 많이 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1401&quot; data-start=&quot;1398&quot; data-ke-size=&quot;size16&quot;&gt;장점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1428&quot; data-start=&quot;1402&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1413&quot; data-start=&quot;1402&quot; data-section-id=&quot;12759zm&quot;&gt;전력 효율이 좋다&lt;/li&gt;
&lt;li data-end=&quot;1428&quot; data-start=&quot;1414&quot; data-section-id=&quot;1cjqtkx&quot;&gt;파이프라이닝에 유리하다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1455&quot; data-start=&quot;1430&quot; data-ke-size=&quot;size16&quot;&gt;최근 모바일 CPU 대부분은 ARM 기반이다.&lt;/p&gt;
&lt;p data-end=&quot;1492&quot; data-start=&quot;1457&quot; data-ke-size=&quot;size16&quot;&gt;애플 M 시리즈 칩 역시 ARM 기반 RISC 구조를 사용한다.&lt;/p&gt;
&lt;hr data-end=&quot;1497&quot; data-start=&quot;1494&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1512&quot; data-start=&quot;1499&quot; data-section-id=&quot;x95x90&quot;&gt;4. 운영체제의 역할&lt;/h1&gt;
&lt;p data-end=&quot;1547&quot; data-start=&quot;1514&quot; data-ke-size=&quot;size16&quot;&gt;운영체제(OS)는 단순히 화면을 보여주는 프로그램이 아니다.&lt;/p&gt;
&lt;p data-end=&quot;1562&quot; data-start=&quot;1549&quot; data-ke-size=&quot;size16&quot;&gt;운영체제의 핵심 역할은:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1599&quot; data-start=&quot;1563&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1571&quot; data-start=&quot;1563&quot; data-section-id=&quot;1unb5ya&quot;&gt;CPU 관리&lt;/li&gt;
&lt;li data-end=&quot;1580&quot; data-start=&quot;1572&quot; data-section-id=&quot;80u8hg&quot;&gt;메모리 관리&lt;/li&gt;
&lt;li data-end=&quot;1590&quot; data-start=&quot;1581&quot; data-section-id=&quot;caauow&quot;&gt;프로세스 관리&lt;/li&gt;
&lt;li data-end=&quot;1599&quot; data-start=&quot;1591&quot; data-section-id=&quot;tsqcew&quot;&gt;입출력 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1627&quot; data-start=&quot;1601&quot; data-ke-size=&quot;size16&quot;&gt;등 하드웨어 자원을 효율적으로 관리하는 것이다.&lt;/p&gt;
&lt;p data-end=&quot;1667&quot; data-start=&quot;1629&quot; data-ke-size=&quot;size16&quot;&gt;그리고 이 핵심 기능을 담당하는 부분이 바로 커널(kernel)이다.&lt;/p&gt;
&lt;hr data-end=&quot;1672&quot; data-start=&quot;1669&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1697&quot; data-start=&quot;1674&quot; data-section-id=&quot;1rj9zj7&quot;&gt;5. 시스템 콜(System Call)&lt;/h1&gt;
&lt;p data-end=&quot;1727&quot; data-start=&quot;1699&quot; data-ke-size=&quot;size16&quot;&gt;사용자 프로그램은 하드웨어에 직접 접근할 수 없다.&lt;/p&gt;
&lt;p data-end=&quot;1735&quot; data-start=&quot;1729&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1762&quot; data-start=&quot;1736&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1743&quot; data-start=&quot;1736&quot; data-section-id=&quot;s6wp79&quot;&gt;파일 읽기&lt;/li&gt;
&lt;li data-end=&quot;1753&quot; data-start=&quot;1744&quot; data-section-id=&quot;n72xfl&quot;&gt;네트워크 통신&lt;/li&gt;
&lt;li data-end=&quot;1762&quot; data-start=&quot;1754&quot; data-section-id=&quot;81ekox&quot;&gt;메모리 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1788&quot; data-start=&quot;1764&quot; data-ke-size=&quot;size16&quot;&gt;같은 작업은 반드시 운영체제를 거쳐야 한다.&lt;/p&gt;
&lt;p data-end=&quot;1813&quot; data-start=&quot;1790&quot; data-ke-size=&quot;size16&quot;&gt;이때 사용하는 인터페이스가 시스템 콜이다.&lt;/p&gt;
&lt;p data-end=&quot;1829&quot; data-start=&quot;1815&quot; data-ke-size=&quot;size16&quot;&gt;흐름은 보통 다음과 같다.&lt;/p&gt;
&lt;p data-end=&quot;1878&quot; data-start=&quot;1831&quot; data-ke-size=&quot;size16&quot;&gt;사용자 프로그램&lt;br /&gt;&amp;rarr; 라이브러리 함수&lt;br /&gt;&amp;rarr; 시스템 콜&lt;br /&gt;&amp;rarr; 커널&lt;br /&gt;&amp;rarr; 하드웨어&lt;/p&gt;
&lt;p data-end=&quot;1927&quot; data-start=&quot;1880&quot; data-ke-size=&quot;size16&quot;&gt;즉 운영체제가 안전하게 자원을 관리하기 위해 중간에서 통제하는 구조라고 볼 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;1932&quot; data-start=&quot;1929&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1948&quot; data-start=&quot;1934&quot; data-section-id=&quot;1qj7vt6&quot;&gt;6. 프로세스와 스레드&lt;/h1&gt;
&lt;p data-end=&quot;1994&quot; data-start=&quot;1950&quot; data-ke-size=&quot;size16&quot;&gt;운영체제를 공부하면서 가장 중요하게 느낀 개념 중 하나가 프로세스와 스레드였다.&lt;/p&gt;
&lt;hr data-end=&quot;1999&quot; data-start=&quot;1996&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2017&quot; data-start=&quot;2001&quot; data-section-id=&quot;1sc7okr&quot; data-ke-size=&quot;size26&quot;&gt;프로세스(Process)&lt;/h2&gt;
&lt;p data-end=&quot;2039&quot; data-start=&quot;2019&quot; data-ke-size=&quot;size16&quot;&gt;실행 중인 프로그램 자체를 의미한다.&lt;/p&gt;
&lt;p data-end=&quot;2043&quot; data-start=&quot;2041&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2068&quot; data-start=&quot;2044&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2056&quot; data-start=&quot;2044&quot; data-section-id=&quot;1wd3ngl&quot;&gt;크롬 브라우저 실행&lt;/li&gt;
&lt;li data-end=&quot;2068&quot; data-start=&quot;2057&quot; data-section-id=&quot;axwlgt&quot;&gt;VSCode 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2094&quot; data-start=&quot;2070&quot; data-ke-size=&quot;size16&quot;&gt;각 프로세스는 독립된 메모리 공간을 가진다.&lt;/p&gt;
&lt;hr data-end=&quot;2099&quot; data-start=&quot;2096&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2115&quot; data-start=&quot;2101&quot; data-section-id=&quot;x6txbu&quot; data-ke-size=&quot;size26&quot;&gt;스레드(Thread)&lt;/h2&gt;
&lt;p data-end=&quot;2144&quot; data-start=&quot;2117&quot; data-ke-size=&quot;size16&quot;&gt;프로세스 내부에서 실제 작업을 수행하는 흐름이다.&lt;/p&gt;
&lt;p data-end=&quot;2152&quot; data-start=&quot;2146&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2183&quot; data-start=&quot;2153&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2161&quot; data-start=&quot;2153&quot; data-section-id=&quot;m752qh&quot;&gt;게임 렌더링&lt;/li&gt;
&lt;li data-end=&quot;2171&quot; data-start=&quot;2162&quot; data-section-id=&quot;n703k0&quot;&gt;네트워크 처리&lt;/li&gt;
&lt;li data-end=&quot;2183&quot; data-start=&quot;2172&quot; data-section-id=&quot;5c6nc9&quot;&gt;사용자 입력 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2207&quot; data-start=&quot;2185&quot; data-ke-size=&quot;size16&quot;&gt;를 각각 다른 스레드가 담당할 수 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2212&quot; data-start=&quot;2209&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2225&quot; data-start=&quot;2214&quot; data-section-id=&quot;2ay6h2&quot;&gt;7. 동기화 문제&lt;/h1&gt;
&lt;p data-end=&quot;2266&quot; data-start=&quot;2227&quot; data-ke-size=&quot;size16&quot;&gt;멀티스레드 환경에서는 여러 작업이 동시에 같은 자원에 접근할 수 있다.&lt;/p&gt;
&lt;p data-end=&quot;2277&quot; data-start=&quot;2268&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 문제가:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2298&quot; data-start=&quot;2278&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2298&quot; data-start=&quot;2278&quot; data-section-id=&quot;ogwsai&quot;&gt;Race Condition&lt;br /&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2302&quot; data-start=&quot;2300&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2332&quot; data-start=&quot;2303&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2317&quot; data-start=&quot;2303&quot; data-section-id=&quot;1xy92tt&quot;&gt;동시에 같은 변수 수정&lt;/li&gt;
&lt;li data-end=&quot;2332&quot; data-start=&quot;2318&quot; data-section-id=&quot;9v2hq1&quot;&gt;동시에 같은 파일 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2349&quot; data-start=&quot;2334&quot; data-ke-size=&quot;size16&quot;&gt;이런 문제를 해결하기 위해:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2379&quot; data-start=&quot;2350&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2357&quot; data-start=&quot;2350&quot; data-section-id=&quot;16w267t&quot;&gt;Mutex&lt;/li&gt;
&lt;li data-end=&quot;2369&quot; data-start=&quot;2358&quot; data-section-id=&quot;ho2cfm&quot;&gt;Semaphore&lt;/li&gt;
&lt;li data-end=&quot;2379&quot; data-start=&quot;2370&quot; data-section-id=&quot;136yl50&quot;&gt;Monitor&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2397&quot; data-start=&quot;2381&quot; data-ke-size=&quot;size16&quot;&gt;같은 동기화 기법을 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;2423&quot; data-start=&quot;2399&quot; data-ke-size=&quot;size16&quot;&gt;운영체제는 이런 동기화 메커니즘도 제공한다.&lt;/p&gt;
&lt;hr data-end=&quot;2428&quot; data-start=&quot;2425&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2445&quot; data-start=&quot;2430&quot; data-section-id=&quot;1usv9cw&quot;&gt;8. 메모리 관리와 캐시&lt;/h1&gt;
&lt;p data-end=&quot;2475&quot; data-start=&quot;2447&quot; data-ke-size=&quot;size16&quot;&gt;CPU는 매우 빠르지만 메모리는 상대적으로 느리다.&lt;/p&gt;
&lt;p data-end=&quot;2506&quot; data-start=&quot;2477&quot; data-ke-size=&quot;size16&quot;&gt;이 속도 차이를 줄이기 위해 캐시 메모리를 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;2511&quot; data-start=&quot;2508&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2557&quot; data-start=&quot;2512&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2524&quot; data-start=&quot;2512&quot; data-section-id=&quot;twuixe&quot;&gt;CPU 내부에 존재&lt;/li&gt;
&lt;li data-end=&quot;2542&quot; data-start=&quot;2525&quot; data-section-id=&quot;11g4gqo&quot;&gt;자주 사용하는 데이터를 저장&lt;/li&gt;
&lt;li data-end=&quot;2557&quot; data-start=&quot;2543&quot; data-section-id=&quot;w1q3gc&quot;&gt;접근 속도가 매우 빠름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2580&quot; data-start=&quot;2559&quot; data-ke-size=&quot;size16&quot;&gt;하지만 캐시 용량은 매우 작기 때문에:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2609&quot; data-start=&quot;2581&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2594&quot; data-start=&quot;2581&quot; data-section-id=&quot;1aepkwn&quot;&gt;어떤 데이터를 넣을지&lt;/li&gt;
&lt;li data-end=&quot;2609&quot; data-start=&quot;2595&quot; data-section-id=&quot;1bqwncs&quot;&gt;어떤 데이터를 제거할지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2621&quot; data-start=&quot;2611&quot; data-ke-size=&quot;size16&quot;&gt;를 결정해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;2675&quot; data-start=&quot;2623&quot; data-ke-size=&quot;size16&quot;&gt;흥미로운 점은, 이런 캐시 교체는 보통 운영체제가 아니라 하드웨어 레벨에서 처리된다는 것이다.&lt;/p&gt;
&lt;hr data-end=&quot;2680&quot; data-start=&quot;2677&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2701&quot; data-start=&quot;2682&quot; data-section-id=&quot;gl06s&quot;&gt;9. 데이터베이스와 관계형 모델&lt;/h1&gt;
&lt;p data-end=&quot;2736&quot; data-start=&quot;2703&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발에서 가장 중요한 영역 중 하나가 데이터베이스다.&lt;/p&gt;
&lt;p data-end=&quot;2775&quot; data-start=&quot;2738&quot; data-ke-size=&quot;size16&quot;&gt;특히 관계형 데이터베이스(RDBMS)는 여전히 가장 많이 사용된다.&lt;/p&gt;
&lt;p data-end=&quot;2783&quot; data-start=&quot;2777&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2813&quot; data-start=&quot;2784&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2791&quot; data-start=&quot;2784&quot; data-section-id=&quot;16wc4lu&quot;&gt;MySQL&lt;/li&gt;
&lt;li data-end=&quot;2804&quot; data-start=&quot;2792&quot; data-section-id=&quot;6zn6pa&quot;&gt;PostgreSQL&lt;/li&gt;
&lt;li data-end=&quot;2813&quot; data-start=&quot;2805&quot; data-section-id=&quot;1sorbry&quot;&gt;Oracle&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2821&quot; data-start=&quot;2815&quot; data-ke-size=&quot;size16&quot;&gt;등이 있다.&lt;/p&gt;
&lt;hr data-end=&quot;2826&quot; data-start=&quot;2823&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2848&quot; data-start=&quot;2828&quot; data-section-id=&quot;j5sgqk&quot; data-ke-size=&quot;size26&quot;&gt;관계형 데이터베이스의 기본 구조&lt;/h2&gt;
&lt;p data-end=&quot;2860&quot; data-start=&quot;2850&quot; data-ke-size=&quot;size16&quot;&gt;테이블 구성 요소:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2903&quot; data-start=&quot;2861&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2878&quot; data-start=&quot;2861&quot; data-section-id=&quot;vdokux&quot;&gt;Row &amp;rarr; 튜플(tuple)&lt;/li&gt;
&lt;li data-end=&quot;2903&quot; data-start=&quot;2879&quot; data-section-id=&quot;102ml9p&quot;&gt;Column &amp;rarr; 속성(attribute)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2939&quot; data-start=&quot;2905&quot; data-ke-size=&quot;size16&quot;&gt;그리고 테이블 자체를 릴레이션(relation)이라고 부른다.&lt;/p&gt;
&lt;hr data-end=&quot;2944&quot; data-start=&quot;2941&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2959&quot; data-start=&quot;2946&quot; data-section-id=&quot;a9zclk&quot;&gt;10. 데이터 무결성&lt;/h1&gt;
&lt;p data-end=&quot;3001&quot; data-start=&quot;2961&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스에서는 데이터가 잘못 저장되지 않도록 여러 제약 조건을 둔다.&lt;/p&gt;
&lt;p data-end=&quot;3011&quot; data-start=&quot;3003&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 것이:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3029&quot; data-start=&quot;3012&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3020&quot; data-start=&quot;3012&quot; data-section-id=&quot;1dewtn9&quot;&gt;개체 무결성&lt;/li&gt;
&lt;li data-end=&quot;3029&quot; data-start=&quot;3021&quot; data-section-id=&quot;13hi5x1&quot;&gt;참조 무결성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3034&quot; data-start=&quot;3031&quot; data-ke-size=&quot;size16&quot;&gt;이다.&lt;/p&gt;
&lt;hr data-end=&quot;3039&quot; data-start=&quot;3036&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3050&quot; data-start=&quot;3041&quot; data-section-id=&quot;zqomew&quot; data-ke-size=&quot;size26&quot;&gt;참조 무결성&lt;/h2&gt;
&lt;p data-end=&quot;3092&quot; data-start=&quot;3052&quot; data-ke-size=&quot;size16&quot;&gt;외래키(Foreign Key)는 반드시 존재하는 데이터를 참조해야 한다.&lt;/p&gt;
&lt;p data-end=&quot;3096&quot; data-start=&quot;3094&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3135&quot; data-start=&quot;3097&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3119&quot; data-start=&quot;3097&quot; data-section-id=&quot;1x2al4e&quot;&gt;존재하지 않는 사용자 ID 참조 금지&lt;/li&gt;
&lt;li data-end=&quot;3135&quot; data-start=&quot;3120&quot; data-section-id=&quot;sb5ho5&quot;&gt;삭제된 게시글 참조 금지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3153&quot; data-start=&quot;3137&quot; data-ke-size=&quot;size16&quot;&gt;이런 규칙이 참조 무결성이다.&lt;/p&gt;
&lt;p data-end=&quot;3170&quot; data-start=&quot;3155&quot; data-ke-size=&quot;size16&quot;&gt;실무에서도 굉장히 중요하다.&lt;/p&gt;
&lt;hr data-end=&quot;3175&quot; data-start=&quot;3172&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3193&quot; data-start=&quot;3177&quot; data-section-id=&quot;l7dgq&quot;&gt;11. 트랜잭션과 ACID&lt;/h1&gt;
&lt;p data-end=&quot;3227&quot; data-start=&quot;3195&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스에서 가장 중요한 개념 중 하나는 트랜잭션이다.&lt;/p&gt;
&lt;p data-end=&quot;3267&quot; data-start=&quot;3229&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션은:&lt;br /&gt;&amp;ldquo;모두 성공하거나 모두 실패해야 하는 작업 단위&amp;rdquo;&lt;br /&gt;이다.&lt;/p&gt;
&lt;p data-end=&quot;3271&quot; data-start=&quot;3269&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3295&quot; data-start=&quot;3272&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3279&quot; data-start=&quot;3272&quot; data-section-id=&quot;1vkczy8&quot;&gt;계좌 이체&lt;/li&gt;
&lt;li data-end=&quot;3287&quot; data-start=&quot;3280&quot; data-section-id=&quot;c1aets&quot;&gt;결제 처리&lt;/li&gt;
&lt;li data-end=&quot;3295&quot; data-start=&quot;3288&quot; data-section-id=&quot;1pasvsw&quot;&gt;주문 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3300&quot; data-start=&quot;3297&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3312&quot; data-start=&quot;3302&quot; data-section-id=&quot;vjlpna&quot; data-ke-size=&quot;size26&quot;&gt;ACID 속성&lt;/h2&gt;
&lt;p data-end=&quot;3339&quot; data-start=&quot;3314&quot; data-ke-size=&quot;size16&quot;&gt;트랜잭션은 다음 4가지 속성을 만족해야 한다.&lt;/p&gt;
&lt;h3 data-end=&quot;3360&quot; data-start=&quot;3341&quot; data-section-id=&quot;1abbmcv&quot; data-ke-size=&quot;size23&quot;&gt;Atomicity (원자성)&lt;/h3&gt;
&lt;p data-end=&quot;3375&quot; data-start=&quot;3361&quot; data-ke-size=&quot;size16&quot;&gt;모두 성공 또는 모두 실패&lt;/p&gt;
&lt;h3 data-end=&quot;3398&quot; data-start=&quot;3377&quot; data-section-id=&quot;1mkp0h0&quot; data-ke-size=&quot;size23&quot;&gt;Consistency (일관성)&lt;/h3&gt;
&lt;p data-end=&quot;3408&quot; data-start=&quot;3399&quot; data-ke-size=&quot;size16&quot;&gt;데이터 상태 유지&lt;/p&gt;
&lt;h3 data-end=&quot;3429&quot; data-start=&quot;3410&quot; data-section-id=&quot;bq28tm&quot; data-ke-size=&quot;size23&quot;&gt;Isolation (독립성)&lt;/h3&gt;
&lt;p data-end=&quot;3443&quot; data-start=&quot;3430&quot; data-ke-size=&quot;size16&quot;&gt;동시 실행 간 간섭 방지&lt;/p&gt;
&lt;h3 data-end=&quot;3465&quot; data-start=&quot;3445&quot; data-section-id=&quot;prr462&quot; data-ke-size=&quot;size23&quot;&gt;Durability (영구성)&lt;/h3&gt;
&lt;p data-end=&quot;3477&quot; data-start=&quot;3466&quot; data-ke-size=&quot;size16&quot;&gt;커밋된 데이터는 유지&lt;/p&gt;
&lt;p data-end=&quot;3505&quot; data-start=&quot;3479&quot; data-ke-size=&quot;size16&quot;&gt;백엔드 개발에서 트랜잭션 처리는 정말 중요하다.&lt;/p&gt;
&lt;p data-end=&quot;3535&quot; data-start=&quot;3507&quot; data-ke-size=&quot;size16&quot;&gt;특히 동시성 문제가 있는 서비스에서는 더 중요하다.&lt;/p&gt;
&lt;hr data-end=&quot;3540&quot; data-start=&quot;3537&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3577&quot; data-start=&quot;3542&quot; data-section-id=&quot;18a957j&quot;&gt;12. ORM(Object Relational Mapper)&lt;/h1&gt;
&lt;p data-end=&quot;3614&quot; data-start=&quot;3579&quot; data-ke-size=&quot;size16&quot;&gt;최근 대부분의 백엔드 프레임워크는 ORM을 적극적으로 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;3618&quot; data-start=&quot;3616&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3661&quot; data-start=&quot;3619&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3627&quot; data-start=&quot;3619&quot; data-section-id=&quot;2upivw&quot;&gt;Prisma&lt;/li&gt;
&lt;li data-end=&quot;3637&quot; data-start=&quot;3628&quot; data-section-id=&quot;xa4xts&quot;&gt;TypeORM&lt;/li&gt;
&lt;li data-end=&quot;3649&quot; data-start=&quot;3638&quot; data-section-id=&quot;bjnzz9&quot;&gt;Sequelize&lt;/li&gt;
&lt;li data-end=&quot;3661&quot; data-start=&quot;3650&quot; data-section-id=&quot;5otixu&quot;&gt;Hibernate&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3691&quot; data-start=&quot;3663&quot; data-ke-size=&quot;size16&quot;&gt;ORM은 객체와 데이터베이스를 연결해주는 기술이다.&lt;/p&gt;
&lt;hr data-end=&quot;3696&quot; data-start=&quot;3693&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3708&quot; data-start=&quot;3698&quot; data-section-id=&quot;152bgvs&quot; data-ke-size=&quot;size26&quot;&gt;ORM의 장점&lt;/h2&gt;
&lt;h3 data-end=&quot;3723&quot; data-start=&quot;3710&quot; data-section-id=&quot;18w08di&quot; data-ke-size=&quot;size23&quot;&gt;1) 생산성 향상&lt;/h3&gt;
&lt;p data-end=&quot;3745&quot; data-start=&quot;3725&quot; data-ke-size=&quot;size16&quot;&gt;직접 SQL을 작성하지 않아도 된다.&lt;/p&gt;
&lt;p data-end=&quot;3749&quot; data-start=&quot;3747&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;const users = await prisma.user.findMany();&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3824&quot; data-start=&quot;3805&quot; data-ke-size=&quot;size16&quot;&gt;처럼 객체 기반으로 개발 가능하다.&lt;/p&gt;
&lt;hr data-end=&quot;3829&quot; data-start=&quot;3826&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3846&quot; data-start=&quot;3831&quot; data-section-id=&quot;191qktg&quot; data-ke-size=&quot;size23&quot;&gt;2) 유지보수성 향상&lt;/h3&gt;
&lt;p data-end=&quot;3868&quot; data-start=&quot;3848&quot; data-ke-size=&quot;size16&quot;&gt;테이블 변경 시 코드 관리가 편하다.&lt;/p&gt;
&lt;hr data-end=&quot;3873&quot; data-start=&quot;3870&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3891&quot; data-start=&quot;3875&quot; data-section-id=&quot;12lwuf3&quot; data-ke-size=&quot;size23&quot;&gt;3) DB 종속성 감소&lt;/h3&gt;
&lt;p data-end=&quot;3928&quot; data-start=&quot;3893&quot; data-ke-size=&quot;size16&quot;&gt;MySQL &amp;rarr; PostgreSQL 변경 시 상대적으로 유리하다.&lt;/p&gt;
&lt;hr data-end=&quot;3933&quot; data-start=&quot;3930&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3945&quot; data-start=&quot;3935&quot; data-section-id=&quot;152rbx1&quot; data-ke-size=&quot;size26&quot;&gt;ORM의 단점&lt;/h2&gt;
&lt;p data-end=&quot;3964&quot; data-start=&quot;3947&quot; data-ke-size=&quot;size16&quot;&gt;하지만 ORM이 만능은 아니다.&lt;/p&gt;
&lt;p data-end=&quot;3970&quot; data-start=&quot;3966&quot; data-ke-size=&quot;size16&quot;&gt;문제점:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4007&quot; data-start=&quot;3971&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3986&quot; data-start=&quot;3971&quot; data-section-id=&quot;st1mdt&quot;&gt;복잡한 쿼리 비효율 가능&lt;/li&gt;
&lt;li data-end=&quot;3995&quot; data-start=&quot;3987&quot; data-section-id=&quot;1rwixlk&quot;&gt;N+1 문제&lt;/li&gt;
&lt;li data-end=&quot;4007&quot; data-start=&quot;3996&quot; data-section-id=&quot;m4s0i5&quot;&gt;성능 튜닝 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4045&quot; data-start=&quot;4009&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 ORM + Raw SQL을 함께 사용하는 경우가 많다.&lt;/p&gt;
&lt;hr data-end=&quot;4050&quot; data-start=&quot;4047&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4074&quot; data-start=&quot;4052&quot; data-section-id=&quot;1dimc18&quot;&gt;13. NoSQL과 벡터 데이터베이스&lt;/h1&gt;
&lt;p data-end=&quot;4128&quot; data-start=&quot;4076&quot; data-ke-size=&quot;size16&quot;&gt;최근 AI 서비스가 많아지면서 벡터 데이터베이스(Vector DB)가 굉장히 중요해지고 있다.&lt;/p&gt;
&lt;hr data-end=&quot;4133&quot; data-start=&quot;4130&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4152&quot; data-start=&quot;4135&quot; data-section-id=&quot;t4i4mf&quot;&gt;14. 벡터 데이터베이스란?&lt;/h1&gt;
&lt;p data-end=&quot;4200&quot; data-start=&quot;4154&quot; data-ke-size=&quot;size16&quot;&gt;텍스트나 이미지를 숫자 벡터로 변환하여 저장하고 유사도를 검색하는 데이터베이스이다.&lt;/p&gt;
&lt;p data-end=&quot;4204&quot; data-start=&quot;4202&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4246&quot; data-start=&quot;4205&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4217&quot; data-start=&quot;4205&quot; data-section-id=&quot;au5wv0&quot;&gt;ChatGPT 검색&lt;/li&gt;
&lt;li data-end=&quot;4226&quot; data-start=&quot;4218&quot; data-section-id=&quot;bdzov8&quot;&gt;추천 시스템&lt;/li&gt;
&lt;li data-end=&quot;4238&quot; data-start=&quot;4227&quot; data-section-id=&quot;1why6ch&quot;&gt;이미지 유사 검색&lt;/li&gt;
&lt;li data-end=&quot;4246&quot; data-start=&quot;4239&quot; data-section-id=&quot;mvj90l&quot;&gt;문서 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4257&quot; data-start=&quot;4248&quot; data-ke-size=&quot;size16&quot;&gt;등에서 사용된다.&lt;/p&gt;
&lt;hr data-end=&quot;4262&quot; data-start=&quot;4259&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4284&quot; data-start=&quot;4264&quot; data-section-id=&quot;xw8tvz&quot;&gt;15. 임베딩(Embedding)&lt;/h1&gt;
&lt;p data-end=&quot;4318&quot; data-start=&quot;4286&quot; data-ke-size=&quot;size16&quot;&gt;비정형 데이터를 숫자로 변환하는 과정을 임베딩이라고 한다.&lt;/p&gt;
&lt;p data-end=&quot;4322&quot; data-start=&quot;4320&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4338&quot; data-start=&quot;4323&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4327&quot; data-start=&quot;4323&quot; data-section-id=&quot;yhyx4l&quot;&gt;문장&lt;/li&gt;
&lt;li data-end=&quot;4333&quot; data-start=&quot;4328&quot; data-section-id=&quot;2jjsh0&quot;&gt;이미지&lt;/li&gt;
&lt;li data-end=&quot;4338&quot; data-start=&quot;4334&quot; data-section-id=&quot;yiletx&quot;&gt;음성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4347&quot; data-start=&quot;4340&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 벡터 변환&lt;/p&gt;
&lt;p data-end=&quot;4368&quot; data-start=&quot;4349&quot; data-ke-size=&quot;size16&quot;&gt;이 벡터끼리 거리 계산을 수행한다.&lt;/p&gt;
&lt;hr data-end=&quot;4373&quot; data-start=&quot;4370&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4389&quot; data-start=&quot;4375&quot; data-section-id=&quot;p0zes6&quot;&gt;16. ANN 알고리즘&lt;/h1&gt;
&lt;p data-end=&quot;4414&quot; data-start=&quot;4391&quot; data-ke-size=&quot;size16&quot;&gt;벡터 검색에서는 완전 탐색이 매우 느리다.&lt;/p&gt;
&lt;p data-end=&quot;4420&quot; data-start=&quot;4416&quot; data-ke-size=&quot;size16&quot;&gt;그래서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4451&quot; data-start=&quot;4421&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4451&quot; data-start=&quot;4421&quot; data-section-id=&quot;9k5jn4&quot;&gt;Approximate Nearest Neighbor&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4464&quot; data-start=&quot;4453&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘을 사용한다.&lt;/p&gt;
&lt;p data-end=&quot;4469&quot; data-start=&quot;4466&quot; data-ke-size=&quot;size16&quot;&gt;특징:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4494&quot; data-start=&quot;4470&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4482&quot; data-start=&quot;4470&quot; data-section-id=&quot;1t1aik9&quot;&gt;정확도를 조금 희생&lt;/li&gt;
&lt;li data-end=&quot;4494&quot; data-start=&quot;4483&quot; data-section-id=&quot;kvlo9&quot;&gt;속도를 크게 향상&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4507&quot; data-start=&quot;4496&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 라이브러리:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4530&quot; data-start=&quot;4508&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4515&quot; data-start=&quot;4508&quot; data-section-id=&quot;171jaw6&quot;&gt;FAISS&lt;/li&gt;
&lt;li data-end=&quot;4522&quot; data-start=&quot;4516&quot; data-section-id=&quot;1j3sdxm&quot;&gt;HNSW&lt;/li&gt;
&lt;li data-end=&quot;4530&quot; data-start=&quot;4523&quot; data-section-id=&quot;16ynk4f&quot;&gt;Annoy&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4535&quot; data-start=&quot;4532&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4556&quot; data-start=&quot;4537&quot; data-section-id=&quot;tfetd2&quot;&gt;17. 추천 시스템과 벡터 검색&lt;/h1&gt;
&lt;p data-end=&quot;4583&quot; data-start=&quot;4558&quot; data-ke-size=&quot;size16&quot;&gt;벡터 DB는 추천 시스템에서도 자주 사용된다.&lt;/p&gt;
&lt;p data-end=&quot;4587&quot; data-start=&quot;4585&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4618&quot; data-start=&quot;4588&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4596&quot; data-start=&quot;4588&quot; data-section-id=&quot;qo9v00&quot;&gt;유튜브 추천&lt;/li&gt;
&lt;li data-end=&quot;4606&quot; data-start=&quot;4597&quot; data-section-id=&quot;69uh2q&quot;&gt;넷플릭스 추천&lt;/li&gt;
&lt;li data-end=&quot;4618&quot; data-start=&quot;4607&quot; data-section-id=&quot;1owlhlg&quot;&gt;쇼핑몰 상품 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4659&quot; data-start=&quot;4620&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;비슷한 사용자&amp;rdquo;&lt;br /&gt;&amp;ldquo;비슷한 콘텐츠&amp;rdquo;&lt;br /&gt;를 빠르게 찾을 수 있기 때문이다.&lt;/p&gt;
&lt;hr data-end=&quot;4664&quot; data-start=&quot;4661&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4688&quot; data-start=&quot;4666&quot; data-section-id=&quot;lv4ign&quot;&gt;18. 결국 모든 것은 연결되어 있다&lt;/h1&gt;
&lt;p data-end=&quot;4709&quot; data-start=&quot;4690&quot; data-ke-size=&quot;size16&quot;&gt;이번 내용을 공부하면서 느낀 점은:&lt;/p&gt;
&lt;p data-end=&quot;4760&quot; data-start=&quot;4711&quot; data-ke-size=&quot;size16&quot;&gt;컴퓨터 구조&lt;br /&gt;&amp;rarr; 운영체제&lt;br /&gt;&amp;rarr; 프로세스/메모리&lt;br /&gt;&amp;rarr; 데이터베이스&lt;br /&gt;&amp;rarr; 벡터 검색&lt;/p&gt;
&lt;p data-end=&quot;4789&quot; data-start=&quot;4762&quot; data-ke-size=&quot;size16&quot;&gt;이 모두 따로 존재하는 개념이 아니라는 점이었다.&lt;/p&gt;
&lt;p data-end=&quot;4797&quot; data-start=&quot;4791&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4890&quot; data-start=&quot;4798&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4827&quot; data-start=&quot;4798&quot; data-section-id=&quot;dtcbj3&quot;&gt;캐시는 CPU에도 존재하고 Redis에도 존재한다&lt;/li&gt;
&lt;li data-end=&quot;4859&quot; data-start=&quot;4828&quot; data-section-id=&quot;b8pqxr&quot;&gt;동기화 문제는 OS에서도 발생하고 DB에서도 발생한다&lt;/li&gt;
&lt;li data-end=&quot;4890&quot; data-start=&quot;4860&quot; data-section-id=&quot;cnn27f&quot;&gt;메모리 관리 개념은 벡터 DB 성능에도 영향을 준다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4981&quot; data-start=&quot;4892&quot; data-ke-size=&quot;size16&quot;&gt;결국 좋은 백엔드 개발자가 되기 위해서는 단순히 API만 만드는 것이 아니라 컴퓨터가 어떻게 동작하는지 전체 흐름을 이해하는 것이 중요하다는 걸 느끼게 되었다.&lt;/p&gt;
&lt;hr data-end=&quot;4986&quot; data-start=&quot;4983&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4993&quot; data-start=&quot;4988&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;5000&quot; data-start=&quot;4995&quot; data-ke-size=&quot;size16&quot;&gt;처음에는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5024&quot; data-start=&quot;5001&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5007&quot; data-start=&quot;5001&quot; data-section-id=&quot;d8f16d&quot;&gt;운영체제&lt;/li&gt;
&lt;li data-end=&quot;5016&quot; data-start=&quot;5008&quot; data-section-id=&quot;xzv5nw&quot;&gt;데이터베이스&lt;/li&gt;
&lt;li data-end=&quot;5024&quot; data-start=&quot;5017&quot; data-section-id=&quot;694ftc&quot;&gt;벡터 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5070&quot; data-start=&quot;5026&quot; data-ke-size=&quot;size16&quot;&gt;이 모두 어려운 개념처럼 느껴졌지만, 하나씩 연결해서 이해하니 훨씬 재미있었다.&lt;/p&gt;
&lt;p data-end=&quot;5086&quot; data-start=&quot;5072&quot; data-ke-size=&quot;size16&quot;&gt;특히 최근 AI 시대에는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5113&quot; data-start=&quot;5087&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5098&quot; data-start=&quot;5087&quot; data-section-id=&quot;go90wt&quot;&gt;벡터 데이터베이스&lt;/li&gt;
&lt;li data-end=&quot;5104&quot; data-start=&quot;5099&quot; data-section-id=&quot;2jo59h&quot;&gt;임베딩&lt;/li&gt;
&lt;li data-end=&quot;5113&quot; data-start=&quot;5105&quot; data-section-id=&quot;n3xn2h&quot;&gt;유사도 검색&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5136&quot; data-start=&quot;5115&quot; data-ke-size=&quot;size16&quot;&gt;같은 개념이 점점 더 중요해지고 있다.&lt;/p&gt;
&lt;p data-end=&quot;5156&quot; data-start=&quot;5138&quot; data-ke-size=&quot;size16&quot;&gt;앞으로는 단순 CRUD를 넘어서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5178&quot; data-start=&quot;5157&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5161&quot; data-start=&quot;5157&quot; data-section-id=&quot;yi3pb5&quot;&gt;검색&lt;/li&gt;
&lt;li data-end=&quot;5166&quot; data-start=&quot;5162&quot; data-section-id=&quot;yik55s&quot;&gt;추천&lt;/li&gt;
&lt;li data-end=&quot;5178&quot; data-start=&quot;5167&quot; data-section-id=&quot;18ofy1g&quot;&gt;AI 기반 서비스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;5203&quot; data-start=&quot;5180&quot; data-ke-size=&quot;size16&quot;&gt;까지 고려하는 개발자가 되는 것이 목표다.&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/91</guid>
      <comments>https://jhlcpj.tistory.com/91#entry91comment</comments>
      <pubDate>Thu, 21 May 2026 20:05:14 +0900</pubDate>
    </item>
    <item>
      <title>[19주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 85</title>
      <link>https://jhlcpj.tistory.com/90</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발 프로세스&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/90</guid>
      <comments>https://jhlcpj.tistory.com/90#entry90comment</comments>
      <pubDate>Thu, 21 May 2026 20:00:28 +0900</pubDate>
    </item>
    <item>
      <title>[19주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 84</title>
      <link>https://jhlcpj.tistory.com/89</link>
      <description>&lt;h1 data-end=&quot;43&quot; data-start=&quot;0&quot; data-section-id=&quot;ss31x0&quot;&gt;CI/CD 파이프라인과 스테이징 배포, 테스트 자동화까지 한 번에 이해하기&lt;/h1&gt;
&lt;p data-end=&quot;164&quot; data-start=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;최근 대부분의 개발 프로젝트에서는 단순히 &amp;ldquo;기능을 만든다&amp;rdquo;에서 끝나지 않습니다.&lt;br /&gt;기능을 안정적으로 배포하고, 오류를 빠르게 발견하며, 협업 과정에서 품질을 유지하는 것까지 모두 개발의 중요한 영역이 되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;204&quot; data-start=&quot;166&quot; data-ke-size=&quot;size16&quot;&gt;특히 팀 프로젝트나 실무에서는 다음과 같은 질문들이 자주 등장합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;331&quot; data-start=&quot;206&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;230&quot; data-start=&quot;206&quot; data-section-id=&quot;1l8dhi2&quot;&gt;&amp;ldquo;왜 내 코드만 배포하면 오류가 날까?&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;260&quot; data-start=&quot;231&quot; data-section-id=&quot;17waqet&quot;&gt;&amp;ldquo;배포 전에 테스트를 자동으로 돌릴 수 없을까?&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;297&quot; data-start=&quot;261&quot; data-section-id=&quot;z593do&quot;&gt;&amp;ldquo;운영 서버에 바로 올리기 전에 미리 검증할 방법은 없을까?&amp;rdquo;&lt;/li&gt;
&lt;li data-end=&quot;331&quot; data-start=&quot;298&quot; data-section-id=&quot;1sr5joz&quot;&gt;&amp;ldquo;매번 수동으로 빌드하고 배포하는 게 너무 번거로운데?&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;423&quot; data-start=&quot;333&quot; data-ke-size=&quot;size16&quot;&gt;이런 문제를 해결하기 위해 등장한 개념이 바로 &lt;b&gt;CI/CD 파이프라인&lt;/b&gt;, &lt;b&gt;테스트 자동화&lt;/b&gt;, &lt;b&gt;스테이징 배포&lt;/b&gt;, 그리고 &lt;b&gt;인수 테스트&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;468&quot; data-start=&quot;425&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 실제 개발 흐름을 기준으로 아래 내용을 하나씩 정리해보겠습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;585&quot; data-start=&quot;470&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;483&quot; data-start=&quot;470&quot; data-section-id=&quot;1tgm57l&quot;&gt;CI/CD란 무엇인가&lt;/li&gt;
&lt;li data-end=&quot;497&quot; data-start=&quot;484&quot; data-section-id=&quot;1atwr5c&quot;&gt;왜 자동화가 중요한가&lt;/li&gt;
&lt;li data-end=&quot;511&quot; data-start=&quot;498&quot; data-section-id=&quot;1iy36uf&quot;&gt;빌드 및 패키징 과정&lt;/li&gt;
&lt;li data-end=&quot;529&quot; data-start=&quot;512&quot; data-section-id=&quot;12qrmuo&quot;&gt;단위 테스트와 코드 커버리지&lt;/li&gt;
&lt;li data-end=&quot;539&quot; data-start=&quot;530&quot; data-section-id=&quot;uwtg1p&quot;&gt;스테이징 배포&lt;/li&gt;
&lt;li data-end=&quot;548&quot; data-start=&quot;540&quot; data-section-id=&quot;guxzjs&quot;&gt;인수 테스트&lt;/li&gt;
&lt;li data-end=&quot;564&quot; data-start=&quot;549&quot; data-section-id=&quot;5y9tyl&quot;&gt;실제 프로젝트 흐름 예시&lt;/li&gt;
&lt;li data-end=&quot;585&quot; data-start=&quot;565&quot; data-section-id=&quot;vh7euv&quot;&gt;협업 과정에서 얻을 수 있는 장점&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;590&quot; data-start=&quot;587&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;606&quot; data-start=&quot;592&quot; data-section-id=&quot;k0n22g&quot;&gt;CI/CD란 무엇일까?&lt;/h1&gt;
&lt;p data-end=&quot;633&quot; data-start=&quot;608&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD는 크게 두 가지 개념으로 나뉩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;704&quot; data-start=&quot;635&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;664&quot; data-start=&quot;635&quot; data-section-id=&quot;1sljmxc&quot;&gt;CI (Continuous Integration)&lt;/li&gt;
&lt;li data-end=&quot;704&quot; data-start=&quot;665&quot; data-section-id=&quot;r4jvft&quot;&gt;CD (Continuous Delivery / Deployment)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;713&quot; data-start=&quot;706&quot; data-ke-size=&quot;size16&quot;&gt;쉽게 말하면:&lt;/p&gt;
&lt;blockquote data-end=&quot;764&quot; data-start=&quot;715&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;764&quot; data-start=&quot;717&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;코드를 자주 합치고(CI), 자동으로 배포까지 연결(CD)하는 개발 문화와 시스템&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;779&quot; data-start=&quot;766&quot; data-ke-size=&quot;size16&quot;&gt;이라고 볼 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;784&quot; data-start=&quot;781&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;815&quot; data-start=&quot;786&quot; data-section-id=&quot;rhc25a&quot;&gt;Continuous Integration (CI)&lt;/h1&gt;
&lt;p data-end=&quot;840&quot; data-start=&quot;817&quot; data-ke-size=&quot;size16&quot;&gt;CI는 &lt;b&gt;지속적인 통합&lt;/b&gt;을 의미합니다.&lt;/p&gt;
&lt;p data-end=&quot;882&quot; data-start=&quot;842&quot; data-ke-size=&quot;size16&quot;&gt;여러 명의 개발자가 동시에 작업하다 보면 아래와 같은 문제가 발생합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;941&quot; data-start=&quot;884&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;897&quot; data-start=&quot;884&quot; data-section-id=&quot;1xm04wp&quot;&gt;서로 다른 코드 충돌&lt;/li&gt;
&lt;li data-end=&quot;914&quot; data-start=&quot;898&quot; data-section-id=&quot;16285du&quot;&gt;기능 간 예기치 못한 버그&lt;/li&gt;
&lt;li data-end=&quot;923&quot; data-start=&quot;915&quot; data-section-id=&quot;1ra4za9&quot;&gt;테스트 누락&lt;/li&gt;
&lt;li data-end=&quot;941&quot; data-start=&quot;924&quot; data-section-id=&quot;1bh8d2w&quot;&gt;환경 차이로 인한 실행 오류&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;990&quot; data-start=&quot;943&quot; data-ke-size=&quot;size16&quot;&gt;예전에는 기능 개발이 끝난 뒤 한 번에 코드를 합쳤기 때문에 충돌이 매우 많았습니다.&lt;/p&gt;
&lt;p data-end=&quot;1005&quot; data-start=&quot;992&quot; data-ke-size=&quot;size16&quot;&gt;하지만 CI 환경에서는:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1059&quot; data-start=&quot;1007&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1023&quot; data-start=&quot;1007&quot; data-section-id=&quot;efu20w&quot;&gt;개발자가 코드를 push&lt;/li&gt;
&lt;li data-end=&quot;1038&quot; data-start=&quot;1024&quot; data-section-id=&quot;cv543x&quot;&gt;자동으로 테스트 실행&lt;/li&gt;
&lt;li data-end=&quot;1047&quot; data-start=&quot;1039&quot; data-section-id=&quot;xt01ms&quot;&gt;빌드 검사&lt;/li&gt;
&lt;li data-end=&quot;1059&quot; data-start=&quot;1048&quot; data-section-id=&quot;sdd13u&quot;&gt;문제 여부 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1073&quot; data-start=&quot;1061&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 반복합니다.&lt;/p&gt;
&lt;p data-end=&quot;1077&quot; data-start=&quot;1075&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;blockquote data-end=&quot;1107&quot; data-start=&quot;1079&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1107&quot; data-start=&quot;1081&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;코드를 자주 합치고, 문제를 빠르게 발견한다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;1117&quot; data-start=&quot;1109&quot; data-ke-size=&quot;size16&quot;&gt;가 핵심입니다.&lt;/p&gt;
&lt;hr data-end=&quot;1122&quot; data-start=&quot;1119&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1163&quot; data-start=&quot;1124&quot; data-section-id=&quot;1r1mtev&quot;&gt;Continuous Delivery / Deployment (CD)&lt;/h1&gt;
&lt;p data-end=&quot;1181&quot; data-start=&quot;1165&quot; data-ke-size=&quot;size16&quot;&gt;CD는 자동 배포 개념입니다.&lt;/p&gt;
&lt;p data-end=&quot;1211&quot; data-start=&quot;1183&quot; data-ke-size=&quot;size16&quot;&gt;CI가 &amp;ldquo;문제가 없는 코드인지 검증&amp;rdquo;하는 단계라면,&lt;/p&gt;
&lt;p data-end=&quot;1217&quot; data-start=&quot;1213&quot; data-ke-size=&quot;size16&quot;&gt;CD는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1263&quot; data-start=&quot;1219&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1226&quot; data-start=&quot;1219&quot; data-section-id=&quot;u9bhho&quot;&gt;서버 배포&lt;/li&gt;
&lt;li data-end=&quot;1242&quot; data-start=&quot;1227&quot; data-section-id=&quot;1b7cf18&quot;&gt;Docker 이미지 생성&lt;/li&gt;
&lt;li data-end=&quot;1252&quot; data-start=&quot;1243&quot; data-section-id=&quot;1qzxwxh&quot;&gt;클라우드 반영&lt;/li&gt;
&lt;li data-end=&quot;1263&quot; data-start=&quot;1253&quot; data-section-id=&quot;1p2tizx&quot;&gt;서비스 업데이트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1275&quot; data-start=&quot;1265&quot; data-ke-size=&quot;size16&quot;&gt;까지 자동화합니다.&lt;/p&gt;
&lt;p data-end=&quot;1296&quot; data-start=&quot;1277&quot; data-ke-size=&quot;size16&quot;&gt;여기서 CD는 두 가지로 나뉩니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1320&quot; data-start=&quot;1298&quot; data-section-id=&quot;1fow638&quot; data-ke-size=&quot;size26&quot;&gt;Continuous Delivery&lt;/h2&gt;
&lt;p data-end=&quot;1339&quot; data-start=&quot;1322&quot; data-ke-size=&quot;size16&quot;&gt;배포 가능한 상태까지 자동 준비&lt;/p&gt;
&lt;p data-end=&quot;1362&quot; data-start=&quot;1341&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 실제 운영 배포는 사람이 버튼 클릭&lt;/p&gt;
&lt;h2 data-end=&quot;1388&quot; data-start=&quot;1364&quot; data-section-id=&quot;1ytq0ep&quot; data-ke-size=&quot;size26&quot;&gt;Continuous Deployment&lt;/h2&gt;
&lt;p data-end=&quot;1406&quot; data-start=&quot;1390&quot; data-ke-size=&quot;size16&quot;&gt;운영 서버까지 완전 자동 배포&lt;/p&gt;
&lt;p data-end=&quot;1424&quot; data-start=&quot;1408&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 테스트 통과 시 즉시 반영&lt;/p&gt;
&lt;hr data-end=&quot;1429&quot; data-start=&quot;1426&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1447&quot; data-start=&quot;1431&quot; data-section-id=&quot;wcn91q&quot;&gt;왜 CI/CD가 중요할까?&lt;/h1&gt;
&lt;p data-end=&quot;1478&quot; data-start=&quot;1449&quot; data-ke-size=&quot;size16&quot;&gt;개발을 하다 보면 아래 문제가 정말 자주 발생합니다.&lt;/p&gt;
&lt;h2 data-end=&quot;1504&quot; data-start=&quot;1480&quot; data-section-id=&quot;pr72es&quot; data-ke-size=&quot;size26&quot;&gt;1. &amp;ldquo;내 컴퓨터에서는 잘 되는데요?&amp;rdquo;&lt;/h2&gt;
&lt;p data-end=&quot;1519&quot; data-start=&quot;1506&quot; data-ke-size=&quot;size16&quot;&gt;가장 유명한 문제입니다.&lt;/p&gt;
&lt;p data-end=&quot;1535&quot; data-start=&quot;1521&quot; data-ke-size=&quot;size16&quot;&gt;로컬에서는 잘 동작하지만:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1580&quot; data-start=&quot;1537&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1549&quot; data-start=&quot;1537&quot; data-section-id=&quot;188ax3o&quot;&gt;Node 버전 차이&lt;/li&gt;
&lt;li data-end=&quot;1560&quot; data-start=&quot;1550&quot; data-section-id=&quot;1wgf2ep&quot;&gt;환경 변수 문제&lt;/li&gt;
&lt;li data-end=&quot;1568&quot; data-start=&quot;1561&quot; data-section-id=&quot;16v73vs&quot;&gt;OS 차이&lt;/li&gt;
&lt;li data-end=&quot;1580&quot; data-start=&quot;1569&quot; data-section-id=&quot;nsn2gw&quot;&gt;패키지 버전 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1602&quot; data-start=&quot;1582&quot; data-ke-size=&quot;size16&quot;&gt;등으로 서버에서는 오류가 발생합니다.&lt;/p&gt;
&lt;p data-end=&quot;1651&quot; data-start=&quot;1604&quot; data-ke-size=&quot;size16&quot;&gt;CI 환경에서는 항상 동일한 환경에서 검증하기 때문에 이런 문제를 줄일 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1656&quot; data-start=&quot;1653&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1673&quot; data-start=&quot;1658&quot; data-section-id=&quot;1egd7yx&quot; data-ke-size=&quot;size26&quot;&gt;2. 테스트 누락 방지&lt;/h2&gt;
&lt;p data-end=&quot;1700&quot; data-start=&quot;1675&quot; data-ke-size=&quot;size16&quot;&gt;수동 테스트는 반드시 놓치는 부분이 생깁니다.&lt;/p&gt;
&lt;p data-end=&quot;1719&quot; data-start=&quot;1702&quot; data-ke-size=&quot;size16&quot;&gt;특히 프로젝트 규모가 커질수록:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1758&quot; data-start=&quot;1721&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1726&quot; data-start=&quot;1721&quot; data-section-id=&quot;20xvn8&quot;&gt;로그인&lt;/li&gt;
&lt;li data-end=&quot;1733&quot; data-start=&quot;1727&quot; data-section-id=&quot;asusj5&quot;&gt;회원가입&lt;/li&gt;
&lt;li data-end=&quot;1742&quot; data-start=&quot;1734&quot; data-section-id=&quot;1vvb6ok&quot;&gt;API 응답&lt;/li&gt;
&lt;li data-end=&quot;1750&quot; data-start=&quot;1743&quot; data-section-id=&quot;6upmng&quot;&gt;권한 처리&lt;/li&gt;
&lt;li data-end=&quot;1758&quot; data-start=&quot;1751&quot; data-section-id=&quot;ca92vg&quot;&gt;예외 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1781&quot; data-start=&quot;1760&quot; data-ke-size=&quot;size16&quot;&gt;등을 전부 사람이 확인하기 어렵습니다.&lt;/p&gt;
&lt;p data-end=&quot;1817&quot; data-start=&quot;1783&quot; data-ke-size=&quot;size16&quot;&gt;CI에서는 코드가 올라갈 때마다 자동으로 테스트를 수행합니다.&lt;/p&gt;
&lt;hr data-end=&quot;1822&quot; data-start=&quot;1819&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1838&quot; data-start=&quot;1824&quot; data-section-id=&quot;1x3ny7d&quot; data-ke-size=&quot;size26&quot;&gt;3. 배포 속도 향상&lt;/h2&gt;
&lt;p data-end=&quot;1867&quot; data-start=&quot;1840&quot; data-ke-size=&quot;size16&quot;&gt;수동 배포 과정은 생각보다 시간이 오래 걸립니다.&lt;/p&gt;
&lt;p data-end=&quot;1875&quot; data-start=&quot;1869&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1921&quot; data-start=&quot;1877&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1887&quot; data-start=&quot;1877&quot; data-section-id=&quot;1co4z07&quot;&gt;코드 pull&lt;/li&gt;
&lt;li data-end=&quot;1897&quot; data-start=&quot;1888&quot; data-section-id=&quot;1kkn6ig&quot;&gt;의존성 설치&lt;/li&gt;
&lt;li data-end=&quot;1903&quot; data-start=&quot;1898&quot; data-section-id=&quot;1ymbm0&quot;&gt;빌드&lt;/li&gt;
&lt;li data-end=&quot;1912&quot; data-start=&quot;1904&quot; data-section-id=&quot;yuw9wq&quot;&gt;서버 실행&lt;/li&gt;
&lt;li data-end=&quot;1921&quot; data-start=&quot;1913&quot; data-section-id=&quot;1p3zk0n&quot;&gt;로그 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;1954&quot; data-start=&quot;1923&quot; data-ke-size=&quot;size16&quot;&gt;이 과정을 매번 사람이 수행하면 실수 가능성이 커집니다.&lt;/p&gt;
&lt;p data-end=&quot;1988&quot; data-start=&quot;1956&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD 환경에서는 이 모든 작업이 자동으로 수행됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1993&quot; data-start=&quot;1990&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2011&quot; data-start=&quot;1995&quot; data-section-id=&quot;1suvsgs&quot;&gt;CI/CD 파이프라인 설계&lt;/h1&gt;
&lt;p data-end=&quot;2043&quot; data-start=&quot;2013&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD 파이프라인은 보통 아래 흐름으로 구성됩니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;코드 Push
   &amp;darr;
Lint 검사
   &amp;darr;
테스트 실행
   &amp;darr;
빌드 수행
   &amp;darr;
Docker 이미지 생성
   &amp;darr;
스테이징 배포
   &amp;darr;
인수 테스트
   &amp;darr;
운영 배포&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2175&quot; data-start=&quot;2157&quot; data-ke-size=&quot;size16&quot;&gt;각 단계를 자세히 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2180&quot; data-start=&quot;2177&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2194&quot; data-start=&quot;2182&quot; data-section-id=&quot;3kqlm&quot;&gt;1. Lint 검사&lt;/h1&gt;
&lt;p data-end=&quot;2223&quot; data-start=&quot;2196&quot; data-ke-size=&quot;size16&quot;&gt;Lint는 코드 스타일과 문법 문제를 검사합니다.&lt;/p&gt;
&lt;p data-end=&quot;2231&quot; data-start=&quot;2225&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2260&quot; data-start=&quot;2233&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2241&quot; data-start=&quot;2233&quot; data-section-id=&quot;1ykbn6p&quot;&gt;ESLint&lt;/li&gt;
&lt;li data-end=&quot;2249&quot; data-start=&quot;2242&quot; data-section-id=&quot;16xxhd0&quot;&gt;Biome&lt;/li&gt;
&lt;li data-end=&quot;2260&quot; data-start=&quot;2250&quot; data-section-id=&quot;1oe1knl&quot;&gt;Prettier&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2271&quot; data-start=&quot;2262&quot; data-ke-size=&quot;size16&quot;&gt;등을 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;2279&quot; data-start=&quot;2273&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;actionscript&quot;&gt;&lt;code&gt;const a = &quot;hello&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2346&quot; data-start=&quot;2310&quot; data-ke-size=&quot;size16&quot;&gt;세미콜론이 없거나 스타일 규칙이 맞지 않으면 자동으로 감지합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2351&quot; data-start=&quot;2348&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2362&quot; data-start=&quot;2353&quot; data-section-id=&quot;189b3kc&quot;&gt;왜 중요할까?&lt;/h1&gt;
&lt;p data-end=&quot;2394&quot; data-start=&quot;2364&quot; data-ke-size=&quot;size16&quot;&gt;팀 프로젝트에서는 코드 스타일 통일이 매우 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;2407&quot; data-start=&quot;2396&quot; data-ke-size=&quot;size16&quot;&gt;스타일이 제각각이면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2439&quot; data-start=&quot;2409&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2417&quot; data-start=&quot;2409&quot; data-section-id=&quot;1rmop8k&quot;&gt;가독성 저하&lt;/li&gt;
&lt;li data-end=&quot;2426&quot; data-start=&quot;2418&quot; data-section-id=&quot;1ge683o&quot;&gt;리뷰 어려움&lt;/li&gt;
&lt;li data-end=&quot;2439&quot; data-start=&quot;2427&quot; data-section-id=&quot;64a990&quot;&gt;유지보수 비용 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2451&quot; data-start=&quot;2441&quot; data-ke-size=&quot;size16&quot;&gt;문제가 발생합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2456&quot; data-start=&quot;2453&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2480&quot; data-start=&quot;2458&quot; data-section-id=&quot;16gi9lj&quot;&gt;2. 단위 테스트(Unit Test)&lt;/h1&gt;
&lt;p data-end=&quot;2509&quot; data-start=&quot;2482&quot; data-ke-size=&quot;size16&quot;&gt;단위 테스트는 가장 작은 기능 단위를 검증합니다.&lt;/p&gt;
&lt;p data-end=&quot;2514&quot; data-start=&quot;2511&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;function add(a, b) {
  return a + b;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;2570&quot; data-start=&quot;2566&quot; data-ke-size=&quot;size16&quot;&gt;테스트:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;expect(add(1, 2)).toBe(3);&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2613&quot; data-start=&quot;2610&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2627&quot; data-start=&quot;2615&quot; data-section-id=&quot;cn60gn&quot;&gt;단위 테스트의 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;2640&quot; data-start=&quot;2629&quot; data-section-id=&quot;11d4vl&quot; data-ke-size=&quot;size26&quot;&gt;빠른 오류 발견&lt;/h2&gt;
&lt;p data-end=&quot;2659&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;코드 수정 직후 문제 확인 가능&lt;/p&gt;
&lt;h2 data-end=&quot;2672&quot; data-start=&quot;2661&quot; data-section-id=&quot;1igq3cd&quot; data-ke-size=&quot;size26&quot;&gt;리팩토링 안정성&lt;/h2&gt;
&lt;p data-end=&quot;2694&quot; data-start=&quot;2674&quot; data-ke-size=&quot;size16&quot;&gt;기존 기능이 깨졌는지 즉시 확인 가능&lt;/p&gt;
&lt;h2 data-end=&quot;2706&quot; data-start=&quot;2696&quot; data-section-id=&quot;be2anh&quot; data-ke-size=&quot;size26&quot;&gt;유지보수 향상&lt;/h2&gt;
&lt;p data-end=&quot;2725&quot; data-start=&quot;2708&quot; data-ke-size=&quot;size16&quot;&gt;오래된 프로젝트일수록 효과가 큼&lt;/p&gt;
&lt;hr data-end=&quot;2730&quot; data-start=&quot;2727&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2756&quot; data-start=&quot;2732&quot; data-section-id=&quot;rglcn4&quot;&gt;코드 커버리지(Code Coverage)&lt;/h1&gt;
&lt;p data-end=&quot;2764&quot; data-start=&quot;2758&quot; data-ke-size=&quot;size16&quot;&gt;커버리지는:&lt;/p&gt;
&lt;blockquote data-end=&quot;2789&quot; data-start=&quot;2766&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;2789&quot; data-start=&quot;2768&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;테스트가 코드의 몇 %를 검증했는가&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;2799&quot; data-start=&quot;2791&quot; data-ke-size=&quot;size16&quot;&gt;를 의미합니다.&lt;/p&gt;
&lt;p data-end=&quot;2804&quot; data-start=&quot;2801&quot; data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2836&quot; data-start=&quot;2806&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2823&quot; data-start=&quot;2806&quot; data-section-id=&quot;1yo8jkw&quot;&gt;함수 10개 중 8개 테스트&lt;/li&gt;
&lt;li data-end=&quot;2836&quot; data-start=&quot;2824&quot; data-section-id=&quot;17io3d9&quot;&gt;조건문 일부 미검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2848&quot; data-start=&quot;2838&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 커버리지 80%&lt;/p&gt;
&lt;hr data-end=&quot;2853&quot; data-start=&quot;2850&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2869&quot; data-start=&quot;2855&quot; data-section-id=&quot;1b3lh8n&quot;&gt;커버리지가 중요한 이유&lt;/h1&gt;
&lt;p data-end=&quot;2897&quot; data-start=&quot;2871&quot; data-ke-size=&quot;size16&quot;&gt;테스트가 존재한다고 해서 충분한 것은 아닙니다.&lt;/p&gt;
&lt;p data-end=&quot;2929&quot; data-start=&quot;2899&quot; data-ke-size=&quot;size16&quot;&gt;실제로 중요한 로직이 테스트되지 않았을 수도 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;2935&quot; data-start=&quot;2931&quot; data-ke-size=&quot;size16&quot;&gt;그래서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2960&quot; data-start=&quot;2937&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2941&quot; data-start=&quot;2937&quot; data-section-id=&quot;yii57c&quot;&gt;함수&lt;/li&gt;
&lt;li data-end=&quot;2947&quot; data-start=&quot;2942&quot; data-section-id=&quot;2j3dp0&quot;&gt;조건문&lt;/li&gt;
&lt;li data-end=&quot;2952&quot; data-start=&quot;2948&quot; data-section-id=&quot;yi147w&quot;&gt;분기&lt;/li&gt;
&lt;li data-end=&quot;2960&quot; data-start=&quot;2953&quot; data-section-id=&quot;ca92vg&quot;&gt;예외 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2985&quot; data-start=&quot;2962&quot; data-ke-size=&quot;size16&quot;&gt;등이 얼마나 검증되었는지 확인해야 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;2990&quot; data-start=&quot;2987&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3005&quot; data-start=&quot;2992&quot; data-section-id=&quot;ecj2zh&quot;&gt;3. 빌드 및 패키징&lt;/h1&gt;
&lt;p data-end=&quot;3033&quot; data-start=&quot;3007&quot; data-ke-size=&quot;size16&quot;&gt;테스트가 끝나면 실제 서비스 형태로 빌드합니다.&lt;/p&gt;
&lt;p data-end=&quot;3054&quot; data-start=&quot;3035&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 React 프로젝트라면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;pnpm build&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3089&quot; data-start=&quot;3080&quot; data-ke-size=&quot;size16&quot;&gt;NestJS라면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;npm run build&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3126&quot; data-start=&quot;3118&quot; data-ke-size=&quot;size16&quot;&gt;을 수행합니다.&lt;/p&gt;
&lt;hr data-end=&quot;3131&quot; data-start=&quot;3128&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3141&quot; data-start=&quot;3133&quot; data-section-id=&quot;xqypg4&quot;&gt;패키징이란?&lt;/h1&gt;
&lt;p data-end=&quot;3171&quot; data-start=&quot;3143&quot; data-ke-size=&quot;size16&quot;&gt;애플리케이션을 배포 가능한 형태로 묶는 과정입니다.&lt;/p&gt;
&lt;p data-end=&quot;3196&quot; data-start=&quot;3173&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로 Docker를 많이 사용합니다.&lt;/p&gt;
&lt;hr data-end=&quot;3201&quot; data-start=&quot;3198&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3218&quot; data-start=&quot;3203&quot; data-section-id=&quot;1s6fzz7&quot;&gt;Docker 기반 패키징&lt;/h1&gt;
&lt;p data-end=&quot;3234&quot; data-start=&quot;3220&quot; data-ke-size=&quot;size16&quot;&gt;예시 Dockerfile:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;FROM node:20

WORKDIR /app

COPY . .

RUN pnpm install

RUN pnpm build

CMD [&quot;pnpm&quot;, &quot;start&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3352&quot; data-start=&quot;3349&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3366&quot; data-start=&quot;3354&quot; data-section-id=&quot;szek73&quot;&gt;Docker의 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;3376&quot; data-start=&quot;3368&quot; data-section-id=&quot;17h3emh&quot; data-ke-size=&quot;size26&quot;&gt;환경 통일&lt;/h2&gt;
&lt;p data-end=&quot;3393&quot; data-start=&quot;3378&quot; data-ke-size=&quot;size16&quot;&gt;개발/테스트/운영 환경 일치&lt;/p&gt;
&lt;h2 data-end=&quot;3404&quot; data-start=&quot;3395&quot; data-section-id=&quot;7kd1cl&quot; data-ke-size=&quot;size26&quot;&gt;배포 안정성&lt;/h2&gt;
&lt;p data-end=&quot;3424&quot; data-start=&quot;3406&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;내 컴퓨터에서는 됨&amp;rdquo; 문제 감소&lt;/p&gt;
&lt;h2 data-end=&quot;3432&quot; data-start=&quot;3426&quot; data-section-id=&quot;1he1q04&quot; data-ke-size=&quot;size26&quot;&gt;확장성&lt;/h2&gt;
&lt;p data-end=&quot;3449&quot; data-start=&quot;3434&quot; data-ke-size=&quot;size16&quot;&gt;클라우드 환경과 궁합이 좋음&lt;/p&gt;
&lt;hr data-end=&quot;3454&quot; data-start=&quot;3451&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3468&quot; data-start=&quot;3456&quot; data-section-id=&quot;zfy4zt&quot;&gt;4. 스테이징 배포&lt;/h1&gt;
&lt;p data-end=&quot;3485&quot; data-start=&quot;3470&quot; data-ke-size=&quot;size16&quot;&gt;스테이징(Staging)은:&lt;/p&gt;
&lt;blockquote data-end=&quot;3506&quot; data-start=&quot;3487&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3506&quot; data-start=&quot;3489&quot; data-ke-size=&quot;size16&quot;&gt;운영과 거의 동일한 테스트 서버&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3512&quot; data-start=&quot;3508&quot; data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;3554&quot; data-start=&quot;3514&quot; data-ke-size=&quot;size16&quot;&gt;운영 서버에 바로 배포하면 위험하기 때문에 중간 검증 단계가 필요합니다.&lt;/p&gt;
&lt;hr data-end=&quot;3559&quot; data-start=&quot;3556&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3576&quot; data-start=&quot;3561&quot; data-section-id=&quot;xv1pt&quot;&gt;왜 스테이징이 중요할까?&lt;/h1&gt;
&lt;p data-end=&quot;3590&quot; data-start=&quot;3578&quot; data-ke-size=&quot;size16&quot;&gt;실제 운영 환경에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3632&quot; data-start=&quot;3592&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3599&quot; data-start=&quot;3592&quot; data-section-id=&quot;16x5eha&quot;&gt;DB 연결&lt;/li&gt;
&lt;li data-end=&quot;3607&quot; data-start=&quot;3600&quot; data-section-id=&quot;179h5y9&quot;&gt;Redis&lt;/li&gt;
&lt;li data-end=&quot;3612&quot; data-start=&quot;3608&quot; data-section-id=&quot;yilg7h&quot;&gt;인증&lt;/li&gt;
&lt;li data-end=&quot;3624&quot; data-start=&quot;3613&quot; data-section-id=&quot;1tr6pvo&quot;&gt;클라우드 스토리지&lt;/li&gt;
&lt;li data-end=&quot;3632&quot; data-start=&quot;3625&quot; data-section-id=&quot;1ndd3yt&quot;&gt;환경 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3650&quot; data-start=&quot;3634&quot; data-ke-size=&quot;size16&quot;&gt;등 다양한 요소가 연결됩니다.&lt;/p&gt;
&lt;p data-end=&quot;3673&quot; data-start=&quot;3652&quot; data-ke-size=&quot;size16&quot;&gt;로컬 테스트만으로는 검증이 어렵습니다.&lt;/p&gt;
&lt;p data-end=&quot;3702&quot; data-start=&quot;3675&quot; data-ke-size=&quot;size16&quot;&gt;그래서 운영과 유사한 환경에서 먼저 테스트합니다.&lt;/p&gt;
&lt;hr data-end=&quot;3707&quot; data-start=&quot;3704&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3725&quot; data-start=&quot;3709&quot; data-section-id=&quot;1bor7f8&quot;&gt;스테이징 서버에서 하는 것&lt;/h1&gt;
&lt;h2 data-end=&quot;3736&quot; data-start=&quot;3727&quot; data-section-id=&quot;zjs4lc&quot; data-ke-size=&quot;size26&quot;&gt;API 검증&lt;/h2&gt;
&lt;p data-end=&quot;3747&quot; data-start=&quot;3738&quot; data-ke-size=&quot;size16&quot;&gt;실제 요청 테스트&lt;/p&gt;
&lt;h2 data-end=&quot;3758&quot; data-start=&quot;3749&quot; data-section-id=&quot;17fvkix&quot; data-ke-size=&quot;size26&quot;&gt;UI 테스트&lt;/h2&gt;
&lt;p data-end=&quot;3769&quot; data-start=&quot;3760&quot; data-ke-size=&quot;size16&quot;&gt;프론트 화면 확인&lt;/p&gt;
&lt;h2 data-end=&quot;3780&quot; data-start=&quot;3771&quot; data-section-id=&quot;1d98a75&quot; data-ke-size=&quot;size26&quot;&gt;성능 테스트&lt;/h2&gt;
&lt;p data-end=&quot;3790&quot; data-start=&quot;3782&quot; data-ke-size=&quot;size16&quot;&gt;응답 속도 확인&lt;/p&gt;
&lt;h2 data-end=&quot;3800&quot; data-start=&quot;3792&quot; data-section-id=&quot;12m0yx8&quot; data-ke-size=&quot;size26&quot;&gt;협업 검증&lt;/h2&gt;
&lt;p data-end=&quot;3816&quot; data-start=&quot;3802&quot; data-ke-size=&quot;size16&quot;&gt;프론트/백엔드 연동 테스트&lt;/p&gt;
&lt;hr data-end=&quot;3821&quot; data-start=&quot;3818&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3851&quot; data-start=&quot;3823&quot; data-section-id=&quot;lar38z&quot;&gt;5. 인수 테스트(Acceptance Test)&lt;/h1&gt;
&lt;p data-end=&quot;3861&quot; data-start=&quot;3853&quot; data-ke-size=&quot;size16&quot;&gt;인수 테스트는:&lt;/p&gt;
&lt;blockquote data-end=&quot;3888&quot; data-start=&quot;3863&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;3888&quot; data-start=&quot;3865&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;사용자 입장에서 기능이 정상 동작하는가&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;3904&quot; data-start=&quot;3890&quot; data-ke-size=&quot;size16&quot;&gt;를 확인하는 테스트입니다.&lt;/p&gt;
&lt;hr data-end=&quot;3909&quot; data-start=&quot;3906&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3924&quot; data-start=&quot;3911&quot; data-section-id=&quot;1l1vzpy&quot;&gt;단위 테스트와 차이점&lt;/h1&gt;
&lt;h2 data-end=&quot;3935&quot; data-start=&quot;3926&quot; data-section-id=&quot;saamyh&quot; data-ke-size=&quot;size26&quot;&gt;단위 테스트&lt;/h2&gt;
&lt;p data-end=&quot;3945&quot; data-start=&quot;3937&quot; data-ke-size=&quot;size16&quot;&gt;함수/모듈 중심&lt;/p&gt;
&lt;h2 data-end=&quot;3956&quot; data-start=&quot;3947&quot; data-section-id=&quot;334j79&quot; data-ke-size=&quot;size26&quot;&gt;인수 테스트&lt;/h2&gt;
&lt;p data-end=&quot;3970&quot; data-start=&quot;3958&quot; data-ke-size=&quot;size16&quot;&gt;실제 사용자 흐름 중심&lt;/p&gt;
&lt;hr data-end=&quot;3975&quot; data-start=&quot;3972&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3981&quot; data-start=&quot;3977&quot; data-section-id=&quot;yik08i&quot;&gt;예시&lt;/h1&gt;
&lt;p data-end=&quot;3994&quot; data-start=&quot;3983&quot; data-ke-size=&quot;size16&quot;&gt;사용자 로그인 흐름:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4059&quot; data-start=&quot;3996&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;4009&quot; data-start=&quot;3996&quot; data-section-id=&quot;1r1cxjq&quot;&gt;로그인 페이지 접속&lt;/li&gt;
&lt;li data-end=&quot;4019&quot; data-start=&quot;4010&quot; data-section-id=&quot;16gdqhx&quot;&gt;이메일 입력&lt;/li&gt;
&lt;li data-end=&quot;4030&quot; data-start=&quot;4020&quot; data-section-id=&quot;17ykqks&quot;&gt;비밀번호 입력&lt;/li&gt;
&lt;li data-end=&quot;4043&quot; data-start=&quot;4031&quot; data-section-id=&quot;19finia&quot;&gt;로그인 버튼 클릭&lt;/li&gt;
&lt;li data-end=&quot;4059&quot; data-start=&quot;4044&quot; data-section-id=&quot;txejni&quot;&gt;메인 페이지 이동 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;4077&quot; data-start=&quot;4061&quot; data-ke-size=&quot;size16&quot;&gt;이 전체 흐름을 테스트합니다.&lt;/p&gt;
&lt;hr data-end=&quot;4082&quot; data-start=&quot;4079&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4098&quot; data-start=&quot;4084&quot; data-section-id=&quot;1s893vc&quot;&gt;E2E 테스트와의 관계&lt;/h1&gt;
&lt;p data-end=&quot;4129&quot; data-start=&quot;4100&quot; data-ke-size=&quot;size16&quot;&gt;인수 테스트는 보통 E2E 테스트 형태로 구현됩니다.&lt;/p&gt;
&lt;p data-end=&quot;4137&quot; data-start=&quot;4131&quot; data-ke-size=&quot;size16&quot;&gt;대표 도구:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4172&quot; data-start=&quot;4139&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4149&quot; data-start=&quot;4139&quot; data-section-id=&quot;e9kbt4&quot;&gt;Selenium&lt;/li&gt;
&lt;li data-end=&quot;4159&quot; data-start=&quot;4150&quot; data-section-id=&quot;c261px&quot;&gt;Cypress&lt;/li&gt;
&lt;li data-end=&quot;4172&quot; data-start=&quot;4160&quot; data-section-id=&quot;a3df3v&quot;&gt;Playwright&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;4177&quot; data-start=&quot;4174&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4195&quot; data-start=&quot;4179&quot; data-section-id=&quot;1snhxlo&quot;&gt;실제 CI/CD 흐름 예시&lt;/h1&gt;
&lt;p data-end=&quot;4224&quot; data-start=&quot;4197&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 GitHub Actions를 사용하면:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;name: CI

on:
  push:
    branches:
      - develop

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v3

      - run: pnpm install

      - run: pnpm lint

      - run: pnpm test

      - run: pnpm build&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4531&quot; data-start=&quot;4515&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 자동화할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;4536&quot; data-start=&quot;4533&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4558&quot; data-start=&quot;4538&quot; data-section-id=&quot;mruf4z&quot;&gt;GitHub Actions의 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;4576&quot; data-start=&quot;4560&quot; data-section-id=&quot;xlsbu8&quot; data-ke-size=&quot;size26&quot;&gt;GitHub와 통합 쉬움&lt;/h2&gt;
&lt;p data-end=&quot;4592&quot; data-start=&quot;4578&quot; data-ke-size=&quot;size16&quot;&gt;별도 서버 없이 사용 가능&lt;/p&gt;
&lt;h2 data-end=&quot;4605&quot; data-start=&quot;4594&quot; data-section-id=&quot;ib7lhb&quot; data-ke-size=&quot;size26&quot;&gt;PR 검증 가능&lt;/h2&gt;
&lt;p data-end=&quot;4628&quot; data-start=&quot;4607&quot; data-ke-size=&quot;size16&quot;&gt;Pull Request마다 자동 테스트&lt;/p&gt;
&lt;h2 data-end=&quot;4641&quot; data-start=&quot;4630&quot; data-section-id=&quot;x98vg&quot; data-ke-size=&quot;size26&quot;&gt;협업 효율 증가&lt;/h2&gt;
&lt;p data-end=&quot;4654&quot; data-start=&quot;4643&quot; data-ke-size=&quot;size16&quot;&gt;오류 코드 머지 방지&lt;/p&gt;
&lt;hr data-end=&quot;4659&quot; data-start=&quot;4656&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4678&quot; data-start=&quot;4661&quot; data-section-id=&quot;16wt25q&quot;&gt;실무에서 자주 사용하는 전략&lt;/h1&gt;
&lt;h1 data-end=&quot;4688&quot; data-start=&quot;4680&quot; data-section-id=&quot;11f554v&quot;&gt;브랜치 전략&lt;/h1&gt;
&lt;p data-end=&quot;4696&quot; data-start=&quot;4690&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4737&quot; data-start=&quot;4698&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4704&quot; data-start=&quot;4698&quot; data-section-id=&quot;1j36lsz&quot;&gt;main&lt;/li&gt;
&lt;li data-end=&quot;4714&quot; data-start=&quot;4705&quot; data-section-id=&quot;1juj8mh&quot;&gt;develop&lt;/li&gt;
&lt;li data-end=&quot;4726&quot; data-start=&quot;4715&quot; data-section-id=&quot;1lcucgp&quot;&gt;feature/*&lt;/li&gt;
&lt;li data-end=&quot;4737&quot; data-start=&quot;4727&quot; data-section-id=&quot;n467vt&quot;&gt;hotfix/*&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4752&quot; data-start=&quot;4739&quot; data-ke-size=&quot;size16&quot;&gt;형태를 많이 사용합니다.&lt;/p&gt;
&lt;hr data-end=&quot;4757&quot; data-start=&quot;4754&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4772&quot; data-start=&quot;4759&quot; data-section-id=&quot;16r9yfu&quot;&gt;feature 브랜치&lt;/h1&gt;
&lt;p data-end=&quot;4780&quot; data-start=&quot;4774&quot; data-ke-size=&quot;size16&quot;&gt;기능 개발용&lt;/p&gt;
&lt;hr data-end=&quot;4785&quot; data-start=&quot;4782&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4800&quot; data-start=&quot;4787&quot; data-section-id=&quot;1rfc6rz&quot;&gt;develop 브랜치&lt;/h1&gt;
&lt;p data-end=&quot;4809&quot; data-start=&quot;4802&quot; data-ke-size=&quot;size16&quot;&gt;통합 테스트용&lt;/p&gt;
&lt;hr data-end=&quot;4814&quot; data-start=&quot;4811&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4826&quot; data-start=&quot;4816&quot; data-section-id=&quot;13vpjb9&quot;&gt;main 브랜치&lt;/h1&gt;
&lt;p data-end=&quot;4836&quot; data-start=&quot;4828&quot; data-ke-size=&quot;size16&quot;&gt;실제 운영 코드&lt;/p&gt;
&lt;hr data-end=&quot;4841&quot; data-start=&quot;4838&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4856&quot; data-start=&quot;4843&quot; data-section-id=&quot;164rfp4&quot;&gt;PR 기반 코드 리뷰&lt;/h1&gt;
&lt;p data-end=&quot;4884&quot; data-start=&quot;4858&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD와 함께 코드 리뷰 문화도 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;4894&quot; data-start=&quot;4886&quot; data-ke-size=&quot;size16&quot;&gt;PR 과정에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4930&quot; data-start=&quot;4896&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4906&quot; data-start=&quot;4896&quot; data-section-id=&quot;fxevxp&quot;&gt;코드 품질 확인&lt;/li&gt;
&lt;li data-end=&quot;4914&quot; data-start=&quot;4907&quot; data-section-id=&quot;91w2i0&quot;&gt;로직 검증&lt;/li&gt;
&lt;li data-end=&quot;4922&quot; data-start=&quot;4915&quot; data-section-id=&quot;7htzv9&quot;&gt;버그 예방&lt;/li&gt;
&lt;li data-end=&quot;4930&quot; data-start=&quot;4923&quot; data-section-id=&quot;aeiwq0&quot;&gt;구조 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4940&quot; data-start=&quot;4932&quot; data-ke-size=&quot;size16&quot;&gt;이 가능합니다.&lt;/p&gt;
&lt;hr data-end=&quot;4945&quot; data-start=&quot;4942&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4966&quot; data-start=&quot;4947&quot; data-section-id=&quot;23j1ki&quot;&gt;자동화가 가져오는 가장 큰 변화&lt;/h1&gt;
&lt;p data-end=&quot;4993&quot; data-start=&quot;4968&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD를 도입하면 가장 크게 바뀌는 것은:&lt;/p&gt;
&lt;blockquote data-end=&quot;5019&quot; data-start=&quot;4995&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;5019&quot; data-start=&quot;4997&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;개발 속도보다 안정성이 훨씬 좋아진다&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;5025&quot; data-start=&quot;5021&quot; data-ke-size=&quot;size16&quot;&gt;입니다.&lt;/p&gt;
&lt;p data-end=&quot;5056&quot; data-start=&quot;5027&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 설정이 어렵고 복잡하게 느껴질 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;5095&quot; data-start=&quot;5058&quot; data-ke-size=&quot;size16&quot;&gt;하지만 프로젝트 규모가 커질수록 자동화의 가치가 엄청나게 커집니다.&lt;/p&gt;
&lt;hr data-end=&quot;5100&quot; data-start=&quot;5097&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5116&quot; data-start=&quot;5102&quot; data-section-id=&quot;6zg8ai&quot;&gt;실제로 줄어드는 문제들&lt;/h1&gt;
&lt;h2 data-end=&quot;5129&quot; data-start=&quot;5118&quot; data-section-id=&quot;1yzhuh&quot; data-ke-size=&quot;size26&quot;&gt;배포 실수 감소&lt;/h2&gt;
&lt;p data-end=&quot;5139&quot; data-start=&quot;5131&quot; data-ke-size=&quot;size16&quot;&gt;수동 작업 제거&lt;/p&gt;
&lt;h2 data-end=&quot;5153&quot; data-start=&quot;5141&quot; data-section-id=&quot;15sho9c&quot; data-ke-size=&quot;size26&quot;&gt;테스트 누락 감소&lt;/h2&gt;
&lt;p data-end=&quot;5160&quot; data-start=&quot;5155&quot; data-ke-size=&quot;size16&quot;&gt;자동 검증&lt;/p&gt;
&lt;h2 data-end=&quot;5173&quot; data-start=&quot;5162&quot; data-section-id=&quot;12lwyjs&quot; data-ke-size=&quot;size26&quot;&gt;협업 충돌 감소&lt;/h2&gt;
&lt;p data-end=&quot;5181&quot; data-start=&quot;5175&quot; data-ke-size=&quot;size16&quot;&gt;빠른 피드백&lt;/p&gt;
&lt;h2 data-end=&quot;5197&quot; data-start=&quot;5183&quot; data-section-id=&quot;1e475ks&quot; data-ke-size=&quot;size26&quot;&gt;장애 대응 속도 향상&lt;/h2&gt;
&lt;p data-end=&quot;5210&quot; data-start=&quot;5199&quot; data-ke-size=&quot;size16&quot;&gt;문제 위치 빠른 파악&lt;/p&gt;
&lt;hr data-end=&quot;5215&quot; data-start=&quot;5212&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5232&quot; data-start=&quot;5217&quot; data-section-id=&quot;17l1i0h&quot;&gt;DevOps 문화와 연결&lt;/h1&gt;
&lt;p data-end=&quot;5253&quot; data-start=&quot;5234&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD는 단순 도구가 아닙니다.&lt;/p&gt;
&lt;p data-end=&quot;5310&quot; data-start=&quot;5255&quot; data-ke-size=&quot;size16&quot;&gt;개발(Development)과 운영(Operations)을 연결하는 DevOps 문화의 핵심입니다.&lt;/p&gt;
&lt;p data-end=&quot;5314&quot; data-start=&quot;5312&quot; data-ke-size=&quot;size16&quot;&gt;즉:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5340&quot; data-start=&quot;5316&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5321&quot; data-start=&quot;5316&quot; data-section-id=&quot;22wipk&quot;&gt;개발자&lt;/li&gt;
&lt;li data-end=&quot;5326&quot; data-start=&quot;5322&quot; data-section-id=&quot;yhmu6w&quot;&gt;QA&lt;/li&gt;
&lt;li data-end=&quot;5332&quot; data-start=&quot;5327&quot; data-section-id=&quot;2jx9h9&quot;&gt;운영팀&lt;/li&gt;
&lt;li data-end=&quot;5340&quot; data-start=&quot;5333&quot; data-section-id=&quot;3k58ug&quot;&gt;인프라 팀&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5372&quot; data-start=&quot;5342&quot; data-ke-size=&quot;size16&quot;&gt;이 함께 안정적인 서비스를 만드는 방향으로 연결됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;5377&quot; data-start=&quot;5374&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5396&quot; data-start=&quot;5379&quot; data-section-id=&quot;utnzas&quot;&gt;앞으로 더 중요해지는 자동화&lt;/h1&gt;
&lt;p data-end=&quot;5403&quot; data-start=&quot;5398&quot; data-ke-size=&quot;size16&quot;&gt;최근에는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5474&quot; data-start=&quot;5405&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5413&quot; data-start=&quot;5405&quot; data-section-id=&quot;1u6gra4&quot;&gt;Docker&lt;/li&gt;
&lt;li data-end=&quot;5426&quot; data-start=&quot;5414&quot; data-section-id=&quot;1hb2fca&quot;&gt;Kubernetes&lt;/li&gt;
&lt;li data-end=&quot;5443&quot; data-start=&quot;5427&quot; data-section-id=&quot;gi477k&quot;&gt;GitHub Actions&lt;/li&gt;
&lt;li data-end=&quot;5453&quot; data-start=&quot;5444&quot; data-section-id=&quot;4u2sxi&quot;&gt;Jenkins&lt;/li&gt;
&lt;li data-end=&quot;5462&quot; data-start=&quot;5454&quot; data-section-id=&quot;1wklg38&quot;&gt;ArgoCD&lt;/li&gt;
&lt;li data-end=&quot;5474&quot; data-start=&quot;5463&quot; data-section-id=&quot;1xltspa&quot;&gt;Terraform&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5500&quot; data-start=&quot;5476&quot; data-ke-size=&quot;size16&quot;&gt;등 자동화 생태계가 더욱 발전하고 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;5524&quot; data-start=&quot;5502&quot; data-ke-size=&quot;size16&quot;&gt;특히 AI 기반 개발 도구가 증가하면서:&lt;/p&gt;
&lt;blockquote data-end=&quot;5556&quot; data-start=&quot;5526&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;5556&quot; data-start=&quot;5528&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;더 빠르게 개발하고 더 안정적으로 배포하는 능력&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;5574&quot; data-start=&quot;5558&quot; data-ke-size=&quot;size16&quot;&gt;이 점점 중요해지고 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5579&quot; data-start=&quot;5576&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5586&quot; data-start=&quot;5581&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;5622&quot; data-start=&quot;5588&quot; data-ke-size=&quot;size16&quot;&gt;처음 CI/CD를 접하면 어렵고 복잡하게 느껴질 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;5645&quot; data-start=&quot;5624&quot; data-ke-size=&quot;size16&quot;&gt;하지만 실제 프로젝트를 진행하다 보면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5686&quot; data-start=&quot;5647&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5656&quot; data-start=&quot;5647&quot; data-section-id=&quot;stg31h&quot;&gt;테스트 자동화&lt;/li&gt;
&lt;li data-end=&quot;5665&quot; data-start=&quot;5657&quot; data-section-id=&quot;1j7imw9&quot;&gt;배포 자동화&lt;/li&gt;
&lt;li data-end=&quot;5675&quot; data-start=&quot;5666&quot; data-section-id=&quot;uwwinw&quot;&gt;스테이징 검증&lt;/li&gt;
&lt;li data-end=&quot;5686&quot; data-start=&quot;5676&quot; data-section-id=&quot;fx2uks&quot;&gt;코드 품질 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5708&quot; data-start=&quot;5688&quot; data-ke-size=&quot;size16&quot;&gt;가 얼마나 중요한지 체감하게 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;5723&quot; data-start=&quot;5710&quot; data-ke-size=&quot;size16&quot;&gt;특히 팀 프로젝트에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5767&quot; data-start=&quot;5725&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5735&quot; data-start=&quot;5725&quot; data-section-id=&quot;xl8n8h&quot;&gt;협업 효율 증가&lt;/li&gt;
&lt;li data-end=&quot;5743&quot; data-start=&quot;5736&quot; data-section-id=&quot;7hxx7s&quot;&gt;버그 감소&lt;/li&gt;
&lt;li data-end=&quot;5753&quot; data-start=&quot;5744&quot; data-section-id=&quot;1nz0bgg&quot;&gt;유지보수 향상&lt;/li&gt;
&lt;li data-end=&quot;5767&quot; data-start=&quot;5754&quot; data-section-id=&quot;1vv7g2t&quot;&gt;안정적인 서비스 운영&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5781&quot; data-start=&quot;5769&quot; data-ke-size=&quot;size16&quot;&gt;에 큰 도움이 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;5812&quot; data-start=&quot;5783&quot; data-ke-size=&quot;size16&quot;&gt;결국 좋은 개발은 단순히 기능을 만드는 것이 아니라:&lt;/p&gt;
&lt;blockquote data-end=&quot;5863&quot; data-start=&quot;5814&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;5863&quot; data-start=&quot;5816&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;안정적으로 동작하고, 안전하게 배포되며, 지속적으로 개선 가능한 구조를 만드는 것&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;5875&quot; data-start=&quot;5865&quot; data-ke-size=&quot;size16&quot;&gt;이라고 생각합니다.&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;5908&quot; data-start=&quot;5877&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD는 바로 그 기반이 되는 핵심 개발 문화입니다.&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/89</guid>
      <comments>https://jhlcpj.tistory.com/89#entry89comment</comments>
      <pubDate>Mon, 18 May 2026 22:48:05 +0900</pubDate>
    </item>
    <item>
      <title>[18주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 83</title>
      <link>https://jhlcpj.tistory.com/88</link>
      <description>&lt;h1 data-end=&quot;28&quot; data-start=&quot;0&quot; data-section-id=&quot;24uq1n&quot;&gt;AWS 기반 배포 환경 구축과 테스트 경험 정리&lt;/h1&gt;
&lt;p data-end=&quot;210&quot; data-start=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;최근 프로젝트를 진행하면서 단순히 기능 개발만 하는 것이 아니라, 실제 서비스처럼 &amp;ldquo;배포 가능한 환경&amp;rdquo;을 직접 구축해보는 경험을 하게 되었습니다.&lt;br /&gt;특히 AWS를 활용한 서버 배포, 환경 설정, 배포 도구 구성, 그리고 최종 테스트 과정까지 경험하면서 단순한 로컬 개발과는 전혀 다른 영역이라는 것을 느낄 수 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;291&quot; data-start=&quot;212&quot; data-ke-size=&quot;size16&quot;&gt;이번 글에서는 제가 진행했던 AWS 활용 계획부터 배포 환경 설정, 배포 도구 구성, 그리고 테스트 과정까지 전체 흐름을 정리해보려고 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;296&quot; data-start=&quot;293&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;314&quot; data-start=&quot;298&quot; data-section-id=&quot;1j0b2tt&quot;&gt;왜 배포 환경이 중요한가?&lt;/h1&gt;
&lt;p data-end=&quot;353&quot; data-start=&quot;316&quot; data-ke-size=&quot;size16&quot;&gt;처음 프로젝트를 시작하면 대부분은 로컬 환경에서 개발을 진행합니다.&lt;/p&gt;
&lt;p data-end=&quot;361&quot; data-start=&quot;355&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;419&quot; data-start=&quot;363&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;381&quot; data-start=&quot;363&quot; data-section-id=&quot;1s6w1uk&quot;&gt;localhost:3000&lt;/li&gt;
&lt;li data-end=&quot;400&quot; data-start=&quot;382&quot; data-section-id=&quot;1s5jgin&quot;&gt;localhost:5173&lt;/li&gt;
&lt;li data-end=&quot;419&quot; data-start=&quot;401&quot; data-section-id=&quot;1s1zsyn&quot;&gt;localhost:8080&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;437&quot; data-start=&quot;421&quot; data-ke-size=&quot;size16&quot;&gt;이런 형태로 실행하게 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;469&quot; data-start=&quot;439&quot; data-ke-size=&quot;size16&quot;&gt;하지만 실제 서비스는 로컬 환경에서 동작하지 않습니다.&lt;/p&gt;
&lt;p data-end=&quot;497&quot; data-start=&quot;471&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스는 다음과 같은 요소들이 필요합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;593&quot; data-start=&quot;499&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;518&quot; data-start=&quot;499&quot; data-section-id=&quot;1a6hqmw&quot;&gt;외부 사용자가 접속 가능한 서버&lt;/li&gt;
&lt;li data-end=&quot;533&quot; data-start=&quot;519&quot; data-section-id=&quot;5mzkik&quot;&gt;데이터베이스 운영 환경&lt;/li&gt;
&lt;li data-end=&quot;541&quot; data-start=&quot;534&quot; data-section-id=&quot;5z4upx&quot;&gt;보안 설정&lt;/li&gt;
&lt;li data-end=&quot;549&quot; data-start=&quot;542&quot; data-section-id=&quot;16pe7vn&quot;&gt;HTTPS&lt;/li&gt;
&lt;li data-end=&quot;557&quot; data-start=&quot;550&quot; data-section-id=&quot;4rm740&quot;&gt;로그 관리&lt;/li&gt;
&lt;li data-end=&quot;565&quot; data-start=&quot;558&quot; data-section-id=&quot;m7lsd8&quot;&gt;장애 대응&lt;/li&gt;
&lt;li data-end=&quot;574&quot; data-start=&quot;566&quot; data-section-id=&quot;1j7imw9&quot;&gt;배포 자동화&lt;/li&gt;
&lt;li data-end=&quot;593&quot; data-start=&quot;575&quot; data-section-id=&quot;gs4lo6&quot;&gt;서버 재시작 및 프로세스 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;649&quot; data-start=&quot;595&quot; data-ke-size=&quot;size16&quot;&gt;즉, 개발만 잘한다고 끝나는 것이 아니라 &amp;ldquo;운영 가능한 형태&amp;rdquo;로 만드는 과정이 반드시 필요합니다.&lt;/p&gt;
&lt;p data-end=&quot;696&quot; data-start=&quot;651&quot; data-ke-size=&quot;size16&quot;&gt;그리고 이 과정을 담당하는 대표적인 클라우드 플랫폼 중 하나가 바로 AWS입니다.&lt;/p&gt;
&lt;hr data-end=&quot;701&quot; data-start=&quot;698&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;717&quot; data-start=&quot;703&quot; data-section-id=&quot;1yd7v1e&quot;&gt;AWS를 사용하는 이유&lt;/h1&gt;
&lt;p data-end=&quot;776&quot; data-start=&quot;719&quot; data-ke-size=&quot;size16&quot;&gt;AWS(Amazon Web Services)는 현재 가장 많이 사용되는 클라우드 플랫폼 중 하나입니다.&lt;/p&gt;
&lt;p data-end=&quot;800&quot; data-start=&quot;778&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로 다음과 같은 장점이 있습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;814&quot; data-start=&quot;802&quot; data-section-id=&quot;1y3gu3t&quot; data-ke-size=&quot;size26&quot;&gt;1. 높은 확장성&lt;/h2&gt;
&lt;p data-end=&quot;846&quot; data-start=&quot;816&quot; data-ke-size=&quot;size16&quot;&gt;서비스 규모가 커지면 서버도 함께 확장할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;854&quot; data-start=&quot;848&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;903&quot; data-start=&quot;856&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;866&quot; data-start=&quot;856&quot; data-section-id=&quot;15fh8hz&quot;&gt;사용자가 많아짐&lt;/li&gt;
&lt;li data-end=&quot;875&quot; data-start=&quot;867&quot; data-section-id=&quot;12mc8lk&quot;&gt;트래픽 증가&lt;/li&gt;
&lt;li data-end=&quot;888&quot; data-start=&quot;876&quot; data-section-id=&quot;1hrqb5o&quot;&gt;이미지 업로드 증가&lt;/li&gt;
&lt;li data-end=&quot;903&quot; data-start=&quot;889&quot; data-section-id=&quot;amemb&quot;&gt;실시간 소켓 통신 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;943&quot; data-start=&quot;905&quot; data-ke-size=&quot;size16&quot;&gt;이런 상황에서 AWS는 서버를 유연하게 확장할 수 있도록 도와줍니다.&lt;/p&gt;
&lt;hr data-end=&quot;948&quot; data-start=&quot;945&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;966&quot; data-start=&quot;950&quot; data-section-id=&quot;1h0xu9x&quot; data-ke-size=&quot;size26&quot;&gt;2. 다양한 서비스 제공&lt;/h2&gt;
&lt;p data-end=&quot;994&quot; data-start=&quot;968&quot; data-ke-size=&quot;size16&quot;&gt;AWS는 단순히 서버만 제공하는 것이 아닙니다.&lt;/p&gt;
&lt;p data-end=&quot;1015&quot; data-start=&quot;996&quot; data-ke-size=&quot;size16&quot;&gt;대표적인 서비스는 다음과 같습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;서비스역할
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-end=&quot;1194&quot; data-start=&quot;1017&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;1194&quot; data-start=&quot;1040&quot;&gt;
&lt;tr data-end=&quot;1055&quot; data-start=&quot;1040&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1046&quot; data-start=&quot;1040&quot;&gt;EC2&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1055&quot; data-start=&quot;1046&quot;&gt;가상 서버&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1072&quot; data-start=&quot;1056&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1062&quot; data-start=&quot;1056&quot;&gt;RDS&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1072&quot; data-start=&quot;1062&quot;&gt;데이터베이스&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1087&quot; data-start=&quot;1073&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1078&quot; data-start=&quot;1073&quot;&gt;S3&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1087&quot; data-start=&quot;1078&quot;&gt;파일 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1108&quot; data-start=&quot;1088&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1101&quot; data-start=&quot;1088&quot;&gt;CloudFront&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1108&quot; data-start=&quot;1101&quot;&gt;CDN&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1126&quot; data-start=&quot;1109&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1119&quot; data-start=&quot;1109&quot;&gt;Route53&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1126&quot; data-start=&quot;1119&quot;&gt;DNS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1142&quot; data-start=&quot;1127&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1133&quot; data-start=&quot;1127&quot;&gt;IAM&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1142&quot; data-start=&quot;1133&quot;&gt;권한 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1167&quot; data-start=&quot;1143&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1156&quot; data-start=&quot;1143&quot;&gt;CloudWatch&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1167&quot; data-start=&quot;1156&quot;&gt;로그/모니터링&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1194&quot; data-start=&quot;1168&quot;&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1182&quot; data-start=&quot;1168&quot;&gt;ElastiCache&lt;/td&gt;
&lt;td data-col-size=&quot;sm&quot; data-end=&quot;1194&quot; data-start=&quot;1182&quot;&gt;Redis 캐시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1240&quot; data-start=&quot;1196&quot; data-ke-size=&quot;size16&quot;&gt;즉, 실제 서비스를 구성하는 대부분의 요소를 AWS 안에서 해결할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1245&quot; data-start=&quot;1242&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1266&quot; data-start=&quot;1247&quot; data-section-id=&quot;1sovxqq&quot; data-ke-size=&quot;size26&quot;&gt;3. 실제 현업에서 많이 사용&lt;/h2&gt;
&lt;p data-end=&quot;1296&quot; data-start=&quot;1268&quot; data-ke-size=&quot;size16&quot;&gt;많은 기업들이 AWS 기반으로 인프라를 운영합니다.&lt;/p&gt;
&lt;p data-end=&quot;1346&quot; data-start=&quot;1298&quot; data-ke-size=&quot;size16&quot;&gt;따라서 프로젝트 단계에서 AWS를 경험해보는 것은 단순한 학습 이상의 의미가 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;1351&quot; data-start=&quot;1348&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1404&quot; data-start=&quot;1353&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1360&quot; data-start=&quot;1353&quot; data-section-id=&quot;u9bhho&quot;&gt;서버 배포&lt;/li&gt;
&lt;li data-end=&quot;1369&quot; data-start=&quot;1361&quot; data-section-id=&quot;1afpt3o&quot;&gt;인프라 구조&lt;/li&gt;
&lt;li data-end=&quot;1380&quot; data-start=&quot;1370&quot; data-section-id=&quot;1wgjyd5&quot;&gt;환경 변수 관리&lt;/li&gt;
&lt;li data-end=&quot;1388&quot; data-start=&quot;1381&quot; data-section-id=&quot;5zddth&quot;&gt;보안 그룹&lt;/li&gt;
&lt;li data-end=&quot;1396&quot; data-start=&quot;1389&quot; data-section-id=&quot;9p3shl&quot;&gt;운영 로그&lt;/li&gt;
&lt;li data-end=&quot;1404&quot; data-start=&quot;1397&quot; data-section-id=&quot;m7lsd8&quot;&gt;장애 대응&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1433&quot; data-start=&quot;1406&quot; data-ke-size=&quot;size16&quot;&gt;같은 경험은 이후 실무에서도 매우 도움이 됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1438&quot; data-start=&quot;1435&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1451&quot; data-start=&quot;1440&quot; data-section-id=&quot;14a0dnj&quot;&gt;AWS 활용 계획&lt;/h1&gt;
&lt;p data-end=&quot;1499&quot; data-start=&quot;1453&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 초기에는 어떤 구조로 서비스를 배포할 것인지 먼저 계획을 세워야 했습니다.&lt;/p&gt;
&lt;p data-end=&quot;1539&quot; data-start=&quot;1501&quot; data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;서버 하나 띄우기&amp;rdquo;가 아니라 전체 구조를 생각해야 했습니다.&lt;/p&gt;
&lt;p data-end=&quot;1547&quot; data-start=&quot;1541&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1627&quot; data-start=&quot;1549&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1562&quot; data-start=&quot;1549&quot; data-section-id=&quot;1d0ldoc&quot;&gt;프론트엔드 배포 위치&lt;/li&gt;
&lt;li data-end=&quot;1574&quot; data-start=&quot;1563&quot; data-section-id=&quot;3v0ck5&quot;&gt;백엔드 서버 위치&lt;/li&gt;
&lt;li data-end=&quot;1589&quot; data-start=&quot;1575&quot; data-section-id=&quot;5mjuel&quot;&gt;데이터베이스 운영 방식&lt;/li&gt;
&lt;li data-end=&quot;1603&quot; data-start=&quot;1590&quot; data-section-id=&quot;1js8354&quot;&gt;Redis 사용 여부&lt;/li&gt;
&lt;li data-end=&quot;1615&quot; data-start=&quot;1604&quot; data-section-id=&quot;t14w59&quot;&gt;이미지 저장 위치&lt;/li&gt;
&lt;li data-end=&quot;1627&quot; data-start=&quot;1616&quot; data-section-id=&quot;1a1prmc&quot;&gt;도메인 연결 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1642&quot; data-start=&quot;1629&quot; data-ke-size=&quot;size16&quot;&gt;등을 고려해야 했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1647&quot; data-start=&quot;1644&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;1662&quot; data-start=&quot;1649&quot; data-section-id=&quot;wotjme&quot;&gt;전체 배포 구조 설계&lt;/h1&gt;
&lt;p data-end=&quot;1695&quot; data-start=&quot;1664&quot; data-ke-size=&quot;size16&quot;&gt;저희 프로젝트는 대략 다음과 같은 흐름으로 설계했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;사용자 브라우저
   &amp;darr;
프론트엔드 서버
   &amp;darr;
백엔드 API 서버
   &amp;darr;
DB / Redis&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1784&quot; data-start=&quot;1765&quot; data-ke-size=&quot;size16&quot;&gt;그리고 각각의 역할을 나누었습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1789&quot; data-start=&quot;1786&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1799&quot; data-start=&quot;1791&quot; data-section-id=&quot;ft4cb5&quot; data-ke-size=&quot;size26&quot;&gt;프론트엔드&lt;/h2&gt;
&lt;p data-end=&quot;1835&quot; data-start=&quot;1801&quot; data-ke-size=&quot;size16&quot;&gt;프론트는 React + Vite 기반으로 구성되어 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;1844&quot; data-start=&quot;1837&quot; data-ke-size=&quot;size16&quot;&gt;배포 시에는:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;pnpm build&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;1897&quot; data-start=&quot;1870&quot; data-ke-size=&quot;size16&quot;&gt;를 통해 정적 파일을 생성하고 이를 배포했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;1902&quot; data-start=&quot;1899&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1910&quot; data-start=&quot;1904&quot; data-section-id=&quot;1h9tth8&quot; data-ke-size=&quot;size26&quot;&gt;백엔드&lt;/h2&gt;
&lt;p data-end=&quot;1917&quot; data-start=&quot;1912&quot; data-ke-size=&quot;size16&quot;&gt;백엔드는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1961&quot; data-start=&quot;1919&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1928&quot; data-start=&quot;1919&quot; data-section-id=&quot;fjub3z&quot;&gt;Node.js&lt;/li&gt;
&lt;li data-end=&quot;1948&quot; data-start=&quot;1929&quot; data-section-id=&quot;11a0xxf&quot;&gt;Express 또는 NestJS&lt;/li&gt;
&lt;li data-end=&quot;1961&quot; data-start=&quot;1949&quot; data-section-id=&quot;3kl673&quot;&gt;TypeScript&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1976&quot; data-start=&quot;1963&quot; data-ke-size=&quot;size16&quot;&gt;기반으로 구성되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;1987&quot; data-start=&quot;1978&quot; data-ke-size=&quot;size16&quot;&gt;실제 서버에서는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2023&quot; data-start=&quot;1989&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1994&quot; data-start=&quot;1989&quot; data-section-id=&quot;1o4okn&quot;&gt;PM2&lt;/li&gt;
&lt;li data-end=&quot;2007&quot; data-start=&quot;1995&quot; data-section-id=&quot;oqe6n4&quot;&gt;Node 실행 환경&lt;/li&gt;
&lt;li data-end=&quot;2015&quot; data-start=&quot;2008&quot; data-section-id=&quot;1ndd3yt&quot;&gt;환경 변수&lt;/li&gt;
&lt;li data-end=&quot;2023&quot; data-start=&quot;2016&quot; data-section-id=&quot;oicn74&quot;&gt;포트 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2035&quot; data-start=&quot;2025&quot; data-ke-size=&quot;size16&quot;&gt;등이 필요했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2040&quot; data-start=&quot;2037&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2051&quot; data-start=&quot;2042&quot; data-section-id=&quot;19dten5&quot; data-ke-size=&quot;size26&quot;&gt;데이터베이스&lt;/h2&gt;
&lt;p data-end=&quot;2076&quot; data-start=&quot;2053&quot; data-ke-size=&quot;size16&quot;&gt;PostgreSQL 기반으로 운영했습니다.&lt;/p&gt;
&lt;p data-end=&quot;2139&quot; data-start=&quot;2078&quot; data-ke-size=&quot;size16&quot;&gt;로컬에서는 Docker 기반으로 실행했지만 운영 환경에서는 별도 서버 또는 클라우드 DB 환경을 고려했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2144&quot; data-start=&quot;2141&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2154&quot; data-start=&quot;2146&quot; data-section-id=&quot;xmotn0&quot; data-ke-size=&quot;size26&quot;&gt;Redis&lt;/h2&gt;
&lt;p data-end=&quot;2191&quot; data-start=&quot;2156&quot; data-ke-size=&quot;size16&quot;&gt;실시간 기능과 캐싱 처리를 위해 Redis도 함께 사용했습니다.&lt;/p&gt;
&lt;p data-end=&quot;2196&quot; data-start=&quot;2193&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2241&quot; data-start=&quot;2198&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2205&quot; data-start=&quot;2198&quot; data-section-id=&quot;1eiov74&quot;&gt;랭킹 캐시&lt;/li&gt;
&lt;li data-end=&quot;2219&quot; data-start=&quot;2206&quot; data-section-id=&quot;1tngrf5&quot;&gt;오늘 목표 조회 캐시&lt;/li&gt;
&lt;li data-end=&quot;2228&quot; data-start=&quot;2220&quot; data-section-id=&quot;a8ubeh&quot;&gt;타이머 상태&lt;/li&gt;
&lt;li data-end=&quot;2241&quot; data-start=&quot;2229&quot; data-section-id=&quot;1u5k8t0&quot;&gt;실시간 데이터 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2267&quot; data-start=&quot;2243&quot; data-ke-size=&quot;size16&quot;&gt;등에서 Redis가 중요한 역할을 했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2272&quot; data-start=&quot;2269&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2284&quot; data-start=&quot;2274&quot; data-section-id=&quot;10oxfri&quot;&gt;배포 환경 설정&lt;/h1&gt;
&lt;p data-end=&quot;2328&quot; data-start=&quot;2286&quot; data-ke-size=&quot;size16&quot;&gt;실제 배포를 진행하면서 가장 먼저 해야 했던 것은 서버 환경 설정이었습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2333&quot; data-start=&quot;2330&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2346&quot; data-start=&quot;2335&quot; data-section-id=&quot;huncpy&quot;&gt;EC2 서버 생성&lt;/h1&gt;
&lt;p data-end=&quot;2377&quot; data-start=&quot;2348&quot; data-ke-size=&quot;size16&quot;&gt;AWS에서 가장 대표적인 서버 서비스는 EC2입니다.&lt;/p&gt;
&lt;p data-end=&quot;2407&quot; data-start=&quot;2379&quot; data-ke-size=&quot;size16&quot;&gt;EC2는 가상 서버를 생성할 수 있는 서비스입니다.&lt;/p&gt;
&lt;p data-end=&quot;2432&quot; data-start=&quot;2409&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 다음과 같은 작업을 진행했습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;2447&quot; data-start=&quot;2434&quot; data-section-id=&quot;yuafoa&quot; data-ke-size=&quot;size26&quot;&gt;1. 인스턴스 생성&lt;/h2&gt;
&lt;p data-end=&quot;2461&quot; data-start=&quot;2449&quot; data-ke-size=&quot;size16&quot;&gt;운영체제를 선택합니다.&lt;/p&gt;
&lt;p data-end=&quot;2466&quot; data-start=&quot;2463&quot; data-ke-size=&quot;size16&quot;&gt;보통:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2491&quot; data-start=&quot;2468&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2476&quot; data-start=&quot;2468&quot; data-section-id=&quot;a5n0g5&quot;&gt;Ubuntu&lt;/li&gt;
&lt;li data-end=&quot;2491&quot; data-start=&quot;2477&quot; data-section-id=&quot;1xxo860&quot;&gt;Amazon Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2505&quot; data-start=&quot;2493&quot; data-ke-size=&quot;size16&quot;&gt;등을 많이 사용합니다.&lt;/p&gt;
&lt;p data-end=&quot;2528&quot; data-start=&quot;2507&quot; data-ke-size=&quot;size16&quot;&gt;저는 Ubuntu 환경을 사용했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2533&quot; data-start=&quot;2530&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2548&quot; data-start=&quot;2535&quot; data-section-id=&quot;wdbpgd&quot; data-ke-size=&quot;size26&quot;&gt;2. 키 페어 생성&lt;/h2&gt;
&lt;p data-end=&quot;2580&quot; data-start=&quot;2550&quot; data-ke-size=&quot;size16&quot;&gt;EC2 접속을 위해 .pem 키 파일을 생성합니다.&lt;/p&gt;
&lt;p data-end=&quot;2602&quot; data-start=&quot;2582&quot; data-ke-size=&quot;size16&quot;&gt;이 파일은 SSH 접속에 사용됩니다.&lt;/p&gt;
&lt;p data-end=&quot;2606&quot; data-start=&quot;2604&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;ssh -i key.pem ubuntu@ip주소&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2651&quot; data-start=&quot;2648&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2667&quot; data-start=&quot;2653&quot; data-section-id=&quot;16bf4yc&quot; data-ke-size=&quot;size26&quot;&gt;3. 보안 그룹 설정&lt;/h2&gt;
&lt;p data-end=&quot;2691&quot; data-start=&quot;2669&quot; data-ke-size=&quot;size16&quot;&gt;보안 그룹은 AWS의 방화벽 개념입니다.&lt;/p&gt;
&lt;p data-end=&quot;2697&quot; data-start=&quot;2693&quot; data-ke-size=&quot;size16&quot;&gt;여기서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2755&quot; data-start=&quot;2699&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2713&quot; data-start=&quot;2699&quot; data-section-id=&quot;41j6l9&quot;&gt;22번 포트 (SSH)&lt;/li&gt;
&lt;li data-end=&quot;2729&quot; data-start=&quot;2714&quot; data-section-id=&quot;6wwvdx&quot;&gt;80번 포트 (HTTP)&lt;/li&gt;
&lt;li data-end=&quot;2747&quot; data-start=&quot;2730&quot; data-section-id=&quot;5ze5bh&quot;&gt;443번 포트 (HTTPS)&lt;/li&gt;
&lt;li data-end=&quot;2755&quot; data-start=&quot;2748&quot; data-section-id=&quot;u9hf0k&quot;&gt;서버 포트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2768&quot; data-start=&quot;2757&quot; data-ke-size=&quot;size16&quot;&gt;등을 열어야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;2776&quot; data-start=&quot;2770&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;basic&quot;&gt;&lt;code&gt;22 &amp;rarr; SSH 접속
80 &amp;rarr; HTTP
443 &amp;rarr; HTTPS
3000 &amp;rarr; Node 서버&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;2843&quot; data-start=&quot;2840&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;2855&quot; data-start=&quot;2845&quot; data-section-id=&quot;hbsarf&quot;&gt;서버 초기 세팅&lt;/h1&gt;
&lt;p data-end=&quot;2887&quot; data-start=&quot;2857&quot; data-ke-size=&quot;size16&quot;&gt;서버에 접속한 이후에는 개발 환경을 구성해야 했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;2892&quot; data-start=&quot;2889&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;2907&quot; data-start=&quot;2894&quot; data-section-id=&quot;1s9sx1q&quot; data-ke-size=&quot;size26&quot;&gt;Node.js 설치&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install nodejs&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3015&quot; data-start=&quot;3012&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3027&quot; data-start=&quot;3017&quot; data-section-id=&quot;nl5xve&quot; data-ke-size=&quot;size26&quot;&gt;pnpm 설치&lt;/h2&gt;
&lt;p data-end=&quot;3062&quot; data-start=&quot;3029&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트에서 pnpm을 사용했기 때문에 설치가 필요했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;npm install -g pnpm&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3100&quot; data-start=&quot;3097&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3111&quot; data-start=&quot;3102&quot; data-section-id=&quot;wc0hoj&quot; data-ke-size=&quot;size26&quot;&gt;Git 설치&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;sudo apt install git&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3173&quot; data-start=&quot;3147&quot; data-ke-size=&quot;size16&quot;&gt;이후 GitHub 저장소를 clone 했습니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;git clone repository-url&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3216&quot; data-start=&quot;3213&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3228&quot; data-start=&quot;3218&quot; data-section-id=&quot;78iqi2&quot;&gt;환경 변수 설정&lt;/h1&gt;
&lt;p data-end=&quot;3263&quot; data-start=&quot;3230&quot; data-ke-size=&quot;size16&quot;&gt;실제 배포에서 가장 중요한 부분 중 하나가 환경 변수입니다.&lt;/p&gt;
&lt;p data-end=&quot;3271&quot; data-start=&quot;3265&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;DATABASE_URL=
JWT_SECRET=
REDIS_URL=
AWS_ACCESS_KEY=
AWS_SECRET_KEY=&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3382&quot; data-start=&quot;3354&quot; data-ke-size=&quot;size16&quot;&gt;같은 값들은 절대로 코드에 직접 올리면 안 됩니다.&lt;/p&gt;
&lt;p data-end=&quot;3409&quot; data-start=&quot;3384&quot; data-ke-size=&quot;size16&quot;&gt;따라서 .env 파일을 통해 관리했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;3414&quot; data-start=&quot;3411&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3434&quot; data-start=&quot;3416&quot; data-section-id=&quot;1tvx9cq&quot;&gt;환경 변수 관리가 중요한 이유&lt;/h1&gt;
&lt;p data-end=&quot;3464&quot; data-start=&quot;3436&quot; data-ke-size=&quot;size16&quot;&gt;환경 변수는 다음과 같은 민감한 정보를 포함합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3517&quot; data-start=&quot;3466&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3475&quot; data-start=&quot;3466&quot; data-section-id=&quot;1iep54q&quot;&gt;DB 비밀번호&lt;/li&gt;
&lt;li data-end=&quot;3488&quot; data-start=&quot;3476&quot; data-section-id=&quot;1cllivr&quot;&gt;JWT Secret&lt;/li&gt;
&lt;li data-end=&quot;3496&quot; data-start=&quot;3489&quot; data-section-id=&quot;16yiv9l&quot;&gt;AWS 키&lt;/li&gt;
&lt;li data-end=&quot;3507&quot; data-start=&quot;3497&quot; data-section-id=&quot;qr8u35&quot;&gt;Redis 주소&lt;/li&gt;
&lt;li data-end=&quot;3517&quot; data-start=&quot;3508&quot; data-section-id=&quot;122523r&quot;&gt;API Key&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3556&quot; data-start=&quot;3519&quot; data-ke-size=&quot;size16&quot;&gt;만약 GitHub에 잘못 업로드되면 큰 문제가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3562&quot; data-start=&quot;3558&quot; data-ke-size=&quot;size16&quot;&gt;따라서:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;.env&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3602&quot; data-start=&quot;3587&quot; data-ke-size=&quot;size16&quot;&gt;설정도 반드시 필요했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;3607&quot; data-start=&quot;3604&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3619&quot; data-start=&quot;3609&quot; data-section-id=&quot;4hvder&quot;&gt;배포 도구 설정&lt;/h1&gt;
&lt;p data-end=&quot;3630&quot; data-start=&quot;3621&quot; data-ke-size=&quot;size16&quot;&gt;서버에서 단순히:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;node server.js&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3679&quot; data-start=&quot;3660&quot; data-ke-size=&quot;size16&quot;&gt;로 실행하는 것은 매우 위험합니다.&lt;/p&gt;
&lt;p data-end=&quot;3686&quot; data-start=&quot;3681&quot; data-ke-size=&quot;size16&quot;&gt;왜냐하면:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3745&quot; data-start=&quot;3688&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3701&quot; data-start=&quot;3688&quot; data-section-id=&quot;se5c1k&quot;&gt;서버가 꺼질 수 있음&lt;/li&gt;
&lt;li data-end=&quot;3723&quot; data-start=&quot;3702&quot; data-section-id=&quot;5xn0rh&quot;&gt;SSH 종료 시 프로세스 종료 가능&lt;/li&gt;
&lt;li data-end=&quot;3735&quot; data-start=&quot;3724&quot; data-section-id=&quot;g9y0ds&quot;&gt;로그 관리 어려움&lt;/li&gt;
&lt;li data-end=&quot;3745&quot; data-start=&quot;3736&quot; data-section-id=&quot;3bsj5w&quot;&gt;재시작 불가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3763&quot; data-start=&quot;3747&quot; data-ke-size=&quot;size16&quot;&gt;등의 문제가 있기 때문입니다.&lt;/p&gt;
&lt;hr data-end=&quot;3768&quot; data-start=&quot;3765&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3778&quot; data-start=&quot;3770&quot; data-section-id=&quot;hdkkrw&quot;&gt;PM2 사용&lt;/h1&gt;
&lt;p data-end=&quot;3796&quot; data-start=&quot;3780&quot; data-ke-size=&quot;size16&quot;&gt;그래서 PM2를 사용했습니다.&lt;/p&gt;
&lt;p data-end=&quot;3823&quot; data-start=&quot;3798&quot; data-ke-size=&quot;size16&quot;&gt;PM2는 Node.js 프로세스 매니저입니다.&lt;/p&gt;
&lt;p data-end=&quot;3828&quot; data-start=&quot;3825&quot; data-ke-size=&quot;size16&quot;&gt;설치:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;npm install -g pm2&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;3865&quot; data-start=&quot;3862&quot; data-ke-size=&quot;size16&quot;&gt;실행:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;pm2 start dist/main.js&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;3906&quot; data-start=&quot;3903&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;3917&quot; data-start=&quot;3908&quot; data-section-id=&quot;whrgp0&quot;&gt;PM2의 장점&lt;/h1&gt;
&lt;h2 data-end=&quot;3934&quot; data-start=&quot;3919&quot; data-section-id=&quot;62anpm&quot; data-ke-size=&quot;size26&quot;&gt;1. 서버 자동 재시작&lt;/h2&gt;
&lt;p data-end=&quot;3955&quot; data-start=&quot;3936&quot; data-ke-size=&quot;size16&quot;&gt;프로세스가 죽으면 자동 복구됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;3960&quot; data-start=&quot;3957&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;3976&quot; data-start=&quot;3962&quot; data-section-id=&quot;srvv11&quot; data-ke-size=&quot;size26&quot;&gt;2. 로그 확인 가능&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;pm2 logs&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4023&quot; data-start=&quot;4000&quot; data-ke-size=&quot;size16&quot;&gt;를 통해 로그를 쉽게 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;4028&quot; data-start=&quot;4025&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4041&quot; data-start=&quot;4030&quot; data-section-id=&quot;1uvlcug&quot; data-ke-size=&quot;size26&quot;&gt;3. 상태 확인&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;pm2 status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4088&quot; data-start=&quot;4067&quot; data-ke-size=&quot;size16&quot;&gt;현재 서버 상태를 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;4093&quot; data-start=&quot;4090&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;4112&quot; data-start=&quot;4095&quot; data-section-id=&quot;j52l2&quot; data-ke-size=&quot;size26&quot;&gt;4. 재부팅 후 자동 실행&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;gcode&quot;&gt;&lt;code&gt;pm2 startup
pm2 save&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4174&quot; data-start=&quot;4148&quot; data-ke-size=&quot;size16&quot;&gt;를 통해 서버 재부팅 이후에도 자동 실행됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;4179&quot; data-start=&quot;4176&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4191&quot; data-start=&quot;4181&quot; data-section-id=&quot;x1arwh&quot;&gt;Nginx 설정&lt;/h1&gt;
&lt;p data-end=&quot;4220&quot; data-start=&quot;4193&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스에서는 Nginx도 매우 중요했습니다.&lt;/p&gt;
&lt;p data-end=&quot;4229&quot; data-start=&quot;4222&quot; data-ke-size=&quot;size16&quot;&gt;Nginx는:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4277&quot; data-start=&quot;4231&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4246&quot; data-start=&quot;4231&quot; data-section-id=&quot;svpd0k&quot;&gt;Reverse Proxy&lt;/li&gt;
&lt;li data-end=&quot;4257&quot; data-start=&quot;4247&quot; data-section-id=&quot;arpxg7&quot;&gt;HTTPS 처리&lt;/li&gt;
&lt;li data-end=&quot;4266&quot; data-start=&quot;4258&quot; data-section-id=&quot;1ei4u5t&quot;&gt;로드 밸런싱&lt;/li&gt;
&lt;li data-end=&quot;4277&quot; data-start=&quot;4267&quot; data-section-id=&quot;1lwn5i0&quot;&gt;정적 파일 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4288&quot; data-start=&quot;4279&quot; data-ke-size=&quot;size16&quot;&gt;등을 담당합니다.&lt;/p&gt;
&lt;hr data-end=&quot;4293&quot; data-start=&quot;4290&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4313&quot; data-start=&quot;4295&quot; data-section-id=&quot;8ft1p2&quot;&gt;Reverse Proxy 구조&lt;/h1&gt;
&lt;p data-end=&quot;4321&quot; data-start=&quot;4315&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;사용자 &amp;rarr; 80포트
Nginx &amp;rarr; Node 서버 3000포트&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4383&quot; data-start=&quot;4370&quot; data-ke-size=&quot;size16&quot;&gt;이런 구조로 연결됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;4388&quot; data-start=&quot;4385&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4403&quot; data-start=&quot;4390&quot; data-section-id=&quot;7gb7it&quot;&gt;Nginx 설정 예시&lt;/h1&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;server {
    listen 80;

    location / {
        proxy_pass http://localhost:3000;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4514&quot; data-start=&quot;4511&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4526&quot; data-start=&quot;4516&quot; data-section-id=&quot;5i97qd&quot;&gt;HTTPS 적용&lt;/h1&gt;
&lt;p data-end=&quot;4554&quot; data-start=&quot;4528&quot; data-ke-size=&quot;size16&quot;&gt;실제 서비스에서는 HTTPS가 매우 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;4584&quot; data-start=&quot;4556&quot; data-ke-size=&quot;size16&quot;&gt;이를 위해 Let's Encrypt를 사용했습니다.&lt;/p&gt;
&lt;p data-end=&quot;4592&quot; data-start=&quot;4586&quot; data-ke-size=&quot;size16&quot;&gt;대표적으로:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;sudo certbot --nginx&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;4657&quot; data-start=&quot;4628&quot; data-ke-size=&quot;size16&quot;&gt;를 사용하여 HTTPS 인증서를 적용할 수 있습니다.&lt;/p&gt;
&lt;hr data-end=&quot;4662&quot; data-start=&quot;4659&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4677&quot; data-start=&quot;4664&quot; data-section-id=&quot;vynurj&quot;&gt;Redis 운영 경험&lt;/h1&gt;
&lt;p data-end=&quot;4707&quot; data-start=&quot;4679&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트에서는 Redis를 적극적으로 사용했습니다.&lt;/p&gt;
&lt;p data-end=&quot;4743&quot; data-start=&quot;4709&quot; data-ke-size=&quot;size16&quot;&gt;특히 캐시 처리에서 Redis의 효과를 체감할 수 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;4751&quot; data-start=&quot;4745&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;4781&quot; data-start=&quot;4753&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;4764&quot; data-start=&quot;4753&quot; data-section-id=&quot;ynj841&quot;&gt;목표 리스트 조회&lt;/li&gt;
&lt;li data-end=&quot;4772&quot; data-start=&quot;4765&quot; data-section-id=&quot;1eiqpmo&quot;&gt;랭킹 조회&lt;/li&gt;
&lt;li data-end=&quot;4781&quot; data-start=&quot;4773&quot; data-section-id=&quot;a8ubeh&quot;&gt;타이머 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;4793&quot; data-start=&quot;4783&quot; data-ke-size=&quot;size16&quot;&gt;등을 캐싱했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;4798&quot; data-start=&quot;4795&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4808&quot; data-start=&quot;4800&quot; data-section-id=&quot;1j0ewsn&quot;&gt;캐시의 장점&lt;/h1&gt;
&lt;p data-end=&quot;4855&quot; data-start=&quot;4810&quot; data-ke-size=&quot;size16&quot;&gt;DB를 직접 조회하는 대신 Redis에서 데이터를 가져오기 때문에 훨씬 빠릅니다.&lt;/p&gt;
&lt;p data-end=&quot;4859&quot; data-start=&quot;4857&quot; data-ke-size=&quot;size16&quot;&gt;예:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;DB 조회 &amp;rarr; 느림
Redis 조회 &amp;rarr; 매우 빠름&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;4905&quot; data-start=&quot;4902&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;4928&quot; data-start=&quot;4907&quot; data-section-id=&quot;1vbptoj&quot;&gt;하지만 Redis도 장애가 발생한다&lt;/h1&gt;
&lt;p data-end=&quot;4963&quot; data-start=&quot;4930&quot; data-ke-size=&quot;size16&quot;&gt;실제로 운영 환경에서는 Redis 연결 오류도 경험했습니다.&lt;/p&gt;
&lt;p data-end=&quot;4971&quot; data-start=&quot;4965&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;SocketClosedUnexpectedlyError
ClientClosedError&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5049&quot; data-start=&quot;5034&quot; data-ke-size=&quot;size16&quot;&gt;같은 문제들이 발생했습니다.&lt;/p&gt;
&lt;p data-end=&quot;5081&quot; data-start=&quot;5051&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 당황했지만 이를 통해 중요한 점을 배웠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5086&quot; data-start=&quot;5083&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5110&quot; data-start=&quot;5088&quot; data-section-id=&quot;12m4qlz&quot;&gt;운영 환경에서는 장애 대응이 중요하다&lt;/h1&gt;
&lt;p data-end=&quot;5132&quot; data-start=&quot;5112&quot; data-ke-size=&quot;size16&quot;&gt;단순히 기능만 구현하는 것이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5200&quot; data-start=&quot;5134&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5155&quot; data-start=&quot;5134&quot; data-section-id=&quot;1aiuar8&quot;&gt;Redis 장애 시 fallback&lt;/li&gt;
&lt;li data-end=&quot;5172&quot; data-start=&quot;5156&quot; data-section-id=&quot;1tay0fq&quot;&gt;DB fallback 처리&lt;/li&gt;
&lt;li data-end=&quot;5185&quot; data-start=&quot;5173&quot; data-section-id=&quot;1thymiv&quot;&gt;timeout 처리&lt;/li&gt;
&lt;li data-end=&quot;5200&quot; data-start=&quot;5186&quot; data-section-id=&quot;qt68lx&quot;&gt;reconnect 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5215&quot; data-start=&quot;5202&quot; data-ke-size=&quot;size16&quot;&gt;등이 매우 중요했습니다.&lt;/p&gt;
&lt;p data-end=&quot;5223&quot; data-start=&quot;5217&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;kotlin&quot;&gt;&lt;code&gt;try {
  return await redis.get(key);
} catch {
  return dbData;
}&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5321&quot; data-start=&quot;5302&quot; data-ke-size=&quot;size16&quot;&gt;같은 방식으로 안정성을 높였습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5326&quot; data-start=&quot;5323&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5338&quot; data-start=&quot;5328&quot; data-section-id=&quot;12355uv&quot;&gt;캐시 전략 고민&lt;/h1&gt;
&lt;p data-end=&quot;5377&quot; data-start=&quot;5340&quot; data-ke-size=&quot;size16&quot;&gt;모든 데이터를 무조건 캐싱하면 오히려 문제가 생길 수도 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;5385&quot; data-start=&quot;5379&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5427&quot; data-start=&quot;5387&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5402&quot; data-start=&quot;5387&quot; data-section-id=&quot;1jk2bmk&quot;&gt;실시간성이 중요한 데이터&lt;/li&gt;
&lt;li data-end=&quot;5416&quot; data-start=&quot;5403&quot; data-section-id=&quot;1uyijpd&quot;&gt;자주 변경되는 데이터&lt;/li&gt;
&lt;li data-end=&quot;5427&quot; data-start=&quot;5417&quot; data-section-id=&quot;sd4mr1&quot;&gt;사용자별 데이터&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5454&quot; data-start=&quot;5429&quot; data-ke-size=&quot;size16&quot;&gt;는 캐시 정합성 문제가 발생할 수 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;5459&quot; data-start=&quot;5456&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5481&quot; data-start=&quot;5461&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5472&quot; data-start=&quot;5461&quot; data-section-id=&quot;7kry0h&quot;&gt;오늘 목표 리스트&lt;/li&gt;
&lt;li data-end=&quot;5481&quot; data-start=&quot;5473&quot; data-section-id=&quot;a8ubeh&quot;&gt;타이머 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5510&quot; data-start=&quot;5483&quot; data-ke-size=&quot;size16&quot;&gt;는 캐싱 전략을 매우 신중하게 설계해야 했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5515&quot; data-start=&quot;5512&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5528&quot; data-start=&quot;5517&quot; data-section-id=&quot;3duj0v&quot;&gt;배포 환경 테스트&lt;/h1&gt;
&lt;p data-end=&quot;5554&quot; data-start=&quot;5530&quot; data-ke-size=&quot;size16&quot;&gt;배포 이후에는 반드시 테스트가 필요했습니다.&lt;/p&gt;
&lt;p data-end=&quot;5577&quot; data-start=&quot;5556&quot; data-ke-size=&quot;size16&quot;&gt;단순히 &amp;ldquo;배포 성공&amp;rdquo;이 끝이 아닙니다.&lt;/p&gt;
&lt;hr data-end=&quot;5582&quot; data-start=&quot;5579&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;5592&quot; data-start=&quot;5584&quot; data-section-id=&quot;17a4i42&quot;&gt;테스트 항목&lt;/h1&gt;
&lt;p data-end=&quot;5617&quot; data-start=&quot;5594&quot; data-ke-size=&quot;size16&quot;&gt;실제로 다음과 같은 부분들을 확인했습니다.&lt;/p&gt;
&lt;h2 data-end=&quot;5637&quot; data-start=&quot;5619&quot; data-section-id=&quot;1e75baq&quot; data-ke-size=&quot;size26&quot;&gt;1. API 정상 동작 여부&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;5677&quot; data-start=&quot;5639&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;5644&quot; data-start=&quot;5639&quot; data-section-id=&quot;20xvn8&quot;&gt;로그인&lt;/li&gt;
&lt;li data-end=&quot;5651&quot; data-start=&quot;5645&quot; data-section-id=&quot;asusj5&quot;&gt;회원가입&lt;/li&gt;
&lt;li data-end=&quot;5659&quot; data-start=&quot;5652&quot; data-section-id=&quot;s00iep&quot;&gt;목표 생성&lt;/li&gt;
&lt;li data-end=&quot;5668&quot; data-start=&quot;5660&quot; data-section-id=&quot;a8wwqx&quot;&gt;타이머 시작&lt;/li&gt;
&lt;li data-end=&quot;5677&quot; data-start=&quot;5669&quot; data-section-id=&quot;a8tkod&quot;&gt;타이머 종료&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;5698&quot; data-start=&quot;5679&quot; data-ke-size=&quot;size16&quot;&gt;등이 정상 동작하는지 확인했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5703&quot; data-start=&quot;5700&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5722&quot; data-start=&quot;5705&quot; data-section-id=&quot;160xi80&quot; data-ke-size=&quot;size26&quot;&gt;2. 환경 변수 적용 여부&lt;/h2&gt;
&lt;p data-end=&quot;5759&quot; data-start=&quot;5724&quot; data-ke-size=&quot;size16&quot;&gt;운영 환경에서 .env 값이 정상 반영되는지 테스트했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5764&quot; data-start=&quot;5761&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5783&quot; data-start=&quot;5766&quot; data-section-id=&quot;18gogng&quot; data-ke-size=&quot;size26&quot;&gt;3. Redis 연결 상태&lt;/h2&gt;
&lt;p data-end=&quot;5808&quot; data-start=&quot;5785&quot; data-ke-size=&quot;size16&quot;&gt;Redis가 정상 연결되는지 확인했습니다.&lt;/p&gt;
&lt;p data-end=&quot;5817&quot; data-start=&quot;5810&quot; data-ke-size=&quot;size16&quot;&gt;로그를 통해:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;properties&quot;&gt;&lt;code&gt;Redis Connected
Redis Ready&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;5870&quot; data-start=&quot;5860&quot; data-ke-size=&quot;size16&quot;&gt;등을 확인했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5875&quot; data-start=&quot;5872&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5891&quot; data-start=&quot;5877&quot; data-section-id=&quot;rguxys&quot; data-ke-size=&quot;size26&quot;&gt;4. DB 연결 확인&lt;/h2&gt;
&lt;p data-end=&quot;5914&quot; data-start=&quot;5893&quot; data-ke-size=&quot;size16&quot;&gt;Prisma 연결 상태도 확인했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5919&quot; data-start=&quot;5916&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5937&quot; data-start=&quot;5921&quot; data-section-id=&quot;1md4k2f&quot; data-ke-size=&quot;size26&quot;&gt;5. 서버 재시작 테스트&lt;/h2&gt;
&lt;p data-end=&quot;5966&quot; data-start=&quot;5939&quot; data-ke-size=&quot;size16&quot;&gt;PM2 재시작 이후 정상 복구되는지 확인했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;5971&quot; data-start=&quot;5968&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;5988&quot; data-start=&quot;5973&quot; data-section-id=&quot;yt0a1&quot; data-ke-size=&quot;size26&quot;&gt;6. 캐시 동작 테스트&lt;/h2&gt;
&lt;p data-end=&quot;5998&quot; data-start=&quot;5990&quot; data-ke-size=&quot;size16&quot;&gt;동일 요청 시:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6034&quot; data-start=&quot;6000&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6013&quot; data-start=&quot;6000&quot; data-section-id=&quot;eb7mkg&quot;&gt;첫 요청은 DB 조회&lt;/li&gt;
&lt;li data-end=&quot;6034&quot; data-start=&quot;6014&quot; data-section-id=&quot;2rasso&quot;&gt;두 번째 요청은 Cache Hit&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6049&quot; data-start=&quot;6036&quot; data-ke-size=&quot;size16&quot;&gt;가 되는지 확인했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;6054&quot; data-start=&quot;6051&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;6073&quot; data-start=&quot;6056&quot; data-section-id=&quot;1em0ihu&quot;&gt;실제 운영 환경에서 느낀 점&lt;/h1&gt;
&lt;p data-end=&quot;6100&quot; data-start=&quot;6075&quot; data-ke-size=&quot;size16&quot;&gt;배포를 직접 경험하면서 가장 크게 느낀 것은:&lt;/p&gt;
&lt;blockquote data-end=&quot;6130&quot; data-start=&quot;6102&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;6130&quot; data-start=&quot;6104&quot; data-ke-size=&quot;size16&quot;&gt;개발과 운영은 완전히 다른 영역이라는 점입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-end=&quot;6179&quot; data-start=&quot;6132&quot; data-ke-size=&quot;size16&quot;&gt;로컬에서는 잘 동작하던 코드가 운영 환경에서는 예상치 못한 문제를 만들기도 했습니다.&lt;/p&gt;
&lt;p data-end=&quot;6187&quot; data-start=&quot;6181&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6254&quot; data-start=&quot;6189&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6199&quot; data-start=&quot;6189&quot; data-section-id=&quot;1wgdazw&quot;&gt;환경 변수 누락&lt;/li&gt;
&lt;li data-end=&quot;6207&quot; data-start=&quot;6200&quot; data-section-id=&quot;oitn4p&quot;&gt;포트 충돌&lt;/li&gt;
&lt;li data-end=&quot;6221&quot; data-start=&quot;6208&quot; data-section-id=&quot;1im51m5&quot;&gt;Redis 연결 실패&lt;/li&gt;
&lt;li data-end=&quot;6231&quot; data-start=&quot;6222&quot; data-section-id=&quot;1l6j9sx&quot;&gt;CORS 문제&lt;/li&gt;
&lt;li data-end=&quot;6242&quot; data-start=&quot;6232&quot; data-section-id=&quot;aryg93&quot;&gt;HTTPS 문제&lt;/li&gt;
&lt;li data-end=&quot;6254&quot; data-start=&quot;6243&quot; data-section-id=&quot;xe8vnx&quot;&gt;서버 재시작 이슈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6266&quot; data-start=&quot;6256&quot; data-ke-size=&quot;size16&quot;&gt;등이 발생했습니다.&lt;/p&gt;
&lt;hr data-end=&quot;6271&quot; data-start=&quot;6268&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;6285&quot; data-start=&quot;6273&quot; data-section-id=&quot;1p2sa27&quot;&gt;가장 어려웠던 부분&lt;/h1&gt;
&lt;p data-end=&quot;6305&quot; data-start=&quot;6287&quot; data-ke-size=&quot;size16&quot;&gt;개인적으로 가장 어려웠던 부분은:&lt;/p&gt;
&lt;h2 data-end=&quot;6318&quot; data-start=&quot;6307&quot; data-section-id=&quot;1jf3xhl&quot; data-ke-size=&quot;size26&quot;&gt;&amp;ldquo;정합성 유지&amp;rdquo;&lt;/h2&gt;
&lt;p data-end=&quot;6325&quot; data-start=&quot;6320&quot; data-ke-size=&quot;size16&quot;&gt;였습니다.&lt;/p&gt;
&lt;p data-end=&quot;6340&quot; data-start=&quot;6327&quot; data-ke-size=&quot;size16&quot;&gt;특히 캐시를 사용할 때:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div id=&quot;code-block-viewer&quot;&gt;
&lt;div&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;데이터 수정
&amp;rarr; 캐시 삭제
&amp;rarr; 새로운 데이터 생성&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;6421&quot; data-start=&quot;6383&quot; data-ke-size=&quot;size16&quot;&gt;흐름을 제대로 관리하지 않으면 오래된 데이터가 보여질 수 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;6430&quot; data-start=&quot;6423&quot; data-ke-size=&quot;size16&quot;&gt;이 과정에서:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6463&quot; data-start=&quot;6432&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6440&quot; data-start=&quot;6432&quot; data-section-id=&quot;1oepa18&quot;&gt;캐시 무효화&lt;/li&gt;
&lt;li data-end=&quot;6449&quot; data-start=&quot;6441&quot; data-section-id=&quot;5zbf5h&quot;&gt;TTL 설정&lt;/li&gt;
&lt;li data-end=&quot;6463&quot; data-start=&quot;6450&quot; data-section-id=&quot;15ayfk&quot;&gt;fallback 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6482&quot; data-start=&quot;6465&quot; data-ke-size=&quot;size16&quot;&gt;등의 중요성을 크게 느꼈습니다.&lt;/p&gt;
&lt;hr data-end=&quot;6487&quot; data-start=&quot;6484&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;6505&quot; data-start=&quot;6489&quot; data-section-id=&quot;sxifia&quot;&gt;배포 경험을 통해 얻은 것&lt;/h1&gt;
&lt;p data-end=&quot;6550&quot; data-start=&quot;6507&quot; data-ke-size=&quot;size16&quot;&gt;이번 경험을 통해 단순히 코드를 작성하는 것 이상의 것들을 배우게 되었습니다.&lt;/p&gt;
&lt;p data-end=&quot;6558&quot; data-start=&quot;6552&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6636&quot; data-start=&quot;6560&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6570&quot; data-start=&quot;6560&quot; data-section-id=&quot;1jrjhpt&quot;&gt;서버 운영 흐름&lt;/li&gt;
&lt;li data-end=&quot;6580&quot; data-start=&quot;6571&quot; data-section-id=&quot;1qzyd80&quot;&gt;클라우드 구조&lt;/li&gt;
&lt;li data-end=&quot;6588&quot; data-start=&quot;6581&quot; data-section-id=&quot;5z4upx&quot;&gt;보안 설정&lt;/li&gt;
&lt;li data-end=&quot;6599&quot; data-start=&quot;6589&quot; data-section-id=&quot;1wgjyd5&quot;&gt;환경 변수 관리&lt;/li&gt;
&lt;li data-end=&quot;6607&quot; data-start=&quot;6600&quot; data-section-id=&quot;m7lsd8&quot;&gt;장애 대응&lt;/li&gt;
&lt;li data-end=&quot;6615&quot; data-start=&quot;6608&quot; data-section-id=&quot;14l23qt&quot;&gt;캐시 전략&lt;/li&gt;
&lt;li data-end=&quot;6626&quot; data-start=&quot;6616&quot; data-section-id=&quot;arnf3f&quot;&gt;HTTPS 적용&lt;/li&gt;
&lt;li data-end=&quot;6636&quot; data-start=&quot;6627&quot; data-section-id=&quot;caauow&quot;&gt;프로세스 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6657&quot; data-start=&quot;6638&quot; data-ke-size=&quot;size16&quot;&gt;등을 실제로 경험할 수 있었습니다.&lt;/p&gt;
&lt;hr data-end=&quot;6662&quot; data-start=&quot;6659&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 data-end=&quot;6669&quot; data-start=&quot;6664&quot; data-section-id=&quot;20h5rq&quot;&gt;마무리&lt;/h1&gt;
&lt;p data-end=&quot;6703&quot; data-start=&quot;6671&quot; data-ke-size=&quot;size16&quot;&gt;처음에는 AWS와 배포 환경이 굉장히 어렵게 느껴졌습니다.&lt;/p&gt;
&lt;p data-end=&quot;6794&quot; data-start=&quot;6705&quot; data-ke-size=&quot;size16&quot;&gt;하지만 직접 서버를 만들고, 환경을 구성하고, Redis와 DB를 연결하고, 실제 API를 운영해보면서 단순한 &amp;ldquo;기능 개발&amp;rdquo; 이상의 경험을 얻을 수 있었습니다.&lt;/p&gt;
&lt;p data-end=&quot;6799&quot; data-start=&quot;6796&quot; data-ke-size=&quot;size16&quot;&gt;특히:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;6884&quot; data-start=&quot;6801&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;6822&quot; data-start=&quot;6801&quot; data-section-id=&quot;1a5s6co&quot;&gt;실제 서비스 구조를 이해하게 되었고&lt;/li&gt;
&lt;li data-end=&quot;6842&quot; data-start=&quot;6823&quot; data-section-id=&quot;wgai0g&quot;&gt;운영 환경의 중요성을 체감했으며&lt;/li&gt;
&lt;li data-end=&quot;6884&quot; data-start=&quot;6843&quot; data-section-id=&quot;1dhsb5n&quot;&gt;안정적인 서비스를 만들기 위해 어떤 고민이 필요한지 배우게 되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;6914&quot; data-start=&quot;6886&quot; data-ke-size=&quot;size16&quot;&gt;앞으로는 단순히 기능 구현만 하는 개발자가 아니라:&lt;/p&gt;
&lt;blockquote data-end=&quot;6937&quot; data-start=&quot;6916&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;6937&quot; data-start=&quot;6918&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;운영까지 고려할 수 있는 개발자&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;6968&quot; data-start=&quot;6939&quot; data-ke-size=&quot;size16&quot;&gt;가 되는 것을 목표로 계속 경험을 쌓아가고 싶습니다.&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/88</guid>
      <comments>https://jhlcpj.tistory.com/88#entry88comment</comments>
      <pubDate>Sun, 17 May 2026 18:59:16 +0900</pubDate>
    </item>
    <item>
      <title>[18주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 82</title>
      <link>https://jhlcpj.tistory.com/87</link>
      <description>&lt;h1&gt;Selenium을 활용한 E2E 테스트 자동화 완벽 가이드&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서비스를 개발하다 보면 가장 많이 듣게 되는 말 중 하나가 바로 &amp;ldquo;테스트는 중요하다&amp;rdquo;라는 이야기다. 실제로 기능 하나를 수정했는데 전혀 예상하지 못한 곳에서 오류가 발생하거나, 배포 이후 특정 기능이 동작하지 않는 상황은 생각보다 자주 발생한다. 특히 프론트엔드와 백엔드가 함께 동작하는 서비스에서는 단순한 단위 테스트만으로는 실제 사용자의 행동 흐름을 완벽하게 검증하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 회원가입 &amp;rarr; 로그인 &amp;rarr; 게시글 작성 &amp;rarr; 댓글 작성 &amp;rarr; 로그아웃과 같은 흐름은 여러 API와 UI, 상태 관리 로직이 동시에 연결되어 있다. 이런 흐름은 각 기능이 따로 정상 동작하더라도 실제 사용 환경에서는 예상치 못한 문제가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 중요한 역할을 하는 것이 바로 E2E(End-to-End) 테스트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E2E 테스트는 실제 사용자가 서비스를 사용하는 것처럼 브라우저를 직접 조작하면서 전체 흐름을 검증하는 테스트 방식이다. 그리고 이러한 E2E 테스트 자동화 도구 중 가장 대표적인 것이 Selenium이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Selenium이 무엇인지부터 시작해 Selenium IDE, Selenium WebDriver, E2E 테스트 전략, 테스트 자동화의 장점과 한계, 실제 프로젝트 적용 방법까지 자세하게 정리해보려고 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium이란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium은 웹 브라우저를 자동으로 제어할 수 있도록 도와주는 오픈소스 테스트 자동화 프레임워크이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말하면 사람이 직접 브라우저를 클릭하고 입력하는 행동을 코드로 대신 수행할 수 있도록 만들어주는 도구라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 행동을 자동으로 수행할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 웹사이트 접속&lt;/li&gt;
&lt;li&gt;로그인 버튼 클릭&lt;/li&gt;
&lt;li&gt;입력창에 텍스트 입력&lt;/li&gt;
&lt;li&gt;게시글 작성&lt;/li&gt;
&lt;li&gt;페이지 이동 검증&lt;/li&gt;
&lt;li&gt;특정 요소 존재 여부 확인&lt;/li&gt;
&lt;li&gt;버튼 활성화 상태 확인&lt;/li&gt;
&lt;li&gt;경고창 처리&lt;/li&gt;
&lt;li&gt;파일 업로드&lt;/li&gt;
&lt;li&gt;스크롤 이동&lt;/li&gt;
&lt;li&gt;페이지 렌더링 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 사용자의 실제 행동을 자동화해서 테스트할 수 있는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium은 다양한 브라우저를 지원한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chrome&lt;/li&gt;
&lt;li&gt;Firefox&lt;/li&gt;
&lt;li&gt;Edge&lt;/li&gt;
&lt;li&gt;Safari&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 여러 프로그래밍 언어에서도 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;C#&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 최근에는 React, Vue, Next.js 같은 프론트엔드 프레임워크 기반 프로젝트에서도 E2E 테스트의 중요성이 커지면서 Selenium이나 Playwright, Cypress 같은 자동화 도구 사용이 점점 증가하고 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;E2E 테스트란?&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;E2E는 End-to-End의 약자로, 서비스의 전체 흐름을 처음부터 끝까지 검증하는 테스트를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 테스트는 크게 세 가지로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종류설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;단위 테스트(Unit Test)&lt;/td&gt;
&lt;td&gt;함수나 컴포넌트 하나를 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;통합 테스트(Integration Test)&lt;/td&gt;
&lt;td&gt;여러 모듈이 함께 동작하는지 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E2E 테스트&lt;/td&gt;
&lt;td&gt;실제 사용자 흐름 전체 테스트&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 로그인 기능을 테스트한다고 가정해보자.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;단위 테스트&lt;/h2&gt;
&lt;pre class=&quot;reasonml&quot;&gt;&lt;code&gt;expect(validatePassword(&quot;1234&quot;)).toBe(false);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 검증 함수 하나만 테스트한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;통합 테스트&lt;/h2&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;로그인 API 호출 후 토큰 저장 여부 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트와 API 연결 정도를 테스트한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;E2E 테스트&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 로그인 페이지 접속
2. 이메일 입력
3. 비밀번호 입력
4. 로그인 버튼 클릭
5. 메인 페이지 이동 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 사용자가 행동하는 전체 흐름을 테스트한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, E2E 테스트는 가장 현실적인 테스트 방식이라고 볼 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium의 주요 구성 요소&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium은 단순히 하나의 도구가 아니라 여러 구성 요소로 이루어져 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Selenium IDE&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium IDE는 브라우저 확장 프로그램 형태로 제공되는 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 직접 브라우저를 조작하면 그 행동을 자동으로 기록해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 행동을 기록할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클릭&lt;/li&gt;
&lt;li&gt;입력&lt;/li&gt;
&lt;li&gt;페이지 이동&lt;/li&gt;
&lt;li&gt;요소 선택&lt;/li&gt;
&lt;li&gt;검증&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초보자도 쉽게 테스트 케이스를 만들 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 테스트 자동화를 처음 접하는 사람에게 매우 좋은 입문 도구라고 생각한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Selenium IDE 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 없이 테스트 가능&lt;/li&gt;
&lt;li&gt;브라우저 조작만으로 테스트 생성 가능&lt;/li&gt;
&lt;li&gt;빠른 테스트 프로토타입 작성 가능&lt;/li&gt;
&lt;li&gt;간단한 기능 검증에 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Selenium IDE 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복잡한 로직 구현 어려움&lt;/li&gt;
&lt;li&gt;유지보수 어려움&lt;/li&gt;
&lt;li&gt;동적 UI 대응 한계&lt;/li&gt;
&lt;li&gt;대규모 프로젝트에는 부적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 간단한 테스트에는 매우 유용하지만 실제 서비스 수준의 자동화에는 한계가 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Selenium WebDriver&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 프로젝트에서 가장 많이 사용하는 핵심 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebDriver는 코드로 브라우저를 직접 제어할 수 있게 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 JavaScript에서는 아래와 같이 사용할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const { Builder, By } = require(&quot;selenium-webdriver&quot;);

(async function example() {
  let driver = await new Builder().forBrowser(&quot;chrome&quot;).build();

  await driver.get(&quot;https://example.com/login&quot;);

  await driver.findElement(By.name(&quot;email&quot;)).sendKeys(&quot;test@test.com&quot;);

  await driver.findElement(By.name(&quot;password&quot;)).sendKeys(&quot;1234&quot;);

  await driver.findElement(By.css(&quot;button&quot;)).click();
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 브라우저를 실행하고 사용자 행동을 그대로 자동화한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Selenium Grid&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium Grid는 여러 환경에서 테스트를 동시에 실행할 수 있도록 도와주는 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 테스트가 가능하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Chrome + Windows&lt;/li&gt;
&lt;li&gt;Safari + macOS&lt;/li&gt;
&lt;li&gt;Firefox + Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 서비스에서는 다양한 브라우저 호환성이 매우 중요하기 때문에 Grid 기능이 자주 활용된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium을 사용하는 이유&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 실제 사용자 환경 테스트 가능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 큰 장점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 함수 테스트가 아니라 실제 브라우저를 기반으로 테스트하기 때문에 현실적인 오류를 발견할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 문제를 발견할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼 클릭이 안 되는 문제&lt;/li&gt;
&lt;li&gt;CSS 때문에 요소가 가려지는 문제&lt;/li&gt;
&lt;li&gt;모바일 반응형 깨짐&lt;/li&gt;
&lt;li&gt;브라우저 호환성 문제&lt;/li&gt;
&lt;li&gt;API 응답 지연 문제&lt;/li&gt;
&lt;li&gt;렌더링 타이밍 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제는 단위 테스트만으로는 발견하기 어렵다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 반복 작업 자동화&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 수동으로 테스트하는 것은 매우 비효율적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 배포 전마다 아래와 같은 작업을 반복한다고 생각해보자.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 테스트&lt;/li&gt;
&lt;li&gt;회원가입 테스트&lt;/li&gt;
&lt;li&gt;결제 테스트&lt;/li&gt;
&lt;li&gt;게시글 작성 테스트&lt;/li&gt;
&lt;li&gt;관리자 권한 테스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능이 많아질수록 테스트 시간은 기하급수적으로 증가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 Selenium을 활용하면 버튼 클릭부터 결과 검증까지 모두 자동으로 수행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 개발자는 더 중요한 문제 해결에 집중할 수 있게 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 회귀 테스트에 강함&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회귀 테스트는 기존 기능이 정상 동작하는지 다시 확인하는 테스트이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 로그인 기능을 수정했는데 게시글 작성 기능이 갑자기 깨지는 상황이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium 기반 자동화 테스트가 있다면 이런 문제를 빠르게 발견할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 현업에서는 새로운 기능 개발보다 기존 기능 유지보수 비중이 훨씬 커지는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 회귀 테스트 자동화는 프로젝트 안정성에 매우 중요한 역할을 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium 테스트 전략&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 자동화를 무조건 많이 만든다고 좋은 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못 설계된 테스트는 오히려 유지보수 비용만 증가시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 테스트 전략이 매우 중요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 핵심 사용자 흐름 우선 테스트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 중요한 흐름부터 자동화하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 쇼핑몰 서비스라면 다음 흐름이 핵심이다.&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;회원가입 &amp;rarr; 로그인 &amp;rarr; 상품 조회 &amp;rarr; 장바구니 &amp;rarr; 결제
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 흐름이 깨지면 서비스 자체가 동작하지 않는 수준의 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 가장 먼저 자동화해야 한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 지나치게 세부적인 UI 테스트 지양&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 아래와 같은 테스트는 유지보수 비용이 매우 크다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;버튼 너비가 정확히 120px인지 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI는 자주 변경되기 때문에 너무 세부적인 테스트는 오히려 독이 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 실제 사용자 기능 중심으로 테스트하는 것이 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;pre class=&quot;&quot;&gt;&lt;code&gt;로그인 버튼 클릭 시 메인 페이지 이동 여부 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 테스트가 훨씬 가치가 높다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 테스트 독립성 유지&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트끼리 서로 영향을 주지 않도록 구성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 회원가입 테스트가 실패했다고 로그인 테스트까지 실패하면 원인 파악이 어려워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 테스트는 가능한 독립적으로 설계하는 것이 중요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium IDE를 활용한 테스트 케이스 개발&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium IDE는 테스트 자동화 입문 단계에서 매우 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 QA나 비개발 직군도 쉽게 테스트를 만들 수 있다는 장점이 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테스트 케이스 예시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;로그인 테스트&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;1. 로그인 페이지 접속
2. 이메일 입력
3. 비밀번호 입력
4. 로그인 버튼 클릭
5. 메인 페이지 이동 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium IDE는 이 과정을 자동으로 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 저장된 테스트는 반복 실행할 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium WebDriver 실전 예제&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;프로젝트 설치&lt;/h2&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;npm install selenium-webdriver
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ChromeDriver도 필요하다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;npm install chromedriver
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;기본 테스트 코드&lt;/h2&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const { Builder, By, until } = require(&quot;selenium-webdriver&quot;);

(async function test() {
  let driver = await new Builder().forBrowser(&quot;chrome&quot;).build();

  try {
    await driver.get(&quot;https://example.com/login&quot;);

    await driver.findElement(By.name(&quot;email&quot;)).sendKeys(&quot;test@test.com&quot;);

    await driver.findElement(By.name(&quot;password&quot;)).sendKeys(&quot;1234&quot;);

    await driver.findElement(By.css(&quot;button&quot;)).click();

    await driver.wait(until.urlContains(&quot;dashboard&quot;), 5000);

    console.log(&quot;로그인 성공&quot;);
  } finally {
    await driver.quit();
  }
})();
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 코드는 실제 브라우저를 실행한 뒤 로그인 과정을 자동으로 수행한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;동적 페이지 테스트 시 주의할 점&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 웹 서비스는 대부분 React, Vue 같은 SPA 구조를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우 비동기 렌더링 때문에 테스트가 실패하는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 버튼이 아직 렌더링되지 않았는데 클릭하려고 하면 오류가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 적절한 대기 처리가 매우 중요하다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;잘못된 방식&lt;/h2&gt;
&lt;pre class=&quot;sqf&quot;&gt;&lt;code&gt;await driver.sleep(3000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 sleep은 비효율적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;좋은 방식&lt;/h2&gt;
&lt;pre class=&quot;vbnet&quot;&gt;&lt;code&gt;await driver.wait(until.elementLocated(By.id(&quot;submit&quot;)), 5000);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요소가 실제로 나타날 때까지 기다리는 방식이 훨씬 안정적이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;E2E 테스트 자동화의 장점&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;안정적인 배포 가능&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 테스트가 있으면 배포 전 검증이 쉬워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD 파이프라인과 연결하면 아래 흐름이 가능하다.&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;코드 Push &amp;rarr; 자동 테스트 &amp;rarr; 성공 시 배포
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 사람이 직접 테스트하지 않아도 된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;개발 속도 향상&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 테스트 작성 시간이 오래 걸린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 프로젝트 규모가 커질수록 자동화의 효과가 엄청나게 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 반복 테스트 시간이 크게 줄어든다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;협업 효율 증가&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드와 백엔드가 동시에 개발할 때 자동화 테스트는 매우 큰 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 변경이나 UI 변경이 발생했을 때 즉시 문제를 발견할 수 있기 때문이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Selenium의 한계&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 Selenium이 완벽한 도구는 아니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;테스트 속도가 느림&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 브라우저를 실행하기 때문에 단위 테스트보다 훨씬 느리다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;유지보수 비용 존재&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UI가 자주 바뀌면 테스트 코드도 계속 수정해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 CSS selector 기반 테스트는 쉽게 깨질 수 있다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;비동기 처리 어려움&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;렌더링 타이밍 문제 때문에 flaky test가 발생하기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flaky test란 가끔 성공하고 가끔 실패하는 불안정한 테스트를 의미한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;좋은 테스트 코드 작성 방법&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. data-testid 사용&lt;/h2&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;&amp;lt;button data-testid=&quot;login-button&quot;&amp;gt;로그인&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sas&quot;&gt;&lt;code&gt;By.css('[data-testid=&quot;login-button&quot;]')
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 작성하면 UI 변경에도 테스트가 덜 깨진다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Page Object Pattern 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지별 로직을 분리하면 유지보수가 쉬워진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;LoginPage.js&lt;/h3&gt;
&lt;pre class=&quot;cs&quot;&gt;&lt;code&gt;class LoginPage {
  async login(email, password) {
    // 로그인 로직
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 방식으로 구조화하면 테스트 코드 재사용성이 높아진다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 테스트 데이터 분리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드코딩 대신 별도 데이터 파일을 사용하는 것이 좋다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;const testUser = {
  email: &quot;test@test.com&quot;,
  password: &quot;1234&quot;,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;CI/CD와 Selenium 연동&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 GitHub Actions와 함께 사용하는 경우가 많다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;GitHub Actions 예시&lt;/h2&gt;
&lt;pre class=&quot;http&quot;&gt;&lt;code&gt;name: E2E Test

on: [push]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3

      - name: Install Dependencies
        run: npm install

      - name: Run Selenium Tests
        run: npm run test:e2e
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정하면 코드가 Push될 때마다 자동으로 E2E 테스트가 실행된다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;실제 프로젝트에서 느낀 점&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 자동화는 처음에는 굉장히 귀찮게 느껴질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 기능 개발 일정이 촉박한 상황에서는 테스트 코드 작성이 우선순위에서 밀리는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 프로젝트 규모가 커질수록 테스트 자동화의 중요성은 압도적으로 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 여러 명이 협업하는 프로젝트에서는 예상치 못한 사이드 이펙트가 자주 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 자동화 테스트는 단순한 품질 관리 수준을 넘어 개발 안정성을 지켜주는 안전망 역할을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 Selenium 기반 E2E 테스트를 경험하면서 느낀 가장 큰 점은 &amp;ldquo;사용자 관점으로 기능을 바라보게 된다&amp;rdquo;는 점이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 API가 성공했다고 끝나는 것이 아니라:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 버튼이 눌리는지&lt;/li&gt;
&lt;li&gt;페이지 이동이 자연스러운지&lt;/li&gt;
&lt;li&gt;로딩 중 문제가 없는지&lt;/li&gt;
&lt;li&gt;렌더링 타이밍 오류는 없는지&lt;/li&gt;
&lt;li&gt;브라우저별 차이가 없는지&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 부분까지 확인하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 테스트 자동화는 단순 검증 도구가 아니라 더 좋은 사용자 경험을 만들기 위한 과정이라고 생각한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;마무리&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Selenium은 오랫동안 사용되어 온 대표적인 웹 테스트 자동화 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 E2E 테스트를 통해 실제 사용자 흐름을 검증할 수 있다는 점에서 매우 강력한 장점을 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물론 테스트 속도나 유지보수 같은 한계도 존재하지만, 프로젝트 규모가 커질수록 자동화 테스트의 가치는 더욱 커진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 최근에는 CI/CD 환경과 결합되면서 테스트 자동화가 거의 필수 요소처럼 자리 잡고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 Selenium IDE로 간단한 테스트를 경험해보고, 이후 WebDriver 기반 코드 자동화로 확장해나가는 방식이 가장 좋은 학습 흐름이라고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 안정적인 서비스를 만드는 가장 좋은 방법은 &amp;ldquo;문제가 발생하기 전에 미리 검증하는 것&amp;rdquo;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 Selenium 기반 E2E 테스트 자동화는 그 검증을 가능하게 만들어주는 매우 강력한 도구라고 할 수 있다.&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/87</guid>
      <comments>https://jhlcpj.tistory.com/87#entry87comment</comments>
      <pubDate>Thu, 14 May 2026 23:15:56 +0900</pubDate>
    </item>
    <item>
      <title>[18주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 81</title>
      <link>https://jhlcpj.tistory.com/86</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;단위 테스트 실습 파일과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컨테이너화에 대한 이야기&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/86</guid>
      <comments>https://jhlcpj.tistory.com/86#entry86comment</comments>
      <pubDate>Wed, 13 May 2026 23:48:31 +0900</pubDate>
    </item>
    <item>
      <title>[18주차] - [9기] 타입스크립트로 함께하는 웹 풀 사이클 개발(React, Node.js) 10회차 - 80</title>
      <link>https://jhlcpj.tistory.com/85</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계와 프론트엔드 설계, 컴포넌트&lt;/p&gt;</description>
      <category>pgms</category>
      <author>Ejah</author>
      <guid isPermaLink="true">https://jhlcpj.tistory.com/85</guid>
      <comments>https://jhlcpj.tistory.com/85#entry85comment</comments>
      <pubDate>Tue, 12 May 2026 23:20:53 +0900</pubDate>
    </item>
  </channel>
</rss>