<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>이롭게 현명하게</title>
    <link>https://devyihyun.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 4 Jun 2026 01:56:14 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>dev_y.h</managingEditor>
    <image>
      <title>이롭게 현명하게</title>
      <url>https://tistory1.daumcdn.net/tistory/5378355/attach/f6df010bccbb4698987b5a2e630f2cb3</url>
      <link>https://devyihyun.tistory.com</link>
    </image>
    <item>
      <title>[Next.js] Next.js 무중단 배포, AWS Amplify로 구축하기</title>
      <link>https://devyihyun.tistory.com/274</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lYoa6/dJMb990EzxE/77Kc8H0MKknIwveFbSgFNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lYoa6/dJMb990EzxE/77Kc8H0MKknIwveFbSgFNk/img.png&quot; data-alt=&quot;Next.js Amplify로 배포하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lYoa6/dJMb990EzxE/77Kc8H0MKknIwveFbSgFNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlYoa6%2FdJMb990EzxE%2F77Kc8H0MKknIwveFbSgFNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;811&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Next.js Amplify로 배포하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;들어가며&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;AWS Amplify 배포 과정&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[들어가며]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멘토링을 진행하면서 배포에 대한 고민을 하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에는 기능 구현에 집중했지만 서비스를 운영하는 관점에서 바라보게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 진행했던 프로젝트에서는 Vercel을 사용해 배포를 해본 경험이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel은 설정이 간단하고 Git과 연동하여 자동으로 배포할 수 있다는 장점을 가지고 있어 편리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1779350482716&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Next.js] Next.js를 Vercel에 배포하기&quot; data-og-description=&quot;목차 Vercel이란?Next.js 프로젝트 Vercel에 배포하기환경변수 설정커밋부터 배포까지 : 자동 빌드 확인하기 [Vercel이란?]Next.js는 이미 많은 프론트엔드 개발자들이 선택하는 대표적인 React 프레임워크&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/272&quot; data-og-url=&quot;https://devyihyun.tistory.com/272&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEyFI7/dJMb85WZcvQ/jSgCzrvfDETOKutbRy4Dt0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bZ8ULC/dJMb81fYumi/p1KMI3vdV6bxg713mHS6lK/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/1YRfo/dJMb9c9DFQy/3UvstK26PGT9mvegXYpVNK/img.png?width=1594&amp;amp;height=811&amp;amp;face=0_0_1594_811&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/272&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/272&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEyFI7/dJMb85WZcvQ/jSgCzrvfDETOKutbRy4Dt0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bZ8ULC/dJMb81fYumi/p1KMI3vdV6bxg713mHS6lK/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/1YRfo/dJMb9c9DFQy/3UvstK26PGT9mvegXYpVNK/img.png?width=1594&amp;amp;height=811&amp;amp;face=0_0_1594_811');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Next.js] Next.js를 Vercel에 배포하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 Vercel이란?Next.js 프로젝트 Vercel에 배포하기환경변수 설정커밋부터 배포까지 : 자동 빌드 확인하기 [Vercel이란?]Next.js는 이미 많은 프론트엔드 개발자들이 선택하는 대표적인 React 프레임워크&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과물을 빠르게 확인하는 프로젝트에서 좋은 선택이었다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이번 프로젝트에서도 Vercel을 고려했었다.&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;이번 프로젝트에서는 배포만 하는 것이 아닌 이미지 업로드 처리와 데이터 흐름까지 함께 설계해야 했기 때문에 유연한 인프라를 구성할 수 있는 환경이 필요했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS는 서버를 거치지 않고 파일을 업로드할 수 있다는 장점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이미지 처리를 위해 S3를 활용하는 방법과 Pre-signed URL 방식도 필요하지 않을까라는 생각이 들었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 확장성과 유연성을 고려해 AWS를 선택하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS는 말로만 들어봤지 복잡하지 않을까?라는 걱정이 앞섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 간단하게 시작할 수 있는 AWS Amplify를 사용해 보기로 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 프로젝트에서는 배포를 넘어서 실제 서비스를 운영하며 확장 가능한 구조를 만들어 가는 것을 목표로 하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에 대한 자세한 내용은 다음 포스팅에서 작성할 계획이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[AWS Amplify 배포 과정]&lt;/b&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;next.js 프로젝트를 배포할 것이기 때문에 Next.js로 구현했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;929&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhnEPH/dJMcaaFfXzm/Ztxmj9FA6SZUERn00HqSDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhnEPH/dJMcaaFfXzm/Ztxmj9FA6SZUERn00HqSDk/img.png&quot; data-alt=&quot;깃 레포지터리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhnEPH/dJMcaaFfXzm/Ztxmj9FA6SZUERn00HqSDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhnEPH%2FdJMcaaFfXzm%2FZtxmj9FA6SZUERn00HqSDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1889&quot; height=&quot;929&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;929&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깃 레포지터리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS에 로그인을 해준다. [&lt;a title=&quot;https://aws.amazon.com/ko/&quot; href=&quot;https://aws.amazon.com/ko/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;바로가기&lt;/a&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;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;s&gt;뭣도 모르고 프로필 이미지 페이지에서 로그인했다가 엄청 헤매었었다... 여러분들의 시간은 소중하니까~&lt;/s&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JCyC9/dJMcabxlkXU/ClCb1RXxFYWmAFPEcETJc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JCyC9/dJMcabxlkXU/ClCb1RXxFYWmAFPEcETJc0/img.png&quot; data-alt=&quot;AWS 랜딩 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JCyC9/dJMcabxlkXU/ClCb1RXxFYWmAFPEcETJc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJCyC9%2FdJMcabxlkXU%2FClCb1RXxFYWmAFPEcETJc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1247&quot; height=&quot;937&quot; data-origin-width=&quot;1247&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS 랜딩 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 플랜을 선택해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6개월은 무료로 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7cZem/dJMcaaFfXOH/UqQgzvnRM61pJevMh0XYnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7cZem/dJMcaaFfXOH/UqQgzvnRM61pJevMh0XYnk/img.png&quot; data-alt=&quot;계정 플랜 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7cZem/dJMcaaFfXOH/UqQgzvnRM61pJevMh0XYnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7cZem%2FdJMcaaFfXOH%2FUqQgzvnRM61pJevMh0XYnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1243&quot; height=&quot;925&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;계정 플랜 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AWS 콘솔에 접속한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;686&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8nf3o/dJMcagenTl4/nnHV97zkj8cD7fUHGHrEC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8nf3o/dJMcagenTl4/nnHV97zkj8cD7fUHGHrEC0/img.png&quot; data-alt=&quot;AWS 콘솔 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8nf3o/dJMcagenTl4/nnHV97zkj8cD7fUHGHrEC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8nf3o%2FdJMcagenTl4%2FnnHV97zkj8cD7fUHGHrEC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1393&quot; height=&quot;686&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;686&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;AWS 콘솔 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔 화면 검색창에서 amplify를 검색한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwdIm/dJMcajoyggm/vRgjKlpyFFlESEpt28VBZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwdIm/dJMcajoyggm/vRgjKlpyFFlESEpt28VBZK/img.png&quot; data-alt=&quot;amplify 검색&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwdIm/dJMcajoyggm/vRgjKlpyFFlESEpt28VBZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwdIm%2FdJMcajoyggm%2FvRgjKlpyFFlESEpt28VBZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1207&quot; height=&quot;842&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;842&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;amplify 검색&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amplify 화면에서 앱 배포, 템플릿으로 시작하기 버튼이 보인다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMfPvw/dJMcahEj9ri/O1yOQkKTreFic2BJ5apPkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMfPvw/dJMcahEj9ri/O1yOQkKTreFic2BJ5apPkk/img.png&quot; data-alt=&quot;앱 배포 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMfPvw/dJMcahEj9ri/O1yOQkKTreFic2BJ5apPkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMfPvw%2FdJMcahEj9ri%2FO1yOQkKTreFic2BJ5apPkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1788&quot; height=&quot;877&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 배포 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;깃 허브 클릭 &amp;gt; 다음 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYNshF/dJMcaaeaK0n/afnEaks1GPF0ryGn1JZyGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYNshF/dJMcaaeaK0n/afnEaks1GPF0ryGn1JZyGk/img.png&quot; data-alt=&quot;새 앱 생성 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYNshF/dJMcaaeaK0n/afnEaks1GPF0ryGn1JZyGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYNshF%2FdJMcaaeaK0n%2FafnEaks1GPF0ryGn1JZyGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1907&quot; height=&quot;882&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;새 앱 생성 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Git에 권한을 허가하는 화면이 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authorize 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;987&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TQ5vn/dJMcagMeMa4/vssHg7evHND8KbRbVWNrK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TQ5vn/dJMcagMeMa4/vssHg7evHND8KbRbVWNrK0/img.png&quot; data-alt=&quot;권한 허용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TQ5vn/dJMcagMeMa4/vssHg7evHND8KbRbVWNrK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTQ5vn%2FdJMcagMeMa4%2FvssHg7evHND8KbRbVWNrK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;987&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;987&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;권한 허용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 레포지토리만 배포할 수 있도록 선택합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레포지터리를 선택 후 Install &amp;amp; Authorize 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhuywd/dJMcabxll5D/AKx5h89vy7lAqJIhriFOX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhuywd/dJMcabxll5D/AKx5h89vy7lAqJIhriFOX0/img.png&quot; data-alt=&quot;레포지터리 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhuywd/dJMcabxll5D/AKx5h89vy7lAqJIhriFOX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhuywd%2FdJMcabxll5D%2FAKx5h89vy7lAqJIhriFOX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;1125&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;레포지터리 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리포지토리 및 브랜치 추가 화면이 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tPd5K/dJMcagrTPTE/Ljr0AIko5fjNMfy6xj6Xr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tPd5K/dJMcagrTPTE/Ljr0AIko5fjNMfy6xj6Xr0/img.png&quot; data-alt=&quot;리포지토리 및 브랜치 선택 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tPd5K/dJMcagrTPTE/Ljr0AIko5fjNMfy6xj6Xr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtPd5K%2FdJMcagrTPTE%2FLjr0AIko5fjNMfy6xj6Xr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;882&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리포지토리 및 브랜치 선택 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;881&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c59RJR/dJMcaa6jqGL/m8YTqXF1m5rLIqrwW5wBtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c59RJR/dJMcaa6jqGL/m8YTqXF1m5rLIqrwW5wBtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c59RJR/dJMcaa6jqGL/m8YTqXF1m5rLIqrwW5wBtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc59RJR%2FdJMcaa6jqGL%2Fm8YTqXF1m5rLIqrwW5wBtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;881&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;881&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리포지터리를 선택하면 브랜치가 선택됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 브랜치는 production 할 브랜치입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;876&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHUwFo/dJMcagrTP3w/gRuVanPMMpwLQca7LnPLKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHUwFo/dJMcagrTP3w/gRuVanPMMpwLQca7LnPLKk/img.png&quot; data-alt=&quot;브랜치 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHUwFo/dJMcagrTP3w/gRuVanPMMpwLQca7LnPLKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHUwFo%2FdJMcagrTP3w%2FgRuVanPMMpwLQca7LnPLKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1899&quot; height=&quot;876&quot; data-origin-width=&quot;1899&quot; data-origin-height=&quot;876&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브랜치 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 앱은 모노 리포지터리임 : 리포지터리에 백엔드와 함께 있는 리포지터리를 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 설정 화면이 나타납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드 설정에서는 사용하고 있는 패키지 매니저의 명령어를 입력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 npm을 사용한 프로젝트이므로 npm으로 설정해 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/09Zfe/dJMcahRRyqi/2sGidNtTfmUKO2SPTTAZl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/09Zfe/dJMcahRRyqi/2sGidNtTfmUKO2SPTTAZl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/09Zfe/dJMcahRRyqi/2sGidNtTfmUKO2SPTTAZl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F09Zfe%2FdJMcahRRyqi%2F2sGidNtTfmUKO2SPTTAZl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;887&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고급 설정 화면입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 당장 필요한 부분이 없어 설정하지 않았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bm2ZjS/dJMcabYrXOQ/HXXdkN0panPWoSmkB5ppm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bm2ZjS/dJMcabYrXOQ/HXXdkN0panPWoSmkB5ppm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bm2ZjS/dJMcabYrXOQ/HXXdkN0panPWoSmkB5ppm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbm2ZjS%2FdJMcabYrXOQ%2FHXXdkN0panPWoSmkB5ppm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1904&quot; height=&quot;882&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 완료하면 검토 화면이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;편집 버튼이 보이는데 편집 버튼을 클릭하면 아무런 동작이 없습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아마 AWS에서 아직 구현 중인 걸로 예상됩니다.(26년 5월 8일 기준)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;890&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL2KmT/dJMcabqCzss/T1cMZgePzNFpNyWSdHrzvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL2KmT/dJMcabqCzss/T1cMZgePzNFpNyWSdHrzvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL2KmT/dJMcabqCzss/T1cMZgePzNFpNyWSdHrzvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL2KmT%2FdJMcabqCzss%2FT1cMZgePzNFpNyWSdHrzvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1907&quot; height=&quot;890&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;890&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음을 클릭하면 배포가 진행됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;875&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJYAB/dJMb99M29yc/OheauaZV17Chv6HI4tIG10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJYAB/dJMb99M29yc/OheauaZV17Chv6HI4tIG10/img.png&quot; data-alt=&quot;앱 배포 진행 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJYAB/dJMb99M29yc/OheauaZV17Chv6HI4tIG10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJYAB%2FdJMb99M29yc%2FOheauaZV17Chv6HI4tIG10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1900&quot; height=&quot;875&quot; data-origin-width=&quot;1900&quot; data-origin-height=&quot;875&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 배포 진행 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6XsLc/dJMcacJP5G1/Qe5CozEopDJpdiIaSCAyS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6XsLc/dJMcacJP5G1/Qe5CozEopDJpdiIaSCAyS0/img.png&quot; data-alt=&quot;앱 배포 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6XsLc/dJMcacJP5G1/Qe5CozEopDJpdiIaSCAyS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6XsLc%2FdJMcacJP5G1%2FQe5CozEopDJpdiIaSCAyS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;931&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 배포 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQ73hm/dJMcabc1UFN/40rtk8JPFPfmjx6Ke6caIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQ73hm/dJMcabc1UFN/40rtk8JPFPfmjx6Ke6caIK/img.png&quot; data-alt=&quot;배포 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQ73hm/dJMcabc1UFN/40rtk8JPFPfmjx6Ke6caIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQ73hm%2FdJMcabc1UFN%2F40rtk8JPFPfmjx6Ke6caIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;925&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배포 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[번외 : 배포 삭제]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱 삭제를 원한다면 앱 삭제를 클릭한 후 진행하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;921&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZgPCj/dJMcabD8wz3/h3u9ezZoKFoLXHlhbZQbwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZgPCj/dJMcabD8wz3/h3u9ezZoKFoLXHlhbZQbwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZgPCj/dJMcabD8wz3/h3u9ezZoKFoLXHlhbZQbwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZgPCj%2FdJMcabD8wz3%2Fh3u9ezZoKFoLXHlhbZQbwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;921&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;921&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/271&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/271&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779350512177&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[IT 노트] CI/CD란 무엇인가? 개념부터 파이프라인 이해하기&quot; data-og-description=&quot;목차 CI/CD란 무엇인가?CI/CD 파이프라인 구조환경별 배포 전략 [CI/CD란?]CI/CD는 애플리케이션 개발에서 배포까지의 모든 단계를 자동화를 통해서 조금 더 효율적이고 빠르게 사용자에게 배포할 수 &quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/271&quot; data-og-url=&quot;https://devyihyun.tistory.com/271&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IvuOx/dJMb8VNBoqP/We9DltykI7Py0WuLPDBbUK/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/Q0HWr/dJMb9frLdZJ/pTnNuqlnhmcMzL5wkUbGG1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/nJQ3E/dJMb8SXDF5C/zBYDGPO131N3WHtsJHzzX0/img.png?width=3777&amp;amp;height=2859&amp;amp;face=0_0_3777_2859&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/271&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/271&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IvuOx/dJMb8VNBoqP/We9DltykI7Py0WuLPDBbUK/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/Q0HWr/dJMb9frLdZJ/pTnNuqlnhmcMzL5wkUbGG1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/nJQ3E/dJMb8SXDF5C/zBYDGPO131N3WHtsJHzzX0/img.png?width=3777&amp;amp;height=2859&amp;amp;face=0_0_3777_2859');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[IT 노트] CI/CD란 무엇인가? 개념부터 파이프라인 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 CI/CD란 무엇인가?CI/CD 파이프라인 구조환경별 배포 전략 [CI/CD란?]CI/CD는 애플리케이션 개발에서 배포까지의 모든 단계를 자동화를 통해서 조금 더 효율적이고 빠르게 사용자에게 배포할 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Next.js</category>
      <category>amplify</category>
      <category>AWS</category>
      <category>CI/CD</category>
      <category>GIT</category>
      <category>next.js</category>
      <category>개발자</category>
      <category>무중단 배포</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/274</guid>
      <comments>https://devyihyun.tistory.com/274#entry274comment</comments>
      <pubDate>Wed, 20 May 2026 18:07:36 +0900</pubDate>
    </item>
    <item>
      <title>[Next.js] Next.js 시작하기 : 프로젝트 생성</title>
      <link>https://devyihyun.tistory.com/273</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/plgAb/dJMcacpiCOD/3aa5kW0Pzhl4zAZJGzLNM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/plgAb/dJMcacpiCOD/3aa5kW0Pzhl4zAZJGzLNM1/img.png&quot; data-alt=&quot;Next.js&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/plgAb/dJMcacpiCOD/3aa5kW0Pzhl4zAZJGzLNM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FplgAb%2FdJMcacpiCOD%2F3aa5kW0Pzhl4zAZJGzLNM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;811&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Next.js&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;개발 환경 준비&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js 프로젝트 생성하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js 실행&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js에 대한 개념 설명은 다음 게시글에 작성해 두겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[개발 환경 준비]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js16 버전을 사용하려면 Node.js가 필요하다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소 Node.js 버전 : 20.9&lt;/li&gt;
&lt;li&gt;운영체제 : macOS, Windows(WSL포함), Linux&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/168&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/168&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776751711820&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[React] 리액트 시작하기 / 리액트 설치 / 개발환경&quot; data-og-description=&quot;목차 작업환경 준비하기Node.js 설치하기yarn 설치하기vscode 설치하기git for windows 설치하기리액트 환경설정 리액트 환경을 설치하는 CRA가 2025년 2월 14일에 종료되었습니다.npx create-react-app 대신 vite&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/168&quot; data-og-url=&quot;https://devyihyun.tistory.com/168&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ck98z3/dJMb9iaTizm/160mzemNsQc8J7OrWRWAW1/img.png?width=500&amp;amp;height=433&amp;amp;face=281_186_347_252,https://scrap.kakaocdn.net/dn/bIgAUR/dJMb9frHCc9/sD5aZNLgvOMKQhXJHZb7NK/img.png?width=500&amp;amp;height=433&amp;amp;face=281_186_347_252,https://scrap.kakaocdn.net/dn/usTdr/dJMb9bv4ry1/oANdoUwr87rzZYjx6W1U21/img.png?width=1715&amp;amp;height=386&amp;amp;face=0_0_1715_386&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/168&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/168&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ck98z3/dJMb9iaTizm/160mzemNsQc8J7OrWRWAW1/img.png?width=500&amp;amp;height=433&amp;amp;face=281_186_347_252,https://scrap.kakaocdn.net/dn/bIgAUR/dJMb9frHCc9/sD5aZNLgvOMKQhXJHZb7NK/img.png?width=500&amp;amp;height=433&amp;amp;face=281_186_347_252,https://scrap.kakaocdn.net/dn/usTdr/dJMb9bv4ry1/oANdoUwr87rzZYjx6W1U21/img.png?width=1715&amp;amp;height=386&amp;amp;face=0_0_1715_386');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[React] 리액트 시작하기 / 리액트 설치 / 개발환경&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 작업환경 준비하기Node.js 설치하기yarn 설치하기vscode 설치하기git for windows 설치하기리액트 환경설정 리액트 환경을 설치하는 CRA가 2025년 2월 14일에 종료되었습니다.npx create-react-app 대신 vite&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/15&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776750724281&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[VSCODE] VSCODE 설치 / Visual Studio Code 설치하기&quot; data-og-description=&quot;목차 VSCODE 설치 VSCODE 환경설정 (한글설정) 번외 [ VSCODE 설치 ] 1. 홈페이지 접속 2. 본인의 운영체제에 맞는 설치 파일 클릭 저는 window운영체제로 설치하였습니다. 2. 설치 파일 클릭 후 동의합니다&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/15&quot; data-og-url=&quot;https://devyihyun.tistory.com/15&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMrazj/dJMb83ku6th/5LMAtz2SneNhDWAVOvoHP0/img.png?width=700&amp;amp;height=416&amp;amp;face=0_0_700_416,https://scrap.kakaocdn.net/dn/TYhIE/dJMb87NYEld/IIv3Kg1W8tqxnKQk6RQDmK/img.png?width=700&amp;amp;height=416&amp;amp;face=0_0_700_416,https://scrap.kakaocdn.net/dn/wWQ8C/dJMb88F65Kg/TOVrKoKBhfZS30ol7f4Mz0/img.png?width=1916&amp;amp;height=957&amp;amp;face=0_0_1916_957&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/15&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/15&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMrazj/dJMb83ku6th/5LMAtz2SneNhDWAVOvoHP0/img.png?width=700&amp;amp;height=416&amp;amp;face=0_0_700_416,https://scrap.kakaocdn.net/dn/TYhIE/dJMb87NYEld/IIv3Kg1W8tqxnKQk6RQDmK/img.png?width=700&amp;amp;height=416&amp;amp;face=0_0_700_416,https://scrap.kakaocdn.net/dn/wWQ8C/dJMb88F65Kg/TOVrKoKBhfZS30ol7f4Mz0/img.png?width=1916&amp;amp;height=957&amp;amp;face=0_0_1916_957');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[VSCODE] VSCODE 설치 / Visual Studio Code 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 VSCODE 설치 VSCODE 환경설정 (한글설정) 번외 [ VSCODE 설치 ] 1. 홈페이지 접속 2. 본인의 운영체제에 맞는 설치 파일 클릭 저는 window운영체제로 설치하였습니다. 2. 설치 파일 클릭 후 동의합니다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/166&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/166&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776750682556&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Node.js] Node.js 설치하기 / 노드js 설치하기&quot; data-og-description=&quot;[Node.js 설치하기] ※ 본 포스팅은 윈도우 11의 환경에서 진행되었습니다. Node.js 공식 홈페이지 접속 Node.js Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org LTS와 Current 버전 중 원하&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/166&quot; data-og-url=&quot;https://devyihyun.tistory.com/166&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f1fRa/dJMb9c9z2xS/02BZALNcmEi1o2Oe2rGY2K/img.png?width=600&amp;amp;height=325&amp;amp;face=0_0_600_325,https://scrap.kakaocdn.net/dn/b2qoWp/dJMb83Sk18B/i4YdTp8583izhWqhPIP9wK/img.png?width=600&amp;amp;height=325&amp;amp;face=0_0_600_325,https://scrap.kakaocdn.net/dn/AYuMH/dJMb89yfKsZ/yojCUHPEvVRinLX9YGSMb1/img.png?width=1912&amp;amp;height=918&amp;amp;face=0_0_1912_918&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/166&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/166&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f1fRa/dJMb9c9z2xS/02BZALNcmEi1o2Oe2rGY2K/img.png?width=600&amp;amp;height=325&amp;amp;face=0_0_600_325,https://scrap.kakaocdn.net/dn/b2qoWp/dJMb83Sk18B/i4YdTp8583izhWqhPIP9wK/img.png?width=600&amp;amp;height=325&amp;amp;face=0_0_600_325,https://scrap.kakaocdn.net/dn/AYuMH/dJMb89yfKsZ/yojCUHPEvVRinLX9YGSMb1/img.png?width=1912&amp;amp;height=918&amp;amp;face=0_0_1912_918');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Node.js] Node.js 설치하기 / 노드js 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[Node.js 설치하기] ※ 본 포스팅은 윈도우 11의 환경에서 진행되었습니다. Node.js 공식 홈페이지 접속 Node.js Node.js&amp;reg; is a JavaScript runtime built on Chrome's V8 JavaScript engine. nodejs.org LTS와 Current 버전 중 원하&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/167&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/167&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776750706378&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[yarn] yarn 설치하기&quot; data-og-description=&quot;[Node.js 설치] yarn을 설치하기 위해서는 node.js를 설치해야한다. 단축키 윈도우 + Q를 눌려 cmd를 실행한다. node -v 명령어를 입력하고 Enter키를 누른다. 결과가 다음과 같이 버전이 나온다면 설치가 &quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/167&quot; data-og-url=&quot;https://devyihyun.tistory.com/167&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bELNTp/dJMb9jgzrTD/Q1R9Dh5kPsYhTsKbCgbs6K/img.png?width=500&amp;amp;height=223&amp;amp;face=0_0_500_223,https://scrap.kakaocdn.net/dn/fNHEy/dJMb9c9z2yk/HnM5sKommFjA5LR5gugIXK/img.png?width=500&amp;amp;height=223&amp;amp;face=0_0_500_223,https://scrap.kakaocdn.net/dn/i9SLz/dJMb9lk9jeT/AX7glGtvhzMxpJv93PZQh0/img.png?width=775&amp;amp;height=744&amp;amp;face=0_0_775_744&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/167&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/167&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bELNTp/dJMb9jgzrTD/Q1R9Dh5kPsYhTsKbCgbs6K/img.png?width=500&amp;amp;height=223&amp;amp;face=0_0_500_223,https://scrap.kakaocdn.net/dn/fNHEy/dJMb9c9z2yk/HnM5sKommFjA5LR5gugIXK/img.png?width=500&amp;amp;height=223&amp;amp;face=0_0_500_223,https://scrap.kakaocdn.net/dn/i9SLz/dJMb9lk9jeT/AX7glGtvhzMxpJv93PZQh0/img.png?width=775&amp;amp;height=744&amp;amp;face=0_0_775_744');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[yarn] yarn 설치하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[Node.js 설치] yarn을 설치하기 위해서는 node.js를 설치해야한다. 단축키 윈도우 + Q를 눌려 cmd를 실행한다. node -v 명령어를 입력하고 Enter키를 누른다. 결과가 다음과 같이 버전이 나온다면 설치가&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Next.js 프로젝트 생성하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성하기 위해 명령어를 입력합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776751997852&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// npm
npx create-next-app

// pnpm
pnpm create-next-app

// yarn
yarn create next-app&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1779349098436&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[E-LOG] yarn create next-app@latest 오류&quot; data-og-description=&quot;목차오류 내용원인해결방법 [오류 내용]사이드 프로젝트가 next.js 15에서 진행하고 있다.라이브러리 사용법이 이해가 가지 않아 라이브러리를 익히기 위해 동일한 환경에서 학습해 보려고 했다.&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/229&quot; data-og-url=&quot;https://devyihyun.tistory.com/229&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4hW8u/dJMb9kmisFv/P2OkP1u0gv5qSZNLZCWlUK/img.png?width=600&amp;amp;height=435&amp;amp;face=0_0_600_435,https://scrap.kakaocdn.net/dn/c8q6dC/dJMb8WMvtxS/1w2PSnoEfV1CI4jKGuRcr0/img.png?width=600&amp;amp;height=435&amp;amp;face=0_0_600_435,https://scrap.kakaocdn.net/dn/bDldNP/dJMb8ZvHiCF/hc8JMo0WDrpEGaLbQA5DCK/img.png?width=1205&amp;amp;height=875&amp;amp;face=0_0_1205_875&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/229&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/229&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4hW8u/dJMb9kmisFv/P2OkP1u0gv5qSZNLZCWlUK/img.png?width=600&amp;amp;height=435&amp;amp;face=0_0_600_435,https://scrap.kakaocdn.net/dn/c8q6dC/dJMb8WMvtxS/1w2PSnoEfV1CI4jKGuRcr0/img.png?width=600&amp;amp;height=435&amp;amp;face=0_0_600_435,https://scrap.kakaocdn.net/dn/bDldNP/dJMb8ZvHiCF/hc8JMo0WDrpEGaLbQA5DCK/img.png?width=1205&amp;amp;height=875&amp;amp;face=0_0_1205_875');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[E-LOG] yarn create next-app@latest 오류&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차오류 내용원인해결방법 [오류 내용]사이드 프로젝트가 next.js 15에서 진행하고 있다.라이브러리 사용법이 이해가 가지 않아 라이브러리를 익히기 위해 동일한 환경에서 학습해 보려고 했다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 입력하면 다음과 같은 메시지가 표시됩니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776752292935&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;What is your project named? my-app
Would you like to use the recommended Next.js defaults?
    Yes, use recommended defaults - TypeScript, ESLint, Tailwind CSS, App Router, AGENTS.md
    No, reuse previous settings
    No, customize settings - Choose your own preferences&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 과정에서 메시지가 표시됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;what is your project named? : 생성할 프로젝트 폴더 이름을 입력하는 단계입니다. 입력한 이름으로 폴더가 생성됩니다.&lt;/li&gt;
&lt;li&gt;Would you like to use the recommended Next.js defaults? : Next.js의 기본 설정을 사용할지 묻는 질문입니다. 3가지의 선택지가 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Yes, use recommended defaults : (추천) Next.js에서 권장하는 최신 개발 환경을 자동으로 설정해 줍니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript : 타입 안정성을 위한 언어&lt;/li&gt;
&lt;li&gt;ESLint : 코드 스타일 및 오류 검사&lt;/li&gt;
&lt;li&gt;Tailwind CSS : 유틸 기반 CSS 프레임워크&lt;/li&gt;
&lt;li&gt;App Router : 최신 Next.js 라우팅 방식&lt;/li&gt;
&lt;li&gt;AGENTS.md : 프로젝트 설정 및 안내 파일&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;No, reuse previous settings : 이전에 사용했던 설정을 그대로 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번 설정한 옵션이 있다면 그대로 적용된다.&lt;/li&gt;
&lt;li&gt;반복 프로젝트 생성할 때 편리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;No, customize settings : 직접 하나씩 설정을 선택하는 옵션입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Yes, use recommended defaults 선택 결과&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR8fx3/dJMcadV0iAs/IzZbfwsLemsmjqkV1OcttK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR8fx3/dJMcadV0iAs/IzZbfwsLemsmjqkV1OcttK/img.png&quot; data-alt=&quot;추천된 기본 설정 결과 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR8fx3/dJMcadV0iAs/IzZbfwsLemsmjqkV1OcttK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR8fx3%2FdJMcadV0iAs%2FIzZbfwsLemsmjqkV1OcttK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1302&quot; height=&quot;925&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;추천된 기본 설정 결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;No, customize settings 선택 결과&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정을 직접 하나씩 선택하는 옵션이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SMD9o/dJMcaf7nsrB/PyZ4ro6RyDA1vNux2V2yB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SMD9o/dJMcaf7nsrB/PyZ4ro6RyDA1vNux2V2yB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SMD9o/dJMcaf7nsrB/PyZ4ro6RyDA1vNux2V2yB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSMD9o%2FdJMcaf7nsrB%2FPyZ4ro6RyDA1vNux2V2yB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1083&quot; height=&quot;280&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;선택 가능한 항목들&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1776754538825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Would you like to use TypeScript? No / Yes
Which linter would you like to use? ESLint / Biome / None
Would you like to use React Compiler? No / Yes
Would you like to use Tailwind CSS? No / Yes
Would you like your code inside a `src/` directory? No / Yes
Would you like to use App Router? (recommended) No / Yes
Would you like to customize the import alias (`@/*` by default)? No / Yes
What import alias would you like configured? @/*
Would you like to include AGENTS.md to guide coding agents to write up-to-date Next.js code? No / Yes&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Would you like to use TypeScript? No / Yes&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TypeScript를 사용할지 결정하는 옵션&lt;/li&gt;
&lt;li&gt;Yes : 타입 안정성, 자동완성, 유지보수성 높음&lt;/li&gt;
&lt;li&gt;No : JavaScript로 간단하게 시작&lt;/li&gt;
&lt;li&gt;&amp;rarr; 요즘 Next.js 프로젝트는 거의 기본적으로 TypeScript를 사용해서 Yes를 추천드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Which linter would you like to use? ESLint / Biome / None
&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;ESLint : 가장 많이 사용하고 되는 표준 도구&lt;/li&gt;
&lt;li&gt;Biome : 빠르고 최신 도구(Rome 후속)&lt;/li&gt;
&lt;li&gt;None : 사용 안 함&lt;/li&gt;
&lt;li&gt;&amp;rarr; 안정성을 위해 ESLint를 사용하는 것을 추천드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Would you like to use React Compiler? No / Yes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;React 성능 최적화를 자동으로 해주는 기능을 사용할지 결정하는 옵션&lt;/li&gt;
&lt;li&gt;최근에 추가된 옵션으로 아직은 실험적인 부분이 있습니다.&lt;/li&gt;
&lt;li&gt;자동으로 불필요한 렌더링을 최적화하는 용도&lt;/li&gt;
&lt;li&gt;&amp;rarr; 학습용이나 테스트용이라면 Yes, 안정성을 우선시하신다면 No를 추천드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Would you like to use Tailwind CSS? No / Yes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Tailwind CSS를 사용할지 결정하는 옵션&lt;/li&gt;
&lt;li&gt;Yes : 빠른 UI 개발 가능&amp;nbsp;&lt;/li&gt;
&lt;li&gt;No : 일반 CSS/SCSS 사용&lt;/li&gt;
&lt;li&gt;&amp;rarr; 생산성을 높이기 위해 Yes를 추천드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Would you like your code inside a `src/` directory? No / Yes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스코드를 src 폴더 안에 넣을지 결정하는 옵션&lt;/li&gt;
&lt;li&gt;Yes : (추천) 폴더 구조 깔끔&lt;/li&gt;
&lt;li&gt;No : 루트에 바로 파일 생성&lt;/li&gt;
&lt;li&gt;&amp;rarr; 프로젝트가 커질수록 폴더 구조가 중요해집니다. 그래서 Yes를 추천드립니다.&lt;/li&gt;
&lt;li&gt;예시&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776755054361&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;src/
  app/
  components/&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Would you like to use App Router? (recommended) No / Yes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;App Router를 사용할지에 대한 여부를 선택합니다.&lt;/li&gt;
&lt;li&gt;Next.js에서는 페이지를 만드는 방법으로 App Router와 Page Router 두 가지가 있습니다.&lt;/li&gt;
&lt;li&gt;Yes : App Router 방식으로 /app폴더 기반입니다. 최신방식으로 서버 컴포넌트 기본지원, 레이아웃, 로딩, 에러처리 구조가 깔끔합니다.&lt;/li&gt;
&lt;li&gt;No : Page Router 방식으로 /pages 폴더 기반입니다. 예전부터 쓰던 방식으로 단순하고 익숙합니다.&lt;/li&gt;
&lt;li&gt;&amp;rarr; 공식문서에서도 App Router 방식을 선호하고 있습니다. 그래서 Yes를 추천드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Would&amp;nbsp;you&amp;nbsp;like&amp;nbsp;to&amp;nbsp;customize&amp;nbsp;the&amp;nbsp;import&amp;nbsp;alias&amp;nbsp;(`@/*`&amp;nbsp;by&amp;nbsp;default)?&amp;nbsp;No&amp;nbsp;/&amp;nbsp;Yes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;경로 별칭(alias)을 바꿀지 선택하는 부분입니다.&lt;/li&gt;
&lt;li&gt;Yes : 폴더 경로를 [import Button from &quot;@/components/ui/Button&quot;]으로 표현&lt;/li&gt;
&lt;li&gt;No : 폴더 경로를 [import Button from &quot;../../.../../components/ui/Button]으로 표현&lt;/li&gt;
&lt;li&gt;&amp;rarr; 저는 Yes를 추천드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;What import alias would you like configured? @/*
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;alias를 입력하는 단계입니다.&lt;/li&gt;
&lt;li&gt;@/* , ~/* , src/* 등으로 사용하기도 합니다.&lt;/li&gt;
&lt;li&gt;일반적으로는 @/*을 많이 사용합니다.&lt;/li&gt;
&lt;li&gt;&amp;rarr; 엔터를 누르면 기본 설정인 '@/*'로 설정됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Would&amp;nbsp;you&amp;nbsp;like&amp;nbsp;to&amp;nbsp;include&amp;nbsp;AGENTS.md&amp;nbsp;to&amp;nbsp;guide&amp;nbsp;coding&amp;nbsp;agents&amp;nbsp;to&amp;nbsp;write&amp;nbsp;up-to-date&amp;nbsp;Next.js&amp;nbsp;code?&amp;nbsp;No&amp;nbsp;/&amp;nbsp;Yes
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AI 코드 도구를 위한 가이드 파일 생성 여부를 선택하는 옵션입니다.&lt;/li&gt;
&lt;li&gt;필요에 따라 선택하면 되는 설정입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkk5P5/dJMcai33OXN/WretCzcigtxk65TFQve3yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkk5P5/dJMcai33OXN/WretCzcigtxk65TFQve3yK/img.png&quot; data-alt=&quot;커스텀 설정 한 후 결과 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkk5P5/dJMcai33OXN/WretCzcigtxk65TFQve3yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkk5P5%2FdJMcai33OXN%2FWretCzcigtxk65TFQve3yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1378&quot; height=&quot;960&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커스텀 설정 한 후 결과 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Next.js 실행]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어를 입력해 실행해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776755786708&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run dev&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ju1j1/dJMcad2K4DP/QYuKbWGP58XKZZakkslJi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ju1j1/dJMcad2K4DP/QYuKbWGP58XKZZakkslJi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ju1j1/dJMcad2K4DP/QYuKbWGP58XKZZakkslJi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJu1j1%2FdJMcad2K4DP%2FQYuKbWGP58XKZZakkslJi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1831&quot; height=&quot;1027&quot; data-origin-width=&quot;1831&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/270&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/270&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779350556943&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Next.js] Next.js + Firebase(Firestore) 연동하기 + API 구조 설계&quot; data-og-description=&quot;목차 Firebase란?Firebase 프로젝트 생성하기Firestore 데이터 생성하기Next.js에서 Firebase 연동하기Firestore 데이터 가져오기API Route 구성하기(/api/board)클라이언트에서 데이터 호출하기전체 구조 흐름 정&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/270&quot; data-og-url=&quot;https://devyihyun.tistory.com/270&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/JH0DZ/dJMb9jOsIlF/ctiKrsKCNK3Nt2F1i38xCk/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bZ9Nyq/dJMb88GaPdm/5PynUHMOCAErrvJxMRVva1/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/3sPQd/dJMb9eTVmWX/Dcr5vl2WBSgteDI6kqapF1/img.png?width=2000&amp;amp;height=1019&amp;amp;face=975_156_1053_240&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/270&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/270&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/JH0DZ/dJMb9jOsIlF/ctiKrsKCNK3Nt2F1i38xCk/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bZ9Nyq/dJMb88GaPdm/5PynUHMOCAErrvJxMRVva1/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/3sPQd/dJMb9eTVmWX/Dcr5vl2WBSgteDI6kqapF1/img.png?width=2000&amp;amp;height=1019&amp;amp;face=975_156_1053_240');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Next.js] Next.js + Firebase(Firestore) 연동하기 + API 구조 설계&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 Firebase란?Firebase 프로젝트 생성하기Firestore 데이터 생성하기Next.js에서 Firebase 연동하기Firestore 데이터 가져오기API Route 구성하기(/api/board)클라이언트에서 데이터 호출하기전체 구조 흐름 정&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/272&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/272&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779350436100&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Next.js] Next.js를 Vercel에 배포하기&quot; data-og-description=&quot;목차 Vercel이란?Next.js 프로젝트 Vercel에 배포하기환경변수 설정커밋부터 배포까지 : 자동 빌드 확인하기 [Vercel이란?]Next.js는 이미 많은 프론트엔드 개발자들이 선택하는 대표적인 React 프레임워크&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/272&quot; data-og-url=&quot;https://devyihyun.tistory.com/272&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dEyFI7/dJMb85WZcvQ/jSgCzrvfDETOKutbRy4Dt0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bZ8ULC/dJMb81fYumi/p1KMI3vdV6bxg713mHS6lK/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/1YRfo/dJMb9c9DFQy/3UvstK26PGT9mvegXYpVNK/img.png?width=1594&amp;amp;height=811&amp;amp;face=0_0_1594_811&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/272&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/272&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dEyFI7/dJMb85WZcvQ/jSgCzrvfDETOKutbRy4Dt0/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/bZ8ULC/dJMb81fYumi/p1KMI3vdV6bxg713mHS6lK/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/1YRfo/dJMb9c9DFQy/3UvstK26PGT9mvegXYpVNK/img.png?width=1594&amp;amp;height=811&amp;amp;face=0_0_1594_811');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Next.js] Next.js를 Vercel에 배포하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 Vercel이란?Next.js 프로젝트 Vercel에 배포하기환경변수 설정커밋부터 배포까지 : 자동 빌드 확인하기 [Vercel이란?]Next.js는 이미 많은 프론트엔드 개발자들이 선택하는 대표적인 React 프레임워크&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/274&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/274&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779350444640&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Next.js] Next.js 무중단 배포, AWS Amplify로 구축하기&quot; data-og-description=&quot;목차 들어가며AWS Amplify 배포 과정 [들어가며]멘토링을 진행하면서 배포에 대한 고민을 하게 되었다.처음에는 기능 구현에 집중했지만 서비스를 운영하는 관점에서 바라보게 되었다.이전에 진행&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/274&quot; data-og-url=&quot;https://devyihyun.tistory.com/274&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cEfqne/dJMb9frLd62/NnhGmU9ZyshlaJ1l6t4nJK/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/nWdPP/dJMb9c9DFQJ/ZvPhVrFqhsoJdBEG8Ebd81/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/x05N9/dJMb88GaPcn/sdi7dO8Qq1ad2UllGWLra1/img.png?width=1889&amp;amp;height=929&amp;amp;face=0_0_1889_929&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/274&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/274&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cEfqne/dJMb9frLd62/NnhGmU9ZyshlaJ1l6t4nJK/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/nWdPP/dJMb9c9DFQJ/ZvPhVrFqhsoJdBEG8Ebd81/img.png?width=800&amp;amp;height=407&amp;amp;face=0_0_800_407,https://scrap.kakaocdn.net/dn/x05N9/dJMb88GaPcn/sdi7dO8Qq1ad2UllGWLra1/img.png?width=1889&amp;amp;height=929&amp;amp;face=0_0_1889_929');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Next.js] Next.js 무중단 배포, AWS Amplify로 구축하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 들어가며AWS Amplify 배포 과정 [들어가며]멘토링을 진행하면서 배포에 대한 고민을 하게 되었다.처음에는 기능 구현에 집중했지만 서비스를 운영하는 관점에서 바라보게 되었다.이전에 진행&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nextjs.org/docs&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://nextjs.org/docs&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Next.js</category>
      <category>JavaScript</category>
      <category>next.js</category>
      <category>react.js</category>
      <category>개발자</category>
      <category>라이브러리</category>
      <category>프레임워크</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/273</guid>
      <comments>https://devyihyun.tistory.com/273#entry273comment</comments>
      <pubDate>Mon, 18 May 2026 18:10:52 +0900</pubDate>
    </item>
    <item>
      <title>[Next.js] Next.js를 Vercel에 배포하기</title>
      <link>https://devyihyun.tistory.com/272</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xoA71/dJMcagZvktT/KGylzKmo9i9z0w9OwiBqG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xoA71/dJMcagZvktT/KGylzKmo9i9z0w9OwiBqG0/img.png&quot; data-alt=&quot;Next.js와 Vercel&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xoA71/dJMcagZvktT/KGylzKmo9i9z0w9OwiBqG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxoA71%2FdJMcagZvktT%2FKGylzKmo9i9z0w9OwiBqG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;811&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Next.js와 Vercel&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Vercel이란?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js 프로젝트 Vercel에 배포하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;환경변수 설정&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커밋부터 배포까지 : 자동 빌드 확인하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Vercel이란?]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqS1XA/dJMcaffh0RO/H3CtPVi83Rii0b1wIa6NKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqS1XA/dJMcaffh0RO/H3CtPVi83Rii0b1wIa6NKk/img.png&quot; data-alt=&quot;https://vercel.com/products/previews&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqS1XA/dJMcaffh0RO/H3CtPVi83Rii0b1wIa6NKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqS1XA%2FdJMcaffh0RO%2FH3CtPVi83Rii0b1wIa6NKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;734&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://vercel.com/products/previews&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js는 이미 많은 프론트엔드 개발자들이 선택하는 대표적인 React 프레임워크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 사이드 렌더링 (SSR), 정적 사이트 생성(SSG) 같은 기능을 쉽게 구현할 수 있어 성능과 SEO 측면에서도 강력한 장점을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 애플리케이션을 개발했다고 해서 끝이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 사용자가 접근할 수 있도록 배포하고 이후에도 안정적으로 서비스를 운영하려면 배포 환경과 자동화된 배포 파이프라인(CI/CD)이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 Vercel은 Next.js를 만든 팀에서 직접 제공하는 호스팅 플랫폼이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별도의 서버 설정이나 복잡한 빌드 과정 없이도 손쉽게 프로젝트를 배포할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 GitHub, Git Lab, BitBuckey 같은 Git 저장소와 연결만 하면, 코드 변경 사항이 자동으로 배포되는 CI/CD 환경얼 자연스럽게 제공하기 때문에 생산성을 크게 높여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글에서는 Next.js 프로젝트를 준비하고, Vercel을 통해 간단히 배포하는 방법을 살펴본 뒤 Git 저장소와 연동한 자동 배포 CI/CD 과정까지 작성해보려 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 따라가다 보면 코드 작성 &amp;rarr; git push &amp;rarr; 자동배포라는 개발 워크플로우를 경험할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel은 Git 저장소와 연동하면 기본적으로 자동 CI/CD 환경을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 설정 없이도 기본 CI/CD가 작동하므로 Next.js + Vercel조합은 초보자에게 매우 편리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Vercel배포 자동화 과정&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel로 자동 배포하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vercel.com/products/previews&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://vercel.com/products/previews&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776691253273&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Vercel's toolkit for fueling iteration. &amp;ndash; Vercel&quot; data-og-description=&quot;Vercel's DX Platform gives your team everything to develop, preview, and ship the best web experiences to the world.&quot; data-og-host=&quot;vercel.com&quot; data-og-source-url=&quot;https://vercel.com/products/previews&quot; data-og-url=&quot;https://vercel.com/products/previews&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/byoOD1/dJMb8XkhrIl/6PpMxOQML0OH8UKU2CBb01/img.png?width=2400&amp;amp;height=1256&amp;amp;face=0_0_2400_1256,https://scrap.kakaocdn.net/dn/MYQRh/dJMb8UHRdWp/rdP42ZhLL24FYyDBp9LwnK/img.png?width=2400&amp;amp;height=1256&amp;amp;face=0_0_2400_1256&quot;&gt;&lt;a href=&quot;https://vercel.com/products/previews&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vercel.com/products/previews&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/byoOD1/dJMb8XkhrIl/6PpMxOQML0OH8UKU2CBb01/img.png?width=2400&amp;amp;height=1256&amp;amp;face=0_0_2400_1256,https://scrap.kakaocdn.net/dn/MYQRh/dJMb8UHRdWp/rdP42ZhLL24FYyDBp9LwnK/img.png?width=2400&amp;amp;height=1256&amp;amp;face=0_0_2400_1256');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Vercel's toolkit for fueling iteration. &amp;ndash; Vercel&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vercel's DX Platform gives your team everything to develop, preview, and ship the best web experiences to the world.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vercel.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;GitHub, GitLab, BitBucket에 코드를 푸시하면 Vercel이 자동으로 빌드한다.&lt;/li&gt;
&lt;li&gt;브랜치별로 Preview Deployment를 생성하여 배포 전에 테스트할 수 있다.&lt;/li&gt;
&lt;li&gt;main 혹은 production 브랜치로 푸시하면 자동으로 프로덕션 배포가 진행된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Next.js 프로젝트 Vercel에 배포하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 Vercel에 배포할 Next.js 프로젝트와 Git이 있어야 하고 Vercel 계정이 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// [Next.js 프로젝트 생성 추후 추가 예정]&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Vercel 배포 과정&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Next.js 프로젝트 생성&lt;/li&gt;
&lt;li&gt;Vercel 계정 생성&lt;/li&gt;
&lt;li&gt;Github에 코드 올리기&lt;/li&gt;
&lt;li&gt;Vercel에 프로젝트 연결&lt;/li&gt;
&lt;li&gt;환경 변수 설정&lt;/li&gt;
&lt;li&gt;배포&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Github 리포지토리를 Vercel과 연결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃허브에서 오른쪽 상단 프로필에서 Settings 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbapU7/dJMcaju9SKl/tUjvjHdVwprU2O00Cdvxg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbapU7/dJMcaju9SKl/tUjvjHdVwprU2O00Cdvxg1/img.png&quot; data-alt=&quot;깃허브 Settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbapU7/dJMcaju9SKl/tUjvjHdVwprU2O00Cdvxg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbapU7%2FdJMcaju9SKl%2FtUjvjHdVwprU2O00Cdvxg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;309&quot; height=&quot;661&quot; data-origin-width=&quot;309&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깃허브 Settings&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/settings/profile&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/settings/profile&lt;/a&gt; 화면에 왼쪽 메뉴에서 applications 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG1gX0/dJMcagSLJVE/mNzY4VdH7kRFkMl4J1Vbb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG1gX0/dJMcagSLJVE/mNzY4VdH7kRFkMl4J1Vbb0/img.png&quot; data-alt=&quot;application 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG1gX0/dJMcagSLJVE/mNzY4VdH7kRFkMl4J1Vbb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG1gX0%2FdJMcagSLJVE%2FmNzY4VdH7kRFkMl4J1Vbb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;252&quot; height=&quot;643&quot; data-origin-width=&quot;252&quot; data-origin-height=&quot;643&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;application 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Applications에서 Vercel을 찾아 설치한 후 Vercel의 configure 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cggRoL/dJMcabw8bG2/eYG7fy1KqZ7fdO3S7z7Bfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cggRoL/dJMcabw8bG2/eYG7fy1KqZ7fdO3S7z7Bfk/img.png&quot; data-alt=&quot;Configure 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cggRoL/dJMcabw8bG2/eYG7fy1KqZ7fdO3S7z7Bfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcggRoL%2FdJMcabw8bG2%2FeYG7fy1KqZ7fdO3S7z7Bfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;291&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Configure 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;permission은 리퍼지터리에 읽고 쓸 수 있는 것까지 알려준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br6R7y/dJMcabYd75u/04yOunXKFWj0G2bGkmdne1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br6R7y/dJMcabYd75u/04yOunXKFWj0G2bGkmdne1/img.png&quot; data-alt=&quot;permission&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br6R7y/dJMcabYd75u/04yOunXKFWj0G2bGkmdne1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr6R7y%2FdJMcabYd75u%2F04yOunXKFWj0G2bGkmdne1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;198&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;permission&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크롤을 내리면 Repository access를 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZwF6x/dJMcabDVefp/0K2NLy0vTUycwP1T91hAP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZwF6x/dJMcabDVefp/0K2NLy0vTUycwP1T91hAP1/img.png&quot; data-alt=&quot;Repository access&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZwF6x/dJMcabDVefp/0K2NLy0vTUycwP1T91hAP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZwF6x%2FdJMcabDVefp%2F0K2NLy0vTUycwP1T91hAP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;424&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Repository access&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;All repositories : 모든 리포지터리에 vercel을 설치&lt;/li&gt;
&lt;li&gt;Only select repositories : 원하는 리포지터리에 vercel 설치&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 원하는 리퍼지터리만 원해 Only select repositories를 선택하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리포지터리 선택 후 Save 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;깃 리포지터리에서 Production Brach : 현재 설정된 배포 브랜치 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel에 로그인 후 오른쪽 상단에 Dashboard 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/edDS8k/dJMcaiiJhmk/tpfj1MQVbLZz971pkbxVLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/edDS8k/dJMcaiiJhmk/tpfj1MQVbLZz971pkbxVLk/img.png&quot; data-alt=&quot;Vercel 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/edDS8k/dJMcaiiJhmk/tpfj1MQVbLZz971pkbxVLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FedDS8k%2FdJMcaiiJhmk%2Ftpfj1MQVbLZz971pkbxVLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1423&quot; height=&quot;916&quot; data-origin-width=&quot;1423&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Vercel 홈페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add New Project 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpjcWh/dJMcagZvpPb/s8BQRE4qYXAhDaKrT5ttf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpjcWh/dJMcagZvpPb/s8BQRE4qYXAhDaKrT5ttf1/img.png&quot; data-alt=&quot;Add New &amp;amp;gt; Project 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpjcWh/dJMcagZvpPb/s8BQRE4qYXAhDaKrT5ttf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpjcWh%2FdJMcagZvpPb%2Fs8BQRE4qYXAhDaKrT5ttf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;421&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Add New &amp;gt; Project 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Import git repository에 추가된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Import 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1025&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBRsq/dJMcadPcVmM/eKzyJjzKk2wSPfskS5weHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBRsq/dJMcadPcVmM/eKzyJjzKk2wSPfskS5weHk/img.png&quot; data-alt=&quot;Import 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBRsq/dJMcadPcVmM/eKzyJjzKk2wSPfskS5weHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBRsq%2FdJMcadPcVmM%2FeKzyJjzKk2wSPfskS5weHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1025&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1025&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Import 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel과 연결할 프로젝트 정보가 나타난다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTX67U/dJMcaiwfeX0/Qg5TUrgIWjpTYuI0wHTKb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTX67U/dJMcaiwfeX0/Qg5TUrgIWjpTYuI0wHTKb0/img.png&quot; data-alt=&quot;vercel과 연결할 프로젝트 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTX67U/dJMcaiwfeX0/Qg5TUrgIWjpTYuI0wHTKb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTX67U%2FdJMcaiwfeX0%2FQg5TUrgIWjpTYuI0wHTKb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1106&quot; height=&quot;1125&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vercel과 연결할 프로젝트 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Root Directory&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;루트 디렉터리&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Build and output settings&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;빌드할 때 사용 할 명령어다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;기본적인 것을 사용하려면 그대로 두면 된다. &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;만약 내가 정한 명령어를 사용하려면 명령어를 작성하면 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;Environment Variables&lt;/span&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;환경변수 설정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;.env 파일에 api키라던지 환경 변수라던지 다양한 키들을 설저할 수 있는데 그 키와 value를 설정한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 거 다 설정 후 Deploy 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수 설정은 밑에서 다루도록 하겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;building &amp;gt; running check &amp;gt; assign domains&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;building : 빌드를 먼저 한다.&lt;/li&gt;
&lt;li&gt;running check : 코드에 문제가 없는지 다양한 체크를 한다.&lt;/li&gt;
&lt;li&gt;assign domains : 도메인 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배포 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Continue to DashBoard 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eMJG0d/dJMcafGksKV/Xk7cPU9Edk3YSIWFFmVe71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eMJG0d/dJMcafGksKV/Xk7cPU9Edk3YSIWFFmVe71/img.png&quot; data-alt=&quot;Continue to Dashboard 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eMJG0d/dJMcafGksKV/Xk7cPU9Edk3YSIWFFmVe71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeMJG0d%2FdJMcafGksKV%2FXk7cPU9Edk3YSIWFFmVe71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;1125&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Continue to Dashboard 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Continue to Dashboard 클릭한 후 화면&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;Deployment : 배포된 url&lt;/li&gt;
&lt;li&gt;Domain&lt;/li&gt;
&lt;li&gt;Status : 현재 상태&lt;/li&gt;
&lt;li&gt;Created : 언제 만들어졌는지&lt;/li&gt;
&lt;li&gt;Source 브랜치는 무엇인지에 대한 내용&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;929&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI1rir/dJMcaju9SWA/KcX6IQmkQhjpz69yS65CpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI1rir/dJMcaju9SWA/KcX6IQmkQhjpz69yS65CpK/img.png&quot; data-alt=&quot;배포 상태를 확인할 수 있는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI1rir/dJMcaju9SWA/KcX6IQmkQhjpz69yS65CpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI1rir%2FdJMcaju9SWA%2FKcX6IQmkQhjpz69yS65CpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;929&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;929&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배포 상태를 확인할 수 있는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[환경변수 설정]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.env 파일에 api키라던지 환경변수라던지 다양한 키들을 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 키와 value를 설정할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 174px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 174px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 174px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buqZh6/dJMcaaruh4s/qeYPIyBiyWpK2kpee52Kp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buqZh6/dJMcaaruh4s/qeYPIyBiyWpK2kpee52Kp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buqZh6/dJMcaaruh4s/qeYPIyBiyWpK2kpee52Kp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuqZh6%2FdJMcaaruh4s%2FqeYPIyBiyWpK2kpee52Kp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;174&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;174&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;환경변수&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 174px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLWYuj/dJMcafsLPvH/5OucjG9dCxzeh8EbJMZio0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLWYuj/dJMcafsLPvH/5OucjG9dCxzeh8EbJMZio0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLWYuj/dJMcafsLPvH/5OucjG9dCxzeh8EbJMZio0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLWYuj%2FdJMcafsLPvH%2F5OucjG9dCxzeh8EbJMZio0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;212&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;.env 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;878&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlJWl8/dJMcafsLPv2/Hv6KBYrUaG1RNKKcJWrmgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlJWl8/dJMcafsLPv2/Hv6KBYrUaG1RNKKcJWrmgk/img.png&quot; data-alt=&quot;Vercel에서 환경변수 설정하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlJWl8/dJMcafsLPv2/Hv6KBYrUaG1RNKKcJWrmgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlJWl8%2FdJMcafsLPv2%2FHv6KBYrUaG1RNKKcJWrmgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;878&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;878&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Vercel에서 환경변수 설정하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CDlRU/dJMcaffh1nH/DZHLysR4qZcqsxEUjPaZt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CDlRU/dJMcaffh1nH/DZHLysR4qZcqsxEUjPaZt1/img.png&quot; data-alt=&quot;Vercel에서 환경변수 설정하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CDlRU/dJMcaffh1nH/DZHLysR4qZcqsxEUjPaZt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCDlRU%2FdJMcaffh1nH%2FDZHLysR4qZcqsxEUjPaZt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;932&quot; height=&quot;470&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;470&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Vercel에서 환경변수 설정하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;환경변수 설정은 다음과 같이 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bncmuZ/dJMcagSLKcN/R3MUJ8cTqkKsVEKoIsewbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bncmuZ/dJMcagSLKcN/R3MUJ8cTqkKsVEKoIsewbK/img.png&quot; data-alt=&quot;환경변수 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bncmuZ/dJMcagSLKcN/R3MUJ8cTqkKsVEKoIsewbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbncmuZ%2FdJMcagSLKcN%2FR3MUJ8cTqkKsVEKoIsewbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;1125&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경변수 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[커밋부터 배포까지 : 자동 빌드 확인하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 변경사항이 발생하면 먼저 Github에 커밋 후 푸시를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 A가 feat/devA 브랜치에서 사용자 프로필 수정하기 기능을 만들었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;1013&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GCPiU/dJMcaaZiAEE/a1IWSBzbqQ3lNkKJK4HRq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GCPiU/dJMcaaZiAEE/a1IWSBzbqQ3lNkKJK4HRq0/img.png&quot; data-alt=&quot;개발자 A 커밋 푸시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GCPiU/dJMcaaZiAEE/a1IWSBzbqQ3lNkKJK4HRq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGCPiU%2FdJMcaaZiAEE%2Fa1IWSBzbqQ3lNkKJK4HRq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;1013&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;1013&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개발자 A 커밋 푸시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel은 Github 리포지토리와 연동되어 있기 때문에 푸시가 감지되면 자동으로 빌드가 시작된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빌드가 완료되면 브라우저에서 배포된 애플리케이션을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Domains&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;첫 번째 URL
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;공통적으로 사용하는 메인 URL&lt;/li&gt;
&lt;li&gt;실제 사용자가 보는 URL&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;두 번째 URL&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;브랜치 별로 만들어진 url이다.&lt;/li&gt;
&lt;li&gt;main 브랜치에 커밋이 발생하면&amp;nbsp;최신 것들이 반영이 된 현재 main 브랜치에 코드 내용을 반영하고 있는 웹앱 url&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;세 번째 URL
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;방금 커밋 한 커밋의 변경사항을 반영하고 있는 url&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mRUKI/dJMcah5du4m/Kj6HsRV3o8VBChs41C1KbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mRUKI/dJMcah5du4m/Kj6HsRV3o8VBChs41C1KbK/img.png&quot; data-alt=&quot;Domains&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mRUKI/dJMcah5du4m/Kj6HsRV3o8VBChs41C1KbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmRUKI%2FdJMcah5du4m%2FKj6HsRV3o8VBChs41C1KbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1418&quot; height=&quot;599&quot; data-origin-width=&quot;1418&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Domains&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;푸시를 한 후 깃허브에서 빌드/테스트 상태를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;푸시를 한 직후에는 브라운색 표시가 된 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭해서 확인해 보면 vercel에서 자동으로 감지해서 빌드를 시작하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oLEx0/dJMcaaZiAHm/Ug9X9Wg5A1f79IGKmHtq91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oLEx0/dJMcaaZiAHm/Ug9X9Wg5A1f79IGKmHtq91/img.png&quot; data-alt=&quot;깃허브에서 빌드 상태 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oLEx0/dJMcaaZiAHm/Ug9X9Wg5A1f79IGKmHtq91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoLEx0%2FdJMcaaZiAHm%2FUg9X9Wg5A1f79IGKmHtq91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;120&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;깃허브에서 빌드 상태 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;빌드 및 배포 상태 확인 표시&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초록색 체크(✅)&amp;nbsp;&amp;rarr; 성공(Successful) : Github Actions나 연결된 CI/CD(예:Vercel)에서 빌드와 테스트가 정상적으로 통과됐음을 의미한다.&lt;/li&gt;
&lt;li&gt;빨간색 X(❌) &amp;rarr; 실패(Failed)&lt;/li&gt;
&lt;li&gt;노란색 점( ) &amp;rarr; 진행 중(In progress)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 A가 feat/devA 브랜치를 develop 브랜치에 pull request와 merge를 진행하면 vercel의 Domains에서 Preview URL(두 번째 URL)을 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;894&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x2PEL/dJMcafsLPGf/3YNz6Wk7ZmkvJ3sTREY1wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x2PEL/dJMcafsLPGf/3YNz6Wk7ZmkvJ3sTREY1wk/img.png&quot; data-alt=&quot;develop 브랜치로 pr mrege&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x2PEL/dJMcafsLPGf/3YNz6Wk7ZmkvJ3sTREY1wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx2PEL%2FdJMcafsLPGf%2F3YNz6Wk7ZmkvJ3sTREY1wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;894&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;894&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;develop 브랜치로 pr mrege&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;주의할 점&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단, Vercel 프로젝트 설정에서 Production Branch가 main이라면 develop은 Production URL에 반영되지 않고 Preview URL로만 확인됩니다.&lt;/li&gt;
&lt;li&gt;만약 develop을 Production Branch로 설정해 둔 경우라면 머지 시 첫 번째 URL(Production domain)에 반영됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Vercel을 사용하면 CI/CD를 경험할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋을 하자마자 터미널에서 따로 빌드를 하고 배포하는 과정을 복잡하게 거치는 것이 아닌 코드를 올려둔 깃허브를 Vercel을 연동해 두면 Vercel이 우리 프로젝트를 감지하고 있으면서 새로운 커밋이 발생하는 순간 커밋&amp;nbsp;별로 url을 만들어주고 브랜치 별로 url을 만들어 즉각적으로 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/271&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/271&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779349861194&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[IT 노트] CI/CD란 무엇인가? 개념부터 파이프라인 이해하기&quot; data-og-description=&quot;목차 CI/CD란 무엇인가?CI/CD 파이프라인 구조환경별 배포 전략 [CI/CD란?]CI/CD는 애플리케이션 개발에서 배포까지의 모든 단계를 자동화를 통해서 조금 더 효율적이고 빠르게 사용자에게 배포할 수 &quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/271&quot; data-og-url=&quot;https://devyihyun.tistory.com/271&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/IvuOx/dJMb8VNBoqP/We9DltykI7Py0WuLPDBbUK/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/Q0HWr/dJMb9frLdZJ/pTnNuqlnhmcMzL5wkUbGG1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/nJQ3E/dJMb8SXDF5C/zBYDGPO131N3WHtsJHzzX0/img.png?width=3777&amp;amp;height=2859&amp;amp;face=0_0_3777_2859&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/271&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/271&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/IvuOx/dJMb8VNBoqP/We9DltykI7Py0WuLPDBbUK/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/Q0HWr/dJMb9frLdZJ/pTnNuqlnhmcMzL5wkUbGG1/img.png?width=800&amp;amp;height=477&amp;amp;face=0_0_800_477,https://scrap.kakaocdn.net/dn/nJQ3E/dJMb8SXDF5C/zBYDGPO131N3WHtsJHzzX0/img.png?width=3777&amp;amp;height=2859&amp;amp;face=0_0_3777_2859');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[IT 노트] CI/CD란 무엇인가? 개념부터 파이프라인 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차 CI/CD란 무엇인가?CI/CD 파이프라인 구조환경별 배포 전략 [CI/CD란?]CI/CD는 애플리케이션 개발에서 배포까지의 모든 단계를 자동화를 통해서 조금 더 효율적이고 빠르게 사용자에게 배포할 수&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vercel.com/geist/brands#vercel&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://vercel.com/geist/brands#vercel&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776693593625&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Geist&quot; data-og-description=&quot;Vercel's design system called Geist. Made for building consistent and delightful web experiences.&quot; data-og-host=&quot;vercel.com&quot; data-og-source-url=&quot;https://vercel.com/geist/brands#vercel&quot; data-og-url=&quot;https://vercel.com/geist/brands#vercel&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bXMwOw/dJMb9jgzna4/5X3rsym5HKjvVy4ZBdL6aK/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/cxBK5t/dJMb9jgzna3/N9CIP6YwuPw4rgbOJb6d50/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://vercel.com/geist/brands#vercel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vercel.com/geist/brands#vercel&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bXMwOw/dJMb9jgzna4/5X3rsym5HKjvVy4ZBdL6aK/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/cxBK5t/dJMb9jgzna3/N9CIP6YwuPw4rgbOJb6d50/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Geist&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vercel's design system called Geist. Made for building consistent and delightful web experiences.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vercel.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Next.js</category>
      <category>CI/CD</category>
      <category>Github</category>
      <category>next.js</category>
      <category>Vercel</category>
      <category>깃허브</category>
      <category>배포</category>
      <category>빌드</category>
      <category>자동배포</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/272</guid>
      <comments>https://devyihyun.tistory.com/272#entry272comment</comments>
      <pubDate>Fri, 15 May 2026 18:10:06 +0900</pubDate>
    </item>
    <item>
      <title>[IT 노트] CI/CD란 무엇인가? 개념부터 파이프라인 이해하기</title>
      <link>https://devyihyun.tistory.com/271</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVzu18/dJMcahREjuq/PEzksJP9ewuKkZB2mtqCLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVzu18/dJMcahREjuq/PEzksJP9ewuKkZB2mtqCLK/img.png&quot; data-alt=&quot;CI/CD란?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVzu18/dJMcahREjuq/PEzksJP9ewuKkZB2mtqCLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVzu18%2FdJMcahREjuq%2FPEzksJP9ewuKkZB2mtqCLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;537&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CI/CD란?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD란 무엇인가?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD 파이프라인 구조&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;환경별 배포 전략&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[CI/CD란?]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WcN9h/dJMcacQlV5n/w3NqMCKN7BQabnck4KMw10/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WcN9h/dJMcacQlV5n/w3NqMCKN7BQabnck4KMw10/img.jpg&quot; data-alt=&quot;CI/CD&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WcN9h/dJMcacQlV5n/w3NqMCKN7BQabnck4KMw10/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWcN9h%2FdJMcacQlV5n%2Fw3NqMCKN7BQabnck4KMw10%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;500&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CI/CD&lt;/figcaption&gt;
&lt;/figure&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;기업에서는 시장과 고객의 요구를 빠르게 분석하고 반응해야 하기 때문에 제품을 출시, 업데이트할 것인지가 가장 큰 과제이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;CI(Continuous Integration)&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적인 통합&lt;/li&gt;
&lt;li&gt;개발자가 작업한 코드를 저장소에 Merge 하고 자동으로 빌드 및 테스트를 실행해 코드 품질을 보장하는 과정이다.&lt;/li&gt;
&lt;li&gt;기본 과정
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;개발자가 코드 커밋&amp;nbsp;&amp;rarr; 버전 관리 시스템(Git 등)&lt;/li&gt;
&lt;li&gt;자동 빌드(Build) &amp;rarr; 코드가 정상적으로 합쳐지는지 확인&lt;/li&gt;
&lt;li&gt;자동 테스트 (Test) &amp;rarr; 기존 기능이 깨지지 않는지 검증&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;CI를 통해 코드가 전체 프로젝트에 문제를 일으키는지 여부를 빠르게 알 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;CD(Continuous Deployment)&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지속적인 배포&lt;/li&gt;
&lt;li&gt;통합된 코드가 자동으로 배포 환경까지 전달되는 과정&lt;/li&gt;
&lt;li&gt;코드가 저장소에 Merge 되면 별도의 수동 배포 과정 없이 자동으로 배포되는 것이 핵심&lt;/li&gt;
&lt;li&gt;Continuous Delivery
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;배포 준비 상태까지 자동화&lt;/li&gt;
&lt;li&gt;사람이 승인하면 배포 진행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Continuous Deployment
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;승인 없이 자동으로 운영 환경까지 배포&lt;/li&gt;
&lt;li&gt;빠른 피드백과 릴리즈 속도 장점&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Delivery = 배포 준비, Deployment = 배포 완료&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;CI/CD 전체 흐름&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 CI/CD 단계다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdjKWr/dJMcaipvQs3/17srRfZaSFF0lwqgG0Lhqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdjKWr/dJMcaipvQs3/17srRfZaSFF0lwqgG0Lhqk/img.png&quot; data-alt=&quot;CI/CD 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdjKWr/dJMcaipvQs3/17srRfZaSFF0lwqgG0Lhqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdjKWr%2FdJMcaipvQs3%2F17srRfZaSFF0lwqgG0Lhqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;386&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CI/CD 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드 커밋 푸시 (Commit / Push)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;개발자가 새로운 기능이나 수정 사항을 저장소에 올린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;빌드 (Build)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;소스 코드를 실행 가능한 애플리케이션 형태로 변환하는 과정이다.&lt;/li&gt;
&lt;li&gt;코드가 정상적으로 컴파일되고 패키징 되는지를 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;테스트 (Test)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자동화된 테스트를 통해 코드가 정상 동작하는지 확인한다.&lt;/li&gt;
&lt;li&gt;이 단계에서 문제가 발생하면 배포 전에 개발자에게 즉시 피드백이 전달된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;통합 (Merge)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;검증된 코드가 메인 브랜치에 합쳐진다.&lt;/li&gt;
&lt;li&gt;여러 명의 개발자가 동시에 작업해도 코드 품질을 일정하게 유지할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배포 (Deploy)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;최종적으로 운영환경에 반영되어 사용자들이 새로운 기능을 이용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정까지 자동화되면 새로운 기능을 사용자에게 빠르게 제공할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;CI/CD가 필요한 이유&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;자동화된 품질 보장 : 빌드와 테스트가 자동으로 실행되어 코드 오류를 조기에 발견할 수 있다.&lt;/li&gt;
&lt;li&gt;빠른 배포 주기 : 코드가 Merge 되면 바로 배포되어 개발 - 테스트 - 운영 사이클이 단축된다.&lt;/li&gt;
&lt;li&gt;안정성 확보 : 브랜치 전략과 결합해 Staging/Production 환경을 분리할 수 있어 안정적인 운영이 가능하다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;CI/CD 장단점&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠른 피드백 : 버그를 초기에 발견&lt;/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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[CI/CD 파이프라인 구조]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD의 구체적인 파이프라인은 단순히 빌드와 배포로 끝나지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 아래와 같은 과정을 거친다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3777&quot; data-origin-height=&quot;2859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KOpI7/dJMcagL0QOr/4JCZ4s7kM7LLr830KJO8R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KOpI7/dJMcagL0QOr/4JCZ4s7kM7LLr830KJO8R1/img.png&quot; data-alt=&quot;출처 : https://blog.bytebytego.com/p/a-crash-course-in-cicd&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KOpI7/dJMcagL0QOr/4JCZ4s7kM7LLr830KJO8R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKOpI7%2FdJMcagL0QOr%2F4JCZ4s7kM7LLr830KJO8R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3777&quot; height=&quot;2859&quot; data-origin-width=&quot;3777&quot; data-origin-height=&quot;2859&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://blog.bytebytego.com/p/a-crash-course-in-cicd&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;계획(plan)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발해야 할 기능이나 수정사항을 정의&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;코드(code)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 기능 개발과 버전 관리가 이루어지는 단계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;빌드(build)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소스 코드를 실행 가능한 애플리케이션으로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;테스트(test)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자동화된 테스트를 통해 코드의 품질을 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;릴리즈(release)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배포 가능한 형태로 패키징하고 승인 프로세스를 거친다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;배포(deploy)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;준비된 애플리케이션을 실제 환에 배포&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영(operate)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스가 정상적으로 동작하는지 운영 단계에서 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모니터링(monitor)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서비스 상태를 지속적으로 관찰하고, 장애나 성능 문제를 빠르게 파악&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[환경별 배포 전략]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CI/CD에서 중요한 포인트는 개발 환경별로 배포 전략을 나누는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크게 3가지 환경(브랜치)으로 나눈다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;main 브랜치&lt;/li&gt;
&lt;li&gt;develop 브랜치&lt;/li&gt;
&lt;li&gt;feat 브랜치&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNZYx/dJMcahD6Jkt/gRLGYLAgGDEvRp75pknZSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNZYx/dJMcahD6Jkt/gRLGYLAgGDEvRp75pknZSK/img.png&quot; data-alt=&quot;환경별 브랜치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNZYx/dJMcahD6Jkt/gRLGYLAgGDEvRp75pknZSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNZYx%2FdJMcahD6Jkt%2FgRLGYLAgGDEvRp75pknZSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;748&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;환경별 브랜치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. feat 브랜치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 기능이나 버그 수정 작업을 하는 개발 브랜치다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 버그를 수정한다면 브랜치는 fix/devA 형식이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNF2iF/dJMcadIsb8p/H7l23pDKkz15vivbo7Twt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNF2iF/dJMcadIsb8p/H7l23pDKkz15vivbo7Twt1/img.png&quot; data-alt=&quot;feat 브랜치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNF2iF/dJMcadIsb8p/H7l23pDKkz15vivbo7Twt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNF2iF%2FdJMcadIsb8p%2FH7l23pDKkz15vivbo7Twt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;748&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;feat 브랜치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. develop 브랜치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;feat 브랜치에서 코드를 push 하여 모아두는 브랜치다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱을 출시하기 전에 테스트를 할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WwK8E/dJMcajaP9OJ/h9vdHSY6Hyyib54Pmzyjj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WwK8E/dJMcajaP9OJ/h9vdHSY6Hyyib54Pmzyjj0/img.png&quot; data-alt=&quot;develop 브랜치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WwK8E/dJMcajaP9OJ/h9vdHSY6Hyyib54Pmzyjj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWwK8E%2FdJMcajaP9OJ%2Fh9vdHSY6Hyyib54Pmzyjj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;748&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;develop 브랜치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. main 브랜치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Production 환경으로 실제 사용자가 서비스를 이용하는 브랜치다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 안정적인 코드만 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/moUea/dJMcajhBwoT/cAKSBQKGk4VJOAJUMX3ywk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/moUea/dJMcajhBwoT/cAKSBQKGk4VJOAJUMX3ywk/img.png&quot; data-alt=&quot;main 브랜치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/moUea/dJMcajhBwoT/cAKSBQKGk4VJOAJUMX3ywk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmoUea%2FdJMcajhBwoT%2FcAKSBQKGk4VJOAJUMX3ywk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;748&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;main 브랜치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 CI/CD 개념을 이해했다면 실제로 자동 배포가 어떻게 이루어지는지 알아 보록 합시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js와 Vercel을 이용해 코드 push 자동 배포 방법 보러가기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://testrigor.com/blog/what-is-cicd/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://testrigor.com/blog/what-is-cicd/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776672786673&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;What Is CI/CD? Expedite The Software Development Life Cycle - testRigor&quot; data-og-description=&quot;CI/CD is a DevOps best practice that consists of continuous integration, delivery, and deployment. It expedites the software development life cycle. Read more!&quot; data-og-host=&quot;testrigor.com&quot; data-og-source-url=&quot;https://testrigor.com/blog/what-is-cicd/&quot; data-og-url=&quot;https://testrigor.com/blog/what-is-cicd/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/KLOxV/dJMb86O3NEC/UCCaAw1bW9hCgRNmc1BS50/img.jpg?width=2560&amp;amp;height=1920&amp;amp;face=0_0_2560_1920,https://scrap.kakaocdn.net/dn/uhWrO/dJMb83SkUQB/PAcqd3XNejVkm1IXjKyjK1/img.jpg?width=857&amp;amp;height=474&amp;amp;face=0_0_857_474,https://scrap.kakaocdn.net/dn/b8AnR7/dJMb82eO2ZL/pMUpEKf7YYYzwWNbjX6c00/img.jpg?width=780&amp;amp;height=253&amp;amp;face=0_0_780_253&quot;&gt;&lt;a href=&quot;https://testrigor.com/blog/what-is-cicd/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://testrigor.com/blog/what-is-cicd/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/KLOxV/dJMb86O3NEC/UCCaAw1bW9hCgRNmc1BS50/img.jpg?width=2560&amp;amp;height=1920&amp;amp;face=0_0_2560_1920,https://scrap.kakaocdn.net/dn/uhWrO/dJMb83SkUQB/PAcqd3XNejVkm1IXjKyjK1/img.jpg?width=857&amp;amp;height=474&amp;amp;face=0_0_857_474,https://scrap.kakaocdn.net/dn/b8AnR7/dJMb82eO2ZL/pMUpEKf7YYYzwWNbjX6c00/img.jpg?width=780&amp;amp;height=253&amp;amp;face=0_0_780_253');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What Is CI/CD? Expedite The Software Development Life Cycle - testRigor&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;CI/CD is a DevOps best practice that consists of continuous integration, delivery, and deployment. It expedites the software development life cycle. Read more!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;testrigor.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.bytebytego.com/p/a-crash-course-in-cicd&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.bytebytego.com/p/a-crash-course-in-cicd&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776672793698&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;A Crash Course in CI/CD&quot; data-og-description=&quot;Introduction&quot; data-og-host=&quot;blog.bytebytego.com&quot; data-og-source-url=&quot;https://blog.bytebytego.com/p/a-crash-course-in-cicd&quot; data-og-url=&quot;https://blog.bytebytego.com/p/a-crash-course-in-cicd&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/lrXmn/dJMb8YXNzLF/ambXgDe7qLg8KDNOkwnOS1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/biiL41/dJMb8RRTUhj/NxbjrJKOyMvN5HhJsLrcU1/img.jpg?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/Vo2mP/dJMb8XR7Jir/yQiIRYzMlOSOx2ysSVK1J1/img.jpg?width=1456&amp;amp;height=1433&amp;amp;face=0_0_1456_1433&quot;&gt;&lt;a href=&quot;https://blog.bytebytego.com/p/a-crash-course-in-cicd&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.bytebytego.com/p/a-crash-course-in-cicd&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/lrXmn/dJMb8YXNzLF/ambXgDe7qLg8KDNOkwnOS1/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675,https://scrap.kakaocdn.net/dn/biiL41/dJMb8RRTUhj/NxbjrJKOyMvN5HhJsLrcU1/img.jpg?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/Vo2mP/dJMb8XR7Jir/yQiIRYzMlOSOx2ysSVK1J1/img.jpg?width=1456&amp;amp;height=1433&amp;amp;face=0_0_1456_1433');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;A Crash Course in CI/CD&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Introduction&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.bytebytego.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.blackduck.com/glossary/what-is-cicd.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.blackduck.com/glossary/what-is-cicd.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776672807897&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;What Is CI/CD and How Does It Work? | Black Duck&quot; data-og-description=&quot;Continuous integration (CI) is practice that involves developers making small changes and checks to their code. Due to the scale of requirements and the number of steps involved, this process is automated to ensure that teams can build, test, and package t&quot; data-og-host=&quot;www.blackduck.com&quot; data-og-source-url=&quot;https://www.blackduck.com/glossary/what-is-cicd.html&quot; data-og-url=&quot;https://www.blackduck.com/glossary/what-is-cicd.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.blackduck.com/glossary/what-is-cicd.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.blackduck.com/glossary/what-is-cicd.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;What Is CI/CD and How Does It Work? | Black Duck&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Continuous integration (CI) is practice that involves developers making small changes and checks to their code. Due to the scale of requirements and the number of steps involved, this process is automated to ensure that teams can build, test, and package t&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.blackduck.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 노트</category>
      <category>CD</category>
      <category>CI</category>
      <category>cid/cd</category>
      <category>Git Branch</category>
      <category>개발자</category>
      <category>배포파이프라인</category>
      <category>브랜치배포전략</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/271</guid>
      <comments>https://devyihyun.tistory.com/271#entry271comment</comments>
      <pubDate>Wed, 13 May 2026 18:10:55 +0900</pubDate>
    </item>
    <item>
      <title>[Next.js] Next.js + Firebase(Firestore) 연동하기 + API 구조 설계</title>
      <link>https://devyihyun.tistory.com/270</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqi26u/dJMcadoaenA/Rb3nnpK0olOmidX4FAZnD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqi26u/dJMcadoaenA/Rb3nnpK0olOmidX4FAZnD1/img.png&quot; data-alt=&quot;Next.js와 Firebase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqi26u/dJMcadoaenA/Rb3nnpK0olOmidX4FAZnD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqi26u%2FdJMcadoaenA%2FRb3nnpK0olOmidX4FAZnD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;811&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Next.js와 Firebase&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Firebase란?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Firebase 프로젝트 생성하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Firestore 데이터 생성하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Next.js에서 Firebase 연동하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Firestore 데이터 가져오기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;API Route 구성하기(/api/board)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;클라이언트에서 데이터 호출하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전체 구조 흐름 정리&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Firebase란?]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kBwUR/dJMcaiQwWS0/WWMhulkXsOPhX2SbO2VSK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kBwUR/dJMcaiQwWS0/WWMhulkXsOPhX2SbO2VSK1/img.png&quot; data-alt=&quot;Firebase&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kBwUR/dJMcaiQwWS0/WWMhulkXsOPhX2SbO2VSK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkBwUR%2FdJMcaiQwWS0%2FWWMhulkXsOPhX2SbO2VSK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;205&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Firebase&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase는 구글이 운영하는 백엔드 서비스로 애플리케이션에서 공통적으로 사용하는 백엔드 기능을 모아놓은 플랫폼이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹, 앱 프로토타입이나 MVP 제품을 만들어야 하는 상황이라면 좋은 서비스다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에는 Authentication이라는 서비스가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 인증에 대한 서비스로 로그인, 회원가입, 비밀번호 찾기와 같은 인증과 관련된 서비스를 간단하게 개발할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 데이터를 저장하거나 조회할 수 있는 Firestore나 Realtime database 서비스가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 서비스들은 NoSQL 기반으로 사용자의 데이터를 빠르게 저장할 수 있도록 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase의 큰 핵심은 빠르게 애플리케이션을 만들면서 출시하고 모니터링이 가능하다.&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;스타트업에서는 핵심 비즈니스 로직을 빨리 개발해서 프로토타입을 출시해야 하는데 이런 공통적인 기능만 만들다가 끝나버릴 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이럴 때 파이어베이스 Authentication을 활용하면 간단히 해결할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 Firebase를 접했을 때는 RDBMS와 같은 형태라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제로는 NoSQL 문서 중심 구조로 데이터를 조인해서 조회하는 방식이 지원되지 않아 많이 당황스러웠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 UI/UX 흐름에 맞춰 데이터를 설계하는 데이터 모델링 과정이 매우 중요하다는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Firebase 프로젝트 생성하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에 로그인 후 Go to Console을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1013&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blRY9X/dJMcahxngcb/UWbrxtkqaKQfcdo3ZX2SS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blRY9X/dJMcahxngcb/UWbrxtkqaKQfcdo3ZX2SS1/img.png&quot; data-alt=&quot;로그인 후 Go to Console 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blRY9X/dJMcahxngcb/UWbrxtkqaKQfcdo3ZX2SS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblRY9X%2FdJMcahxngcb%2FUWbrxtkqaKQfcdo3ZX2SS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1013&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1013&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 후 Go to Console 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase 프로젝트 시작하기 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1019&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF0mx3/dJMcaipvy9t/I48Mm2vCejK3r1wBvIwMCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF0mx3/dJMcaipvy9t/I48Mm2vCejK3r1wBvIwMCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF0mx3/dJMcaipvy9t/I48Mm2vCejK3r1wBvIwMCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF0mx3%2FdJMcaipvy9t%2FI48Mm2vCejK3r1wBvIwMCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1019&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1019&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 이름 작성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;943&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/co0plQ/dJMcacbKrpm/InB1aoAJNtKcGKRIfjRLGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/co0plQ/dJMcacbKrpm/InB1aoAJNtKcGKRIfjRLGK/img.png&quot; data-alt=&quot;프로젝트 이름 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/co0plQ/dJMcacbKrpm/InB1aoAJNtKcGKRIfjRLGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fco0plQ%2FdJMcacbKrpm%2FInB1aoAJNtKcGKRIfjRLGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;943&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;943&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 이름 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 개발자 프로그램에 가입하기는 off 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1COx/dJMcaayfAbp/A4FjIlt4UuRGITwXYsWWKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1COx/dJMcaayfAbp/A4FjIlt4UuRGITwXYsWWKK/img.png&quot; data-alt=&quot;개발자 프로그램 가입하기 off&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1COx/dJMcaayfAbp/A4FjIlt4UuRGITwXYsWWKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1COx%2FdJMcaayfAbp%2FA4FjIlt4UuRGITwXYsWWKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;937&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;개발자 프로그램 가입하기 off&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Gemini 사용 설정 화면이 나옵니다. 저는 사용하지 않았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9n1hK/dJMcabw7K4t/Ib5nweWZGST7yEh4o0v9Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9n1hK/dJMcabw7K4t/Ib5nweWZGST7yEh4o0v9Pk/img.png&quot; data-alt=&quot;gemini 사용 설정 off&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9n1hK/dJMcabw7K4t/Ib5nweWZGST7yEh4o0v9Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9n1hK%2FdJMcabw7K4t%2FIb5nweWZGST7yEh4o0v9Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1893&quot; height=&quot;939&quot; data-origin-width=&quot;1893&quot; data-origin-height=&quot;939&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;gemini 사용 설정 off&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Google 애널리틱스를 설정하는 화면이 나옵니다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dGyiDQ/dJMcah5c4lW/6JcE6tnrll6slZoCJEvgIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dGyiDQ/dJMcah5c4lW/6JcE6tnrll6slZoCJEvgIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dGyiDQ/dJMcah5c4lW/6JcE6tnrll6slZoCJEvgIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdGyiDQ%2FdJMcah5c4lW%2F6JcE6tnrll6slZoCJEvgIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1907&quot; height=&quot;940&quot; data-origin-width=&quot;1907&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기다리기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;997&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwLw5J/dJMcabcOlxg/1YM8SatIxKuJZlEtCYZ7uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwLw5J/dJMcabcOlxg/1YM8SatIxKuJZlEtCYZ7uk/img.png&quot; data-alt=&quot;로딩 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwLw5J/dJMcabcOlxg/1YM8SatIxKuJZlEtCYZ7uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwLw5J%2FdJMcabcOlxg%2F1YM8SatIxKuJZlEtCYZ7uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;997&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;997&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로딩 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;938&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckmfxn/dJMcagSLju1/UWnkzMZarj3iriQYFAaka1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckmfxn/dJMcagSLju1/UWnkzMZarj3iriQYFAaka1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckmfxn/dJMcagSLju1/UWnkzMZarj3iriQYFAaka1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckmfxn%2FdJMcagSLju1%2FUWnkzMZarj3iriQYFAaka1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1649&quot; height=&quot;938&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;938&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 개요 &amp;gt; 설정 &amp;gt; 프로젝트 설정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCgaUP/dJMcaaE1Plk/oFuRHigJvqT3yZKM3TYD9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCgaUP/dJMcaaE1Plk/oFuRHigJvqT3yZKM3TYD9K/img.png&quot; data-alt=&quot;프로젝트 개요 &amp;amp;gt; 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCgaUP/dJMcaaE1Plk/oFuRHigJvqT3yZKM3TYD9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCgaUP%2FdJMcaaE1Plk%2FoFuRHigJvqT3yZKM3TYD9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1915&quot; height=&quot;1125&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 개요 &amp;gt; 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GSIgT/dJMcag6iduP/UztVkhSRgs74tkml6Ej3h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GSIgT/dJMcag6iduP/UztVkhSRgs74tkml6Ej3h0/img.png&quot; data-alt=&quot;프로젝트 설정 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GSIgT/dJMcag6iduP/UztVkhSRgs74tkml6Ej3h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGSIgT%2FdJMcag6iduP%2FUztVkhSRgs74tkml6Ej3h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;428&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 설정 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에 대한 정보가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHAW7/dJMcaiJK9CZ/tkRMBGWAmDfQWoU2EkgkW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHAW7/dJMcaiJK9CZ/tkRMBGWAmDfQWoU2EkgkW0/img.png&quot; data-alt=&quot;프로젝트 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHAW7/dJMcaiJK9CZ/tkRMBGWAmDfQWoU2EkgkW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHAW7%2FdJMcaiJK9CZ%2FtkRMBGWAmDfQWoU2EkgkW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1916&quot; height=&quot;1125&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 앱보다는 웹을 만들어보고 싶어 웹을 클릭했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CuMek/dJMcac3RvUM/KZvVKNX7sXzbC0MkN6IqCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CuMek/dJMcac3RvUM/KZvVKNX7sXzbC0MkN6IqCK/img.png&quot; data-alt=&quot;웹 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CuMek/dJMcac3RvUM/KZvVKNX7sXzbC0MkN6IqCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCuMek%2FdJMcac3RvUM%2FKZvVKNX7sXzbC0MkN6IqCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;277&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;277&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;웹 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 앱의 이름 입력 &amp;gt; 앱 등록 클릭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에서 호스팅을 원하면 체크하면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 호스팅을 Vercel에서 할 예정이기 때문에 설정하지 않았습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1653&quot; data-origin-height=&quot;932&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDhcPv/dJMcabRq0hn/dUQuBVEAvQyWzAJgkSK4xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDhcPv/dJMcabRq0hn/dUQuBVEAvQyWzAJgkSK4xk/img.png&quot; data-alt=&quot;프로젝트 앱 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDhcPv/dJMcabRq0hn/dUQuBVEAvQyWzAJgkSK4xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDhcPv%2FdJMcabRq0hn%2FdUQuBVEAvQyWzAJgkSK4xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1653&quot; height=&quot;932&quot; data-origin-width=&quot;1653&quot; data-origin-height=&quot;932&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 앱 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1641&quot; data-origin-height=&quot;937&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sJUpE/dJMcaayfBG0/YmphNMEHb8iPpsRE7YnY31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sJUpE/dJMcaayfBG0/YmphNMEHb8iPpsRE7YnY31/img.png&quot; data-alt=&quot;프로젝트 앱 등록&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sJUpE/dJMcaayfBG0/YmphNMEHb8iPpsRE7YnY31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsJUpE%2FdJMcaayfBG0%2FYmphNMEHb8iPpsRE7YnY31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1641&quot; height=&quot;937&quot; data-origin-width=&quot;1641&quot; data-origin-height=&quot;937&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 앱 등록&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1964&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VShoH/dJMcadIrTXt/B35J2WnCFyeNhDuhK5K0lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VShoH/dJMcadIrTXt/B35J2WnCFyeNhDuhK5K0lk/img.png&quot; data-alt=&quot;시크릿 키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VShoH/dJMcadIrTXt/B35J2WnCFyeNhDuhK5K0lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVShoH%2FdJMcadIrTXt%2FB35J2WnCFyeNhDuhK5K0lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1964&quot; height=&quot;1125&quot; data-origin-width=&quot;1964&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;시크릿 키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/05etE/dJMcai32SqI/wsK92b9iKjIk1Jod7MKRl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/05etE/dJMcai32SqI/wsK92b9iKjIk1Jod7MKRl0/img.png&quot; data-alt=&quot;프로젝트 시크릿키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/05etE/dJMcai32SqI/wsK92b9iKjIk1Jod7MKRl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F05etE%2FdJMcai32SqI%2FwsK92b9iKjIk1Jod7MKRl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1119&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1119&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로젝트 시크릿키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 Firebase 프로젝트를 생성했으니 실제로 데이터를 저장할 Firestore를 설정해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이드바에서 모든 제품 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/liR93/dJMcahc3lJ6/lZbkAGsZ2kzqTcKBw7uGzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/liR93/dJMcahc3lJ6/lZbkAGsZ2kzqTcKBw7uGzk/img.png&quot; data-alt=&quot;모든 제품 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/liR93/dJMcahc3lJ6/lZbkAGsZ2kzqTcKBw7uGzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FliR93%2FdJMcahc3lJ6%2FlZbkAGsZ2kzqTcKBw7uGzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;332&quot; height=&quot;1125&quot; data-origin-width=&quot;332&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모든 제품 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cloud Firestore 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1932&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BYsQ2/dJMcaf7mxHo/wYkhGiPshPqQv4HHZuGGN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BYsQ2/dJMcaf7mxHo/wYkhGiPshPqQv4HHZuGGN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BYsQ2/dJMcaf7mxHo/wYkhGiPshPqQv4HHZuGGN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBYsQ2%2FdJMcaf7mxHo%2FwYkhGiPshPqQv4HHZuGGN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1932&quot; height=&quot;1125&quot; data-origin-width=&quot;1932&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 만들기 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1935&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGwFck/dJMcacJB1FN/aeaU0FPdX2ugpzingZfzTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGwFck/dJMcacJB1FN/aeaU0FPdX2ugpzingZfzTk/img.png&quot; data-alt=&quot;데이터베이스 만들기 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGwFck/dJMcacJB1FN/aeaU0FPdX2ugpzingZfzTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGwFck%2FdJMcacJB1FN%2FaeaU0FPdX2ugpzingZfzTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1935&quot; height=&quot;1125&quot; data-origin-width=&quot;1935&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 만들기 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;b&gt;&lt;u&gt;위치를 설정한 후에는 수정이 불가능&lt;/u&gt;&lt;/b&gt;합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;943&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba8cFY/dJMcagyqCVc/RzVOllq9twWintHkYKhmz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba8cFY/dJMcagyqCVc/RzVOllq9twWintHkYKhmz1/img.png&quot; data-alt=&quot;데이터베이스 위치 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba8cFY/dJMcagyqCVc/RzVOllq9twWintHkYKhmz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba8cFY%2FdJMcagyqCVc%2FRzVOllq9twWintHkYKhmz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1362&quot; height=&quot;943&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;943&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 위치 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pbyiw/dJMcagFfrck/YNo38EzBTVco526KJ0efqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pbyiw/dJMcagFfrck/YNo38EzBTVco526KJ0efqk/img.png&quot; data-alt=&quot;데이터베이스 위치 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pbyiw/dJMcagFfrck/YNo38EzBTVco526KJ0efqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpbyiw%2FdJMcagFfrck%2FYNo38EzBTVco526KJ0efqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;623&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터베이스 위치 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 테스트 모드에서 시작을 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트 모드에서 시작 &amp;gt; 만들기 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hhl8d/dJMcadhqjAR/BvLk7KmFvvsgzkfDNvhiWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hhl8d/dJMcadhqjAR/BvLk7KmFvvsgzkfDNvhiWK/img.png&quot; data-alt=&quot;테스트 모드에서 시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hhl8d/dJMcadhqjAR/BvLk7KmFvvsgzkfDNvhiWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHhl8d%2FdJMcadhqjAR%2FBvLk7KmFvvsgzkfDNvhiWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;605&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;605&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;테스트 모드에서 시작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4uA5F/dJMcahxnqYT/BgFvTNiy6skP926VJmldK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4uA5F/dJMcahxnqYT/BgFvTNiy6skP926VJmldK1/img.png&quot; data-alt=&quot;만드는 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4uA5F/dJMcahxnqYT/BgFvTNiy6skP926VJmldK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4uA5F%2FdJMcahxnqYT%2FBgFvTNiy6skP926VJmldK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;585&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;만드는 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;1125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zAf4X/dJMcaf0Ay7j/wdcklwSbfKq3yxqIb7sG50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zAf4X/dJMcaf0Ay7j/wdcklwSbfKq3yxqIb7sG50/img.png&quot; data-alt=&quot;컬렉션 시작 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zAf4X/dJMcaf0Ay7j/wdcklwSbfKq3yxqIb7sG50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzAf4X%2FdJMcaf0Ay7j%2FwdcklwSbfKq3yxqIb7sG50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1664&quot; height=&quot;1125&quot; data-origin-width=&quot;1664&quot; data-origin-height=&quot;1125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컬렉션 시작 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬렉션 ID를 입력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한 테스트로 게시판 내용을 만들어볼 예정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 저는 컬렉션 ID를 board로 하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba9OQQ/dJMcagL0GuZ/BRbMupQQUQlFLYvMhIWAKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba9OQQ/dJMcagL0GuZ/BRbMupQQUQlFLYvMhIWAKk/img.png&quot; data-alt=&quot;컬렉션 ID&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba9OQQ/dJMcagL0GuZ/BRbMupQQUQlFLYvMhIWAKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba9OQQ%2FdJMcagL0GuZ%2FBRbMupQQUQlFLYvMhIWAKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;390&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컬렉션 ID&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서 ID는 자동 ID를 클릭하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWpaW/dJMcacJB9q7/Znb0x1Ax4zwa9f7XT7zSN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWpaW/dJMcacJB9q7/Znb0x1Ax4zwa9f7XT7zSN0/img.png&quot; data-alt=&quot;board 컬렉션 문서 id&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWpaW/dJMcacJB9q7/Znb0x1Ax4zwa9f7XT7zSN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoWpaW%2FdJMcacJB9q7%2FZnb0x1Ax4zwa9f7XT7zSN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;622&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;board 컬렉션 문서 id&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 필드를 생성해 주었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rbwOw/dJMcacJB9r0/fWe6Aj81Z7YIa2Tx6nklvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rbwOw/dJMcacJB9r0/fWe6Aj81Z7YIa2Tx6nklvK/img.png&quot; data-alt=&quot;문서 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rbwOw/dJMcacJB9r0/fWe6Aj81Z7YIa2Tx6nklvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrbwOw%2FdJMcacJB9r0%2FfWe6Aj81Z7YIa2Tx6nklvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;887&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문서 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yuFkb/dJMcajaPZBf/nFVciiMRqm71N4VWXOSFQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yuFkb/dJMcajaPZBf/nFVciiMRqm71N4VWXOSFQk/img.png&quot; data-alt=&quot;문서 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yuFkb/dJMcajaPZBf/nFVciiMRqm71N4VWXOSFQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyuFkb%2FdJMcajaPZBf%2FnFVciiMRqm71N4VWXOSFQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;888&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;문서 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 버튼을 클릭하면 다음과 같은 결과가 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRPsKu/dJMcaiJLiwq/mU0v8YDG6kyukkiPKGdDH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRPsKu/dJMcaiJLiwq/mU0v8YDG6kyukkiPKGdDH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRPsKu/dJMcaiJLiwq/mU0v8YDG6kyukkiPKGdDH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRPsKu%2FdJMcaiJLiwq%2FmU0v8YDG6kyukkiPKGdDH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1289&quot; height=&quot;582&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에서 Firestore 데이터 설계가 완료되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Next.js에서 Firebase 연동하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[&lt;a title=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&quot; href=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Firebase 공식문서 바로가기&lt;/a&gt;]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;연동단계&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Firebase SDK 설치&lt;/li&gt;
&lt;li&gt;Firebase 앱 초기화&lt;/li&gt;
&lt;li&gt;Firestore 연결 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Firebase SDK 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Firebase 프로젝트 생성과 Firestore 데이터 설계까지 완료하였습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;지금 상태는 Firebase 콘솔에만 데이터가 존재할 뿐 Next.js 애플리케이션에서는 해당 데이터를 사용할 수 없습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 Firebase SDK를 설치하고 Next.js에서 Firestore에 접근할 수 있도록 연동이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Firebase는 클라이언트에서도 직접 접근할 수 있지만, 보안을 고려하여 API Route를 통해 접근하는 구조로 설계했습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1776665565745&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install firebase&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;952&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/busamL/dJMcafzyVOv/yhf6WQlVfXpKeGkkzszNM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/busamL/dJMcafzyVOv/yhf6WQlVfXpKeGkkzszNM1/img.png&quot; data-alt=&quot;vscode 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/busamL/dJMcafzyVOv/yhf6WQlVfXpKeGkkzszNM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbusamL%2FdJMcafzyVOv%2Fyhf6WQlVfXpKeGkkzszNM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;952&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;952&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3T5X9/dJMcahjRD4B/avQ0K8uDkHoiM4vs5cBxH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3T5X9/dJMcahjRD4B/avQ0K8uDkHoiM4vs5cBxH1/img.png&quot; data-alt=&quot;명령어 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3T5X9/dJMcahjRD4B/avQ0K8uDkHoiM4vs5cBxH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3T5X9%2FdJMcahjRD4B%2FavQ0K8uDkHoiM4vs5cBxH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;302&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;명령어 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. Firebase 앱 초기화&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase를 사용하려면 프로젝트 설정 정보를 기반으로 앱을 초기화해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발급받은 프로젝트 시크릿키를 설정해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;src/data/firestore.ts&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;1026&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUa7tc/dJMcadBD9tK/Dr27XrKXRtmjWziJvZZVk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUa7tc/dJMcadBD9tK/Dr27XrKXRtmjWziJvZZVk1/img.png&quot; data-alt=&quot;firestore.ts&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUa7tc/dJMcadBD9tK/Dr27XrKXRtmjWziJvZZVk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUa7tc%2FdJMcadBD9tK%2FDr27XrKXRtmjWziJvZZVk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;1026&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;1026&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;firestore.ts&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Firestore연결&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB랑 연결해 주기 위해 코드를 추가해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8yVvj/dJMcahREgJD/Urgf2ZRkJjgFKp6QlU6tSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8yVvj/dJMcahREgJD/Urgf2ZRkJjgFKp6QlU6tSK/img.png&quot; data-alt=&quot;firestore 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8yVvj/dJMcahREgJD/Urgf2ZRkJjgFKp6QlU6tSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8yVvj%2FdJMcahREgJD%2FUrgf2ZRkJjgFKp6QlU6tSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;1027&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;firestore 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 컬렉션의 모든 문서를 읽을 수 있도록 설정해주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;firestore.ts에 코드를 추가합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776669391901&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { collection, getDocs } from &quot;firebase/firestore&quot;;

const querySnapshot = await getDocs(collection(db, &quot;board&quot;));
querySnapshot.forEach((doc) =&amp;gt; {
    // doc.data() is never undefined for query doc snapshots
    console.log(doc.id, &quot; =&amp;gt; &quot;, doc.data());
});&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;1033&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rq6Pa/dJMcagL0Kxu/swqDgHcnonIAbkfrK3Aa3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rq6Pa/dJMcagL0Kxu/swqDgHcnonIAbkfrK3Aa3k/img.png&quot; data-alt=&quot;컬렉션 문서 읽기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rq6Pa/dJMcagL0Kxu/swqDgHcnonIAbkfrK3Aa3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRq6Pa%2FdJMcagL0Kxu%2FswqDgHcnonIAbkfrK3Aa3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;1033&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;1033&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;컬렉션 문서 읽기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기로 가져오기 위해 async를 사용해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776669515031&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { initializeApp } from &quot;firebase/app&quot;;
import { collection, getDocs, getFirestore } from &quot;firebase/firestore&quot;;

// Your web app's Firebase configuration
const firebaseConfig = {
    apiKey: process.env.API_KEY,
    authDomain: process.env.AUTH_DOMAIN,
    projectId: process.env.PROJECT_ID,
    storageBucket: process.env.STORAGE_BUCKET,
    messagingSenderId: process.env.MESSAGING_SENDER_ID,
    appId: process.env.APP_ID,
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

export async function fetchData() {
    const querySnapshot = await getDocs(collection(db, &quot;cities&quot;));
    querySnapshot.forEach((doc) =&amp;gt; {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, &quot; =&amp;gt; &quot;, doc.data());
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vIdyf/dJMcaiJLmFz/AHSNxHsNxtNNRuaKDC7xw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vIdyf/dJMcaiJLmFz/AHSNxHsNxtNNRuaKDC7xw1/img.png&quot; data-alt=&quot;async 적용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vIdyf/dJMcaiJLmFz/AHSNxHsNxtNNRuaKDC7xw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvIdyf%2FdJMcaiJLmFz%2FAHSNxHsNxtNNRuaKDC7xw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;668&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;async 적용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;코드 설명&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;const querySnapshot = await getDocs(collection(db, &quot;cities&quot;)); : db에 &quot;cities&quot;라는 컬렉션을 가져온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 데이터베이스에 board라는 컬렉션을 만들어 둬서 board로 수정해 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;querySnapshot은 Firestore에서 가져온 문서들의 집합이며 각 문서는 doc 객체로 접근할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqkkjk/dJMcagkT9Q8/0lD6hagGvoIKJBQmH75YBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqkkjk/dJMcagkT9Q8/0lD6hagGvoIKJBQmH75YBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqkkjk/dJMcagkT9Q8/0lD6hagGvoIKJBQmH75YBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqkkjk%2FdJMcagkT9Q8%2F0lD6hagGvoIKJBQmH75YBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1266&quot; height=&quot;600&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;초기화 전체 코드&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1776669691100&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { initializeApp } from &quot;firebase/app&quot;;
import { collection, getDocs, getFirestore } from &quot;firebase/firestore&quot;;

// Your web app's Firebase configuration
const firebaseConfig = {
    apiKey: process.env.API_KEY,
    authDomain: process.env.AUTH_DOMAIN,
    projectId: process.env.PROJECT_ID,
    storageBucket: process.env.STORAGE_BUCKET,
    messagingSenderId: process.env.MESSAGING_SENDER_ID,
    appId: process.env.APP_ID,
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

export async function fetchData() {
    const querySnapshot = await getDocs(collection(db, &quot;board&quot;));
    querySnapshot.forEach((doc) =&amp;gt; {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, &quot; =&amp;gt; &quot;, doc.data());
    });
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/binCOI/dJMcadIr54i/ixNXWBrq3SaXZKVFxZ5zu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/binCOI/dJMcadIr54i/ixNXWBrq3SaXZKVFxZ5zu0/img.png&quot; data-alt=&quot;초기설정 전체 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/binCOI/dJMcadIr54i/ixNXWBrq3SaXZKVFxZ5zu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbinCOI%2FdJMcadIr54i%2FixNXWBrq3SaXZKVFxZ5zu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;786&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;초기설정 전체 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;모든 게시글 가져오기&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776669803051&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { initializeApp } from &quot;firebase/app&quot;;
import firebase from &quot;firebase/compat/app&quot;;
import { collection, getDocs, getFirestore } from &quot;firebase/firestore&quot;;

type BoardItem = {
    id: string;
    title: string;
    content: string;
    createAt: firebase.firestore.Timestamp;
};

// Your web app's Firebase configuration
const firebaseConfig = {
    apiKey: process.env.API_KEY,
    authDomain: process.env.AUTH_DOMAIN,
    projectId: process.env.PROJECT_ID,
    storageBucket: process.env.STORAGE_BUCKET,
    messagingSenderId: process.env.MESSAGING_SENDER_ID,
    appId: process.env.APP_ID,
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

// 모든 게시글 가져오기
export async function fetchData() {
    const querySnapshot = await getDocs(collection(db, &quot;board&quot;));
    if (querySnapshot.empty) {
        return [];
    }
    const fetchArray: BoardItem[] = [];
    querySnapshot.forEach((doc) =&amp;gt; {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, &quot; =&amp;gt; &quot;, doc.data());
        const getData: BoardItem = {
            id: doc.id,
            title: doc.data()[&quot;title&quot;],
            content: doc.data()[&quot;content&quot;],
            createAt: doc.data()[&quot;createAt&quot;].toDate(),
        };
        fetchArray.push(getData);
    });
    return fetchArray;
}

module.exports = {
    fetchData,
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firestore의 Timestamp 타입은 그대로 사용할 수 없기 때문에 JavaScript Date 객체로 변환해 주어야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서. toDate()를 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[API Router 구성하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 Firebase에 직접 접근할 수 있지만 보안과 구조 분리&amp;nbsp;위해 서버(API Route)를 통해 데이터를 가져오는 방식으로 설계했습니다.&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;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Firebase에서 데이터를 가져오는 fetchdata()를 호출하는 GET Method를 생성해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 데이터를 JSON 형태로 클라이언트에 반환합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776670015120&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/app/api/board/route.ts
import { fetchData } from &quot;@/data/firestore&quot;;
import { NextRequest, NextResponse } from &quot;next/server&quot;;

export async function GET(request: NextRequest) {
    try {
        const fetchedData = await fetchData();
        return NextResponse.json(
            { message: &quot;데이터 가져오기 성공&quot;, data: fetchedData },
            { status: 200 }
        );
    } catch (error) {
        console.error(&quot;서버 에러:&quot;, error);
        return NextResponse.json({ message: &quot;서버 에러&quot;, error: String(error) }, { status: 500 });
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localhost에서 확인하면 다음과 같이 나옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/01XTr/dJMcajhBqih/16tMZf8cJqeFQ9rpXb8sik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/01XTr/dJMcajhBqih/16tMZf8cJqeFQ9rpXb8sik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/01XTr/dJMcajhBqih/16tMZf8cJqeFQ9rpXb8sik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F01XTr%2FdJMcajhBqih%2F16tMZf8cJqeFQ9rpXb8sik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;296&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[클라이언트에서 데이터 호출하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서는 API를 호출하여 데이터를 가지고 옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/api/board API를 호출하여 데이터를 가져와야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답데이터를 state에 저장 후 UI에 렌더링 하는 방식으로 진행했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1776670143450&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/app/board/page.tsx

&quot;use client&quot;;

import { useEffect, useState } from &quot;react&quot;;

type BoardItem = {
    id: string;
    title: string;
    content: string;
    createAt: string;
};

export default function Page() {
    const [boardData, setBoardData] = useState&amp;lt;BoardItem[]&amp;gt;([]);
    const [loading, setLoading] = useState(true);

    useEffect(() =&amp;gt; {
        async function fetchBoard() {
            try {
                const response = await fetch(&quot;/api/board&quot;);
                const result = await response.json();
                setBoardData(result.data);
            } catch (error) {
                console.error(&quot;데이터 불러오기 실패&quot;, error);
            } finally {
                setLoading(false);
            }
        }
        fetchBoard();
    }, []);

    if (loading) {
        return &amp;lt;div&amp;gt;로딩중...&amp;lt;/div&amp;gt;;
    }

    return (
        &amp;lt;div className=&quot;p-4&quot;&amp;gt;
            &amp;lt;h1 className=&quot;text-2xl font-bold mb-4&quot;&amp;gt;게시판 데이터&amp;lt;/h1&amp;gt;
            &amp;lt;ul className=&quot;space-y-2&quot;&amp;gt;
                {boardData.map((item) =&amp;gt; (
                    &amp;lt;li key={item.id} className=&quot;border p-2 rounded&quot;&amp;gt;
                        &amp;lt;h2 className=&quot;text-xl&quot;&amp;gt;{item.title}&amp;lt;/h2&amp;gt;
                        &amp;lt;p&amp;gt;{item.content}&amp;lt;/p&amp;gt;
                        &amp;lt;small&amp;gt;{item.createAt.toLocaleString()}&amp;lt;/small&amp;gt;
                    &amp;lt;/li&amp;gt;
                ))}
            &amp;lt;/ul&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저 화면에서 데이터가 잘 나오는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GKJ6c/dJMcah5diWo/mPRUxKVwQ7RFWOWuPRzOSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GKJ6c/dJMcah5diWo/mPRUxKVwQ7RFWOWuPRzOSk/img.png&quot; data-alt=&quot;브라우저에서 api 호출&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GKJ6c/dJMcah5diWo/mPRUxKVwQ7RFWOWuPRzOSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGKJ6c%2FdJMcah5diWo%2FmPRUxKVwQ7RFWOWuPRzOSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;955&quot; height=&quot;273&quot; data-origin-width=&quot;955&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브라우저에서 api 호출&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[전체구조 흐름 정리]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next.js + Firebase를 이용해서 게시판 데이터를 가져오는 구조이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;694&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y0exi/dJMcagrF9C2/AJAHnMSR60FlzZVNrXZFt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y0exi/dJMcagrF9C2/AJAHnMSR60FlzZVNrXZFt0/img.png&quot; data-alt=&quot;Next.js와 Firebase의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y0exi/dJMcagrF9C2/AJAHnMSR60FlzZVNrXZFt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy0exi%2FdJMcagrF9C2%2FAJAHnMSR60FlzZVNrXZFt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1709&quot; height=&quot;694&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Next.js와 Firebase의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스의 구조는 다음과 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1776670620856&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// board(Collection)
//  └─ {id} (Document)
//       ├─ id
//       ├─ title
//       ├─ content
//       └─ createAt

type BoardItem = {
    id: string;
    title: string;
    content: string;
    createAt: firebase.firestore.Timestamp;
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Firestore(데이터베이스 계층)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;firebase SDK를 사용해 Firebase에 연결&lt;/li&gt;
&lt;li&gt;fetchData() : &quot;board&quot; 컬렉션에 데이터를 가져오는 함수&amp;nbsp;&amp;rarr; board 컬렉션을 읽고 BoardItem[] 배열로 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next.js API Route(서버 계층)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Next.js API Route&lt;/li&gt;
&lt;li&gt;클라이언트가 직접 Firebase에 접근하지 않고 /api/board라는 API를 만들어 fetchData를 호출&lt;/li&gt;
&lt;li&gt;가져온 데이터를 JSON 응답으로 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Next.js Page(클라이언트 계층)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;/board 페이지에서 API(/api/board)를 호출해 데이터를 불러 옴&lt;/li&gt;
&lt;li&gt;React 컴포넌트로 UI에 렌더링&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;설계 구조&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBrqrx/dJMcabcOArE/MLOMLVMIYSpaC1g9xeghcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBrqrx/dJMcabcOArE/MLOMLVMIYSpaC1g9xeghcK/img.png&quot; data-alt=&quot;설계 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBrqrx/dJMcabcOArE/MLOMLVMIYSpaC1g9xeghcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBrqrx%2FdJMcabcOArE%2FMLOMLVMIYSpaC1g9xeghcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1709&quot; height=&quot;859&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;859&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설계 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스 : &quot;board&quot; 컬렉션 저장&lt;/li&gt;
&lt;li&gt;서버 : 클라이언트 요청을 받아 Firestore에서 데이터 가져오기&lt;/li&gt;
&lt;li&gt;클라이언트 : API 응답을 받아 UI에 렌더링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;코드 구성&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6Nkg2/dJMcaadWZLS/4M5H9jr2PrCoHZQlJQVtg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6Nkg2/dJMcaadWZLS/4M5H9jr2PrCoHZQlJQVtg1/img.png&quot; data-alt=&quot;코드 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6Nkg2/dJMcaadWZLS/4M5H9jr2PrCoHZQlJQVtg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6Nkg2%2FdJMcaadWZLS%2F4M5H9jr2PrCoHZQlJQVtg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1709&quot; height=&quot;633&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;633&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;코드 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;firestore.ts : Firestore연결&amp;amp; 데이터 fetch함수 정의&lt;/li&gt;
&lt;li&gt;route.ts : API 엔드 포인트(/api/board)&lt;/li&gt;
&lt;li&gt;page.tsx : 클라이언트에서 API 호출 &amp;amp; 화면 출력&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;데이터 흐름&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/board 접속&lt;/li&gt;
&lt;li&gt;클라이언트 &amp;rarr; /api/board API 호출&lt;/li&gt;
&lt;li&gt;API &amp;rarr; firestore에서 &quot;board&quot; 컬렉션 데이터 조회&lt;/li&gt;
&lt;li&gt;Firestore &amp;rarr;&amp;nbsp; API &amp;rarr; 클라이언트(JSON) 응답&lt;/li&gt;
&lt;li&gt;클라이언트 UI 렌더링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;구현 특징&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기 흐름 : fetch &amp;rarr; API &amp;rarr; Firestore의 데이터 요청 과정이 비동기적으로 이루어짐&lt;/li&gt;
&lt;li&gt;보안 : 클라이언트가 직접 Firestore에 접근하지 않고 API 경유&lt;/li&gt;
&lt;li&gt;타입 안전성 : BoardItem 타입으로 데이터 구조 관리&lt;/li&gt;
&lt;li&gt;UX 고려 : 로딩 상태 표시&lt;/li&gt;
&lt;li&gt;확장성 : 추후 데이터 추가/수정 API 확장 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ps) 내용을 어떻게 하면 더 잘 정리할 수 있을까..&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://vercel.com/geist/brands#next-js&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://vercel.com/geist/brands#next-js&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776658005464&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Geist&quot; data-og-description=&quot;Vercel's design system called Geist. Made for building consistent and delightful web experiences.&quot; data-og-host=&quot;vercel.com&quot; data-og-source-url=&quot;https://vercel.com/geist/brands#next-js&quot; data-og-url=&quot;https://vercel.com/geist/brands#next-js&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/djyguy/dJMb82ME5Zo/mgwZ6H4HINLsXXXpoJCxM1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/0WCaN/dJMb9frHsrC/OIJbrribgej6U2S3iQpt8K/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628&quot;&gt;&lt;a href=&quot;https://vercel.com/geist/brands#next-js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://vercel.com/geist/brands#next-js&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/djyguy/dJMb82ME5Zo/mgwZ6H4HINLsXXXpoJCxM1/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628,https://scrap.kakaocdn.net/dn/0WCaN/dJMb9frHsrC/OIJbrribgej6U2S3iQpt8K/img.jpg?width=1200&amp;amp;height=628&amp;amp;face=0_0_1200_628');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Geist&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Vercel's design system called Geist. Made for building consistent and delightful web experiences.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;vercel.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/brand-guidelines?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://firebase.google.com/brand-guidelines?hl=ko&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776657999506&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Firebase Brand Guidelines&quot; data-og-description=&quot;Firebase 브랜드 표시&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/brand-guidelines?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/brand-guidelines?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/edmXaW/dJMb82eO0Hm/GyyPooXxwr00Krsql2dcek/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/bT4kbJ/dJMb87f8ush/47DpLjvSHKplarMTIE6KJ1/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/0YBEV/dJMb82eO0Hn/VvN3FcnR7jgJsBbaO1iDcK/img.png?width=1242&amp;amp;height=954&amp;amp;face=0_0_1242_954&quot;&gt;&lt;a href=&quot;https://firebase.google.com/brand-guidelines?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/brand-guidelines?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/edmXaW/dJMb82eO0Hm/GyyPooXxwr00Krsql2dcek/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/bT4kbJ/dJMb87f8ush/47DpLjvSHKplarMTIE6KJ1/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/0YBEV/dJMb82eO0Hn/VvN3FcnR7jgJsBbaO1iDcK/img.png?width=1242&amp;amp;height=954&amp;amp;face=0_0_1242_954');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Firebase Brand Guidelines&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Firebase 브랜드 표시&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776664632864&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Firestore Standard 버전 시작하기 &amp;nbsp;|&amp;nbsp; Firebase&quot; data-og-description=&quot;데이터베이스를 만들고, 데이터를 추가하고, 데이터를 읽는 방법을 비롯하여 Cloud Firestore를 시작하는 방법을 안내합니다.&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&quot; data-og-url=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/docs/firestore/quickstart?hl=ko&amp;amp;_gl=1*9fvdc0*_up*MQ&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Firestore Standard 버전 시작하기 &amp;nbsp;|&amp;nbsp; Firebase&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 만들고, 데이터를 추가하고, 데이터를 읽는 방법을 비롯하여 Cloud Firestore를 시작하는 방법을 안내합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;firebase.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=aWI5NDJ1J_4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=aWI5NDJ1J_4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=aWI5NDJ1J_4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cC09V4/dJMb9eTRFC4/wJimRuZNnK7HJuDLiDkO51/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=518_232_688_418,https://scrap.kakaocdn.net/dn/qLk1C/dJMb9dHp94X/Tm8EDUk9FXs0MFileqPNYK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=518_232_688_418&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;짐코딩&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/aWI5NDJ1J_4&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/Next.js</category>
      <category>API</category>
      <category>firebase</category>
      <category>Firestore</category>
      <category>next.js</category>
      <category>NoSQL</category>
      <category>개발자</category>
      <category>파이어베이스</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/270</guid>
      <comments>https://devyihyun.tistory.com/270#entry270comment</comments>
      <pubDate>Mon, 11 May 2026 18:10:08 +0900</pubDate>
    </item>
    <item>
      <title>[VSCODE] postman 사용법</title>
      <link>https://devyihyun.tistory.com/269</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfF52/dJMcacbJ7LF/WFpFWbG5whqmqwufjg74xK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfF52/dJMcacbJ7LF/WFpFWbG5whqmqwufjg74xK/img.png&quot; data-alt=&quot;vscode postman 사용법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfF52/dJMcacbJ7LF/WFpFWbG5whqmqwufjg74xK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlfF52%2FdJMcacbJ7LF%2FWFpFWbG5whqmqwufjg74xK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;536&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode postman 사용법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;postman이란?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;postman 설치&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;postman 사용방법&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;postman에서 토큰 등록하는 방법&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Postman이란?]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Postman은 개발자가 만든 API를 테스트하고 테스트 결과를 공유하여 API 개발의 생산성을 높여주는 도구이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 테스트뿐만 아니라 설계, 관리를 할 수 있도록 지원하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REST/SOAP/WebSocket 등 다양한 프로토콜 지원과 모의 서버 생성 기능을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;주요 개념&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요청(Request) : GET, POST, PUT, DELETE 등 다양한 HTTP 요청을 실행&lt;/li&gt;
&lt;li&gt;환경(Environment) : API 주소, 토큰 등을 변수로 관리&lt;/li&gt;
&lt;li&gt;Collection : 여러 API 요청을 하나의 프로젝트로 묶어 관리&lt;/li&gt;
&lt;li&gt;Script : 테스트 코드나 pre-request 스크립트 작성&lt;/li&gt;
&lt;li&gt;Mock Server/Monitor : API를 시뮬레이션하거나 주기적으로 모니터링&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 요청 후 응답(Response)에는 JSON 형식의 데이터가 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Postman 설치]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postman은 무료로 사용할 수 있고 설치 방법도 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;설치 가능한 종류&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹&lt;/li&gt;
&lt;li&gt;앱&lt;/li&gt;
&lt;li&gt;vscode&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TIP) Sync 기능을 사용하기 위해 로그인을 하여 사용하는 것을 추천한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 웹에서 사용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹에서는 포스트맨 사이트에서 가입을 하고 Sign in으로 계정을 로그인하면 사용 가능하다.&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;a href=&quot;https://www.postman.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.postman.com/&lt;/a&gt; 에서 Sign in을 클릭&lt;/p&gt;
&lt;figure id=&quot;og_1776615519916&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Postman: The World's Leading API Platform | Sign Up for Free&quot; data-og-description=&quot;Accelerate API development with Postman's all-in-one platform. Streamline collaboration and simplify the API lifecycle for faster, better results. Learn more.&quot; data-og-host=&quot;www.postman.com&quot; data-og-source-url=&quot;https://www.postman.com/&quot; data-og-url=&quot;https://www.postman.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bRPZwa/dJMb8ZvDoSs/YhRANQXWajnfkONkE9BfH0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dbzsn3/dJMb8WeBAXD/HqeMqM61JODuln7nQ8nTUK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.postman.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.postman.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bRPZwa/dJMb8ZvDoSs/YhRANQXWajnfkONkE9BfH0/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/dbzsn3/dJMb8WeBAXD/HqeMqM61JODuln7nQ8nTUK/img.jpg?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Postman: The World's Leading API Platform | Sign Up for Free&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Accelerate API development with Postman's all-in-one platform. Streamline collaboration and simplify the API lifecycle for faster, better results. Learn more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.postman.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cptxq0/dJMcafM6AQS/AZvDEoq7f48lbWEN0zpAUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cptxq0/dJMcafM6AQS/AZvDEoq7f48lbWEN0zpAUK/img.png&quot; data-alt=&quot;postman 홈페이지에서 sign in 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cptxq0/dJMcafM6AQS/AZvDEoq7f48lbWEN0zpAUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcptxq0%2FdJMcafM6AQS%2FAZvDEoq7f48lbWEN0zpAUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1032&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;postman 홈페이지에서 sign in 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 회원가입 방식을 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 구글로 회원가입 했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1067&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUhZL6/dJMcah5cKDY/0UU2OxogDv2tFkeTMPe1Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUhZL6/dJMcah5cKDY/0UU2OxogDv2tFkeTMPe1Pk/img.png&quot; data-alt=&quot;회원가입 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUhZL6/dJMcah5cKDY/0UU2OxogDv2tFkeTMPe1Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUhZL6%2FdJMcah5cKDY%2F0UU2OxogDv2tFkeTMPe1Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1067&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1067&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;회원가입 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 직업을 선택한 후 Continue 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1079&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnYH4N/dJMcagFe5h1/xTKRPu4C5VW3I6mSkBOKB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnYH4N/dJMcagFe5h1/xTKRPu4C5VW3I6mSkBOKB1/img.png&quot; data-alt=&quot;직업 선택 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnYH4N/dJMcagFe5h1/xTKRPu4C5VW3I6mSkBOKB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnYH4N%2FdJMcagFe5h1%2FxTKRPu4C5VW3I6mSkBOKB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1079&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1079&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직업 선택 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 Run test automation for existing APIs (기존 API에 대한 테스트 자동화 실행)을 클릭하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1075&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJsfQ/dJMcaciv9B0/DdJtO891KKGKcSqqZnaIIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJsfQ/dJMcaciv9B0/DdJtO891KKGKcSqqZnaIIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJsfQ/dJMcaciv9B0/DdJtO891KKGKcSqqZnaIIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJsfQ%2FdJMcaciv9B0%2FDdJtO891KKGKcSqqZnaIIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1075&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1075&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1073&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdJR1t/dJMcaayfhlJ/wVGLxcML9sdUIuncwQBit1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdJR1t/dJMcaayfhlJ/wVGLxcML9sdUIuncwQBit1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdJR1t/dJMcaayfhlJ/wVGLxcML9sdUIuncwQBit1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdJR1t%2FdJMcaayfhlJ%2FwVGLxcML9sdUIuncwQBit1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1073&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1073&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존 API에 대한 테스트 자동화 실행&lt;/li&gt;
&lt;li&gt;기존 API와 통합&lt;/li&gt;
&lt;li&gt;기존 API 탐색&lt;/li&gt;
&lt;li&gt;API 배포&lt;/li&gt;
&lt;li&gt;새로운 API를 처음부터 설계하고 구축하기&lt;/li&gt;
&lt;li&gt;기존 API 구축 또는 향상&lt;/li&gt;
&lt;li&gt;Postman 사용법 배우기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작하기 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1069&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch9FOL/dJMcaiJKPUt/Q0lyKtPlmkDRZJNK0hhXr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch9FOL/dJMcaiJKPUt/Q0lyKtPlmkDRZJNK0hhXr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch9FOL/dJMcaiJKPUt/Q0lyKtPlmkDRZJNK0hhXr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch9FOL%2FdJMcaiJKPUt%2FQ0lyKtPlmkDRZJNK0hhXr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1069&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1069&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 앱설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 윈도우를 사용하고 있어 윈도우 아이콘을 클릭했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1075&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8jRoV/dJMcagSKZOd/wcXKH0V7p6mqONjXZ05Pv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8jRoV/dJMcagSKZOd/wcXKH0V7p6mqONjXZ05Pv0/img.png&quot; data-alt=&quot;윈도우 아이콘 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8jRoV/dJMcagSKZOd/wcXKH0V7p6mqONjXZ05Pv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8jRoV%2FdJMcagSKZOd%2FwcXKH0V7p6mqONjXZ05Pv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1075&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1075&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;윈도우 아이콘 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 64-bits를 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1065&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBcu1v/dJMcaaLL41d/1ssjZI5BdG0vdesGhZKRS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBcu1v/dJMcaaLL41d/1ssjZI5BdG0vdesGhZKRS1/img.png&quot; data-alt=&quot;설치 버튼클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBcu1v/dJMcaaLL41d/1ssjZI5BdG0vdesGhZKRS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBcu1v%2FdJMcaaLL41d%2F1ssjZI5BdG0vdesGhZKRS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1065&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1065&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 버튼클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRv29o/dJMcaayfhoe/xJx8i0Cx2KnnWZ1du8If30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRv29o/dJMcaayfhoe/xJx8i0Cx2KnnWZ1du8If30/img.png&quot; data-alt=&quot;바탕화면 아이콘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRv29o/dJMcaayfhoe/xJx8i0Cx2KnnWZ1du8If30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRv29o%2FdJMcaayfhoe%2FxJx8i0Cx2KnnWZ1du8If30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;142&quot; height=&quot;142&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;142&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;바탕화면 아이콘&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/liU2Q/dJMcaiweu9O/RhSX9F3UXCc9k9NB9BOw1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/liU2Q/dJMcaiweu9O/RhSX9F3UXCc9k9NB9BOw1K/img.png&quot; data-alt=&quot;로그인 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/liU2Q/dJMcaiweu9O/RhSX9F3UXCc9k9NB9BOw1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FliU2Q%2FdJMcaiweu9O%2FRhSX9F3UXCc9k9NB9BOw1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1266&quot; height=&quot;787&quot; data-origin-width=&quot;1266&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postman 열기 클릭 후 팝업창이 나오는데 허용하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1067&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uV68f/dJMcahqBmZx/VLYk1pZCFfW7kngiQGXLy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uV68f/dJMcahqBmZx/VLYk1pZCFfW7kngiQGXLy1/img.png&quot; data-alt=&quot;postman 허용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uV68f/dJMcahqBmZx/VLYk1pZCFfW7kngiQGXLy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuV68f%2FdJMcahqBmZx%2FVLYk1pZCFfW7kngiQGXLy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1067&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1067&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;postman 허용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1077&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5EowS/dJMcaffhhwO/k1bamlcRodWK8ZFY8N6znk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5EowS/dJMcaffhhwO/k1bamlcRodWK8ZFY8N6znk/img.png&quot; data-alt=&quot;앱 실행 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5EowS/dJMcaffhhwO/k1bamlcRodWK8ZFY8N6znk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5EowS%2FdJMcaffhhwO%2Fk1bamlcRodWK8ZFY8N6znk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1077&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1077&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;앱 실행 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. VSCODE에서 사용하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode에서 postman을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode에서 extension 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/209l6/dJMcab4X2Oy/tIx2OTl0jFZldabgA3xLu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/209l6/dJMcab4X2Oy/tIx2OTl0jFZldabgA3xLu1/img.png&quot; data-alt=&quot;vscode 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/209l6/dJMcab4X2Oy/tIx2OTl0jFZldabgA3xLu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F209l6%2FdJMcab4X2Oy%2FtIx2OTl0jFZldabgA3xLu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1030&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;vscode 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;postman 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;install 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd0vGx/dJMcahc20t5/DKC5OrmGvWGqE5PB5dR1LK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd0vGx/dJMcahc20t5/DKC5OrmGvWGqE5PB5dR1LK/img.png&quot; data-alt=&quot;extension 검색 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd0vGx/dJMcahc20t5/DKC5OrmGvWGqE5PB5dR1LK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd0vGx%2FdJMcahc20t5%2FDKC5OrmGvWGqE5PB5dR1LK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1030&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;extension 검색 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trust 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1027&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRi9ic/dJMcabw7r2m/YWGdC2sBTTkRQkY9FkYOnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRi9ic/dJMcabw7r2m/YWGdC2sBTTkRQkY9FkYOnK/img.png&quot; data-alt=&quot;접근 허용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRi9ic/dJMcabw7r2m/YWGdC2sBTTkRQkY9FkYOnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRi9ic%2FdJMcabw7r2m%2FYWGdC2sBTTkRQkY9FkYOnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1027&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1027&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;접근 허용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sign in 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1038&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2vGvX/dJMcabjDl2V/f2YADHOOGDutnv9NcP3hB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2vGvX/dJMcabjDl2V/f2YADHOOGDutnv9NcP3hB1/img.png&quot; data-alt=&quot;로그인/회원가입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2vGvX/dJMcabjDl2V/f2YADHOOGDutnv9NcP3hB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2vGvX%2FdJMcabjDl2V%2Ff2YADHOOGDutnv9NcP3hB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1038&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1038&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인/회원가입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;open클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgfbn5/dJMcagFe5pZ/TxvjNVJGE2erSxr7leraK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgfbn5/dJMcagFe5pZ/TxvjNVJGE2erSxr7leraK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgfbn5/dJMcagFe5pZ/TxvjNVJGE2erSxr7leraK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbgfbn5%2FdJMcagFe5pZ%2FTxvjNVJGE2erSxr7leraK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1030&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Open 클&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1029&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/txfXn/dJMcabcN24N/QQQ84z6VXFqZtV8sWKjnb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/txfXn/dJMcabcN24N/QQQ84z6VXFqZtV8sWKjnb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/txfXn/dJMcabcN24N/QQQ84z6VXFqZtV8sWKjnb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtxfXn%2FdJMcabcN24N%2FQQQ84z6VXFqZtV8sWKjnb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1029&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1029&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 완료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDENJI/dJMcabcN24O/h2CI3sFL7sHtAtj9lKkMQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDENJI/dJMcabcN24O/h2CI3sFL7sHtAtj9lKkMQk/img.png&quot; data-alt=&quot;설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDENJI/dJMcabcN24O/h2CI3sFL7sHtAtj9lKkMQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDENJI%2FdJMcabcN24O%2Fh2CI3sFL7sHtAtj9lKkMQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1030&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1030&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[postman 사용 방법]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;vscode postman 기준으로 설명하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1005&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt887d/dJMcagrFBXi/9XJvkfw7mwtMwW8hIU1JR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt887d/dJMcagrFBXi/9XJvkfw7mwtMwW8hIU1JR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt887d/dJMcagrFBXi/9XJvkfw7mwtMwW8hIU1JR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt887d%2FdJMcagrFBXi%2F9XJvkfw7mwtMwW8hIU1JR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;1005&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;1005&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'+' 버튼 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LCkLn/dJMcaf7mcXz/4URI5hsDducionpuVy45Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LCkLn/dJMcaf7mcXz/4URI5hsDducionpuVy45Xk/img.png&quot; data-alt=&quot;생성하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LCkLn/dJMcaf7mcXz/4URI5hsDducionpuVy45Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLCkLn%2FdJMcaf7mcXz%2F4URI5hsDducionpuVy45Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1904&quot; height=&quot;1000&quot; data-origin-width=&quot;1904&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;New Collection이 생성되었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;955&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDlZde/dJMcahYpTTs/Rf8tpzOswke3xNewBDIHE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDlZde/dJMcahYpTTs/Rf8tpzOswke3xNewBDIHE1/img.png&quot; data-alt=&quot;New Collection 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDlZde/dJMcahYpTTs/Rf8tpzOswke3xNewBDIHE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDlZde%2FdJMcahYpTTs%2FRf8tpzOswke3xNewBDIHE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;955&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;955&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;New Collection 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collection의 이름을 수정할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;1001&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EF0n7/dJMcafGjIMI/eQurvwEnRKzvoXl7VshKo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EF0n7/dJMcafGjIMI/eQurvwEnRKzvoXl7VshKo1/img.png&quot; data-alt=&quot;collection 이름 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EF0n7/dJMcafGjIMI/eQurvwEnRKzvoXl7VshKo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEF0n7%2FdJMcafGjIMI%2FeQurvwEnRKzvoXl7VshKo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;1001&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;1001&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;collection 이름 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Add Request 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;1001&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uW5rR/dJMcabcN25h/i6uTpmhk9UqIvl8YNI7bKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uW5rR/dJMcabcN25h/i6uTpmhk9UqIvl8YNI7bKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uW5rR/dJMcabcN25h/i6uTpmhk9UqIvl8YNI7bKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuW5rR%2FdJMcabcN25h%2Fi6uTpmhk9UqIvl8YNI7bKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1911&quot; height=&quot;1001&quot; data-origin-width=&quot;1911&quot; data-origin-height=&quot;1001&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url에 따라 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;API 테스트를 보여드리기 위해 &lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt; 로 테스트 해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjQbbb/dJMcahqBm4Z/No3nfmjkj8NOpvJieWka61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjQbbb/dJMcahqBm4Z/No3nfmjkj8NOpvJieWka61/img.png&quot; data-alt=&quot;api 테스트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjQbbb/dJMcahqBm4Z/No3nfmjkj8NOpvJieWka61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjQbbb%2FdJMcahqBm4Z%2FNo3nfmjkj8NOpvJieWka61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1915&quot; height=&quot;998&quot; data-origin-width=&quot;1915&quot; data-origin-height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;api 테스트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jsonplaceholder.typicode.com/&quot;&gt;https://jsonplaceholder.typicode.com/&lt;/a&gt;를 입력해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 후 Send 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;989&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u1G6y/dJMcabqotd2/z8UsRQaezAVKD97RNHa0D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u1G6y/dJMcabqotd2/z8UsRQaezAVKD97RNHa0D1/img.png&quot; data-alt=&quot;Send 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u1G6y/dJMcabqotd2/z8UsRQaezAVKD97RNHa0D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu1G6y%2FdJMcabqotd2%2Fz8UsRQaezAVKD97RNHa0D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;989&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;989&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Send 클릭&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 확인할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/230z2/dJMcafl0S08/LBml6KQqnU0Wba0vHa2wsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/230z2/dJMcafl0S08/LBml6KQqnU0Wba0vHa2wsK/img.png&quot; data-alt=&quot;api 요청 결과화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/230z2/dJMcafl0S08/LBml6KQqnU0Wba0vHa2wsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F230z2%2FdJMcafl0S08%2FLBml6KQqnU0Wba0vHa2wsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1905&quot; height=&quot;996&quot; data-origin-width=&quot;1905&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;api 요청 결과화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 메서드를 사용할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJ7PIw/dJMcahjQ6PU/tydrQtL8Ivyq3mpscjdryK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJ7PIw/dJMcahjQ6PU/tydrQtL8Ivyq3mpscjdryK/img.png&quot; data-alt=&quot;HTTP 메서드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJ7PIw/dJMcahjQ6PU/tydrQtL8Ivyq3mpscjdryK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJ7PIw%2FdJMcahjQ6PU%2FtydrQtL8Ivyq3mpscjdryK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;739&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;739&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;HTTP 메서드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;요청 시 데이터를 body로 보내는 방법&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Body 탭에서 raw 선택 &amp;gt; 데이터 타입을 JSON으로 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HUcXC/dJMcaduS9qm/QG57oTKWLtqFgAjhVhMflK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HUcXC/dJMcaduS9qm/QG57oTKWLtqFgAjhVhMflK/img.png&quot; data-alt=&quot;body로 요청 보내기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HUcXC/dJMcaduS9qm/QG57oTKWLtqFgAjhVhMflK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHUcXC%2FdJMcaduS9qm%2FQG57oTKWLtqFgAjhVhMflK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1384&quot; height=&quot;565&quot; data-origin-width=&quot;1384&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;body로 요청 보내기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Postman에서 토큰 등록하는 방법]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Collectoin을 클릭&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQfSqW/dJMcabDUway/4A0K0EICisjaQOJiNvNFmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQfSqW/dJMcabDUway/4A0K0EICisjaQOJiNvNFmK/img.png&quot; data-alt=&quot;Collection 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQfSqW/dJMcabDUway/4A0K0EICisjaQOJiNvNFmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQfSqW%2FdJMcabDUway%2F4A0K0EICisjaQOJiNvNFmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;993&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Collection 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Authorization 클릭 &amp;gt; Type에서 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 JWT에서 Bearer Token을 사용 중입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bearer Token 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coYP3c/dJMcahYpTW6/kYOmEC1ZuXdsJgGs6Ensk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coYP3c/dJMcahYpTW6/kYOmEC1ZuXdsJgGs6Ensk0/img.png&quot; data-alt=&quot;Authorization 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coYP3c/dJMcahYpTW6/kYOmEC1ZuXdsJgGs6Ensk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoYP3c%2FdJMcahYpTW6%2FkYOmEC1ZuXdsJgGs6Ensk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1913&quot; height=&quot;990&quot; data-origin-width=&quot;1913&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Authorization 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 JWT 토큰 값을 입력해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckWopQ/dJMcahD55U6/kq2UbY8Ib0kzKY9tPvixdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckWopQ/dJMcahD55U6/kq2UbY8Ib0kzKY9tPvixdk/img.png&quot; data-alt=&quot;JWT 토큰값 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckWopQ/dJMcahD55U6/kq2UbY8Ib0kzKY9tPvixdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckWopQ%2FdJMcahD55U6%2Fkq2UbY8Ib0kzKY9tPvixdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1908&quot; height=&quot;990&quot; data-origin-width=&quot;1908&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JWT 토큰값 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request 탭에서 Authorization 설정을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 요청은 상위(부모) Collection에서 지정한 인증 정보를 자동으로 상속받도록 구성했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 결과, 요청을 보낼 때 필요한 토큰이 헤더에 자동으로 포함되어 전송되도록 설정됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;947&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xEAsu/dJMcafGjIU8/axbjcVDM2AirK8eKL4wtv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xEAsu/dJMcafGjIU8/axbjcVDM2AirK8eKL4wtv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xEAsu/dJMcafGjIU8/axbjcVDM2AirK8eKL4wtv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxEAsu%2FdJMcafGjIU8%2FaxbjcVDM2AirK8eKL4wtv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1901&quot; height=&quot;947&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;947&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=hZJNwZssuhg&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=hZJNwZssuhg&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=hZJNwZssuhg&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/s3NHY/dJMb8XR7DJr/VQVZk6jkhZEr3UBjkvHsHk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/byhwCq/dJMb8UHQ51y/hGFV9jC5UrOxy5VUMMDNMk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/nJnDL/dJMb8Rj3Tmx/2AHqg1eAHpkg04s1HOKD50/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;코드팩토리&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/hZJNwZssuhg&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=3c7L3fFUj-4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=3c7L3fFUj-4&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=3c7L3fFUj-4&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/q9WAg/dJMb9c9zPLo/yQAKK4LKfBfI5rgKpK0c11/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/bfTI66/dJMb9bv4e9Z/8YHYJ2lckrgDIjJ3Ce85pK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360,https://scrap.kakaocdn.net/dn/btEATH/dJMb9fZxhdR/QidB2JBpmFK4rsazHGhLqK/img.jpg?width=480&amp;amp;height=360&amp;amp;face=0_0_480_360&quot; data-video-width=&quot;480&quot; data-video-height=&quot;360&quot; data-video-origin-width=&quot;480&quot; data-video-origin-height=&quot;360&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;기술노트with 알렉&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/3c7L3fFUj-4&quot; width=&quot;480&quot; height=&quot;360&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=2TZXMYYD1bs&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=2TZXMYYD1bs&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=2TZXMYYD1bs&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/broUZn/dJMb85vQWUb/SJe4z7kgWYoBhYZEl6KHq1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/ovNd6/dJMb8955zyn/qqLHDKGOt3BRRnGRw6Lkxk/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/r5LIV/dJMb85WVi0N/jDQRglImM4hw7KDK3wUFp0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;NewLearning 뉴러닝&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/2TZXMYYD1bs&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[이미지 출처]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://uxwing.com/postman-icon/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://uxwing.com/postman-icon/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776615080162&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Postman Icon PNG and SVG Vector Free Download&quot; data-og-description=&quot;Postman Icon PNG and SVG free use any commercial projects no attribution required.&quot; data-og-host=&quot;uxwing.com&quot; data-og-source-url=&quot;https://uxwing.com/postman-icon/&quot; data-og-url=&quot;https://uxwing.com/postman-icon/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cA4VS4/dJMb8SpJUnK/3aIfa0uZ8N0W6sI9yjUp11/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://uxwing.com/postman-icon/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://uxwing.com/postman-icon/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cA4VS4/dJMb8SpJUnK/3aIfa0uZ8N0W6sI9yjUp11/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Postman Icon PNG and SVG Vector Free Download&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Postman Icon PNG and SVG free use any commercial projects no attribution required.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;uxwing.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>환경설정</category>
      <category>API</category>
      <category>API테스트</category>
      <category>postman</category>
      <category>RESTful API</category>
      <category>vscode</category>
      <category>개발자</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/269</guid>
      <comments>https://devyihyun.tistory.com/269#entry269comment</comments>
      <pubDate>Fri, 8 May 2026 18:10:02 +0900</pubDate>
    </item>
    <item>
      <title>[IT노트] 인증과 인가, JWT 정리</title>
      <link>https://devyihyun.tistory.com/268</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZQKiQ/dJMcadhpNdx/MXeNtJklGTbOtgJrafrlO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZQKiQ/dJMcadhpNdx/MXeNtJklGTbOtgJrafrlO1/img.png&quot; data-alt=&quot;JWT란? 인증과 인가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZQKiQ/dJMcadhpNdx/MXeNtJklGTbOtgJrafrlO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZQKiQ%2FdJMcadhpNdx%2FMXeNtJklGTbOtgJrafrlO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;537&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JWT란? 인증과 인가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인증(Authentication)과 인가(Authorization)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;로그인 상태 유지하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세션 방식 이해하기&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;토큰 방식&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;JWT 구조&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;세션 vs JWT 비교&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;JWT의 한계와 보완 방법(Refresh Token)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정리&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[인증(Authentication)과 인가(Authorization)]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 기능을 구현할 때 단순히 데이터베이스에 있는 내용과 일치하면 로그인이 가능하게 구현하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1799&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkhkXF/dJMcacphBfC/Aiy80yMn1VjOJDU5ysiiR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkhkXF/dJMcacphBfC/Aiy80yMn1VjOJDU5ysiiR1/img.png&quot; data-alt=&quot;로그인 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkhkXF/dJMcacphBfC/Aiy80yMn1VjOJDU5ysiiR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkhkXF%2FdJMcacphBfC%2FAiy80yMn1VjOJDU5ysiiR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1799&quot; height=&quot;383&quot; data-origin-width=&quot;1799&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 기본적인 로그인 구현을 넘어서 마주한 문제는 안전하게 로그인 상태를 유지하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 사용자 인증에 성공하는 것만으로는 충분하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 한 번 로그인을 하면 사용자가 로그인한 상태인 것을 서버가 알고 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 로그인 상태가 유지가 안된다면 사용자가 메일함에 들어갈 때마다, 메일을 읽거나 삭제, 전송을 할 때마다 매번 로그인을 해야 하는 불편함을 겪게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 인증과 인가를 어떻게 처리할지, 로그인 상태를 유지하는 것이 가장 까다로운 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 구현 시 단순한 사용자 확인을 넘어서 세션관리, 토큰 기반 인증 등의 보안 방식을 고려해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 가장 기본적으로 알아야 하는 것은 인증과 인가이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인증(Authentication) : &quot;누구세요?&quot;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용자가 본인임을 증명하는 단계&lt;/li&gt;
&lt;li&gt;예 : 로그인&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;인가(Authorization) : &quot;나 이거 해도 돼?&quot;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;사용자가 사이트에 대한 권한을 허락하는 것&lt;/li&gt;
&lt;li&gt;접근 권한을 부여하거나 거부하는 행위&lt;/li&gt;
&lt;li&gt;예 : 로그인 사용자만 이용 가능, 관리자만 접근 가능한 페이지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.56586%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 44.8449%;&quot;&gt;인증(Authentication&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%;&quot;&gt;인가(Authorization)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.56586%;&quot;&gt;의미&lt;/td&gt;
&lt;td style=&quot;width: 44.8449%;&quot;&gt;사용자가 누구인지 확인하는 과정으로 증명을 하는 행위&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%;&quot;&gt;사용자가 사이트에 대한 권한을 허락하는 것으로 접근 권한을 부여하거나 거부하는 행위&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.56586%;&quot;&gt;예시&lt;/td&gt;
&lt;td style=&quot;width: 44.8449%;&quot;&gt;회원가입, 로그인&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%;&quot;&gt;관리자 권한 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.56586%;&quot;&gt;순서&lt;/td&gt;
&lt;td style=&quot;width: 44.8449%;&quot;&gt;먼저 수행된다.&lt;/td&gt;
&lt;td style=&quot;width: 46.5891%;&quot;&gt;인증 후 수행된다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[로그인 상태 인식하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 상태를 유지하려면 로그인을 한 상태를 인식해야 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;로그인 상태를 인식하는 두 가지 방법&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그인 상태&lt;/li&gt;
&lt;li&gt;비로그인 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 로그인을 한 상태라면 메일을 보내거나 댓글을 작성할 수 있는 기능을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비로그인 사용자는 이용할 수 없는 기능이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTOyyl/dJMcadn9CVR/2FHvwsyYHScnAwJEwssZT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTOyyl/dJMcadn9CVR/2FHvwsyYHScnAwJEwssZT1/img.png&quot; data-alt=&quot;로그인 상태인 사용자와 비로그인 상태의 사용자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTOyyl/dJMcadn9CVR/2FHvwsyYHScnAwJEwssZT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTOyyl%2FdJMcadn9CVR%2F2FHvwsyYHScnAwJEwssZT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1103&quot; height=&quot;793&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 상태인 사용자와 비로그인 상태의 사용자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;문제점&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;성능 문제&lt;/li&gt;
&lt;li&gt;보안 문제&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 성능 문제&lt;/b&gt;&lt;/h4&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCRI1V/dJMcacQlkJ2/i80kdLd7dmFJ2LbeHuJZVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCRI1V/dJMcacQlkJ2/i80kdLd7dmFJ2LbeHuJZVK/img.png&quot; data-alt=&quot;암호화 되어 있는 사용자 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCRI1V/dJMcacQlkJ2/i80kdLd7dmFJ2LbeHuJZVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCRI1V%2FdJMcacQlkJ2%2Fi80kdLd7dmFJ2LbeHuJZVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;383&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;암호화 되어 있는 사용자 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mJxDJ/dJMcaayfewX/KJ8dCyAYJw1yaRy05ATSB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mJxDJ/dJMcaayfewX/KJ8dCyAYJw1yaRy05ATSB0/img.png&quot; data-alt=&quot;비밀번호 해시 비교 과정 : 보안을 위한 복잡한 연산이 서버 성능에 영향을줄 수 있음&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mJxDJ/dJMcaayfewX/KJ8dCyAYJw1yaRy05ATSB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmJxDJ%2FdJMcaayfewX%2FKJ8dCyAYJw1yaRy05ATSB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1785&quot; height=&quot;382&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀번호 해시 비교 과정 : 보안을 위한 복잡한 연산이 서버 성능에 영향을줄 수 있음&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 보안 문제&lt;/b&gt;&lt;/h4&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;623&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n7G50/dJMcahxmULo/FFoSj1n9COueKsjf6oi2tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n7G50/dJMcahxmULo/FFoSj1n9COueKsjf6oi2tK/img.png&quot; data-alt=&quot;보안 문제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n7G50/dJMcahxmULo/FFoSj1n9COueKsjf6oi2tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn7G50%2FdJMcahxmULo%2FFFoSj1n9COueKsjf6oi2tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1785&quot; height=&quot;623&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;623&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;보안 문제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[로그인 상태를 유지하는 방식]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 상태를 유지하는 두 가지 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;로그인 상태를 유지하는 방법&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;세션(Session) 기반&lt;/li&gt;
&lt;li&gt;토큰(Token) 기반&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 상태를 유지하는 방법으로는 세션과 토큰 방법 중 하나를 이용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;둘 다 인증 방식은 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 로그인을 하면 서버는 사용자에게 입장권을 발급해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIiiqF/dJMcahjQ5Be/updFmg0YZRcjKue2dv5hP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIiiqF/dJMcahjQ5Be/updFmg0YZRcjKue2dv5hP0/img.png&quot; data-alt=&quot;사용자 조회 확인 후 입장권 발급&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIiiqF/dJMcahjQ5Be/updFmg0YZRcjKue2dv5hP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIiiqF%2FdJMcahjQ5Be%2FupdFmg0YZRcjKue2dv5hP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1207&quot; height=&quot;463&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 조회 확인 후 입장권 발급&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 웹사이트에 게시글을 작성하거나, 데이터를 요청할 때마다 입장권을 함께 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxqYLu/dJMcaaE1uNp/HjKKmezQlmPN9aZSAC8rvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxqYLu/dJMcaaE1uNp/HjKKmezQlmPN9aZSAC8rvk/img.png&quot; data-alt=&quot;서버에 요청시 입장권과 함께 전달&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxqYLu/dJMcaaE1uNp/HjKKmezQlmPN9aZSAC8rvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxqYLu%2FdJMcaaE1uNp%2FHjKKmezQlmPN9aZSAC8rvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1207&quot; height=&quot;502&quot; data-origin-width=&quot;1207&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버에 요청시 입장권과 함께 전달&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 서버는 입장권을 확인하여 인증된 사용자라는 것을 판단한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oxOD3/dJMcai32wAm/aL1SIWrJ7vZJyZw7g8kFM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oxOD3/dJMcai32wAm/aL1SIWrJ7vZJyZw7g8kFM0/img.png&quot; data-alt=&quot;입장권 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oxOD3/dJMcai32wAm/aL1SIWrJ7vZJyZw7g8kFM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoxOD3%2FdJMcai32wAm%2FaL1SIWrJ7vZJyZw7g8kFM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;417&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;입장권 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입장권에 문제가 없다면 서버는 요청을 받아들이고 사용자는 정상적으로 웹사이트를 이용할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UICug/dJMcabqosaF/zmZijAUo8x9Ww0Kg4dTYpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UICug/dJMcabqosaF/zmZijAUo8x9Ww0Kg4dTYpK/img.png&quot; data-alt=&quot;요청에 대한 응답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UICug/dJMcabqosaF/zmZijAUo8x9Ww0Kg4dTYpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUICug%2FdJMcabqosaF%2FzmZijAUo8x9Ww0Kg4dTYpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;915&quot; height=&quot;502&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요청에 대한 응답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo5oMY/dJMcaipvgtU/F4fjNIzA3Wb4moTHrrJjiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo5oMY/dJMcaipvgtU/F4fjNIzA3Wb4moTHrrJjiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo5oMY/dJMcaipvgtU/F4fjNIzA3Wb4moTHrrJjiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo5oMY%2FdJMcaipvgtU%2FF4fjNIzA3Wb4moTHrrJjiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;417&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;유효하지 않은 입장권&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8e0uk/dJMcaduS8co/KctlsuX2eNvUeIdcllaIsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8e0uk/dJMcaduS8co/KctlsuX2eNvUeIdcllaIsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8e0uk/dJMcaduS8co/KctlsuX2eNvUeIdcllaIsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8e0uk%2FdJMcaduS8co%2FKctlsuX2eNvUeIdcllaIsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;915&quot; height=&quot;502&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;인증 실패&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[세션 방식 이해하기]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 로그인에 성공하면 서버는 사용자를 기억하기 위해 '세션 id'를 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 세션 id는 고윳값으로 세션 id 전체를 사용자 브라우저에 쿠키 형태로 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDyKIg/dJMcacJBEJu/zcrXN8F1WwwB6xKUHk8E7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDyKIg/dJMcacJBEJu/zcrXN8F1WwwB6xKUHk8E7k/img.png&quot; data-alt=&quot;사용자가 로그인 요청을 보냄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDyKIg/dJMcacJBEJu/zcrXN8F1WwwB6xKUHk8E7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDyKIg%2FdJMcacJBEJu%2FzcrXN8F1WwwB6xKUHk8E7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;490&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자가 로그인 요청을 보냄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbtu9E/dJMcacJBEJY/Xs96wUMMpUCtF4J1gv2IX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbtu9E/dJMcacJBEJY/Xs96wUMMpUCtF4J1gv2IX1/img.png&quot; data-alt=&quot;요청을 처리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbtu9E/dJMcacJBEJY/Xs96wUMMpUCtF4J1gv2IX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbtu9E%2FdJMcacJBEJY%2FXs96wUMMpUCtF4J1gv2IX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1776&quot; height=&quot;441&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요청을 처리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bghKRM/dJMcahYpSh3/UXsjQaHoxlAktBts45m9Fk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bghKRM/dJMcahYpSh3/UXsjQaHoxlAktBts45m9Fk/img.png&quot; data-alt=&quot;로그인 요청에 대한 응답을 보냄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bghKRM/dJMcahYpSh3/UXsjQaHoxlAktBts45m9Fk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbghKRM%2FdJMcahYpSh3%2FUXsjQaHoxlAktBts45m9Fk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;441&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 요청에 대한 응답을 보냄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 이 세션 id를 키로 하여 로그인한 사용자 정보를 서버 측 메모리, 하드디스크, 데이터베이스 중 한 곳에 저장해 둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인한 사용자는 세션 ID를 받는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1299&quot; data-origin-height=&quot;839&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zi1KT/dJMcag6hTuk/qtXXSbznxNr2JFO3ASDpb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zi1KT/dJMcag6hTuk/qtXXSbznxNr2JFO3ASDpb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zi1KT/dJMcag6hTuk/qtXXSbznxNr2JFO3ASDpb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzi1KT%2FdJMcag6hTuk%2FqtXXSbznxNr2JFO3ASDpb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1299&quot; height=&quot;839&quot; data-origin-width=&quot;1299&quot; data-origin-height=&quot;839&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 사용자가 세션 id를 받은 상태로 브라우저를 통해 사이트를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 사이트의 기능을 이용하여 브라우저에서 서버에 요청을 보낼 때마다 이 세션 ID 쿠키가 서버에 함께 전송된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgJZ2J/dJMcabqorKv/yyv9RKVhqUhI0qYakAXKqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgJZ2J/dJMcabqorKv/yyv9RKVhqUhI0qYakAXKqK/img.png&quot; data-alt=&quot;사이트의 기능을 이용하는 사용자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgJZ2J/dJMcabqorKv/yyv9RKVhqUhI0qYakAXKqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgJZ2J%2FdJMcabqorKv%2Fyyv9RKVhqUhI0qYakAXKqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1101&quot; height=&quot;656&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사이트의 기능을 이용하는 사용자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 받은 서버는 전달받은 세션 id와 서버에 저장된 세션 정보와 일치하는지 확인하여 로그인이 된 사용자인지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확인이 되면 로그인 상태를 유지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 세션 id를 사용해서 사용자가 로그인 상태임을 유지하는 이 상태를 '세션'이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;세션 저장소별 특징&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;빠르다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서버가 꺼지면 세션 정보가 날아간다.(휘발성)&lt;/li&gt;
&lt;li&gt;접속자가 많아지면 메모리가 부족해지고 서버에 부담이 된다.&lt;/li&gt;
&lt;li&gt;세션 정보가 없어지면 사용자들은 다시 로그인을 해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;하드디스크&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서버가 꺼져도 세션 정보가 유지된다.&lt;/li&gt;
&lt;li&gt;상대적으로 메모리보다 안정적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;디스크 입출력으로 인해 처리 속도가 느려 성능에 영향을 줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;데이터베이스&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;세션 정보를 안정적으로 저장할 수 있다.&lt;/li&gt;
&lt;li&gt;다수의 서버에서 세션 공유가 용이하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;메모리보다는 속도가 느리다.&lt;/li&gt;
&lt;li&gt;트래픽이 많아지면 데이터베이스에 부하가 증가할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;redis나 Memcached 같은 인메모리 저장소&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;메모리 기반이라 빠르다.&lt;/li&gt;
&lt;li&gt;클러스터링과 확장을 통해 대용량 처리도 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단점&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서버가 여러 대일 경우 각 서버가 공유 메모리를 사용하지 않으면 세션 정보가 공유되지 않아 세션 유지에 문제가 발생한다.&lt;/li&gt;
&lt;li&gt;Redis 자체가 장애 시 전체 세션 관리에 문제가 생길 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;[더보기 : 서버가 여러 대일 때]&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[서버가 여러 대일 때]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버가 여러 대일 경우 로드밸런싱을 통해 트래픽을 분산시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 1번이 사용자의 로그인 요청을 처리 후 서버 2번으로 가야 할게 서버 3번으로 간다면 서버 3번은 해당 사용자의 세션 정보가 없어 로그인 상태를 확인할 수 없다.&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;세션 정보를 공통 저장소(Redis,DB 등)에 저장하여 모든 서버가 공유하게 한다.&lt;/li&gt;
&lt;li&gt;또는 특정 사용자 요청이 항상 같은 서버로 가도록 '세션 스티키(Session Sticky) 전략을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션은 사용자의 로그인 상태를 유지하기 위한 서버의 기억장치이다.&lt;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 이런 부담 없이 구현하기 위해 나온 방법이 토큰 방식인 JWT이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[JWT 토큰 방식]&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JWT(JSON Web Token)란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 인증과 인가에 관련된 기술이다.&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;JWT는 웹 표준을 따르고 있다.&lt;/li&gt;
&lt;li&gt;JSON 객체를 사용하여 정보를 전달한다.&lt;/li&gt;
&lt;li&gt;필요한 모든 정보를 한 객체에 담아서 전달하기 때문에 JWT 한 가지로 인증을 마칠 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT를 사용한 토큰 방식은 서버가 상태를 저장하지 않는 방식이다.(stateless)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wF43R/dJMcacbJ6Sy/K6qTPsCyCKyaquVAS6Rcl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wF43R/dJMcacbJ6Sy/K6qTPsCyCKyaquVAS6Rcl0/img.png&quot; data-alt=&quot;토큰 인증 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wF43R/dJMcacbJ6Sy/K6qTPsCyCKyaquVAS6Rcl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwF43R%2FdJMcacbJ6Sy%2FK6qTPsCyCKyaquVAS6Rcl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;463&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰 인증 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 로그인을 하면 서버는 JWT 토큰을 발급한다. (긴 암호문 같은 문자열)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저는 이 토큰을 쿠키나 로컬스토리지에 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUGuGU/dJMcagL0c2U/fpW35ij3fqirQuugVXdio0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUGuGU/dJMcagL0c2U/fpW35ij3fqirQuugVXdio0/img.png&quot; data-alt=&quot;JWT 토큰 발급 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUGuGU/dJMcagL0c2U/fpW35ij3fqirQuugVXdio0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUGuGU%2FdJMcagL0c2U%2FfpW35ij3fqirQuugVXdio0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1785&quot; height=&quot;464&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JWT 토큰 발급 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 사이트의 기능을 이용하여 브라우저에서 서버에 요청을 보낼 때마다 이 토큰을 같이 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 토큰 안의 정보와 서명으로 유효한 토큰인지 검증만 하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZNA2/dJMcabRqE42/kKKIqaQk2sjFDxSlVZJhe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZNA2/dJMcabRqE42/kKKIqaQk2sjFDxSlVZJhe1/img.png&quot; data-alt=&quot;서버에 요청 시 토큰과 함께 전달&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZNA2/dJMcabRqE42/kKKIqaQk2sjFDxSlVZJhe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZNA2%2FdJMcabRqE42%2FkKKIqaQk2sjFDxSlVZJhe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1375&quot; height=&quot;463&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;463&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버에 요청 시 토큰과 함께 전달&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;장점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버가 세션을 저장하지 않아도 됨&amp;nbsp;&amp;rarr; 확장성 뛰어남&lt;/li&gt;
&lt;li&gt;어떤 서버에 요청이 가도록 처리 가능 &amp;rarr; 로드밸런싱에 유리&lt;/li&gt;
&lt;li&gt;서버 여러 대여도 상관없다. 어디서든 토큰만 있다면 처리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;단점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토큰이 노출되면 위험 &amp;rarr; HTTPS로 전송해야 함&lt;/li&gt;
&lt;li&gt;토큰이 만료되기 전까지는 강제로 무효화하기 어려움(로그아웃 처리 복잡)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[JWT 구조]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 세 부분으로 구성되며 각 부분은.(dot 점)으로 구분된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인코딩 또는 암호화된 3가지 데이터를 이어 붙인 것이다.&lt;/p&gt;
&lt;pre id=&quot;code_1776611748710&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; HEADER.PAYLOAD.SIGNATURE&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HEADER : 헤더&lt;/li&gt;
&lt;li&gt;PAYLOAD : 내용&lt;/li&gt;
&lt;li&gt;SIGNATURE : 서명&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. HEADER(헤더)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 입장권이 어떤 방식으로 발급되었는지 알려주는 &quot;양식&quot;같은 부분&lt;/li&gt;
&lt;li&gt;어떤 알고리즘으로 서명되어 있는지 명시(예 : HMAC, SHA256)&lt;/li&gt;
&lt;li&gt;일반적으로 다음과 같은 정보를 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776612087566&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
	&quot;alg&quot; : &quot;HS256&quot;,
	&quot;typ&quot; : &quot;JWT&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;type
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;토큰의 타입을 나타낸다.&lt;/li&gt;
&lt;li&gt;항상 JWT로 고정하여 JWT임을 나타내는 식별자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;alg
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;SIGNATURE(서명) 생성에 사용하는 암호화 알고리즘&lt;/li&gt;
&lt;li&gt;예 : HS256, RS256 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. PAYLOAD(내용)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;영화관 입장권에 적힌 &quot;티켓의 주인, 어떤 권한이 있는지&quot;에 해당하는 정보&lt;/li&gt;
&lt;li&gt;토큰에 담길 실제 정보(예: 사용자 ID, 권한 등)&lt;/li&gt;
&lt;li&gt;Base64로 인코딩 되어 있어서 누구나 디코딩하면 읽을 수 있다.&lt;/li&gt;
&lt;li&gt;클레임(Claim)이라 불리는 사용자 정보 및 기타 데이터가 포함된다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Claim : 사용자의 정보를 담고 있는 데이터 조각&lt;/li&gt;
&lt;li&gt;클라이언트(사용자)가 로그인 후 발급받은 토큰에 이 클레임들이 포함되어 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776612370417&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;sub&quot;: &quot;1234567890&quot;,
  &quot;name&quot;: &quot;John Doe&quot;,
  &quot;admin&quot;: true,
  &quot;iat&quot;: 1516239022
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. SIGNATURE(서명)&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 티켓이 진짜라는 것을 증명하는 &quot;도장&quot;같은 부분&lt;/li&gt;
&lt;li&gt;무결성과 위변조 방지를 위해 사용&lt;/li&gt;
&lt;li&gt;토큰 위변조를 막기 위해 반드시 서버가 서명을 검증해야 한다.&lt;/li&gt;
&lt;li&gt;HEADER + PAYLOAD + 서버만 알고 있는 비밀키(Secret Key) = SIGNATURE
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이 세 가지를 alg에 명시된 암호화 알고리즘에 넣고 돌리면 SIGNATURE이 생성된다.&lt;/li&gt;
&lt;li&gt;Secret Key는 개발자 마음대로 세팅할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예시&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776612476212&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;HMACSHA256(
  base64UrlEncode(header) + &quot;.&quot; + base64UrlEncode(payload),
  secret
)

또는a-string-secret-at-least-256-bits-long&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;SIGNATURE가 중요한 이유&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 토큰을 위조하거나 PAYLOAD를 조작하더라도 서버가 서명을 다시 계산해서 검증하면 서명이 일치하지 않으면 즉시 거부된다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;전체 예시&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 JSON의 내용을 암호화하면 다음과 같은 결과가 나타난다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HEADER와 PAYLOAD를 인코딩한 것이 아래와 같다.&lt;/p&gt;
&lt;pre id=&quot;code_1776612663954&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 원래는 한줄인데 보기 편하게 .에 줄바꿈을 했습니다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HEADER : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9&lt;/li&gt;
&lt;li&gt;PAYLOAD : eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ&lt;/li&gt;
&lt;li&gt;SIGNATURE : SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brYtLQ/dJMcagL0dqF/a4HtAqcFAGEh6ODgls6kK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brYtLQ/dJMcagL0dqF/a4HtAqcFAGEh6ODgls6kK1/img.png&quot; data-alt=&quot;서버에 로그인 요청을 보냄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brYtLQ/dJMcagL0dqF/a4HtAqcFAGEh6ODgls6kK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrYtLQ%2FdJMcagL0dqF%2Fa4HtAqcFAGEh6ODgls6kK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;490&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;서버에 로그인 요청을 보냄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vJVtf/dJMcaiweuzP/RWriwTui2y0xfd3lFRK0k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vJVtf/dJMcaiweuzP/RWriwTui2y0xfd3lFRK0k1/img.png&quot; data-alt=&quot;요청 처리 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vJVtf/dJMcaiweuzP/RWriwTui2y0xfd3lFRK0k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvJVtf%2FdJMcaiweuzP%2FRWriwTui2y0xfd3lFRK0k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1775&quot; height=&quot;441&quot; data-origin-width=&quot;1775&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;요청 처리 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEItKf/dJMcaiweuzS/71wjZDKQdTlBKkkk7cjg11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEItKf/dJMcaiweuzS/71wjZDKQdTlBKkkk7cjg11/img.png&quot; data-alt=&quot;JWT 토큰 만드는 중&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEItKf/dJMcaiweuzS/71wjZDKQdTlBKkkk7cjg11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEItKf%2FdJMcaiweuzS%2F71wjZDKQdTlBKkkk7cjg11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1649&quot; height=&quot;442&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JWT 토큰 만드는 중&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ofeEx/dJMcabDUu3M/h6qRHV9gi4vSQyc4NMMtyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ofeEx/dJMcabDUu3M/h6qRHV9gi4vSQyc4NMMtyK/img.png&quot; data-alt=&quot;JWT 토큰완성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ofeEx/dJMcabDUu3M/h6qRHV9gi4vSQyc4NMMtyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FofeEx%2FdJMcabDUu3M%2Fh6qRHV9gi4vSQyc4NMMtyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1649&quot; height=&quot;442&quot; data-origin-width=&quot;1649&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;JWT 토큰완성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rw6CS/dJMcadPcbWs/odb9WzAllCimnHIlgHQ3Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rw6CS/dJMcadPcbWs/odb9WzAllCimnHIlgHQ3Nk/img.png&quot; data-alt=&quot;완성된 토큰과 함께 응답을 전달&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rw6CS/dJMcadPcbWs/odb9WzAllCimnHIlgHQ3Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frw6CS%2FdJMcadPcbWs%2Fodb9WzAllCimnHIlgHQ3Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;442&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;완성된 토큰과 함께 응답을 전달&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JHIpk/dJMcadn9EVK/KKaLw20vTWKvQLLqe8ZZjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JHIpk/dJMcadn9EVK/KKaLw20vTWKvQLLqe8ZZjk/img.png&quot; data-alt=&quot;받은 토큰을 쿠키에 저장&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JHIpk/dJMcadn9EVK/KKaLw20vTWKvQLLqe8ZZjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJHIpk%2FdJMcadn9EVK%2FKKaLw20vTWKvQLLqe8ZZjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;498&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;받은 토큰을 쿠키에 저장&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsoO7M/dJMcaiQwExo/Wo10DwJYTwWDSXkBGhbZyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsoO7M/dJMcaiQwExo/Wo10DwJYTwWDSXkBGhbZyk/img.png&quot; data-alt=&quot;사용자가 토큰과 함께 서버에 요청을 보냄&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsoO7M/dJMcaiQwExo/Wo10DwJYTwWDSXkBGhbZyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsoO7M%2FdJMcaiQwExo%2FWo10DwJYTwWDSXkBGhbZyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1081&quot; height=&quot;569&quot; data-origin-width=&quot;1081&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자가 토큰과 함께 서버에 요청을 보냄&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1607&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NmToT/dJMcaf0z51N/zrFRiQPEicdQ4niTAEvKHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NmToT/dJMcaf0z51N/zrFRiQPEicdQ4niTAEvKHk/img.png&quot; data-alt=&quot;토큰을 디코딩 중(토큰 분해)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NmToT/dJMcaf0z51N/zrFRiQPEicdQ4niTAEvKHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNmToT%2FdJMcaf0z51N%2FzrFRiQPEicdQ4niTAEvKHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1607&quot; height=&quot;561&quot; data-origin-width=&quot;1607&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;토큰을 디코딩 중(토큰 분해)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1605&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvyACe/dJMcaiQwExI/CWgMsTJpqZ2gTKS6DFmA60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvyACe/dJMcaiQwExI/CWgMsTJpqZ2gTKS6DFmA60/img.png&quot; data-alt=&quot;SIGNATURE 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvyACe/dJMcaiQwExI/CWgMsTJpqZ2gTKS6DFmA60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvyACe%2FdJMcaiQwExI%2FCWgMsTJpqZ2gTKS6DFmA60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1605&quot; height=&quot;553&quot; data-origin-width=&quot;1605&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SIGNATURE 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/soxq4/dJMcahxmWtc/2MzwkNjSjIZFJPndMQsP80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/soxq4/dJMcahxmWtc/2MzwkNjSjIZFJPndMQsP80/img.png&quot; data-alt=&quot;유효한 사용자임을 인증 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/soxq4/dJMcahxmWtc/2MzwkNjSjIZFJPndMQsP80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsoxq4%2FdJMcahxmWtc%2F2MzwkNjSjIZFJPndMQsP80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1007&quot; height=&quot;553&quot; data-origin-width=&quot;1007&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;유효한 사용자임을 인증 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[세션 vs JWT]&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&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;사용자가 입장권을 제시하면 서버가 메모리나 DB에 만들어 두었던 입장권 발급 목록 파일(=세션 스토어)에서 발급 번호를 가진 데이터를 조회하여 사용자를 통과시켜 주는 방식으로 진행된다.&lt;/li&gt;
&lt;li&gt;구현이 복잡하고 부하가 크지만 통제와 보안이 강하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 프로젝트 상황에 따라 다르게 사용해야 한다.&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 style=&quot;width: 12.5581%;&quot;&gt;추천 방식&lt;/td&gt;
&lt;td style=&quot;width: 87.4419%;&quot;&gt;상황&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5581%;&quot;&gt;JWT&lt;/td&gt;
&lt;td style=&quot;width: 87.4419%;&quot;&gt;단순 로그인, 서버 확장이 중요할 때, 또는 회원이 많아 입장권 목록을 조회하기 힘든경우&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.5581%;&quot;&gt;세션&lt;/td&gt;
&lt;td style=&quot;width: 87.4419%;&quot;&gt;민감한 정보를 다루고 통제가 중요할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;JWT 방식의 장점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stateless : 서버가 사용자 상태를 기억하지 않는다.&lt;/li&gt;
&lt;li&gt;사이트에 사용자가 많아질수록 서버에 부담이 적어진다.&lt;/li&gt;
&lt;li&gt;기존의 세션 방식은 사용자가 입장권을 제시할 때마다 서버에 있는 입장권 발급 목록 파일(=세션 스토어)에서 조회해야 하기 때문에 힘들어진다.&lt;/li&gt;
&lt;li&gt;JWT는 사용자가 입장권을 제시하면 입장권만 확인하면 되기 때문에 처리가 매우 빨라진다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;JWT 방식의 단점 및 문제&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 이슈&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;PAYLOAD는 암호화되어 있지 않다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Base64로 인코딩 되어 있어서 누구나 디코딩하면 읽을 수 있다.&lt;/li&gt;
&lt;li&gt;그래서 JWT에 민감한 정보를 넣어서는 안 된다. 최소한의 정보만 넣어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;클라이언트가 임의로 PAYLOAD를 조작할 수 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;예 : isAdmin:false &amp;rarr; true로 바꿈, exp(만료시간)을 미래로 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;하지만 서버는 토큰의 SIGNATURE(서명)을 검증하기 때문에 PAYLOAD가 조작되었으면 서명이 일치하지 않게 된다 &amp;rarr; 거부됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;무효화가 불가능하다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;이미 발급된 토큰은 서버가 통제할 수 없다.&lt;/li&gt;
&lt;li&gt;만약 해커가 토큰을 탈취하면 서버가 몰라도 계속 사용이 가능하다.&lt;/li&gt;
&lt;li&gt;토큰이 탈취되면 그 유효기간 동안은 막을 방법이 없다.&lt;/li&gt;
&lt;li&gt;세션 방식이면 세션 삭제로 끝나지만 JWT는 그런 중앙제어 포인트가 없다.&lt;/li&gt;
&lt;li&gt;사용자를 강제로 로그아웃 시키는 기능도 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 상황&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 유저가 A 기기에서 로그인한 상태에서 B기기에서 로그인을 하면 A기기를 자동로그아웃 시키고 싶다?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 세션 방식이면 가능,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; JWT는 이미 발급된 토큰을 제거 못 해서 불가능&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[JWT의 한계와 보완 방법(Refresh Token)]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT의 단점을 보완하기 위한 구조로 Access Token과 Refresh Token이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Access Token
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;짧은 수명(n분~n시간)&lt;/li&gt;
&lt;li&gt;인가(Authorization)를 받을 때마다 사용하는 주요 토큰&lt;/li&gt;
&lt;li&gt;탈취되더라도 금방 만료되므로 위험이 제한적&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Refresh Token&lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;긴 수명(보통 2~3주)&lt;/li&gt;
&lt;li&gt;Access Token이 만료됐을 때만 사용&lt;/li&gt;
&lt;li&gt;서버는 Refresh Token을 DB에 저장하여 관리&lt;/li&gt;
&lt;li&gt;클라이언트가 Refresh Token을 보내면 서버는 DB에서 검증 후 새 Access Token을 발급&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[장점]&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Access Token이 탈취돼도 수명이 짧아 오래 쓸 수 없다.&lt;/li&gt;
&lt;li&gt;Refresh Token을 DB에서 삭제하면 해당 사용자의 인증 갱신은 차단됨&amp;nbsp;&amp;rarr;사실상의 강제 로그아웃 기능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[단점]&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;완전 무효화는 불가능하다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Access Token은 만료 전까지 유효&lt;/li&gt;
&lt;li&gt;탈취 시 일정 시간 동안은 막을 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;구현 복잡도가 증가한다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;토큰 재발급 로직, 만료처리, 예외 처리 등 추가 작업 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Refresh Token 탈취 시 더 큰 위험
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;긴 수명을 가지므로 탈취되면 지속적으로 Access Token 재발급 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;완전한 Stateless 구조가 아니다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Refresh Token을 서버(DB)에 저장해야 하므로 상태 관리가 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기기별 로그인 관리가 복잡하다
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;여러 디바에스에서 로그인 시 토큰 관리 전략이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[정리]&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;세션 방식&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;JWT 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;상태 저장&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;서버가 세션 기억&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;서버는 아무것도 기억 안함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;저장 위치&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;서버 메모리, Redis 등&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;클라이언트가 JWT 보관&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;서버 확장성&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;따로 관리 필요&lt;br /&gt;서버 1대면 쉬움&lt;br /&gt;여러대면 복잡&lt;br /&gt;사용자 수가 많아지면 세션 관리 부담 커짐&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;유리 서버 여러대여도 문제 없음&lt;br /&gt;서버 확장에 유리(무상태 처리)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;보안&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;상대적으로 안전&lt;br /&gt;세션 ID 만료/삭제로 무효화 가능&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;노출되면 위험함&lt;br /&gt;JT는 한 번 발급되면 서버에서 취소 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;로그아웃&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;세션 삭제&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;토큰 만료 기다려야함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;유실 위험&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;서버 꺼지면 세션 날아감&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;토큰은 클라이언트에 있으니 유지됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;빠름(메모리),느림(DB)&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;토큰 검증만 하면 되니 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 17.4031%;&quot;&gt;관리와 제어&lt;/td&gt;
&lt;td style=&quot;width: 41.0077%;&quot;&gt;서버에서 개별 세션을 삭제/제어 가능&lt;/td&gt;
&lt;td style=&quot;width: 41.5891%;&quot;&gt;JWT는 한 번 발급되면 서버에서 취소 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jwt.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://jwt.io/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776604994645&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;JSON Web Tokens - jwt.io&quot; data-og-description=&quot;JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).&quot; data-og-host=&quot;www.jwt.io&quot; data-og-source-url=&quot;https://jwt.io/&quot; data-og-url=&quot;https://jwt.io&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bkzM5s/dJMb88F6RIg/fvE7AlWDtS04zhx6qMQhqK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/067yM/dJMb88e2BBb/UzdLRZcKbG74klKIMuksTk/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://jwt.io/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://jwt.io/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bkzM5s/dJMb88F6RIg/fvE7AlWDtS04zhx6qMQhqK/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/067yM/dJMb88e2BBb/UzdLRZcKbG74klKIMuksTk/img.png?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;JSON Web Tokens - jwt.io&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Signature (JWS).&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.jwt.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=XXseiON9CV0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=XXseiON9CV0&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=XXseiON9CV0&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cZlXRO/dJMb9g5c5jY/s74iKPMkkonFY0ZYh9adq0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/fsa0b/dJMb9g5c5jZ/mlvjS66eAghWgeJn6Olbak/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;코딩애플&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/XXseiON9CV0&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1QiOXWEbqYQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.youtube.com/watch?v=1QiOXWEbqYQ&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=1QiOXWEbqYQ&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/Wjxtx/dJMb9kT4Uvr/ckkmurFKbojw0ZQKydtVl1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/bFMT2v/dJMb9dHp5S1/JmntSKbqeLWdLNxeP1JSlK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720,https://scrap.kakaocdn.net/dn/be2QnF/dJMb9kmeHh5/9udPnkwzBzNFkqYKBEcYd0/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;얄팍한 코딩사전&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/1QiOXWEbqYQ&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[아이콘 출처]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a href=&quot;&lt;a href=&quot;https://www.flaticon.com/kr/free-icons/ui&quot;&gt;https://www.flaticon.com/kr/free-icons/ui&lt;/a&gt;&quot; title=&quot;ui 아이콘&quot;&amp;gt; Ui 아이콘 제작자: Freepik - Flaticon &amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a href=&quot;&lt;a href=&quot;https://www.flaticon.com/kr/free-icons/&quot;&gt;https://www.flaticon.com/kr/free-icons/&lt;/a&gt;&quot; title=&quot;암호화 아이콘&quot;&amp;gt; 암호화 아이콘 제작자: Freepik - Flaticon &amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a href=&quot;&lt;a href=&quot;https://www.flaticon.com/kr/free-icons/&quot;&gt;https://www.flaticon.com/kr/free-icons/&lt;/a&gt;&quot; title=&quot;하드디스크 아이콘&quot;&amp;gt; 하드디스크 아이콘 제작자: kerismaker - Flaticon &amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a href=&quot;&lt;a href=&quot;https://www.flaticon.com/kr/free-icons/-&quot;&gt;https://www.flaticon.com/kr/free-icons/-&lt;/a&gt;&quot; title=&quot;데이터 베이스 아이콘&quot;&amp;gt; 데이터 베이스 아이콘 제작자: Vectorslab - Flaticon &amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;a href=&quot;&lt;a href=&quot;https://www.flaticon.com/kr/free-icons/-&quot;&gt;https://www.flaticon.com/kr/free-icons/-&lt;/a&gt;&quot; title=&quot;램 메모리 아이콘&quot;&amp;gt; 램 메모리 아이콘 제작자: Freepik - Flaticon &amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 노트</category>
      <category>jwt</category>
      <category>Session</category>
      <category>개발자</category>
      <category>로그인</category>
      <category>세션</category>
      <category>인가</category>
      <category>인증</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/268</guid>
      <comments>https://devyihyun.tistory.com/268#entry268comment</comments>
      <pubDate>Wed, 6 May 2026 18:10:29 +0900</pubDate>
    </item>
    <item>
      <title>[React] 아토믹 디자인 패턴React] 아토믹 디자인 패턴 (Atomic Design Pattern)</title>
      <link>https://devyihyun.tistory.com/267</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCatq9/dJMcad2JFm9/WTp2O7GMPKRW3msFbTMgFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCatq9/dJMcad2JFm9/WTp2O7GMPKRW3msFbTMgFK/img.png&quot; data-alt=&quot;아토믹 디자인 패턴&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCatq9/dJMcad2JFm9/WTp2O7GMPKRW3msFbTMgFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCatq9%2FdJMcad2JFm9%2FWTp2O7GMPKRW3msFbTMgFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;631&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;631&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아토믹 디자인 패턴&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;들어가며&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴이란?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴구조(5단계)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴의 문제점&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴의 장단점&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴 예시&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;마무리&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/237&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://devyihyun.tistory.com/237&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1779349648209&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[React] 리액트 폴더 구조&quot; data-og-description=&quot;목차리액트 기본 폴더 및 파일src 내부 폴더 구조[번외] package.json [리액트 기본 폴더 및 파일]프로젝트를 진행하다 보면 관리해야 할 파일들이 늘어난다.파일들을 효율적으로 관리해야 하기 때문&quot; data-og-host=&quot;devyihyun.tistory.com&quot; data-og-source-url=&quot;https://devyihyun.tistory.com/237&quot; data-og-url=&quot;https://devyihyun.tistory.com/237&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wF2vz/dJMb86n3qnZ/Uo8Rni01x9AtQXNQvlvsR1/img.png?width=600&amp;amp;height=520&amp;amp;face=0_0_600_520,https://scrap.kakaocdn.net/dn/cuMrli/dJMb85vURq7/iBpd3FdYDHbkKkLMYkGDa0/img.png?width=600&amp;amp;height=520&amp;amp;face=0_0_600_520,https://scrap.kakaocdn.net/dn/qTuaj/dJMb8WMvtCp/cKZIfNjscdkYBaMcYhvTy1/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750&quot;&gt;&lt;a href=&quot;https://devyihyun.tistory.com/237&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://devyihyun.tistory.com/237&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wF2vz/dJMb86n3qnZ/Uo8Rni01x9AtQXNQvlvsR1/img.png?width=600&amp;amp;height=520&amp;amp;face=0_0_600_520,https://scrap.kakaocdn.net/dn/cuMrli/dJMb85vURq7/iBpd3FdYDHbkKkLMYkGDa0/img.png?width=600&amp;amp;height=520&amp;amp;face=0_0_600_520,https://scrap.kakaocdn.net/dn/qTuaj/dJMb8WMvtCp/cKZIfNjscdkYBaMcYhvTy1/img.png?width=750&amp;amp;height=750&amp;amp;face=0_0_750_750');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[React] 리액트 폴더 구조&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목차리액트 기본 폴더 및 파일src 내부 폴더 구조[번외] package.json [리액트 기본 폴더 및 파일]프로젝트를 진행하다 보면 관리해야 할 파일들이 늘어난다.파일들을 효율적으로 관리해야 하기 때문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;devyihyun.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[들어가며]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드 멘토링을 하면서 멘토링 프로젝트를 진행하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트를 진행하면서 협업 효율성과 유지보수성을 높이기 위해 디자인 패턴을 도입하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트 구조를 명확히 정의하고 역할과 복잡도에 따라 체계적으로 분리할 수 있다는 점, 그리고 일관된 UI를 빠르게 구현할 수 있다는 점에서 아토믹 디자인 패턴을 선택하게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[아토믹 디자인 패턴(Atomic Design Pattern)이란?]&lt;/b&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;페이지마다 폰트 크기, 색상, 테두리 스타일, 여백 등 디테일이 수정되면서 UI의 일관성이 무너져 사용자 경험이 저하되는 문제가 생기기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;원인&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트의 파편화 : 디자이너난 개발자들이 각자 따로 버튼을 만들게 됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;버튼마다 폰트 크기, 색상, 모양(테두리 둥글기), 등이 페이지마다 다르게 만들어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;명확한 컴포넌트 설계 기준 미비 : 팀원들 마다 컴포넌트를 나누는 기준이 다름&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;발생하는 문제점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;불필요한 대화 시간이 길어지고 소통에 오류가 생겨 유지보수가 힘들어진다.&lt;/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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결할 수 있도록 아토믹 디자인 패턴이 생겨났다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;디자인 시스템&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 조직이 디지털 인터페이스를 디자인하고 구축하는 방식&lt;/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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;아토믹 디자인 패턴(Atomic Design Pattern)&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 원자(Atom), 분자(Molecule), 유기체(Organism), 템플릿(Template), 페이지(Page)가 동시에 함께 작동하여 효과적인 인터페이스 디자인 시스템을 만드는 것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwU6h/dJMcajaPoM3/6uzc8WjhwELVnk3RRc4qh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwU6h/dJMcajaPoM3/6uzc8WjhwELVnk3RRc4qh0/img.png&quot; data-alt=&quot;아토믹 디자인 패턴의 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwU6h/dJMcajaPoM3/6uzc8WjhwELVnk3RRc4qh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkwU6h%2FdJMcajaPoM3%2F6uzc8WjhwELVnk3RRc4qh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아토믹 디자인 패턴의 구성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디자인 시스템을 만드는 방법론&lt;/li&gt;
&lt;li&gt;화학에서 원자(Atom) &amp;rarr; 분자(Molecule) &amp;rarr; 유기체(Organism) 순서로 점점 복잡한 구조로 쌓아가는 개념이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.6589%;&quot;&gt;단계&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;width: 39.8449%;&quot;&gt;예시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.6589%;&quot;&gt;Atom&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;가장 작은 단위&lt;/td&gt;
&lt;td style=&quot;width: 39.8449%;&quot;&gt;버튼, 라벨, 텍스트 입력 창&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.6589%;&quot;&gt;Molecule&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;Atom 여러개를 합친 것&lt;/td&gt;
&lt;td style=&quot;width: 39.8449%;&quot;&gt;검색 창(입력창 + 버튼)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.6589%;&quot;&gt;Organism&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;여러 Molcule/Atom을 묶은더 큰 덩어리&lt;/td&gt;
&lt;td style=&quot;width: 39.8449%;&quot;&gt;헤더(로고 + 메뉴 + 검색창)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.6589%;&quot;&gt;Template&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;실제 페이지 구조를 잡는 뼈대&lt;/td&gt;
&lt;td style=&quot;width: 39.8449%;&quot;&gt;상품 상세페이지 레이아웃&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.6589%;&quot;&gt;Page&lt;/td&gt;
&lt;td style=&quot;width: 44.4961%;&quot;&gt;실제 데이터가들어간 완성된 화면&lt;/td&gt;
&lt;td style=&quot;width: 39.8449%;&quot;&gt;진짜 사용자가 보는 장바구니 페이지&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 컴포넌트를 나누면 컴포넌트를 체계적으로 재사용성 높게 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아토믹 디자인은 선형(Linear) 프로세스가 아니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;207&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Hxj1/dJMcadIrsd1/zIXaHmmCLk3JHubeKxNKX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Hxj1/dJMcadIrsd1/zIXaHmmCLk3JHubeKxNKX0/img.png&quot; data-alt=&quot;아토믹 디자인 패턴의 폴더 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Hxj1/dJMcadIrsd1/zIXaHmmCLk3JHubeKxNKX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Hxj1%2FdJMcadIrsd1%2FzIXaHmmCLk3JHubeKxNKX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;207&quot; height=&quot;157&quot; data-origin-width=&quot;207&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아토믹 디자인 패턴의 폴더 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴을 사용하는 프로젝트의 폴더 구조이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Atoms &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; ㅡMolecules &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; Organisms &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; Template &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; Pages 순으로 구성되며, 컴포넌트의 추상화 수준에 따라 계층적으로 나뉜다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;하지만 대부분의 IDE에서는 폴더가 알파벳 순으로 정렬되기 때문에 Atoms&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt; &lt;/span&gt;Molecules&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Organisms&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Template&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Pages 순서로 폴더를 구성하더라도 Pages 폴더가 Tamplates보다 먼저 나오는 문제가 발생합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;그래서 저는 정렬 문제를 해결하고 의도한 계층 구조를 명확히 드러내기 위해 Pages를 제외한 폴더들(Atoms , Molecules, Organisms , Templates) 앞에 _(언더바)를 붙여주었습니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[아토믹 디자인 패턴 구조(5단계)]&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;원자(Atoms)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zYinl/dJMb990qbig/FQ9G5yts3duHAAOF5pkyS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zYinl/dJMb990qbig/FQ9G5yts3duHAAOF5pkyS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zYinl/dJMb990qbig/FQ9G5yts3duHAAOF5pkyS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzYinl%2FdJMb990qbig%2FFQ9G5yts3duHAAOF5pkyS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZc6bh/dJMb990qbii/pUQB3cIjcOBNWA1fJA44l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZc6bh/dJMb990qbii/pUQB3cIjcOBNWA1fJA44l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZc6bh/dJMb990qbii/pUQB3cIjcOBNWA1fJA44l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZc6bh%2FdJMb990qbii%2FpUQB3cIjcOBNWA1fJA44l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;ex) Label, Input, Button&lt;/li&gt;
&lt;li&gt;기본 HTML element 태그, 글꼴, 애니메이션, 컬러 팔레트, 레이아웃과 같이 추상적인 요소도 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;분자(Molecules)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1e8N8/dJMcaaye9Kr/TKwtdzIEAPHjkjhrKQ8hoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1e8N8/dJMcaaye9Kr/TKwtdzIEAPHjkjhrKQ8hoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1e8N8/dJMcaaye9Kr/TKwtdzIEAPHjkjhrKQ8hoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1e8N8%2FdJMcaaye9Kr%2FTKwtdzIEAPHjkjhrKQ8hoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nrRdE/dJMcahYpLbg/9IdiwMWLnq0k1LMzHpZnbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nrRdE/dJMcahYpLbg/9IdiwMWLnq0k1LMzHpZnbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nrRdE/dJMcahYpLbg/9IdiwMWLnq0k1LMzHpZnbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnrRdE%2FdJMcahYpLbg%2F9IdiwMWLnq0k1LMzHpZnbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 단위로 함께 기능하는 비교적 단순한 UI 요소의 집합&lt;/li&gt;
&lt;li&gt;여러 Atom을 결합하여 최소 한 가지 기능을 수행한다.&lt;/li&gt;
&lt;li&gt;단일 책임 원칙(SRP : Sigle Responsibillity Principle)을 준수
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한 가지 일을 잘하라는 사고방식을 장려하는 오래된 컴퓨터 과학 원칙&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;재사용이 가능한 컴포넌트가 생긴다.&lt;/li&gt;
&lt;li&gt;molecule의 SRP는 재사용성과 UI에서의 일관성, 테스트하기 쉬운 장점을 가지고 있다.&lt;/li&gt;
&lt;li&gt;[단점] 단일 패턴에 너무 많은 복잡성을 부여하면 소프트웨어가 다루기 어려워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;유기체(Organisms)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r9a5S/dJMcaipvaFt/7PKfJL1unRnZqyqZGLT6c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r9a5S/dJMcaipvaFt/7PKfJL1unRnZqyqZGLT6c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r9a5S/dJMcaipvaFt/7PKfJL1unRnZqyqZGLT6c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr9a5S%2FdJMcaipvaFt%2F7PKfJL1unRnZqyqZGLT6c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRMkmD/dJMcaipvaFp/KNtYw1ZDeoDAGfhxGKdf6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRMkmD/dJMcaipvaFp/KNtYw1ZDeoDAGfhxGKdf6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRMkmD/dJMcaipvaFp/KNtYw1ZDeoDAGfhxGKdf6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRMkmD%2FdJMcaipvaFp%2FKNtYw1ZDeoDAGfhxGKdf6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Molecules + Atoms을 모아서 만들며 사용자에게 의미와 역할이 존재하는 단위&lt;/li&gt;
&lt;li&gt;Atom이나 Molecule보다 더 복잡하다.&lt;/li&gt;
&lt;li&gt;재사용 가능하지만 재사용성은 Atom/Molecule보다 낮다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;특정한 컨텍스트와 목적에 맞춰 구성되기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;서비스에서 표현될 수 있는 명확한 영역과 특정 컨텍스트를 가진다.&lt;/li&gt;
&lt;li&gt;단순한 기능 이상의 구체적인 목적과 맥락을 가진 UI 덩어리다.&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;템플릿(Template)&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style16&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhL0A/dJMcadBDxjO/5gAamYI6tsjlOiD6IQkdMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhL0A/dJMcadBDxjO/5gAamYI6tsjlOiD6IQkdMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhL0A/dJMcadBDxjO/5gAamYI6tsjlOiD6IQkdMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuhL0A%2FdJMcadBDxjO%2F5gAamYI6tsjlOiD6IQkdMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yuu6c/dJMcabjDfdm/kKYDLi3kUkHZUW1Np3Nj71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yuu6c/dJMcabjDfdm/kKYDLi3kUkHZUW1Np3Nj71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yuu6c/dJMcabjDfdm/kKYDLi3kUkHZUW1Np3Nj71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyuu6c%2FdJMcabjDfdm%2FkKYDLi3kUkHZUW1Np3Nj71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 개의 organism, molecule로 구성&lt;/li&gt;
&lt;li&gt;레이아웃에 실제 콘텐츠나 데이터 없이 컴포넌트를 배치해 page 구조를 설계&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;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;페이지(page)&lt;/b&gt;&lt;/h3&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 style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYC8Ic/dJMcahYpLYJ/CJIHkIrKfJJqklc3BTyGhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYC8Ic/dJMcahYpLYJ/CJIHkIrKfJJqklc3BTyGhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYC8Ic/dJMcahYpLYJ/CJIHkIrKfJJqklc3BTyGhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYC8Ic%2FdJMcahYpLYJ%2FCJIHkIrKfJJqklc3BTyGhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btZ2s6/dJMcagkTvKg/HQOuhK8jkQKNafCs0Iyyjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btZ2s6/dJMcagkTvKg/HQOuhK8jkQKNafCs0Iyyjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btZ2s6/dJMcagkTvKg/HQOuhK8jkQKNafCs0Iyyjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtZ2s6%2FdJMcagkTvKg%2FHQOuhK8jkQKNafCs0Iyyjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;템플릿에 실제 data가 결합이 되어 사용자에게 전달이 되는 최종 디자인의 형태&lt;/li&gt;
&lt;li&gt;유저가 볼 수 있는 실제 콘텐츠를 담고 있다.&lt;/li&gt;
&lt;li&gt;template의 인스턴스&lt;/li&gt;
&lt;li&gt;page template에 대표 텍스트, 이미지, 미디어를 추가하여 실제 콘텐츠가 어떻게 동작하는지 보여줄 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;요약&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Atom : 더 이상 쪼갤 수 없는 디자인의 최소 단위&lt;/li&gt;
&lt;li&gt;Molecule : Atoms를 모아서 만들어진다. 최소 한 가지 기능을 수행한다.&lt;/li&gt;
&lt;li&gt;Organism : Molecule + Atom을 모아서 만들며 사용자에게 의미와 역할이 존재하는 단위&lt;/li&gt;
&lt;li&gt;Template : 아직 데이터는 연결되어있지 않은 최종 레이아웃의 형태, 여러 개의 Organism으로 구성된다.&lt;/li&gt;
&lt;li&gt;Page : 템플릿에 실제 data가 결합이 되어 사용자에게 전달이 되는 최종 디자인의 형태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[아토믹 디자인 패턴의 문제점]&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;컴포넌트 분류 기준의 모호함&lt;/li&gt;
&lt;li&gt;유사한 UI 변형으로 인한 중복 또는 과도한 props&lt;/li&gt;
&lt;li&gt;Organism 책임 범위의 정의 재정립&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. 컴포넌트 분류 기준의 모호함&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;lt;문제점&amp;gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Atom, Molecule, Organism의 구분 기준이 명확하지 않아 팀원마다 해석이 달라지고 설계 일관성이 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 내 컴포넌트 리뷰나 재사용 시 오해가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PuOCl/dJMcacphyW7/iCEfKm1K1A1AIfLCvrLpB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PuOCl/dJMcacphyW7/iCEfKm1K1A1AIfLCvrLpB1/img.png&quot; data-alt=&quot;카카오 페이지 웹에서 실제로 작성한 molecule, organism 컴포넌트&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PuOCl/dJMcacphyW7/iCEfKm1K1A1AIfLCvrLpB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPuOCl%2FdJMcacphyW7%2FiCEfKm1K1A1AIfLCvrLpB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;389&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카카오 페이지 웹에서 실제로 작성한 molecule, organism 컴포넌트&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;원인&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SRP(single Responsibility Principle)에 기반하지 않은 직관적 분류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명확한 기준 없이 직관적으로 분류하다 보니 컴포넌트가 의도치 않게 중복되거나 역할 범위가 애매해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Molecule과 Organism의 구분이 자주 헷갈림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;해결책&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Atom
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더 이상 쪼갤 수 없는 UI 단위&lt;/li&gt;
&lt;li&gt;ex) 텍스트, 버튼, 아이콘 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Molecule
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Atom으로 구성된 UI적 요소&lt;/li&gt;
&lt;li&gt;재사용하기 쉬움&lt;/li&gt;
&lt;li&gt;context 없음&lt;/li&gt;
&lt;li&gt;ex) 버튼 크룹, 입력 박스&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Organism
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Atom, Molecule, Organism으로 구성된 Layout 중심의 블록&lt;/li&gt;
&lt;li&gt;context 포함&lt;/li&gt;
&lt;li&gt;ex) 댓글 목록 영역, 툴바 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모호한 경우 Organism으로 작성한 후에 코드 리뷰로 조정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. 유사한 UI 변형으로 인한 중복 또는 과도한 props&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;문제점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷한 디자인이지만 구조가 다른 경우 중복된 컴포넌트 생성 또는 props 남용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o8Fyg/dJMcagSKUl5/pvJ2Cu4htbm59U0DMrRdo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o8Fyg/dJMcagSKUl5/pvJ2Cu4htbm59U0DMrRdo1/img.png&quot; data-alt=&quot;댓글과 디자인이 비슷하지만 약간 다른 대댓글 디자인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o8Fyg/dJMcagSKUl5/pvJ2Cu4htbm59U0DMrRdo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo8Fyg%2FdJMcagSKUl5%2FpvJ2Cu4htbm59U0DMrRdo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;233&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;233&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;댓글과 디자인이 비슷하지만 약간 다른 대댓글 디자인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;원인&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기존 해결 방안&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 컴포넌트 만들기&amp;nbsp;&amp;rarr; 중복되는 컴포넌트가 많아지고 중복 코드가 많아진다.&lt;/li&gt;
&lt;li&gt;기존 컴포넌트에 props를 계속 추가하기 &amp;rarr; props가 점점 많아져서 쓰기 복잡해 유지보수성이 떨어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 구조에서는 고정된 컴포넌트 구조에 다양한 UI 변형을 대응하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;해결법&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Compound 컴포넌트 패턴 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1776597286713&quot; class=&quot;typescript&quot; data-ke-language=&quot;typescript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Comment&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;Comment.ProfileImage /&amp;gt;
    &amp;lt;Comment.Name /&amp;gt;
    &amp;lt;Comment.Info /&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;Comment.Content /&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;Icon type={IconType.Heart} /&amp;gt;
    ...
  &amp;lt;div /&amp;gt;
&amp;lt;/Comment&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필요한 부분만 조합해서 사용 가능&lt;/li&gt;
&lt;li&gt;컴포넌트 수와 props 수를 동시에 줄임&lt;/li&gt;
&lt;li&gt;Organism 구조를 다시 정의&lt;/li&gt;
&lt;li&gt;atom/molecule 단위로 더 쪼개서 재조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. Organism 책임 범위의 정의 재정립&lt;/b&gt;&lt;/h3&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;문제점&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Organism을 어디까지 묶어야 할지 명확하지 않아 과도하게 크거나 작은 단위로 분리되는 문제가 발생 &amp;rarr; 팀원 간 기준이 달라 정리와 협업에 어려움이 생김&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehuKzA/dJMcabRqAv6/8lsupsQYLTwhgUJAReA6G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehuKzA/dJMcabRqAv6/8lsupsQYLTwhgUJAReA6G0/img.png&quot; data-alt=&quot;카카오 페이지의 댓글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehuKzA/dJMcabRqAv6/8lsupsQYLTwhgUJAReA6G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehuKzA%2FdJMcabRqAv6%2F8lsupsQYLTwhgUJAReA6G0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;281&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;카카오 페이지의 댓글&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;원인&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;역할의 경계가 불분명&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Layout 기분만으로 Organism을 정의하면 기능적 책임이 불분명해질 수 있고 네이밍이나 구조도 일관성을 잃기 쉽다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;lt;해결법&amp;gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Orgnism은 단순히 시각적으로 나뉜 영역이 아닌 의미 있는 기능적 책임을 갖는 UI 단위로 정의해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Layout 책임 단위로 정의&lt;/li&gt;
&lt;li&gt;Layout에서 명확히 나뉘는 영역을 기준으로 Oragnism 분할&lt;/li&gt;
&lt;li&gt;하나의 UI 책임 단위를 기준으로 묶기(ex: 댓글 툴바, 댓글 리스트 등)&lt;/li&gt;
&lt;li&gt;기능 중심 네이밍보다는 역할 중심 네이밍 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lt;판단 기준&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI 상에서 명확히 구분되는 영역 : 페이지에서 시각적으로 독립된 UI 블록을 기준으로 나눈다.(ex: 댓글 영역, 추천 콘텐츠 영역)&lt;/li&gt;
&lt;li&gt;기능적 책임 : 해당 UI가 하나의 기능을 독립적으로 수행하는가? (ex: 댓글 작성, 댓글 리스트 출력 등)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;예시&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CommentListToolBar : 댓글 데이터를 정렬, 필터 하는 기능이 있는 Organism&lt;/li&gt;
&lt;li&gt;CommentList : 각 댓글의 레이아웃을 구성하며, 댓글 아이템을 리스트로 나열하고 spacing을 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[아토믹 디자인 패턴의 장단점]&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;장점&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부분과 전체를 모두 고려한 설계 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI를 원자, 분자, 유기체, 템플릿, 페이지 단위로 나누어 구성&lt;/li&gt;
&lt;li&gt;각 컴포넌트 단위의 품질뿐만 아니라 전체 맥락에서의 일관성과 기능성 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;구조와 콘텐츠 분리로 유연한 디자인
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;콘텐츠와 레이아웃 구조를 분리해 다양한 상황에 대응 가능&lt;/li&gt;
&lt;li&gt;예 : 템플릿에서 콘텐츠 구조만 설정, 페이지 단계에서 실제 데이터 주입&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;협업 효율성 증가
&lt;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;UI 모델링을 공동으로 진행하며 명확한 기준을 마련&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컴포넌트 재사용성과 유지보수 용이
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI 상태나 로직은 외부에서 주입(props활용)&lt;/li&gt;
&lt;li&gt;레이아웃 관련 스타일은 컴포넌트 밖에서 처리&lt;/li&gt;
&lt;li&gt;결과적으로 컴포넌트는 더 순수해지고, 테스트와 관리가 쉬워짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;멘탈 모델로서의 유용성
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단계 간 계층 구조를 쉽게 이해할 수 있어 팀원 같 커뮤니케이션에 효과적&lt;/li&gt;
&lt;li&gt;원자-분자-유기체처럼 이름만으로도 구조 이해가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;lt;단점&amp;gt;&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;컴포넌트 분류 기준의 모호함&lt;/li&gt;
&lt;li&gt;유사한 UI 변형으로 인한 중복 또는 과도한 props&lt;/li&gt;
&lt;li&gt;Organism 책임 범위의 정의 재정립&lt;/li&gt;
&lt;li&gt;과도한 분해로 복잡성 증가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;너무 작은 단위까지 나누다 보면 오히려 컴포넌트 간 연결 관계가 복잡해짐.&lt;/li&gt;
&lt;li&gt;결과적으로 유지보수가 오히려 어려워질 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;설계 초기 비용 증가
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UI를 구조적으로 나누고 모델링하는 데 초기 시간이 많이 소요됨&lt;/li&gt;
&lt;li&gt;빠른 MVP 단계에서는 부담이 될 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;조직과 팀마다 다른 해석 가능
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&quot;원자, 분자, 유기체&quot; 용어가 명확해 보여도 조직마다 의미 해석이 다를 수 있음&lt;/li&gt;
&lt;li&gt;문서 내에서도 GE 팀처럼 자체 분류법을 따르는 사례가 나옴&amp;nbsp;&amp;rarr; 표준화 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;예 :유연한 인터렉션이 많은 UI에는 부적합할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[아토믹 디자인 패턴 예시]&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dm0uJY/dJMcagkTxcE/yCwT3UJLfLqcF5QjzKDLV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dm0uJY/dJMcagkTxcE/yCwT3UJLfLqcF5QjzKDLV0/img.png&quot; data-alt=&quot;Atomic design applied to the native mobile app Instagram.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dm0uJY/dJMcagkTxcE/yCwT3UJLfLqcF5QjzKDLV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdm0uJY%2FdJMcagkTxcE%2FyCwT3UJLfLqcF5QjzKDLV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2048&quot; height=&quot;1353&quot; data-origin-width=&quot;2048&quot; data-origin-height=&quot;1353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Atomic design applied to the native mobile app Instagram.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;원자(Atom)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;인스타그램 UI&lt;/li&gt;
&lt;li&gt;아이콘, 텍스트 수준의 요소로 두 가지 이미지 유형( 게시글이미지, 프로필 이미지)으로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분자(Molecule)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;간단하고 실용적인 구성요소를 형성&lt;/li&gt;
&lt;li&gt;아이콘 그룹으로 만들어진 Navbar&lt;/li&gt;
&lt;li&gt;사용자가 사진에 좋아요를 누르거나 댓글을 달 수 있는 사진 작업 바&lt;/li&gt;
&lt;li&gt;텍스트 + 이미지 조합으로 만들어진 프로필 바&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유기체(Organism)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;유기체가 형성되는 복합 구성으로 인스타그램 전체 경험의 초석이 된다.&lt;/li&gt;
&lt;li&gt;사용자 정보, 이미지, 사진과 관련된 동작, 좋아요 수 등 사진 관련 정보로 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;템플릿(Template)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;레이아웃의 맥락에서 구성요소들이 어떻게 결합되는지 확인할 수 있다.&lt;/li&gt;
&lt;li&gt;인스타그램의 콘텐츠 골격을 보여준다.&lt;/li&gt;
&lt;li&gt;사용자 아이디, 아바타, 사진, 좋아요 수 같은 동적 콘텐츠 강조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;페이지(Page)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;실제 콘텐츠가 주입된 최종 제품&lt;/li&gt;
&lt;li&gt;기본 디자인 시스템이 함께 모여 기능적인 UI를 형성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[마무리 : 나의 생각]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아토믹 디자인 패턴을 공부하면서 의문이 생겼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;파란색 기본 버튼이 atom이라면 빨간색 취소 버튼은 뭐지?&quot;, &quot;아이콘이 들어간 버튼은 atom일까 molecule일까?&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 버튼의 변형들을 Molecule이라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;atom 단계에서는 버튼의 기본 형태만 만들고 빨간색 취소 버튼이나 아이콘이 들어간 버튼처럼 디자인이 바뀌거나 기능이 추가된 형태는 Molecule이라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 atom은 단순 베이스 역할을 하고 실제로 사용하는 molecule에서 만든다는 논리라고 생각했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;내가 생각한 아토믹 디자인 패턴&amp;gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;atom : 기본 버튼, 기본 텍스트, 컬러 같은 기본 단위 만들기&lt;/li&gt;
&lt;li&gt;molecule : 기본 버튼, 취소 버튼, 아이콘 버튼, 제목 텍스트, 설명 텍스트 등&lt;/li&gt;
&lt;li&gt;organism : molecule들을 조합해서 organism으로 만들기&lt;/li&gt;
&lt;li&gt;template : organism들을 레이아웃에 배치&lt;/li&gt;
&lt;li&gt;page : template에 실제 데이터를 넣은 것&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;버튼은 여전히 atom이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼의 색상, 텍스트, 아이콘 유무 같은 것은 props로 조절되는 속성일 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 파란색이든 빨간색이든 텍스트만 있던 아이콘이 있든 기능적으로 버튼이라는 역할을 하고 있다면 여전히 atom이라는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Molecule은 서로 다른 Atom이 조합되어 새로운 의미를 가지는 경우에 해당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 text와 input 필드가 함께 있는 FormField 같은 것이 대표적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서로 독립적으로 사용될 수 있는 Atom들이 조합되어 하나의 유의미한 UI 조각을 이룰 때 그것이 Molecule이 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 내가 처음에 헷갈렸던 이유는 &quot;디자인이 다르면 다른 단위로 나워야 한다&quot;라는 생각 때문이었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아토믹 디자인에서는 스타일이 아닌 역할과 조합 방식이 기준이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 깨닫고 나니 atomic design을 조금 더 명확하게 이해할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 컴포넌트라도 기능과 조합 구조를 기준으로 나누어야 하고 스타일이나 변형은 컴포넌트 안에서 props로 유연하게 처리하면 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 이해하고 나닌 컴포넌트를 나누는 기준을 알게 되었고 스타일기준이 아닌 기능과 조합이 기준이라는 것을 알게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://atomicdesign.bradfrost.com/chapter-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://atomicdesign.bradfrost.com/chapter-2/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776598695188&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Atomic Design Methodology | Atomic Design by Brad Frost&quot; data-og-description=&quot;Learn how to create and maintain digital design systems, allowing your team to roll out higher quality, more consistent UIs faster than ever before.&quot; data-og-host=&quot;atomicdesign.bradfrost.com&quot; data-og-source-url=&quot;https://atomicdesign.bradfrost.com/chapter-2/&quot; data-og-url=&quot;http://atomicdesign.bradfrost.com/chapter-2/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dhdS4S/dJMb8U8VvQC/JQSiZMRPlEDYkdACD8BgRk/img.jpg?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500&quot;&gt;&lt;a href=&quot;https://atomicdesign.bradfrost.com/chapter-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://atomicdesign.bradfrost.com/chapter-2/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dhdS4S/dJMb8U8VvQC/JQSiZMRPlEDYkdACD8BgRk/img.jpg?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Atomic Design Methodology | Atomic Design by Brad Frost&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn how to create and maintain digital design systems, allowing your team to roll out higher quality, more consistent UIs faster than ever before.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;atomicdesign.bradfrost.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tech.kakaoent.com/front-end/2022/220505-how-page-part-use-atomic-design-system/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://tech.kakaoent.com/front-end/2022/220505-how-page-part-use-atomic-design-system/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776598674948&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;아토믹 디자인을 활용한 디자인 시스템 도입기 | 카카오엔터테인먼트 테크블로그&quot; data-og-description=&quot;정호일(harry) 카카오페이지에서 웹 프론트엔드를 개발하고 있습니다. 집보다 밖에 돌아다니는 걸 좋아합니다.&quot; data-og-host=&quot;tech.kakaoent.com&quot; data-og-source-url=&quot;https://tech.kakaoent.com/front-end/2022/220505-how-page-part-use-atomic-design-system/&quot; data-og-url=&quot;https://tech.kakaoent.com/front-end/2022/220505-how-page-part-use-atomic-design-system/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://tech.kakaoent.com/front-end/2022/220505-how-page-part-use-atomic-design-system/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tech.kakaoent.com/front-end/2022/220505-how-page-part-use-atomic-design-system/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;아토믹 디자인을 활용한 디자인 시스템 도입기 | 카카오엔터테인먼트 테크블로그&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;정호일(harry) 카카오페이지에서 웹 프론트엔드를 개발하고 있습니다. 집보다 밖에 돌아다니는 걸 좋아합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tech.kakaoent.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://slash.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://slash.tistory.com/14&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776598684595&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Atomic Design 예시&quot; data-og-description=&quot;목표 이전 글에서 Atomic Design 패턴에 대해서 알아보았다. 이번에는 Atomic Design 패턴을 통해 직접 간단한 페이지 하나를 만들 예정이다. 사용한 기술 정리 [x] React.js [x] Styled-Components 시작하기 우선 &quot; data-og-host=&quot;slash.tistory.com&quot; data-og-source-url=&quot;https://slash.tistory.com/14&quot; data-og-url=&quot;https://slash.tistory.com/14&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/QByT8/dJMb8TCbzCw/WqlfNlp9IREVi2yodhs6Kk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/84UAc/dJMb8UHQ4L6/vWzklcTMlGdUVzY9qIxD0k/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bIQo82/dJMb8PGx249/HJz2tKPFy3OA6DKSrK9iW0/img.png?width=2986&amp;amp;height=1016&amp;amp;face=0_0_2986_1016&quot;&gt;&lt;a href=&quot;https://slash.tistory.com/14&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://slash.tistory.com/14&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/QByT8/dJMb8TCbzCw/WqlfNlp9IREVi2yodhs6Kk/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/84UAc/dJMb8UHQ4L6/vWzklcTMlGdUVzY9qIxD0k/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bIQo82/dJMb8PGx249/HJz2tKPFy3OA6DKSrK9iW0/img.png?width=2986&amp;amp;height=1016&amp;amp;face=0_0_2986_1016');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Atomic Design 예시&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;목표 이전 글에서 Atomic Design 패턴에 대해서 알아보았다. 이번에는 Atomic Design 패턴을 통해 직접 간단한 페이지 하나를 만들 예정이다. 사용한 기술 정리 [x] React.js [x] Styled-Components 시작하기 우선&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;slash.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/1531/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yozm.wishket.com/magazine/detail/1531/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776598691318&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Atomic Design Pattern의 Best Practice 여정기 | 요즘IT&quot; data-og-description=&quot;좋은 폴더 구조에 관한 이야기는 개발자들 간의 끊임없는 떡밥입니다. 정답이 있지 않고 프로젝트의 특징이나 크기, 주관적인 해석에 따라 정말 여러 가지 방법들이 존재하기 때문입니다. 마치 &quot; data-og-host=&quot;yozm.wishket.com&quot; data-og-source-url=&quot;https://yozm.wishket.com/magazine/detail/1531/&quot; data-og-url=&quot;https://yozm.wishket.com/magazine/detail/1531/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/pbsaj/dJMb9eTRAYe/XWkhpbZAkxrUXEmb5gbOn1/img.png?width=1022&amp;amp;height=768&amp;amp;face=0_0_1022_768,https://scrap.kakaocdn.net/dn/bIVP6o/dJMb8XR7CsQ/h5skOTjapi3b0sHzVaGuN0/img.png?width=1022&amp;amp;height=768&amp;amp;face=0_0_1022_768,https://scrap.kakaocdn.net/dn/PSzyc/dJMb9iaS4fk/XwROp1jufqoZ2BlRBhy63K/img.png?width=1378&amp;amp;height=910&amp;amp;face=0_0_1378_910&quot;&gt;&lt;a href=&quot;https://yozm.wishket.com/magazine/detail/1531/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://yozm.wishket.com/magazine/detail/1531/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/pbsaj/dJMb9eTRAYe/XWkhpbZAkxrUXEmb5gbOn1/img.png?width=1022&amp;amp;height=768&amp;amp;face=0_0_1022_768,https://scrap.kakaocdn.net/dn/bIVP6o/dJMb8XR7CsQ/h5skOTjapi3b0sHzVaGuN0/img.png?width=1022&amp;amp;height=768&amp;amp;face=0_0_1022_768,https://scrap.kakaocdn.net/dn/PSzyc/dJMb9iaS4fk/XwROp1jufqoZ2BlRBhy63K/img.png?width=1378&amp;amp;height=910&amp;amp;face=0_0_1378_910');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Atomic Design Pattern의 Best Practice 여정기 | 요즘IT&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;좋은 폴더 구조에 관한 이야기는 개발자들 간의 끊임없는 떡밥입니다. 정답이 있지 않고 프로젝트의 특징이나 크기, 주관적인 해석에 따라 정말 여러 가지 방법들이 존재하기 때문입니다. 마치&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;yozm.wishket.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/React</category>
      <category>Atomic Design Pattern</category>
      <category>react</category>
      <category>개발자</category>
      <category>디자인패턴</category>
      <category>리액트</category>
      <category>아토믹디자인패턴</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/267</guid>
      <comments>https://devyihyun.tistory.com/267#entry267comment</comments>
      <pubDate>Thu, 30 Apr 2026 18:10:37 +0900</pubDate>
    </item>
    <item>
      <title>[IT노트] 패키지 매니저란? / npm, yarn, pnpm 정리</title>
      <link>https://devyihyun.tistory.com/266</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LQOAa/dJMcagrFrBY/mdzB8mkcvDLJDk7sjSSTL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LQOAa/dJMcagrFrBY/mdzB8mkcvDLJDk7sjSSTL0/img.png&quot; data-alt=&quot;패키지 매니저란?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LQOAa/dJMcagrFrBY/mdzB8mkcvDLJDk7sjSSTL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLQOAa%2FdJMcagrFrBY%2FmdzB8mkcvDLJDk7sjSSTL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;537&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;패키지 매니저란?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;패키지 매니저가 필요한 이유&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;패키지 매니저란?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;패키지 매니저의 동작 원리&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Link 방식에 따른 차이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;npm, yarn, pnpm 한눈에 비교&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;왜 여러 패키지 매니저가 존재할까?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정리&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[패키지 매니저가 필요한 이유]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저는 프로젝트에서 라이브러리, 프레임워크, 모듈 등의 패키지를 관리하는 도구다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요한 패키지를 설치, 업데이트, 삭제, 설정할 수 있도록 도와준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서는 npm, yarn, pnpm 등이 대표적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;자바스크립트에서 패키지 매니저가 필요한 이유&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;문제 상황 : 경로만 쓰면 버전이 모호하다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트/타입스크립트에서 외부 라이브러리를 가져올 때 개발자는 'react'와 '@toass/utils'처럼 간단히 라이브러리 이름만 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1776582003885&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import React from 'react';
import { sum } from '@toss/utils';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 컴퓨터는 이 파일을 어디서 가져와야 하는지, 어떤 버전의 라이브러리를 사용해야 하는지 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 표준에서는 라이브러리를 가져올 때 정확한 경로를 알아야 하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 React 라이브러리는 18 버전과 19 버전이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'react'라고만 작성해 두면 컴퓨터는 어떤 버전을 사용해야 할지 모른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전과 경로를 매번 직접 명시하면 해결할 수 있겠지만 개발 과정에서 긴 경로를 계속 작성하는 것은 번거로운 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;해결책 : package.json&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 package.json에 필요한 라이브러리와 버전 범위를 명시해 둔다.&lt;/p&gt;
&lt;pre id=&quot;code_1776582154281&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;dependencies&quot;: {
    &quot;react&quot;: &quot;^18.2.0&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;^18.2.0&quot; : 18.2.0 이상, 19 버전 미만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 설치된 라이브러리는 우리가 코드에서 import React from 'react'라고 썼을 때 자동으로 연결되어 사용할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 라이브러리를 정확한 버전으로 설치할 수 있도록 도와주는 것이 패키지 매니저다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[패키지 매니저란?]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저는 package.json에 적힌 라이브러리를 정확한 버전으로 설치하고 코드에서 문제없이 불러올 수 있도록 연결해 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Es9jN/dJMb9969Pu9/ftBkLTcIayWeRhU3OyE701/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Es9jN/dJMb9969Pu9/ftBkLTcIayWeRhU3OyE701/img.png&quot; data-alt=&quot;출처 : https://toss.tech/article/lightning-talks-package-manager -&amp;amp;gt; yarn을 터미널에 실행했을 때 볼 수 있는 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Es9jN/dJMb9969Pu9/ftBkLTcIayWeRhU3OyE701/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEs9jN%2FdJMb9969Pu9%2FftBkLTcIayWeRhU3OyE701%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1056&quot; height=&quot;416&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처 : https://toss.tech/article/lightning-talks-package-manager -&amp;gt; yarn을 터미널에 실행했을 때 볼 수 있는 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[패키지 매니저의 동작 원리]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저가 동작하는 세 단계가 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Resolution 단계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라이브러리 버전 고정&lt;/li&gt;
&lt;li&gt;라이브러리의 다른 의존성 확인&lt;/li&gt;
&lt;li&gt;라이브러리의 다른 의존성 버전 고정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fetch 단계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결정된 버전의 파일을 다운로드하는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Link 단계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Resolution/Fetch 된 라이브러리를 소스코드에서 사용할 수 있는 환경을 제공하는 과정&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Resolution 단계&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resolution 단계는 package.json에 적힌 범위를 실제 설치할 구체적인 버전으로 확정하고 모든 의존성과 그 하위 의존성까지 버전을 고정해 lock파일에 기록하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 기기에서 고정된 버전을 사용할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의존성 버전을 전부 고정시키고 의존성의 의존성을 다 찾아서 그 버전도 고정시켜 yarn.lock이나 package-lock.json에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전을 고정하기 위해서는 세 가지의 단계를 거쳐야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;라이브러리 버전 고정&lt;/li&gt;
&lt;li&gt;라이브러리의 다른 의존성 확인&lt;/li&gt;
&lt;li&gt;라이브러리의 다른 의존성 버전 고정&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Resolution 1. 라이브러리 버전 고정]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫 번째 단계에서는 package.json에 명시된 라이브러리 버전 범위를 실제 버전으로 확정하는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json에는 버전의 범위가 적혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저는 이 범위 안에서 가장 적절한 버전을 딱 하나 골라야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1776582666876&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;dependencies&quot;: {
    &quot;react&quot;: &quot;^18.2.0&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 react:^18.2.0이라고 적혀있다면 18.2.0 이상 19 미만이라는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통은 가장 최신 버전을 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 실제 설치는 최신 버전인 18.3.1을 선택할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Resolution 2. 라이브러리의 다른 의존성 확인]&lt;/b&gt;&lt;/h4&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;예를 들어 @toss/use-overlay라는 라이브러리는 내부적으로 react를 필요로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 react도 또 다른 의존성이 있을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 설치한 라이브러리가 또 다른 라이브러리를 요구하고 그 라이브러리가 또 다른 걸 요구하는 &quot;의존성 체인&quot;이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 의존성이 또 어떤 의존성을 가지는지 확인하는 작업이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resolution 단계에서는 이런 &quot;줄줄이 딸려 오는&quot; 의존성들을 전부 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Resolution 3. 라이브러리의 다른 의존성 버전 고정]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 세 번째 단계는 모든 의존성 버전을 고정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 팀원 모드 환경에서 동일한 버전을 사용 가능하도록 lock파일을 생성하는 단계다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(package-lock.json, yarn.lock, pnpm-lock.yaml)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서는 의존성의 버전을 범위로 명시하고 패키지 간에도 의존성을 가지기 때문에 똑같은 package.json에 대해서도 사용하는 의존성 버전이 완전히 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜냐하면 package.json에는 범위만 적혀있어서 같은 프로젝트라도 누가 설치하느냐에 따라 버전이 달라질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 내 컴퓨터에서는 React 18.1.0이 설치되었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동료 컴퓨터에서는 React 18.2.0이 설치될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 같은 코드를 실행했는데 내 컴퓨터에서는 잘 되고 다른 동료 컴퓨터에서는 버그가 생길 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Fetch 단계&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Fetch 단계에서는 Resolution에서 고른 정확한 버전의 패키지를 실제로 다운로드하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 Resolution에서 React 18.3.1을 사용하자고 결정했다면 패키지 매니저가 npm 서버(레지스트리)에 가서 React 18.3.1 압축 파일을 받아온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 거쳐야 내 컴퓨터 안에 실제로 React, Next.js 같은 라이브러리 파일들이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내 코드에서 import React from 'react'라고 했을 때 정상적을 동작할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;Link 단계&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linker 단계는 내 코드에서 import/require가 잘 동작하도록 설치한 라이브러리를 어떻게 연결할지 정하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Resolution/Fetch 된 라이브러리를 소스코드에서 사용할 수 있는 환경을 제공하는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 내 코드에서 라이브러리를 실제로 쓸 수 있게 연결해 주는 과정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 패키지 매니저(npm, yarn, pnpm, PnP : Plug n Play)마다 방식을 다르게 가져간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[Link 방식에 따른 차이]&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;npm Linker&lt;/li&gt;
&lt;li&gt;pnpm Linker&lt;/li&gt;
&lt;li&gt;yarn PnP Linker&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. npm Linker(node_modules)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm은 설치한 라이브러리를 node_modules 폴더에 그대로 복사해서 넣는 방법을 사용한다.&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;예를 들어 100개 프로젝트에서 React 18.2.0을 사용한다면 React가 100번 설치된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;import나 require를 할 때, Node.js가 node_moduls를 계속 위로 올라가며 찾아야 해서 속도가 느려질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2. pnpm Linker&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 단점들 때문에 pnpm(performant npm)이 생겨났다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;똑같이 node_modules를 사용하지만 라이브러리를 실제로 복사하지 않고 바로가기(하드링크 : HardLinker)만 걸어둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 속도도 더 빠르고 디스크 용량도 덜 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 npm 보다는 낫지만 여전히 node_modules가 필요하다는 한계가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. yarn PnP Linker&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn PnP Linker라고 해서 yarn과 PnP는 다른 패키지 매니저라고 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn : 패키지 매니저 이름으로 npm과 같은 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PnP : yarn에서 제공하는 라이브러리 연결(Link) 방식 중 하나다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉 yarn에는 node_modules 방식과 pnp 방식으로 두 가지 Link 방식이 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 yarn : node_modules 폴더 사용&lt;/li&gt;
&lt;li&gt;yarn PnP : node_modules 없이 .pnp.cjs라는 Map 파일을 만들어 메모리에서 의존성을 바로 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지를 설치하면 node_modules 폴더가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm, pnpm은 이 node_modules를 만들어서 파일들을 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 yarn의 PnP 방식은 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn install을 하면 node_modules 폴더를 만들지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 디스크 용량을 덜 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신 .pnp.cjs라는 &quot;지도(Map)&quot;파일을 하나 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 &quot;React는 18.2.0 버전은 여기에 있어요!(= 사용해요!)&quot; 같은 정보가 적혀있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js가 import React 같은 걸 실행할 때 node_modules 폴더에서 찾아야 하는데 .pnp.cjs 파일에서 보고 위치로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폴더를 만들지 않아도 되어 설치 속도는 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Map의 역할을 하는 .pnp.cjs만 보면 되어서 실행속도는 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점은 호환성이 낮다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn PnP는 node_modules가 없기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 도구들이 node_modules폴더가 반드시 있을 거라 가정하고 만들어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 PnP에는 node_modules가 없어서 문제가 생길 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;요약&amp;gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm : 전부 복사해서 node_modules에 넣는다.(느리고 무겁다)&lt;/li&gt;
&lt;li&gt;pnpm : 복사 대신 &quot;바로가기&quot;를 걸어서 효율적으로 관리(빠르고 가볍다)&lt;/li&gt;
&lt;li&gt;yarn PnP : node_modules 자체를 없애버리고 Map 파일로 관리(초고속, 하지만 호환성 문제가 있다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[npm, yarn, pnpm 한눈에 비교]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. npm이란?&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776585071048&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm install react&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lock 파일 : package-lock.json&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm(Node Package Manager)은 자바스크립트 패키지 매니저이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용할 수 있는 모듈들을 패키지화하여 모아두는 장소 역할과 패키지 설치 및 관리를 위한 CLI를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트에서 필요한 라이브러리를 설치하고 버전을 관리하며 의존성을 쉽게 다룰 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node_modules 폴더에 라이브러리를 복사하는 방식으로 설치&lt;/li&gt;
&lt;li&gt;설치 시 package.json의 범위를 기준으로 정확한 버전을 결정&lt;/li&gt;
&lt;li&gt;package-lock.json 파일을 통해 동일한 버전으로 설치할 수 있도록 돕는다.&lt;/li&gt;
&lt;li&gt;대부분의 Node.js 패키지 호환이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;안정적이고 호환성이 좋다.&lt;/li&gt;
&lt;li&gt;Node.js 공식 도구라 별도 설치 없이 바로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;패키지를 설치할 때 의존성도 자동으로 설치된다.&lt;/li&gt;
&lt;li&gt;package.json 파일 내의 스크립트 섹션을 통해 자동화 작업이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디스크 공간을 많이 사용한다.(중복 설치 발생)&lt;/li&gt;
&lt;li&gt;대규모 프로젝트에서 node_modules폴더가 매우 커질 수 있다.&lt;/li&gt;
&lt;li&gt;설치 속도가 yarn, pnpm보다 느리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2. yarn 이란?&lt;/b&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1776585349842&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn add react&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lock 파일 : yarn.lock&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Facebook(현 Meta)에서 npm의 단점을 개선하기 위해 만든 자바스크립트 패키지 매니저이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빠른 설치 속도와 안정적인 버전 관리를 목표로 만들어졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm과 호환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대규모 프로젝트에서도 패키지 의존성을 더 효율적으로 관리할 수 있게 해 준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;yarn.lock 파일을 사용해 모든 개발자가 동일한 라이브러리 버전 설치&lt;/li&gt;
&lt;li&gt;병렬 다운로드와 캐싱으로 설치 속도 개선&lt;/li&gt;
&lt;li&gt;npm과 거의 동일하게 동작하여 대부분의 라이브러리 호환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐싱 기능으로 설치 속도가 npm보다 빠르다.&lt;/li&gt;
&lt;li&gt;yarn.lock 파일을 통해 모든 개발 환경에서 동일한 패키지 버전을 보장&lt;/li&gt;
&lt;li&gt;단일 레포지토리 내에서 여러 패키지를 관리할 수 있어 모노레포에서 유용&lt;/li&gt;
&lt;li&gt;checksum을 통해 패키지의 무결성을 확인하여 설치 과정의 신뢰성을&amp;nbsp;높인다.&lt;/li&gt;
&lt;li&gt;플러그인 시스템 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 오래된 Node.js 환경에서 호환성 문제가 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;node_modules&lt;span&gt; 구조를 여전히 사용하므로 디스크 최적화는 제한적&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;npm 보다 약간 복잡할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. pnpm(Performant npm) 이란?&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1776585662159&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pnpm add react&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Lock 파일 : pnpm-lock.yaml&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pnpm은 npm과 yarn 보다 디스크 공간과 설치 속도를 최적화한 패키지 매니저이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hard Link를 사용해 라이브러리를 한 번만 설치하고, 각 프로젝트에서 공유하도록 설계되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주요 특징&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;node_modules&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt; 구조를 유지하면서 디스크 사용량 최소화&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;속도 빠르고 큰 프로젝트에서 효율적&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;패키지를 중복으로 설치하지 않고, Hard link를 사용하여 디스크 공간을 절약하고 설치 속도를 높여준다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;대규모 프로젝트에서의 성능 향상과 더불어 디스크 공간도 효율적으로 사용할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;장단점&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복된 패키지를 제거하여 디스크 공간 절약&lt;/li&gt;
&lt;li&gt;설치 속도가 빠름&lt;/li&gt;
&lt;li&gt;pnpm-lock.yaml 파일을 통해 모든 개발자 환경에서 동일한 패키지 버전을 보장&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;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일부 구형 라이브러리나 툴에서 호환성 문제 발생 가능&lt;/li&gt;
&lt;li&gt;npm/yarn에 비해 상대적으로 덜 알려져 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[왜 여러 패키지 매니저가 존재할까?]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저는 의존성을 관리하는 방식에 따라 차이가 있다.&lt;/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;예 : pip vs conda&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pip : Python 패키지 중심&lt;/li&gt;
&lt;li&gt;conda : Python 뿐 아니라 시스템 라이브러리까지 관리 가능(데이터 과학에서 선호)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예 : npm vs yarn vs pnpm&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm : 유연하지만 일부 상황에서 의존성 충돌 가능&lt;/li&gt;
&lt;li&gt;yarn : 더 엄격하게 버전을 고정하고 빠른 설치와 캐싱 지원&lt;/li&gt;
&lt;li&gt;pnpm : 대규모 프로젝트에서 디스크 공간을 절약하고 설치 속도를 개선&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;lt;어떤 패키지 매니저를 사용해야할까?&amp;gt;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;npm은 호환성이 중요하거나 작은 프로젝트에서 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;yarn은 안정적인 버전관리와 빠른 설치 속도를 제공하여 중간 규모의 프로젝트에 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pnpm은 대규모 프로젝트에서 디스크 공간을 절약하고 설치 속도를 개선하기 위해 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 매니저가 여러개인 이유는 통일하지 못해서가 아니라 각기 다른 목적과 환경에 맞게 발전해 왔기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[정리]&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;목적과 설계 철학 차이 : 속도, 안정성, 디스크 효율, 호환성 등&lt;/li&gt;
&lt;li&gt;팀 문화, CI/CD 환경, 프로젝트 요구사항에 따라 선택&lt;/li&gt;
&lt;li&gt;운영체제와 언어 환경 차이도 고려 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 : Python&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;pip : Python 패키지 중심&lt;/li&gt;
&lt;li&gt;conda : Python + 시스템 라이브러리 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시 : JavaScript&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm : 호환성과 안정성 중시, 작은 프로젝트 적합&lt;/li&gt;
&lt;li&gt;yarn : 빠른 설치와 안정적 버전 관리, 중규모 프로젝트 적합&lt;/li&gt;
&lt;li&gt;pnpm : 성능과 디스크 효율, 대규모 프로젝트 적합&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;npm&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 널리 사용되며, 기본적인 기능에 충실&lt;/li&gt;
&lt;li&gt;속도나 효율성에 크게 민감하지 않을 경우 사용하기 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;yarn
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠른 속도와 안정성을 원하는 사용자에게 적합&lt;/li&gt;
&lt;li&gt;특히 대규모 프로젝트나 모노레포에서 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;pnpm
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;성능과 디스크 공간 효율성을 중시하는 사용자에게 적합&lt;/li&gt;
&lt;li&gt;모노레포와 의존성 관리가 중요한 프로젝트에 유용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글에서는 npm은 작은 프로젝트, yarn은 중간, pnpm 대규모라고 설명하였다.&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;어떤 패키지 매니저를 선택할지는 프로젝트규모, 팀 협업 환경, 빌드 도구와의 호환성, CI/CD환경도 고려하여 선택해야 한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;항목&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;npm&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;yarn&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;pnpm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;보통&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;빠름&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;매우 빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;디스크&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;큼&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;큼&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;매우 효율적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;방식&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;복사&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;복사/PnP&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;하드링크&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://toss.tech/article/lightning-talks-package-manager&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://toss.tech/article/lightning-talks-package-manager&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776581314676&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;패키지 매니저의 과거, 토스의 선택, 그리고 미래&quot; data-og-description=&quot;토스는 왜 패키지 매니저로 Yarn을 선택했을까요? 이번 라이트닝 토크에서는 JavaScript의 패키지 매니저, 동작 방식, 그리고 토스의 선택과 앞으로의 방향성에 대해 이야기해 보려고 해요.&quot; data-og-host=&quot;toss.tech&quot; data-og-source-url=&quot;https://toss.tech/article/lightning-talks-package-manager&quot; data-og-url=&quot;https://toss.tech/article/lightning-talks-package-manager&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b4MXt9/dJMb88e2zg9/7gHKHYxTrKtSdeXbp9F0SK/img.png?width=3000&amp;amp;height=1534&amp;amp;face=0_0_3000_1534,https://scrap.kakaocdn.net/dn/cpCrDJ/dJMb8YpXhjz/T4eQ3qvTMVe0yFzgXVBWtK/img.png?width=3000&amp;amp;height=1534&amp;amp;face=0_0_3000_1534,https://scrap.kakaocdn.net/dn/ttRtP/dJMb8Qen4OV/Wv5rXqIjCvAOAHqauhE1Kk/img.png?width=3000&amp;amp;height=1534&amp;amp;face=0_0_3000_1534&quot;&gt;&lt;a href=&quot;https://toss.tech/article/lightning-talks-package-manager&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://toss.tech/article/lightning-talks-package-manager&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b4MXt9/dJMb88e2zg9/7gHKHYxTrKtSdeXbp9F0SK/img.png?width=3000&amp;amp;height=1534&amp;amp;face=0_0_3000_1534,https://scrap.kakaocdn.net/dn/cpCrDJ/dJMb8YpXhjz/T4eQ3qvTMVe0yFzgXVBWtK/img.png?width=3000&amp;amp;height=1534&amp;amp;face=0_0_3000_1534,https://scrap.kakaocdn.net/dn/ttRtP/dJMb8Qen4OV/Wv5rXqIjCvAOAHqauhE1Kk/img.png?width=3000&amp;amp;height=1534&amp;amp;face=0_0_3000_1534');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;패키지 매니저의 과거, 토스의 선택, 그리고 미래&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;토스는 왜 패키지 매니저로 Yarn을 선택했을까요? 이번 라이트닝 토크에서는 JavaScript의 패키지 매니저, 동작 방식, 그리고 토스의 선택과 앞으로의 방향성에 대해 이야기해 보려고 해요.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;toss.tech&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.frontoverflow.com/magazine/12/%ED%8C%A8%ED%82%A4%EC%A7%80%20%EB%A7%A4%EB%8B%88%EC%A0%80&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.frontoverflow.com/magazine/12/%ED%8C%A8%ED%82%A4%EC%A7%80%20%EB%A7%A4%EB%8B%88%EC%A0%80&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9C-npmnode-package-manager&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9C-npmnode-package-manager&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776581333246&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[NODE]   npm(node package manager) 완벽 정리&quot; data-og-description=&quot;npm(node package manager) npm(node package manager)은 자바스크립트 패키지 매니저이다. Node.js에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할과 패키지 설치 및 관리를 위한 CLI(Command line int&quot; data-og-host=&quot;inpa.tistory.com&quot; data-og-source-url=&quot;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9C-npmnode-package-manager&quot; data-og-url=&quot;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9C-npmnode-package-manager&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7BDkh/dJMb8T91oHR/1tegnhS2lRO6jY4IgeOEZ0/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/439Pv/dJMb83SkLRJ/ev3CQQmnQCAUA4d14vuI60/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cd8fcD/dJMb9b3TXxr/KakfvWva7tGpX1z9FyjJC0/img.jpg?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9C-npmnode-package-manager&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-%EB%85%B8%EB%93%9C-npmnode-package-manager&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7BDkh/dJMb8T91oHR/1tegnhS2lRO6jY4IgeOEZ0/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/439Pv/dJMb83SkLRJ/ev3CQQmnQCAUA4d14vuI60/img.jpg?width=800&amp;amp;height=450&amp;amp;face=0_0_800_450,https://scrap.kakaocdn.net/dn/cd8fcD/dJMb9b3TXxr/KakfvWva7tGpX1z9FyjJC0/img.jpg?width=1600&amp;amp;height=900&amp;amp;face=0_0_1600_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[NODE]   npm(node package manager) 완벽 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;npm(node package manager) npm(node package manager)은 자바스크립트 패키지 매니저이다. Node.js에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할과 패키지 설치 및 관리를 위한 CLI(Command line int&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;inpa.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/nodejs-npm&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://poiemaweb.com/nodejs-npm&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776581348436&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Node.js &amp;amp; npm | PoiemaWeb&quot; data-og-description=&quot;npm(node package manager)은 자바스크립트 패키지 매니저이다. Node.js에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할과 패키지 설치 및 관리를 위한 CLI를 제공한다. 자신이 작성한 패&quot; data-og-host=&quot;poiemaweb.com&quot; data-og-source-url=&quot;https://poiemaweb.com/nodejs-npm&quot; data-og-url=&quot;https://poiemaweb.com/nodejs-npm&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bAz7iX/dJMb8PGx1wT/kZ1ugQLUKXmWLkx4W3CmUK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/nuLfm/dJMb8T91oIu/CjRGF2lUTKPkTmZ7T7FrX1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/zilfC/dJMb8PGx1wS/jUyZ6qG5moggvFJvNqqkF0/img.png?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600&quot;&gt;&lt;a href=&quot;https://poiemaweb.com/nodejs-npm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://poiemaweb.com/nodejs-npm&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bAz7iX/dJMb8PGx1wT/kZ1ugQLUKXmWLkx4W3CmUK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/nuLfm/dJMb8T91oIu/CjRGF2lUTKPkTmZ7T7FrX1/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/zilfC/dJMb8PGx1wS/jUyZ6qG5moggvFJvNqqkF0/img.png?width=800&amp;amp;height=600&amp;amp;face=0_0_800_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Node.js &amp;amp; npm | PoiemaWeb&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;npm(node package manager)은 자바스크립트 패키지 매니저이다. Node.js에서 사용할 수 있는 모듈들을 패키지화하여 모아둔 저장소 역할과 패키지 설치 및 관리를 위한 CLI를 제공한다. 자신이 작성한 패&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;poiemaweb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 노트</category>
      <category>it노트</category>
      <category>IT지식</category>
      <category>JavaScript</category>
      <category>NPM</category>
      <category>pnpm</category>
      <category>Yarn</category>
      <category>개발자</category>
      <category>자바스크립트</category>
      <category>패키지매니저</category>
      <category>프론트엔드</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/266</guid>
      <comments>https://devyihyun.tistory.com/266#entry266comment</comments>
      <pubDate>Wed, 29 Apr 2026 18:10:56 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript] 옵셔널체이닝(?.) 사용법 총정리JavaScript 옵셔널체이닝(?.) 사용법 정리</title>
      <link>https://devyihyun.tistory.com/265</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OZjM1/dJMcahD5TlV/etRbUTKSiwbtzEzNyYb3Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OZjM1/dJMcahD5TlV/etRbUTKSiwbtzEzNyYb3Mk/img.png&quot; data-alt=&quot;자바스크립트 옵셔널 체이닝&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OZjM1/dJMcahD5TlV/etRbUTKSiwbtzEzNyYb3Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOZjM1%2FdJMcahD5TlV%2FetRbUTKSiwbtzEzNyYb3Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;931&quot; height=&quot;544&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자바스크립트 옵셔널 체이닝&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;목차&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;객체 속성 접근 시 발생하는 문제&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;옵셔널 체이닝(Optional Chaining,?.)이란?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;옵셔널 체이닝 사용법&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;||와?? 차이점&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주의할 점&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;정리&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[객체 속성 접근 시 발생하는 문제]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트로 객체를 다루다 보면 깊이 중첩된 속성에 접근해야 하는 상황이 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 중간에 속성이 존재하지 않으면 TypeError가 발생하며 코드 실행이 중단된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 자바스크립트 객체가 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1776579427023&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const user = {
  profile: {
    name: &quot;홍길동&quot;,
    contact: {
      email: &quot;hong@example.com&quot;,
    },
    address: {
      city: &quot;서울&quot;,
      zipCode: &quot;06123&quot;,
    }
  },
  orders: [
    { id: 1, item: &quot;노트북&quot; },
    { id: 2, item: &quot;키보드&quot; }
  ],
  getProfile() {
    return &quot;사용자 프로필입니다.&quot;;
  }
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체 user의 전화번호가 필요한 상황이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔 로그로 user profile.contact.phone에 접근하면 phone이 존재하지 않아 Cannot read properties of undefined오류가 발생한다.&lt;/p&gt;
&lt;pre id=&quot;code_1776579458361&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 존재하지 않는 속성 접근 시 오류 발생
console.log(user.profile.contact.phone); // undefined
// Error: Cannot read properties of undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 이 문제를 피하기 위해 조건문이나 &amp;amp;&amp;amp; 연산자를 중첩해서 안전하게 접근했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아래와 같이 코드를 작성하면 코드가 길어지고 가독성이 떨어지는 문제가 있었다.&lt;/p&gt;
&lt;pre id=&quot;code_1776579617478&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (user &amp;amp;&amp;amp;user.profile &amp;amp;&amp;amp; user.profile.contact &amp;amp;&amp;amp; user.profile.contact.phone) {
  console.log(user.profile.address.phone); // 출력되지 않음
}

// 혹은
console.log(user &amp;amp;&amp;amp; user.profile &amp;amp;&amp;amp; user.profile.contact &amp;amp;&amp;amp; user.profile.contact.phone); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 ES2020에서는 옵셔널체이닝(Optional Chaining, ?.) 문법이 도입되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[옵셔널 체이닝(Optional Chaining,?.)이란?]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵셔널 체이닝은 존재하지 않을 수 있는 객체 속성에 안전하게 접근할 수 있게 해주는 문법이다.&lt;/p&gt;
&lt;pre id=&quot;code_1776579745731&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(user?.profile?.contact?.phone) //undefined (에러 발생 x)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞의 값이 null 또는 undefined라면 평가를 중단하고 undefined를 반환한다.&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;API 응답 데이터나 사용자 입력값처럼 존재하 확실하지 않은 데이터를 다룰 때 유용하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[옵셔널 체이닝 사용법]&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;객체 속성 접근&lt;/li&gt;
&lt;li&gt;배열 요소 접근&lt;/li&gt;
&lt;li&gt;함수 호출&lt;/li&gt;
&lt;li&gt;null 병합 연산자와의 조합&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 객체 속성 접근&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1776579875782&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// phone은 없는 속성
const phone = user?.profile?.contact?.phone;
console.log(phone); // undefined (에러 발생 X)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 배열 요소 접근&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1776579903361&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const firstOrder = user?.orders?.[0];
console.log(firstOrder); // { id: 1, item: &quot;노트북&quot; }

const thirdOrder = user?.orders?.[2];
console.log(thirdOrder); // undefined (에러 발생 X)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 함수 호출&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1776580368036&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(user.getProfile?.()); // &quot;사용자 프로필입니다.&quot;

const guest = {};
console.log(guest.getProfile?.()); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. null 병합 연산자와의 조합&lt;/b&gt;&lt;/h4&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 id=&quot;code_1776580430227&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const city1 = user?.profile?.address?.city ?? &quot;Unknown city&quot;;
console.log(city1); // &quot;서울&quot;

const guest = {};
const city2 = guest?.profile?.address?.city ?? &quot;Unknown city&quot;;
console.log(city2); // &quot;Unknown city&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[ ||와?? 차이점]&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;||
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽 값이 falsy면 오른쪽 값을 반환&lt;/li&gt;
&lt;li&gt;falsy 값 : 0, &quot;&quot;, false, null, undefined, NaN&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;??
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오직 Null이나 undefined일 때만 오른쪽 기본값을 반환&lt;/li&gt;
&lt;li&gt;0, &quot;&quot;, false 같은 값은 그대로 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[주의할 점]&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Reference는 잡지 못한다.&lt;/li&gt;
&lt;li&gt;읽기/삭제만 가능, 쓰기는 불가&lt;/li&gt;
&lt;li&gt;남용하지 말아야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Reference는 잡지 못한다.&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언조차 되지 않은 변수에서는 사용할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1776580586343&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(a?.b);
// ReferenceError: a is not defined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선언만 되어 있으면 안전하게 접근 가능하다&lt;/p&gt;
&lt;pre id=&quot;code_1776580611047&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let obj; 
console.log(obj?.prop); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 읽기/삭제만 가능, 쓰기는 불가&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵셔널체이닝은 값을 반환만 하기 때문에 직접 할당에는 사용할 수 없다.&lt;/p&gt;
&lt;pre id=&quot;code_1776580646617&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;delete user?.profile?.name; // 안전하게 삭제 가능
user?.profile?.name = &quot;Violet&quot;; // SyntaxError&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 남용하지 말 것&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 존재해야 하는 값에는 사용하지 않는 게 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 user객체는 필수라면 user?.profile 대신 user.profile을 사용하는 것이 디버깅에 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래야 실수로 user가 할당되지 않았을 때 에러가 발생하고 디버깅이 쉬워지기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 반드시 존재 여부가 불확실한 값에만 선택적으로 사용하는 것이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;[정리]&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵셔널체이닝(?.)은 중첩된 객체 속성에 안전하게 접근할 수 있게 해주는 문법이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 속성 접근 : obj?.prop&lt;/li&gt;
&lt;li&gt;배열 접근 : obj?.[props]&lt;/li&gt;
&lt;li&gt;함수 호출 : obj?.method()&lt;/li&gt;
&lt;li&gt;??와||을 함께 사용하는 기본값 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵셔널 체이닝 사용 적절 예 : 외부 API 데이터, 사용자 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 지양 예 : 필수 객체, 반드시 존재해야 하는 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵셔널 체이닝을 잘 활용하면 코드가 간결해지고 예외 상횡에서도 안정적을 동작할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;꼭 필요한 값까지 옵셔널체이닝을 사용하면 버그를 놓치기 쉽다는 점을 기억해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잘못된 정보는 댓글에 남겨주시면 감사하겠습니다! &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;댓글과 좋아요는 큰 힘이 됩니다!&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;007&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/007.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;Reference&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 참고자료 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/optional-chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ko.javascript.info/optional-chaining&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776577513091&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;옵셔널 체이닝 '?.'&quot; data-og-description=&quot;&quot; data-og-host=&quot;ko.javascript.info&quot; data-og-source-url=&quot;https://ko.javascript.info/optional-chaining&quot; data-og-url=&quot;https://ko.javascript.info/optional-chaining&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/0rmM7/dJMb9effR6H/4d0HT74cTTl93HLJykuSZ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bJeBOd/dJMb9lk82M1/21dPwXv9jE899wcZpaFQj0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://ko.javascript.info/optional-chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://ko.javascript.info/optional-chaining&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/0rmM7/dJMb9effR6H/4d0HT74cTTl93HLJykuSZ1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bJeBOd/dJMb9lk82M1/21dPwXv9jE899wcZpaFQj0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;옵셔널 체이닝 '?.'&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;ko.javascript.info&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776577518435&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Optional chaining - JavaScript | MDN&quot; data-og-description=&quot;&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Optional_chaining&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Optional chaining - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 개발/JavaScript</category>
      <author>dev_y.h</author>
      <guid isPermaLink="true">https://devyihyun.tistory.com/265</guid>
      <comments>https://devyihyun.tistory.com/265#entry265comment</comments>
      <pubDate>Mon, 27 Apr 2026 18:10:07 +0900</pubDate>
    </item>
  </channel>
</rss>