<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Cotist</title>
    <link>https://cotist.tistory.com/</link>
    <description>코딩교육, 외주 등 소통 문의  -
open.kakao.com/o/sjqi3lDc</description>
    <language>ko</language>
    <pubDate>Tue, 25 Aug 2026 07:26:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Cotist</managingEditor>
    <image>
      <title>Cotist</title>
      <url>https://tistory1.daumcdn.net/tistory/4316070/attach/584eebfe1a3445279c40f7522a8775b3</url>
      <link>https://cotist.tistory.com</link>
    </image>
    <item>
      <title>내가 생각하는 저연차 개발자의 물경력과 극복법 - 1</title>
      <link>https://cotist.tistory.com/53</link>
      <description>&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;br /&gt;이런 상태가 심해지면 질문조차 제대로 하지 못하고, ChatGPT와 같은 도구를 사용할 때도 단순히 코드를 복사해 붙이며 &quot;이거 해결해줘&quot;, &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;&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;br /&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;최소한 로직을 짜지 못해서 해결하지 못하는 일은 90% 이상 줄어들 것이라 확신한다. (물론 코드의 '질'은 또 다른 이야기지만&amp;hellip;)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;[개발 교육, 외주 문의]&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #373c46; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://open.kakao.com/o/sjqi3lDc&quot;&gt;open.kakao.com/o/sjqi3lDc&lt;/a&gt;&lt;/p&gt;</description>
      <category>Experience/Developer</category>
      <category>개발</category>
      <category>개발자</category>
      <category>물경력</category>
      <category>백엔드</category>
      <category>부트캠프</category>
      <category>저연차</category>
      <category>프론트엔드</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/53</guid>
      <comments>https://cotist.tistory.com/53#entry53comment</comments>
      <pubDate>Fri, 24 Jan 2025 14:46:27 +0900</pubDate>
    </item>
    <item>
      <title>Ruby 버전 업데이트 및 전역 적용하는 방법</title>
      <link>https://cotist.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우선 ruby 버전을 변경하기 위해서는 brew가 기본적으로 설치를 해야 한다. (아래 링크 - brew 다운로드 사이트)&lt;br /&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://brew.sh/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1698731712304&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;Homebrew&quot; data-og-description=&quot;The Missing Package Manager for macOS (or Linux).&quot; data-og-host=&quot;brew.sh&quot; data-og-source-url=&quot;https://brew.sh/&quot; data-og-url=&quot;https://brew.sh/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/suDoI/hyUnYeOHx4/k11y6PU6vctbNpZ190uOs0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jAENa/hyUkaBix2r/EnnhrBcqHNuBOT7FUFtMYk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://brew.sh/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://brew.sh/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/suDoI/hyUnYeOHx4/k11y6PU6vctbNpZ190uOs0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/jAENa/hyUkaBix2r/EnnhrBcqHNuBOT7FUFtMYk/img.png?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;Homebrew&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Missing Package Manager for macOS (or Linux).&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;brew.sh&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;brew 설치가 완료되었다면 rbenv를 설치하자&lt;/p&gt;
&lt;pre id=&quot;code_1698731755949&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install rbenv&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;rbenv를 설치하였다면 ruby 설치 가능한 버전 리스트를 확인한다.&lt;/p&gt;
&lt;pre id=&quot;code_1698731776395&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rbenv install -l&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;pre id=&quot;code_1698731858588&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# rbenv install x.x.x(설치 버전 기입)
rbenv install 3.0.6&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;전역적으로 rbenv에 설치된 버전으로 ruby를 바꾸도록 명령한다.&lt;/p&gt;
&lt;pre id=&quot;code_1698731950273&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;rbenv global 3.0.6&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;ruby 버전을 확인한다. 이때 적용이 안되는 경우가 있는데, 그 경우에는 아래 스텝까지 실시한다.&lt;/p&gt;
&lt;pre id=&quot;code_1698732002849&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ruby -v&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;zshrc 파일을 연다.&lt;/p&gt;
&lt;pre id=&quot;code_1698732066811&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;open ~/.zshrc&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;zshrc 파일에 아래 환경변수 구문을 넣고 저장하고 닫는다.&lt;/p&gt;
&lt;pre id=&quot;code_1698732109485&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;eval &quot;$(rbenv init - zsh)&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;터미널에 아래 명령어로 적용시킨다.&lt;/p&gt;
&lt;pre id=&quot;code_1698732140444&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;source ~/.zshrc&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;pre id=&quot;code_1698732181924&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ruby -v&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Basic</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/52</guid>
      <comments>https://cotist.tistory.com/52#entry52comment</comments>
      <pubDate>Tue, 31 Oct 2023 15:03:24 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 문자열 자리수 채우기 - padStart, padEnd</title>
      <link>https://cotist.tistory.com/51</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 숫자를 표현할 때, 네자리 고정으로 출력하기를 원할 때가 있다. 예를 들어, 네자리를 채우고 싶고 100을 입력하면 0100, 5를 입력하면 ***5 등등..&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;이를 구현하기 위해 padStart와 padEnd를 사용하면 구현하기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;padStart 내장함수를 사용하면 입력한 문자열 앞에 원하는 문자 또는 문자열로 만족하는 문자열 길이까지 채워준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대로 padEnd는 입력한 문자열 뒤에서 채워준다.&lt;/p&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;MDN의 예시를 한 번 보자&lt;/p&gt;
&lt;pre id=&quot;code_1692201166476&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;abc&quot;.padStart(10); // &quot;       abc&quot;
&quot;abc&quot;.padStart(10, &quot;foo&quot;); // &quot;foofoofabc&quot;
&quot;abc&quot;.padStart(6, &quot;123465&quot;); // &quot;123abc&quot;
&quot;abc&quot;.padStart(8, &quot;0&quot;); // &quot;00000abc&quot;
&quot;abc&quot;.padStart(1); // &quot;abc&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;abc라는 문자열을 받아 새로운 문자열을 반환을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 인자는 목표 문자열의 길이를 정의하고 이는 필수 인자이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 인자는 목표 문자열의 길이까지 채우기 위한 &quot;채워넣기용 문자(열)&quot;을 정의하며 정의하지 않으면 &quot; &quot;로 인식하고 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응용하여 초단위의 number를 받으면 &quot;00:00(분:초)&quot; 형식으로 반환하는 함수를 만들자.&lt;/p&gt;
&lt;pre id=&quot;code_1692202181270&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// number로 넘어오는 refresh 타임을 형식에 맞게 변형하기 위한 함수 (ex: 30 -&amp;gt; 00:30)
export const handleFormatRefreshTime = (refreshTime: number, setFormattedTime: React.Dispatch&amp;lt;React.SetStateAction&amp;lt;string&amp;gt;&amp;gt;): void =&amp;gt; {
  // 초를 분과 초로 나누어서 표시
  const minutes = Math.floor(refreshTime / 60);
  const seconds = refreshTime % 60;

  // 시간 형식으로 변환하여 저장
  const timeFormatted = `${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
  setFormattedTime(timeFormatted);
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 문헌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/padStart&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/padStart&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1692201417780&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;String.prototype.padStart() - JavaScript | MDN&quot; data-og-description=&quot;padStart() 메서드는 현재 문자열의 시작을 다른 문자열로 채워, 주어진 길이를 만족하는 새로운 문자열을 반환합니다. 채워넣기는 대상 문자열의 시작(좌측)부터 적용됩니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/padStart&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/padStart&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dog9Gz/hyTCDYo8Gp/kTOVFklDK7mPEfJLuRR9j1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/padStart&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/padStart&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dog9Gz/hyTCDYo8Gp/kTOVFklDK7mPEfJLuRR9j1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;String.prototype.padStart() - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;padStart() 메서드는 현재 문자열의 시작을 다른 문자열로 채워, 주어진 길이를 만족하는 새로운 문자열을 반환합니다. 채워넣기는 대상 문자열의 시작(좌측)부터 적용됩니다.&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;</description>
      <category>Basic/JavaScript</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/51</guid>
      <comments>https://cotist.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 17 Aug 2023 01:09:54 +0900</pubDate>
    </item>
    <item>
      <title>맥북 충전기 연결음 on/off 하기</title>
      <link>https://cotist.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;맥북 충전기를 연결한 채로 사용하다보면 불안정한 접촉때문에 연결이 됐다 안됐다를 반복하여 계속해서 연결할 때 나는 소리를 내며 신경쓰이게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 단자를 고칠 수 없다면, 소리를 꺼보자.&lt;/p&gt;
&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;pre id=&quot;code_1689003614969&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;defaults write com.apple.PowerChime ChimeOnNoHardware -bool true; killall PowerChime&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;pre id=&quot;code_1689003671622&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;defaults write com.apple.PowerChime ChimeOnAllHardware -bool true; open /System/Library/CoreServices/PowerChime.app &amp;amp;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Convenient</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/50</guid>
      <comments>https://cotist.tistory.com/50#entry50comment</comments>
      <pubDate>Tue, 11 Jul 2023 00:42:18 +0900</pubDate>
    </item>
    <item>
      <title>[Firebase] 파이어베이스로 React 프로젝트 3분만에 호스팅하기 (무료로 URL, 웹사이트 구축하기)</title>
      <link>https://cotist.tistory.com/49</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이어베이스에서 제공하는 많은 기능들이 있지만, 모두 번외로 하고 자신이 만든 프로젝트를 실서버(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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://firebase.google.com/?hl=ko&quot;&gt;https://firebase.google.com/?hl=ko&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1686036278000&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&quot; data-og-description=&quot;Firebase is an app development platform that helps you build and grow apps and games users love. Backed by Google and trusted by millions of businesses around the world.&quot; data-og-host=&quot;firebase.google.com&quot; data-og-source-url=&quot;https://firebase.google.com/?hl=ko&quot; data-og-url=&quot;https://firebase.google.com/?hl=ko&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/flfHY/hySTPqrc8I/FZ2l8A3aEYyd0OBtor1qwk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/OYSkQ/hySTJqexbC/wE7sAa9VzL78BC75nyJPG1/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/YCekX/hySTPcUTPz/PocVFjEprq0YORQTAPm400/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512&quot;&gt;&lt;a href=&quot;https://firebase.google.com/?hl=ko&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://firebase.google.com/?hl=ko&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/flfHY/hySTPqrc8I/FZ2l8A3aEYyd0OBtor1qwk/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/OYSkQ/hySTJqexbC/wE7sAa9VzL78BC75nyJPG1/img.png?width=1600&amp;amp;height=800&amp;amp;face=0_0_1600_800,https://scrap.kakaocdn.net/dn/YCekX/hySTPcUTPz/PocVFjEprq0YORQTAPm400/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;Firebase&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Firebase is an app development platform that helps you build and grow apps and games users love. Backed by Google and trusted by millions of businesses around the world.&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;파이어베이스에 접속(상단 링크 참고)하여 &quot;시작하기&quot; 또는 &quot;콘솔로 이동&quot; 버튼을 클릭하여 다음 스텝으로 진행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅1.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lN6EU/btsiFP8W1M0/JC3a4UsPKhKzT7kWDuMBK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lN6EU/btsiFP8W1M0/JC3a4UsPKhKzT7kWDuMBK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lN6EU/btsiFP8W1M0/JC3a4UsPKhKzT7kWDuMBK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlN6EU%2FbtsiFP8W1M0%2FJC3a4UsPKhKzT7kWDuMBK0%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;2482&quot; height=&quot;1321&quot; data-filename=&quot;호스팅1.png&quot; data-origin-width=&quot;2482&quot; data-origin-height=&quot;1321&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;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;&quot;프로젝트 추가&quot; 영역을 클릭하여 파이어베이스의 새로운 프로젝트를 추가할 준비를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅2.png&quot; data-origin-width=&quot;2416&quot; data-origin-height=&quot;1217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dO9Dj3/btsiM9Z9BIH/C8foguMxrjrVGykawofco0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dO9Dj3/btsiM9Z9BIH/C8foguMxrjrVGykawofco0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dO9Dj3/btsiM9Z9BIH/C8foguMxrjrVGykawofco0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdO9Dj3%2FbtsiM9Z9BIH%2FC8foguMxrjrVGykawofco0%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;2416&quot; height=&quot;1217&quot; data-filename=&quot;호스팅2.png&quot; data-origin-width=&quot;2416&quot; data-origin-height=&quot;1217&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;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;적당한 프로젝트 네이밍을 등록해주고 &quot;계속&quot; 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅3.png&quot; data-origin-width=&quot;2535&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmEHYD/btsiO6n6DHv/JJRzOQDSjcaXtyMlgghOd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmEHYD/btsiO6n6DHv/JJRzOQDSjcaXtyMlgghOd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmEHYD/btsiO6n6DHv/JJRzOQDSjcaXtyMlgghOd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmEHYD%2FbtsiO6n6DHv%2FJJRzOQDSjcaXtyMlgghOd1%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;2535&quot; height=&quot;970&quot; data-filename=&quot;호스팅3.png&quot; data-origin-width=&quot;2535&quot; data-origin-height=&quot;970&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;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;가이드대로 터미널에서 &quot;npm install -g firebase-tools&quot; 명령어를 실행하여, 곧 Firebase CLI를 전역으로 설치해주고, &quot;다음&quot; 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅13.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;615&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0Tv7J/btsiOgEBI6v/Mb9y1jRDfMkKRmCd8UV9B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0Tv7J/btsiOgEBI6v/Mb9y1jRDfMkKRmCd8UV9B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0Tv7J/btsiOgEBI6v/Mb9y1jRDfMkKRmCd8UV9B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0Tv7J%2FbtsiOgEBI6v%2FMb9y1jRDfMkKRmCd8UV9B0%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;764&quot; height=&quot;615&quot; data-filename=&quot;호스팅13.png&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;615&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;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;그 다음 스텝에 대한 설명이 나오는데, 해당 포스터에서 설명하며 진행할 예정이니 모두 &quot;다음&quot; 클릭하여 완료시킨다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅14.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAS3bu/btsiNcWWqyo/ckkTeSjrIWIQw8AopvqUGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAS3bu/btsiNcWWqyo/ckkTeSjrIWIQw8AopvqUGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAS3bu/btsiNcWWqyo/ckkTeSjrIWIQw8AopvqUGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAS3bu%2FbtsiNcWWqyo%2FckkTeSjrIWIQw8AopvqUGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;707&quot; data-filename=&quot;호스팅14.png&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;707&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;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-filename=&quot;호스팅4.png&quot; data-origin-width=&quot;2473&quot; data-origin-height=&quot;1109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD8jMB/btsiFOIVVVz/fOGHSUsIqkS1o1SzUXqIM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD8jMB/btsiFOIVVVz/fOGHSUsIqkS1o1SzUXqIM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD8jMB/btsiFOIVVVz/fOGHSUsIqkS1o1SzUXqIM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD8jMB%2FbtsiFOIVVVz%2FfOGHSUsIqkS1o1SzUXqIM1%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;2473&quot; height=&quot;1109&quot; data-filename=&quot;호스팅4.png&quot; data-origin-width=&quot;2473&quot; data-origin-height=&quot;1109&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;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;호스팅하고자 하는 프로젝트로 돌아와, 터미널에 &quot;firebase login&quot;을 해준다.&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;(이전에 firebase login을 한 적이 있었고, 에러가 뜬다면 &quot;firebase login --reauth&quot;를 해주자. 토큰을 재갱신하는 과정이다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅5.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDGG13/btsiJ8NVANR/NsKr4dpjssm5BjpEzrbKm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDGG13/btsiJ8NVANR/NsKr4dpjssm5BjpEzrbKm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDGG13/btsiJ8NVANR/NsKr4dpjssm5BjpEzrbKm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDGG13%2FbtsiJ8NVANR%2FNsKr4dpjssm5BjpEzrbKm1%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;1060&quot; height=&quot;828&quot; data-filename=&quot;호스팅5.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;828&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;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;로그인이 완료되었다면, &quot;firebase init&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;&quot;Hosting&quot;에 포커스하여 &quot;스페이스바&quot;를 누른 뒤 &quot;엔터&quot;를 친다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅6.png&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTIMB/btsiJ8G8pMB/XWKKjkbK6kE0d5RFbKKrzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTIMB/btsiJ8G8pMB/XWKKjkbK6kE0d5RFbKKrzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTIMB/btsiJ8G8pMB/XWKKjkbK6kE0d5RFbKKrzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTIMB%2FbtsiJ8G8pMB%2FXWKKjkbK6kE0d5RFbKKrzk%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;1227&quot; height=&quot;464&quot; data-filename=&quot;호스팅6.png&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;464&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;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 프로젝트를 생성하였기 때문에, &quot;Use an existing project&quot;에 포커스한 뒤 엔터를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅7.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2QY6y/btsiPQL6I9q/jID1bxIvkJJ4i5AK18IQKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2QY6y/btsiPQL6I9q/jID1bxIvkJJ4i5AK18IQKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2QY6y/btsiPQL6I9q/jID1bxIvkJJ4i5AK18IQKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2QY6y%2FbtsiPQL6I9q%2FjID1bxIvkJJ4i5AK18IQKK%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;788&quot; height=&quot;367&quot; data-filename=&quot;호스팅7.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;367&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;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 프로젝트 이름이다. 맞는 곳을 선택하여 넘어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅8.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GhdTx/btsiOeAa05z/QkgCcDxlMCc1LvqaokKWkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GhdTx/btsiOeAa05z/QkgCcDxlMCc1LvqaokKWkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GhdTx/btsiOeAa05z/QkgCcDxlMCc1LvqaokKWkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhdTx%2FbtsiOeAa05z%2FQkgCcDxlMCc1LvqaokKWkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;768&quot; height=&quot;369&quot; data-filename=&quot;호스팅8.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;369&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;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;그 다음은 업로드 될 파일을 명시하라고 한다. 기본 입력지가 public으로 나올건데 public으로 절대 하지 말고, 같은 루트 파일에 build 폴더를 생성한 뒤에 아래 스크린샷처럼 &quot;build&quot;를 입력하고 엔터를 친다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅9.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IryAN/btsiOjBlHnH/nKcrXbOZsjwk5QlGQKEmsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IryAN/btsiOjBlHnH/nKcrXbOZsjwk5QlGQKEmsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IryAN/btsiOjBlHnH/nKcrXbOZsjwk5QlGQKEmsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIryAN%2FbtsiOjBlHnH%2FnKcrXbOZsjwk5QlGQKEmsk%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;820&quot; height=&quot;206&quot; data-filename=&quot;호스팅9.png&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅16.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNqwPp/btsiZWNy9cf/Da13kgvNSKWnKS5n9NGAr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNqwPp/btsiZWNy9cf/Da13kgvNSKWnKS5n9NGAr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNqwPp/btsiZWNy9cf/Da13kgvNSKWnKS5n9NGAr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNqwPp%2FbtsiZWNy9cf%2FDa13kgvNSKWnKS5n9NGAr1%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;369&quot; height=&quot;434&quot; data-filename=&quot;호스팅16.png&quot; data-origin-width=&quot;369&quot; data-origin-height=&quot;434&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create-react-app으로 react 앱을 세팅하였다면, package.json에 build를 수행하는 스크립트가 기본적으로 세팅이 되어 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1686153691653&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;build&quot;: &quot;react-scripts build&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;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;해당 명령어를 실행(yarn build)해주면 build 파일에 프로젝트를 구성하는 모든 소스파일들이 묶이게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1686153883579&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;yarn build&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅17.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;1291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1I9wh/btsi4dmE9ch/GpPZMARAQaYhjXqeKroO61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1I9wh/btsi4dmE9ch/GpPZMARAQaYhjXqeKroO61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1I9wh/btsi4dmE9ch/GpPZMARAQaYhjXqeKroO61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1I9wh%2Fbtsi4dmE9ch%2FGpPZMARAQaYhjXqeKroO61%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;1142&quot; height=&quot;1291&quot; data-filename=&quot;호스팅17.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;1291&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;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;build까지 완료가 되었다면 build에 묶여있는 소스코드를 연결된 firebase 프로젝트로 올리는 명령어만 치면 배포가 완료된다.&lt;/p&gt;
&lt;pre id=&quot;code_1686153964055&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;firebase deploy&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;호스팅18.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbjqxF/btsi4ai80hr/ngED7GZkW4tPsqIrEaKC70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbjqxF/btsi4ai80hr/ngED7GZkW4tPsqIrEaKC70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbjqxF/btsi4ai80hr/ngED7GZkW4tPsqIrEaKC70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbjqxF%2Fbtsi4ai80hr%2FngED7GZkW4tPsqIrEaKC70%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;974&quot; height=&quot;401&quot; data-filename=&quot;호스팅18.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;401&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;p data-ke-size=&quot;size16&quot;&gt;console의 마지막 문구인 Hosting 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;추후 업데이트 시에도 빌드(build) 후 배포(deploy)하는 과정을 거치면 된다.&lt;/p&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;br /&gt;&lt;br /&gt;&lt;br /&gt;파이어베이스 호스팅 가이드 자료를 만들기 위해 만든 프로젝트 URL과 깃헙 레포지토리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://fir-hosting-guide-20515.web.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://fir-hosting-guide-20515.web.app&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686154265406&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;React App&quot; data-og-description=&quot;&quot; data-og-host=&quot;fir-hosting-guide-20515.web.app&quot; data-og-source-url=&quot;https://fir-hosting-guide-20515.web.app&quot; data-og-url=&quot;https://fir-hosting-guide-20515.web.app&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://fir-hosting-guide-20515.web.app&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://fir-hosting-guide-20515.web.app&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;React App&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;fir-hosting-guide-20515.web.app&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/bluetg2001/firebase-hosting-guide&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/bluetg2001/firebase-hosting-guide&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Basic/etc</category>
      <category>firebase</category>
      <category>Hosting</category>
      <category>React</category>
      <category>URL 만들기</category>
      <category>무료</category>
      <category>웹사이트 만들기</category>
      <category>호스팅</category>
      <category>홈페이지 만들기</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/49</guid>
      <comments>https://cotist.tistory.com/49#entry49comment</comments>
      <pubDate>Thu, 8 Jun 2023 01:12:15 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] react-native-bottom-sheet, AndroidManifest.xml 내 android:windowSoftInputMode 설정 충돌 방지하기</title>
      <link>https://cotist.tistory.com/48</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/gorhom/react-native-bottom-sheet&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;gorhom/react-native-bottom-sheet는 React Native로 bottom sheet를 구현할 때 필요한 거의 대체 할 수 없는 필수 라이브러리이다.&lt;/p&gt;
&lt;figure id=&quot;og_1686136896397&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &quot; data-og-description=&quot;A performant interactive bottom sheet with fully configurable options   - GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; data-og-url=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ch8INb/hySTPrwaYh/GwK8LkU5Bc8HPJ8suWotek/img.jpg?width=960&amp;amp;height=480&amp;amp;face=0_0_960_480&quot;&gt;&lt;a href=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ch8INb/hySTPrwaYh/GwK8LkU5Bc8HPJ8suWotek/img.jpg?width=960&amp;amp;height=480&amp;amp;face=0_0_960_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A performant interactive bottom sheet with fully configurable options   - GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 링크의 공식 문서를 살펴보면, &quot;andorid_keyboardInputMode&quot;의 default 설정이 &quot;adjustPan&quot; 임을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 간과하고 &quot;AndroidManifest.xml&quot;의 &quot;android:windowSoftInputMode의 값을 설정값을 똑같이 맞추지 않으면, 설정 충돌이 발생하므로 간헐적으로 원하지 않는 액션이 발생 할 수 있다.&lt;/p&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/gorhom/react-native-bottom-sheet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/gorhom/react-native-bottom-sheet&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1686136879841&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &quot; data-og-description=&quot;A performant interactive bottom sheet with fully configurable options   - GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; data-og-url=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ch8INb/hySTPrwaYh/GwK8LkU5Bc8HPJ8suWotek/img.jpg?width=960&amp;amp;height=480&amp;amp;face=0_0_960_480&quot;&gt;&lt;a href=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/gorhom/react-native-bottom-sheet&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ch8INb/hySTPrwaYh/GwK8LkU5Bc8HPJ8suWotek/img.jpg?width=960&amp;amp;height=480&amp;amp;face=0_0_960_480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A performant interactive bottom sheet with fully configurable options   - GitHub - gorhom/react-native-bottom-sheet: A performant interactive bottom sheet with fully configurable options  &lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Front-end/App</category>
      <category>Bottom Sheet</category>
      <category>React</category>
      <category>React Native</category>
      <category>리액트네이티브</category>
      <category>프론트엔드</category>
      <category>하이브리드앱</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/48</guid>
      <comments>https://cotist.tistory.com/48#entry48comment</comments>
      <pubDate>Wed, 7 Jun 2023 20:39:48 +0900</pubDate>
    </item>
    <item>
      <title>[디자인패턴] MVC 패턴의 간단한 개념과 구현 예시</title>
      <link>https://cotist.tistory.com/47</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MVC 패턴의 개념을 설명하는 document나 블로그는 많으니, 간단하게 정리하고 그 예시에 대해서 자세히 알아보자.&lt;/p&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;size18&quot;&gt;&lt;b&gt;MVC 패턴이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;MVC(모델-뷰-컨트롤러)는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;(참고 문헌: &lt;a style=&quot;color: #ee2323;&quot; href=&quot;https://developer.mozilla.org/ko/docs/Glossary/MVC&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Glossary/MVC&lt;/a&gt; )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;MVC (Model-View-Controller) 패턴&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Model: 데이터와 비즈니스 로직을 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;View: 사용자에게 표시되는 인터페이스를 담당한다.&lt;br /&gt;Controller: 사용자의 입력을 처리하고 Model과 View를 관리한다.&lt;/p&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;br /&gt;&lt;br /&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;주로 프론트엔드에서 사용하는 패턴이니 javascript의 예시로 확인하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1685373518114&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Model
class UserModel {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  
  getName() {
    return this.name;
  }
  
  getAge() {
    return this.age;
  }
  
  setName(name) {
    this.name = name;
  }
  
  setAge(age) {
    this.age = age;
  }
}

// View
class UserView {
  displayUser(user) {
    console.log(`Name: ${user.getName()}, Age: ${user.getAge()}`);
  }
  
  displayErrorMessage(message) {
    console.log(`Error: ${message}`);
  }
}

// Controller
class UserController {
  constructor(model, view) {
    this.model = model;
    this.view = view;
  }
  
  updateUser(name, age) {
    if (name &amp;amp;&amp;amp; age) {
      this.model.setName(name);
      this.model.setAge(age);
      this.view.displayUser(this.model);
    } else {
      this.view.displayErrorMessage(&quot;Invalid input&quot;);
    }
  }
}

// Usage
const user = new UserModel(&quot;Elon Musk&quot;, 52);
const view = new UserView();
const controller = new UserController(user, view);

controller.updateUser(&quot;Charlie Kim&quot;, 30);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;UserModel은 데이터와 관련된 비즈니스 로직을 처리하는 모델을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UserView는 사용자에게 정보를 표시하는 뷰를 담당하고, UserContoller는 사용자의 입력을 처리하고 Model과 View를 관리하는 역할을 한다.&lt;br /&gt;&lt;br /&gt;Controller의 &quot;updateUser&quot; 메서드는 사용자의 이름과 나이를 인자로 받아 Model의 데이터를 업데이트하고, View를 통해 업데이트된 정보를 표시한다. 입력이 유효하지 않을 경우에는 View를 통해 에러 메시지를 표시한다.&lt;br /&gt;&lt;br /&gt;이런식으로 Model, View, Controller 간의 역할을 분리하여 코드를 구성하면, 코드의 재사용성과 유지보수성이 향상됨을 기대 할 수 있다.&lt;/p&gt;</description>
      <category>Basic/etc</category>
      <category>MVC패턴</category>
      <category>디자인패턴</category>
      <category>비즈니스로직</category>
      <category>패턴</category>
      <category>프론트엔드</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/47</guid>
      <comments>https://cotist.tistory.com/47#entry47comment</comments>
      <pubDate>Tue, 30 May 2023 00:20:30 +0900</pubDate>
    </item>
    <item>
      <title>[디자인패턴] 디자인패턴(design pattern)이란 무엇일까?</title>
      <link>https://cotist.tistory.com/46</link>
      <description>&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;br /&gt;&lt;br /&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;&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;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;1. 재사용성과 생산성 향상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 이미 검증된 솔루션이므로, 개발자는 처음부터 문제를 해결하기 위한 설계를 만들지 않아도 된다. 패턴을 재사용함으로써 생산성이 향상되고 코드의 재사용성이 증가된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;2. 일관성과 표준화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 개발자들 사이에서 공통된 언어와 개념을 제공한다. 이는 팀 내외의 소프트웨어 개발자들 사이의 소통과 협업을 용이하게 만들어준다. 또한 일관된 패턴의 사용은 소프트웨어 시스템의 일관성을 유지할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;3. 유지보수성 향상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 코드의 구조를 명확하게 만들어준다. 이는 소프트웨어 시스템의 유지보수성을 향상시키고, 변경에 대한 영향 범위를 제한함으로써 버그의 발생 가능성을 줄인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;4. 최적화와 확장성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디자인 패턴은 소프트웨어 시스템을 최적화하고 확장 가능하게 만들기 위한 가이드를 제공한다. 패턴은 시스템의 구성 요소들 간의 상호작용을 개선하고, 유연성과 확장성을 고려한 설계를 돕는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;b&gt;5. 전문성의 향상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다양한 디자인 패턴을 알고 있다는 것은 소프트웨어 개발자로서의 전문성을 나타내는 요소이다. 패턴을 이해하고 활용할 수 있는 능력은 개발자의 실력을 향상시키고, 좀 더 높은 수준의 소프트웨어 개발을 가능케 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;</description>
      <category>Basic/etc</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/46</guid>
      <comments>https://cotist.tistory.com/46#entry46comment</comments>
      <pubDate>Sun, 28 May 2023 00:42:29 +0900</pubDate>
    </item>
    <item>
      <title>[React Native] WebView로 Android PDF 링크 띄우기</title>
      <link>https://cotist.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;안드로이드의 WebView에서 PDF 관련 링크를 띄우려고 할 때, SSL 인증서의 문제로 발생할 수 있다. 기본적으로 WebView는 안전하지 않은 SSL 인증서를 가진 웹 사이트에 대해 경고를 표시하고 해당 사이트에 접속을 차단한다.&lt;br /&gt;&lt;br /&gt;차단을 풀고 접속하는 방법에 대해 알아보자.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. WebView 컴포넌트의 ignoreSslError 추가&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684313033619&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; &amp;lt;WebView
 	source={{ uri: link }}
 	javaScriptEnabled
 	originWhitelist={['*']}
 	ignoreSslError // 추가된 옵션
 /&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;size18&quot;&gt;&lt;b&gt;2. AndroidManifest.xml에서 보안 설정 변경&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;매니페스트에서 &quot;android:usesCleartextTracffic&quot; 속성을 추가하여 앱이 텍스트 트래픽을 사용할 수 있게 변경한다.&lt;/p&gt;
&lt;pre id=&quot;code_1684313102905&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;manifest xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
  package=&quot;com.example.yourapp&quot;&amp;gt;

  &amp;lt;uses-permission android:name=&quot;android.permission.INTERNET&quot; /&amp;gt;

  &amp;lt;application
    android:usesCleartextTraffic=&quot;true&quot;
    ...&amp;gt;
    ...
  &amp;lt;/application&amp;gt;

&amp;lt;/manifest&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 강제로 구글 드라이브로 이동하여 표시하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1684313382881&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const { url } = route.params; 

const googleDriveUrl = `https://drive.google.com/viewerng/viewer?embedded=true&amp;amp;url=${encodeURIComponent(url)}`;

  return (
    &amp;lt;Wrapper&amp;gt;
      &amp;lt;Wrap&amp;gt;
        {renderSpinner()}
        &amp;lt;WebView
          source={{ uri: googleDriveUrl }} // 구글 드라이브 접근 uri로 접근하는 커스텀 uri 삽입
          javaScriptEnabled
          originWhitelist={['*']}
        /&amp;gt;
      &amp;lt;/Wrap&amp;gt;
    &amp;lt;/Wrapper&amp;gt;
  );
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;googleDriveUrl 변수를 이용하여 PDF url을 인코딩한 후, 구글 드라이브의 PDF 뷰어 URL과 조합하여 WebView에 전달한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;구글 드라이브를 사용하므로 SSL 인증서 문제를 우회하여 보여줄 수 있다.&lt;/p&gt;</description>
      <category>Front-end/App</category>
      <category>React Native</category>
      <category>react native webview</category>
      <category>react-native</category>
      <category>webview pdf</category>
      <category>웹뷰</category>
      <category>웹뷰 pdf</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/45</guid>
      <comments>https://cotist.tistory.com/45#entry45comment</comments>
      <pubDate>Wed, 17 May 2023 17:53:58 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] 자바스크립트는 싱글 스레드 (+비동기 심화 학습)</title>
      <link>https://cotist.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 단일 쓰레드(single-threaded) 언어이다. 이는 자바스크립트 엔진이 한 번에 하나의 작업만 처리할 수 있다는 것을 의미한다.&lt;br /&gt;&lt;br /&gt;다른 많은 프로그래밍 언어들은 멀티 쓰레드(multi-threaded)를 지원하여 동시에 여러 작업을 처리할 수 있다. 멀티 쓰레드 언어에서는 한 쓰레드가 작업을 처리하는 동안에도 다른 쓰레드가 다른 작업을 처리할 수 있다.&lt;br /&gt;&lt;br /&gt;그러나 자바스크립트는 단일 쓰레드 언어이므로 한 번에 하나의 작업만 처리할 수 있다. 이는 자바스크립트 코드가 순차적으로 실행되는 것을 의미한다. 자바스크립트는 이벤트 루프(event loop)와 비동기 콜백(callback)을 통해 비동기적인 작업을 처리할 수 있게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트 루프는 콜백 함수를 대기열에 추가하고, 대기열의 작업이 완료되면 순차적으로 실행하는 방식으로 동작한다.&lt;br /&gt;&lt;br /&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;pre id=&quot;code_1684159916126&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;시작&quot;);

setTimeout(function() {
  console.log(&quot;타이머 콜백 함수&quot;);
}, 2000);

console.log(&quot;끝&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 코드는 &quot;시작&quot;을 출력한 뒤, 2초 후에 &quot;타이머 콜백 함수&quot;를 출력한다. 마지막으로 &quot;끝&quot;을 출력한다.&lt;br /&gt;&lt;br /&gt;이 코드에서 `setTimeout` 함수는 지정된 시간인&amp;nbsp; 2초가 지난 후에 콜백 함수를 실행한다. 자바스크립트는 단일 쓰레드로 동작하기 때문에 콜백 함수를 기다리는 동안 다른 작업을 처리할 수 없기에 &quot;타이머 콜백 함수&quot;는 &quot;끝&quot;을 출력한 뒤에야 실행된다.&lt;br /&gt;&lt;br /&gt;만약 자바스크립트가 멀티 쓰레드로 동작한다면, &quot;타이머 콜백 함수&quot;는 2초 동안 대기하는 동안에도 다른 작업을 처리할 수 있어야 했을 것이다. 그러나 단일 쓰레드로 동작하는 자바스크립트는 이러한 순차적인 실행 방식을 따르기 때문에 &quot;타이머 콜백 함수&quot;는 이전 작업이 모두 완료된 후에 실행된다.&lt;br /&gt;&lt;br /&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;처리는&amp;nbsp;여러&amp;nbsp;작업을&amp;nbsp;&lt;b&gt;동시&lt;/b&gt;에 처리할 수 있는 기능을 제공하지만, 자바스크립트의 단일 쓰레드 특성으로 인해 실제로는 &lt;b&gt;각 작업을 빠르게 번갈아가면서 실행하는 것이다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;비동기 처리는 일반적으로 콜백 함수, 프로미스(Promise), async/await 등을 사용하여 구현된다. 비동기 작업은 메인 스레드의 실행을 차단하지 않고 백그라운드에서 동작하며, 작업이 완료되면 결과를 처리하는 콜백 함수나 프로미스 체인을 통해 알림을 받을 수 있다.&lt;br /&gt;&lt;br /&gt;예를 들어, 다음은 비동기적으로 이미지를 불러오고, 불러온 이미지를 화면에 표시하는 예시 코드를 보자&lt;/p&gt;
&lt;pre id=&quot;code_1684160455088&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;시작&quot;);

function loadImage(url) {
  return new Promise((resolve, reject) =&amp;gt; {
    const image = new Image();
    image.onload = () =&amp;gt; resolve(image);
    image.onerror = () =&amp;gt; reject(new Error(&quot;이미지를 불러올 수 없습니다.&quot;));
    image.src = url;
  });
}

async function displayImage() {
  try {
    const image = await loadImage(&quot;image.jpg&quot;);
    document.getElementById(&quot;myImage&quot;).src = image.src;
    console.log(&quot;이미지 표시 완료&quot;);
  } catch (error) {
    console.error(error);
  }
}

displayImage();

console.log(&quot;끝&quot;);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 코드에서 loadImage 함수는 이미지를 비동기적으로 불러오는 작업을 수행한다. displayImage 함수는 await를 사용하여 이미지 로드가 완료될 때까지 기다린 후, 로드된 이미지를 화면에 표시한다.&lt;br /&gt;&lt;br /&gt;비동기 작업인 이미지 로드는 메인 스레드의 실행을 차단하지 않고 백그라운드에서 수행되므로, 다른 작업을 처리할 수 있다. 하지만 자바스크립트는 여전히 단일 쓰레드로 동작하므로, 비동기 작업이 진행되는 동안에도 다른 작업을 동시에 처리하는 것은 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[참고 문헌]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Thread&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/en-US/docs/Glossary/Thread&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1684161408498&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;Thread - MDN Web Docs Glossary: Definitions of Web-related terms | MDN&quot; data-og-description=&quot;Thread in computer science is the execution of running multiple tasks or programs at the same time. Each unit capable of executing code is called a thread.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Thread&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Thread&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/idvU3/hySCVZlPXm/cL2WL75wbJiu7kcOSkuWR1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Thread&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Glossary/Thread&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/idvU3/hySCVZlPXm/cL2WL75wbJiu7kcOSkuWR1/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;Thread - MDN Web Docs Glossary: Definitions of Web-related terms | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Thread in computer science is the execution of running multiple tasks or programs at the same time. Each unit capable of executing code is called a thread.&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;</description>
      <category>Basic/JavaScript</category>
      <category>JavaScript</category>
      <category>singlethread</category>
      <category>싱글스레드</category>
      <category>자바스크립트</category>
      <author>Cotist</author>
      <guid isPermaLink="true">https://cotist.tistory.com/44</guid>
      <comments>https://cotist.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 15 May 2023 23:37:35 +0900</pubDate>
    </item>
  </channel>
</rss>