<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>햄직의 비상지식 저장소</title>
    <link>https://hamzgi.tistory.com/</link>
    <description>지식주머니 가득 찰 때까지 기록하는 습관</description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 20:46:47 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>hamzgi</managingEditor>
    <image>
      <title>햄직의 비상지식 저장소</title>
      <url>https://tistory1.daumcdn.net/tistory/8339342/attach/02748bacd18648feb97b26fcf14f7090</url>
      <link>https://hamzgi.tistory.com</link>
    </image>
    <item>
      <title>[구글 스터디잼] App Engine: Qwik Start - Python</title>
      <link>https://hamzgi.tistory.com/15</link>
      <description>&lt;h3 style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;학습할 내용&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 실습에서는 Python 앱으로 다음 작업을 수행하는 방법을 알아봅니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;클론/다운로드&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;테스트&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;업데이트&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;테스트&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;배포&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 id=&quot;step4&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 1. Google App Engine Admin API 사용 설정&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;App Engine Admin API를 사용하면 개발자가 App Engine 애플리케이션을 프로비저닝하고 관리할 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;왼쪽&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;탐색 메뉴&lt;/b&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;API 및 서비스&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;라이브러리&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;검색창에 'App Engine Admin API'를 입력합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;App Engine Admin API&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;카드를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;사용 설정&lt;/b&gt;을 클릭합니다. API 사용 설정 메시지가 표시되지 않으면 이미 사용 설정되어 있으므로 추가 작업이 필요하지 않습니다.&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;h2 id=&quot;step5&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 2. Hello World 앱 다운로드&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;간단한 Python용 Hello World 앱을 사용하면 Google Cloud에 앱을 배포하는 방법을 빠르게 익힐 수 있습니다. 다음 단계를 따라 Google Cloud 인스턴스에 Hello World를 다운로드합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 다음 명령어를 입력하여 Hello World 샘플 앱 저장소를 Google Cloud 인스턴스에 복사합니다.&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;crmsh&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OIevs/dJMcabcX0wF/v7cT74QmgsJE6DeEvRO2ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OIevs/dJMcabcX0wF/v7cT74QmgsJE6DeEvRO2ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OIevs/dJMcabcX0wF/v7cT74QmgsJE6DeEvRO2ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOIevs%2FdJMcabcX0wF%2Fv7cT74QmgsJE6DeEvRO2ek%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;117&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;깃 클론이 잘 되었네요!&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;2.샘플 코드가 있는 디렉터리로 이동합니다.&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;cd python-docs-samples/appengine/standard_python3/hello_world&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;14&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/basceD/dJMcacXguz8/DTPVxVBKQ4vaRpqcWA66PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/basceD/dJMcacXguz8/DTPVxVBKQ4vaRpqcWA66PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/basceD/dJMcacXguz8/DTPVxVBKQ4vaRpqcWA66PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbasceD%2FdJMcacXguz8%2FDTPVxVBKQ4vaRpqcWA66PK%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;869&quot; height=&quot;14&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;14&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;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;3. Python 환경 설정&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;sudo apt update
sudo apt install -y python3-venv
python3 -m venv myenv
source myenv/bin/activate&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Oal6b/dJMcaciGgzR/BlugpYKQkg3q3B2j5PHpt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Oal6b/dJMcaciGgzR/BlugpYKQkg3q3B2j5PHpt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Oal6b/dJMcaciGgzR/BlugpYKQkg3q3B2j5PHpt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOal6b%2FdJMcaciGgzR%2FBlugpYKQkg3q3B2j5PHpt0%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;959&quot; height=&quot;206&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;206&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step6&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 3. 애플리케이션 테스트&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사전 설치된 App Engine SDK에 포함된 Google Cloud 개발 서버(dev_appserver.py)를 사용하여 애플리케이션을 테스트합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;앱의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #1a73e8;&quot; href=&quot;https://cloud.google.com/appengine/docs/standard/python/config/appref&quot;&gt;app.yaml&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구성 파일이 있는 helloworld 디렉터리에서 다음 명령어를 사용하여 Google Cloud 개발 서버를 시작합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;flask --app main run&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhdYqd/dJMcacprTQx/H3eEnWVZqS8OFYxOtX2Xxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhdYqd/dJMcacprTQx/H3eEnWVZqS8OFYxOtX2Xxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhdYqd/dJMcacprTQx/H3eEnWVZqS8OFYxOtX2Xxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhdYqd%2FdJMcacprTQx%2FH3eEnWVZqS8OFYxOtX2Xxk%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;1172&quot; height=&quot;86&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ctrl + C를 누르면 종료할 수 있습니다~&lt;/p&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot; aria-hidden=&quot;true&quot;&gt;&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이제 개발 서버가 실행되고 포트 5000에서 요청을 수신 대기합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;웹 미리보기&lt;/b&gt;(&lt;img src=&quot;https://blog.kakaocdn.net/dna/bhnL9X/dJMcacbUjVx/AAAAAAAAAAAAAAAAAAAAAG6w7p2zNiqgpIQzXw-XJkOwtK3Wf15gl9Eq30NGX21D/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1780239599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=jKbpOnHc0twxqoqOnspRcUU2Btw%3D&quot; /&gt;) &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;포트 변경&lt;/b&gt;을 클릭하여 결과를 확인합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;포트 번호를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;5000&lt;/b&gt;으로 변경하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;변경 및 미리보기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;새 브라우저 창에 다음이 표시됩니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;Ctrl+C&lt;/b&gt;를 눌러 서버를 중단합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emguly/dJMcahxw84Q/kAvQGZ89sXslsv9dnuK6Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emguly/dJMcahxw84Q/kAvQGZ89sXslsv9dnuK6Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emguly/dJMcahxw84Q/kAvQGZ89sXslsv9dnuK6Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Femguly%2FdJMcahxw84Q%2FkAvQGZ89sXslsv9dnuK6Ck%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;555&quot; height=&quot;102&quot; data-origin-width=&quot;555&quot; data-origin-height=&quot;102&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;h2 id=&quot;step7&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 4. 변경하기&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 작업에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;main.py를 편집하여 'Hello World!'를 'Hello, Cruel World!'로 변경합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;다음 명령어를 입력하여 nano에서 main.py를 열고 콘텐츠를 수정합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;nano main.py&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;'Hello World!'를 'Hello, Cruel World!'로 업데이트합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EGLfn/dJMb99TMnxl/h7R2qDAmYAAeFhG12oHQT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EGLfn/dJMb99TMnxl/h7R2qDAmYAAeFhG12oHQT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EGLfn/dJMb99TMnxl/h7R2qDAmYAAeFhG12oHQT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEGLfn%2FdJMb99TMnxl%2Fh7R2qDAmYAAeFhG12oHQT0%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;1064&quot; height=&quot;194&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;Ctrl + S&lt;/b&gt;를 눌러 파일을 저장하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Ctrl + X&lt;/b&gt;를 눌러 종료합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;다음 명령어를 사용하여 Google Cloud 개발 서버를 다시 시작합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;pre class=&quot;dockerfile&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;flask --app main run&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;Hello World! 브라우저를 새로고침하거나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;웹 미리보기&lt;/b&gt;(&lt;img src=&quot;https://blog.kakaocdn.net/dna/1QwAD/dJMcagFpn5F/AAAAAAAAAAAAAAAAAAAAAPKOqGI6w4e0mm2lggFt2uu6ukTOU2H54WIhR5XH03VG/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1780239599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=IqrfwJP9bpsudQs9ngJaJ%2Bdj%2BAU%3D&quot; /&gt;) &amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;5000 포트에서 미리보기&lt;/b&gt;를 클릭하여 결과를 확인합니다.&lt;img src=&quot;https://blog.kakaocdn.net/dna/XV5Kn/dJMcajaZOw9/AAAAAAAAAAAAAAAAAAAAAKeWCAw9SDXluRc2tHseLW-SPQ2Zym23RYdbAG8CLD5f/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1780239599&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=r1yy8CHQtlavUXWvd9Qlg47NUNQ%3D&quot; /&gt;&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;Ctrl+C&lt;/b&gt;를 눌러 서버를 중단합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step8&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 5. 앱 배포&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;App Engine에 앱을 배포하려면 app.yaml 파일이 있는 애플리케이션의 루트 디렉터리에서 다음 명령어를 실행합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;pre class=&quot;ebnf&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;gcloud app deploy&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot; aria-hidden=&quot;true&quot;&gt;복사되었습니다.&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;해당 지역을 나타내는 숫자를 입력합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;REGION&amp;gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;그러면 App Engine 애플리케이션이 생성됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출력 예시:&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;groovy&quot; style=&quot;background-color: #2b2b2b; color: #f8f8f2;&quot;&gt;&lt;code&gt;Creating App Engine application in project [qwiklabs-gcp-233dca09c0ab577b] and region [&quot;REGION&quot;]....done.
Services to deploy:

descriptor:      [/home/gcpstaging8134_student/python-docs-samples/appengine/standard/hello_world/app.yaml]
source:          [/home/gcpstaging8134_student/python-docs-samples/appengine/standard/hello_world]
target project:  [qwiklabs-gcp-233dca09c0ab577b]
target service:  [default]
target version:  [20171117t072143]
target url:      [https://qwiklabs-gcp-233dca09c0ab577b.appspot.com]

Do you want to continue (Y/n)?
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;세부정보를 확인하고 서비스 배포를 시작하라는 메시지가 표시되면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Y&lt;/b&gt;를 입력합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출력 예시:&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #2b2b2b; color: #f8f8f2;&quot;&gt;&lt;code&gt;Beginning deployment of service [default]...
Some files were skipped. Pass `--verbosity=info` to see which ones.
You may also view the gcloud log file, found at
[/tmp/tmp.dYC7xGu3oZ/logs/2017.11.17/07.18.27.372768.log].
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 5 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════
File upload done.
Updating service [default]...done.
Waiting for operation [apps/qwiklabs-gcp-233dca09c0ab577b/operations/2e88ab76-33dc-4aed-93c4-fdd944a95ccf] to complete...done.
Updating service [default]...done.
Deployed service [default] to [https://qwiklabs-gcp-233dca09c0ab577b.appspot.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;앱을 배포하는 동안 'Unable to retrieve P4SA'라는 오류가 표시되면 위의 명령어를 다시 실행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step9&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 6. 애플리케이션 보기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;브라우저를 실행하려면 다음 명령어를 입력한 후 제공된 링크를 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;pre class=&quot;stata&quot; style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;&lt;code&gt;gcloud app browse&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;background-color: #ffffff;&quot; aria-hidden=&quot;true&quot;&gt;복사되었습니다.&lt;/span&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;출력 예시(링크는 사용자마다 다름):&lt;/p&gt;
&lt;div&gt;
&lt;pre class=&quot;vim&quot; style=&quot;background-color: #2b2b2b; color: #f8f8f2;&quot;&gt;&lt;code&gt;Did not detect your browser. Go to this link to view your app:
https://qwiklabs-gcp-233dca09c0ab577b.appspot.com&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; 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;792&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPmXt/dJMcaad6MNh/TYUGVlsnorsapHEavGzVIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPmXt/dJMcaad6MNh/TYUGVlsnorsapHEavGzVIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPmXt/dJMcaad6MNh/TYUGVlsnorsapHEavGzVIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPmXt%2FdJMcaad6MNh%2FTYUGVlsnorsapHEavGzVIK%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;792&quot; height=&quot;298&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;298&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;448&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mk6mD/dJMcadojTn7/oxww0Nsq3GdsHftnk4YCs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mk6mD/dJMcadojTn7/oxww0Nsq3GdsHftnk4YCs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mk6mD/dJMcadojTn7/oxww0Nsq3GdsHftnk4YCs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmk6mD%2FdJMcadojTn7%2Foxww0Nsq3GdsHftnk4YCs0%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;448&quot; height=&quot;59&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;59&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6udrK/dJMcabqyFAC/Mn8KA7mCSaOgGKByOWHkY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6udrK/dJMcabqyFAC/Mn8KA7mCSaOgGKByOWHkY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6udrK/dJMcabqyFAC/Mn8KA7mCSaOgGKByOWHkY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6udrK%2FdJMcabqyFAC%2FMn8KA7mCSaOgGKByOWHkY0%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;494&quot; height=&quot;430&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcbqM6/dJMcaiXrQ5q/kQmaW9zZzx5Et4oRObokd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcbqM6/dJMcaiXrQ5q/kQmaW9zZzx5Et4oRObokd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcbqM6/dJMcaiXrQ5q/kQmaW9zZzx5Et4oRObokd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcbqM6%2FdJMcaiXrQ5q%2FkQmaW9zZzx5Et4oRObokd0%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;497&quot; height=&quot;371&quot; data-origin-width=&quot;497&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 id=&quot;step11&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;수고하셨습니다.&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 실습에서는 기본 Python 앱을 App Engine에 배포하는 방법을 배웠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;GCP를 이용하여 파이썬 앱을 배포해봤는데 서버구축 및 운영실습 수업시간 때 배웠던 리눅스 명령어나 깃 공부했던게 여기서도 쓰이는 걸 보고 역시 기초 공부는 어딘가에선 써먹을 곳이 많구나라는 것을 느꼈습니다!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;Copyright 2026 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Google-Studyjam [with GCP]</category>
      <category>Cloud</category>
      <category>gcp</category>
      <category>Google skills</category>
      <category>스터디잼</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/15</guid>
      <comments>https://hamzgi.tistory.com/15#entry15comment</comments>
      <pubDate>Mon, 4 May 2026 03:09:08 +0900</pubDate>
    </item>
    <item>
      <title>[구글 스터디잼] Cloud Storage: Qwik Start - Google Cloud 콘솔</title>
      <link>https://hamzgi.tistory.com/14</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;중급 난이도 실습을 해보다가 너무 복잡해서 GCP의 기초부터 배우기위해서 Standard-Infra 부터 공부를 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step4&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 1. 버킷 만들기&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;버킷은 Cloud Storage에서 데이터를 보관하는 기본 컨테이너입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;버킷을 만드는 방법은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;Cloud 콘솔에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;b&gt;탐색 메뉴(&lt;/b&gt;&lt;/b&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;15&quot; data-origin-height=&quot;13&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n8qRc/dJMcagrMizg/zZC3g24Qw2WriyUv13R7c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n8qRc/dJMcagrMizg/zZC3g24Qw2WriyUv13R7c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n8qRc/dJMcagrMizg/zZC3g24Qw2WriyUv13R7c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn8qRc%2FdJMcagrMizg%2FzZC3g24Qw2WriyUv13R7c0%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;15&quot; height=&quot;13&quot; data-origin-width=&quot;15&quot; data-origin-height=&quot;13&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;b&gt;)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Cloud Storage&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;버킷&lt;/b&gt;으로 이동합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;+ 만들기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2192&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dswx4Q/dJMcaiQDtt4/GmMQtoZB9HbAqRf8fR1PC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dswx4Q/dJMcaiQDtt4/GmMQtoZB9HbAqRf8fR1PC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dswx4Q/dJMcaiQDtt4/GmMQtoZB9HbAqRf8fR1PC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdswx4Q%2FdJMcaiQDtt4%2FGmMQtoZB9HbAqRf8fR1PC1%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;2192&quot; height=&quot;666&quot; data-origin-width=&quot;2192&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;각 단계를 완료하려면 버킷 정보를 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;계속&lt;/b&gt;을 클릭합니다.&lt;/li&gt;
&lt;/ol&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2026-04-28 171155.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DtIuy/dJMb997gBgO/wgMOC0H2qMHQwVUisyPkUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DtIuy/dJMb997gBgO/wgMOC0H2qMHQwVUisyPkUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DtIuy/dJMb997gBgO/wgMOC0H2qMHQwVUisyPkUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDtIuy%2FdJMb997gBgO%2FwgMOC0H2qMHQwVUisyPkUk%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;2879&quot; height=&quot;1799&quot; data-filename=&quot;화면 캡처 2026-04-28 171155.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&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;이 문제에서는 조건이 주어져있습니다.&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; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc; color: #202124;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;&lt;b&gt;버킷 이름 지정:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버킷의 고유한 이름을 입력합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;프로젝트 ID&lt;/b&gt;가 항상 고유하므로 이 실습에서는 프로젝트 ID를 버킷 이름으로 사용하면 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;버킷 이름 지정 규칙:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc; color: #202124;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;버킷 네임스페이스는 전역적이며 전체 공개로 표시되기 때문에 버킷 이름에 민감한 정보를 포함해서는 안 됩니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;버킷 이름에는 소문자, 숫자, 대시(-), 밑줄(_), 점(.)만 포함해야 합니다. 점이 포함된 이름은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a style=&quot;color: #1a73e8;&quot; href=&quot;https://cloud.google.com/storage/docs/domain-name-verification&quot;&gt;확인&lt;/a&gt;이 필요합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;버킷 이름은 숫자 또는 문자로 시작하고 끝나야 합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;버킷 이름은 3자~63자까지 포함할 수 있습니다. 점을 포함하는 이름은 최대 222자를 포함할 수 있으나, 점으로 구분된 각 부분은 63자 이하여야 합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;버킷 이름은 점 십진 표기법 형식의 IP 주소로 표시할 수 없습니다(예: 192.168.5.4).&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;버킷 이름은 프리픽스 'goog'로 시작할 수 없습니다. 또한 버킷 이름에 'google' 또는 'google'의 철자를 약간 변경한 문자열을 포함할 수 없습니다.*&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;DNS 규정 준수와 향후 호환성을 위해 밑줄(_)을 사용하지 말아야 하며 마침표를 다른 마침표 혹은 대시 옆에 연달아 사용해서는 안 됩니다. 예를 들어 '..'이나 '-.' 또는 '.-'는 DNS 이름으로 유효하지 않습니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;&lt;b&gt;위치 유형&lt;/b&gt;으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;리전&lt;/b&gt;을 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;위치&lt;/b&gt;로&lt;span&gt;&amp;nbsp;&lt;/span&gt;us-central1을(를) 선택합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;&lt;b&gt;기본 클래스 설정&lt;/b&gt;에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;표준&lt;/b&gt;을 선택합니다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc; color: #202124;&quot;&gt;&lt;b&gt;액세스 제어&lt;/b&gt;로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;균일&lt;/b&gt;을 선택하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 버킷에 공개 액세스 방지 적용을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;선택 해제&lt;/b&gt;하여 설정을 해제합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;나머지 필드는 기본값으로 두고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;만들기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;/ol&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;스크린샷 2026-04-28 171554.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blSFyV/dJMcabxdX75/5AITRpUwkT3i9HDAfxfILK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blSFyV/dJMcabxdX75/5AITRpUwkT3i9HDAfxfILK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blSFyV/dJMcabxdX75/5AITRpUwkT3i9HDAfxfILK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblSFyV%2FdJMcabxdX75%2F5AITRpUwkT3i9HDAfxfILK%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;2879&quot; height=&quot;1799&quot; data-filename=&quot;스크린샷 2026-04-28 171554.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&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;h2 id=&quot;step5&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 2. 버킷에 객체 업로드&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfC1f9/dJMcajoqPib/QaTA4yKqTsrsJwMTKMk3K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfC1f9/dJMcajoqPib/QaTA4yKqTsrsJwMTKMk3K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfC1f9/dJMcajoqPib/QaTA4yKqTsrsJwMTKMk3K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfC1f9%2FdJMcajoqPib%2FQaTA4yKqTsrsJwMTKMk3K1%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;384&quot; height=&quot;251&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 이미지를 새 버킷으로 업로드하려면 다음을 수행합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;위 이미지를 마우스 오른쪽 버튼으로 클릭하고 컴퓨터로 다운로드합니다. 다운로드 시 이미지 이름을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;kitten.png&lt;/b&gt;로 변경하여 저장합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;Cloud Storage 브라우저 페이지에서 앞서 만든 버킷의 이름을 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;객체&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;업로드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파일 업로드&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;파일 대화상자에서 다운로드한 파일로 이동하여 선택합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;파일 이름이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;kitten.png&lt;/b&gt;인지 확인합니다. 이름이 다르다면 파일의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;점 3개&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;아이콘을 클릭하고 드롭다운에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;이름 바꾸기&lt;/b&gt;를 선택한 후 파일 이름을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;kitten.png&lt;/b&gt;로 변경합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;업로드가 완료되면 파일 이름과 함께 파일의 크기, 형식 등의 정보가 표시됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step6&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 3. 공개적으로 버킷 공유&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;버킷에 대한 공개 액세스를 허용하고 이미지에 공개적으로 액세스할 수 있는 URL을 만들려면 다음을 수행합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;파일 목록 위에 있는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;권한&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭을 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;보기가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;보안 주체별로 보기&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭으로 설정되어 있는지 확인합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;액세스 권한 부여&lt;/b&gt;를 클릭하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;보안 주체 추가&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;창이 표시됩니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;새 보안 주체&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;상자에&lt;span&gt;&amp;nbsp;&lt;/span&gt;모든 사용자를 입력합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;역할 선택&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;드롭다운에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Cloud Storage&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;스토리지 객체 뷰어&lt;/b&gt;를 선택합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;저장&lt;/b&gt;을 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;이 리소스를 공개로 설정하시겠어요?&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;창에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;공개 액세스 허용&lt;/b&gt;을 클릭합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-28 171943.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l3S0Y/dJMcagrMiKU/t0T3YJlUtL7nULkZI47K0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l3S0Y/dJMcagrMiKU/t0T3YJlUtL7nULkZI47K0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l3S0Y/dJMcagrMiKU/t0T3YJlUtL7nULkZI47K0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl3S0Y%2FdJMcagrMiKU%2Ft0T3YJlUtL7nULkZI47K0k%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;2879&quot; height=&quot;1799&quot; data-filename=&quot;스크린샷 2026-04-28 171943.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&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;대상은 모든 유저, 역할은 저장소 개체 뷰어(Storage object viewer)로 지정해주고, 팝업 창에서 공개 엑세스 허용을 해주면&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;화면 캡처 2026-04-28 171757.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OvDUE/dJMcaayl2R5/ekQt4bKnLIl3KAGOtCh9r1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OvDUE/dJMcaayl2R5/ekQt4bKnLIl3KAGOtCh9r1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OvDUE/dJMcaayl2R5/ekQt4bKnLIl3KAGOtCh9r1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOvDUE%2FdJMcaayl2R5%2FekQt4bKnLIl3KAGOtCh9r1%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;2879&quot; height=&quot;1799&quot; data-filename=&quot;화면 캡처 2026-04-28 171757.png&quot; data-origin-width=&quot;2879&quot; data-origin-height=&quot;1799&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step7&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 4. 폴더 만들기&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;객체&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;폴더 만들기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;이름&lt;/b&gt;에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;folder1&lt;/b&gt;을 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;만들기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;버킷의 폴더가 객체와의 구분을 위한 폴더 이미지 아이콘으로 표시됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;하위 폴더를 만들고 여기에 파일을 업로드합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;folder1&lt;/b&gt;을 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;폴더 만들기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;이름&lt;/b&gt;에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;folder2&lt;/b&gt;를 입력하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;만들기&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;folder2&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;업로드&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파일 업로드&lt;/b&gt;를 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;파일 대화상자에서 다운로드한 스크린샷을 탐색하여 선택합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; 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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;화면 캡처 2026-04-28 171838.png&quot; data-origin-width=&quot;2365&quot; data-origin-height=&quot;1050&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KpWfF/dJMb997gBSz/UOPYN6iOrBbkfSsgM6hk61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KpWfF/dJMb997gBSz/UOPYN6iOrBbkfSsgM6hk61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KpWfF/dJMb997gBSz/UOPYN6iOrBbkfSsgM6hk61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKpWfF%2FdJMb997gBSz%2FUOPYN6iOrBbkfSsgM6hk61%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;2365&quot; height=&quot;1050&quot; data-filename=&quot;화면 캡처 2026-04-28 171838.png&quot; data-origin-width=&quot;2365&quot; data-origin-height=&quot;1050&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step8&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;작업 5. 폴더 삭제&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;버킷 세부정보&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;옆에 있는 화살표를 클릭하여 버킷 수준으로 돌아갑니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;버킷을 선택합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;삭제&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼을 클릭합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;창이 열리면&lt;span&gt;&amp;nbsp;&lt;/span&gt;삭제를 입력하여 폴더 삭제를 확인합니다.&lt;/li&gt;
&lt;li style=&quot;color: #202124;&quot;&gt;&lt;b&gt;삭제&lt;/b&gt;를 클릭하여 폴더와 그 안의 모든 객체, 하위 폴더를 영구 삭제합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막으로 폴더 삭제인데 폴더를 체크하고 폴더를 삭제하면 됩니다. 삭제할 때 정말 삭제할 거면 DELETE를 입력하라는 확인 팝업창도 뜨게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 첫 번째 실습을 마쳤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id=&quot;step9&quot; style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;수고하셨습니다&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Cloud Storage 버킷을 만들고, 버킷에 객체를 추가하고, 폴더로 애셋을 정리하며, 객체에 대한 공개 액세스를 허용하는 방법을 배웠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;라고 하네요 감사합니다 구글!!&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202124; text-align: start;&quot;&gt;Copyright 2026 Google LLC. All rights reserved. Google 및 Google 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표일 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>Google-Studyjam [with GCP]</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/14</guid>
      <comments>https://hamzgi.tistory.com/14#entry14comment</comments>
      <pubDate>Tue, 28 Apr 2026 17:27:12 +0900</pubDate>
    </item>
    <item>
      <title>개인 포트폴리오 프로젝트 - JS를 사용한 V.2 반응형 포트폴리오</title>
      <link>https://hamzgi.tistory.com/13</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;발표에 사용할 포트폴리오는 수업중에 배웠던 개념과 디자인을 중심적으로 만들어보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 멋쟁이사자처럼 동아리에서 배웠던 JS를 조금 더 공부해서 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여 V.2 포트폴리오를 만들게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사이트는 nav바의 홈, 소개, 기술 등의 글씨를 눌러도 다른 페이지로 넘어가는 것이 아닌 한 페이지에서 스크롤이 움직이면서&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-26 013450.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn0QrQ/dJMcad2OCKG/LzJQCqvNKzwuOSt6UfVhf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn0QrQ/dJMcad2OCKG/LzJQCqvNKzwuOSt6UfVhf1/img.png&quot; data-alt=&quot;홈 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn0QrQ/dJMcad2OCKG/LzJQCqvNKzwuOSt6UfVhf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn0QrQ%2FdJMcad2OCKG%2FLzJQCqvNKzwuOSt6UfVhf1%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013450.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;위 이미지는 V.2 포트폴리오 사이트 (앞으로는 줄여서 V.2라고 하겠다)의 랜딩 홈페이지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지라 보이진 않지만 아바타 이미지는 상하로 조금씩 움직이며 파랗게 빛나는 기능을 구현해봤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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-filename=&quot;스크린샷 2026-04-26 013501.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZm4JD/dJMcah5hJ4c/FCEQgIfSK6reVk0mt2DXJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZm4JD/dJMcah5hJ4c/FCEQgIfSK6reVk0mt2DXJk/img.png&quot; data-alt=&quot;소개 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZm4JD/dJMcah5hJ4c/FCEQgIfSK6reVk0mt2DXJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZm4JD%2FdJMcah5hJ4c%2FFCEQgIfSK6reVk0mt2DXJk%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013501.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;간단한 자기소개와 중부대학교 2학년(Sophomore의 So.), 동아리 정보, 열정 % 카드를 추가해서 간단하게 내가 누구인지 보여주는 영역을 만들어보았다.&lt;/p&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-filename=&quot;스크린샷 2026-04-26 013506.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clIFx4/dJMcaiC5H5K/tEQ80phVELCJa69Qis4xRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clIFx4/dJMcaiC5H5K/tEQ80phVELCJa69Qis4xRK/img.png&quot; data-alt=&quot;기술 스택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clIFx4/dJMcaiC5H5K/tEQ80phVELCJa69Qis4xRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclIFx4%2FdJMcaiC5H5K%2FtEQ80phVELCJa69Qis4xRK%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013506.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;각 카드는 마우스를 올릴경우 파란빛이 나오며 살짝 위로 뜨고 아이콘이 한바퀴 도는 애니메이션을 넣어 마이크로 리액션처럼 구현해봤다. 또한 카드 하단에 Skill bar를 배치하여 몇 %정도 해당 기술 스택을 공부했는지를 표현해봤다.&lt;/p&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-filename=&quot;스크린샷 2026-04-26 013517.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbePmY/dJMcacQp4Jl/DX5ZQZbFK1vvqVdFr3XnMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbePmY/dJMcacQp4Jl/DX5ZQZbFK1vvqVdFr3XnMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbePmY/dJMcacQp4Jl/DX5ZQZbFK1vvqVdFr3XnMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbePmY%2FdJMcacQp4Jl%2FDX5ZQZbFK1vvqVdFr3XnMK%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013517.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 이미지는 팀 프로젝트 &amp;amp; 팀원을 나타내는 영역이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 카드는 팀플, 팀원 소개, 깃허브, 과제 페이지로 이동되는 링크가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 카드 또한 마우스를 올리면 반응을 하도록 디자인하였다.&lt;/p&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-filename=&quot;스크린샷 2026-04-26 013525.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0mGpz/dJMcaakLFKt/jB2C7RPkhYzfT0rV62azFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0mGpz/dJMcaakLFKt/jB2C7RPkhYzfT0rV62azFK/img.png&quot; data-alt=&quot;홈 페이지 하단 연락처&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0mGpz/dJMcaakLFKt/jB2C7RPkhYzfT0rV62azFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0mGpz%2FdJMcaakLFKt%2FjB2C7RPkhYzfT0rV62azFK%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013525.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;이메일, 깃헙, 블로그, 전화번호를 보여주는 카드를 배치했으며 이 또한 마찬가지로 마우스를 올리면 파랗게 강조되고 아이콘이 한바퀴 돈다.(이미지 속 이메일 아이콘이 세로로 납작해보이는 이유)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지가 홈 페이지의 요소들이였다. 이 밑은 상단 nav바에 있는 과제소개 버튼을 누르면 이동되는 과제소개 페이지 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원 페이지를 구현하려 했지만 한 페이지에 너무 많은 정보가 있는 것은 꽤나 불편했기에 UX를 생각하여 과제 부분은 따로 페이지를 만들어보았다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-26 013535.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PCqYW/dJMcaa59MLC/yUGkaUwmOEEKDZ0p76AhXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PCqYW/dJMcaa59MLC/yUGkaUwmOEEKDZ0p76AhXK/img.png&quot; data-alt=&quot;과제 소개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PCqYW/dJMcaa59MLC/yUGkaUwmOEEKDZ0p76AhXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPCqYW%2FdJMcaa59MLC%2FyUGkaUwmOEEKDZ0p76AhXK%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013535.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;홈 페이지의 아바타 이미지처럼 저 파일 아이콘이 있는 둥근 푸른 구체도 상하로 움직이며 빛난다. 디자인 통일성을 주기위해 저렇게 만들었다.&lt;/p&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-filename=&quot;스크린샷 2026-04-26 013543.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba8HAV/dJMcaiC5H9M/Kr8g5KTQEQ2M1PTqk2Bu0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba8HAV/dJMcaiC5H9M/Kr8g5KTQEQ2M1PTqk2Bu0k/img.png&quot; data-alt=&quot;과제 레포 소개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba8HAV/dJMcaiC5H9M/Kr8g5KTQEQ2M1PTqk2Bu0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba8HAV%2FdJMcaiC5H9M%2FKr8g5KTQEQ2M1PTqk2Bu0k%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013543.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-26 013550.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TlkEG/dJMcafsPS6i/cAGITTMKC4sBQDAksVsWs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TlkEG/dJMcafsPS6i/cAGITTMKC4sBQDAksVsWs1/img.png&quot; data-alt=&quot;과제 핵심 요소&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TlkEG/dJMcafsPS6i/cAGITTMKC4sBQDAksVsWs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTlkEG%2FdJMcafsPS6i%2FcAGITTMKC4sBQDAksVsWs1%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013550.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;아래 이미지는 카드 중에서 list.html 카드를 눌렀을 때 이동되는 페이지이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-26 015540.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dANFrF/dJMcag6mEsP/fe716kd9uR9uTZDZBtiiJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dANFrF/dJMcag6mEsP/fe716kd9uR9uTZDZBtiiJk/img.png&quot; data-alt=&quot;list.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dANFrF/dJMcag6mEsP/fe716kd9uR9uTZDZBtiiJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdANFrF%2FdJMcag6mEsP%2Ffe716kd9uR9uTZDZBtiiJk%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 015540.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;list.html&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-26 013556.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7kQd4/dJMcab42Wp4/RkWYOjNIKARfLm4rwKlzyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7kQd4/dJMcab42Wp4/RkWYOjNIKARfLm4rwKlzyk/img.png&quot; data-alt=&quot;과제 상세 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7kQd4/dJMcab42Wp4/RkWYOjNIKARfLm4rwKlzyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7kQd4%2FdJMcab42Wp4%2FRkWYOjNIKARfLm4rwKlzyk%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013556.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;각 카드에는 해당되는 페이지로 이동되는 &quot;배포 사이트 보기 -&amp;gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-26 013600.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbLdEs/dJMcahc7X5a/FXxECLxdd9lrMPGKc2Ry6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbLdEs/dJMcahc7X5a/FXxECLxdd9lrMPGKc2Ry6k/img.png&quot; data-alt=&quot;연결 링크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbLdEs/dJMcahc7X5a/FXxECLxdd9lrMPGKc2Ry6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbLdEs%2FdJMcahc7X5a%2FFXxECLxdd9lrMPGKc2Ry6k%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013600.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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-filename=&quot;스크린샷 2026-04-26 013608.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0Il9D/dJMcabcSKix/tyQTcKHhCajctrKFsxRhhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0Il9D/dJMcabcSKix/tyQTcKHhCajctrKFsxRhhk/img.png&quot; data-alt=&quot;푸터 아이콘 링크&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0Il9D/dJMcabcSKix/tyQTcKHhCajctrKFsxRhhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0Il9D%2FdJMcabcSKix%2FtyQTcKHhCajctrKFsxRhhk%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013608.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;다크/라이트 모드 토글 전환 버튼&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;V.2 페이지에서 먼저 만들어보고 제출한 포트폴리오 사이트에도 가져온 기능이 다크모드와 라이트모드를 전환하는 토글 기능이였다. 항상 다크/라이트 모드 기능을 우선으로 찾는 나에겐 꼭 구현해보고 싶은 기능이였다.&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;스크린샷 2026-04-26 013615.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4oDB3/dJMcaiQBzMB/F3xI7LTjGZDjt6v6glqWU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4oDB3/dJMcaiQBzMB/F3xI7LTjGZDjt6v6glqWU0/img.png&quot; data-alt=&quot;라이트 모드 홈페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4oDB3/dJMcaiQBzMB/F3xI7LTjGZDjt6v6glqWU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4oDB3%2FdJMcaiQBzMB%2FF3xI7LTjGZDjt6v6glqWU0%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013615.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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;전체적으로 푸른 테마는 남겨두고 어두운 부분만 반전시켜 다크/라이트 모드를 만들어봤다. 한 번 누르면 다른 페이지로 이동해도 유지되며 이 기능에도 JS가 사용된다.&lt;/p&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-filename=&quot;스크린샷 2026-04-26 013623.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c89xVI/dJMcagFjY3I/nHkHCo10i6mNg26mnVPcPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c89xVI/dJMcagFjY3I/nHkHCo10i6mNg26mnVPcPK/img.png&quot; data-alt=&quot;라이트 소개&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c89xVI/dJMcagFjY3I/nHkHCo10i6mNg26mnVPcPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc89xVI%2FdJMcagFjY3I%2FnHkHCo10i6mNg26mnVPcPK%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013623.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&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-filename=&quot;스크린샷 2026-04-26 013628.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0bFBi/dJMcagFjY3J/GmA4bd3fW0uYXXGb9amAGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0bFBi/dJMcagFjY3J/GmA4bd3fW0uYXXGb9amAGk/img.png&quot; data-alt=&quot;라이트 팀플 &amp;amp;amp; 팀원&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0bFBi/dJMcagFjY3J/GmA4bd3fW0uYXXGb9amAGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0bFBi%2FdJMcagFjY3J%2FGmA4bd3fW0uYXXGb9amAGk%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;1920&quot; height=&quot;1080&quot; data-filename=&quot;스크린샷 2026-04-26 013628.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라이트 팀플 &amp;amp; 팀원&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위는 라이트 모드에서의 팀 프로젝트 &amp;amp; 팀원 영역이다.&lt;/p&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;추후에 더 많은 기능과 구조를 추가해보고 싶은 V.2 포트폴리오 사이트였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단히 소개하기 위해 만든 글이라서 상세한 코드는 글에 넣지 않았으며 나중에 따로 각 기능에 맞춰 나눠서 글을 써볼까 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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://youtu.be/pxqRtJPzJmQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/pxqRtJPzJmQ&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹프로그래밍 과제</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/13</guid>
      <comments>https://hamzgi.tistory.com/13#entry13comment</comments>
      <pubDate>Sun, 26 Apr 2026 02:10:29 +0900</pubDate>
    </item>
    <item>
      <title>[ 멋사 보너스 과제] localStorage와 sessionStorage 취약점</title>
      <link>https://hamzgi.tistory.com/12</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;저번 실습 때 js에 대해서 공부하면서 배웠던 개념이 필요합니다!&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멋사 실습 과제 웹페이지를 들어가서 우선 F12를 눌러 DevTools에 진입합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웬만하면 HTML,CSS에는 권한이나 로직코드가 들어가지 않으므로 우선 Sources탭에서 JS부터 확인해봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 하나씩 훑어 보기에는 너무 긴 코드이기에 Ctrl + F로 원하는 문자열을 찾아보았습니다.&lt;/p&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;&quot;계정의 역할을 admin으로 변경하면 숨겨진 페이지를 찾을 수 있다&quot;&lt;/b&gt;는 힌트를 바탕으로 role과 admin을 검색해봤습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;role부터 쳤을때 role에 해당하는 문자열이 여러개 나왔습니다. (19개가 있었습니다.)&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;스크린샷 2026-04-15 202841.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmggW9/dJMcaaZe6lr/2dZ7wTShtuos3My5N18ktk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmggW9/dJMcaaZe6lr/2dZ7wTShtuos3My5N18ktk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmggW9/dJMcaaZe6lr/2dZ7wTShtuos3My5N18ktk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmggW9%2FdJMcaaZe6lr%2F2dZ7wTShtuos3My5N18ktk%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;598&quot; data-filename=&quot;스크린샷 2026-04-15 202841.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 &lt;b&gt;vn에 likelion_client_role이,&amp;nbsp; or에는 likelion_bonus_gate가 들어간다&lt;/b&gt;는 const 선언 코드를 확인했습니다.&lt;br /&gt;그래서 '아 뭔가 저 변수와 role, bonus_gate가 연관이 있겠구나' 하는 생각을 먼저 했습니다.&lt;/p&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;b&gt;sessionStorage.setItem(or, e.role === &quot;admin&quot; ? &quot;admin&quot; : &quot;participant&quot;)&lt;/b&gt;라는 코드도 무슨의미인가 싶어 찾아본 결과&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;e.role이 admin이면 admin을 저장, 그렇지 않으면 participant를 저장&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;이걸 보고 어? 혹시 그러면 내가 직접 sessionStorage나 localStorage에 &lt;b&gt;.setItem&lt;/b&gt;으로 직접 admin이라는 값을 넣으면 admin으로 인식되는거 아닐까? 라는 생각을 하게 되었습니다.&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;스크린샷 2026-04-15 203857.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/m3tEk/dJMcad2G030/CERdackREiWIeXOLsTHcU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/m3tEk/dJMcad2G030/CERdackREiWIeXOLsTHcU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/m3tEk/dJMcad2G030/CERdackREiWIeXOLsTHcU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fm3tEk%2FdJMcad2G030%2FCERdackREiWIeXOLsTHcU1%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;943&quot; height=&quot;502&quot; data-filename=&quot;스크린샷 2026-04-15 203857.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;솔직히 아직 JS 입문자로서 완벽하게 코드를 이해하는데는 어려움이 있었지만 일단 핵심적인 부분이 무엇일까 검색해보며 생각해봤습니다.&lt;/p&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_1776255303308&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const o = 
    n ||                      // 1순위
    t ||                      // 2순위
    (e?.role) ||              // 3순위
    &quot;participant&quot;;            // 4순위 (기본값)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 &quot;o&quot; 에 우선순위대로 값을 넣는 코드였습니다. 만약 &quot;n&quot;이 &quot;admin&quot;이라면 &quot;o&quot;에 &quot;admin&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;그리고 가장 중요한 부분이 아래 코드인데요&lt;/p&gt;
&lt;pre id=&quot;code_1776255962667&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;canAccessBonus: o === &quot;admin&quot; || r === &quot;admin&quot; || l === &quot;admin&quot; || r === &quot;bonus&quot; || l === &quot;bonus&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 판단을 &quot;o&quot; (사용자의 역할,role), &quot;r&quot; (localStorage의 bonus 값), &quot;l&quot; (sessionStorage의 bonus 값)의 값들로 수행하는 코드인데, 해당 부분에서 취약점이 존재함을 확인할 수 있었습니다.&lt;/p&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;o&quot;, &quot;r&quot;, &quot;l&quot; 중에 뭐든 &quot;admin&quot;이나 &quot;bonus&quot;가 있으면 보너스 페이지에 접근을 허용한다는 내용입니다.&lt;br /&gt;근데 저 값들은 전부 서버가 아닌 브라우저의 local,sessionStorage에 저장되므로 사용자가 DevTools의 Console을 통해&quot;admin&quot;이나 &quot;bonus&quot;를 .setItem하게 되면 접근이 가능해지게 됩니다.&lt;/p&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에 입력했습니다&lt;/p&gt;
&lt;pre id=&quot;code_1776256408703&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;localStorage.setItem(&quot;likelion_client_role&quot;, &quot;admin&quot;)
sessionStorage.setItem(&quot;likelion_client_role&quot;, &quot;admin&quot;)

localStorage.setItem(&quot;likelion_bonus_gate&quot;, &quot;admin&quot;)
sessionStorage.setItem(&quot;likelion_bonus_gate&quot;, &quot;admin&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;925&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JrlDP/dJMcaipsxOD/AXt8frR8iiEtymurPn532K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JrlDP/dJMcaipsxOD/AXt8frR8iiEtymurPn532K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JrlDP/dJMcaipsxOD/AXt8frR8iiEtymurPn532K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJrlDP%2FdJMcaipsxOD%2FAXt8frR8iiEtymurPn532K%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;1877&quot; height=&quot;925&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;925&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성공적으로 admin 페이지에 진입을 성공했습니다. 조금 더 확실하게 확인하기 위해 Application탭에서 local, sessionStorage를 확인해본 결과 아래와 같이&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-15 212229.png&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgmOsz/dJMcaiQtTCf/AwdkmbX4jMPyqBaKOE0LJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgmOsz/dJMcaiQtTCf/AwdkmbX4jMPyqBaKOE0LJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgmOsz/dJMcaiQtTCf/AwdkmbX4jMPyqBaKOE0LJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgmOsz%2FdJMcaiQtTCf%2FAwdkmbX4jMPyqBaKOE0LJK%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;1878&quot; height=&quot;928&quot; data-filename=&quot;스크린샷 2026-04-15 212229.png&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;928&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-04-15 212238.png&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1E7Ca/dJMcagynvIm/KSKCkqfLxnyOsmHxnnK7A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1E7Ca/dJMcagynvIm/KSKCkqfLxnyOsmHxnnK7A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1E7Ca/dJMcagynvIm/KSKCkqfLxnyOsmHxnnK7A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1E7Ca%2FdJMcagynvIm%2FKSKCkqfLxnyOsmHxnnK7A1%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;1876&quot; height=&quot;924&quot; data-filename=&quot;스크린샷 2026-04-15 212238.png&quot; data-origin-width=&quot;1876&quot; data-origin-height=&quot;924&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;조금 더 자세히 보면 localStorage에는 제가 추가한 admin 값들 이외에도 다른 것들이 있었습니다.&lt;/p&gt;
&lt;table style=&quot;color: #1a1a1a; text-align: start; border-collapse: collapse; width: 100%; height: 187px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;background-color: #dce1ff; color: #000000; height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;likelion_bonus_entries&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;[{&quot;username&quot;:&quot;yamajaki&quot;,&quot;enteredAt&quot;:1776252290804,&quot;rank&quot;:1}]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: color(srgb 0.970588 0.978431 0.991961); height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;likelion_bonus_gate&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #ffffff; height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;likelion_client_role&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;admin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: color(srgb 0.970588 0.978431 0.991961); height: 17px;&quot;&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;likelion_session&lt;/td&gt;
&lt;td style=&quot;height: 17px;&quot;&gt;{&quot;username&quot;:&quot;yamajaki&quot;,&quot;role&quot;:&quot;participant&quot;}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: #ffffff; height: 34px;&quot;&gt;
&lt;td style=&quot;height: 34px;&quot;&gt;likelion_user_state_yamajaki&lt;/td&gt;
&lt;td style=&quot;height: 34px;&quot;&gt;{&quot;isOnline&quot;:true,&quot;currentScreen&quot;:&quot;bonus&quot;,&quot;currentStep&quot;:0,&quot;currentMission&quot;:0,&quot;completedSteps&quot;:[]}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;background-color: color(srgb 0.970588 0.978431 0.991961); height: 34px;&quot;&gt;
&lt;td style=&quot;height: 34px;&quot;&gt;likelion_users&lt;/td&gt;
&lt;td style=&quot;height: 34px;&quot;&gt;{&quot;yamajaki&quot;:{&quot;username&quot;:&quot;yamajaki&quot;,&quot;password&quot;:&quot;cprPrhk1!&quot;,&quot;role&quot;:&quot;participant&quot;,&quot;solvedMissionIds&quot;:[]}}&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;b&gt;row 1번째 &lt;span style=&quot;background-color: #dce1ff; color: #000000; text-align: start;&quot;&gt;likelion_bonus_entries&lt;/span&gt;&lt;/b&gt; 에는 유저명과 언제 접근했는지, 순위가 몇위인지 확인할 수 있습니다. (1등 야르~!!!)&lt;/p&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;2,3번째 row&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;b&gt;4번째 &lt;span style=&quot;background-color: color(srgb 0.970588 0.978431 0.991961); color: #1a1a1a; text-align: start;&quot;&gt;likelion_session&lt;/span&gt;&lt;/b&gt; 에는 사용자 정보(세션)이 있는데 잘 보면 role에는 여전히 participant가 들어있습니다. 즉 서버 기준에선 여전히 user(=paricipant)라는 거죠. 제가 프론트만 속였다는 의미입니다.&lt;/p&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;5번째 &lt;span style=&quot;background-color: #ffffff; color: #1a1a1a; text-align: start;&quot;&gt;likelion_user_state_yamajaki&lt;/span&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;b&gt;6번째 &lt;span style=&quot;background-color: color(srgb 0.970588 0.978431 0.991961); color: #1a1a1a; text-align: start;&quot;&gt;likelion_users&lt;/span&gt;&lt;/b&gt; 에는 전체적인 유저의 DB가 있습니다. 문제는 유저명, 역할, 해결한 문제 ID외에도 &lt;b&gt;비밀번호가 무엇인지&lt;/b&gt;도 나와있습니다. 이런 경우를 예상하고 군대에서 사용하던 임시 비밀번호로 계정을 만들길 잘한 것 같습니다. (체계과1!입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로써 만약 실제 서비스에서 localStorage에 직접 저장하는 방식을 사용하거나, 비밀번호를 그냥 평문으로 저장하면 얼마나 큰일이 발생할지를 깨달았습니다.&lt;/p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1875&quot; data-origin-height=&quot;924&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLormn/dJMcad2G2vx/KLvC7IpKorOyipQBVe16yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLormn/dJMcad2G2vx/KLvC7IpKorOyipQBVe16yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLormn/dJMcad2G2vx/KLvC7IpKorOyipQBVe16yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLormn%2FdJMcad2G2vx%2FKLvC7IpKorOyipQBVe16yk%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;1875&quot; height=&quot;924&quot; data-origin-width=&quot;1875&quot; data-origin-height=&quot;924&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 예상대로 test와 test1의 계정의 비밀번호와 유저명이 남아있는 것을 확인할 수 있었고, clear all을 하게되면 해당 계정이 사라지는 것도 확인했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어찌저찌 문제를 풀긴 했지만 여전히 JS코드가 전부 이해된 것은 아니라서 나중에 시간이 나면 임원분들께 더 자세한 설명을 들어야 할 것 같습니다 ㅎㅎ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순 HTML, CSS, JS 공부 뿐만 아니라, 이런 취약점까지 실제로 공부시켜주는 멋쟁이사자처럼 임원진분들의 노력에 감사하는 마음을 갖게 된 보너스문제였던 것 같습니다!!&lt;/p&gt;</description>
      <category>나도 멋쟁이사자처럼!</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/12</guid>
      <comments>https://hamzgi.tistory.com/12#entry12comment</comments>
      <pubDate>Wed, 15 Apr 2026 22:00:58 +0900</pubDate>
    </item>
    <item>
      <title>웹의 기본 HTML,CSS,Javascript 3형제에 대하여 간단히 소개</title>
      <link>https://hamzgi.tistory.com/11</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대학에서 웹프로그래밍 강의를 듣다보면, 아니 사실 어디서든 웹을 배운다면 무조건 배우는 3형제가 있다. 바로....&lt;/p&gt;
&lt;h2 style=&quot;text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #ee2323; background-color: #000000;&quot;&gt;&lt;b&gt;HTML , &lt;span style=&quot;color: #006dd7;&quot;&gt;CSS &lt;/span&gt;, &lt;span style=&quot;color: #f3c000;&quot;&gt;Javascript&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 이 3가지가 각각 무엇을 하는 친구인지 간단하게 알아볼 필요가 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #ee2323;&quot;&gt;&lt;b&gt;&quot;나는 웹 페이지의 '기본적인 뼈대'가 될 것이다. &quot;&amp;nbsp; &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; color: #ee2323;&quot;&gt;&lt;b&gt;- HTML&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 친구는 사실 프로그래밍언어라고 하기엔 눈치껏 빠져야하는 친구이다. 애초에 이름 약자부터가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hyper Text &lt;u&gt;&lt;b&gt;&quot;Markup Language&quot;&lt;/b&gt;&lt;/u&gt; 즉 마크업 언어이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;여기서 마크업 언어가 무엇인가?&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot; data-animation-nesting=&quot;&quot;&gt;마크업 언어란? (예: HTML, XML, Markdown)&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-wiz-uids=&quot;IE9mBd_j,IE9mBd_k&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-processed=&quot;true&quot; data-wiz-attrbind=&quot;class=IE9mBd_i/TKHnVd&quot; data-animation-atomic=&quot;&quot;&gt;&lt;span style=&quot;color: #0a0a0a;&quot; data-processed=&quot;true&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0a0a0a; text-align: start;&quot; data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAMQAA&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;목적:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터가 어떻게 보일지(서식) 또는 어떤 구조인지(분류)를 기술합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAMQAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;span data-processed=&quot;true&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot; data-sfc-cp=&quot;&quot;&gt;&lt;b&gt;특징:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;브라우저나 문서 처리 프로그램에 정보를 전달하며, 자체적인 연산이나 로직을 수행하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot; data-processed=&quot;true&quot; data-hveid=&quot;CAMQAQ&quot; data-sfc-cb=&quot;&quot; data-sfc-root=&quot;c&quot;&gt;&lt;b&gt;구성:&lt;/b&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&amp;lt;h1&amp;gt;제목&amp;lt;/h1&amp;gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; letter-spacing: 0px;&quot;&gt;&amp;lt;p&amp;gt;내용&amp;lt;/p&amp;gt;처럼 태그를 통해 태그와 데이터를 묶습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;쉽게 말하면 이 친구는 프로그래밍 언어와 달리 if문, for문 같은 연산이나 로직을 수행하지 않는게 가장 큰 차이라고 생각하면 좋다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhfwU/dJMcaf0dlyW/53Rk6iMVXKDe6GIgihXMT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhfwU/dJMcaf0dlyW/53Rk6iMVXKDe6GIgihXMT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhfwU/dJMcaf0dlyW/53Rk6iMVXKDe6GIgihXMT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlhfwU%2FdJMcaf0dlyW%2F53Rk6iMVXKDe6GIgihXMT0%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;1098&quot; height=&quot;858&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;858&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;이런 식의 코드가 바로 HTML이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7; background-color: #9feec3;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&quot;나는 웹 페이지의 '아름다운 옷'이 될 것이다. &quot; &amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- CSS&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;이 친구는 &lt;u&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;Cascading Style Sheets&lt;/span&gt;&lt;/b&gt;&lt;/u&gt;&lt;span style=&quot;background-color: #ffffff; color: #0a0a0a; text-align: start;&quot;&gt;라는 친구인데 굳이 약자 의미를 번역기 돌려서 찾아볼 필요는 없고&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot;&gt;HTML과 같은 마크업 언어의 구조화된 문서에 &lt;u&gt;스타일과 레이아웃&lt;/u&gt;을 입혀 &lt;u&gt;글꼴, 배경색, 크기, 위치 등을 꾸미는&lt;/u&gt; 선언적 스타일 시트 언어이다. (선언적 스타일 시트라는 추상적인 표현에 굳이 꽂히지 말고 그냥 HTML같은 친구에게 스킨을 입힌다고 생각하면 좋다.)&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1774011773014&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* {
  box-sizing: border-box;
  /* 위아래로 떠있는 부분 붙이기 */
  padding: 0;
  margin: 0;
}

body {
  color: #333;
  background-color: rgb(253, 240, 245);
  font-size: 18px;
  line-height: 1.5;
}

ul {
  list-style-type: none;
}

/* class를 지정할 때에는 앞에 . 붙이기 */
.container {
  max-width: 1100px;
  margin: 0 auto;
  /* 위아래는 0, 좌우로 30픽셀 띄우기 */
  padding: 30px 30px;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #001d35; text-align: start;&quot;&gt;이런 식으로 우리가 HTML에 썼던 친구들을 가져와서 { } 안에 원하는 꾸미기 옵션들을 추가해주는 식으로 코딩한다.&lt;/span&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;내 나이 04년생, 내 동년배들이라면 아마 어릴적 윈도우XP 시절 네이버나 야후, 다음같은 웹사이트를 들어갔다가 종종 헐벗은 흰색 배경에 파란 글씨나 검은 글씨만 보이는 경우가 있었을 수도 있는데 그게 바로 아래 이미지와 같이 CSS가 적용되지 않은 HTML&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;HTML-CSS-적용-방법.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1mn0D/dJMcaaLoDSR/4yfbZ8l6xvkF0m5Ppj2LGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1mn0D/dJMcaaLoDSR/4yfbZ8l6xvkF0m5Ppj2LGK/img.png&quot; data-alt=&quot;이미지 출처: 코드스테이트 https://www.codestates.com/blog/content/html-css&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1mn0D/dJMcaaLoDSR/4yfbZ8l6xvkF0m5Ppj2LGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1mn0D%2FdJMcaaLoDSR%2F4yfbZ8l6xvkF0m5Ppj2LGK%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;352&quot; data-filename=&quot;HTML-CSS-적용-방법.png&quot; data-origin-width=&quot;768&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 출처: 코드스테이트 https://www.codestates.com/blog/content/html-css&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;나는 어렸을때 저렇게 CSS 없는 화면 뜬 걸 보고 해킹당한줄 알고 벌벌 떨었는데 커서 정보보호학과에 오니 그 어릴적 내 모습이 참 순수하고 귀여웠던 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;본론으로 돌아오자면 저런식으로 웹을 꾸며줄 수 있는 친구가 바로 CSS이다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #f3c000; background-color: #000000;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&quot;나는 웹 페이지를 원하는대로 '움직이게' 만들 것이다. &quot;&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;- Javascript&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h2&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;그렇다. 우리가 비싼 돈 주고 산 마우스와 키보드를 섭섭하게 만드는 그런 사이트는 진정한 Web-Site라고 할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;우리가 클릭하고, ID를 입력하고, 마우스를 올리면 미리보기가 뜨고, 이런것이 진정한 Web-Site이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;그것을 위해 존재하는 친구가 바로 &lt;b&gt;&quot;Javascript&quot;&lt;/b&gt; 이다.(줄여서 js)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v8Wwf/dJMb996M5jT/u2ESXJtLoadCObfQ9hKNZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v8Wwf/dJMb996M5jT/u2ESXJtLoadCObfQ9hKNZ1/img.png&quot; data-alt=&quot;마우스를 올리면 Working from home이라는 전체 메세지가 뜬다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v8Wwf/dJMb996M5jT/u2ESXJtLoadCObfQ9hKNZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv8Wwf%2FdJMb996M5jT%2Fu2ESXJtLoadCObfQ9hKNZ1%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;618&quot; height=&quot;506&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;506&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;마우스를 올리면 Working from home이라는 전체 메세지가 뜬다.&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;위 사진처럼 우리가 어느 사이트를 들어가던 마우스를 댔을때 상호작용이 가능한 경우가 많은데 그 동작들이 거의 대부분 js 덕분에 가능한 것이다. 특정 애니메이션이 동작하는 것도 js를 통해서 구현하는 경우도 있다.&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;2023-02-13-10.02.28-1.gif&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rWiqo/dJMcahcFMcI/I2ts7MSoXF64Ws4qSHDkFk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rWiqo/dJMcahcFMcI/I2ts7MSoXF64Ws4qSHDkFk/img.gif&quot; data-alt=&quot;Josh.js의 애니메이션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rWiqo/dJMcahcFMcI/I2ts7MSoXF64Ws4qSHDkFk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/rWiqo/dJMcahcFMcI/I2ts7MSoXF64Ws4qSHDkFk/img.gif&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;527&quot; data-filename=&quot;2023-02-13-10.02.28-1.gif&quot; data-origin-width=&quot;915&quot; data-origin-height=&quot;527&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Josh.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;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_JPLlGte03H0rXkwE_F5v6Q.gif&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csr9mz/dJMcahKxb9V/1KegDTkEUUlsUNRKqkYCW1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csr9mz/dJMcahKxb9V/1KegDTkEUUlsUNRKqkYCW1/img.gif&quot; data-alt=&quot;Babylon.js를 이용한 게임 제작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csr9mz/dJMcahKxb9V/1KegDTkEUUlsUNRKqkYCW1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/csr9mz/dJMcahKxb9V/1KegDTkEUUlsUNRKqkYCW1/img.gif&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;589&quot; height=&quot;373&quot; data-filename=&quot;1_JPLlGte03H0rXkwE_F5v6Q.gif&quot; data-origin-width=&quot;589&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Babylon.js를 이용한 게임 제작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;종종 이런식으로 웹으로 게임을 제작하는 경우도 있는데 이럴때도 js를 이용한다.&lt;/p&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;b&gt;자 그럼 여기서 문제. Javascript는 프로그래밍언어일까요???&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;.&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;b&gt;&quot;요즘 기준에선 자바스크립트 = 그냥 프로그래밍 언어&quot;&lt;/b&gt;라고 보면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이름에서도 알겠지만 js의 근본은 스크립트언어이다. 옛날 개발자들은&lt;/p&gt;
&lt;h3 data-end=&quot;250&quot; data-start=&quot;229&quot; data-section-id=&quot;15epuwx&quot; data-ke-size=&quot;size23&quot;&gt;  프로그래밍 언어 (전통적)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;290&quot; data-start=&quot;251&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;260&quot; data-start=&quot;251&quot; data-section-id=&quot;1d5w74r&quot;&gt;C, Java&lt;/li&gt;
&lt;li data-end=&quot;269&quot; data-start=&quot;261&quot; data-section-id=&quot;1td1wf0&quot;&gt;컴파일 필요&lt;/li&gt;
&lt;li data-end=&quot;290&quot; data-start=&quot;270&quot; data-section-id=&quot;bqfn4f&quot;&gt;실행파일(.exe) 만들어서 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-end=&quot;306&quot; data-start=&quot;292&quot; data-section-id=&quot;12zks1y&quot; data-ke-size=&quot;size23&quot;&gt;  스크립트 언어&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;357&quot; data-start=&quot;307&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;332&quot; data-start=&quot;307&quot; data-section-id=&quot;wynla2&quot;&gt;JavaScript, Python (초기)&lt;/li&gt;
&lt;li data-end=&quot;347&quot; data-start=&quot;333&quot; data-section-id=&quot;1mmwcxt&quot;&gt;인터프리터로 바로 실행&lt;/li&gt;
&lt;li data-end=&quot;357&quot; data-start=&quot;348&quot; data-section-id=&quot;12h8i5d&quot;&gt;비교적 가벼움&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 구분을 하는 경우가 있었다. 하지만...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;494&quot; data-start=&quot;467&quot; data-section-id=&quot;7egrm1&quot;&gt;자바스크립트도 엄청 복잡한 프로그램 작성 가능&lt;/li&gt;
&lt;li data-end=&quot;511&quot; data-start=&quot;495&quot; data-section-id=&quot;1e2zk4n&quot;&gt;서버, 앱, 게임 다 만듦&lt;/li&gt;
&lt;li data-end=&quot;532&quot; data-start=&quot;512&quot; data-section-id=&quot;1wb7ip&quot;&gt;구조도 완전 프로그래밍 언어 수준&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실상 요즘 js의 위상은 더 이상 옛날의 그것이 아니기에 충분히 웹을 위한 프로그래밍언어라고 생각해도 크게 지장은 없을 것이다.&lt;/p&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;이렇게 해서 오늘은 웹의 가장 기본적인 3형제인 HTML,CSS,JS에 대하여 간단하게 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추후에는 이 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;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹프로그래밍 과제</category>
      <category>CSS</category>
      <category>html</category>
      <category>javascript</category>
      <category>Programming</category>
      <category>web</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/11</guid>
      <comments>https://hamzgi.tistory.com/11#entry11comment</comments>
      <pubDate>Fri, 20 Mar 2026 22:19:04 +0900</pubDate>
    </item>
    <item>
      <title>[입문] 파이썬으로 문자열 뒤집기!</title>
      <link>https://hamzgi.tistory.com/10</link>
      <description>&lt;h1 data-end=&quot;116&quot; data-start=&quot;101&quot;&gt;파이썬으로 문자열 뒤집기&lt;/h1&gt;
&lt;p data-end=&quot;193&quot; data-start=&quot;118&quot; data-ke-size=&quot;size16&quot;&gt;프로그래밍을 하다 보면 문자열을 뒤집어야 할 때가 있다.&lt;br /&gt;이번 글에서는 파이썬에서 문자열을 뒤집는 방법을 간단하게 정리해보려 한다.&lt;/p&gt;
&lt;hr data-end=&quot;198&quot; data-start=&quot;195&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;229&quot; data-start=&quot;200&quot; data-ke-size=&quot;size26&quot;&gt;1️⃣ 슬라이싱으로 뒤집기 (가장 간단한 방법)&lt;/h2&gt;
&lt;p data-end=&quot;315&quot; data-start=&quot;231&quot; data-ke-size=&quot;size16&quot;&gt;파이썬에서는 문자열도 리스트처럼 &lt;b&gt;시퀀스 자료형&lt;/b&gt;이기 때문에 슬라이싱으로 쉽게 뒤집을 수 있다.&lt;br /&gt;한 줄로 간단하게 뒤집는 방법을 먼저 살펴보자.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761545585694&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s = &quot;hello&quot;
reversed_s = s[::-1]
print(reversed_s)  # 출력: &quot;olleh&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;466&quot; data-start=&quot;392&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;441&quot; data-start=&quot;392&quot;&gt;[::-1] 의미: 처음부터 끝까지 -1씩 이동 &amp;rarr; 뒤에서 앞으로 읽는다는 뜻&lt;/li&gt;
&lt;li data-end=&quot;466&quot; data-start=&quot;442&quot;&gt;가장 직관적이고 간단하게 사용할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;471&quot; data-start=&quot;468&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;492&quot; data-start=&quot;473&quot; data-ke-size=&quot;size26&quot;&gt;2️⃣ 리스트로 바꿔서 뒤집기&lt;/h2&gt;
&lt;p data-end=&quot;544&quot; data-start=&quot;494&quot; data-ke-size=&quot;size16&quot;&gt;문자열을 리스트로 바꾼 뒤 뒤집고 다시 합치는 방법도 있다.&lt;br /&gt;이 방법도 알아두면 좋다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761545607150&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s = &quot;hello&quot;
lst = list(s)        # ['h', 'e', 'l', 'l', 'o']
lst.reverse()        # ['o', 'l', 'l', 'e', 'h']
reversed_s = ''.join(lst)
print(reversed_s)    # 출력: &quot;olleh&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;750&quot; data-start=&quot;726&quot; data-ke-size=&quot;size16&quot;&gt;슬라이싱을 활용해서 이렇게도 만들 수 있다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761545622895&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;reversed_s = ''.join(list(s)[::-1])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;800&quot; data-start=&quot;797&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;817&quot; data-start=&quot;802&quot; data-ke-size=&quot;size26&quot;&gt;3️⃣ 내가 했던 실수&lt;/h2&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761545647926&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(my_string):
    list = my_string[::-1]
    return = list  # ❌ 이렇게 하면 오류가 난다&lt;/code&gt;&lt;/pre&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1025&quot; data-start=&quot;935&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;983&quot; data-start=&quot;935&quot;&gt;return = list &amp;rarr; return은 예약어라 변수처럼 쓸 수 없다&lt;/li&gt;
&lt;li data-end=&quot;1025&quot; data-start=&quot;984&quot;&gt;list &amp;rarr; 파이썬 내장 타입 이름이라 변수로 쓰면 헷갈릴 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1045&quot; data-start=&quot;1027&quot; data-ke-size=&quot;size16&quot;&gt;올바른 방법은 이렇게 하면 된다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761545676088&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(my_string):
    reversed_str = my_string[::-1]
    return reversed_str&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-end=&quot;1143&quot; data-start=&quot;1140&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1156&quot; data-start=&quot;1145&quot; data-ke-size=&quot;size26&quot;&gt;4️⃣ 정리 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1274&quot; data-start=&quot;1158&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1195&quot; data-start=&quot;1158&quot;&gt;간단한 문자열(혹은 배열) 뒤집기는 s[::-1]만 기억하면 충분하다&lt;/li&gt;
&lt;li data-end=&quot;1234&quot; data-start=&quot;1196&quot;&gt;리스트로 바꿔서 뒤집는 방법도 있지만 꼭 필요한 경우에만 사용&lt;/li&gt;
&lt;li data-end=&quot;1274&quot; data-start=&quot;1235&quot;&gt;내장 타입 이름(list, str 등)은 변수로 쓰지 않는다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1361&quot; data-start=&quot;1276&quot; data-ke-size=&quot;size16&quot;&gt;  이렇게 정리하면 코딩 테스트에서도 바로 활용할 수 있고, 실수도 줄일 수 있다.&lt;br /&gt;문자열 뒤집기는 파이썬에서 자주 나오는 문제라서 익혀두면 좋다.&lt;/p&gt;</description>
      <category>기초부터 시작하는 Programmers!</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/10</guid>
      <comments>https://hamzgi.tistory.com/10#entry10comment</comments>
      <pubDate>Mon, 27 Oct 2025 15:16:11 +0900</pubDate>
    </item>
    <item>
      <title>무엇을 하는 곳인고?</title>
      <link>https://hamzgi.tistory.com/8</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;프로그래머스 입문 다시 시작&lt;/title&gt;
    &lt;style&gt;
        body {
            font-family: &quot;Apple SD Gothic Neo&quot;, &quot;Malgun Gothic&quot;, &quot;Nanum Gothic&quot;, sans-serif;
            line-height: 1.6;
            color: #333;
            max-width: 800px;
            margin: 0 auto;
            padding: 40px 20px;
            background-color: #f9f9f9;
        }
        h2 {
            font-size: 2em;
            color: #2c3e50;
            margin-bottom: 20px;
            border-bottom: 2px solid #3498db;
            padding-bottom: 10px;
        }
        p {
            margin-bottom: 18px;
        }
        strong {
            color: #e74c3c;
        }
        code {
            background-color: #ecf0f1;
            padding: 2px 6px;
            border-radius: 4px;
            font-family: Consolas, monospace;
        }
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h2&gt;오랜만에 프로그래머스에서 코딩 공부 시작&lt;/h2&gt;

    &lt;p&gt;백준 문제를 풀다가, 주변 지인의 소개로 예전에 잠깐 구경만 했던 &lt;strong&gt;프로그래머스&lt;/strong&gt;에 오랜만에 다시 들어와서 문제를 풀어봤다.&lt;/p&gt;

    &lt;p&gt;확실히 웹에서 직접 코드를 실행해보며 &lt;strong&gt;오답인지 정답인지 바로 확인&lt;/strong&gt;할 수 있고, 코드 중에서 어떤 건 맞고 어떤 건 틀렸는지도 알 수 있어서 좋았다.&lt;/p&gt;

    &lt;p&gt;나처럼 오랜만에 입문 단계부터 코딩 공부를 시작한다면, 백준도 좋지만 프로그래머스도 좋은 선택지가 되겠구나 하는 생각이 들었다. 입문 문제를 풀다 보니 역시 오랜만이라 헷갈리는 개념들도 있고, 다른 유저들의 더 좋은 코드들을 보면서 배울 점이 많았다.&lt;/p&gt;

    &lt;p&gt;그래서 아, 여기서 공부했던 내용들도 &lt;strong&gt;블로그에 기록&lt;/strong&gt;해둬야겠다는 생각이 들어 새로 카테고리를 만들어 보았다. 앞으로는 &quot;&lt;strong&gt;기초부터 시작하는 백준풀이!&lt;/strong&gt;&quot; 카테고리와 결이 거의 똑같도록 글을 올릴 계획이다.&lt;/p&gt;

    &lt;p&gt;그리고 &lt;strong&gt;HTML 양식&lt;/strong&gt;으로도 글을 써보려고 한다. 뭔가 더 개발자스럽기도 하고, 양식 자체가 복붙할 때 내가 원하는 모양이 그대로 복사되다 보니 편하다고 생각했다.&lt;/p&gt;

    &lt;p&gt;글을 올리는 오늘 기준으로 &lt;strong&gt;전역일이 딱 2주, 14일 남았다&lt;/strong&gt;. 앞으로도 열심히 공부해야겠다!&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</description>
      <category>기초부터 시작하는 Programmers!</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/8</guid>
      <comments>https://hamzgi.tistory.com/8#entry8comment</comments>
      <pubDate>Mon, 27 Oct 2025 15:09:15 +0900</pubDate>
    </item>
    <item>
      <title>  백준 10430 나머지</title>
      <link>https://hamzgi.tistory.com/6</link>
      <description>&lt;h1 style=&quot;color: #000000; text-align: start;&quot; data-start=&quot;155&quot; data-end=&quot;184&quot;&gt;  Python 입출력 연습: 나머지 계산 문제&lt;/h1&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;(A+B)%C는 ((A%C) + (B%C))%C&amp;nbsp;와 같을까?&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;(A&amp;times;B)%C는 ((A%C) &amp;times; (B%C))%C 와 같을까?&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;세 수 A, B, C가 주어졌을 때, 위의 네 가지 값을 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 A, B, C가 순서대로 주어진다. (2&amp;nbsp;&amp;le; A, B, C &amp;le; 10000)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 (A+B)%C, 둘째 줄에 ((A%C) + (B%C))%C, 셋째 줄에 (A&amp;times;B)%C, 넷째 줄에 ((A%C) &amp;times; (B%C))%C를 출력한다.&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 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;5 8 4&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;1
1
0
0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #2a2a2a; text-align: start;&quot;&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h1 data-end=&quot;184&quot; data-start=&quot;155&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h3 data-end=&quot;202&quot; data-start=&quot;186&quot; data-ke-size=&quot;size23&quot;&gt;  처음 시도한 코드&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761110655586&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A, B, C = map(int, input().split())
print( (A+B)%C )
print( ((A%C) + (B%C)) % C )
print( (A*B)%C )
print( ((A%C) * (B%C)) % C )&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-end=&quot;367&quot; data-start=&quot;355&quot; data-ke-size=&quot;size16&quot;&gt;✅ &lt;b&gt;결과: 정답&lt;/b&gt;&lt;/p&gt;
&lt;p data-end=&quot;493&quot; data-start=&quot;369&quot; data-ke-size=&quot;size16&quot;&gt;문제 자체는 정답이 주어진 형태라서 비교적 쉽게 풀 수 있었다.&lt;br /&gt;하지만 단순히 푸는 데서 그치지 않고, &lt;b&gt;입력 방식을 조금 더 효율적으로&lt;/b&gt; 만들어 보기 위해&lt;br /&gt;map()과 split()을 함께 사용해보았다.&lt;/p&gt;
&lt;hr data-end=&quot;498&quot; data-start=&quot;495&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;515&quot; data-start=&quot;500&quot; data-ke-size=&quot;size26&quot;&gt;  다른 입력 방식들&lt;/h2&gt;
&lt;p data-end=&quot;587&quot; data-start=&quot;517&quot; data-ke-size=&quot;size16&quot;&gt;문제를 풀고 나서, &amp;ldquo;&lt;b&gt;다른 방법으로는 어떻게 입력을 받을 수 있을까?&lt;/b&gt;&amp;rdquo;&lt;br /&gt;라는 생각이 들어 여러 예제를 정리해보았다.&lt;/p&gt;
&lt;hr data-end=&quot;592&quot; data-start=&quot;589&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;635&quot; data-start=&quot;594&quot; data-ke-size=&quot;size23&quot;&gt;1️⃣ List Comprehension (같은 동작, 다른 표현)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761110675132&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;A, B, C = [int(x) for x in input().split()]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;760&quot; data-start=&quot;695&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;760&quot; data-start=&quot;697&quot; data-ke-size=&quot;size16&quot;&gt;map()과 기능적으로 같지만, 리스트 형태로 변환이 명확히 보이므로&lt;br /&gt;가독성을 선호하는 경우 유용하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;765&quot; data-start=&quot;762&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;799&quot; data-start=&quot;767&quot; data-ke-size=&quot;size23&quot;&gt;2️⃣ Split 후 인덱스로 접근 (명시적 방법)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761110701935&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;s = input().split()
A = int(s[0]); B = int(s[1]); C = int(s[2])&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;943&quot; data-start=&quot;879&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;943&quot; data-start=&quot;881&quot; data-ke-size=&quot;size16&quot;&gt;입력을 &lt;b&gt;명시적으로 제어&lt;/b&gt;하고 싶을 때 쓰기 좋다.&lt;br /&gt;특히 초보자에게는 코드 흐름이 직관적으로 보인다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;948&quot; data-start=&quot;945&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;993&quot; data-start=&quot;950&quot; data-ke-size=&quot;size23&quot;&gt;3️⃣ sys.stdin.readline() 사용 (백준용 고속 입력)&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761110719671&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
A, B, C = map(int, sys.stdin.readline().split())&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1142&quot; data-start=&quot;1069&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1142&quot; data-start=&quot;1071&quot; data-ke-size=&quot;size16&quot;&gt;input()보다 약간 더 빠르다.&lt;br /&gt;반복문에서 많은 입력을 받을 때 &lt;b&gt;백준, 프로그래머스&lt;/b&gt; 등에서 주로 사용된다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1147&quot; data-start=&quot;1144&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1170&quot; data-start=&quot;1149&quot; data-ke-size=&quot;size23&quot;&gt;4️⃣ 입력 검증이 필요한 경우&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1761110742734&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tokens = input().split()
if len(tokens) != 3:
    raise ValueError(&quot;세 개의 값이 필요합니다&quot;)
A, B, C = [int(x) for x in tokens]&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-end=&quot;1369&quot; data-start=&quot;1305&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1369&quot; data-start=&quot;1307&quot; data-ke-size=&quot;size16&quot;&gt;예상치 못한 입력에 대비해야 할 때 유용하다.&lt;br /&gt;실무나 안정성을 요구하는 상황에서 자주 사용되는 방식이다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1374&quot; data-start=&quot;1371&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1384&quot; data-start=&quot;1376&quot; data-ke-size=&quot;size26&quot;&gt;⚙️ 정리&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1519&quot; data-start=&quot;1386&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1418&quot; data-start=&quot;1386&quot;&gt;&lt;b&gt;간결함과 성능&lt;/b&gt;이 중요할 때 &amp;rarr; map()&lt;/li&gt;
&lt;li data-end=&quot;1449&quot; data-start=&quot;1419&quot;&gt;&lt;b&gt;가독성&lt;/b&gt;이 중요할 때 &amp;rarr; 리스트 컴프리헨션&lt;/li&gt;
&lt;li data-end=&quot;1491&quot; data-start=&quot;1450&quot;&gt;&lt;b&gt;대량 입력&lt;/b&gt;일 때 &amp;rarr; sys.stdin.readline()&lt;/li&gt;
&lt;li data-end=&quot;1519&quot; data-start=&quot;1492&quot;&gt;&lt;b&gt;입력 검증&lt;/b&gt;이 필요할 때 &amp;rarr; 조건문 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1524&quot; data-start=&quot;1521&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1545&quot; data-start=&quot;1526&quot; data-ke-size=&quot;size26&quot;&gt;✨ 이번 문제를 통해 배운 점&lt;/h2&gt;
&lt;blockquote data-end=&quot;1651&quot; data-start=&quot;1547&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1651&quot; data-start=&quot;1549&quot; data-ke-size=&quot;size16&quot;&gt;같은 정답이라도, &lt;b&gt;코드를 구성하는 방법은 다양하다.&lt;/b&gt;&lt;br /&gt;단순히 &amp;lsquo;맞았다&amp;rsquo;에서 끝내지 말고,&lt;br /&gt;&amp;ldquo;다른 접근법은 없을까?&amp;rdquo;라는 &lt;b&gt;연구적인 습관&lt;/b&gt;을 가지는 게 중요하다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-end=&quot;1656&quot; data-start=&quot;1653&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-end=&quot;1674&quot; data-start=&quot;1658&quot; data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;오늘의 교훈:&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-end=&quot;1703&quot; data-start=&quot;1675&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-end=&quot;1703&quot; data-start=&quot;1677&quot; data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;문제를 푼 이후가 진짜 공부의 시작이다.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>기초부터 시작하는 백준 풀이!</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/6</guid>
      <comments>https://hamzgi.tistory.com/6#entry6comment</comments>
      <pubDate>Wed, 22 Oct 2025 14:26:05 +0900</pubDate>
    </item>
    <item>
      <title>  백준 2739번 - 구구단</title>
      <link>https://hamzgi.tistory.com/4</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;출력형식과 같게 N*1부터 N*9까지 출력한다.&lt;/p&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 입력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-input-1&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;2&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;예제 출력 1&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;pre id=&quot;sample-output-1&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  문제 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력받은 N 숫자로 구구단을 만드는 간단한 문제다.&lt;br /&gt;예시:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;2를 입력받은 경우&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2&amp;nbsp;*&amp;nbsp;1&amp;nbsp;=&amp;nbsp;2 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;2&amp;nbsp;=&amp;nbsp;4 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;3&amp;nbsp;=&amp;nbsp;6 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;4&amp;nbsp;=&amp;nbsp;8 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;5&amp;nbsp;=&amp;nbsp;10 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;6&amp;nbsp;=&amp;nbsp;12 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;7&amp;nbsp;=&amp;nbsp;14 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;8&amp;nbsp;=&amp;nbsp;16 &lt;br /&gt;2&amp;nbsp;*&amp;nbsp;9&amp;nbsp;=&amp;nbsp;18&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;  뭐가 문제였을까?&lt;/h3&gt;
&lt;pre id=&quot;code_1760520059196&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;N = int(input())

for i in range(1,9):
    i += 1
    print(N*i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #2a2a2a; text-align: start;&quot;&gt;결과: 오답 ❌&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;for문을 쓰는 데 굳이 i += 1식을 쓴 것.&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;pre id=&quot;code_1760520394206&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;N = int(input())

for i in range(1,9):
    i += 1
    print(N, &quot;*&quot;, i, &quot;=&quot;, N*i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #2a2a2a; text-align: start;&quot;&gt;결과: 오답 ❌&lt;/span&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;일단 구구단이 1단부터 출력 되어야 하는데, print 윗 줄에 i += 1을 작성하면 당연히 1이 아닌 2부터 출력이 되게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 그 부분을 아래와 같이 수정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760520627309&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;N = int(input())

for i in range(0,9):
    i += 1
    print(N, &quot;*&quot;, i, &quot;=&quot;, N*i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #2a2a2a; text-align: start;&quot;&gt;결과: 정답 ✅&lt;/span&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;for문을 쓰는데 굳이 i += 1식을 쓴 게 정답이 나오고서야 보였다.&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줄이라도 줄여보기 위해 아래와 같이 최종 정답 코드를 제출했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1760520760880&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;N = int(input())

for i in range(1,10):
    print(N, &quot;*&quot;, i, &quot;=&quot;, N*i)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #2a2a2a; text-align: start;&quot;&gt;결과: 정답 ✅&lt;/span&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;copilot에게 물어보니&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이 방식은 &lt;b&gt;코드의 가독성과 안정성 측면에서 좋지 않아요&lt;/b&gt;. 반복문 안에서 반복 변수 i를 직접 수정하는 것은 예기치 않은 버그를 유발할 수 있기 때문입니다.&quot; 라고 알려줬다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&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;b&gt;능동적으로&lt;/b&gt; 내가 왜 이 방식으로 코드를 작성했는지 &lt;b&gt;스스로 질문하는 습관&lt;/b&gt;을 가질 것.&lt;/li&gt;
&lt;li&gt;어려운 문제를 풀고 싶다는 욕심에 분수에 맞지 않는 문제에 매달리기보다는, &lt;b&gt;기초부터 차근차근 다지고 여유를 가지는 자세&lt;/b&gt;를 유지할 것.&lt;/li&gt;
&lt;li&gt;문제의 성공 여부와 관계없이, &lt;b&gt;조금 더 최적화할 수 있는 방법이 무엇일지 항상 고민해볼 것.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>기초부터 시작하는 백준 풀이!</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/4</guid>
      <comments>https://hamzgi.tistory.com/4#entry4comment</comments>
      <pubDate>Wed, 15 Oct 2025 18:39:02 +0900</pubDate>
    </item>
    <item>
      <title>  백준 10926번 - ??!</title>
      <link>https://hamzgi.tistory.com/3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_description&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;준하는 사이트에 회원가입을 하다가 joonas라는 아이디가 이미 존재하는 것을 보고 놀랐다. 준하는 놀람을 ??!로 표현한다. 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어졌을 때, 놀람을 표현하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 준하가 가입하려고 하는 사이트에 이미 존재하는 아이디가 주어진다. 아이디는 알파벳 소문자로만 이루어져 있으며, 길이는 50자를 넘지 않는다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;h2 style=&quot;color: #585f69;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;/div&gt;
&lt;div id=&quot;problem_output&quot;&gt;
&lt;p style=&quot;color: #555555;&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;style5&quot; /&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  문제 요약&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 입력한 아이디 뒤에 &quot;??!&quot;를 붙여 출력하는 아주 간단한 문제다.&lt;br /&gt;예시:&lt;br /&gt;입력 &amp;rarr; joonas&lt;br /&gt;출력 &amp;rarr; joonas??!&lt;/p&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;b&gt;   처음 시도한 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760441448624&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user_id = input(&quot;ID를 입력하시오:&quot;)
print(user_id +&quot;??!&quot;)&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;  뭐가 문제였을까?&lt;/h3&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;b&gt;입력에 프롬프트 문구가 있으면 안 됨&lt;/b&gt;&lt;br /&gt;백준은 테스트 케이스를 자동으로 채점하기 때문에, input() 안에 &quot;ID를 입력하시오:&quot; 같은 문구가 들어가면 오답 처리된다.&lt;/li&gt;
&lt;li&gt;❗ &lt;b&gt;출력 형식도 정확히 맞춰야 함&lt;/b&gt;&lt;br /&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;✅ 정답 코드 &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760441650909&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;user_id = input()
print(user_id +&quot;??!&quot;)&lt;/code&gt;&lt;/pre&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;h3 data-ke-size=&quot;size23&quot;&gt;  &lt;b&gt;이번 문제의 교훈&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기초 문제라고 방심하면 안 된다.&lt;/li&gt;
&lt;li&gt;백준에서는 &lt;b&gt;형식이 생명&lt;/b&gt;이다.&lt;/li&gt;
&lt;li&gt;따라 쓰는 받아쓰기식 공부보다, 직접 고민하고 시행착오를 겪는 과정이 훨씬 도움이 된다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>기초부터 시작하는 백준 풀이!</category>
      <author>hamzgi</author>
      <guid isPermaLink="true">https://hamzgi.tistory.com/3</guid>
      <comments>https://hamzgi.tistory.com/3#entry3comment</comments>
      <pubDate>Tue, 14 Oct 2025 20:44:36 +0900</pubDate>
    </item>
  </channel>
</rss>