<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>치악산 복숭아</title>
    <link>https://bsscl.tistory.com/</link>
    <description>FE 관련 공부 기록 블로그</description>
    <language>ko</language>
    <pubDate>Tue, 12 May 2026 17:23:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Juliie</managingEditor>
    <image>
      <title>치악산 복숭아</title>
      <url>https://tistory1.daumcdn.net/tistory/3840421/attach/11cb2c8cdd14422fbc76e0bc8e69d0a9</url>
      <link>https://bsscl.tistory.com</link>
    </image>
    <item>
      <title>nginx 간단하게 정리하기</title>
      <link>https://bsscl.tistory.com/159</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;https 설정을 위해 이것저것 찾아보다가 nginx에 대해 새롭게 알게 된 것을 잊어버리기 전에 정리해본다.  &lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;nginx란?&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://nginx.org/en/&quot;&gt;공식 홈페이지&lt;/a&gt;에서는 이렇게 소개하고 있다.&lt;/p&gt;
&lt;blockquote style=&quot;color: #666666; text-align: left;&quot; data-ke-style=&quot;style2&quot;&gt;nginx는 HTTP 웹 서버, 리버스 프록시, 콘텐츠 캐시, 로드 밸런서, TCP/UDP 프록시 서버, 메일 프록시 서버입니다.&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 웹 서버: HTTP 요청을 받아 웹 페이지를 클라이언트(브라우저)에게 제공함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;클라이언트  &amp;zwj;  &amp;lt;(&lt;i&gt;상품 목록이랑 가격 정보 좀 주세요&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;)&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(&lt;i&gt;넵!&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/i&gt;)&amp;gt;   웹 서버&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;리버스 프록시: 클라이언트와 백엔드 서버의 중간에 위치. 클라이언트의 요청을 받아 백엔드 서버로 전달하고, 백엔드 서버의 응답을 클라이언트로 돌려줌
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보안 강화와 로드 밸런싱을 위해 사용 됨,&lt;span&gt;&amp;nbsp;&lt;/span&gt;보안 강화, 캐싱, SSL 종료 등
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;당연한 얘기(?)지만 서버 1대 + 리버스 프록시만 쓰면&lt;span&gt; 로드 밸런싱 효과는 없음, 이 경우엔 보안 강화, 캐싱, SSL 종료 등의 기능을 제공하는 역할을 수행&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;클라이언트의 요청이 역방향 프록시에 도달하면, 역방향 프록시가 백엔드 서버의 실제 IP 주소를 숨기고 요청을 처리. -&amp;gt; 이클라이언트는 백엔드 서버의 실제 IP 주소를 알 수 없음. -&amp;gt; 공격자가 서버의 실제 IP 주소를 알 수 없어서 디도스 공격 등의 위험으로부터 보호할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=4NB0NDtOwIQ&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;프록시 / 리버스 프록시를 쉽게 설명해주는 영상&lt;/a&gt;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 영상의 댓글에 &lt;i&gt;The forward proxy and reverse proxy are two very confusing names.You just need to know that, from your perspective, forward proxy is outbound proxy , and reverse proxy is inbound proxy. &lt;/i&gt;라는 내용이 있는데, 이해에 도움이 됐다!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;콘텐츠 캐시: 자주 요청되는 데이터를 임시 저장소에 보관하여 빠르게 제공
&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;span&gt; &lt;/span&gt;히트&lt;span&gt; &lt;/span&gt;비율&lt;/b&gt;&lt;span&gt;&lt;b&gt; (Cache Hit Ratio)&lt;/b&gt;로 가능 -&amp;gt; &lt;/span&gt;캐시에서&lt;span&gt; &lt;/span&gt;요청된&lt;span&gt; &lt;/span&gt;데이터를&lt;span&gt; &lt;/span&gt;성공적으로&lt;span&gt; &lt;/span&gt;제공한&lt;span&gt; &lt;/span&gt;비율, 서버 부하와 반비례 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;로드 밸런서: 여러 서버에 트래픽을 분산시켜 서버 과부하를 방지, 서버 충돌 or 지연 시간을 최소화 하는 등의 성능 최적화&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다룰 수 있는 주요 트래픽은 다음과 같음&lt;br /&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;HTTP/HTTPS &lt;span&gt;트래픽&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;TCP 트래픽&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;UDP 트래픽&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;SMTP/IMAP/POP3 &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;트래픽&lt;/span&gt;&lt;span&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메일 트래픽&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;웹소켓 트래픽&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.geeksforgeeks.org/reverse-proxy-vs-load-balancer/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;리버스 프록시와 로드 밸런서의 차이를 다룬 아티클&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&amp;nbsp;TCP/UDP 프록시 서버:&amp;nbsp; 클라이언트와 서버 간의 TCP/UDP 통신을 중계하는 서버
&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;NAT, 비디오 스트리밍, DB 연결 ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&amp;nbsp;메일 프록시 서버: 이메일 전송과 수신을 중계하는 서버
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일 보안과 스팸 필터링을 강화. 캐싱 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>BE</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/159</guid>
      <comments>https://bsscl.tistory.com/159#entry159comment</comments>
      <pubDate>Thu, 23 Jan 2025 22:15:27 +0900</pubDate>
    </item>
    <item>
      <title>[시스템 프로그래밍 기초] C 포인터</title>
      <link>https://bsscl.tistory.com/158</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. &lt;b&gt;&amp;amp;&lt;/b&gt;: Reference operator&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 주소는 컴퓨터를 실행할 때마다 바뀜&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;*&lt;/b&gt;: Dereference operator&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포인터가&lt;span&gt;&amp;nbsp;&lt;/span&gt;가리키는&lt;span&gt;&amp;nbsp;메모리&amp;nbsp;&lt;/span&gt;주소에&lt;span&gt; &lt;/span&gt;저장된&lt;span&gt; &lt;/span&gt;&lt;b&gt;값&lt;/b&gt;을&lt;span&gt; &lt;/span&gt;반환&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Pointers&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;C 프로그램에서 메모리에 접근, 주소를 조작하기 위해 사용됨&lt;/li&gt;
&lt;li&gt;데이터보다는 메모리 주소값을 갖고있는 특별한 변수 타입
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 변수들을 pointer variable 또는 간단하게 pointer 라고 칭함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1679815022549&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// *를 어디에 붙이던 같은 뜻
int* pval;
int * pval;
char *pch;

data_type* variable_name;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1679815155403&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;main() {
    int a;
    int *b;
    
    a = 38; // (O)
    b = 40; // (X), 포인터로 선언했기 때문에 정수X, 주소값을 넣어야 함 
    *b = 40; // (O)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제 1)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679816407802&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main() {
  int val = 10;
  printf(&quot;Value: %d, Address: %d \n&quot;, val, &amp;amp;val);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과:&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Value: 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Address: 1295815448&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제 2)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679826615149&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void) {
  int *pv;
  int num = 20;
  printf(&quot;[pv] Address: %d, Content: %d \n&quot;, pv, *pv);
  printf(&quot;[num] Address: %d, Value: %d \n\n&quot;, &amp;amp;num, num);
  pv = &amp;amp;num;
  printf(&quot;[pv] Address: %d, Content: %d \n\n&quot;, pv, *pv);
  num = 11;
  printf(&quot;[pv] Address: %d, Content: %d \n&quot;, pv, *pv);
  *pv = 2;
  printf(&quot;[num] Address: %d, Value: %d \n&quot;, &amp;amp;num, num);
  return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과:&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;[pv]&amp;nbsp;Address:&amp;nbsp;2040457912,&amp;nbsp;Content:&amp;nbsp;0&amp;nbsp;&lt;br /&gt;[num]&amp;nbsp;Address:&amp;nbsp;2040457596,&amp;nbsp;Value:&amp;nbsp;20&amp;nbsp;&lt;br /&gt;&lt;br /&gt;[pv]&amp;nbsp;Address:&amp;nbsp;2040457596,&amp;nbsp;Content:&amp;nbsp;20&amp;nbsp;&lt;br /&gt;&lt;br /&gt;[pv]&amp;nbsp;Address:&amp;nbsp;2040457596,&amp;nbsp;Content:&amp;nbsp;11&amp;nbsp;&lt;br /&gt;[num]&amp;nbsp;Address:&amp;nbsp;2040457596,&amp;nbsp;Value:&amp;nbsp;2&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제 3)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679828396167&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void) {
  char c[4] = {'a', 'b', 'c', 'd'};
  int d[4] = {5, 6, 7, 8};
  int i;
  for(i = 0; i &amp;lt; 4; i++) {
    printf(&quot;Address of c[%d] = %x\n&quot;, i, &amp;amp;c[i]);
    printf(&quot;&amp;amp;c[%d] = %x, (d + %d) = %x\n&quot;,i, &amp;amp;c[i], i, (c + i));
    printf(&quot;c[%d] = %d, *(c + %d) = %d\n&quot;, i, c[i], i, *(c + i));
  }
  for(i = 0; i &amp;lt; 4; i++) {
    printf(&quot;Address of d[%d] = %x\n&quot;, i, &amp;amp;d[i]);
    printf(&quot;&amp;amp;d[%d] = %x, (d + %d) = %x\n&quot;,i, &amp;amp;d[i], i, (d + i));
    printf(&quot;d[%d] = %d, *(d + %d) = %d\n&quot;, i, d[i], i, *(d + i));
  }
  return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열의 주소값을 요청하면 대표 번지수가 리턴된다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과:&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Address&amp;nbsp;of&amp;nbsp;c[0]&amp;nbsp;=&amp;nbsp;72cb5c&lt;br /&gt;&amp;amp;c[0]&amp;nbsp;=&amp;nbsp;72cb5c,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;0)&amp;nbsp;=&amp;nbsp;72cb5c&lt;br /&gt;c[0]&amp;nbsp;=&amp;nbsp;97,&amp;nbsp;*(c&amp;nbsp;+&amp;nbsp;0)&amp;nbsp;=&amp;nbsp;97&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;c[1]&amp;nbsp;=&amp;nbsp;72cb5d&lt;br /&gt;&amp;amp;c[1]&amp;nbsp;=&amp;nbsp;72cb5d,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;=&amp;nbsp;72cb5d&lt;br /&gt;c[1]&amp;nbsp;=&amp;nbsp;98,&amp;nbsp;*(c&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;=&amp;nbsp;98&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;c[2]&amp;nbsp;=&amp;nbsp;72cb5e&lt;br /&gt;&amp;amp;c[2]&amp;nbsp;=&amp;nbsp;72cb5e,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;2)&amp;nbsp;=&amp;nbsp;72cb5e&lt;br /&gt;c[2]&amp;nbsp;=&amp;nbsp;99,&amp;nbsp;*(c&amp;nbsp;+&amp;nbsp;2)&amp;nbsp;=&amp;nbsp;99&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;c[3]&amp;nbsp;=&amp;nbsp;72cb5f&lt;br /&gt;&amp;amp;c[3]&amp;nbsp;=&amp;nbsp;72cb5f,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;3)&amp;nbsp;=&amp;nbsp;72cb5f&lt;br /&gt;c[3]&amp;nbsp;=&amp;nbsp;100,&amp;nbsp;*(c&amp;nbsp;+&amp;nbsp;3)&amp;nbsp;=&amp;nbsp;100&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;d[0]&amp;nbsp;=&amp;nbsp;72cb60&lt;br /&gt;&amp;amp;d[0]&amp;nbsp;=&amp;nbsp;72cb60,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;0)&amp;nbsp;=&amp;nbsp;72cb60&lt;br /&gt;d[0]&amp;nbsp;=&amp;nbsp;5,&amp;nbsp;*(d&amp;nbsp;+&amp;nbsp;0)&amp;nbsp;=&amp;nbsp;5&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;d[1]&amp;nbsp;=&amp;nbsp;72cb64&lt;br /&gt;&amp;amp;d[1]&amp;nbsp;=&amp;nbsp;72cb64,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;=&amp;nbsp;72cb64&lt;br /&gt;d[1]&amp;nbsp;=&amp;nbsp;6,&amp;nbsp;*(d&amp;nbsp;+&amp;nbsp;1)&amp;nbsp;=&amp;nbsp;6&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;d[2]&amp;nbsp;=&amp;nbsp;72cb68&lt;br /&gt;&amp;amp;d[2]&amp;nbsp;=&amp;nbsp;72cb68,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;2)&amp;nbsp;=&amp;nbsp;72cb68&lt;br /&gt;d[2]&amp;nbsp;=&amp;nbsp;7,&amp;nbsp;*(d&amp;nbsp;+&amp;nbsp;2)&amp;nbsp;=&amp;nbsp;7&lt;br /&gt;Address&amp;nbsp;of&amp;nbsp;d[3]&amp;nbsp;=&amp;nbsp;72cb6c&lt;br /&gt;&amp;amp;d[3]&amp;nbsp;=&amp;nbsp;72cb6c,&amp;nbsp;(d&amp;nbsp;+&amp;nbsp;3)&amp;nbsp;=&amp;nbsp;72cb6c&lt;br /&gt;d[3]&amp;nbsp;=&amp;nbsp;8,&amp;nbsp;*(d&amp;nbsp;+&amp;nbsp;3)&amp;nbsp;=&amp;nbsp;8&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제 4)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679829192904&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void) {
  int i, val[4], sum = 0;
  printf(&quot;Enter 4 numbers: \n&quot;);
  for(i = 0; i &amp;lt; 4; ++i) {
    scanf(&quot;%d&quot;, (val + i));
    sum += *(val + i);
  }
  printf(&quot;Sum = %d&quot;, sum);

  return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;val을 배열 자체로 접근한 뒤 int 값을 더하는 방법으로 변수의 메모리 주소값에 접근&lt;/li&gt;
&lt;li&gt;scanf는 메모리 주소가 필요한 함수&lt;/li&gt;
&lt;li&gt;참고 블로그&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1679829340293&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[C언어] scanf()함수에서 &amp;amp;(ampersand)를 쓰는 이유&quot; data-og-description=&quot;[&amp;amp;(ampersand)에 대하여] c언어를 시작하면 printf에서는 &amp;amp;를 안썼는데, scanf에서는 &amp;amp;를 쓸때가 있고, 안쓸때가 있다.&amp;amp;의 역할은 무엇이며, &amp;amp;는 언제 쓰는 것일까. &amp;amp;(ampersand)의 역할- &amp;amp;(ampersand(앰퍼샌드))&quot; data-og-host=&quot;security-nanglam.tistory.com&quot; data-og-source-url=&quot;https://security-nanglam.tistory.com/194&quot; data-og-url=&quot;https://security-nanglam.tistory.com/194&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/vXOtv/hyR4dkHgd9/SxViWztrtnhdj05OvWIhLk/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144,https://scrap.kakaocdn.net/dn/fPuPV/hyR4bNXeEc/fluV4uOJLIQrX8INcTc3Pk/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144&quot;&gt;&lt;a href=&quot;https://security-nanglam.tistory.com/194&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://security-nanglam.tistory.com/194&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/vXOtv/hyR4dkHgd9/SxViWztrtnhdj05OvWIhLk/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144,https://scrap.kakaocdn.net/dn/fPuPV/hyR4bNXeEc/fluV4uOJLIQrX8INcTc3Pk/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[C언어] scanf()함수에서 &amp;amp;(ampersand)를 쓰는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;[&amp;amp;(ampersand)에 대하여] c언어를 시작하면 printf에서는 &amp;amp;를 안썼는데, scanf에서는 &amp;amp;를 쓸때가 있고, 안쓸때가 있다.&amp;amp;의 역할은 무엇이며, &amp;amp;는 언제 쓰는 것일까. &amp;amp;(ampersand)의 역할- &amp;amp;(ampersand(앰퍼샌드))&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;security-nanglam.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제 5)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1679829573077&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

void swap(int *a, int *b);

int main() {
  int num1 = 5, num2 = 10;
  printf(&quot;Number1 = %d\n&quot;, num1);
  printf(&quot;Number2 = %d\n&quot;, num2);

  swap(&amp;amp;num1, &amp;amp;num2);
  
  printf(&quot;Number1 = %d\n&quot;, num1);
  printf(&quot;Number2 = %d\n&quot;, num2);
  
  return 0;
}

void swap(int *a, int *b) {
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왜 직접 값을 안바꾸고 주소값을 넘겨서 바꿀까?&lt;br /&gt;1) 값은 한 개 밖에 리턴되지 않음&lt;br /&gt;2) 로컬함수에서 계산한 값이 메인 함수로 돌아왔을 때 남아있다는 보장이 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과:&lt;/p&gt;
&lt;div data-ke-type=&quot;moreLess&quot; data-text-more=&quot;더보기&quot; data-text-less=&quot;닫기&quot;&gt;&lt;a class=&quot;btn-toggle-moreless&quot;&gt;더보기&lt;/a&gt;
&lt;div class=&quot;moreless-content&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Number1&amp;nbsp;=&amp;nbsp;5&lt;br /&gt;Number2&amp;nbsp;=&amp;nbsp;10&lt;br /&gt;Number1&amp;nbsp;=&amp;nbsp;10&lt;br /&gt;Number2&amp;nbsp;=&amp;nbsp;5&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
      <category>CS/시스템 프로그래밍 기초</category>
      <category>C</category>
      <category>시스템프로그래밍기초</category>
      <category>포인터</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/158</guid>
      <comments>https://bsscl.tistory.com/158#entry158comment</comments>
      <pubDate>Sun, 26 Mar 2023 20:26:56 +0900</pubDate>
    </item>
    <item>
      <title>[시스템 프로그래밍 기초] vi 명령어 정리</title>
      <link>https://bsscl.tistory.com/156</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. vi 시작하기&lt;/h3&gt;
&lt;pre id=&quot;code_1679808848706&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;vi filename&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;filename의 이름을 가진 파일이 존재한다면 open, 없다면 create 한다&lt;/li&gt;
&lt;li&gt;리눅스, 유닉스에는 확장자라는 개념이 없음(r w x 개념만 있다)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. vi 실행모드의 종류&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(1) Command mode (명령 모드)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열을 검색할 수 있다&lt;/li&gt;
&lt;li&gt;에디팅 모드에서 esc키를 눌러서 커맨드 모드로 진입할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(2) Editing mode (수정 모드)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자를 삽입, 수정할 수 있다&lt;/li&gt;
&lt;li&gt;커맨드 모드에서 `a`(append), `i`(insert) 문자를 입력해서 에디팅 모드로 진입할 수 있다&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. vi 커맨드 모드에서의 명령어&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(1) vi 종료하기&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 58px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;&lt;b&gt;:q&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;에디터 종료&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;&lt;b&gt;&lt;b&gt;:&lt;/b&gt;q!&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;파일의 변경사항을 저장하지 않고 종료 ( &amp;harr;️ :wq)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;:q&lt;/b&gt;의 경우변경사항이 있는데 이 명령어를 사용하면 아래의 에러메시지가 표출된다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-03-26 오후 3.21.50.png&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;27&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwvpTM/btr59Z8lZex/ASlL39PjXRoKd1Pxrki7Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwvpTM/btr59Z8lZex/ASlL39PjXRoKd1Pxrki7Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwvpTM/btr59Z8lZex/ASlL39PjXRoKd1Pxrki7Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwvpTM%2Fbtr59Z8lZex%2FASlL39PjXRoKd1Pxrki7Kk%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;367&quot; height=&quot;27&quot; data-filename=&quot;스크린샷 2023-03-26 오후 3.21.50.png&quot; data-origin-width=&quot;367&quot; data-origin-height=&quot;27&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(2) vi 변경사항 저장하기&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;:wq&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;span&gt;변경사항 저장 및 종료&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;:w&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;변경사항 저장 (종료 X)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;(3) vi 커서 이동하기&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;h&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;왼쪽으로 한 칸 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;l&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;오른쪽으로 한 칸 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;j&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;한 줄 아래로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;&lt;b&gt;k&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;한 줄 위로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맥os의 터미널은 영문자가 아닌 방향키로도 이동 가능하던데 리눅스는 다른걸까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(4)&amp;nbsp; vi 문자 지우기&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 244px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;x&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;커서가 가리키는 문자 한 개 삭제,&lt;br /&gt;(2x는 문자 두개 삭제...&lt;i&gt;n&lt;/i&gt;&lt;b&gt;x&lt;/b&gt;로 응용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;u&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;실행 취소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;dd&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 40px;&quot;&gt;커서가 있는 라인 전부 삭제&lt;br /&gt;(&lt;i&gt;n&lt;/i&gt;&lt;b&gt;dd&lt;/b&gt;로 응용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;s&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;해당 문자 치환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;d^&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;커서가 위치한 라인의 첫 문자열 ~ 커서 아래 문자열 직전까지 삭제&lt;br /&gt;(사라진 문자열은 클립보드로 들어간다. 잘라내기 느낌?)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;d$&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;커서 아래 문자열 ~ 커서가 위치한 라인의 끝 문자열까지 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;dw&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;커서가 위치한 문자열 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;p&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;현재 문자열 아래 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;yy&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;한 줄 복사, (&lt;i&gt;n&lt;/i&gt;&lt;b&gt;y&lt;/b&gt;로 응용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;(5)&amp;nbsp; vi 커서 점프하기&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 110px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;:lineNumber&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;파일의 특정한 lineNumber번째 라인으로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;^f&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;다음 페이지로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;^b&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;이전 페이지로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;w&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;다음 단어로 커서 이동, (&lt;i&gt;n&lt;/i&gt;&lt;b&gt;b&lt;/b&gt;로 응용 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;b&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;이전 단어로 커서 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;&lt;i&gt;n&lt;/i&gt;G&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;n번째 라인으로 커서 이동&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;</description>
      <category>CS/시스템 프로그래밍 기초</category>
      <category>vi</category>
      <category>리눅스</category>
      <category>시스템프로그래밍기초</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/156</guid>
      <comments>https://bsscl.tistory.com/156#entry156comment</comments>
      <pubDate>Sun, 26 Mar 2023 16:05:07 +0900</pubDate>
    </item>
    <item>
      <title>[Javascript] currentTarget vs target</title>
      <link>https://bsscl.tistory.com/155</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;쓸 때마다 잊어버려서 기억하려고 메모하는 포스팅...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;currentTarget : 이벤트를 &lt;b&gt;등록&lt;/b&gt;한 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;target : 이벤트가 &lt;b&gt;발생&lt;/b&gt;한 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;iframe src=&quot;https://codesandbox.io/embed/gifted-stitch-xfirqv?fontsize=14&amp;hidenavigation=1&amp;theme=dark&quot;
     style=&quot;width:100%; height:500px; border:0; border-radius: 4px; overflow:hidden;&quot;
     title=&quot;gifted-stitch-xfirqv&quot;
     allow=&quot;accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi; payment; usb; vr; xr-spatial-tracking&quot;
     sandbox=&quot;allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts&quot;
   &gt;&lt;/iframe&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콘솔에 target을 찍어보면 클릭이 일어난 요소가 출력되지만&lt;/p&gt;
&lt;pre id=&quot;code_1679305574215&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 클릭한 각각의 요소가
&amp;lt;img src=&quot;https://uploads.codesandbox.io/uploads/user/1ca04d5e-d300-46f8-a6e0-13c8b8a087b1/qO3C-easter-bunny-24222955.jpeg&quot; style=&quot;width: 200px;&quot;&amp;gt;&amp;lt;/img&amp;gt;

// 출력되는 모습
&amp;lt;p&amp;gt;Good evening !&amp;lt;/p&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;currentTarget은 이벤트가 등록된 최상단 요소 button이 출력된다&lt;/p&gt;
&lt;pre id=&quot;code_1679305633796&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;App&quot;&amp;gt;
&amp;lt;p&amp;gt;Good evening !&amp;lt;/p&amp;gt;
&amp;lt;img src=&quot;https://uploads.codesandbox.io/uploads/user/1ca04d5e-d300-46f8-a6e0-13c8b8a087b1/qO3C-easter-bunny-24222955.jpeg&quot; style=&quot;width: 200px;&quot;&amp;gt;&amp;lt;/img&amp;gt;
&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FE/Javascript</category>
      <category>currentTarget</category>
      <category>event</category>
      <category>JavaScript</category>
      <category>target</category>
      <category>이벤트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/155</guid>
      <comments>https://bsscl.tistory.com/155#entry155comment</comments>
      <pubDate>Mon, 20 Mar 2023 18:43:30 +0900</pubDate>
    </item>
    <item>
      <title>[React] svg에 스타일 입히기</title>
      <link>https://bsscl.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;나는 보통 svg 파일을 쓸때 한꺼번에 import하는 방식으로 svg 파일을 가져왔다( &amp;darr; 이런 방식)&lt;/p&gt;
&lt;pre id=&quot;code_1657522560037&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import LogoImage from 'logo.svg'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러다보니 svg의 스타일을 동적으로 설정할 수 없어서 각각의 이미지 파일을 생성해서 쓰는 등 매우 비효율적인 방식으로 asset을 관리하고 있었다 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;svg의 장점을 못살려서 고민이 많았는데 svg를 리액트 컴포넌트처럼 사용하는 방법을 알게됐다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법을 사용하면 svg의 자식 태그들에 각각 스타일을 줄 수 있어서 효율적으로 관리할 수 있음!!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(next에서는 이 방법은 안되고 따로 라이브러리를 설치해야 한다고 함)&lt;/i&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657522925221&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import { ReactComponent as LogoImage } from 'logo.svg'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이제 svg에 직접 스타일을 줄 수 있다!&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;svg 코드에서 바꾸고자 하는 요소를 &quot;current&quot; 로 바꿔주거나 아예 비우면 svg 태그의 props로 값을 넘겨서 커스텀 가능&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;&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;그리고 내가 엄청나게 좋아하는 웹 svg 뷰어 사이트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.svgviewer.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.svgviewer.dev/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1657523475608&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;SVG Viewer&quot; data-og-description=&quot;Copy&quot; data-og-host=&quot;www.svgviewer.dev&quot; data-og-source-url=&quot;https://www.svgviewer.dev/&quot; data-og-url=&quot;https://www.svgviewer.dev/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.svgviewer.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.svgviewer.dev/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;SVG Viewer&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Copy&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.svgviewer.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸로 svg 요소 확인하면 넘모 편함  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FE/React</category>
      <category>react</category>
      <category>reactComponent</category>
      <category>svg</category>
      <category>리액트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/154</guid>
      <comments>https://bsscl.tistory.com/154#entry154comment</comments>
      <pubDate>Mon, 11 Jul 2022 16:12:42 +0900</pubDate>
    </item>
    <item>
      <title>[Git] 원격/로컬 태그 삭제하기</title>
      <link>https://bsscl.tistory.com/153</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;우리 팀은 rebase로 커밋 이력을 관리하기 때문에 태깅이 중요하다&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;rebase는 수정 사항에 대한 정보는 얻을수 있지만 어느 시점에 어떤 브랜치가 머지되었는지는 알 수 없기 때문!&lt;/blockquote&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;size18&quot;&gt;&lt;b&gt;1. 로컬 태그 삭제하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657522023740&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git tag -d 태그이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 원격 태그 삭제하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1657521991777&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;git push origin :태그이름
예) git push origin :v1.19.3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git &amp;amp; GitHub</category>
      <category>github</category>
      <category>tag</category>
      <category>깃허브</category>
      <category>태그</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/153</guid>
      <comments>https://bsscl.tistory.com/153#entry153comment</comments>
      <pubDate>Mon, 11 Jul 2022 15:49:23 +0900</pubDate>
    </item>
    <item>
      <title>CRA 없이 리액트 개발환경 구축하기(feat. typescript, webpack, babel)</title>
      <link>https://bsscl.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 개발이 진행될 폴더를 만들어준다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648829399349&quot; class=&quot;dos&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cd 폴더를 만드려는 경로
mkdir 폴더 이름&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. npm init으로 package.json을 생성해서 초기화 해준다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(y 옵션을 붙여주면 별다른 질문(version, description ...) 없이 생성된다&lt;/p&gt;
&lt;pre id=&quot;code_1648829399350&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init [-y]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.  리액트를 설치한다&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1649084166491&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i react react-dom&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 프로젝트의 시작점이 될 파일 위치를 잡는다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우는 프로젝트 루트 경로에 &lt;b&gt;index.html&lt;/b&gt;을 생성한 뒤, src 폴더를 만들어서 그 안에 &lt;b&gt;App.tsx&lt;/b&gt;와 &lt;b&gt;&lt;span&gt;index.tsx&lt;/span&gt;&lt;/b&gt;&amp;nbsp;파일을 생성했다&lt;/p&gt;
&lt;pre id=&quot;code_1649056872940&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- index.html --&amp;gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang=&quot;ko&quot;&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset=&quot;UTF-8&quot; /&amp;gt;
    &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&amp;gt;
    &amp;lt;title&amp;gt;Typescript practice&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&quot;root&quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649056767801&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/App.tsx

function App() {
  const test = (str: string) =&amp;gt; {
    return str;
  };
  return &amp;lt;div&amp;gt;{test(&quot;hello&quot;)}&amp;lt;/div&amp;gt;;
}
export default App;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1649086999277&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// src/index.tsx

import ReactDOM from &quot;react-dom&quot;;
import App from &quot;./App&quot;;

const rootElement = document.getElementById(&quot;root&quot;);

ReactDOM.render(&amp;lt;App /&amp;gt;, rootElement);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt; typescript 설치 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648829399351&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -D typescript @types/react @types/react-dom&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;여기서 잠깐 !&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;  왜 -D 옵션을 붙이지 ?&lt;/b&gt;&lt;br /&gt;-D 를 안붙이면 -&amp;gt; 그냥 dependencies에 포함: 여기는 프로젝트를 실행시키는데 필수적인 라이브러리들이 포함되는 곳&lt;br /&gt;-D를 붙여서 설치하면 -&amp;gt; devDependencies에 포함: 여기는 현재 프로젝트를 개발하고 테스트하는데 사용되지만 실제 런타임에서는 필요없는 라이브러리들이 포함되는 곳&lt;br /&gt;&lt;br /&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;라이브러리 앞에 붙은 @types는 뭐지 ?&lt;/b&gt;&lt;br /&gt;@어쩌구 -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;scoped packages&lt;br /&gt;npm 라이브러리 중 타입 선언이 포함되어 있지 않는 것들도 있는데(ex: 리액트),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://definitelytyped.org/&quot;&gt;definitelyTyped&lt;/a&gt;에서 유지보수 되고 있는 타입 정의가 있는지 확인할 수 있다. 만약 있다면 @types 를 붙여서 npm으로 설치가 가능하다. @types 라이브러리는 타입 정의만 있기 때문에(구현 x) 원본 라이브러리도 설치해줘야함!&lt;br /&gt;&lt;br /&gt; &lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;--save 옵션을 따로 붙여주는 사람들도 있던데 ?&lt;/b&gt;&lt;br /&gt;&lt;u&gt;npm5 부터는 --save 옵션을 기본으로 적용되어서 안 써줘도 되지만!&lt;/u&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;예전에는 이 옵션을 안 써주면 node_modules에는 들어가지만 package.json의 dependencies에는 추가가 안됐다고 한다 (22.04.02 오늘의 나는 npm&lt;span&gt;&amp;nbsp;&lt;/span&gt;7.5.4 버전을 쓰고 있다)&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 끝났다면 &lt;b&gt;tsconfig.json&lt;/b&gt; 파일을 생성해서 typescript 환경 설정을 해준다&lt;/p&gt;
&lt;pre id=&quot;code_1648832278011&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//tsconfig.json
{
  &quot;exclude&quot;: [&quot;node_modules&quot;], // 1
  &quot;include&quot;: [&quot;**/*.ts&quot;, &quot;**/*.tsx&quot;], // 2
  &quot;compilerOptions&quot;: { // 3
    &quot;target&quot;: &quot;es5&quot;,
    &quot;module&quot;: &quot;commonjs&quot;,
    &quot;noImplicitAny&quot;: true,
    &quot;strictNullChecks&quot;: true,
    &quot;jsx&quot;: &quot;react-jsx&quot;,
    &quot;esModuleInterop&quot;: true
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) exclude: 컴파일 제외할 대상 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) include: 컴파일 할 대상 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) compileOptions: 컴파일 할때 옵션들을 세세하게 정할 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;target: 어떤 JS 버전으로 컴파일할지&lt;/li&gt;
&lt;li&gt;module: 어떤 모듈 시스템을 사용할지&lt;/li&gt;
&lt;li&gt;noImplicitAny: any 타입 허용 X&lt;/li&gt;
&lt;li&gt;strictNullChecks: undefined 또는 null값 참조 방지&lt;/li&gt;
&lt;li&gt;jsx: jsx 파일이 어떻게 만들어질지&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;esModuleInterop: 파일 가져오기에 대한&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJjb2RlLWxpbmUlMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiVFQiVBQSVBOCVFQiU5MyVBMCUyMCVFQSVCMCU4MCVFQyVBMCVCOCVFQyU5OCVBNCVFQSVCOCVCMCVFQyU5NyU5MCUyMCVFQiU4QyU4MCVFRCU5NSU5QyUyMCVFQiU4NCVBNCVFQyU5RSU4NCVFQyU4QSVBNCVFRCU4RSU5OCVFQyU5RCVCNCVFQyU4QSVBNCUyMCVFQSVCMCU5RCVFQyVCMiVCNCUyMCVFQyU4MyU5RCVFQyU4NCVCMSVFQyU5RCU4NCUyMCVFRCU4NiVCNSVFRCU5NSVCNCUyMENvbW1vbkpTJUVDJTk5JTgwJTIwRVMlMjAlRUIlQUElQTglRUIlOTMlODglMjAlRUElQjAlODQlRUMlOUQlOTglMjAlRUMlODMlODElRUQlOTglQjglMjAlRUMlOUElQjQlRUMlOUElQTklRUMlODQlQjElRUMlOUQlODQlMjAlRUMlQTAlOUMlRUElQjMlQjUlMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIxMzI5MWJlZmE0YzA0YjRmOGQ0MDU3MWM2NDJlOGVhMSUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjZmMDNjZTZjMWFjZTRiOGE4OGRlZjQ5NGExODZlODQzJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNTgzMjQ4NjExZDUwNDRhMDlhMThkYTA5NDFlZDQ3NDYlMjIlN0Q=&quot;&gt;&amp;nbsp;CommonJS와 ES 모듈 간의 상호 운용성을 제공&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px; color: #666666;&quot;&gt;* esModuleInterop에 대해 조금 이해가 간 stackoverflow 답변 링크&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span data-slate-fragment=&quot;JTdCJTIyb2JqZWN0JTIyJTNBJTIyZG9jdW1lbnQlMjIlMkMlMjJkYXRhJTIyJTNBJTdCJTdEJTJDJTIybm9kZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJibG9jayUyMiUyQyUyMnR5cGUlMjIlM0ElMjJjb2RlLWxpbmUlMjIlMkMlMjJpc1ZvaWQlMjIlM0FmYWxzZSUyQyUyMmRhdGElMjIlM0ElN0IlN0QlMkMlMjJub2RlcyUyMiUzQSU1QiU3QiUyMm9iamVjdCUyMiUzQSUyMnRleHQlMjIlMkMlMjJsZWF2ZXMlMjIlM0ElNUIlN0IlMjJvYmplY3QlMjIlM0ElMjJsZWFmJTIyJTJDJTIydGV4dCUyMiUzQSUyMiVFQiVBQSVBOCVFQiU5MyVBMCUyMCVFQSVCMCU4MCVFQyVBMCVCOCVFQyU5OCVBNCVFQSVCOCVCMCVFQyU5NyU5MCUyMCVFQiU4QyU4MCVFRCU5NSU5QyUyMCVFQiU4NCVBNCVFQyU5RSU4NCVFQyU4QSVBNCVFRCU4RSU5OCVFQyU5RCVCNCVFQyU4QSVBNCUyMCVFQSVCMCU5RCVFQyVCMiVCNCUyMCVFQyU4MyU5RCVFQyU4NCVCMSVFQyU5RCU4NCUyMCVFRCU4NiVCNSVFRCU5NSVCNCUyMENvbW1vbkpTJUVDJTk5JTgwJTIwRVMlMjAlRUIlQUElQTglRUIlOTMlODglMjAlRUElQjAlODQlRUMlOUQlOTglMjAlRUMlODMlODElRUQlOTglQjglMjAlRUMlOUElQjQlRUMlOUElQTklRUMlODQlQjElRUMlOUQlODQlMjAlRUMlQTAlOUMlRUElQjMlQjUlMjIlMkMlMjJtYXJrcyUyMiUzQSU1QiU1RCUyQyUyMnNlbGVjdGlvbnMlMjIlM0ElNUIlNUQlN0QlNUQlMkMlMjJrZXklMjIlM0ElMjIxMzI5MWJlZmE0YzA0YjRmOGQ0MDU3MWM2NDJlOGVhMSUyMiU3RCU1RCUyQyUyMmtleSUyMiUzQSUyMjZmMDNjZTZjMWFjZTRiOGE4OGRlZjQ5NGExODZlODQzJTIyJTdEJTVEJTJDJTIya2V5JTIyJTNBJTIyNTgzMjQ4NjExZDUwNDRhMDlhMThkYTA5NDFlZDQ3NDYlMjIlN0Q=&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/56238356/understanding-esmoduleinterop-in-tsconfig-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/56238356/understanding-esmoduleinterop-in-tsconfig-file&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1649084794090&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Understanding esModuleInterop in tsconfig file&quot; data-og-description=&quot;I was checking out someone .tsconfig file and there I spotted --esModuleInterop This is his .tsconfig file { &amp;quot;compilerOptions&amp;quot;: { &amp;quot;moduleResolution&amp;quot;: &amp;quot;node&amp;quot;, ...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/56238356/understanding-esmoduleinterop-in-tsconfig-file&quot; data-og-url=&quot;https://stackoverflow.com/questions/56238356/understanding-esmoduleinterop-in-tsconfig-file&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b5mjsa/hyNUvx4C9i/Mg9s750SnDoiQd451Trx21/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/56238356/understanding-esmoduleinterop-in-tsconfig-file&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/56238356/understanding-esmoduleinterop-in-tsconfig-file&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b5mjsa/hyNUvx4C9i/Mg9s750SnDoiQd451Trx21/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Understanding esModuleInterop in tsconfig file&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I was checking out someone .tsconfig file and there I spotted --esModuleInterop This is his .tsconfig file { &quot;compilerOptions&quot;: { &quot;moduleResolution&quot;: &quot;node&quot;, ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;webpack 설치 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648829399352&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -D webpack webpack-cli webpack-dev-server babel-loader html-webpack-plugin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;webpack.config.js&lt;/b&gt; 파일을 생성해서 환경 설정을 진행해준다&lt;/p&gt;
&lt;pre id=&quot;code_1648832407344&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//webpack.config.js
const HtmlWebpackPlugin = require(&quot;html-webpack-plugin&quot;);
const path = require(&quot;path&quot;);
const webpack = require(&quot;webpack&quot;);

module.exports = {
  mode: &quot;development&quot;, // 1
  entry: &quot;./src/index.tsx&quot;, // 2

  resolve: { // 3
    extensions: [&quot;.js&quot;, &quot;.jsx&quot;, &quot;.ts&quot;, &quot;.tsx&quot;],
  },

  module: { // 4
    rules: [
      {
        test: /\.tsx?$/,
        use: [&quot;babel-loader&quot;],
      },
    ],
  },

  output: { // 5
    path: path.join(__dirname, &quot;/dist&quot;),
    filename: &quot;bundle.js&quot;,
  },

  plugins: [ // 6
    new webpack.ProvidePlugin({
      React: &quot;react&quot;,
    }),
    new HtmlWebpackPlugin({
      template: &quot;./index.html&quot;,
    }),
  ],
};&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) &lt;a href=&quot;https://webpack.js.org/configuration/mode/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;mode&lt;/a&gt;: 번들링 환경을 설정, 이에 따라 번들링 결과물의 파일 크기가 달라진다&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) entry: 번들링의 시작점이 될 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) &lt;a href=&quot;https://webpack.kr/configuration/resolve/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;resolve&lt;/a&gt;:&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;extensions: 나열된 확장자를 순서대로 해석, extensions을 설정해주면 import 할때 확장자 생략이 가능하다!&lt;/li&gt;
&lt;li&gt;modules: 절대경로 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) module: 자바스크립트로 작성되지 않은 파일들을 변환시켜 준다 - test 정규식의 조건에 맞는 파일들이 use에 나열된 로더들에 의해 변환되며,&amp;nbsp;&lt;a href=&quot;https://webpack.kr/configuration/module/#ruleloader&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;만약 한개만 있다면 loader로 대체 가능 !&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) output: 번들링 결과물이 저장될 위치 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) plugin: 번들링된 결과물을 처리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;html-webpack-plugin: html을 동적으로 생성, html 파일에서 js 파일을 불러오는 부분이 빠져도 된다&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;provide-plugin: 자주 쓰이는 모듈을 등록해놓으면 import 하지 않아도 인식한다&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;span&gt;더 많은 공식 플러그인은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://webpack.kr/plugins/#root&quot;&gt;여기&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. babel 설치 및 환경 설정&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1648830456424&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm i -D @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;babel은 최신 문법을 지원하지 않는 브라우저들에 대응하기 위해 사용하는 라이브러리다. 최신문법을 사용해서 특정 브라우저가 이해하지 못하는 부분을 babel이 이해할 수 있도록 변환해주는 것!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;babel의 빌드 과정 중 실제 코드 변환 작업들은 플러그인들이 하는데, 이 플러그인들은 기능별로 분리되어 있어서 하나하나씩 설정해주기에는 넘모 번거롭다 &lt;a href=&quot;https://babeljs.io/docs/en/plugins-list&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;(let, arrow function ... 등등 아주 많다)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1648830982260&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Babel &amp;middot; The compiler for next generation JavaScript&quot; data-og-description=&quot;The compiler for next generation JavaScript&quot; data-og-host=&quot;babeljs.io&quot; data-og-source-url=&quot;https://babeljs.io/docs/en/plugins-list&quot; data-og-url=&quot;https://babeljs.io/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cirLub/hyNTl2vRYA/v36H9P3EeoKhg0vSh5zygK/img.png?width=1184&amp;amp;height=1184&amp;amp;face=0_0_1184_1184&quot;&gt;&lt;a href=&quot;https://babeljs.io/docs/en/plugins-list&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://babeljs.io/docs/en/plugins-list&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cirLub/hyNTl2vRYA/v36H9P3EeoKhg0vSh5zygK/img.png?width=1184&amp;amp;height=1184&amp;amp;face=0_0_1184_1184');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Babel &amp;middot; The compiler for next generation JavaScript&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The compiler for next generation JavaScript&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;babeljs.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 사용하려는 목적에 맞는 플러그인들을 모아놔서 한 번에 설정할 수 있도록 한게 &lt;b&gt;preset&lt;/b&gt;이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;난 preset을 사용해서 프로젝트 루트 경로에 babel 환경설정 파일(&lt;b&gt;.babelrc&lt;/b&gt;)을 만들어줬다&lt;/p&gt;
&lt;pre id=&quot;code_1648831789501&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// .babelrc
{
  &quot;presets&quot;: [
    &quot;@babel/preset-env&quot;,
    &quot;@babel/preset-react&quot;,
    &quot;@babel/preset-typescript&quot;
  ]
}&lt;/code&gt;&lt;/pre&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;스크린샷 2022-04-05 오전 12.01.52.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efSpah/btryt6lDqUp/NxeaSt3QkZtKbzRZoFLzhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efSpah/btryt6lDqUp/NxeaSt3QkZtKbzRZoFLzhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efSpah/btryt6lDqUp/NxeaSt3QkZtKbzRZoFLzhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefSpah%2Fbtryt6lDqUp%2FNxeaSt3QkZtKbzRZoFLzhK%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;291&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2022-04-05 오전 12.01.52.png&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;528&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;별도의 설정을 하지 않았다면 http://localhost:8080/ 에서 내 프로젝트를 볼 수 있다  &lt;/p&gt;
&lt;pre id=&quot;code_1649084581690&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npx webpack-dev-server --mode development&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json의 scripts에 등록해놓으면 더 편하게 사용할 수 있음 !&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLBkjy/btryrps0Fvx/cu4Iccwi0Tq3kKjym4gCN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLBkjy/btryrps0Fvx/cu4Iccwi0Tq3kKjym4gCN1/img.png&quot; data-alt=&quot;덩그러니...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLBkjy/btryrps0Fvx/cu4Iccwi0Tq3kKjym4gCN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLBkjy%2Fbtryrps0Fvx%2Fcu4Iccwi0Tq3kKjym4gCN1%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;1812&quot; height=&quot;892&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1812&quot; data-origin-height=&quot;892&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;CRA 없이 개발환경 구축하기 끝 ~&lt;/p&gt;</description>
      <category>FE/React</category>
      <category>babel</category>
      <category>CRA</category>
      <category>react</category>
      <category>TypeScript</category>
      <category>webpack</category>
      <category>개발환경</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/149</guid>
      <comments>https://bsscl.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 5 Apr 2022 00:45:34 +0900</pubDate>
    </item>
    <item>
      <title>[error] Cannot use JSX unless the '--jsx' flag is provided.</title>
      <link>https://bsscl.tistory.com/150</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;tsconfig 설정이 제대로 되지 않아서 발생한 문제였다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;tsconfig.json 파일의 compiledOptions에&lt;/p&gt;
&lt;pre id=&quot;code_1649006579048&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;jsx&quot;: &quot;react&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가해서 해결 완료! 경우에 따라서 vscode를 재실행하는 과정이 필요할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50432556/cannot-use-jsx-unless-the-jsx-flag-is-provided?rq=1&quot;&gt;https://stackoverflow.com/questions/50432556/cannot-use-jsx-unless-the-jsx-flag-is-provided?rq=1&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1649006165802&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Cannot use JSX unless the '--jsx' flag is provided&quot; data-og-description=&quot;I have looked around a bit for a solution to this problem. All of them suggest adding &amp;quot;jsx&amp;quot;: &amp;quot;react&amp;quot; to your tsconfig.json file. Which I have done. Another one was to add &amp;quot;include: []&amp;quot;, which I hav...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/50432556/cannot-use-jsx-unless-the-jsx-flag-is-provided?rq=1&quot; data-og-url=&quot;https://stackoverflow.com/questions/50432556/cannot-use-jsx-unless-the-jsx-flag-is-provided&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bdnZwU/hyNUCQF9EM/9urKjoM3VlZ2O7HTkl9lOk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/3fLc2/hyNUrBAcrY/SkEqQmKjqFqERkICVpUUu1/img.png?width=1294&amp;amp;height=246&amp;amp;face=0_0_1294_246&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/50432556/cannot-use-jsx-unless-the-jsx-flag-is-provided?rq=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/50432556/cannot-use-jsx-unless-the-jsx-flag-is-provided?rq=1&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bdnZwU/hyNUCQF9EM/9urKjoM3VlZ2O7HTkl9lOk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316,https://scrap.kakaocdn.net/dn/3fLc2/hyNUrBAcrY/SkEqQmKjqFqERkICVpUUu1/img.png?width=1294&amp;amp;height=246&amp;amp;face=0_0_1294_246');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Cannot use JSX unless the '--jsx' flag is provided&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I have looked around a bit for a solution to this problem. All of them suggest adding &quot;jsx&quot;: &quot;react&quot; to your tsconfig.json file. Which I have done. Another one was to add &quot;include: []&quot;, which I hav...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>FE</category>
      <category>error</category>
      <category>jsx</category>
      <category>react</category>
      <category>tsconfig</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/150</guid>
      <comments>https://bsscl.tistory.com/150#entry150comment</comments>
      <pubDate>Mon, 4 Apr 2022 02:23:43 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 마지막 팀 프로젝트 후기  </title>
      <link>https://bsscl.tistory.com/148</link>
      <description>&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://bsscl.tistory.com/143&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;두번째 프로젝트&lt;/a&gt;보다는 훨씬 시간적, 마음적으로 여유있게 진행했다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게&lt;b&gt; 완성도만 생각하면 좋은 방향이었는지는 잘 모르겠지만...&lt;/b&gt; 저번 프로젝트가 끝나고 몇주 동안 코딩 관련해서는 아무것도 보고싶지 않았었던 기억이 있어서...:) 생활 루틴을 잡는데에는 훨씬 나을거 같긴하다   앞으로 이 균형을 어떻게 잡느냐가 중요할것 같지만...!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-13 오후 5.54.42.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;1528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ITrtJ/btrvOfz0kGx/ZBj9o6l6R5guQEnJGVpo70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ITrtJ/btrvOfz0kGx/ZBj9o6l6R5guQEnJGVpo70/img.png&quot; data-alt=&quot;마로니에의 메인 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ITrtJ/btrvOfz0kGx/ZBj9o6l6R5guQEnJGVpo70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FITrtJ%2FbtrvOfz0kGx%2FZBj9o6l6R5guQEnJGVpo70%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;468&quot; height=&quot;457&quot; data-filename=&quot;스크린샷 2022-03-13 오후 5.54.42.png&quot; data-origin-width=&quot;1566&quot; data-origin-height=&quot;1528&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;우리 팀의 주제는 양주 라벨 검색 + 칵테일 레시피 공유 서비스였다   서비스 특성 상 모바일로 먼저 진행했는데 중간 발표때 이 부분은 잘 했다고 피드백 받아서 기분이 좋았음 ☺️☺️ 하지만 끝으로 갈 수록 모바일용 페이지는 신경 쓸 부분이 많아서 힘들었다는 것... for 데스크탑 + 크롬 브라우저에서만 작업하던 나한테는 꽤나 도전적인 과제였다는 것...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 전에 애먹었던 배포는 백엔드 분들이 힘써줘서 쉽게 할 수 있었다! 특히 deploy 브랜치 올리자마자 자동으로 배포되는건 너무 편해서 기절할뻔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 나중으로 갈수록 잔버그가 조금씩 나와서 마음이 참 아팠다 흑흑 VM이 31일까지 살아있대서 이거는 계속해서 고쳐보는걸로 &lt;/p&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;1) 그때그때 메모 하자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저번에 느꼈던 문서화의 중요성이랑 결이 좀 비슷하지만...극강의 P로써 투두리스트 작성조차 귀찮아하는 나에게 이번 프로젝트에서 남은건 짧은 메모들과 가끔 올렸던 위키들뿐... 기록을 안했던건 고대로 머리에서 날아가버렸다   그래도 앞으로 포스팅할거 메모해놔서 그거는 좀 다행인듯 헤헤（⌒&lt;span&gt;▽&lt;/span&gt;⌒&lt;span&gt;)&lt;/span&gt;&lt;span&gt;ゞ&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-13 오후 6.26.10.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0NO4H/btrvKpQivL2/35d1cjZrJXVzOKkxIneGW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0NO4H/btrvKpQivL2/35d1cjZrJXVzOKkxIneGW0/img.png&quot; data-alt=&quot;2월 25일의 나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0NO4H/btrvKpQivL2/35d1cjZrJXVzOKkxIneGW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0NO4H%2FbtrvKpQivL2%2F35d1cjZrJXVzOKkxIneGW0%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;331&quot; height=&quot;289&quot; data-filename=&quot;스크린샷 2022-03-13 오후 6.26.10.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2월 25일의 나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-03-13 오후 6.27.19.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;206&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxx7l/btrvRyS9WWD/qPqBMBxDZnTnft44iz5a71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxx7l/btrvRyS9WWD/qPqBMBxDZnTnft44iz5a71/img.png&quot; data-alt=&quot;3월 11일의 나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxx7l/btrvRyS9WWD/qPqBMBxDZnTnft44iz5a71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwxx7l%2FbtrvRyS9WWD%2FqPqBMBxDZnTnft44iz5a71%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;353&quot; height=&quot;127&quot; data-filename=&quot;스크린샷 2022-03-13 오후 6.27.19.png&quot; data-origin-width=&quot;572&quot; data-origin-height=&quot;206&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;3월 11일의 나&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 기초의 중요성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코치님이 항상 강조하셨던 흰 도화지에 그린다고 생각하고 리액트 없이 순수 &lt;b&gt;html, css만 써서 UI 그려보기&lt;/b&gt;! 기초 지식이 탄탄하면 얼마나 도움이 되는지 까먹고 있던 나에게 큰 깨달음을 주셨다  &amp;zwj;♀️ 입사까지 한달 정도 남았는데 그 동안 html, css, javascript로 뭔가 만들어봐야겠다‼️&lt;i&gt;(&amp;lt;-선언적 프로그래밍)&amp;nbsp;&lt;/i&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;3) grid 조아&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;면접에서 무슨 태그 좋아하냐는 질문에 flex 정말 좋아합니다!!!^ㅇ^ 라고 당당히 말했던 나... grid 써봤냐는 추가 질문에 숙연해졌었는데...이번에 wishlist 페이지 구현하면서 써보게 되었다 그리고 신세계를 맛봄   진작 공부해서 써볼걸...옛날옛날 처음 웹 공부하면서 table로 이케저케 구현하려고 낑낑댔던걸 생각하니 참...많은 생각이 들었다...ㅎ 아모튼 그리드 태그 짱&lt;/p&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;/b&gt; &lt;b&gt;typescript를 배우고 싶어졌다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이것도 코치님이 정말정말 많이 강조하신것 중 하나ㅎㅅㅎ 사실 난 타입스크립트에 대해서 그렇게 큰 장점이 있나?싶어서 나중에 배워야지 하고 미뤄놓고만 있었는데 배워야겠다는 생각이...확실히 예비 오류를 줄일 수 있다는 점은 매력적인것 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 프로젝트에 대한 애정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거는 말이 좀 애매한데...애정을 갖고 프로젝트에 임하는 것, 어떻게 보면 서비스에 대한 책임감이라고 해야할까   그런 마음가짐을 가지는 것이 중요하다고 느꼈다. 이런것들이 모여서 더 좋은 사용자 경험, 더 탄탄한 서비스를 만들 수 있지 않을까... 써놓고보니 정말 당연한 얘기지만   아무튼 그렇기 때문에 앞으로도 회사에서 내가 맡을 부분에서 애정을 갖고 일해야지   라는 생각!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자괴감도 어려움도 많이 느꼈던 5주였다  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 정말 확실하게 말할 수 있는건 5주 전의 나보다는 심리적, 실력적으로 조금이나마 나아졌다는 점....~~!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아휴 증말 고생해따 이제 리팩토링하러 가자^-^&lt;/p&gt;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/148</guid>
      <comments>https://bsscl.tistory.com/148#entry148comment</comments>
      <pubDate>Sun, 13 Mar 2022 19:32:40 +0900</pubDate>
    </item>
    <item>
      <title>[error] the server responded with a status of 405 (Not Allowed)</title>
      <link>https://bsscl.tistory.com/147</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3PyJY/btrsaSUL6sW/zbUPTB4h8A62SFKzuTqfV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3PyJY/btrsaSUL6sW/zbUPTB4h8A62SFKzuTqfV0/img.png&quot; data-alt=&quot;the server responded with a status of 405 (Not Allowed)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3PyJY/btrsaSUL6sW/zbUPTB4h8A62SFKzuTqfV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3PyJY%2FbtrsaSUL6sW%2FzbUPTB4h8A62SFKzuTqfV0%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;1898&quot; height=&quot;100&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;the server responded with a status of 405 (Not Allowed)&lt;/figcaption&gt;
&lt;/figure&gt;
&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;팀프로젝트 배포를 마무리하면서 리액트에서&amp;nbsp;특정 페이지 접속시 405 에러가 발생했다 &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트엔드, 백엔드 모두 aws에서 배포 진행중이었고 각자 배포하는 방식이었음!&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;구글링 결과 문제의&lt;/span&gt; &lt;span&gt;원인&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;1. 프론트엔드와 백엔드의 api 메서드 방식이 서로 달라서 발생한다고 한다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;2. 정적페이지로 POST 요청을 했기 때문에 (&amp;lt;- 내가 해당했다)&lt;/span&gt;&lt;/b&gt;&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;내 경우에는 api 메서드를 서버 주소로 안하고&lt;span&gt;&amp;nbsp;프론트엔드 주소로&lt;/span&gt;&lt;span&gt; 호출해서 그런거였다&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-30 오후 10.51.15.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chTHcm/btrr2An0cGz/3tgBmESNBqcCIfPkEGYhEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chTHcm/btrr2An0cGz/3tgBmESNBqcCIfPkEGYhEk/img.png&quot; data-alt=&quot;머쓱한 웃음 ㅎ...ㅎ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chTHcm/btrr2An0cGz/3tgBmESNBqcCIfPkEGYhEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchTHcm%2Fbtrr2An0cGz%2F3tgBmESNBqcCIfPkEGYhEk%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;450&quot; height=&quot;110&quot; data-filename=&quot;스크린샷 2022-01-30 오후 10.51.15.png&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;152&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;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1643551199123&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Website endpoints - Amazon Simple Storage Service&quot; data-og-description=&quot;To request a specific object that is stored at the root level in the bucket, use the following URL structure. http://bucket-name.s3-website.Region.amazonaws.com/object-name For example, the following URL requests the photo.jpg object that is stored at the &quot; data-og-host=&quot;docs.aws.amazon.com&quot; data-og-source-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html&quot; data-og-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteEndpoints.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Website endpoints - Amazon Simple Storage Service&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;To request a specific object that is stored at the root level in the bucket, use the following URL structure. http://bucket-name.s3-website.Region.amazonaws.com/object-name For example, the following URL requests the photo.jpg object that is stored at the&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.aws.amazon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공식 문서에서도 나와있는 &lt;i&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f;&quot;&gt;Supports only GET and HEAD requests on objects ...&lt;/span&gt;&lt;/i&gt;&lt;span style=&quot;background-color: #ffffff; color: #16191f;&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;</description>
      <category>FE/React</category>
      <category>err</category>
      <category>react</category>
      <category>리액트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/147</guid>
      <comments>https://bsscl.tistory.com/147#entry147comment</comments>
      <pubDate>Sun, 30 Jan 2022 22:55:34 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 13-02-01 Numpy</title>
      <link>https://bsscl.tistory.com/145</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. Numpy란?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬에서 사용되는 과학 컴퓨팅용 라이브러리&lt;/li&gt;
&lt;li&gt;파이썬 언어에서 기본으로 지원하지 않는 &lt;b&gt;행렬&lt;/b&gt;과 같은 데이터 구조 지원 및 수학/과학 계산 함수 포함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;행렬이 왜 필요한가? -&amp;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;2. 행렬 만들기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-16 오후 5.04.45.png&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXJGE4/btrqNfkJzXs/pN1ciXzeyDKSNejZ7P8itk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXJGE4/btrqNfkJzXs/pN1ciXzeyDKSNejZ7P8itk/img.png&quot; data-alt=&quot;행렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXJGE4/btrqNfkJzXs/pN1ciXzeyDKSNejZ7P8itk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXJGE4%2FbtrqNfkJzXs%2FpN1ciXzeyDKSNejZ7P8itk%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;102&quot; height=&quot;78&quot; data-filename=&quot;스크린샷 2022-01-16 오후 5.04.45.png&quot; data-origin-width=&quot;212&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;행렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1642320436788&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import numpy as np

A = np.array([[1, 2], [3, 4]])

print(A)
// [[1 2]
//  [3 4]]&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이렇게 만들어진 행렬은 곱셈, 덧셈, 뺄셈이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1642320948741&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 곱셈
print(A * 3)
// [[3 6]
//  [9 12]]

// 덧셈
print(A + A)
// [[2 4]
//  [6 8]]

// 뺄셈
print(A - A)
// [[0 0]
//  [0 0]]

print(A ** 2)
// [[1 4]
//  [9 16]]

print(3 ** A)
// [[3 9]
//  [27 81]]

print(A * A)
// [[1 4]
//  [9 16]]&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;3. dot 함수&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;np.dot(x, y)는 x * y와 다르다 !&lt;br /&gt;2차원 * 2차원의 행렬곱으로 예시를 들어보자면 계산방법은&lt;br /&gt;해당 행의 1번째 숫자 * 해당 열의 1번째 숫자 + 해당 행의 2번째 숫자 * 해당 열의 2번째 숫자가 된다&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-16 오후 5.24.56.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;178&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bduleM/btrqMDsnHoF/BSDsxKARcCwIOZ0pcwUqKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bduleM/btrqMDsnHoF/BSDsxKARcCwIOZ0pcwUqKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bduleM/btrqMDsnHoF/BSDsxKARcCwIOZ0pcwUqKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbduleM%2FbtrqMDsnHoF%2FBSDsxKARcCwIOZ0pcwUqKk%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;322&quot; height=&quot;73&quot; data-filename=&quot;스크린샷 2022-01-16 오후 5.24.56.png&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;178&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1642321455524&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = np.array([[1, 2], [3, 4]])
y = np.array([[3, 4], [3, 2]])

print(np.dot(x, y))
// [[9 8]
//  [21 20]]

print(x * y)
// [[3 8]
//  [9 8]]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 비교 연산&lt;/p&gt;
&lt;pre id=&quot;code_1642322802775&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = np.array([1, 2, 3, 4])
b = np.array([4, 2, 2, 4])

print(a == b)
// [False, True, False, True]

print(a &amp;gt; b)
// [False, False, True, False]&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;5. 논리 연산&lt;/p&gt;
&lt;pre id=&quot;code_1642322976172&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = np.array([1, 1, 0, 0], dtype=bool)
b = np.array([1, 0, 1, 0], dtype=bool)

print(np.logical_or(a, b))
// [True, True, True, False]

print(np.logical_and(a, b))
// [True, False, False, False]&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;6. Reductions&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;argmin: 최소값의 인덱스를 반환&lt;/li&gt;
&lt;li&gt;argmax: 최대값의 인덱스를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1642323504082&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = np.array([1, 2, 3, 4, 5])

print(a.min())
// 1
print(a.max())
// 5

print(a.argmin())
// 0
print(a.argmax())
// 4&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. Logical Reductions&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;all: Array 내의 모든 값이 True인가?&lt;/li&gt;
&lt;li&gt;any: Array 내의 값이 하나라도 True인가?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1642323755470&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = np.array([True, True, True])
b = np.array([True, True, False])

np.all(a) //True
np.all(b) //False

np.any(a) //True
np.any(b) //True&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. Statistical Reductions&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;np.mean(x): 평균값&lt;/li&gt;
&lt;li&gt;np.median(x): 중간값&lt;/li&gt;
&lt;li&gt;np.std(x): 표준편차&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1642323895587&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x = np.array([1, 2, 3, 1])

print(np.mean(x)) // 1.75
print(np.median(x)) // 1.5
print(np.std(x)) // 0.82915619758884995&lt;/code&gt;&lt;/pre&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/145</guid>
      <comments>https://bsscl.tistory.com/145#entry145comment</comments>
      <pubDate>Sun, 16 Jan 2022 18:06:15 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 첫 팀 프로젝트 후기  </title>
      <link>https://bsscl.tistory.com/143</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-12 오전 1.16.05.png&quot; data-origin-width=&quot;2847&quot; data-origin-height=&quot;1488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/orNhs/btrqvVZSXAr/jd7XkfOWO9uIBanYTLAyEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/orNhs/btrqvVZSXAr/jd7XkfOWO9uIBanYTLAyEK/img.png&quot; data-alt=&quot;영화밭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/orNhs/btrqvVZSXAr/jd7XkfOWO9uIBanYTLAyEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2ForNhs%2FbtrqvVZSXAr%2Fjd7XkfOWO9uIBanYTLAyEK%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;778&quot; height=&quot;406&quot; data-filename=&quot;스크린샷 2022-01-12 오전 1.16.05.png&quot; data-origin-width=&quot;2847&quot; data-origin-height=&quot;1488&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;이제야 여유가 좀 생겨서 써보는 엘리스 3기의 두번째 프로젝트이자 첫&lt;b&gt; &quot;팀&quot;&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;총 3주에 걸쳐서 진행됐는데 마감일에 가까워질수록 하루가 36시간이였으면 하는 생각이 정말 절실하게 들었다...지이이인짜 바빴다...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지난 개인 프로젝트때도 마감하고나서&lt;i&gt; 아휴 나 정말 그래도 열심히 했다!ㅠㅡㅠ 이 이상으로는 정말 못하겠다!&lt;/i&gt; 싶은 마음이였는데...그렇다 난 그 이상도 할 수 있는 사람이었던 것이었다..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4sWgv/btrqvU0Zzgr/JjmFq12wb95tK7f7AtXnv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4sWgv/btrqvU0Zzgr/JjmFq12wb95tK7f7AtXnv1/img.png&quot; data-alt=&quot;실질적 코딩 기간은 2주+a 되는듯 하다(첫 커밋)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4sWgv/btrqvU0Zzgr/JjmFq12wb95tK7f7AtXnv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4sWgv%2FbtrqvU0Zzgr%2FJjmFq12wb95tK7f7AtXnv1%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;514&quot; height=&quot;385&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실질적 코딩 기간은 2주+a 되는듯 하다(첫 커밋)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무튼 나의 팀프로젝트 수행 과정을 되돌아보면서 느낀점을 적어보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 어느 부분이 부족한지 조금이나마 알게 되었다&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;주로 느낀 부분은 객체, 리액트의 생명주기, 그리고 hook이 실행되는 과정...이거는 다음 팀프로젝트 시작하기전에 어서 제대로 정리해놔야지 &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. (내가 느낀) 같이 일하고 싶은 동료의 특징&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;의견을 적극적으로 낸다&lt;/li&gt;
&lt;li&gt;정보나 코드를 넘길때 최대한 버그나 수정할 부분이 없게 준다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 두개를 왜 격하게 느꼈냐면...내가 정반대의 특징인 사람이었기 때문...^___^&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나랑 협업하신 분들은 나랑 일하는 과정이 즐거우셨을까? 물어본다면 난 자신이 없다 ㅋㅋㅋㅠㅠ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최대한 뇌에 힘주고 일해도 2n년을 얼레벌레 인간으로 살아온 사람...흑흑 죄송합니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8bKZ6/btrqvyRmJcb/g50Q0ehOD6n3FMJuQ7Bkx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8bKZ6/btrqvyRmJcb/g50Q0ehOD6n3FMJuQ7Bkx0/img.png&quot; data-alt=&quot;전 바보예요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8bKZ6/btrqvyRmJcb/g50Q0ehOD6n3FMJuQ7Bkx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8bKZ6%2FbtrqvyRmJcb%2Fg50Q0ehOD6n3FMJuQ7Bkx0%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;317&quot; height=&quot;317&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;871&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전 바보예요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 문서화를 하자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api 문서나 해야할 todo 기능을 쭉 정렬해 놓으면 한눈에 볼 수 있을것 같아서 좋을 것 같았다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;api 문서는 맨날 이거는 이건가요? 여쭤보기가 너무 죄송했다 다른 팀프로젝트를 하게 된다면 구글문서로 실시간 공유하면서 적어나가면 좋을 것 같다는 생각을 함!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;todo는 내가 얼만큼 했는지, 앞으로 얼만큼 남았는지 파악하기 쉬워져서 시간 관리 하기에 좋을것 같다...이번에는 시간 관리에 살짝 실패한 느낌이 없잖아 있기 때문에...&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-01-12 오전 4.32.11.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5kDwV/btrqpuCLHn9/fnkXWqXjKRHm3mqdB2AH30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5kDwV/btrqpuCLHn9/fnkXWqXjKRHm3mqdB2AH30/img.png&quot; data-alt=&quot;배포를 이제야 한 사람이 있다?!(0112 04:01)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5kDwV/btrqpuCLHn9/fnkXWqXjKRHm3mqdB2AH30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5kDwV%2FbtrqpuCLHn9%2FfnkXWqXjKRHm3mqdB2AH30%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;348&quot; height=&quot;96&quot; data-filename=&quot;스크린샷 2022-01-12 오전 4.32.11.png&quot; data-origin-width=&quot;522&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;배포를 이제야 한 사람이 있다?!(0112 04:01)&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;&lt;b&gt;4. 배포는 미리미리 시도해보자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엄청난 삽질끝에 겨우겨우 배포 성공하고 느낀 점...ㅎㅎ 엘리스에서 준 azure 도메인은 결국 실패해서 대신 aws로 어찌저찌 했는데 여기까지 오는데 엄청난 시간이 걸렸다ㅋㅋㅋㅋ다음 프로젝트는 미리 배포 연습 좀 해봐야겠다ㅠㅠ 그래도 배포 경험치 쌓여서 만족...좋은게 좋은거다...트러블 슈팅도 어서 정리하자아아아&lt;/p&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;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전까지는 콘솔창이나&amp;nbsp; elements탭, 그리고 가아아아끔 스토리지때문에 application 탭만 썼는데 이번에 코치님이랑 오류 고치다가 network탭의 신세계를 맛봤다... 그리고 elements 탭에서 flex 태그 있으면 해당 엘리먼트가 차지하는 공간 보여주는데 너무 좋았다...!! 물론 flex 태그도 이번에야 본격적으로 쓰게 된거지만  아무튼 더 잘 활용할 수 있게 된거같아서 좋았음!&lt;/p&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. 좋은 UI는 뭘까&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체적인 디자인을 맡으면서 이 부분에 대해서 고민할 기회가 생겼다 (물론 다른 기능 구현에 밀려서 많이는 못했지만  ) 좋은 UI...좋은 디자인...이 부분에 대해서도 많이 생각해봐야 할것 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;멋진 결과물, 그리고 첫 팀프로젝트가 좋은 기억으로 남을 수 있게 해준 13팀  팀원분들에게 너무 감사하다&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;IMG_3586.JPG&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byV4Yy/btrqujf54iu/JT0TrI4DKYIHpRZp0kbo9K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byV4Yy/btrqujf54iu/JT0TrI4DKYIHpRZp0kbo9K/img.jpg&quot; data-alt=&quot;라부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byV4Yy/btrqujf54iu/JT0TrI4DKYIHpRZp0kbo9K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyV4Yy%2Fbtrqujf54iu%2FJT0TrI4DKYIHpRZp0kbo9K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;576&quot; data-filename=&quot;IMG_3586.JPG&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;1500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;라부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/143</guid>
      <comments>https://bsscl.tistory.com/143#entry143comment</comments>
      <pubDate>Wed, 12 Jan 2022 04:57:27 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 로또의 최고 순위와 최저 순위 - Javascript, python</title>
      <link>https://bsscl.tistory.com/77</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;programmers.co.kr/learn/courses/30/lessons/77484&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1620370453801&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 로또의 최고 순위와 최저 순위&quot; data-og-description=&quot;로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484#&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dqlGHh/hyJ76NQPgD/HXfGxeoHbmcdy1jTLW1uwk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/sfTbK/hyJ6GwvW7i/irPv2TXMIdkXvIFobFDvHK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/77484#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dqlGHh/hyJ76NQPgD/HXfGxeoHbmcdy1jTLW1uwk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/sfTbK/hyJ6GwvW7i/irPv2TXMIdkXvIFobFDvHK/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코딩테스트 연습 - 로또의 최고 순위와 최저 순위&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다. 1 순위 당첨 내용 1 6개 번호가 모두 일치 2 5개 번호&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로또 6/45(이하 '로또'로 표기)는 1부터 45까지의 숫자 중 6개를 찍어서 맞히는 대표적인 복권입니다. 아래는 로또의 순위를 정하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순위당첨 내용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;6개 번호가 모두 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5개 번호가 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;4개 번호가 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3개 번호가 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;2개 번호가 일치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6(낙첨)&lt;/td&gt;
&lt;td&gt;그 외&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로또를 구매한 민우는 당첨 번호 발표일을 학수고대하고 있었습니다. 하지만, 민우의 동생이 로또에 낙서를 하여, 일부 번호를 알아볼 수 없게 되었습니다. 당첨 번호 발표 후, 민우는 자신이 구매했던 로또로 당첨이 가능했던 최고 순위와 최저 순위를 알아보고 싶어 졌습니다.&lt;br /&gt;알아볼 수 없는 번호를&lt;span&gt;&amp;nbsp;&lt;/span&gt;0으로 표기하기로 하고, 민우가 구매한 로또 번호 6개가&lt;span&gt;&amp;nbsp;&lt;/span&gt;44, 1, 0, 0, 31 25라고 가정해보겠습니다. 당첨 번호 6개가&lt;span&gt;&amp;nbsp;&lt;/span&gt;31, 10, 45, 1, 6, 19라면, 당첨 가능한 최고 순위와 최저 순위의 한 예는 아래와 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;당첨 번호&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;31&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;10&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;45&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;19&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;결과&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;최고 순위 번호&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;u&gt;&lt;b&gt;31&lt;/b&gt;&lt;/u&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&amp;rarr;&lt;u&gt;&lt;b&gt;10&lt;/b&gt;&lt;/u&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;44&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;u&gt;&lt;b&gt;1&lt;/b&gt;&lt;/u&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&amp;rarr;&lt;u&gt;&lt;b&gt;6&lt;/b&gt;&lt;/u&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;25&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;4개 번호 일치, 3등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;최저 순위 번호&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;u&gt;&lt;b&gt;31&lt;/b&gt;&lt;/u&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&amp;rarr;11&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;44&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;u&gt;&lt;b&gt;1&lt;/b&gt;&lt;/u&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;0&amp;rarr;7&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;25&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;2개 번호 일치, 5등&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;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;알아볼 수 없는 두 개의 번호를 각각 10, 6이라고 가정하면 3등에 당첨될 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;3등을 만드는 다른 방법들도 존재합니다. 하지만, 2등 이상으로 만드는 것은 불가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;알아볼 수 없는 두 개의 번호를 각각 11, 7이라고 가정하면 5등에 당첨될 수 있습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5등을 만드는 다른 방법들도 존재합니다. 하지만, 6등(낙첨)으로 만드는 것은 불가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;민우가 구매한 로또 번호를 담은 배열 lottos, 당첨 번호를 담은 배열 win_nums가 매개변수로 주어집니다. 이때, 당첨 가능한 최고 순위와 최저 순위를 차례대로 배열에 담아서 return 하도록 solution 함수를 완성해주세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;lottos는 길이 6인 정수 배열입니다.&lt;/li&gt;
&lt;li&gt;lottos의 모든 원소는 0 이상 45 이하인 정수입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;0은 알아볼 수 없는 숫자를 의미합니다.&lt;/li&gt;
&lt;li&gt;0을 제외한 다른 숫자들은 lottos에 2개 이상 담겨있지 않습니다.&lt;/li&gt;
&lt;li&gt;lottos의 원소들은 정렬되어 있지 않을 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;win_nums은 길이 6인 정수 배열입니다.&lt;/li&gt;
&lt;li&gt;win_nums의 모든 원소는 1 이상 45 이하인 정수입니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;win_nums에는 같은 숫자가 2개 이상 담겨있지 않습니다.&lt;/li&gt;
&lt;li&gt;win_nums의 원소들은 정렬되어 있지 않을 수도 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;풀이 방법 (JS)&lt;br /&gt;&lt;/b&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;(1) lottos와 win_nums의 교집합 defScore를 구한다 (최소 당첨 확정인 숫자 집합)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) result = [가장 좋은 등수, 가장 안 좋은 등수]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) 가장 안좋은 등수의 경우(ㅇ이 하나도 당첨 안됨)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;defScore가 2보다 많을 경우 7-defScore.length로 해당 등수를 구하고, 반대의 경우(당첨 숫자가 1개 이하) 6등 확정...!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(4) 가장 좋은 등수의 경우(ㅇ이 모두 당첨 숫자)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lottos를 오름차순으로 정렬하면 0이 마지막으로 있는 인덱스+1가 ㅇ의 개수가 된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 ㅇ이 하나도 없다면 return값은 -1이니까 false 조건으로 넘어감 =&amp;gt; 가장 안좋은 등수 = 가장 좋은 등수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ㅇ이 한개라도 있다면 7-(당첨 확정인 숫자+마지막 인덱스 숫자+1)로 등수를 구할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 보기 좋으라고 6-(당첨 확정인 숫자+마지막 인덱스 숫자)로 정리했다ㅎ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 코드&lt;/p&gt;
&lt;pre id=&quot;code_1620370769761&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//0507
function solution(lottos, win_nums) {
    let defScore = (lottos.filter(item =&amp;gt; win_nums.includes(item))); //당첨 확정
    let result = [&quot;&quot;, &quot;&quot;]; //결과 저장
    //최악
    result[1] = (defScore.length &amp;gt;= 2) ? (7-defScore.length) : 6;
    //최선
    result[0] = (lottos.sort().lastIndexOf(0) &amp;gt;= 0) ? (6-(defScore.length+lottos.sort().lastIndexOf(0))) : result[1];
    return result;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 구구절절 코드인건 변하지 않아... &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;pre id=&quot;code_1638892543173&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//211208
function set_award(n) {
  switch (n) {
    case 6:
      return 1;
    case 5:
      return 2;
    case 4:
      return 3;
    case 3:
      return 4;
    case 2:
      return 5;
    default:
      return 6;
  }
}
function solution(l, w) {
  //매개변수 l에서의 0 개수
  let num_zero = l.filter((item) =&amp;gt; item == 0).length;

  // l과 w 병합 (정렬 및 중복제거)
  let result = [...l, ...w].sort();
  let filtered_result = result.filter(
    (item, idx) =&amp;gt; item &amp;gt; 0 &amp;amp;&amp;amp; result.indexOf(item) === idx
  );
  //당첨된 숫자 개수 = l+w의 길이 - 중복제거된 l+w 길이 - 0의 개수
  let num_win = result.length - filtered_result.length - num_zero;
  return [set_award(num_win + num_zero), set_award(num_win)];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;include 함수가 시간 많이 걸리게 할거 같아서 최대한 빠른 방법이 뭘까 + 가독성이 좋은 코드가 뭘까 고민하면서 풀어본 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정작 시간면에선 별 차이도 없었다... &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 코드&lt;/p&gt;
&lt;pre id=&quot;code_1638894527091&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(lottos, win_nums):
    zero = lottos.count(0)
    cnt = 7
    for i in lottos:
        if i in win_nums:
            cnt-=1
    answer = [cnt-zero, cnt]
    return [6 if value==7 else value for value in answer]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 풀이 방법들 보니까 아예 rank 리스트를 만들어 놓고 풀었다...확실히 그게 더 깔끔하고 보기 좋은거 같다 나도 나중에 그렇게 해봐야지✏️&lt;/p&gt;</description>
      <category>PS:0</category>
      <category>JavaScript</category>
      <category>JS</category>
      <category>LV1</category>
      <category>Python</category>
      <category>문제풀이</category>
      <category>자바스크립트</category>
      <category>프로그래머스</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/77</guid>
      <comments>https://bsscl.tistory.com/77#entry77comment</comments>
      <pubDate>Wed, 8 Dec 2021 00:58:01 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 첫 개인 프로젝트 후기 ⭐️</title>
      <link>https://bsscl.tistory.com/139</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-12-02 오후 12.37.53.png&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;1298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/elndp0/btrmJE9RgQo/ZJohVQFMqStbxJXSWHom8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/elndp0/btrmJE9RgQo/ZJohVQFMqStbxJXSWHom8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/elndp0/btrmJE9RgQo/ZJohVQFMqStbxJXSWHom8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Felndp0%2FbtrmJE9RgQo%2FZJohVQFMqStbxJXSWHom8K%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;538&quot; height=&quot;543&quot; data-filename=&quot;스크린샷 2021-12-02 오후 12.37.53.png&quot; data-origin-width=&quot;1284&quot; data-origin-height=&quot;1298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;더 이상 미루면 영영 못 쓸거같기 때문에 호다닥 쓰는 첫 개인플젝 후기ㅎㅅㅎ&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;3기 첫 개인프로젝트 발표가 이번주 일요일에 끝났다 시간이 넘모 빠른것,,,!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번엔 프론트엔드:&lt;b&gt; 직업심리검사 서비스&lt;/b&gt; / 백엔드: 도서관 대출 서비스로 진행됐다 신청은 선착순 마감!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;나는 백엔드를 살짝 많이 놓은 상태여서...^^ 백엔드로 밀려나면 진짜 난 끝이다 싶어서 3시 땡 하자마자 신청했다(약간 수강신청 느낌이 나서 대학생 된 기분이였음&lt;span style=&quot;background-color: #ffffff; color: #666666;&quot;&gt;&amp;nbsp;்́ꇴ ்̀&lt;/span&gt; )&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;근데 나중에 알고보니 백엔드가 먼저 마감됐다고 한다 ㅎㅎ 의외였다 다들 프론트를 선호하지 않으셨던건가 &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아모튼 이번 프로젝트를 진행하면서 내가 제일 기대했던게 1. 오피스아워 2. 코드리뷰 였는데 나는 활용을 잘 못했다...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이게 좀 아쉬운 부분 &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;오피스아워에서 모르는 부분을 질문하려고 타닥...타닥...질문글 열심히 쓰다보면 '아 이런 방법으로 이렇게 저렇게 해보면 괜찮지 않을까?' 싶어서 혼자 구글링 ➡️ 대강 깨닫고 혼자 코딩...의 반복이여서 질문글을 잘 안올리게 됐다ㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 다른 분들 글 보면서 호엥...이럴수도 있군 이건 왜 그러지 이러면서 생각의 폭이 좀 넓어진 부분은 있는 듯하다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;총 2주간 진행되었고 나는 재밌다고 느낌 -&amp;gt; &lt;b&gt;계속 붙들고 있음&lt;/b&gt; / 하...왜 그러냐... -&amp;gt; &lt;b&gt;(뭔가 먹으면서)&lt;/b&gt; &lt;b&gt;계속 붙들고 있음&lt;/b&gt;의 반복이여서 기본+선택기능은 전부 구현했다 단지 시간의 효율성이 좀 떨어지지 않았나하는 아쉬움...투입된 시간 대비 로직이나 디자인이 좀 아쉽지 않나 하는 개인적인 늑김...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;좋았던 점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt; 기획부터 배포까지 내 손으로&lt;/b&gt; 했기에 무언가 완성했다는 느낌이 들어서 좋았다!&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내 힘으로 끝을 내는 프론트 중점 프로젝트는 사실상 이번이 처음이었기 때문에 + 좋은 퀄리티로 제출을 하고 싶어서 열심히 했던 부분이 빠르게 경험치를 쌓는데도 도움이 됐던거 같다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;메이플 마을퀘스트 하나하나 깨는 것보다 사냥터가서 뺑뺑이 돌리는게 더 빨리 레벨업 할 수 있는거랑 비슷한걸까...?&lt;/s&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2.&amp;nbsp;&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;리액트 hook 사용법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hook이 어떤 상황에서 어떤 용도로 쓰이는지 아직 잘 몰라서 useState와 useEffect만 주로 쓰게 되었다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;css 및 관련 라이브러리 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CSS 라이브러리 유목민이 바로 저였습니다...라이브러리를 3번 바꿨더니 정말 시간이 아까웠다ㅜㅡㅜ&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;재사용성 높은 컴포넌트 짜는 법&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번에 컴포넌트를 구성하면서 어떤 기준으로 컴포넌트를 짜야하는지 참 헷갈렸다...다음번엔 여러번 쓸 수 있는거에 집중하면서 만들어보고 싶다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;아쉬웠던 점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt;&lt;span&gt; UI+ UX / 접근성을 잘 살리지 못했다&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;내가 생각해도 이번 프로젝트에서는 내가 관심있는 부분인 접근성을 별로 못살렸다...이게 참 속상했음 &lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 모바일 페이지에선 버튼이 작아지는 등등 좋은 UI는 아니였다 흑흑 이 부분은 책을 좀 더 읽거나 관련 자료를 공부해야 할듯싶다&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 건강 챙기기&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 나는 마지막 일주일만 새벽 5시 - 오후 1시라는 기이한 수면 패턴이 생겼는데 참 피곤했다ㅠㅠ 같은 시간을 자도 밤낮이 바뀌면 뭔가 계속 피로가 쌓이는 듯 하다 나중에 회사 저녁 7시에 출근할거 아니니까 이 부분도 천천히 고쳐야지 그리고 하루종일 앉아있고 식습관 + 수면패턴도 불규칙하니까 소화불량과 약간의 위염 증상이 생겼다ㅜㅇㅜ 이번 프로젝트를 통해서 새삼 건강의 소중함을 느끼게 됨...&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래도 2주동안 &lt;i&gt;이게 몰입이건가,,,! &lt;/i&gt;라는 기분을 느낄 수 있어서 참 좋았다 ㅎㅎ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 그럭저럭 무사히 끝낸 이 영광을 우리집 얼룩고양이와 못 놀아줘서 힝구했던 갱얼쥐에게 돌립니다~ &lt;/p&gt;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/139</guid>
      <comments>https://bsscl.tistory.com/139#entry139comment</comments>
      <pubDate>Tue, 30 Nov 2021 22:37:31 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 07-04 Flask 기초 2</title>
      <link>https://bsscl.tistory.com/138</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 데이터베이스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 저장하는 공간&lt;/li&gt;
&lt;li&gt;관계형 데이터베이스(RDB)와 NoSQL(Not Only SQL)로 나뉘어져 있음&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;관계형 데이터베이스(RDB)&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;키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 데이터베이스&lt;/li&gt;
&lt;li&gt;DML을 사용해서 데이터 간 결합, 제약조건 등의 설정을 통해 데이터를 추출할 수 있음&lt;/li&gt;
&lt;li&gt;테이블 간의 데이터 관계를 설정할 수 있음&lt;/li&gt;
&lt;li&gt;각 컬럼마다 데이터의 형태가 동일, 정형화된 데이터를 가짐&lt;/li&gt;
&lt;li&gt;SQL 질의어(쿼리)를 사용&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-11-10 오후 10.48.00.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0BAR4/btrkweqTb0U/KYmOyC59I5Bnw3Rcm58xr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0BAR4/btrkweqTb0U/KYmOyC59I5Bnw3Rcm58xr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0BAR4/btrkweqTb0U/KYmOyC59I5Bnw3Rcm58xr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0BAR4%2FbtrkweqTb0U%2FKYmOyC59I5Bnw3Rcm58xr1%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;1192&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2021-11-10 오후 10.48.00.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;size18&quot;&gt;&lt;b&gt;2. Flask와 DB 연동하기&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;순서&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1) SQL import 하기&lt;br /&gt;2) 데이터베이스 연결하기&amp;nbsp;con&amp;nbsp;=&amp;nbsp;sqlite3.connect(&quot;database.db&quot;)&lt;br /&gt;3) 데이터를 불러올 수 있는 cursor 객체 만들기&amp;nbsp;cur&amp;nbsp;=&amp;nbsp;con.cursor()&lt;br /&gt;4) 실행할 쿼리 작성하기&amp;nbsp;&amp;nbsp;cur.execute(f&quot;SELECT&amp;nbsp;*&amp;nbsp;FROM&amp;nbsp;Board&amp;nbsp;WHERE&amp;nbsp;name='{result}'&amp;nbsp;or&amp;nbsp;context='{result}'&quot;)&lt;br /&gt;5) fetch all 함수 실행(레코드를 배열 형식으로 저장)&amp;nbsp; rows = cur.fetchall()&lt;br /&gt;6) 데이터베이스 연결 해제&amp;nbsp;&amp;nbsp;con.close()&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636561737867&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;con = sqlite3.connect('database.db')
con.execute('쿼리문')
con.commit() #DB에 반영
con.close()

# 또는

with sqlite3.connect(&quot;database.db&quot;) as con:
   con.execute(&quot;쿼리문&quot;)
   con.commit()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. JWT(JSON Web Token)&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;웹 표준으로써 두 개체에서 JSON 객체를 사용하여 통신&lt;/li&gt;
&lt;li&gt;JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Web Token&lt;/li&gt;
&lt;li&gt;토큰 자체를 정보로 사용하는 Self-Contained 방식으로 정보를 안정적으로 전달&lt;/li&gt;
&lt;li&gt;서버와 클라이언트 간의 인증을 도와주는 도구 중 하나&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;JWT의 형태&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;Header: 토큰의 타입과 알고리즘 저장&lt;/li&gt;
&lt;li&gt;Payload: 토큰에서 사용할 정보(클레임, Claim)를 넣음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토큰 발급자, 토큰 제목, 대상자, exp(만료 시간), iat(발급된 시간), jti(고유 식별자, 토큰의 중복성 방지) 등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Signature: 헤더의 정보와 인코딩 값들과 관련된 비밀키가 들어 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhC6BG/btrkukS21JN/kHdHtAvKUUUlNJyjAvO3Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhC6BG/btrkukS21JN/kHdHtAvKUUUlNJyjAvO3Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhC6BG/btrkukS21JN/kHdHtAvKUUUlNJyjAvO3Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhC6BG%2FbtrkukS21JN%2FkHdHtAvKUUUlNJyjAvO3Ak%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;1898&quot; height=&quot;405&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;1898&quot; data-origin-height=&quot;405&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON 형태인 각 부분은 Base64로 인코딩되어 표현됨&lt;/li&gt;
&lt;li&gt;각각의 부분을 이어주기 위해 . 구분자 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636564953534&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import jwt # PyJWT 모듈 import

data_to_encode = {&quot;name&quot;: &quot;elice&quot;} # jwt로 암호화 할 데이터
encryption_secret = &quot;secrete&quot; # jwt 모듈이 사용되는 곳을 특정하기 위해 비밀키를 넣어줌
algorithm = &quot;HS256&quot; # 암호화 알고리즘

encoded = jwt.encode(data_to_encode, encryption_secret, algorithm=algorithm)
decoded = jwt.decode(encoded, encryption_secret, algorithm=[algorithm])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. ORM(Object Relational Mapping, 객체 관계 매핑)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터베이스에 객체를 통해 접근하는 방법&lt;/li&gt;
&lt;li&gt;SQL 쿼리가 없어도 데이터베이스를 다룰 수 있도록 해줌&lt;/li&gt;
&lt;li&gt;테이블 구조가 변경될 때 ORM 모델만 수정하면 됨&lt;/li&gt;
&lt;li&gt;코드로 작성하기 때문에 쿼리를 직관적으로 이해 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-11-11 오전 2.39.19.png&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b64YQp/btrkupG16k3/mcFxbJ0sIKTAhVJD7WgacK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b64YQp/btrkupG16k3/mcFxbJ0sIKTAhVJD7WgacK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b64YQp/btrkupG16k3/mcFxbJ0sIKTAhVJD7WgacK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb64YQp%2FbtrkupG16k3%2FmcFxbJ0sIKTAhVJD7WgacK%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;431&quot; height=&quot;232&quot; data-filename=&quot;스크린샷 2021-11-11 오전 2.39.19.png&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1636566064141&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# SQL 쿼리문
INSERT INTO 엘리스 (멤버, 나이) VALUES ('여왕', '18');&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1636566026016&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# ORM

class Members(db.Model): #db.Model은 SQLAlchemy 패키지 안에 들어가 있음 
	__tablename__ = 'my_user' # 데이터베이스 테이블을 명시
    # 데이터베이스 테이블의 컬럼을 명시, `어떤 형태의 데이터를 저장할 것인가`
    id = db.Column(db.Integer, primary_key=True, nullable=False)
    name = db.Column(db.String(20), nullable=False)
    age = db.Column(db.Integer, nullable=False)
    
member1 = Member() # DB의 테이블과 매핑되는 클래스를 모델이라고 함
member1.name = '여왕'
member1.age = '18'
# 또는 아래와 같이 한줄로 작성할 수 있음
member1 = Member(name='여왕', age='18')

db.session.add(member1)
db.session.commit()&lt;/code&gt;&lt;/pre&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;스크린샷 2021-11-11 오전 10.26.37.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpx8dR/btrkr35LqCz/59Zs32YuKfk36mr4KZXC60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpx8dR/btrkr35LqCz/59Zs32YuKfk36mr4KZXC60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpx8dR/btrkr35LqCz/59Zs32YuKfk36mr4KZXC60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpx8dR%2Fbtrkr35LqCz%2F59Zs32YuKfk36mr4KZXC60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1142&quot; height=&quot;334&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.26.37.png&quot; data-origin-width=&quot;1142&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;db.session.query(Members)와 Members.query는 같은 의미(전자가 더 명시적)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5. SQL Alchemy&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;ORM을 쓸 수 있도록 도와주는 파이썬 라이브러리&lt;/li&gt;
&lt;li&gt;파이썬 코드에서 Database와 연결하기 위해 사용할 수 있는 라이브러리&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;Query - CRUD 예제&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;db.session.commit: 데이터베이스에 수정사항을 반영할 것&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;1) Create&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.31.43.png&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnjbK1/btrkqsEhyP4/iiYQ7H6Xom5HUF7eJlvLO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnjbK1/btrkqsEhyP4/iiYQ7H6Xom5HUF7eJlvLO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnjbK1/btrkqsEhyP4/iiYQ7H6Xom5HUF7eJlvLO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnjbK1%2FbtrkqsEhyP4%2FiiYQ7H6Xom5HUF7eJlvLO0%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;1181&quot; height=&quot;218&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.31.43.png&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;db.session.&lt;b&gt;add&lt;/b&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;2) Read&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.35.32.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VrgDA/btrktbWJBsO/dm8bcKkz0esOIZfCbLk1n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VrgDA/btrktbWJBsO/dm8bcKkz0esOIZfCbLk1n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VrgDA/btrktbWJBsO/dm8bcKkz0esOIZfCbLk1n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVrgDA%2FbtrktbWJBsO%2Fdm8bcKkz0esOIZfCbLk1n1%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;612&quot; height=&quot;112&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.35.32.png&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Members 모델의 쿼리를 사용할 것&lt;/li&gt;
&lt;li&gt;all()을 붙이면 list 형태로 데이터가 반환됨, 한개여도 리스트&lt;/li&gt;
&lt;li&gt;first() 제일 처음거 하나, 반환되는 객체는 Model(class)&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;3) Update&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.40.30.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7syC9/btrkvI6OYau/v4WLXBNuUVO33sp6Xm8KaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7syC9/btrkvI6OYau/v4WLXBNuUVO33sp6Xm8KaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7syC9/btrkvI6OYau/v4WLXBNuUVO33sp6Xm8KaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7syC9%2FbtrkvI6OYau%2Fv4WLXBNuUVO33sp6Xm8KaK%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;1070&quot; height=&quot;193&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.40.30.png&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당하는 데이터를 먼저 가져온(Read) 뒤 수정함&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;4) Delete&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.45.35.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctA13G/btrkvIMSCFc/glVjoRspKss5mGVvPE7dl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctA13G/btrkvIMSCFc/glVjoRspKss5mGVvPE7dl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctA13G/btrkvIMSCFc/glVjoRspKss5mGVvPE7dl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctA13G%2FbtrkvIMSCFc%2FglVjoRspKss5mGVvPE7dl1%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;1092&quot; height=&quot;207&quot; data-filename=&quot;스크린샷 2021-11-11 오전 10.45.35.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당하는 데이터를 먼저 가져온(Read) 뒤 삭제함&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;Query 사용법 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) equal&lt;/p&gt;
&lt;pre id=&quot;code_1636595430151&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(Member.name == 'Elice')
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) not equal&lt;/p&gt;
&lt;pre id=&quot;code_1636595441406&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(Member.name != 'Elice')
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) like&lt;/p&gt;
&lt;pre id=&quot;code_1636595481678&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(Member.name.like('%Elice%'))
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) in&lt;/p&gt;
&lt;pre id=&quot;code_1636595543977&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(Member.name.in_(['Elice', 'Dodo']))
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) not in&lt;/p&gt;
&lt;pre id=&quot;code_1636595567608&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(~Member.name.in_(['Elice', 'Dodo']))
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) is null&lt;/p&gt;
&lt;pre id=&quot;code_1636595632022&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(Member.name == None)
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Null을 None으로 표현&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7) is not null&lt;/p&gt;
&lt;pre id=&quot;code_1636595697318&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.filter(Member.name != None)
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8)and&lt;/p&gt;
&lt;pre id=&quot;code_1636595761370&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sqlalchemy import and_
@app.route('/')
def list():
	member_list = Member.query.filter(and_(Member.name == 'Elice',
    								Member.age == '15'))
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;db.session.query(Member).filter(A, B, C) 도 가능한 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9)or&lt;/p&gt;
&lt;pre id=&quot;code_1636595853151&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from sqlalchemy import or_
@app.route('/')
def list():
	member_list = Member.query.filter(or_(Member.name == 'Elice',
    								Member.age == '15'))
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10)order by&lt;/p&gt;
&lt;pre id=&quot;code_1636595966896&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.order_by(Member.age.desc())
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;11) limit&lt;/p&gt;
&lt;pre id=&quot;code_1636596076029&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list(limit_num = 5):
	if limit_num is None:
    	limit_num = 5
    # ⭐️괄호에 있는 숫자만큼만 반환⭐️
	member_list = Member.query.order_by(Member.age.desc()).limit(limit_num)
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12) offset&lt;/p&gt;
&lt;pre id=&quot;code_1636596216485&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list(off_set = 5):
	if off_set is None:
    		off_set = 5
    # offset 크기만큼 앞에서부터 생력하고 반환
	member_list = Member.query.order_by(Member.age.desc()).off_set(off_set)
    return &quot; &quot;.join(i.name for i in member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;13) count&lt;/p&gt;
&lt;pre id=&quot;code_1636596556062&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/')
def list():
	member_list = Member.query.order_by(Member.age.desc()).count()
    return str(member_list)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿼리문 실행결과로 반환된 tuple 수를 반환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6. REST API&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;REST: 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원(resource)의 표현(representation)에 의한 상태 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;REST의 구성&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;자원: URI에 표현이 되어야 함 ➡️&lt;b&gt; 무엇을 서버에 요청&lt;/b&gt;할 것인지&lt;/li&gt;
&lt;li&gt;행위: HTTP Method ➡️ &lt;b&gt;어떻게(어떤 방법을) 요청&lt;/b&gt;할 것인지&lt;/li&gt;
&lt;li&gt;표현: Representations ➡️ &lt;b&gt;API만 보고 무엇을 요청할 것인지 알 수 있도록&lt;/b&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;* URL과 URI의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL: http://nyamnyamexample.com/index.html&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URI: http://nyamnyamexample.com/index&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL은 실제로 서버 폴더 내에 파일이 있지만 URI는 그렇지 않음(실제로 파일 존재 X)&lt;/p&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;REST API 디자인 가이드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) URI는 자원을 표현해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 자원에 대한 행위는 HTTP Method로 나타내야 함(HTTP Method는 Rest API에서 동작을 표현하는 방법)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET: 리소스를 조회&lt;/li&gt;
&lt;li&gt;POST: 요청된 리소스를 생성&lt;/li&gt;
&lt;li&gt;PUT: 리소스를 업데이트&lt;/li&gt;
&lt;li&gt;DELETE: 리소스를 삭제&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;REST API 디자인 예시&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GET/members/insert/10 보다는 POST/members/10&amp;nbsp;&lt;/li&gt;
&lt;li&gt;GET/members/delete/1 보다는 DELETE/members/1 등등&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;슬래시(/)는 계층 관계를 나타냄
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://elice.example.co.kr/lecture/python&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;파일 확장자는 URI에 포함하지 않음&lt;/li&gt;
&lt;li&gt;긴 URI에서는 밑줄(_)보다는 하이픈(-)을 사용
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http://elice.example.co.kr/board/free-talk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP 응답 상태(HTTP status) 코드&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 140px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;상태 코드&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;내용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;200&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;정상적으로 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;201&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;성공적으로 리소스 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;400&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;클라이언트의 요청이 부적절할 때&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;401&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;인증되지 않은 상태에서 리소스 요청&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;404&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;응답하고 싶지 않은 리소스, 혹은 없는 리소스를 요청&lt;br /&gt;ex) Page Not Found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;500&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;서버에 문제가 생겼을 때&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/138</guid>
      <comments>https://bsscl.tistory.com/138#entry138comment</comments>
      <pubDate>Thu, 11 Nov 2021 23:02:04 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 06-04 SQL 2</title>
      <link>https://bsscl.tistory.com/136</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 데이터 그룹 짓기 - GROUP BY&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636466971052&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT user_id, COUNT(*)
FROM rental
GROUP BY user_id; # 그룹의 기준 컬럼&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보통 limit, order by, group by가 SQL문의 맨 끝에 옴&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 데이터 그룹(GROUP BY절)에 조건 적용하기 - HAVING&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636467403694&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# rental 테이블에서 user_id가 같은 2개 이상의 데이터가 몇 개 있는지 검색

SELECT user_id, COUNT(*) # GROUP BY의 기준 컬럼 및 검색할 컬럼
FROM rental
GROUP BY user_id # 그룹의 기준 컬럼
HAVING COUNT(user_id) &amp;gt; 1; # 조건&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 여러 테이블의 정보를 한번에 조회하기 - JOIN&lt;/b&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-origin-width=&quot;1926&quot; data-origin-height=&quot;660&quot; data-filename=&quot;스크린샷 2021-11-09 오후 11.21.38.png&quot; width=&quot;668&quot; height=&quot;229&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwDnT3/btrkpPrikcP/tPmD24mvdT6Xy0fkrfeKl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwDnT3/btrkpPrikcP/tPmD24mvdT6Xy0fkrfeKl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwDnT3/btrkpPrikcP/tPmD24mvdT6Xy0fkrfeKl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwDnT3%2FbtrkpPrikcP%2FtPmD24mvdT6Xy0fkrfeKl1%2Fimg.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;660&quot; data-filename=&quot;스크린샷 2021-11-09 오후 11.21.38.png&quot; width=&quot;668&quot; height=&quot;229&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) INNER JOIN문의 기본 문법&lt;/p&gt;
&lt;pre id=&quot;code_1636467803794&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM rental
INNER JOIN user; # 연결할 테이블, rental table + user table&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;2) JOIN에 조건을 적용하고 싶다면?&lt;/p&gt;
&lt;pre id=&quot;code_1636468050074&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM rental
INNER JOIN user
ON user.id = rental.user_id
# user table의 id 컬럼과 rental 테이블의 user_id 컬럼이 같다면 연결&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;3) LEFT JOIN의 기본 문법&lt;/p&gt;
&lt;pre id=&quot;code_1636468425903&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM user # 두 테이블 중 더 중요한 쪽
LEFT JOIN rental
ON user.id = rental.user_id
# user 테이블은 모두 출력됨
# 모든 user 테이블의 user_id와 rental 테이블의 id가 겹치도록 JOIN&lt;/code&gt;&lt;/pre&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-origin-width=&quot;2258&quot; data-origin-height=&quot;954&quot; data-filename=&quot;스크린샷 2021-11-09 오후 11.37.30.png&quot; width=&quot;701&quot; height=&quot;296&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3BOj/btrkjXknULp/FJshrSk58nue97guYmSgN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3BOj/btrkjXknULp/FJshrSk58nue97guYmSgN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3BOj/btrkjXknULp/FJshrSk58nue97guYmSgN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3BOj%2FbtrkjXknULp%2FFJshrSk58nue97guYmSgN1%2Fimg.png&quot; data-origin-width=&quot;2258&quot; data-origin-height=&quot;954&quot; data-filename=&quot;스크린샷 2021-11-09 오후 11.37.30.png&quot; width=&quot;701&quot; height=&quot;296&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) RIGHT JOIN문의 기본 문법&lt;/p&gt;
&lt;pre id=&quot;code_1636468777257&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT *
FROM user
RIGHT JOIN rental # 두 테이블 중 더 중요한 쪽
ON user.id = rental.user_id&lt;/code&gt;&lt;/pre&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-origin-width=&quot;2270&quot; data-origin-height=&quot;958&quot; data-filename=&quot;스크린샷 2021-11-09 오후 11.40.17.png&quot; width=&quot;685&quot; height=&quot;289&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AZRBr/btrkoaJGQvH/FohMK1MeP6qs7QwvLqMdHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AZRBr/btrkoaJGQvH/FohMK1MeP6qs7QwvLqMdHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AZRBr/btrkoaJGQvH/FohMK1MeP6qs7QwvLqMdHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAZRBr%2FbtrkoaJGQvH%2FFohMK1MeP6qs7QwvLqMdHK%2Fimg.png&quot; data-origin-width=&quot;2270&quot; data-origin-height=&quot;958&quot; data-filename=&quot;스크린샷 2021-11-09 오후 11.40.17.png&quot; width=&quot;685&quot; height=&quot;289&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 서브쿼리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 쿼리 안에 포함된 또 하나의 쿼리&lt;/li&gt;
&lt;li&gt;메인 쿼리가 서브쿼리를 포함하는 종속적인 관계&lt;/li&gt;
&lt;li&gt;한 문장에서 여러번 사용 가능&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;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;서브쿼리 안에서 ORDER BY 절은 사용할 수 없음&lt;/li&gt;
&lt;li&gt;서브쿼리는 연산자의 오른쪽에 사용되어야 함&lt;/li&gt;
&lt;li&gt;서브쿼리는 오로지 SELECT문으로만 작성할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 문법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636532400989&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM employee
WHERE 급여 &amp;gt; (SELECT 급여 FROM employee WHERE 이름='elice')&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;b&gt;단일 행 서브 쿼리&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과가 한 행만 나오는 서브쿼리&lt;/li&gt;
&lt;li&gt;서브쿼리가 결과를 1개의 값만 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리&lt;/li&gt;
&lt;li&gt;사용되는 연산자: = , &amp;lt;&amp;gt;(같지 않다), &amp;gt;, &amp;gt;=, &amp;lt;, &amp;lt;=&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1636532665016&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM employee
WHERE 급여 &amp;gt; (SELECT 급여 FROM employee WHERE 사원번호 = 1)
# 이 경우 사원번호는 기본적으로 한 개만 있으므로 1개의 행만 반환함 = 단일 행&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;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;2개 이상&lt;/b&gt; 반환하고, 이 결과를 메인쿼리로 전달하는 쿼리&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1636535517109&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT * FROM employee
WHERE 급여 IN ( #IN -&amp;gt; 다중 행 연산자
SELECT max(급여) FROM employee GROUP BY 부서번호);&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;기호&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;뜻&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;IN&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;하나라도 만족하면 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ANY&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;하나라도 만족하면 반환&lt;br /&gt;비교 연산 가능&lt;br /&gt;내부적으로 모두 or 연산을 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;ALL&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;모두 만족하면 반환&lt;br /&gt;비교 연산 가능&lt;br /&gt;내부적으로 모두 and 연산을 함&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre id=&quot;code_1636535680951&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1 in (1, 2, 3, 4) # True
10 &amp;lt; any (1, 2, 3, 4) # False
99 &amp;gt;= all (99, 100, 101) # False&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;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; SELECT 절에서 사용하는 서브쿼리&lt;/li&gt;
&lt;li&gt;오직 한 행만 반환&lt;/li&gt;
&lt;li&gt;JOIN을 사용한 것과 같은 결과를 얻을 수 있음&lt;/li&gt;
&lt;li&gt;데이터가 많을 때에는 JOIN을 사용하는 것보다 스칼라 서브쿼리를 사용하는 것이 더 빠르게 결과 반환 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시&lt;/p&gt;
&lt;pre id=&quot;code_1636535958498&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT students.name, (
	SELECT math
    FROM middle_test as m
    WHERE m.student_id = students.student_id
) AS middle_avg
FROM students;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. 데이터베이스&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공유하여 사용할 목적으로 체계화하여 관리하는 데이터의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;관계형 데이터베이스(RDB)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;비관계형 데이터베이스(NoSQL)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;각 테이블 간 관계 O&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;각 테이블 간 관계 X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;스키마 O&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;스키마 X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;구조적으로 안정적이나 유연하지 못함&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;유연성을 가지고 있으나 구조 결정이 어려움&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터 모델링이란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;효율적으로 데이터베이스를 구축하기 위해 데이터베이스의 뼈대를 세우는 작업&lt;/li&gt;
&lt;/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;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;1) 요구 사항 정리&lt;/b&gt;&lt;br /&gt;데이터가 어떠한 형태, 어떤 목적을 가지고 있는지 정리&lt;br /&gt;&lt;b&gt;2) 개념적 데이터 모델 설계&lt;/b&gt;&lt;br /&gt;핵심 개체를 찾고, 각 개체 간의 관계를 정리&lt;br /&gt;&lt;b&gt;3) 논리적 데이터 모델 설계&lt;/b&gt;&lt;br /&gt;실제 데이터베이스로 구현하기 위한 모델링&lt;br /&gt;&lt;b&gt;4) 물리적 데이터 모델 설계&lt;/b&gt;&lt;br /&gt;데이터가 어떻게 컴퓨터에 저장될 지 설계&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;데이터베이스 네이밍 규칙&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유지보수와 의미의 명확성을 전달하기 위해 네이밍 규칙이 있어야함&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;줄임말 사용은 최소화
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단, 사용할 경우 범용적으로 사용되는 줄임말을 사용 (ex: info)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;테이블 명을 작성할 때는 파스칼 표기법(첫 단어 시작부터 대문자로 시작)&lt;/li&gt;
&lt;li&gt;테이블, 뷰(View)임을 한 눈에 확인 할 수 있도록 테이블 명 앞에는 'tb_', 'v_'를 붙임&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;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;유일키, 외래키 등은 한 눈에 알아 볼 수 있도록 속성명 앞에 'pk_', 'fk_'를 붙임
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중복으로 설정되어 있는 경우 외래키 &amp;gt; 유일키&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5. 키(Key)&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;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;span&gt; &lt;/span&gt;명&lt;span&gt;, &lt;/span&gt;속성&lt;span&gt; &lt;/span&gt;명&lt;span&gt;, &lt;/span&gt;유일키로&lt;span&gt; &lt;/span&gt;사용할&lt;span&gt; &lt;/span&gt;속성&lt;span&gt; &lt;/span&gt;명을&lt;span&gt; &lt;/span&gt;감싸줄&lt;span&gt; &lt;/span&gt;때는&lt;span&gt; `&lt;/span&gt;&lt;span&gt;(백틱&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;활용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 유일키(Primary Key)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블에서 튜플(레코드, 행)을 구분지어주는 고유 식별 값(속성)&lt;/li&gt;
&lt;li&gt;유일키 값은 중복될 수 없으며, NULL값을 가질 수 없음&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;유일키(Primary Key) 선언하기&lt;/p&gt;
&lt;pre id=&quot;code_1636540813719&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE '테이블 명' {
    `속성명` 타입,
    `속성명2` 타입,
    ...
    PRIMARY KEY(`유일키로 사용할 속성명`)
}&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;b&gt;2) 복합키(Composite Key)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 개 이상의 속성을 활용하여 튜플(레코드, 행)을 구분지어 주는 방법&lt;/li&gt;
&lt;/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;복합키(Composite Key) 선언하기&lt;/p&gt;
&lt;pre id=&quot;code_1636545120061&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE '테이블 명' {
    `속성명` 타입,
    `속성명2` 타입,
    ...
    PRIMARY KEY(`복합키로 사용할 속성명`, `복합키로 사용할 속성명`)
}&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;b&gt;3) 외래키(Foreign Key)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다른 테이블의 키와 연결을 해주는 키&lt;/li&gt;
&lt;li&gt;참조의 무결성&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_136_1&quot; id=&quot;footnote_link_136_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 136, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(136, 1)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&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;외래키(Foreign Key) 선언하기&lt;/p&gt;
&lt;pre id=&quot;code_1636545531978&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE TABLE '테이블 명' {
    `속성명` 타입,
    `속성명2` 타입,
    ...
    FOREIGN KEY(`외래키로 사용할 속성명`) REFERENCES `참조하는 속성이 있는 테이블`(`참조할 속성명`)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6. View (뷰)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나 이상의 테이블에서 여러 정보를 토대로 만들어지는 가상의 테이블&lt;/li&gt;
&lt;li&gt;필요한 정보만 추출해서 제공함으로써 보안성과 속도를 높일 수 있음&lt;/li&gt;
&lt;li&gt;실제 존재하지 않는 가상의 테이블이기 때문에 View를 삭제하더라도 원본 테이블에는 영향 X&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;뷰(View) 생성 방법&lt;/p&gt;
&lt;pre id=&quot;code_1636549237358&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CREATE VIEW '테이블 명' AS
SELECT 가져오고자 할 속성명, 속성명2, ...
FROM 가져오고자 할 속성이 있는 테이블, 테이블2 ...
(WHERE 등 사용 가능)&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;뷰(View) 삭제 방법&lt;/p&gt;
&lt;pre id=&quot;code_1636549580582&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DROP VIEW 삭제하고자 하는 View명&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol class=&quot;footnotes&quot;&gt;
    &lt;li id=&quot;footnote_136_1&quot;&gt;외래키 값이 참조 중인 테이블의 값과 &lt;b&gt;일관성&lt;/b&gt;을 가지는 것을 의미 &lt;a href=&quot;#footnote_link_136_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/136</guid>
      <comments>https://bsscl.tistory.com/136#entry136comment</comments>
      <pubDate>Wed, 10 Nov 2021 21:46:22 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] (구구절절 뱁새의) 엘리스 3기 7주차 후기  &amp;zwj;♀️</title>
      <link>https://bsscl.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;엘리스 트랙에 탑승한지 벌써 두달이나 됐다니! 시간이 새삼 빠르다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실상 이미 8주차 수업을 듣고 있는 중에 7주차 후기를 쓰는게 맞나 싶기도 하고...ㅎㅎ 아모튼 쓰는 7주차 후기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;- 주차 테스트도 2번이나 안봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배운내용 확인하기 응시 안한지 n주됐음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이거를 나름 오픈돼있는 공간에 써도 되나 싶긴한데...일단 솔직하게 쓰는게 목표니까 안지우고 그냥 쓰고 있습니다,,, &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 몇일 전부터 매일 피곤하고 컨디션도 안좋고 공부하기 너무 싫어서 손을 놔버린 점도 영향이 있는듯 하다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숨도 쉬기 귀찮은거 보면 이게 번아웃인가 싶기도 하고...? &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러다가 곧 단위기간 끝난다는 공지봐서 오늘부터 다시 사슴공부법 뛰다가 새삼 느낀게 있었는데...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 이 마음가짐을 리마인드하려고 쓰는 포스팅입니다 헤헷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;162&quot; data-filename=&quot;177CE54B4DDFED2519.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdSNx5/btrkj9EyPzf/9FHyHmKPkQk2KRec8PMXkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdSNx5/btrkj9EyPzf/9FHyHmKPkQk2KRec8PMXkk/img.png&quot; data-alt=&quot;내가 가장 좋아하는 글 중 하나&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdSNx5/btrkj9EyPzf/9FHyHmKPkQk2KRec8PMXkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdSNx5%2Fbtrkj9EyPzf%2F9FHyHmKPkQk2KRec8PMXkk%2Fimg.png&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;162&quot; data-filename=&quot;177CE54B4DDFED2519.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;i&gt;&lt;b&gt;난 백엔드로 갈 것도 아닌데 왜.........왜 배워야 하지.......&lt;/b&gt;&amp;nbsp;&lt;/i&gt;이런 마음가짐이 있었던 것도 한 몫 했던것 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 엘리스 지원했을 때도 JS나 리액트 등등 프론트엔드 기술스택 부분을 내가 따로 구글링하면서 &lt;b&gt;기초가 없는 상태로&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;포토샵, 일러스트레이터같은 어도비 프로그램은 내 전공과 아무 연관이 없지만 IoT 회사에서 인턴으로 일할 수 있게 해줘서 어깨 너머로 많은 걸 배울 수 있었고, 관심도 없던 JAVA 수업은 나중에 졸프할때 정말정말 많은 도움이 됐다(덕분에 부트캠프 열심히 지원했던 시절 뭐라도 말할게 있었다 ) 지금 당장 생각나는건 이 정도지만 23년 인생 살면서 분명 더 많은게 있었겠지 흠흠&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 다른 사람들이랑 비교하면서 더 조급해진 것도 컸던것 같다, 이 사람은 알고리즘 문제를 벌써 이만큼 풀었어...이 사람은 프로젝트를 이만큼이나 했어,,,,이 개념은 대체 어떻게 벌써 알고있는거야?!?ㅜㅡㅜ 등등 나도 완벽한 백지 상태로 트랙에 들어온건 아닌데 나보다 앞서가는 사람들이 너무너무 많으니까 내 자신이 너무 초라해졌다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래도 어쩔 수 없다ㅜ뱁새는 뱁새만의 장점이 있다...ex: 귀여움&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-origin-width=&quot;570&quot; data-origin-height=&quot;299&quot; data-filename=&quot;htm_20161213175748756919.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WJw5p/btrkmNVTH2j/6ptSXnoufDzUxDXYatkwn1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WJw5p/btrkmNVTH2j/6ptSXnoufDzUxDXYatkwn1/img.jpg&quot; data-alt=&quot;뱁새 귀여워&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WJw5p/btrkmNVTH2j/6ptSXnoufDzUxDXYatkwn1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWJw5p%2FbtrkmNVTH2j%2F6ptSXnoufDzUxDXYatkwn1%2Fimg.jpg&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;299&quot; data-filename=&quot;htm_20161213175748756919.jpg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;뱁새 귀여워&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중구난방의 7주차 후기를 끝까지 읽어주시는 분이 있을지 모르겠지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분 화이팅 나도 화이팅 우리존재 화이팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 꼭 끝까지 완주하겠슴미다 내 꿈은 멋진 개발자니까&lt;/p&gt;
&lt;hr 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;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;2줄 요약&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;1. 숲을 보자&lt;/h4&gt;
&lt;h4 style=&quot;text-align: center;&quot; data-ke-size=&quot;size20&quot;&gt;2. 귀여운게 세상을 구한다&lt;/h4&gt;</description>
      <category>elice/ </category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/137</guid>
      <comments>https://bsscl.tistory.com/137#entry137comment</comments>
      <pubDate>Wed, 10 Nov 2021 01:59:50 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 07-02-01 ~ 07-02-02 Flask 기초 1</title>
      <link>https://bsscl.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Flask Framework란?&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;파이썬을 사용해서 웹 서버를 만들수 있게 도와주는 Web Framework
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬의 패키지&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;micro framework
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적인 기능만 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Flask의 장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나만의 서버를 쉽게 작성 가능&lt;/li&gt;
&lt;li&gt;간단한 코드로 빠르게 실행 가능&lt;/li&gt;
&lt;li&gt;원하는 기능을 유연하게 확장하기 편리함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&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;size18&quot;&gt;&lt;b&gt;2. Flask로 Web server 만들기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636437088791&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask
app = Flask(__name__)

@app.route(&quot;/&quot;)
def home():
	return &quot;hello world!&quot;

if __name__ == &quot;__main__&quot;:
	app.run()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;__name__은 파일이 다른 파일에서 실행됐는지, 아니면 직접 실행했는지 알게 해줌&amp;nbsp;&lt;/li&gt;
&lt;li&gt;app.route(url) 아래의 함수는 url에서 실행할 함수&lt;/li&gt;
&lt;li&gt;if __name__ == &quot;__main__&quot;은 파일 이름이 main일 때만 app을 실행하도록 함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. JSON 형식의 데이터 나타내기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636438090064&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask jsonify
app = Flask(__name__)

@app.route(&quot;/&quot;)
def home_json():
	blog_info = {&quot;mountain&quot;:&quot;chiak&quot;}
    return jsonify(blog_info)

if __name__ == &quot;__main__&quot;:
	app.run()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jsonify()&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;딕셔너리 형태의 데이터를 전달함으로써 JSON 형태의 데이터를 화면에 전달&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. HTML 형식의 데이터 나타내기&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;345&quot; data-filename=&quot;스크린샷 2021-11-09 오후 3.12.49.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DhzkZ/btrkmMV8Jmh/bvax0BRD7LxDEOqcnEFEFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DhzkZ/btrkmMV8Jmh/bvax0BRD7LxDEOqcnEFEFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DhzkZ/btrkmMV8Jmh/bvax0BRD7LxDEOqcnEFEFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDhzkZ%2FbtrkmMV8Jmh%2Fbvax0BRD7LxDEOqcnEFEFK%2Fimg.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;345&quot; data-filename=&quot;스크린샷 2021-11-09 오후 3.12.49.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나타낼 html 파일을 templates 폴더에 넣어주어야 함&lt;/li&gt;
&lt;li&gt;templates 폴더에 html 파일을 넣어놓으면 Flask가 자동으로 파일을 찾아서 연결해 줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1636438653621&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, render_template
app = Flask(__name__)

@app.route(&quot;/&quot;)
def home_html():
	return render_template(&quot;index.html&quot;)
    
if __name__ == &quot;__main__&quot;:
	app.run()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;render_template&lt;/b&gt;은&lt;b&gt; templates 폴더 안의 html 파일을 불러와주는 역할&lt;/b&gt;을 함&lt;/li&gt;
&lt;li&gt;trmeplates 폴더의 html 파일의 이름과 render_template() 안의 이름이 같아야 화면에 잘 전달할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;5. 여러가지 url 연결하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636438820723&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route(&quot;URL 주소&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1개의 @app.route는 여러개의 함수를 가질 수 있지만 1개와 연결하는게 가장 깔끔&lt;/li&gt;
&lt;li&gt;함수의 이름은 중복될 수 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1636439186788&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import *
app = Flask(__name__)

@app.route(&quot;/&quot;)
def home():
	return jsonify(&quot;home&quot;)
    
@app.route(&quot;/admin&quot;)
def admin():
	return jsonify(&quot;admin page&quot;)

@app.route(&quot;/student&quot;)
def student():
	return jsonify(&quot;student Page&quot;)

@app.route(&quot;/student/&amp;lt;name&amp;gt;&quot;)
def user(name):
    user = {&quot;name&quot; : name}
    return jsonify(user)

if __name__ == &quot;__main__&quot;:
	app.run()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;6. REST API&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;HTTP URI을 통해서 데이터의 자원을 명시하고 HTTP Method(POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것&lt;/li&gt;
&lt;li&gt;DB, 이미지, 텍스트 등의 다양한 데이터에 적용할 수 있음&lt;/li&gt;
&lt;li&gt;메시지가 의도하는 바를 URL에서 나타내므로, 쉽게 기능을 파악할 수 있음&lt;/li&gt;
&lt;li&gt;HTTP 표준 프로토콜에 따르는 플랫폼에서 사용 가능&lt;/li&gt;
&lt;li&gt;서버와 클라이언트의 구분을 명확하게 할 수 있음&lt;/li&gt;
&lt;li&gt;REST API의 표준이 존재하지 않음(➡️ 권고사항만 있음, 단점)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;251&quot; data-filename=&quot;스크린샷 2021-11-09 오후 4.44.40.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4SP9b/btrko7LXfhZ/QzkhIfETKwsjPiVsafs0ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4SP9b/btrko7LXfhZ/QzkhIfETKwsjPiVsafs0ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4SP9b/btrko7LXfhZ/QzkhIfETKwsjPiVsafs0ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4SP9b%2Fbtrko7LXfhZ%2FQzkhIfETKwsjPiVsafs0ek%2Fimg.png&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;251&quot; data-filename=&quot;스크린샷 2021-11-09 오후 4.44.40.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;7. HTTP Method&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;GET과 POST 등이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 42.4031%; text-align: center;&quot;&gt;GET&lt;/td&gt;
&lt;td style=&quot;width: 8.91465%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 48.6822%; text-align: center;&quot;&gt;POST&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 42.4031%; text-align: center;&quot;&gt;데이터를 URL 뒤에 ?와 함께 사용&lt;/td&gt;
&lt;td style=&quot;width: 8.91465%; text-align: center;&quot;&gt;사용방법&lt;/td&gt;
&lt;td style=&quot;width: 48.6822%; text-align: center;&quot;&gt;특정 양식(form)에 데이터를 넣어 전송하는 방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 42.4031%; text-align: center;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;길이 제한 있음&lt;/li&gt;
&lt;li&gt;주소창에 정보가 노출되기 때문에 보안이 상대적으로 취약&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 8.91465%; text-align: center;&quot;&gt;단점&lt;/td&gt;
&lt;td style=&quot;width: 48.6822%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 42.4031%; text-align: center;&quot;&gt;http://사이트_주소?id=julie&amp;amp;pwd=1234&lt;/td&gt;
&lt;td style=&quot;width: 8.91465%; text-align: center;&quot;&gt;예시&lt;/td&gt;
&lt;td style=&quot;width: 48.6822%; text-align: center;&quot;&gt;http://사이트_주소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;app.route()에 method 옵션 사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636444631394&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# app.py

@app.route('url1', methods=[&quot;GET&quot;])
@app.route('url2', methods=[&quot;POST&quot;])
@app.route('url3', methods=[&quot;GET&quot;, &quot;POST&quot;])&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;app.route()에 methods라는 옵션을 추가해서 해당하는 HTTP Method만 사용할 수 있도록 적용할 수 있음&lt;/li&gt;
&lt;li&gt;이렇게 나누면 좋은 점: URL1과 URL2가 같아도 상관 X -&amp;gt; methods 옵션이 다르기 때문&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;GET 요청만 사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636444933319&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import *
app = Flask(__name__)

@app.route(&quot;/&quot;, methods=[&quot;GET&quot;])
def home():
    # localhost:5000?name=elice
    name = request.args.get('name')
    # name == elice
    result = &quot;hello &quot; + name
    return result

if __name__ == &quot;__main__&quot;:
	app.run()&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;b&gt;POST 요청만 사용하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636445187464&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;form action='/login' method='post'&amp;gt;
    	&amp;lt;p&amp;gt;
        아이디: &amp;lt;input type='text' name='id'&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;p&amp;gt;
        비밀번호: &amp;lt;input type='password' name='pwd'&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;button type='submit'  /&amp;gt;
    &amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1636445369892&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# app.py

from flask import *
app = Flask(__name__)

@app.route(&quot;/&quot;, methods=[&quot;GET&quot;])
def home():
	return render_template(&quot;index.html&quot;)

@app.route(&quot;/login&quot;, methods=[&quot;POST&quot;])
def post():
	id = request.form['id']
    pwd = request.form['pwd']
    if id == 'julie' and pwd = '1234':
    	return 'Hello Julie!'
    else:
    	return 'Go away'
        
if __name__ == &quot;__main__&quot;:
	app.run()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;8. Blueprint란?&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;API들을 분류 / 관리할 수 있게 해줌&lt;/li&gt;
&lt;li&gt;Flask의 기능이 점점 늘어날수록, 자연스럽게 코드의 양 ⬆️&lt;/li&gt;
&lt;li&gt;이 때 Blueprint를 사용해서 길어진 코드를 모듈화
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수정 개발과 유지보수에 용이하게 코드 관리 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/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;1) Blueprint를 사용하지 않았을 경우의 코드&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;app.route의 개수 == API의 개수&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1636440027726&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, jsonify
app = Flask(__name__)

@app.route(&quot;/&quot;, methods=['GET'])
def home_route():
	return jsonify('home')
    
@app.route(&quot;/first&quot;, methods=['GET'])
def first_route():
	return jsonify('first page')
    
@app.route(&quot;/second&quot;, methods=['GET'])
def first_route():
	return jsonify('second page')
    
@app.route(&quot;/third&quot;, methods=['GET'])
def first_route():
	return jsonify('third page')

# ... 중략 ...

if __name__ == '__main__':
	app.run()&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;b&gt;2) Blueprint를 사용했을 경우&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636440149208&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 1 app.py
# 오직 서버 실행에 집중

from flask import Flask
from first_api import bp

app = Flask(__name__)
app.register_blueprint(bp)

if __name__ == '__main__':
	app.run()&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1636440161026&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 2 first_api.py
# API들을 따로 모아놓은 파일

from flask import Blueprint, jsonify
bp = Blueprint('bp', __name__)

@bp.route('/first', methods=['GET'])
def first_route():
	return jsonify('first page')

@bp.route('/second', methods=['GET'])
def second_route():
	return jsonify('second page')&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;9. Jinja2&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파이썬에서 가장 많이 사용되는 템플릿&lt;/li&gt;
&lt;li&gt;서버에서 받아온 &lt;b&gt;데이터를 효과적으로 보여주고&lt;/b&gt; 비교적 &lt;b&gt;간략한 표현으로 데이터를 가공&lt;/b&gt; 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) Jinja2 Template에서 데이터 넘겨주기 - 단일변수&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636440946555&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# app.py

@app.route(&quot;/&quot;)
def home():
	return render_template(
          'index.html',
          data = 'elice'
        )&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1636441016203&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- index.html --&amp;gt;

&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    	&amp;lt;title&amp;gt; jinja example &amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	{{ data }}
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Jinja2 Template에서 데이터 넘겨주기 - list&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636441206559&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# app.py

@app.route(&quot;/&quot;)
def home():
	my_list = [1, 2, 3, 4, 5]
	return render_template(
          'index.html',
          data = my_list
        )&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1636441149514&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- index.html --&amp;gt;

&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    	&amp;lt;title&amp;gt; jinja example &amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	{{ data }}
        {% for d in data %}
        	{{ d }}
        {% endfor %} # if문이 끝날땐 endif
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) Jinja2 Template에서 데이터 넘겨주기 - dictionary&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636441382485&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# app.py

@app.route(&quot;/&quot;)
def home():
	my_data = {'name': 'elice'}
	return render_template(
          'index.html',
          data = my_data
        )&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1636441404537&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- index.html --&amp;gt;

&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt;
    	&amp;lt;title&amp;gt; jinja example &amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    	{{ data.get('name') }}
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;8. 로그인 기능 구현&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;1) 쿠키&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;쿠키는 내 컴퓨터의 브라우저에 저장이 된다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유효기간이 안에 저장되어 있으며 그 기간내에는 따로 삭제하지 않는한 계속 저장되어 있음&lt;/li&gt;
&lt;li&gt;사용자가 따로 요청하지 않아도, Request 시에 자동으로 서버에 전송&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;2) 세션&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;/li&gt;
&lt;li&gt;클라이언트에 고유 ID를 부여하고 클라이언트에 알맞은 서비스 제공&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;http 통신의 한 사이클&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;175&quot; data-filename=&quot;스크린샷 2021-11-09 오후 4.17.08.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oupQy/btrkok53PWf/L5lIQEolti9qjHs5bmy6x1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oupQy/btrkok53PWf/L5lIQEolti9qjHs5bmy6x1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oupQy/btrkok53PWf/L5lIQEolti9qjHs5bmy6x1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoupQy%2Fbtrkok53PWf%2FL5lIQEolti9qjHs5bmy6x1%2Fimg.png&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;175&quot; data-filename=&quot;스크린샷 2021-11-09 오후 4.17.08.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;http는 상태값을 저장하지 않음(stateless)&lt;/li&gt;
&lt;li&gt;http의 이런 단점을 보완하기 위해 cookie를 담아서 전송하는 등의 방법 사용&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;3) 예제 코드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636442513148&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로그인

user_id = request.form['user_id']
user_pw = request.form['user_pw']
user = {'user_id' : 'julie', 'user_pw': '1234'}

if user is not None:
	if user_id == user['user_id'] and user_pw == user['user_pw']:
    	session['login'] = user.id
        return jsonify({&quot;result&quot;:&quot;success&quot;})
    else:
    	return jsonify({&quot;result&quot;:&quot;fail&quot;})&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;request로 받아온 로그인 정보(user_id, user_pw)를 변수에 저장&lt;/li&gt;
&lt;li&gt;DB에 user_id와 가은 데이터가 있는지 찾아옴&lt;/li&gt;
&lt;li&gt;입력된 user_pw와 저장된 패스워드가 같은지 체크&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1636443061647&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로그아웃

session['login'] = None&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;9. 로깅&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 작동할 때 발생하는 이벤트를 추적하는 행위&lt;/li&gt;
&lt;li&gt;프로그램의 문제들을 파악하고 유지보수 하는데 사용&lt;/li&gt;
&lt;li&gt;로깅을 통해 발생한 에러를 추적할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 로거 레벨&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;DEBUG &amp;lt; INFO &amp;lt; WARNING &amp;lt; ERROR &amp;lt; CRITICAL&lt;/li&gt;
&lt;li&gt;기본 로거 레벨 세팅은 WARNING이기 때문에 설정 없이 INFO, DEBUG를 출력할 수 없음&lt;/li&gt;
&lt;li&gt;에러가 발생했을 때 Flask의 logger(기본 내장)를 사용하여 에러 확인 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;DEBUG: 상세한 정보&lt;br /&gt;INFO: 일반적인 정보&lt;br /&gt;WARNING: 예상치 못하거나 가까운 미래에 발생할 문제&lt;br /&gt;ERROR: 에러 로그, 심각한 문제&lt;br /&gt;CRITICAL: 프로그램 자체가 실행되지 않을 수 있는 문제&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 특정 에러 제어하기&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1636525092613&quot; class=&quot;python&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.errorhandler(404)
def page_not_found(error):
    app.logger.error(error)
    return render_template(&quot;page_not_found.html&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;app.route를 쓰는 것처럼 app.errorhandler를 사용하면 에러를 제어할 수 있다&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>BluePrint</category>
      <category>elice</category>
      <category>flask</category>
      <category>jinja2</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/134</guid>
      <comments>https://bsscl.tistory.com/134#entry134comment</comments>
      <pubDate>Tue, 9 Nov 2021 15:31:56 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] React Hook으로 상태관리 하기</title>
      <link>https://bsscl.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. useState&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; 단순한 하나의 상태를 관리하기에 적합함&lt;/li&gt;
&lt;li&gt;const [state, setState] = useState(initState | initFn)&lt;/li&gt;
&lt;li&gt;리액트는 state가 바뀌면 state를 사용하는 컴포넌트를 리렌더함&lt;/li&gt;
&lt;li&gt;useEffect와 함께, state에 반응하는 hook을 구축&lt;/li&gt;
&lt;li&gt;패턴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상위 컴포넌트에서 state와 state 변경 함수를 정의&lt;/li&gt;
&lt;li&gt;그 state나 변경 함수를 사용하는 컴포넌트까지 prop으로 내려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;state가 변경되면 중간에 state를 넘기기만 하는 컴포넌트들도 모두 리렌더링됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;➡️ 상태와 상태에 대한 변화가 단순하거나, 상대적으로 소규모 앱에서 사용하기에 적합&lt;/b&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. useRef&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태가 바뀌어도 리렌더링하지 않는 상태를 정의함 ➡️ 상태가 UI의 변경과 관계없을 때 사용&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;리액트 컴포넌트에서의 상태는, 상태를 바꾸는 함수를 호출하고 나서 그 다음 렌더링 이후로 업데이트 된 상태를 조회할 수 있는 반면, useRef로 관리하고 있는 변수는 설정 후 바로 조회 할 수 있음&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용 예시
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;settimeout의 timerId 저장&lt;/li&gt;
&lt;li&gt;외부 라이브러리를 사용하여 생성된 인스턴스&lt;/li&gt;
&lt;li&gt;scroll 위치&lt;/li&gt;
&lt;li&gt;결제 페이지에서 필수 정보를 입력하지 않았을 때 그 input 컴포넌트로 focus 하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;uncontrolled component의 상태를 조작하는 등, 리렌더링을 최소화하는 상태관리에 사용됨 (ex: Dynamic Form)&lt;/li&gt;
&lt;li&gt;내부적으로 값을 업데이트하다가 외부적인 이유로 컴포넌트가 리렌더링 되면 그 때 변경된 값이 보여짐&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. useContext&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트와 컴포넌트 간 상태를 공유할 때 사용&lt;/li&gt;
&lt;li&gt;부분적인 컴포넌트들의 상태 관리, 전체 앱의 상태 관리를 모두 구현&lt;/li&gt;
&lt;li&gt;Context Provider 안에서 렌더링되는 컴포넌트는 useContext를 이용해 깊이 nested된 컴포넌트라도 바로 context value를 가져옴&lt;/li&gt;
&lt;li&gt;context value가 바뀌면 내부 컴포넌트는 모두 리렌더링됨&amp;nbsp; ➡️데이터를 변경할 때 주의할 필요 있음&lt;/li&gt;
&lt;li&gt;state를 넘길 필요가 없으며 컨텍스트를 참조하는 컴포넌트들만 렌더링됨&lt;/li&gt;
&lt;li&gt;패턴
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Provider 단에서 상태를 정의하고, 직접 상태와 변경 함수를 사용하는 컴포넌트에서 useContext를 이용해 바로 상태를 가져와 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;useReducer와 함께 복잡한 상태와 상태에 대한 변경 로직을 두 개 이상의 컴포넌트에서 활용하도록 구현 가능&lt;/li&gt;
&lt;li&gt;state는 필요한 곳에서만 사용하므로, 불필요한 컴포넌트 리렌더링을 방지&lt;/li&gt;
&lt;li&gt;Prop Drilling(Plumbing)을 방지하여 컴포넌트 간 결합도를 낮춤&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;4. useReducer&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;useState보다 복잡한 상태를 다룰 때 사용&lt;/li&gt;
&lt;li&gt;별도의 라이브러리 없이 flux pattern에 기반한 상태 관리를 구현&lt;/li&gt;
&lt;li&gt;const [state, dispatch] = useReducer(reducer, initState)&lt;/li&gt;
&lt;li&gt;nested state 등 복잡한 여러 개의 상태를 한꺼번에 관리하거나, 어떤 상태에 여러가지 처리를 적용할 때 유용&lt;/li&gt;
&lt;li&gt;상태가 복잡하다면 useState에 관한 callback을 내려주는 것보다 dispatch를 prop으로 내려 리렌더링을 최적화하는 것을 권장&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/133</guid>
      <comments>https://bsscl.tistory.com/133#entry133comment</comments>
      <pubDate>Sat, 6 Nov 2021 15:15:53 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 05-04 React UI</title>
      <link>https://bsscl.tistory.com/131</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. 리액트와 사용하기 좋은 Styling 도구 종류&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;1) CSS Module&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;CSS 파일의 확장자를 .module.css 로 지정해서 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 116px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 116px; text-align: left;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;class, id 등에 random string을 달아주기 때문에 선택자가 겹치지 않음&lt;/li&gt;
&lt;li&gt;스타일 충돌을 방지하고 코드를 격리하여 CSS 설계가 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 116px; text-align: left;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스타일링을 일일히 직접 해야함&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1635856494347&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//App.jsx
import styles from &quot;./app.module.css&quot;

export default function App() {
	return (
    	&amp;lt;div&amp;gt;
          &amp;lt;h1 className={styles.title}&amp;gt;Pink Hello world&amp;lt;/h1&amp;gt;
          &amp;lt;h1 className={&quot;title&quot;}&amp;gt;Normal Hello world&amp;lt;/h1&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1635856575952&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* app.module.css */
h1 {
	font-size: 1.5rem;
}

.title {
	font-size: 2.5rem;
    color: palevioletred;
}&lt;/code&gt;&lt;/pre&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-origin-width=&quot;498&quot; data-origin-height=&quot;174&quot; data-filename=&quot;blob&quot; width=&quot;358&quot; height=&quot;374&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qqwsf/btrjLx5A35z/3OkUmqtICMDO5OewKSGLb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qqwsf/btrjLx5A35z/3OkUmqtICMDO5OewKSGLb0/img.png&quot; data-alt=&quot;CSS Module 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qqwsf/btrjLx5A35z/3OkUmqtICMDO5OewKSGLb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQqwsf%2FbtrjLx5A35z%2F3OkUmqtICMDO5OewKSGLb0%2Fimg.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;174&quot; data-filename=&quot;blob&quot; width=&quot;358&quot; height=&quot;374&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;CSS Module 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) CSS in JS library&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 116px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 116px;&quot;&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;JS 값들을 props로 넘겨줘서 해당 JS 값에 의도된 styling을 바로 적용할 수 있음&lt;/li&gt;
&lt;li&gt;class 이름에 random string이 생성되기 때문에 선택자 이름이 겹칠 우려가 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 116px;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스타일링을 일일히 직접 해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1635866099462&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//App.jsx
import styled from &quot;styled-components&quot;;

const Title = styled.h1`
	font-size: 1.5rem;
    text-align: center;
    color: palevioletred;
`;

export default function App() {
	return &amp;lt;Title&amp;gt;Hello World&amp;lt;/Title&amp;gt;
}&lt;/code&gt;&lt;/pre&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-origin-width=&quot;384&quot; data-origin-height=&quot;111&quot; data-filename=&quot;스크린샷 2021-11-03 오전 12.15.10.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L6MfA/btrjIZI8KjA/mBQ4EB0qOFOeHtCtgcUo4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L6MfA/btrjIZI8KjA/mBQ4EB0qOFOeHtCtgcUo4K/img.png&quot; data-alt=&quot;styled component 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L6MfA/btrjIZI8KjA/mBQ4EB0qOFOeHtCtgcUo4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL6MfA%2FbtrjIZI8KjA%2FmBQ4EB0qOFOeHtCtgcUo4K%2Fimg.png&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;111&quot; data-filename=&quot;스크린샷 2021-11-03 오전 12.15.10.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;styled component 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) UI framework&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; ex) Ant Design, Material-UI ...&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 116px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 116px;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미 다 만들어져 있기 때문에 간편하고 쉽게 사용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 116px;&quot;&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;해당 framework의 디자인 철학을 벗어나기 어려움&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1635859013503&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.jsx
import &quot;antd/dist/antd.css&quot;;
import { Button } from &quot;antd&quot;;

export default function App() {
	return (
    	&amp;lt;div&amp;gt;
        	&amp;lt;Button type=&quot;primary&quot;&amp;gt;Primary Button&amp;lt;/Button&amp;gt;
            &amp;lt;Button type=&quot;secondary&quot;&amp;gt;Secondaray Button&amp;lt;/Button&amp;gt;
            &amp;lt;Button type=&quot;danger&quot;&amp;gt;Danger Button&amp;lt;/Button&amp;gt;
        &amp;lt;/div&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;127&quot; data-filename=&quot;스크린샷 2021-11-02 오후 10.19.23.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMKedG/btrjEVHpRTc/aJ7JeTjngLDXazXZkcuRg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMKedG/btrjEVHpRTc/aJ7JeTjngLDXazXZkcuRg1/img.png&quot; data-alt=&quot;UI Framework 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMKedG/btrjEVHpRTc/aJ7JeTjngLDXazXZkcuRg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMKedG%2FbtrjEVHpRTc%2FaJ7JeTjngLDXazXZkcuRg1%2Fimg.png&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;127&quot; data-filename=&quot;스크린샷 2021-11-02 오후 10.19.23.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;UI Framework 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4) CSS framework&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;거대한 CSS 파일 하나를 가져오는 것&lt;/li&gt;
&lt;li&gt;ex) Bootstrap, Tailwind CSS...&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 136px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;장점&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px;&quot;&gt;단점&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 116px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 116px;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자가 따로 CSS 파일을 작성하지 않아도 HTML에 클래스만 적어주면 정해진 규칙대로 스타일링이 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 116px;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CSS에 대한 이해력이 있어도 해당 framework를 사용하기 위한 학습이 또 필요함&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1635862272181&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// App.jsx
import { Helmet } from &quot;react-helmet&quot;;

export default function App() {
	return (
    	&amp;lt;div&amp;gt;
        	&amp;lt;Helmet&amp;gt;
            	&amp;lt;link
                rel=&quot;stylesheet&quot;
                href=&quot;https://www.w3schools.com/w3css/4/w3.css&quot; /&amp;gt;
            &amp;lt;/Helmet&amp;gt;
            &amp;lt;div className=&quot;w3-container w3-green&quot;&amp;gt;
            	&amp;lt;h1&amp;gt;W3Schools Demo&amp;lt;/h1&amp;gt;
                &amp;lt;p&amp;gt;Resize this responsive page!&amp;lt;/p&amp;gt;
            &amp;lt;/div&amp;gt;
            &amp;lt;div className=&quot;w3-row-padding&quot;&amp;gt;
            	&amp;lt;div className=&quot;w3-third&quot;&amp;gt;
                  &amp;lt;h2&amp;gt;London&amp;lt;/h2&amp;gt;
                  &amp;lt;p&amp;gt;London is the capital city of England.&amp;lt;/p&amp;gt;
                  &amp;lt;p&amp;gt; It is the most populous city in the United Kingdom,
                  with a metropolitan area of over 13 million inhabitants.&amp;lt;/p&amp;gt;
              &amp;lt;/div&amp;gt;
          &amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    );
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;510&quot; data-filename=&quot;스크린샷 2021-11-03 오전 12.05.10.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ThTIJ/btrjIAvMDFD/hNY6U7fkFrc1wyMe97dNGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ThTIJ/btrjIAvMDFD/hNY6U7fkFrc1wyMe97dNGk/img.png&quot; data-alt=&quot;CSS framework 결과물&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ThTIJ/btrjIAvMDFD/hNY6U7fkFrc1wyMe97dNGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FThTIJ%2FbtrjIAvMDFD%2FhNY6U7fkFrc1wyMe97dNGk%2Fimg.png&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;510&quot; data-filename=&quot;스크린샷 2021-11-03 오전 12.05.10.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;CSS framework 결과물&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>CSS</category>
      <category>elice</category>
      <category>fe</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/131</guid>
      <comments>https://bsscl.tistory.com/131#entry131comment</comments>
      <pubDate>Tue, 2 Nov 2021 23:13:18 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 06-02-01 ~ 06-02-02 SQL 1</title>
      <link>https://bsscl.tistory.com/129</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;1. 데이터베이스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여러 사람이 공유해 사용할 목적으로 통합하여 관리되는 데이터의 모음&lt;/li&gt;
&lt;li&gt;ex) Maria DB, Oracle DB 등&lt;/li&gt;
&lt;li&gt;SQL: 데이터베이스에 접근, 조작하기 위한 표준 언어
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Structured Query Language&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 관계형 데이터베이스 / 비관계형 데이터베이스&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL을 통해 제어 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비관계형 데이터베이스: 데이터들간의 연결이 없음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 테이블의 구성 요소&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 100px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 25px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;⬇️컬럼(Column, 열)⬇️&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;⬇️컬럼⬇️&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;⬇️컬럼⬇️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: right;&quot;&gt;레코드(Record)➡️&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;사번&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;이름&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;성별&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: right;&quot;&gt;레코드➡️&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;001&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;철수&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;남성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 25px;&quot;&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: right;&quot;&gt;레코드➡️&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;002&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;영희&lt;/td&gt;
&lt;td style=&quot;width: 25%; height: 25px; text-align: center;&quot;&gt;&lt;span&gt;여성&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼: 주제, 제목&lt;/li&gt;
&lt;li&gt;레코드: 내용, 값&lt;/li&gt;
&lt;li&gt;모든 테이블은 고유의 이름으로 구분&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;명령어&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;858&quot; data-filename=&quot;스크린샷 2021-10-27 오후 2.35.45.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z2V3j/btriYXZvL0W/4YYDbU89uXbgGSWT8BpHx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z2V3j/btriYXZvL0W/4YYDbU89uXbgGSWT8BpHx1/img.png&quot; data-alt=&quot;https://julia98percent.github.io/2020/11/27/201127(%EA%B8%88).html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z2V3j/btriYXZvL0W/4YYDbU89uXbgGSWT8BpHx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz2V3j%2FbtriYXZvL0W%2F4YYDbU89uXbgGSWT8BpHx1%2Fimg.png&quot; data-origin-width=&quot;1926&quot; data-origin-height=&quot;858&quot; data-filename=&quot;스크린샷 2021-10-27 오후 2.35.45.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://julia98percent.github.io/2020/11/27/201127(%EA%B8%88).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;1) DESC(DESCRIBE) 테이블명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블의 구조를 출력&lt;/li&gt;
&lt;li&gt;컬럼명, 데이터 타입, NULL 유무, KEY 등을 알아볼 수 있음&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;2) DISTINCT 컬럼명&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 컬럼의 중복을 제거하고 보여준다&lt;/li&gt;
&lt;li&gt;DISTINCT 뒤에 2개 이상의 컬럼을 적으면 한 쪽 컬럼에 중복이 있더라도 다른 쪽 컬럼의 값이 다른 경우 다르게 취급&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) SELECT 컬럼명 FROM 테이블명 WHERE 조건&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) SELECT * FROM book WHERE title = '돈키호테';&lt;/li&gt;
&lt;li&gt;조건이 여러개라면?&amp;nbsp; ➡️ AND OR ! 사용 가능&lt;/li&gt;
&lt;li&gt;그 외에도 &lt;b&gt;BETWEEN&lt;/b&gt; a &lt;b&gt;AND&lt;/b&gt; b IN, NOT IN...&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) LIKE 키워드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) SELECT * FROM 테이블명 WHERE 컬럼명 &lt;b&gt;LIKE&lt;/b&gt; 조건&lt;/li&gt;
&lt;li&gt;와일드카드를 사용할 수 있음&lt;/li&gt;
&lt;li&gt;%: 글자 수 상관 없음&lt;/li&gt;
&lt;li&gt;_: 1글자 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) ORDER BY&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SELECT * FROM 테이블명 ORDER BY 컬럼명 정렬 조건(ASC || DESC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) INSERT&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;INSERT INTO 테이블명(컬럼1, 컬럼2, 컬럼3...) VALUES (추가할 깂1, 값2, 값3...)&lt;/li&gt;
&lt;li&gt;컬럼을 명시하지 않으면 순서대로 값을 삽입&lt;/li&gt;
&lt;li&gt;테이블명과(컬럼이름 사이에 공백 있으면 오류 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7) UPDATE&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관계형 데이터베이스의 테이블에서 이미 저장된 값을 수정하는 명령&lt;/li&gt;
&lt;li&gt;UPDATE 테이블명 SET 변경할 값 WHERE 조건&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8) DELETE&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;관계형 데이터베이스의 테이블에서 이미 저장된 값을 삭제하는 명령&lt;/li&gt;
&lt;li&gt;DELETE FROM 테이블명 WHERE 조건&lt;/li&gt;
&lt;li&gt;WHERE 조건이 없을 경우 모든 데이터 삭제&lt;/li&gt;
&lt;li&gt;일부 수정: update&lt;/li&gt;
&lt;li&gt;전체 삭제: delete&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/129</guid>
      <comments>https://bsscl.tistory.com/129#entry129comment</comments>
      <pubDate>Wed, 27 Oct 2021 14:36:51 +0900</pubDate>
    </item>
    <item>
      <title>[MariaDB] mariaDB 설치하기 for MacOS</title>
      <link>https://bsscl.tistory.com/128</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;부제: 에러 코드 수집하기ㅎ...ㅎㅎ ( ᵕ̩̩ㅅᵕ̩̩ )&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엘리스 실습시간에 mariaDB 설치하려다가 안돼서 삽질끝에 성공한 과정 포스팅  &amp;zwj;♀️&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나는 예전에 백엔드 쪽을 깔짝대려고 mysql을 설치한 상태였다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 설치하려고 했더니 바이너리가 겹칠수 있다고 나한테 겁을 주길래 단순히 삭제하면 될줄 알았는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...이 때부터 시작이었을줄 난 몰랐지...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 &lt;a href=&quot;https://mariadb.com/kb/ko/installing-mariadb-on-macos-using-homebrew/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://mariadb.com/kb/ko/installing-mariadb-on-macos-using-homebrew/&lt;/a&gt; 따라하면 되는건데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜때문인지 나는 좀 험난했다...&lt;/p&gt;
&lt;figure id=&quot;og_1635273839014&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Homebrew로 macOS에 MariaDB Server 설치&quot; data-og-description=&quot;Homebrew 패키지 매니저를 이용해서 MariaDB Server를 macOS (이전 Mac OS X) 설치할 수 있습니다. MariaDB Server는 미리 컴파일된 Homebrew &amp;quot;bottle&amp;quot; 패키지로 이용 가능하며, 소스 빌드가 필요 없어 시간을 절약해&quot; data-og-host=&quot;mariadb.com&quot; data-og-source-url=&quot;https://mariadb.com/kb/ko/installing-mariadb-on-macos-using-homebrew/&quot; data-og-url=&quot;https://mariadb.com/kb/ko/installing-mariadb-on-macos-using-homebrew/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://mariadb.com/kb/ko/installing-mariadb-on-macos-using-homebrew/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://mariadb.com/kb/ko/installing-mariadb-on-macos-using-homebrew/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Homebrew로 macOS에 MariaDB Server 설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Homebrew 패키지 매니저를 이용해서 MariaDB Server를 macOS (이전 Mac OS X) 설치할 수 있습니다. MariaDB Server는 미리 컴파일된 Homebrew &quot;bottle&quot; 패키지로 이용 가능하며, 소스 빌드가 필요 없어 시간을 절약해&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;mariadb.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위 링크를 따라서 설치가 잘 됐다면&lt;/p&gt;
&lt;pre id=&quot;code_1635273982655&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mysql -uroot&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 sudo 없이 했는데 denied 당했다 password는 초기에는 그냥 엔터치면 진입 가능하다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;92&quot; data-filename=&quot;스크린샷 2021-10-27 오전 3.47.40.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/syik1/btriX87MAGN/lS2dhm3GVQUGJ45HwXAw0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/syik1/btriX87MAGN/lS2dhm3GVQUGJ45HwXAw0K/img.png&quot; data-alt=&quot;감격 그 자체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/syik1/btriX87MAGN/lS2dhm3GVQUGJ45HwXAw0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsyik1%2FbtriX87MAGN%2FlS2dhm3GVQUGJ45HwXAw0K%2Fimg.png&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;92&quot; data-filename=&quot;스크린샷 2021-10-27 오전 3.47.40.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;감격 그 자체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;pre id=&quot;code_1635274158247&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ use mysql
$ set password for 'root'@'localhost' = password('바꿀_비밀번호');&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;다음에 접속할때는 sudo mysql -uroot 대신&lt;/p&gt;
&lt;pre id=&quot;code_1635274586906&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mysql -uroot -p바꾼_비밀번호&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로 진입 가능하다✨ &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;⬇️ 여기서부터 에러 로그&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1) mariadb를 시작하려고 하는데 bootstrap 관련 오류가 뜬다&lt;/p&gt;
&lt;pre id=&quot;code_1635272858515&quot; class=&quot;shell&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew services start mariadb
-&amp;gt; Failure while executing; `/bin/launchctl bootstrap gui/501 /Users/j/Library/LaunchAgents/homebrew.mxcl.mariadb.plist` exited with 5.&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;이 경우에는 mariadb가 이미 실행중인 상태이기 때문에 발생할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;brew services restart mariadb&lt;/b&gt; 로 해결 가능!&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;size18&quot;&gt;2) mariadb가 종료가 되지 않는다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;launchctl unload [plist경로]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 경우에는 /usr/local/Cellar/mariadb/10.6.4/homebrew.mxcl.mariadb.plist 였다&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;size18&quot;&gt;3) sudo mysql -uroot로 로그인을 시도했지만 실패!&lt;/p&gt;
&lt;pre id=&quot;code_1635273327650&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Can't connect to local server through socket '/tmp/mysql.sock' (2)&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;나의 경우는 아까 brew install mariadb로 설치할 때 설정파일이 겹쳐서 postinstall 하라는 경고 메세지가 떴었는데 이게 문제였다&lt;/p&gt;
&lt;pre id=&quot;code_1635273145593&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Warning: The post-install step did not complete successfully
You can try again using: brew postinstall mariadb&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hoxy...설정 파일이 겹쳐서...?&lt;/p&gt;
&lt;pre id=&quot;code_1635273494733&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ brew services stop mariadb
$ brew uninstall mariadb
$ rm -rf /usr/local/var/mysql
$ rm /usr/local/etc/my.cnf&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고: &lt;a href=&quot;https://walkingfox.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://walkingfox.tistory.com/89&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1635273582245&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;macOS에서 homebrew로 mysql 을 깨끗하게 재설치&quot; data-og-description=&quot;macOS에서 HomeBrew를 이용하여 mysql 5.7을 사용중에 validate_password 설정관련하여 문제가 생기면서 관련 plugin을 지웠는데 mysql이 제대로 구동되지 못하는 상태가 되었다. ERROR 2002 (HY000): Can't conn..&quot; data-og-host=&quot;walkingfox.tistory.com&quot; data-og-source-url=&quot;https://walkingfox.tistory.com/89&quot; data-og-url=&quot;https://walkingfox.tistory.com/89&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ewaiHb/hyL7p59IID/QbWa8pgDkVA1Vf0r6DAMoK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/rqvCT/hyL7qYjaWr/3l4d1OauejNXzJGtiHdu1K/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bFrYlG/hyL7pLQP4D/724b7PsQsXxrD0ffuRF2Ak/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400&quot;&gt;&lt;a href=&quot;https://walkingfox.tistory.com/89&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://walkingfox.tistory.com/89&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ewaiHb/hyL7p59IID/QbWa8pgDkVA1Vf0r6DAMoK/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/rqvCT/hyL7qYjaWr/3l4d1OauejNXzJGtiHdu1K/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400,https://scrap.kakaocdn.net/dn/bFrYlG/hyL7pLQP4D/724b7PsQsXxrD0ffuRF2Ak/img.jpg?width=400&amp;amp;height=400&amp;amp;face=0_0_400_400');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;macOS에서 homebrew로 mysql 을 깨끗하게 재설치&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;macOS에서 HomeBrew를 이용하여 mysql 5.7을 사용중에 validate_password 설정관련하여 문제가 생기면서 관련 plugin을 지웠는데 mysql이 제대로 구동되지 못하는 상태가 되었다. ERROR 2002 (HY000): Can't conn..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;walkingfox.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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>BE/mySQL\MariaDB</category>
      <category>err</category>
      <category>MariaDB</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/128</guid>
      <comments>https://bsscl.tistory.com/128#entry128comment</comments>
      <pubDate>Wed, 27 Oct 2021 03:39:52 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 5주차 후기  </title>
      <link>https://bsscl.tistory.com/126</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 내가 생각하는 엘리스에서 가장 귀여운 캐릭터: 거북이&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;278&quot; data-filename=&quot;스크린샷 2021-10-24 오후 3.30.36.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vf9W3/btriA4SIrDo/p4KkZlK6UhKzMkToW2iZo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vf9W3/btriA4SIrDo/p4KkZlK6UhKzMkToW2iZo1/img.png&quot; data-alt=&quot;부기부기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vf9W3/btriA4SIrDo/p4KkZlK6UhKzMkToW2iZo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvf9W3%2FbtriA4SIrDo%2Fp4KkZlK6UhKzMkToW2iZo1%2Fimg.png&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;278&quot; data-filename=&quot;스크린샷 2021-10-24 오후 3.30.36.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;열일하는 봇이라서 실강날이면 맨날 레이서님들~ QR 체크인 해주세요~ 체크아웃 해주세요~~ 하는게 넘모 귀엽다&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;2. 스터디 후기&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;2) 알고리즘 스터디: 역시 다른 사람들이 쓴 코드 보는게 도움이 많이 되는거 같다...내일 첫 모임인데 호다닥 준비해야지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;s&gt;3) 하루 일과를 쓰는 스터디...까진 아니고 소모임 느낌?: 다른 사람들이 어떻게 시간을 쓰는지 볼 수 있어서 자극받게 된다 그리고 무엇보다 내가 뒹굴거리기만 하는거 같아서 책상에 앉게 됨...ㅎㅎ 역시 나는 약간 강제성을 띠는걸 해야 뭐라도 하나보다...이런 수동적 인간같으니라고 &lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;828&quot; data-filename=&quot;IMG_1067.jpg&quot; width=&quot;751&quot; height=&quot;434&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JVlfN/btriDyFF4uN/ccBDF2XnbLSF4Y5of5gxlK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JVlfN/btriDyFF4uN/ccBDF2XnbLSF4Y5of5gxlK/img.jpg&quot; data-alt=&quot;내 약점 알고리즘&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JVlfN/btriDyFF4uN/ccBDF2XnbLSF4Y5of5gxlK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJVlfN%2FbtriDyFF4uN%2FccBDF2XnbLSF4Y5of5gxlK%2Fimg.jpg&quot; data-origin-width=&quot;1433&quot; data-origin-height=&quot;828&quot; data-filename=&quot;IMG_1067.jpg&quot; width=&quot;751&quot; height=&quot;434&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;3. 밀린거 겨우겨우 따라잡고 있는중,,,,이번주는 CSS 관련 내용이 있어서 그으으으나마 나은 느낌,,,(하지만 리덕스가 있다면 어떨까)&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;zwj;♀️ &amp;zwj;♀️ &amp;zwj;♀️ &amp;zwj;♀️ &amp;zwj;♀️ &amp;zwj;♀️&lt;/p&gt;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/126</guid>
      <comments>https://bsscl.tistory.com/126#entry126comment</comments>
      <pubDate>Sat, 23 Oct 2021 19:49:28 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 04-04-01 React 심화 1</title>
      <link>https://bsscl.tistory.com/125</link>
      <description>&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style1&quot;&gt;&lt;b&gt;1. 자바스크립트 비동기의 등장&lt;/b&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초기 웹 환경에서는 서버에서 모든 데이터를 로드하여 페이지를 빌드했기 때문에 JS에서는 별도의 비동기 처리가 필요하지 않았음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;AJAX&lt;/b&gt;(Asynchronous Javascript And XML) 기술의 등장으로 페이지 로드 없이 client-side에서 서버로 요청을 보내 데이터를 처리할 수 있게 됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;옛날옛날...에는 브라우저가 정보를&lt;span&gt; &lt;/span&gt;요청하면&lt;span&gt; &lt;/span&gt;서버는&lt;span&gt; &lt;/span&gt;해당&lt;span&gt; &lt;/span&gt;정보를&lt;span&gt; &lt;/span&gt;포함한&lt;span&gt; &lt;/span&gt;페이지&lt;span&gt; &lt;/span&gt;전체를&lt;span&gt; &lt;/span&gt;전달 ➡️&lt;span&gt; &lt;/span&gt;브라우저는&lt;span&gt; &lt;/span&gt;서버로부터&lt;span&gt; &lt;/span&gt;받은&lt;span&gt; HTML을&lt;/span&gt;&lt;span&gt;&amp;nbsp;새롭게&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;렌더링했다고 한다  &amp;zwj; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;XMLHttpRequest라는 객체를 이용해 서버로 요청을 보낼 수 있게 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. 자바스크립트는 single-threaded language&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;184&quot; data-filename=&quot;single-threaded.jpeg&quot; width=&quot;357&quot; height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dj0hUY/btrizyztglc/FPtKUAoAyCZLqr2boXdSu0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dj0hUY/btrizyztglc/FPtKUAoAyCZLqr2boXdSu0/img.jpg&quot; data-alt=&quot;자바스크립트는 하나의 스레드를 사용하는 언어다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dj0hUY/btrizyztglc/FPtKUAoAyCZLqr2boXdSu0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdj0hUY%2Fbtrizyztglc%2FFPtKUAoAyCZLqr2boXdSu0%2Fimg.jpg&quot; data-origin-width=&quot;274&quot; data-origin-height=&quot;184&quot; data-filename=&quot;single-threaded.jpeg&quot; width=&quot;357&quot; height=&quot;240&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;자바스크립트는 하나의 스레드를 사용하는 언어다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트는 메인 스레드가 하나인 single-threaded 언어이기 때문에, 서버 요청을 기다려야 하는 경우 브라우저는 멈춰있게 될것 (답답쓰) ➡️ 그렇기 때문에 &lt;b&gt;비동기 처리를 이용&lt;/b&gt;해서 서버로 통신할 필요성이 있음&lt;/li&gt;
&lt;li&gt;비동기 요청 후, 메인 스레드는 응답을 하염없이 기다리는 대신 ! 유저의 입력을 받거나 페이지를 그리는 등 다른 작업을 처리함&lt;/li&gt;
&lt;li&gt;비동기 응답을 받게 되면, 응답을 처리하는 callback 함수를 task queue에 넣음&lt;/li&gt;
&lt;li&gt;event loop는 메인 스레드에 여유가 있을 때 task queue에서 함수를 꺼내 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. 비동기 처리를 위한 내부 구조&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저의 메인 스레드는
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JS 코드에서 동기적으로 처리되어야 할 코드 실행&lt;/li&gt;
&lt;li&gt;웹 페이지 실시간 렌더링&lt;/li&gt;
&lt;li&gt;유저 입력 감지&lt;/li&gt;
&lt;li&gt;네트워크 통신 처리 등...수 많은 일을 처리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비동기 처리 코드를 감싼 블록은 task queue에 넣어지며, 메인 스레드가 동기 코드를 실행한 후에 제어권이 돌아왔을 때 event loop가 task queue에 넣어진 비동기 코드를 실행 (➡️ 때문에 setTimeout은 reliable하지 않다고 한다)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;847&quot; data-filename=&quot;스크린샷 2021-10-22 오후 7.40.15.png&quot; width=&quot;673&quot; height=&quot;330&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crhPZH/btriCwfCf93/rhLMWYTTgTfaFC1gvtA8Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crhPZH/btriCwfCf93/rhLMWYTTgTfaFC1gvtA8Q1/img.png&quot; data-alt=&quot;비동기 다이어그램&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crhPZH/btriCwfCf93/rhLMWYTTgTfaFC1gvtA8Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrhPZH%2FbtriCwfCf93%2FrhLMWYTTgTfaFC1gvtA8Q1%2Fimg.png&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;847&quot; data-filename=&quot;스크린샷 2021-10-22 오후 7.40.15.png&quot; width=&quot;673&quot; height=&quot;330&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;비동기 다이어그램&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Task queue: 비동기 작업이 들어오는 곳&lt;/li&gt;
&lt;li&gt;Event Loop: 메인 스레드에 여유가 생기면 Task queue에서 작업을 꺼내와 Call stack에 넣는 모듈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기 &amp;amp; 비동기 설명은 실습 수업시간에 봤던 &lt;a href=&quot;https://www.youtube.com/watch?v=m0icCqHY39U%20&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;그 영상&lt;/a&gt;으로  &lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=m0icCqHY39U&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/kJyIV/hyL4N6tl3P/EBK0UYs1EIr8IwSBs6izAK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/m0icCqHY39U&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Callback pattern vs Promise&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;(1) Callback pattern&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;비동시 처리 후 실행될 코드를 Callback function으로 보내는 것&lt;/li&gt;
&lt;li&gt;비동기 처리가 고도화되면서 Callback hell 등의 단점이 발생&lt;/li&gt;
&lt;li&gt;ex) setTimeout 함수&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;(2) Promise&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비동기 처리의 순서 조작, 에러 핸들링, 여러 비동기 요청 처리 등을 쉽게 처리할 수 있음&lt;/li&gt;
&lt;li&gt;Promise를 사용함으로써 얕은 depth로 비동기 처리를 할 수 있음&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;5. Promise&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;Promise 객체는 생성 당시에서는 알려지지 않은 데이터에 대한 Proxy
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일단 data가 들어왔다고 가정하고 그 후의 로직을 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비동기 실행이 완료된 후에 '.then' '.catch' '.finally' 등의 핸들러를 붙여 각각 데이터 처리 로직, 에러 처리 로직, 클린업 로직을 실행함&lt;/li&gt;
&lt;li&gt;then 체인을 붙여 비동기 실행을 마치 동기 실행인 것처럼 동작하도록 함&lt;/li&gt;
&lt;li&gt;참고 사이트: &lt;a href=&quot;https://promisesaplus.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://promisesaplus.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1634904950297&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Promises/A+&quot; data-og-description=&quot;Here &amp;ldquo;platform code&amp;rdquo; means engine, environment, and promise implementation code. In practice, this requirement ensures that onFulfilled and onRejected execute asynchronously, after the event loop turn in which then is called, and with a fresh stack. Th&quot; data-og-host=&quot;promisesaplus.com&quot; data-og-source-url=&quot;https://promisesaplus.com/&quot; data-og-url=&quot;https://promisesaplus.com/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://promisesaplus.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://promisesaplus.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Promises/A+&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Here &amp;ldquo;platform code&amp;rdquo; means engine, environment, and promise implementation code. In practice, this requirement ensures that onFulfilled and onRejected execute asynchronously, after the event loop turn in which then is called, and with a fresh stack. Th&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;promisesaplus.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634907080823&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;자바스크립트 Promise 쉽게 이해하기&quot; data-og-description=&quot;(중급) 자바스크립트 입문자를 위한 Promise 설명. 쉽게 알아보는 자바스크립트 Promise 개념, 사용법, 예제 코드. 예제로 알아보는 then(), catch() 활용법&quot; data-og-host=&quot;joshua1988.github.io&quot; data-og-source-url=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot; data-og-url=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/gQSlH/hyL4yVTkjs/UwmolGdXq70kYTW8pk7FKK/img.png?width=500&amp;amp;height=300&amp;amp;face=0_0_500_300,https://scrap.kakaocdn.net/dn/cfxC5B/hyL4J4bhCA/GTZo3Gf0JNVn85K391IVM0/img.png?width=461&amp;amp;height=460&amp;amp;face=0_0_461_460&quot;&gt;&lt;a href=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://joshua1988.github.io/web-development/javascript/promise-for-beginners/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/gQSlH/hyL4yVTkjs/UwmolGdXq70kYTW8pk7FKK/img.png?width=500&amp;amp;height=300&amp;amp;face=0_0_500_300,https://scrap.kakaocdn.net/dn/cfxC5B/hyL4J4bhCA/GTZo3Gf0JNVn85K391IVM0/img.png?width=461&amp;amp;height=460&amp;amp;face=0_0_461_460');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;자바스크립트 Promise 쉽게 이해하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;(중급) 자바스크립트 입문자를 위한 Promise 설명. 쉽게 알아보는 자바스크립트 Promise 개념, 사용법, 예제 코드. 예제로 알아보는 then(), catch() 활용법&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;joshua1988.github.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) Promise 객체의 상태&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;Promise 객체는 &lt;b&gt;pending, fulfilled, rejected&lt;/b&gt; 3개의 상태를 가짐&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fulfilled, rejected ➡️ settled라고 지칭&lt;/li&gt;
&lt;li&gt;pending: 비동기 실행이 끝나기를 기다리는 상태&lt;/li&gt;
&lt;li&gt;fulfilled: 비동기 실행이 &lt;b&gt;성공&lt;/b&gt;한 상태&lt;/li&gt;
&lt;li&gt;rejected: 비동기 실행이 실패한 상태&lt;/li&gt;
&lt;li&gt;&lt;b&gt;then, catch는 비동기(Promise), 동기 실행 모두 리턴 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) Multiple Promise handling&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;Promise.all(): 모든 프로미스가 fulfilled 되길 기다림
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나라도 에러가 발생하는 경우, 모든 프로미스 요청이 중단됨&lt;/li&gt;
&lt;li&gt;특정 비동기 작업이 상대적으로 빠르게 끝나도 나머지 느린 처리를 끝까지 기다려야함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Promise.allSettled(): 모든 프로미스가 settled 되길 기다림&lt;/li&gt;
&lt;li&gt;Promise.race(): 넘겨진 프로미스들 중 하나라도 settled(➡️ fulfilled or rejected) 되길 기다림&lt;/li&gt;
&lt;li&gt;Promise.any(): 넘겨진 프로미스들 중 하나라도 fulfilled 되길 기다림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) Promise chaining, nested promise&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;Promise 객체는 settled 되더라도 계속 핸들러를 붙일 수 있음&lt;/li&gt;
&lt;li&gt;핸들러(.then(), .catch(), .finally())를 붙인 차례대로 호출&lt;/li&gt;
&lt;li&gt;.catch 뒤에 핸들러가 붙어있다면 에러를 처리한 후에 계속 진행됨
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;➡️ catch에서 리턴한 값이 then으로 전달됨&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. async / await&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;Promise chain을 구축하지 않고도 Promise를 직관적으로 사용할 수 있는 문법&lt;/li&gt;
&lt;li&gt;많은 프로그래밍 언어에 있는 try ...catch 문으로 에러를 직관적으로 처리&lt;/li&gt;
&lt;li&gt;async function을 만들고, Promise를 기다려야 하는 표현 앞에 await을 붙임&lt;/li&gt;
&lt;li&gt;async function 안에서만 await 키워드 사용 가능&lt;/li&gt;
&lt;li&gt;Promise.all과 달리 끝난대로 먼저 처리 가능(parallelism)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;async는 함수 이름 부분의 제일 앞에,&lt;br /&gt;await는 결과를 기다릴 함수 호출 부분 앞에 작성합니다.&lt;br /&gt;async는 해당 함수에서 비동기 처리를 위한 Promise 동작을 한다는 것을 명시하는 것이고,&amp;nbsp;await는 호출되는 함수가 적절한 결과를 반환할 때까지 기다리도록 동작합니다. 실질적인 동작은&amp;nbsp;await이고,&amp;nbsp;awiat을 사용하기 위해&amp;nbsp;async를 명시해야 한다고 이해하시면 됩니다!&lt;/blockquote&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>react</category>
      <category>Til</category>
      <category>리액트</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/125</guid>
      <comments>https://bsscl.tistory.com/125#entry125comment</comments>
      <pubDate>Fri, 22 Oct 2021 18:47:31 +0900</pubDate>
    </item>
    <item>
      <title>[BOJ] 9012 괄호 - Python</title>
      <link>https://bsscl.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9012&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.acmicpc.net/problem/9012&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634748433486&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;9012번: 괄호&quot; data-og-description=&quot;괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 &amp;lsquo;(&amp;rsquo; 와 &amp;lsquo;)&amp;rsquo; 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/9012&quot; data-og-url=&quot;https://www.acmicpc.net/problem/9012&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ccnR9f/hyL2zBXoKX/jy8F5L8CKPITrRo1SCT2Hk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/9012&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/9012&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ccnR9f/hyL2zBXoKX/jy8F5L8CKPITrRo1SCT2Hk/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;9012번: 괄호&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 &amp;lsquo;(&amp;rsquo; 와 &amp;lsquo;)&amp;rsquo; 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 &amp;lsquo;(&amp;rsquo; 와 &amp;lsquo;)&amp;rsquo; 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 &amp;ldquo;( )&amp;rdquo; 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 &amp;ldquo;(x)&amp;rdquo;도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(concatenation)시킨 새로운 문자열 xy도 VPS 가 된다. 예를 들어 &amp;ldquo;(())()&amp;rdquo;와 &amp;ldquo;((()))&amp;rdquo; 는 VPS 이지만 &amp;ldquo;(()(&amp;rdquo;, &amp;ldquo;(())()))&amp;rdquo; , 그리고 &amp;ldquo;(()&amp;rdquo; 는 모두 VPS 가 아닌 문자열이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러분은 입력으로 주어진 괄호 문자열이 VPS 인지 아닌지를 판단해서 그 결과를 YES 와 NO 로 나타내어야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 스택 쓸 생각 안하고 (그냥...스택 없이 풀고 싶었다...) 풀었는데 스택을 익히기 좋은 문제라는 설명을 듣고 결국 스택으로 또 한번 더 푼 문제...⭐️&lt;/p&gt;
&lt;pre id=&quot;code_1634748611311&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 스택 없이
def isVPS(ps):
    cnt = 0
    for i in ps:
        if i == '(':
            cnt += 1
        else: cnt -= 1
        if cnt &amp;lt; 0:
            return &quot;NO&quot;
    return &quot;NO&quot; if cnt else &quot;YES&quot;

def main(num):
    for i in range(num):
        i = input()
        j = isVPS(i)
        print(j)
    return

n = int(input())
main(n)&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1634750548544&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 스택으로 풀기
def isVPS(ps):
    stack = []
    for j in ps:
        if j == '(':
            stack.append('(')
        else:
            if not len(stack):
                return &quot;NO&quot;
            else: stack.pop()
    return &quot;NO&quot; if len(stack) else &quot;YES&quot;

def main(num):
    for i in range(num):
        i = input()
        j = isVPS(i)
        print(j)
    return

n = int(input())
main(n)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;별 차이는 없는듯 하다...아마도  &lt;/p&gt;</description>
      <category>PS:0</category>
      <category>BOJ</category>
      <category>PS</category>
      <category>Python</category>
      <category>백준</category>
      <category>파이썬</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/124</guid>
      <comments>https://bsscl.tistory.com/124#entry124comment</comments>
      <pubDate>Thu, 21 Oct 2021 01:49:23 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 리액트 라우터(React-Router)</title>
      <link>https://bsscl.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;Declarative Routing for React&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;268&quot; data-filename=&quot;스크린샷 2021-10-20 오후 3.59.17.png&quot; width=&quot;677&quot; height=&quot;148&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FX0gX/btrig5xxXfx/jPu6reKS12rzAUcivkaMxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FX0gX/btrig5xxXfx/jPu6reKS12rzAUcivkaMxk/img.png&quot; data-alt=&quot;리액트 라우터 공식 문서&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FX0gX/btrig5xxXfx/jPu6reKS12rzAUcivkaMxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFX0gX%2Fbtrig5xxXfx%2FjPu6reKS12rzAUcivkaMxk%2Fimg.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;268&quot; data-filename=&quot;스크린샷 2021-10-20 오후 3.59.17.png&quot; width=&quot;677&quot; height=&quot;148&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;공식 문서에서는 React Router를 Declarative Routing for React로 정의하고 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이게 머야,,,싶어서 검색한 끝에 잘 설명해주는 글 발견 ( &amp;zwj;♀️ 멋진 코드 예제들이 있어요!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/33655534/difference-between-declarative-and-imperative-in-react-js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/33655534/difference-between-declarative-and-imperative-in-react-js&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634713941640&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Difference between declarative and imperative in React.js?&quot; data-og-description=&quot;Recently I've been studying a lot about the functionality and the ways to use the Facebook JavaScript library React.js. When speaking of its differences to the rest of the JavaScript world often th...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/33655534/difference-between-declarative-and-imperative-in-react-js&quot; data-og-url=&quot;https://stackoverflow.com/questions/33655534/difference-between-declarative-and-imperative-in-react-js&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cFVLxz/hyL2yvG1AF/zMvwZRK0sINXKulQgdiA51/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/33655534/difference-between-declarative-and-imperative-in-react-js&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/33655534/difference-between-declarative-and-imperative-in-react-js&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cFVLxz/hyL2yvG1AF/zMvwZRK0sINXKulQgdiA51/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Difference between declarative and imperative in React.js?&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Recently I've been studying a lot about the functionality and the ways to use the Facebook JavaScript library React.js. When speaking of its differences to the rest of the JavaScript world often th...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634714597945&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Declarative vs Imperative Programming&quot; data-og-description=&quot;Or wrong ways I was thinking about React&quot; data-og-host=&quot;codeburst.io&quot; data-og-source-url=&quot;https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2&quot; data-og-url=&quot;https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMMTBa/hyL2wEDgoK/Yb9KN35hqJFdxqePTBE9b1/img.jpg?width=1200&amp;amp;height=797&amp;amp;face=0_0_1200_797,https://scrap.kakaocdn.net/dn/cxNiER/hyL2ybnwyd/5L0TlAib9nfGL5ANG40Hc1/img.jpg?width=1400&amp;amp;height=930&amp;amp;face=0_0_1400_930&quot;&gt;&lt;a href=&quot;https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codeburst.io/declarative-vs-imperative-programming-a8a7c93d9ad2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMMTBa/hyL2wEDgoK/Yb9KN35hqJFdxqePTBE9b1/img.jpg?width=1200&amp;amp;height=797&amp;amp;face=0_0_1200_797,https://scrap.kakaocdn.net/dn/cxNiER/hyL2ybnwyd/5L0TlAib9nfGL5ANG40Hc1/img.jpg?width=1400&amp;amp;height=930&amp;amp;face=0_0_1400_930');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Declarative vs Imperative Programming&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Or wrong ways I was thinking about React&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codeburst.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://egas.tistory.com/2&quot;&gt;https://egas.tistory.com/2&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634714603696&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;선언형 프로그래밍과 명령형 프로그래밍&quot; data-og-description=&quot;React의 특징 중 하나에 선언형이 있다. 선언형은 무엇을 의미할까? 프로그래밍 패러다임은 프로그램을 작성할 때의 관점을 의미한다. 우리가 아는 객체지향도 프로그래밍 패러다임 중 일부이다.&quot; data-og-host=&quot;egas.tistory.com&quot; data-og-source-url=&quot;https://egas.tistory.com/2&quot; data-og-url=&quot;https://egas.tistory.com/2&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1HtqZ/hyL2Dw0vZh/FeVmnZp3XmNT5ea2KdhWg1/img.png?width=800&amp;amp;height=337&amp;amp;face=0_0_800_337,https://scrap.kakaocdn.net/dn/bc9e4K/hyL2CkxTeM/peqUmwx8W4mTQBBhmLoUuk/img.png?width=800&amp;amp;height=337&amp;amp;face=0_0_800_337,https://scrap.kakaocdn.net/dn/hWCzU/hyL2DcGTu6/UmP0LoJKtcMjVombbwH960/img.png?width=1248&amp;amp;height=526&amp;amp;face=0_0_1248_526&quot;&gt;&lt;a href=&quot;https://egas.tistory.com/2&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://egas.tistory.com/2&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1HtqZ/hyL2Dw0vZh/FeVmnZp3XmNT5ea2KdhWg1/img.png?width=800&amp;amp;height=337&amp;amp;face=0_0_800_337,https://scrap.kakaocdn.net/dn/bc9e4K/hyL2CkxTeM/peqUmwx8W4mTQBBhmLoUuk/img.png?width=800&amp;amp;height=337&amp;amp;face=0_0_800_337,https://scrap.kakaocdn.net/dn/hWCzU/hyL2DcGTu6/UmP0LoJKtcMjVombbwH960/img.png?width=1248&amp;amp;height=526&amp;amp;face=0_0_1248_526');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;선언형 프로그래밍과 명령형 프로그래밍&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;React의 특징 중 하나에 선언형이 있다. 선언형은 무엇을 의미할까? 프로그래밍 패러다임은 프로그램을 작성할 때의 관점을 의미한다. 우리가 아는 객체지향도 프로그래밍 패러다임 중 일부이다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;egas.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 느낌일까...?&lt;/p&gt;
&lt;pre id=&quot;code_1634715615835&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1. 명령형 언어
if (손님 === '토끼') {
	집 청소하기()
    복숭아 사기()
    토끼 사료 사기()
    건초 사기()
    담요 깔아드리기()
} else if (손님 === '고양이') {
	말린 닭고기 사기()
}

// 2. 선언형 언어
if (손님 === '토끼') {
	return &amp;lt;토끼손님 /&amp;gt;
} else if (손님 === '고양이') {
	return &amp;lt;고양이 /&amp;gt;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각해보니까 리액트는 선언형 언어라고 했는데! 까먹고 있었다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 선언형 뷰의 장점들이 이해가 약간 갔다 &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;305&quot; data-filename=&quot;스크린샷 2021-10-20 오후 4.19.10.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br973R/btrim5cakJF/KrkjfKX7FdRbYzrLkGk7Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br973R/btrim5cakJF/KrkjfKX7FdRbYzrLkGk7Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br973R/btrim5cakJF/KrkjfKX7FdRbYzrLkGk7Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr973R%2Fbtrim5cakJF%2FKrkjfKX7FdRbYzrLkGk7Xk%2Fimg.png&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;305&quot; data-filename=&quot;스크린샷 2021-10-20 오후 4.19.10.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;react-router의 기능&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리액트 컴포넌트를 특정 path와 연결하면, 해당하는 path로 진입시 컴포넌트를 렌더링하게 함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1634717530851&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Route path=&quot;/yeolmoo&quot;&amp;gt;
	&amp;lt;YoungRadish /&amp;gt;
&amp;lt;/Route&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL 파라미터(ex: query, path variable 등)를 얻어 활용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;21&quot; data-filename=&quot;스크린샷 2021-10-20 오후 5.26.38.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhgKC/btrilTJ1D2O/lf13mXjxkIIJbolDNnUp10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhgKC/btrilTJ1D2O/lf13mXjxkIIJbolDNnUp10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhgKC/btrilTJ1D2O/lf13mXjxkIIJbolDNnUp10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlhgKC%2FbtrilTJ1D2O%2Flf13mXjxkIIJbolDNnUp10%2Fimg.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;21&quot; data-filename=&quot;스크린샷 2021-10-20 오후 5.26.38.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;조건에 맞지 않을 경우 redirect 함&lt;/li&gt;
&lt;li&gt;페이지 이동 시, 이벤트 핸들러를 등록할 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) history.listen()&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;/post/123 과 같은 nested route를 구현함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/post ➡️ 1번 포스트(/1) , 2번 포스트(/2), 3번 포스트(/3) ...&lt;/li&gt;
&lt;li&gt;Route안에 Route가 들어가는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;react-router의 사용법&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;lt;BrowserRouter&amp;gt; 로 감싸 Router &lt;a href=&quot;https://ko.reactjs.org/docs/context.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Context&lt;/a&gt;를 제공해야 함&lt;/li&gt;
&lt;li&gt;Route로 path를 정의하고, 그 안에 렌더링하고자 하는 컴포넌트를 넣음&lt;/li&gt;
&lt;li&gt;Link로 특정 페이지로 이동시, 리로드 없이 페이지가 이동함 (기본 기능)&lt;/li&gt;
&lt;li&gt;Switch로 매칭되는 라우트 하나를 렌더링하게 함
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식들 중 처음으로 조건이 만족하는 하나의 컴포넌트만 출력하도록 함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1634719581177&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;BrowserRouter&amp;gt;
	&amp;lt;Switch&amp;gt;
    	&amp;lt;Route path=&quot;about&quot; /&amp;gt;
        	&amp;lt;AboutPage /&amp;gt;
        &amp;lt;/Route&amp;gt;
        &amp;lt;Route path=&quot;contact&quot; /&amp;gt;
        	&amp;lt;ContactPage /&amp;gt;
        &amp;lt;/Route&amp;gt;
        &amp;lt;Route path=&quot;/&quot; /&amp;gt;
        	&amp;lt;HomePage /&amp;gt;
        &amp;lt;/Route&amp;gt;  
    &amp;lt;/Switch&amp;gt;
&amp;lt;/BrowserRouter&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #ffc9af;&quot;&gt;&lt;i&gt;&lt;b&gt;react-router 컴포넌트&lt;/b&gt;&lt;/i&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;b&gt;1. BrowserRouter&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;HTML5의 History API를 사용하여&lt;b&gt; UI와 URL의 싱크를 맞추는 역할&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) About 페이지로 들어가면 주소창에도 peach.com/ ➡️ peach.com/about 과 같은 식으로 주소가 변경된다&lt;/li&gt;
&lt;li&gt;서버에서 페이지를 새로 받아온건 아니지만...이런 처리가 있어야 URL path가 변경되는 이벤트를 브라우저가 감지할 수 있음 ➡️ 이벤트 핸들러 처리가 가능해짐&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 URL에 대해 일관성 있게 동작하게 하기 위해서는 동일한 클라이언트를 내려줄 수 있도록 서버 설정 필요&lt;/li&gt;
&lt;li&gt;모든 path 앞의 basename을 지정할 수 있음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) &quot;peach.com&lt;b&gt;/ko&lt;/b&gt;/users&quot; , &quot;peach.com&lt;b&gt;/en&lt;/b&gt;/users&quot;, &quot;peach.com&lt;b&gt;/jp&lt;/b&gt;/users&quot;...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;forceRefresh로 페이지 이동 시 리프레시 할 것인지 지정할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Swtich&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;여러 Route 중 가장 먼저 매치되는 Route를 선택하여 렌더링함&lt;/li&gt;
&lt;li&gt;매칭 되는 Route가 없으면 아무것도 보여주지 않음
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fallback 용으로 404 not Found 페이지를 추가함&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;path=&quot;/&quot; 의 경우 모든 path에 매칭
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1) 가장 아래로 내림&lt;/li&gt;
&lt;li&gt;2) exact 키워드 추가&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Route&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;path와 컴포넌트를 매칭&lt;/li&gt;
&lt;li&gt;매칭되는 컴포넌트는 ❗️
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;1) children으로 넣어주거나&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;2) component prop으로 넘김&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;exact 키워드로 정확하게 매칭하는 path 설정 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1634726817121&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 1번 + exact 키워드
&amp;lt;Route exact path=&quot;/watermelon&quot;&amp;gt;
	&amp;lt;Watermelon /&amp;gt;
&amp;lt;/Route&amp;gt;

// 2번
&amp;lt;Route component={Watermelon} path=&quot;/watermelon&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Route로 렌더링 되는 최상위 컴포넌트는 match, location, history를 prop으로 받을 수 있음&lt;/li&gt;
&lt;li&gt;&lt;u&gt;&lt;i&gt;render prop으로 매칭되었을 때 실제 어떤 컴포넌트를 렌더링할지 통제함&lt;/i&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;009&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/009.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭐야,,, 그럼 render나 component prop이나 같은거 아닌가? 라는 생각이 들었는데 코치님(feat. 공식문서)이 이해 쏙쏙 가게 설명 잘 해주셨다...❤️ 사...사랑합니다 코치님 최고 ( ⁎ᵕᴗᵕ⁎ )&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;우선 특정 path와 매치될 때 &amp;lt;Route&amp;gt;로 컴포넌트를 렌더링 할 수 있는 방법은 아래와 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;1. 자식 element로 넣는다(공식 문서에서 추천)&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre id=&quot;code_1634885725210&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Route exact path=&quot;/&quot;&amp;gt;
  &amp;lt;Home /&amp;gt;
&amp;lt;/Route&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;1번 방법을 사용하지 않고 다른 rendering methods를 사용할 수도 있는데(component, render, children function), 이 경우는 hook이 소개되기 전에 이전 버전의 router로 만들어진 앱을 지원하기 위해서입니다.&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;2. &amp;lt;Route component&amp;gt; 사용&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre id=&quot;code_1634885722652&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Router&amp;gt;
  &amp;lt;Route path=&quot;/user/:username&quot; component={User} /&amp;gt;
&amp;lt;/Router&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&amp;lt;Route&amp;gt; 의 component를 사용하면 router는 주어진 컴포넌트에서 새로운 엘리먼트를 만들기 위해 React.createElement 를 사용한다고 해요. 그래서 만약에 component={() =&amp;gt; &amp;lt;User /&amp;gt;} 와 같은 형태로 만들면, 렌더링이 될 때마다 새로운 컴포넌트를 만들게 됩니다. 근데 이건 원래 있던 &amp;lt;User /&amp;gt; 컴포넌트 마운팅이 해제되지 않은 상태에서 계속 새로운 컴포넌트가 마운팅 되는 거예요! 그러니까&amp;nbsp;만약 component에 인라인 함수를 쓸 일이 있다면(예: prop으로 뭔가 넘겨준다거나...) redner를 사용하는 게 좋아요.&lt;br /&gt;&lt;b&gt;&lt;b&gt;&lt;br /&gt;3. &amp;lt;Route render&amp;gt; 사용&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;
&lt;pre id=&quot;code_1634885719971&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Router&amp;gt;
  &amp;lt;Route path=&quot;/home&quot; render={() =&amp;gt; &amp;lt;div&amp;gt;Home&amp;lt;/div&amp;gt;} /&amp;gt;
&amp;lt;/Router&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;사실 2번 설명까지만 읽으셔도 '아 인라인 함수로 뭔가 prop을 넘겨주거나 할 때면 route의 component를 쓸 게 아니라 render를 쓰는 거구나! 근데, component나 render를 사용하기보다는 &amp;lt;Route path=&quot;/user/:username&quot;&amp;gt;&amp;lt;User /&amp;gt;&amp;lt;/Route&amp;gt; 처럼 자식 컴포넌트로 넣어주는 게 더 좋은 거구나!' 라는 걸 아실 수 있어요. 이까지만 아셔도 솔직히 무리 없습니다! 그래도 render에 대해서 조금 설명해보자면 render를 사용할 땐 component와 다르게, 우리가 원하지 않는 마운팅이 되지 않게 인라인 함수를 쓸 수 있어요. 그리고 하나 주의하실 점은 &amp;lt;Route component&amp;gt;가 &amp;lt;Route render&amp;gt;보다 더 중요하기 때문에 component와 render를 같은 &amp;lt;Route&amp;gt;에 쓰지 않아야 한다는 점이에요. 아래와 같이요!&lt;br /&gt;
&lt;pre id=&quot;code_1634885591243&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;Route component={} render={} /&amp;gt;​&lt;/code&gt;&lt;/pre&gt;
&lt;b&gt;&lt;br /&gt;4. &amp;lt;Route children&amp;gt; function 사용 (설명 X. 필요하시면 찾아보기!)&lt;/b&gt;&lt;/blockquote&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-origin-width=&quot;954&quot; data-origin-height=&quot;538&quot; data-filename=&quot;스크린샷 2021-10-22 오후 3.43.53.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbVp87/btrivCWdbXB/kgc2nVovio52I1pmG6Ye80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbVp87/btrivCWdbXB/kgc2nVovio52I1pmG6Ye80/img.png&quot; data-alt=&quot;공식문서쓰&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbVp87/btrivCWdbXB/kgc2nVovio52I1pmG6Ye80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbVp87%2FbtrivCWdbXB%2Fkgc2nVovio52I1pmG6Ye80%2Fimg.png&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;538&quot; data-filename=&quot;스크린샷 2021-10-22 오후 3.43.53.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;b&gt;4. Redirect&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;Link와 비슷하지만 렌더링 되면 to prop으로 지정한 path로 이동함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1634740402360&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//선언적 코드
if (!users) {
	return (
		&amp;lt;Redirect to=&amp;ldquo;/abc&amp;rdquo; /&amp;gt;
	)
}
return (
	div&amp;hellip;&lt;/code&gt;&lt;/pre&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;021&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 Link도 to prop 있는거 아닌가...? 에 대한 답변...근데 플젝에서 직접 써봐야 이해가 갈것같다ㅜㅅㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/51116747/react-router-link-vs-redirect-vs-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://stackoverflow.com/questions/51116747/react-router-link-vs-redirect-vs-history&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634740974669&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;React-Router - Link vs Redirect vs History&quot; data-og-description=&quot;There seems to be some confusion with what to use over the other: &amp;lt;Link to='/some/path'&amp;gt; &amp;lt;Redirect to='/some/path'/&amp;gt; history.push('/some/path') I have been using React/Router for a li...&quot; data-og-host=&quot;stackoverflow.com&quot; data-og-source-url=&quot;https://stackoverflow.com/questions/51116747/react-router-link-vs-redirect-vs-history&quot; data-og-url=&quot;https://stackoverflow.com/questions/51116747/react-router-link-vs-redirect-vs-history&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dtez4Y/hyL3qchevU/RorFoI2OB3GOXSMYSg9uQ0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://stackoverflow.com/questions/51116747/react-router-link-vs-redirect-vs-history&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://stackoverflow.com/questions/51116747/react-router-link-vs-redirect-vs-history&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dtez4Y/hyL3qchevU/RorFoI2OB3GOXSMYSg9uQ0/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;React-Router - Link vs Redirect vs History&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;There seems to be some confusion with what to use over the other: history.push('/some/path') I have been using React/Router for a li...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;stackoverflow.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Switch 안에서 쓰일 경우, from과 to를 받아서 이동하게 만듦
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) from &quot;/&quot; to=&quot;/login&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Link, NavLink(Link&lt;span&gt;의&lt;/span&gt; &lt;span&gt;특별한&lt;/span&gt; &lt;span&gt;버전&lt;/span&gt;!)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;153&quot; data-filename=&quot;스크린샷 2021-10-20 오후 6.45.36.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A6DWg/btrihJnTlru/7bPn38tmOpAM1WKFxeoUCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A6DWg/btrihJnTlru/7bPn38tmOpAM1WKFxeoUCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A6DWg/btrihJnTlru/7bPn38tmOpAM1WKFxeoUCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA6DWg%2FbtrihJnTlru%2F7bPn38tmOpAM1WKFxeoUCK%2Fimg.png&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;153&quot; data-filename=&quot;스크린샷 2021-10-20 오후 6.45.36.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;to prop을 특정 URL로 받아, 클릭 시 네비게이션 함&lt;/li&gt;
&lt;li&gt;anchor tag를 래핑함&lt;/li&gt;
&lt;li&gt;NavLink의 경우, 매칭 시 style attributes를 추가해줄 수 있음 &amp;nbsp;➡️ Link와 가장 큰 차이점&lt;/li&gt;
&lt;li&gt;to에 location object나 함수를 받을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://reactrouter.com/web/api/NavLink&quot;&gt;https://reactrouter.com/web/api/NavLink&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1634741118122&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;React Router: Declarative Routing for React&quot; data-og-description=&quot;Learn once, Route Anywhere&quot; data-og-host=&quot;reactrouter.com&quot; data-og-source-url=&quot;https://reactrouter.com/web/api/NavLink&quot; data-og-url=&quot;https://reacttraining.com/react-router&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/ehK9Jq/hyL2A1zGto/ur5WKe4mibMRkmk09tgnV0/img.png?width=562&amp;amp;height=562&amp;amp;face=0_0_562_562&quot;&gt;&lt;a href=&quot;https://reactrouter.com/web/api/NavLink&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://reactrouter.com/web/api/NavLink&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/ehK9Jq/hyL2A1zGto/ur5WKe4mibMRkmk09tgnV0/img.png?width=562&amp;amp;height=562&amp;amp;face=0_0_562_562');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;React Router: Declarative Routing for React&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Learn once, Route Anywhere&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;reactrouter.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. useHistory, useLocation, useParams, useRouteMatch&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;최상위 컴포넌트가 아니더라도 hook으로 react-router 관련 객체에 접근할 수 있음&lt;/li&gt;
&lt;li&gt;&lt;b&gt;history, location, params, match&lt;/b&gt; 객체에 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>react</category>
      <category>React-router</category>
      <category>리액트</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/123</guid>
      <comments>https://bsscl.tistory.com/123#entry123comment</comments>
      <pubDate>Wed, 20 Oct 2021 15:46:33 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 04-02-01 ~ 04-02-02 React 기초 3</title>
      <link>https://bsscl.tistory.com/122</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TIL은 오늘 하루&amp;nbsp;새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. form 태그 작성할땐 type들을 잘 작성해주는것이 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 함수가 선언됐는지(존재하는지) + 타입 확인을 한번 더 함으로써 에러 방지!&lt;/p&gt;
&lt;pre id=&quot;code_1634663597363&quot; class=&quot;javascript&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(typeof onInsert === &quot;function&quot; &amp;amp;&amp;amp; inputValue) {
// onInsert가 정상적인 함수인 지 확인하여 에러 방지
	onInsert(inputValue);
}&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;3. 리액트에서 style은 object로 표현해야한다&lt;/p&gt;
&lt;pre id=&quot;code_1634640211385&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div className=&quot;greeting&quot; style={{ padding: 10, color: 'red'}}&amp;gt;
	{name}님 안녕하세요 &amp;lt;br /&amp;gt;
    반갑습니다.
&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 같은 inline style의 property name은 camelCase로 적는다&lt;/li&gt;
&lt;li&gt;첫번째 중괄호는 자바스크립트 표현을 사용하겠다는 의미&lt;/li&gt;
&lt;li&gt;두번째는 object의 중괄호&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;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SPA와 라우팅&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Single Page Application&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 페이지 요청으로 전체 웹앱을 사용하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;SPA&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;MPA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;전체 웹앱을 JS만으로 구성, 첫 요청 시 빈 페이지를 받게 됨&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;미리 서버에서 전체 페이지를 빌드해 브라우저로 전송&lt;br /&gt;➡️ 캐싱 불가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;여러 페이지를 하나의 앱의 구성 요소로 보고 여러 페이지 간의 스타일, 컴포넌트를 재활용 하는 방향으로 구현&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;페이지 요청마다 모든 리소스를 다시 받아오므로, 페이지 간 데이터를 재활용하기 힘듦&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;Client-side routing 기술을 활용, 페이지 진입 시 리로드 없이 라우팅&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;서버에 미리 여러 페이지를 두고 유저가 네비게이션 시 요청에 적합한 페이지를 전달&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;AJAX를 활용해 페이지 이동 시 서버에 데이터만 요청하여 JS로 페이지를 만듦&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;서버에 라우팅을 처리하는 기능이 있고, 서버에서 여러 페이지를 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SPA의 장점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에서 페이지를 만들 필요가 없기 때문에 CDN에 캐싱 가능&lt;/li&gt;
&lt;li&gt;매번 페이지 요청을 할 필요가 없어 네트워크 요청이 줄어듦 (제약 조건 줄어듦)&lt;/li&gt;
&lt;li&gt;웹 사이트를 개별 페이지보다는 하나의 앱으로 보는 설계로 고도의 SW 설계(ex: 상태관리, 라우팅, 컴포넌트 재사용, Hook 등...)와 패턴 적용 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SPA의 단점
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SEO에 불리함&lt;/li&gt;
&lt;li&gt;하나의 JS 앱이 지속하므로, 메모리 관리와 성능, 데이터 활용 등이 중요
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지가 리로드 되지 않으면 페이지가 뜬 상태로 유지되기 때문에&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;여러 페이지를 전송받는 것보다, 하나의 거대한 JS 앱을 전송받아야 하므로 코드가 많아질수록 로드 속도가 느려짐
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드의 양을 줄이고 필요할때만 코드를 로딩하는 lazy loading 등의 처리를 통해 페이지 전송을 빠르게 할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SPA에서 라우팅이 왜 중요하냐면...
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저가 다른 페이지로 이동했을 때, reloading이 없어야하기 때문에&lt;/li&gt;
&lt;li&gt;라우팅 라이브러리는 reloading을 없애는 근원적인 기술&lt;/li&gt;
&lt;li&gt;주로 History API or URL Hash를 이용해 페이지 리로드 없는 페이지 전환을 구현
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요즘에는 Hash 방식보다 History API를 통해 편리한 라우팅을 구현할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/122</guid>
      <comments>https://bsscl.tistory.com/122#entry122comment</comments>
      <pubDate>Wed, 20 Oct 2021 02:06:40 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 4주차 후기  </title>
      <link>https://bsscl.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 음...진도 진짜 많이 밀려버렸어요...리액트 hook과 자료구조 큐가 특히 어려웠던 느낌...&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-origin-width=&quot;1212&quot; data-origin-height=&quot;56&quot; data-filename=&quot;스크린샷 2021-10-17 오후 5.33.03.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D6nbN/btrhWJBkX7N/jZxts0b6SPD4WwYKuqu2ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D6nbN/btrhWJBkX7N/jZxts0b6SPD4WwYKuqu2ok/img.png&quot; data-alt=&quot;교수님...진도가 너무 빠릅니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D6nbN/btrhWJBkX7N/jZxts0b6SPD4WwYKuqu2ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD6nbN%2FbtrhWJBkX7N%2FjZxts0b6SPD4WwYKuqu2ok%2Fimg.png&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;56&quot; data-filename=&quot;스크린샷 2021-10-17 오후 5.33.03.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;교수님...진도가 너무 빠릅니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;52&quot; data-filename=&quot;스크린샷 2021-10-17 오후 5.31.28.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EkQNc/btrhUV9A67u/ZQdWKglnblD5s22NCswg50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EkQNc/btrhUV9A67u/ZQdWKglnblD5s22NCswg50/img.png&quot; data-alt=&quot;둘다 진도율이 100%여야 하는데.? &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EkQNc/btrhUV9A67u/ZQdWKglnblD5s22NCswg50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEkQNc%2FbtrhUV9A67u%2FZQdWKglnblD5s22NCswg50%2Fimg.png&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;52&quot; data-filename=&quot;스크린샷 2021-10-17 오후 5.31.28.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;둘다 진도율이 100%여야 하는데.? &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 파이썬이랑 JS랑 섞어서 문제풀이 하게 된다...0개 언어?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨리 파이써닉한 코드 짜고 싶은데...!!!!!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 융합전공을 했지만 주변에 프론트쪽 생각하는 사람이 없어서 항상 아쉬웠는데 여기는 넘쳐난다  정보 공유 감사합니다 다들... &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 자괴감...사실 이번 주차테스트 0점인데요... 사슴공부법의 일환으로 생각하고 더 열심히 해야겠다...끝까지 살아남는 사슴 나야나...나야나... &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-origin-width=&quot;720&quot; data-origin-height=&quot;459&quot; data-filename=&quot;R720x0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGHjf/btrhZLZfhFy/vKBl20bJVUCVE7Qg3Bvhp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGHjf/btrhZLZfhFy/vKBl20bJVUCVE7Qg3Bvhp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGHjf/btrhZLZfhFy/vKBl20bJVUCVE7Qg3Bvhp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGHjf%2FbtrhZLZfhFy%2FvKBl20bJVUCVE7Qg3Bvhp0%2Fimg.png&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;459&quot; data-filename=&quot;R720x0.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 큐 문제 조지러 총총...⭐️&lt;/p&gt;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스 AI트랙</category>
      <category>일기</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/121</guid>
      <comments>https://bsscl.tistory.com/121#entry121comment</comments>
      <pubDate>Sun, 17 Oct 2021 17:30:18 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 03-05-01 ~ 자료구조</title>
      <link>https://bsscl.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자료구조&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자료를 저장하는 방법과 자료에 적용할 수 있는 연산을 구체적으로 제공한 것&lt;/li&gt;
&lt;li&gt;각각 장단점이 있으며 구현하고자 하는 프로그램의 성능을 고려하여 알맞은 자료구조를 선택해야함&lt;/li&gt;
&lt;/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;2. 추상적 자료형&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 자료와 그 자료에 대한 연산(동작)들의 수학적인 정의&lt;/li&gt;
&lt;li&gt;이 정의를 구현하는 방법은 명시되어 있지 않음&lt;/li&gt;
&lt;li&gt;추상적 자료형을 구체적으로 구현한 결과가 자료구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 리스트 (추상적 자료형)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;순서가 존재하며, 일렬로 나열된 값들이 들어있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 배열 (구현)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인덱스 가지고 있음&lt;/li&gt;
&lt;li&gt;특정 위치의 자료 탐색 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 연결 리스트(구현)&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;/li&gt;
&lt;li&gt;자료의 삽입, 삭제에 유리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) 해시 테이블&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충돌 해결 방법: 오픈 어드레싱
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;충돌이 발생했을 때 자료를 저장하기 위해 빈 공간을 탐색하는 방식&lt;/li&gt;
&lt;li&gt;모든 원소가 자신의 해시 값과 일치하는 인덱스에 저장된다는 보장은 없&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>엘리스 AI트랙</category>
      <category>자료구조</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/120</guid>
      <comments>https://bsscl.tistory.com/120#entry120comment</comments>
      <pubDate>Fri, 15 Oct 2021 18:48:02 +0900</pubDate>
    </item>
    <item>
      <title>[error] create is not a function at commitHookEffectListMount</title>
      <link>https://bsscl.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;리액트 실습하고 있는데 발견해서 쓰는 에러 로그,,,(._.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원인은 useEffect에 콜백함수가 안들어왔기 때문이라고 한다&lt;/p&gt;
&lt;pre id=&quot;code_1634115898798&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//수정 전
useEffect(console.log(inputValue), [inputValue]);

//수정 후
useEffect(() =&amp;gt; {console.log(inputValue)}, [inputValue]);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 넘겨주는걸로 문제 해결 &lt;/p&gt;</description>
      <category>FE/React</category>
      <category>err</category>
      <category>react</category>
      <category>리액트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/119</guid>
      <comments>https://bsscl.tistory.com/119#entry119comment</comments>
      <pubDate>Wed, 13 Oct 2021 18:08:46 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 03-04-03 React기초 2 (Hook)</title>
      <link>https://bsscl.tistory.com/118</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TIL은 오늘 하루&amp;nbsp;새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Hook&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;컴포넌트에서 데이터를 관리(State)하고 데이터가 변경될 때 상호작용(Effect)을 하기 위해 사용&lt;/li&gt;
&lt;li&gt;State Hook의 대표적인 예로 useState가 있음&lt;/li&gt;
&lt;li&gt;다른 컴포넌트와 Hook 내에서만 사용 가능&lt;/li&gt;
&lt;li&gt;이름은 반드시 &lt;i&gt;use&lt;/i&gt;로 시작&lt;/li&gt;
&lt;li&gt;최상위 level에서만(첫번째 중괄호) hook 호출 가능 ⭐️&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 Hook이 등장했냐면...&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기존에는 컴포넌트 내에서 state와 생명주기를 관리하기 위해서 &lt;b&gt;반드시 클래스형 컴포넌트를 사용&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;다소 복잡한 클래스형 컴포넌트를 보완하고 함수형 컴포넌트에서도 해당 기능을 사용할 수 있도록 이후 추가됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1)State Hook&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;235&quot; data-filename=&quot;스크린샷 2021-10-13 오후 5.24.26.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTaUUP/btrhFyzsYp2/dpAW5eHsQfsKI3MnTqcLV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTaUUP/btrhFyzsYp2/dpAW5eHsQfsKI3MnTqcLV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTaUUP/btrhFyzsYp2/dpAW5eHsQfsKI3MnTqcLV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTaUUP%2FbtrhFyzsYp2%2FdpAW5eHsQfsKI3MnTqcLV0%2Fimg.png&quot; data-origin-width=&quot;1408&quot; data-origin-height=&quot;235&quot; data-filename=&quot;스크린샷 2021-10-13 오후 5.24.26.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;useState: 컴포넌트 내 &lt;u&gt;동적인 데이터&lt;/u&gt;를 관리할 수 있는 hook&lt;/li&gt;
&lt;li&gt;state는 읽기전용! 직접 수정 금지&lt;/li&gt;
&lt;li&gt;state를 변경할 때는 꼭 setState 이용하기, 이 때 자동으로 컴포넌트가 재렌더링 됨&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;(2)Effect Hook&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;178&quot; data-filename=&quot;스크린샷 2021-10-13 오후 5.28.42.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dH8gCo/btrhAfnFhDm/oTu1YZAwUHseIdi2TRWEzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dH8gCo/btrhAfnFhDm/oTu1YZAwUHseIdi2TRWEzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dH8gCo/btrhAfnFhDm/oTu1YZAwUHseIdi2TRWEzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdH8gCo%2FbtrhAfnFhDm%2FoTu1YZAwUHseIdi2TRWEzK%2Fimg.png&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;178&quot; data-filename=&quot;스크린샷 2021-10-13 오후 5.28.42.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;side effect: 컴포넌트 안에서 데이터를 가져오거나 구독하고, DOM을 직접 조작하는 작업을 이전에도 종종 해보셨을 것입니다. 우리는 이런 모든 동작을 &amp;ldquo;side effects&amp;rdquo;(또는 짧게 &amp;ldquo;effects&amp;rdquo;)라고 합니다. 왜냐하면 이것은 다른 컴포넌트에 영향을 줄 수도 있고, 렌더링 과정에서는 구현할 수 없는 작업이기 때문입니다.&quot;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트가 최초로 렌더링될 때, 지정한 state나 props가 변경될 때 마다 이펙트 콜백 함수가 호출됨&lt;/li&gt;
&lt;li&gt;Deps: 변경을 감지할 변수들의 집합(배열)&lt;/li&gt;
&lt;li&gt;EffectCallback: Deps에 지정된 변수가 변경될 때 실행할 함수&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.reactjs.org/docs/hooks-overview.html#effect-hook&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ko.reactjs.org/docs/hooks-overview.html#effect-hook&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;예시 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1634114160277&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;useEffect(() =&amp;gt; {
	console.log(`버튼을 ${count}회 클릭했습니다.`)
}, [count])&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1634114311000&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const App = () =&amp;gt; {
	useEffect(() =&amp;gt; {
    	    const intervalId = setInterval(() =&amp;gt; {
        	console.log(&quot;안녕하세요&quot;);
        }, 1000);
        
        return () =&amp;gt; {
        	clearInterval(intervalId);
        }
    }, [])
....&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;deps에 넘겨진 값이 없어도 컴포넌트가 생성될 때 한번은 실행이 됨(➡️ 컴포넌트가 생성될 때 한번만 실행해줘!)&lt;/li&gt;
&lt;li&gt;useEffect의 이펙트 함수 내에서 다른 함수를 return할 경우 state가 변경되어 컴포넌트가 다시 렌더링 되기 전과 컴포넌트가 소멸할 때 호출할 함수를 지정하게 됨&lt;/li&gt;
&lt;li&gt;컴포넌트를 재렌더링 하기 전에, 컴포넌트가 없어질 때 clearInterval 함수 실행&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;(3) 그 외의 Hook&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;① useMemo&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;52&quot; data-filename=&quot;스크린샷 2021-10-13 오후 6.24.43.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/egy7zx/btrhANqLfMw/hoJ9o73bnR1rlIKDYY69MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/egy7zx/btrhANqLfMw/hoJ9o73bnR1rlIKDYY69MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/egy7zx/btrhANqLfMw/hoJ9o73bnR1rlIKDYY69MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fegy7zx%2FbtrhANqLfMw%2FhoJ9o73bnR1rlIKDYY69MK%2Fimg.png&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;52&quot; data-filename=&quot;스크린샷 2021-10-13 오후 6.24.43.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지정한 state나 props가 변경될 경우 해당값을 활용해 계산된 값을 메모이제이션하여 재렌더링시 불필요한 연산을 줄여줌(변수 메모)&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;② useCallback&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;260&quot; data-filename=&quot;스크린샷 2021-10-13 오후 6.26.08.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oMLYR/btrhA2aGRDH/gdKKyEmRnsqawbj126i120/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oMLYR/btrhA2aGRDH/gdKKyEmRnsqawbj126i120/img.png&quot; data-alt=&quot;&amp;amp;amp;nbsp;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oMLYR/btrhA2aGRDH/gdKKyEmRnsqawbj126i120/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoMLYR%2FbtrhA2aGRDH%2FgdKKyEmRnsqawbj126i120%2Fimg.png&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;260&quot; data-filename=&quot;스크린샷 2021-10-13 오후 6.26.08.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;&amp;nbsp;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수를 메모이제이션하기 위해 사용하는 hook&lt;/li&gt;
&lt;li&gt;컴포넌트가 재렌더링 될 때 불필요하게 함수가 다시 생성되는 것을 방지&lt;/li&gt;
&lt;li&gt;useMemo(() =&amp;gt; fn, deps) 와 useCallback(fn, deps)는 같음&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;③ useRef&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;66&quot; data-filename=&quot;스크린샷 2021-10-13 오후 6.26.31.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbcEfj/btrhFRlrYkk/T4kN9dvC1o4j6EiOfjQvX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbcEfj/btrhFRlrYkk/T4kN9dvC1o4j6EiOfjQvX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbcEfj/btrhFRlrYkk/T4kN9dvC1o4j6EiOfjQvX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbcEfj%2FbtrhFRlrYkk%2FT4kN9dvC1o4j6EiOfjQvX1%2Fimg.png&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;66&quot; data-filename=&quot;스크린샷 2021-10-13 오후 6.26.31.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트 생명 주기 내에서 유지할 ref 객체를 반환&lt;/li&gt;
&lt;li&gt;다시 렌더링 되지 않아야 할 객체가 있을 때 사용&lt;/li&gt;
&lt;li&gt;ref 객체는 .current라는 프로퍼티를 가지며 이 값을 자유롭게 변경할 수 있음&lt;/li&gt;
&lt;li&gt;useRef에 의해 반환된 ref 객체가 변경되어도 &lt;b&gt;컴포넌트는 재렌더링 되지 않음&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;일반적으로 리액트에서 Dom Element에 접근할 때 사용&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>Til</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/118</guid>
      <comments>https://bsscl.tistory.com/118#entry118comment</comments>
      <pubDate>Wed, 13 Oct 2021 00:23:51 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 03-04-01 ~03-04-02 React 기초 2</title>
      <link>https://bsscl.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TIL은 오늘 하루&amp;nbsp;새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. Props&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;449&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.25.41.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCJq9Q/btrheYNmOyR/iFtAvIcKK06tyzafkR7QC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCJq9Q/btrheYNmOyR/iFtAvIcKK06tyzafkR7QC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCJq9Q/btrheYNmOyR/iFtAvIcKK06tyzafkR7QC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCJq9Q%2FbtrheYNmOyR%2FiFtAvIcKK06tyzafkR7QC0%2Fimg.png&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;449&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.25.41.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트에 원하는 값을 넘겨줄 때 사용&lt;/li&gt;
&lt;li&gt;Javascript의 요소라면 모두 넘겨줄 수 있음(ex: 변수, 함수, 객체, 배열 등)&lt;/li&gt;
&lt;li&gt;주로 &lt;i&gt;컴포넌트의 재사용&lt;/i&gt;을 위해 사용&lt;/li&gt;
&lt;li&gt;컴포넌트에 많은 로직이 들어가고 반환되는 jsx의 요소들이 많고 복잡하다면 props를 사용하는게 효율적&lt;/li&gt;
&lt;li&gt;&lt;b&gt;props는 읽기 전용⭐️&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;324&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.31.28.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLkK49/btrhfyU98Hf/6tF8L32xm3UvYOuSt3Bde0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLkK49/btrhfyU98Hf/6tF8L32xm3UvYOuSt3Bde0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLkK49/btrhfyU98Hf/6tF8L32xm3UvYOuSt3Bde0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLkK49%2FbtrhfyU98Hf%2F6tF8L32xm3UvYOuSt3Bde0%2Fimg.png&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;324&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.31.28.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;왼쪽처럼 props의 값을 직접 변경할 경우 리액트가 재렌더링하는데 문제가 생길 수 있음&lt;/li&gt;
&lt;li&gt;오른쪽처럼 새 변수를 생성해 복제해서 사용합쉬다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1347&quot; data-origin-height=&quot;138&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.38.54.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhkkB4/btrhlARXN2k/1lwzfwcuSsjGtxuagcmy90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhkkB4/btrhlARXN2k/1lwzfwcuSsjGtxuagcmy90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhkkB4/btrhlARXN2k/1lwzfwcuSsjGtxuagcmy90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhkkB4%2FbtrhlARXN2k%2F1lwzfwcuSsjGtxuagcmy90%2Fimg.png&quot; data-origin-width=&quot;1347&quot; data-origin-height=&quot;138&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.38.54.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML에서의 checked, value ➡️ 초기값&lt;/li&gt;
&lt;li&gt;리액트에서는 &lt;b&gt;현재값&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;초기값을 지정하고 싶다면&lt;b&gt; defaultChecked, defaultValue &lt;/b&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;size18&quot;&gt;&lt;b&gt;2. State&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴포넌트 내에서 유동적으로 변할 수 있는 값을 저장&lt;/li&gt;
&lt;li&gt;state 값이 변경되고 재렌더링이 필요한 경우 리액트가 자동으로 계산하여 변경된 부분을 렌더링&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;617&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.45.05.png&quot; width=&quot;643&quot; height=&quot;482&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czCLIc/btrhqfmfpiN/ixzPPcId95VUEIpuoQqS50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czCLIc/btrhqfmfpiN/ixzPPcId95VUEIpuoQqS50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czCLIc/btrhqfmfpiN/ixzPPcId95VUEIpuoQqS50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczCLIc%2FbtrhqfmfpiN%2FixzPPcId95VUEIpuoQqS50%2Fimg.png&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;617&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.45.05.png&quot; width=&quot;643&quot; height=&quot;482&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그렇기 때문에 이런식으로 state 값을 직접 변경하게 되는건 리액트는 못 참는다,,,(오류는 안남)&lt;/li&gt;
&lt;li&gt;➡️ 리액트가 다시 렌더링할 타이밍을 적절하게 잡을 수 있도록 setState 함수를 사용하자(재렌더링 명령)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;state를 변경하는 두 가지 방법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;364&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.54.50.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDKlg1/btrhqgZLC8P/xsF2IecebHP5hFH3M2zt2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDKlg1/btrhqgZLC8P/xsF2IecebHP5hFH3M2zt2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDKlg1/btrhqgZLC8P/xsF2IecebHP5hFH3M2zt2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDKlg1%2FbtrhqgZLC8P%2FxsF2IecebHP5hFH3M2zt2K%2Fimg.png&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;364&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.54.50.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) setState 함수에 변경할 값 직접 넣기&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;넣은 값으로 state 값 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) setState에 함수 넣기⭐️&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;으로 state 변경(현재값 기반으로 state 변경하는 경우 권장)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;object를 갖는 state를 만들 때 주의 사항⭐️&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;기존 객체의 내용을 새로운 object에 담고 해당 내용을 변경한다 (헷갈리면 물류창고 비유)&lt;/li&gt;
&lt;li&gt;전자의 경우 인식 및 재렌더링 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;530&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.59.32.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmNvR/btrhglBjA7c/2CKA5K4SuYKtRnOhkU1zfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmNvR/btrhglBjA7c/2CKA5K4SuYKtRnOhkU1zfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmNvR/btrhglBjA7c/2CKA5K4SuYKtRnOhkU1zfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwmNvR%2FbtrhglBjA7c%2F2CKA5K4SuYKtRnOhkU1zfk%2Fimg.png&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;530&quot; data-filename=&quot;스크린샷 2021-10-11 오후 5.59.32.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;size18&quot;&gt;&lt;b&gt;3. 이벤트&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;웹 브라우저가 알려주는 HTML 요소에 대한 사건의 발생&lt;/li&gt;
&lt;li&gt;evenet object의 target은 이벤트의 원인이 되는 element를 가리킴(ex: e.target.value)&lt;/li&gt;
&lt;li&gt;object의 key를 동적으로 할당하는 방법
&lt;pre id=&quot;code_1633958852539&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const App = () =&amp;gt; {
	const [user, setUser] = useState({ name: &quot;민수&quot;, school: &quot;피자스쿨&quot;});
	
    const handleChange = (e) =&amp;gt; {
    	const { name, value } = e.target;
        const newUser = { ...user };
        newUser[name] = value;
        setUser(newUser);
    };
    
    return (
    	&amp;lt;div&amp;gt;
        	&amp;lt;input name=&quot;name&quot; onChange={handleChange} value={user.name} /&amp;gt;
            &amp;lt;br /&amp;gt;
            &amp;lt;input name=&quot;school&quot; onChange={handleChange} value={user.school} /&amp;gt;
            &amp;lt;p&amp;gt; {user.name} 님은 {user.school}에 재학중입니다. &amp;lt;/p&amp;gt;
        &amp;lt;/div&amp;gt;
    );
};​&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;이벤트 작명: on+동사 / on+명사+동사&lt;/li&gt;
&lt;li&gt;핸들링 함수 작명: handle+동사 / handle+명사+동사&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>Til</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/117</guid>
      <comments>https://bsscl.tistory.com/117#entry117comment</comments>
      <pubDate>Mon, 11 Oct 2021 17:19:32 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 211006 TIL</title>
      <link>https://bsscl.tistory.com/116</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;오늘은 7일인데 왜 6일자 TIL을 이제서야 올리냐면...흠흠&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;TIL은 오늘 하루&amp;nbsp;새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;리액트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: justify;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. SPA(Single Page Application)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;379&quot; data-filename=&quot;스크린샷 2021-10-07 오후 7.35.11.png&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4PEm4/btrg2MM4DXN/FZEWlvPE8MmHXtdHA11JT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4PEm4/btrg2MM4DXN/FZEWlvPE8MmHXtdHA11JT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4PEm4/btrg2MM4DXN/FZEWlvPE8MmHXtdHA11JT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4PEm4%2Fbtrg2MM4DXN%2FFZEWlvPE8MmHXtdHA11JT0%2Fimg.png&quot; data-origin-width=&quot;1354&quot; data-origin-height=&quot;379&quot; data-filename=&quot;스크린샷 2021-10-07 오후 7.35.11.png&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 전통적인 페이지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;서버에 특정 동작(ex: 로그인)을 요청 - 서버에서 HTML을 클라이언트에게 전달하면서 페이지 리로드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) SPA 페이지&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;JSON 형식으로 메세지만 서버로부터 받은 뒤 로그인 후에 바뀌어야 할 부분만 바뀌게 됨(ex: 로그인 -&amp;gt; 로그아웃 버튼)&lt;/li&gt;
&lt;li&gt;페이지의 변경이 필요할 때 처음부터 모든 HTML을 불러오는게 아닌 변경된 부분만 바뀌게 된다.&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;2.&amp;nbsp; Virtual DOM&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;가상적인 표현을 메모리에 저장하고 ReactDOM과 같은 라이브러리에 의해 실제 DOM과 동기화하는 프로그래밍 개념&lt;/li&gt;
&lt;li&gt;React에서는 뒤에서 먼저 그려보고 사용자가 현재 보고있는 화면과 비교해 바뀐 부분만 새로 그려줌&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;최신 JavaScript 문법&lt;/b&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;b&gt;1. Destructuring assignment(구조 분해 할당)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체나 배열을 해체하여 개별 변수에 담을 수 있게 하는 표현식&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1633605845076&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const a = {i: 1, j: 2, k: 3};
const {i, j, k } = a; //객체 해체

const b = [1, 2, 3];
const [c, d, e] = b; //배열 해체&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;b&gt;2. Shorthand property names&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;새로 선언하는 object에 key값과 동일한 변수명을 가진 변수를 할당할 경우 value 값 생략 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1633605992154&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const username = &quot;율리아&quot;
const age = 17;
const school = &quot;피자스쿨&quot;

const person = {username, age, school}
//원래는 username: username, age: age ...&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;b&gt;3. Optional chaining&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체나 변수에 연결된 다른 속성을 참조할 때 유효한 속성인지 검사하지 않고 값을 읽을 수 있게 해줌&lt;/li&gt;
&lt;li&gt;-&amp;gt; 유효한 속성이 아닐경우 에러 대신 undefined를 반환하기 때문&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1633606309893&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//객체
const x = a?.b?.c;
//a 안에 b라는 속성이 없어도 에러가 뜨지 않음 (-&amp;gt; undefined 반환)

//배열
const y = arr?.[index]&lt;/code&gt;&lt;/pre&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>JavaScript</category>
      <category>react</category>
      <category>Til</category>
      <category>리액트</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <category>자바스크립트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/116</guid>
      <comments>https://bsscl.tistory.com/116#entry116comment</comments>
      <pubDate>Thu, 7 Oct 2021 19:31:52 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 02-03-03 자바스크립트 2 (사실 제이쿼리 소개)</title>
      <link>https://bsscl.tistory.com/115</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 제이쿼리 선택자&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633452676809&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(&quot;h1&quot;)
$(&quot;#title&quot;)
$(&quot;.article&quot;)
$(&quot;~~~&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 제이쿼리 이벤트&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633452969356&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$(&quot;h1&quot;).mouseenter // 요소의 경계 밖에서 안으로 마우스가 들어올 때
$(&quot;h1&quot;).mouseleave // 요소의 경계 안에서 밖으로 마우스가 나갈 때
$(&quot;h1&quot;).click // 마우스를 클릭할 때


$(&quot;h1&quot;).hide() // display 속성을 none으로 (감춤)
$(&quot;h1&quot;).show() // display 속성을 block으로 (보이게)
$(&quot;h1&quot;).toggle() //현재 상태의 반대로

$(&quot;h1&quot;).fadeOut() // 선택한 요소가 서서히 사라지게
$(&quot;h1&quot;).fadeIn() //선택한 요소를 서서히 나타나게
$(&quot;h1&quot;).fadeToggle() // 서서히 현재 상태의 반대로

$(&quot;h1&quot;).addClass() //선택한 요소의 클래스를 추가
$(&quot;h1&quot;).removeClass() //선택한 요소의 클래스를 삭제
$(&quot;h1&quot;).hasClass() // 선택한 요소에 클래스가 있는지 확인&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;b&gt;3. this&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;540&quot; data-filename=&quot;스크린샷 2021-10-06 오전 1.56.49.png&quot; width=&quot;439&quot; height=&quot;225&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SQjsI/btrgRL73PN5/lzEGi6oLyxwVEHq4VCU2S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SQjsI/btrgRL73PN5/lzEGi6oLyxwVEHq4VCU2S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SQjsI/btrgRL73PN5/lzEGi6oLyxwVEHq4VCU2S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSQjsI%2FbtrgRL73PN5%2FlzEGi6oLyxwVEHq4VCU2S0%2Fimg.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;540&quot; data-filename=&quot;스크린샷 2021-10-06 오전 1.56.49.png&quot; width=&quot;439&quot; height=&quot;225&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;(1) 정의&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 영역에 이벤트를 적용할 때 this는 선택된 영역만 의미&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;(2) 적용 방법&lt;/p&gt;
&lt;pre id=&quot;code_1633453165815&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var $rabbit_icon = $(&quot;.rabbit_icon&quot;);

$rabbit_icon.click(function() {
	$(this).....
})&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>jQeury</category>
      <category>web</category>
      <category>Wil</category>
      <category>엘리스 AI트랙</category>
      <category>웹</category>
      <category>제이쿼리</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/115</guid>
      <comments>https://bsscl.tistory.com/115#entry115comment</comments>
      <pubDate>Wed, 6 Oct 2021 02:00:12 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 02-03-01 ~  02-03-02 자바스크립트 2</title>
      <link>https://bsscl.tistory.com/114</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. DOM(Document Object Mode, 문서 객체 모델)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;546&quot; data-filename=&quot;스크린샷 2021-10-06 오전 1.09.52.png&quot; width=&quot;298&quot; height=&quot;217&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SWN68/btrgOtAmO6m/L0ISBsI5DWgRycB3b6ZxWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SWN68/btrgOtAmO6m/L0ISBsI5DWgRycB3b6ZxWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SWN68/btrgOtAmO6m/L0ISBsI5DWgRycB3b6ZxWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSWN68%2FbtrgOtAmO6m%2FL0ISBsI5DWgRycB3b6ZxWk%2Fimg.png&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;546&quot; data-filename=&quot;스크린샷 2021-10-06 오전 1.09.52.png&quot; width=&quot;298&quot; height=&quot;217&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체 지향 모델로써 구조화된 문서를 표현하는 방식&lt;/li&gt;
&lt;li&gt;트리 구조&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/XML&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;XML&lt;/a&gt;이나 HTML 문서의 프로그래밍 인터페이스&lt;/li&gt;
&lt;li&gt;문서의 구조화된 표현을 제공하여 프로그래밍 언어가 문서 구조, 스타일, 내용 등을 변경할 수 있도록 함&lt;/li&gt;
&lt;li&gt;종류: Core Dom(for 모든 문서 타입), HTML Dom, XML Dom&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) Document 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 페이지를 의미&lt;/li&gt;
&lt;li&gt;웹 페이지에 존재하는 HTML 요소에 접근하고자 할 때는 반드시 Document 객체부터 시작해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) HTML 요소의 선택 - 새로운 HTML 요소 선택을 위해 제공되는 메서드&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 138px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;메서드&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;document.getElementById()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;해당 아이디의 요소를 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;document.getElement&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;s&lt;/b&gt;&lt;/span&gt;ByClassName()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;해당 클래스에 속한 요소를 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;document.getElementsByTagName()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;해당 태그 요소를 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;document.getElement&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;s&lt;/b&gt;&lt;/span&gt;ByName()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;해당 name 속성값을 가지는 요소를 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;document.querySelectorAll()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;해당 선택자로 선택되는 요소를 모두 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;document.querySelector()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;해당 선택자로 선택되는 요소를 1개 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(3) HTML 요소의 생성 - HTML 요소를 생성하기 위해 제공되는 메서드&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메서드&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;document.createElement()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;지정된 HTML 요소를 생성&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;document.write()&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;HTML 출력 스트림을 통해 텍스트를 출력&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;2. Node 객체&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1) 노드의 종류&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문서 노드(document node): HTML 문서 전체를 나타내는 노드&lt;/li&gt;
&lt;li&gt;요소 노드(element node): 모든 HTML 요소는 요소 노드로, 유일하게 속성 노드를 가질 수 있음&lt;/li&gt;
&lt;li&gt;주석 노드(comment node)&lt;/li&gt;
&lt;li&gt;속성 노드(attribute node): 요소 노드에 관한 정보를 가지지만 해당 요소 노드의 자식 노드에는 포함되지 않음&lt;/li&gt;
&lt;li&gt;텍스트 노드(text node)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 노드의 값&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드에 대한 정보는 nodeName(이름), nodeValue(값), nodeType(타입)으로 접근 가능&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;3. 이벤트&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;웹 브라우저가 알려주는 HTML 요소에 대한 사건의 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1633451062774&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;//마우스 클릭 이벤트 예시
&amp;lt;p onclick=&amp;ldquo;changeText(this)&amp;rdquo;/&amp;gt;
// 여기서의 this는 p 태그 자기자신을 의미&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그 외의 메서드&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1633451216363&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 특정 지점으로 스크롤링
window.scrollTo({
	'behavior': 'smooth', // 부드럽게 이동
    'top': xxx.offsetTop
}): // 특정 영역 위에서의 좌표값
  
  
// 애니메이션 실행
zzz.animate({ keyframes }, {
	duration: 500,
    easing: &quot;ease&quot;,
    iterations: 1,
    fill: &quot;both&quot;
 })


// 이전 요소 선택
zzz.previousElementSibling; // &amp;lt;-&amp;gt; zzz.nextElementSibling;

// 부모 요소 선택
zzz.parentElement;

// 첫번째 자식 요소 선택
zzz.firstElementChild; // &amp;lt;-&amp;gt; zzz.lastElementChild;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>JavaScript</category>
      <category>Wil</category>
      <category>엘리스 AI트랙</category>
      <category>자바스크립트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/114</guid>
      <comments>https://bsscl.tistory.com/114#entry114comment</comments>
      <pubDate>Wed, 6 Oct 2021 01:24:42 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 02-02-03 자바스크립트 1</title>
      <link>https://bsscl.tistory.com/113</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 자바스크립트의&lt;b&gt; 데이터 타입&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76.5116%; height: 160px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignCenter&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;String&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;문자열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Number&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;숫자&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Function&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;함수&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_113_1&quot; id=&quot;footnote_link_113_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 113, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(113, 1)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Array&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;배열&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Object&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;객체&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;Boolean&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;불린&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;undefined&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;정의되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;null&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;널&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 배열: 비슷한 성격을 갖고 있는 데이터를 하나의 변수 안에서 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 객체: 프로퍼티, 메서드, 데이터로 구성되어 있으며 여러 종류의 데이터 타입 삽입 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) undefined은 값이 정의되지 않은 것, null은 임의로 빈 데이터를 삽입한 것&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;2. 자바스크립트의 &lt;b&gt;프로퍼티와 메서드&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;a href=&quot;https://www.codeit.kr/community/threads/22083&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.codeit.kr/community/threads/22083&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1633447637128&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩이 처음이라면, 코드잇&quot; data-og-description=&quot;월 3만원대로 Python, JavaScript, HTML/CSS, Java 등 1,600개 이상 프로그래밍 강의를 무제한 수강하세요&quot; data-og-host=&quot;www.codeit.kr:443&quot; data-og-source-url=&quot;https://www.codeit.kr/community/threads/22083&quot; data-og-url=&quot;https://codeit.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bq3tp9/hyLRdMeDv1/NcNBpHa5hozIlF6wBUXaeK/img.png?width=701&amp;amp;height=701&amp;amp;face=0_0_701_701&quot;&gt;&lt;a href=&quot;https://www.codeit.kr/community/threads/22083&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.codeit.kr/community/threads/22083&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bq3tp9/hyLRdMeDv1/NcNBpHa5hozIlF6wBUXaeK/img.png?width=701&amp;amp;height=701&amp;amp;face=0_0_701_701');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코딩이 처음이라면, 코드잇&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;월 3만원대로 Python, JavaScript, HTML/CSS, Java 등 1,600개 이상 프로그래밍 강의를 무제한 수강하세요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.codeit.kr:443&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;document.write()도 있지만 document.write&lt;b&gt;ln&lt;/b&gt;()도 사용 가능 -&amp;gt; &lt;b&gt;공백이 추가됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;==&lt;/b&gt;&amp;nbsp;연산자는 값만 비교하는 반면,&amp;nbsp;&lt;b&gt;===&lt;/b&gt;&amp;nbsp;연산자는 &lt;b&gt;데이터 타입을 우선 비교&lt;/b&gt;한 후, 값을 비교함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol class=&quot;footnotes&quot;&gt;
    &lt;li id=&quot;footnote_113_1&quot;&gt;매개변수(parameter)는 인자로부터 전달받은 값이 들어가는 통로, 인자(argument)는 함수에게 전달하는 데이터 &lt;a href=&quot;#footnote_link_113_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>JavaScript</category>
      <category>Wil</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <category>자바스크립트</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/113</guid>
      <comments>https://bsscl.tistory.com/113#entry113comment</comments>
      <pubDate>Wed, 6 Oct 2021 00:25:02 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 2주차 후기  </title>
      <link>https://bsscl.tistory.com/112</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1주차만 순삭이고 적응됐을 거라고 생각한 2주차...는 더 빨리 지나갔다.......ㅋㅋㅋㅋㅋ&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;저는...엘리스의 밀림의 왕입니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;510&quot; data-filename=&quot;다운로드.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wjqar/btrgXqOSZxR/8JYZNkcaNOD6DEDRG6YKY0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wjqar/btrgXqOSZxR/8JYZNkcaNOD6DEDRG6YKY0/img.jpg&quot; data-alt=&quot;토끼가 놀라고 애벌레가 땅을 치는...내 진도 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wjqar/btrgXqOSZxR/8JYZNkcaNOD6DEDRG6YKY0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwjqar%2FbtrgXqOSZxR%2F8JYZNkcaNOD6DEDRG6YKY0%2Fimg.jpg&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;510&quot; data-filename=&quot;다운로드.jpeg&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;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;2. 코치님들이 각각의 개성이 뚜렷한 느낌이다ㅋㅋㅋ(내 기준) 일단 잘 가르치시는건 당연하고   특히 귀여우신 우리반 코치님...게다가 엄청나게 열정적이시기까지   그래서 공부할게 밀렸다 흑흑 분명 1주차 다 따라잡았었는데...이상하다...( ᵕ̩̩&lt;span&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;3. 재밌는 사람들이 많음 &lt;span&gt;ꉂꉂ&lt;/span&gt;(ᵔ&lt;span&gt;ᗜ&lt;/span&gt;ᵔ*)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 의외의 복병인 제이쿼리...  현업에서는 많이 안쓰인대서 가볍게 하려고는 하는데 그래도 역시 어렵다ㅜㅅㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 제 블로그 어케 아시고 들어오시는건가요,,,,,!&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;살짝 늦은 감이 있지만...3주차도 화이팅 &lt;/p&gt;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/112</guid>
      <comments>https://bsscl.tistory.com/112#entry112comment</comments>
      <pubDate>Mon, 4 Oct 2021 22:44:50 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 01-05-03 웹 프로그래밍 기초 (...근데 이제 리눅스를 곁들인)</title>
      <link>https://bsscl.tistory.com/111</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 정규 표현식&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;// 링크 추가 예정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. grep&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;grep [option]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_111_1&quot; id=&quot;footnote_link_111_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 111, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(111, 1)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt; [pattern]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_111_2&quot; id=&quot;footnote_link_111_2&quot; onmouseover=&quot;tistoryFootnote.show(this, 111, 2)&quot; onmouseout=&quot;tistoryFootnote.hide(111, 2)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;2&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&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;3. File Redirection&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준 스트림의 흐름을 바꾸어 일반적인 표준 입출력 및 오류를 사용하지 않고 다른 경로인 파일로 재지정 하는 것을 의미&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;rarr;&amp;nbsp; 파일로 입력을 받거나 출력을 받을 수 있음&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준 스트림의 종류: stdin(키보드 입력), stdout(화면 출력), stderr(오류 내용 출력) &amp;larr; 문자열로 콘솔에 출력되도록 설정되어 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;gt;&lt;/span&gt; : 표준 출력을 재지정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ls &amp;gt; ls.txt는 ls의 실행 내용을 ls.txt에 저장하겠다는 뜻&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; : 파일이 존재하지 않는다면 파일을 새로 생성하고, 존재한다면 파일내용에 덧붙여서 작성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. mount - &lt;/b&gt;&lt;b&gt;리눅스의 경우 PnP 기능이 없어 사용자가 직접 mount 해야함&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;1) mount 실행 명령어:&lt;b&gt; mount [option]&lt;/b&gt;&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_111_3&quot; id=&quot;footnote_link_111_3&quot; onmouseover=&quot;tistoryFootnote.show(this, 111, 3)&quot; onmouseout=&quot;tistoryFootnote.hide(111, 3)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;3&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&lt;b&gt; [device] [directory]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) mount를 취소하는 명령어: &lt;b&gt;remove [device] [directory]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 현재 mount 된 디스크 정보 출력: &lt;b&gt;df&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;(etc/fstab: mount 설정을 유지시켜주는 설정 파일)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol class=&quot;footnotes&quot;&gt;
    &lt;li id=&quot;footnote_111_1&quot;&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;option&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-i&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;대소문자를 구분하지 않고 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-v&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;패턴과 일치하지 않는 행을 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-c&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;패턴과 일치하는 행의 개수를 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-w&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;패턴과 단어 단위로 매칭 되는 경우만 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;a href=&quot;#footnote_link_111_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_111_2&quot;&gt;패턴의 자리에 정규식을 넣을 수 있음 &lt;a href=&quot;#footnote_link_111_2&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_111_3&quot;&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-a&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;/etc/fstab에 명시된 파일 시스템을 마운트 할 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-t&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;파일 시스템의 유형을 지정, 생략할 시 /ect/fstab 파일 참조&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;-o&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;추가적인 설정을 적용할 때 사용&lt;br /&gt;다수의 조건을 적용할 때는 콤마(,)로 구분&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; &lt;a href=&quot;#footnote_link_111_3&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>git</category>
      <category>Wil</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/111</guid>
      <comments>https://bsscl.tistory.com/111#entry111comment</comments>
      <pubDate>Sat, 25 Sep 2021 17:22:50 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 01-05 -01 ~ 01-05 -02 웹 프로그래밍 기초 (...근데 이제 리눅스를 곁들인)</title>
      <link>https://bsscl.tistory.com/109</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 리눅스의 구조&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;742&quot; data-filename=&quot;스크린샷 2021-09-22 오후 10.36.39.png&quot; width=&quot;558&quot; height=&quot;371&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dueiuz/btrfFFABIzX/pFqOgWmcMxegeNXKQkC41k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dueiuz/btrfFFABIzX/pFqOgWmcMxegeNXKQkC41k/img.png&quot; data-alt=&quot;리눅스의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dueiuz/btrfFFABIzX/pFqOgWmcMxegeNXKQkC41k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdueiuz%2FbtrfFFABIzX%2FpFqOgWmcMxegeNXKQkC41k%2Fimg.png&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;742&quot; data-filename=&quot;스크린샷 2021-09-22 오후 10.36.39.png&quot; width=&quot;558&quot; height=&quot;371&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;b&gt;1) Shell&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널과 사용자 사이를 이어주는 역할 수행&lt;/li&gt;
&lt;li&gt;사용자의 명령을 해석하여 커널에 명령을 전달&lt;/li&gt;
&lt;li&gt;ex) bash, zsh...&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;2. 리눅스 명령어&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 450px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;whoami&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;로그인한 사용자 ID 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;passwd&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;로그인한 사용자의 비밀번호를 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;pwd&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;현재 디렉토리 위치 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;ls&lt;/b&gt; [[-a]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_1&quot; id=&quot;footnote_link_109_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 1)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [-l]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_2&quot; id=&quot;footnote_link_109_2&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 2)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 2)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;2&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [-al]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_3&quot; id=&quot;footnote_link_109_3&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 3)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 3)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;3&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;]&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 20px; text-align: center;&quot;&gt;현재 디렉토리의 목록을 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;&lt;b&gt;cd&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;해당 디렉토리로 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;명령어 &lt;b&gt;--help&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;명령어에 대한 사용 방법 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 60px;&quot;&gt;&lt;b&gt;chmod&lt;/b&gt; 파일권한&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_4&quot; id=&quot;footnote_link_109_4&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 4)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 4)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;4&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&amp;nbsp; 변경할 파일 위치(or 이름)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 60px;&quot;&gt;파일의 권한 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;&lt;b&gt;chown&lt;/b&gt; 소유할 유저:소유할 그룹&amp;nbsp; 소유권 변경하고 싶은 디렉토리(or 파일명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 40px;&quot;&gt;파일의 소유권 변경(root 권한이 있어야 실행 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;mkdir&lt;/b&gt; 생성할 디렉토리 이름(or 디렉토리 경로/디렉토리명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;현재 디렉토리 위치(or 지정한 경로)에 새로운 디렉토리 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;touch&lt;/b&gt; 생성할 파일 이름(or 디렉토리 경로/파일명)&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 20px;&quot;&gt;빈 파일 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;rmdir&lt;/b&gt; 삭제할 디렉토리 이름&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;비어있는&lt;/b&gt; 디렉토리를 삭제(비어있지 않다면 삭제 불가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 80px;&quot;&gt;&lt;b&gt;rm&lt;/b&gt; [[-r]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_5&quot; id=&quot;footnote_link_109_5&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 5)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 5)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;5&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [-f]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_6&quot; id=&quot;footnote_link_109_6&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 6)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 6)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;6&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [-rf]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_7&quot; id=&quot;footnote_link_109_7&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 7)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 7)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;7&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [-i]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_8&quot; id=&quot;footnote_link_109_8&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 8)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 8)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;8&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;] 삭제할 파일 및 디렉토리명&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 80px;&quot;&gt;파일 및 디렉토리 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;cp&lt;/b&gt;[[-r]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_9&quot; id=&quot;footnote_link_109_9&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 9)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 9)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;9&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [-p]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_10&quot; id=&quot;footnote_link_109_10&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 10)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 10)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;10&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;] 대상 위치 및 이름&amp;nbsp; &amp;nbsp;복사하고 싶은 위치&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;파일 및 디렉토리 복사&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;&lt;b&gt;mv&lt;/b&gt; 대상 위치/이름&amp;nbsp; 이동하고 싶은 위치/이름&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 18px;&quot;&gt;이동하고 싶은 위치에 같은 이름의 파일 / 디렉토리명이 존재하지 않을 경우 이동&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 60px;&quot;&gt;&lt;b&gt;cat&lt;/b&gt; [[-n]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_11&quot; id=&quot;footnote_link_109_11&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 11)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 11)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;11&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [&amp;gt;]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_12&quot; id=&quot;footnote_link_109_12&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 12)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 12)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;12&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;, [&amp;gt;&amp;gt;]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_13&quot; id=&quot;footnote_link_109_13&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 13)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 13)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;13&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;]&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 60px;&quot;&gt;파일 내용 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;&lt;b&gt;find &lt;/b&gt;파일 경로 [-name] [파일 이름] [-type d/f]&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_109_14&quot; id=&quot;footnote_link_109_14&quot; onmouseover=&quot;tistoryFootnote.show(this, 109, 14)&quot; onmouseout=&quot;tistoryFootnote.hide(109, 14)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;14&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;지정된 파일 경로에서 이름이 파일 이름인 파일 및 디렉토리를 검색 및 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 패키지 관리자 apt(Advanced Packaging Tool)&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;데비안 리눅스(.dev) 또는 파생된 배포판(우분투)에서 SW를 설치, 제거, 업데이트 할 때 사용&lt;/li&gt;
&lt;li&gt;최신의 우분투 버전에서는 기존 키워드인 apt-get / apt-cache를 합친 apt 키워드 제공&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;4. apt 명령어&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 90px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;apt install 패키지명&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;패키지 설치&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;apt remove 패키지명&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;패키지 제거&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;apt update&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;패키지 정보 업데이트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;apt search 검색어&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;패키지 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;apt show 패키지명&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px; text-align: center;&quot;&gt;패키지 정보 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. root&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리눅스에서 모든 권한을 가지고 있는 최고 관리자를 의미&lt;/li&gt;
&lt;li&gt;&quot;sudo 명령어&quot; 의 방식으로 권한 획득 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. nano 텍스트 에디터&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;1) 실행&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1632324831627&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;nano 편집하려는 파일 이름&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;b&gt;2) 단축키&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Ctrl + O&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;저장하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Ctrl + X&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;종료하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Ctrl + K&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;강조 표시된 영역을 잘라서 클립보드에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Ctrl + U&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;클립보드의 내용을 현재 커서 위치에 붙여넣기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Ctrl + W&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;검색하기&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;Ctrl + Shift + 6&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 18px;&quot;&gt;여러 줄 선택&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol class=&quot;footnotes&quot;&gt;
    &lt;li id=&quot;footnote_109_1&quot;&gt;&lt;b&gt;숨겨진&lt;/b&gt; 파일이나 디렉토리를 포함하여 출력 &lt;a href=&quot;#footnote_link_109_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_2&quot;&gt;현재 디렉토리의 목록을 &lt;b&gt;상세히&lt;/b&gt; 출력 &lt;a href=&quot;#footnote_link_109_2&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_3&quot;&gt;두 옵션을 한꺼번에 적용 &lt;a href=&quot;#footnote_link_109_3&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_4&quot;&gt;&lt;b&gt;읽기(4), 쓰기(2), 실행(1)&lt;/b&gt;로 표현하며 777의 경우 모든 사용자가 모든 권한을 얻음을 의미 &lt;a href=&quot;#footnote_link_109_4&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_5&quot;&gt;디렉토리와 그 하부 파일까지 삭제 &lt;a href=&quot;#footnote_link_109_5&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_6&quot;&gt;삭제 여부를 묻지 않고 바로 삭제 &lt;a href=&quot;#footnote_link_109_6&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_7&quot;&gt;r옵션 + f 옵션 &lt;a href=&quot;#footnote_link_109_7&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_8&quot;&gt;삭제할 것인지 확인함 &lt;a href=&quot;#footnote_link_109_8&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_9&quot;&gt;하위 디렉토리와 파일 전체를 복사 &lt;a href=&quot;#footnote_link_109_9&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_10&quot;&gt;소유주, 그룹, 권한, 시간 정보를 그대로 복사 &lt;a href=&quot;#footnote_link_109_10&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_11&quot;&gt;왼쪽에 줄 번호와 함께 내용을 출력 &lt;a href=&quot;#footnote_link_109_11&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_12&quot;&gt;파일의 내용을 덮어씀 &lt;a href=&quot;#footnote_link_109_12&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_13&quot;&gt;파일의 내용이 있다면 뒤에 내용을 추가함 &lt;a href=&quot;#footnote_link_109_13&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
    &lt;li id=&quot;footnote_109_14&quot;&gt;find . -&amp;gt; 현재 디렉토리의 모든 파일 출력 &lt;a href=&quot;#footnote_link_109_14&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>Linux</category>
      <category>web</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <category>웹</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/109</guid>
      <comments>https://bsscl.tistory.com/109#entry109comment</comments>
      <pubDate>Thu, 23 Sep 2021 00:44:41 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 엘리스 3기 1주차 후기  </title>
      <link>https://bsscl.tistory.com/110</link>
      <description>&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;p data-ke-size=&quot;size16&quot;&gt;1. 열정맨 인 사람들이 아주 많다...!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수업도 다들 열심히 듣는다는게 느껴지고 무엇보다 내 작고 하찮은 질문도 왜 저런 질문을,,,이 아닌 친절하신 말투로 다들 어디선가 달려와서 대답해주심  나도 더 열심히 해야겠다는 생각이 자연스럽게 든다 그리고 자기가 알게된 사실을 공유해주는 사람들이 많아서 배움의 깊이가 더 깊어지는 느낌? 언젠가 나도 내가&lt;b&gt; *&lt;b&gt;멋지게*&lt;/b&gt;&lt;/b&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;2. 공부 분량이...많다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OT때 7시간을 채울수 있는 공부량을 준다는게...과장이 아니였음...^^ 물론 공부할게 적은것보다는 많은게 좋으니까 좋긴하다만...아모튼 많음 더 열심히 해야 따라갈수 있을듯...이번주는 백신맞고 첫 알바가고해서 더 뒤쳐졌는데 다행히 전에 배웠던 부분이 아직 많이 나와서 버틸수 있었다 다음주...밀리지 말아야 살아남을수 있을것같은 느낌적인 늑김ㅎㅅㅠ&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-origin-width=&quot;376&quot; data-origin-height=&quot;380&quot; data-filename=&quot;스크린샷 2021-09-22 오후 11.28.33.png&quot; width=&quot;174&quot; height=&quot;176&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MOqPr/btrfuOeyYk9/zYlDwypz2yDAEJUAIU1iF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MOqPr/btrfuOeyYk9/zYlDwypz2yDAEJUAIU1iF1/img.png&quot; data-alt=&quot;너 이름이 대체 뭐야&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MOqPr/btrfuOeyYk9/zYlDwypz2yDAEJUAIU1iF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMOqPr%2FbtrfuOeyYk9%2FzYlDwypz2yDAEJUAIU1iF1%2Fimg.png&quot; data-origin-width=&quot;376&quot; data-origin-height=&quot;380&quot; data-filename=&quot;스크린샷 2021-09-22 오후 11.28.33.png&quot; width=&quot;174&quot; height=&quot;176&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;3. 그래서 이 토끼 이름은 백점토끼인가 흰색토끼인가 사실 분홍색인데 흰색토끼인건 말이 안된다   .oO(?)&lt;/p&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;</description>
      <category>elice/ </category>
      <category>elice</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/110</guid>
      <comments>https://bsscl.tistory.com/110#entry110comment</comments>
      <pubDate>Wed, 22 Sep 2021 23:33:05 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 01-04 웹 프로그래밍 기초</title>
      <link>https://bsscl.tistory.com/108</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #f6e199;&quot;&gt;[01-04] 9 / 17&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;b&gt;1. 모바일 &amp;lt;meta&amp;gt; 태그&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1632313595705&quot; class=&quot;html xml&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;name=&quot;viewport&quot; content=&quot;width=device-width&quot; : 보고 있는 기기 화면에 맞게 콘텐츠의 크기를 조정'&lt;/li&gt;
&lt;li&gt;content=&quot;initial-scale=1.0&quot;:&amp;nbsp; 실제 비율&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&amp;nbsp;&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;2. position - 2차원과 3차원의 차이 &lt;span style=&quot;color: #f3c000;&quot;&gt;&lt;b&gt;★ // 상속되지 않는다&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;634&quot; data-filename=&quot;스크린샷 2021-09-22 오후 7.14.31.png&quot; width=&quot;620&quot; height=&quot;274&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MtkD0/btrfG1J2CJl/h87aQCNPHPHxAOqS3RRnH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MtkD0/btrfG1J2CJl/h87aQCNPHPHxAOqS3RRnH0/img.png&quot; data-alt=&quot;2차원과 3차원을 결정짓는 position&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MtkD0/btrfG1J2CJl/h87aQCNPHPHxAOqS3RRnH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMtkD0%2FbtrfG1J2CJl%2Fh87aQCNPHPHxAOqS3RRnH0%2Fimg.png&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;634&quot; data-filename=&quot;스크린샷 2021-09-22 오후 7.14.31.png&quot; width=&quot;620&quot; height=&quot;274&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;2차원과 3차원을 결정짓는 position&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 74px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 53.9147%; height: 20px; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 24.7286%; height: 20px; text-align: center;&quot;&gt;2차원&lt;/td&gt;
&lt;td style=&quot;width: 21.3566%; height: 20px; text-align: center;&quot;&gt;3차원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 53.9147%; height: 18px; text-align: center;&quot;&gt;부모-자식 사이 margin 병합 현상 발생?&lt;/td&gt;
&lt;td style=&quot;width: 24.7286%; height: 18px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 21.3566%; height: 18px; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 53.9147%; height: 18px; text-align: center;&quot;&gt;top, left, right, bottom&lt;br /&gt;(어느 위치에 위치시킬건지 직접 지정)&lt;/td&gt;
&lt;td style=&quot;width: 24.7286%; height: 18px; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 21.3566%; height: 18px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 53.9147%; height: 18px; text-align: center;&quot;&gt;자식의 높이값이 부모의 높이값에 영향?&lt;br /&gt;(전제조건: 부모가 높이값을 갖고있지 않음)&lt;/td&gt;
&lt;td style=&quot;width: 24.7286%; height: 18px; text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 21.3566%; height: 18px; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 53.9147%; text-align: center;&quot;&gt;z-index 속성 사용 가능?&lt;/td&gt;
&lt;td style=&quot;width: 24.7286%; text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 21.3566%; text-align: center;&quot;&gt;O&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;&lt;span style=&quot;color: #333333;&quot;&gt;1) static&lt;/span&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;position 속성의 기본값&lt;/li&gt;
&lt;li&gt;따로 값을 지정하지 않은 경우 static이 적용&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;2) relative&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;2차원과 3차원의 특징을 모두 갖고 있음&lt;/li&gt;
&lt;li&gt;static이었을 때의 위치(원래 위치)를 기준으로 위치 설정&lt;/li&gt;
&lt;li&gt;&amp;rarr;top, bottom, left, right 속성을 주지 않았다면 static의 위치와 같음&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;3) absolute&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 엘리먼트와는 독립된 배치를 가진다&lt;/li&gt;
&lt;li&gt;mdn 문서에서는...&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;absolute는 요소를 일반적인 문서 흐름에서 제거하고, 페이지 레이아웃에 공간도 배정하지 않습니다. 대신 가장 가까운 위치 지정 조상 요소에 대해 상대적으로 배치합니다. 단, 조상 중 위치 지정 요소가 없다면 초기&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/Containing_block&quot;&gt;컨테이닝 블록&lt;/a&gt;을 기준으로 삼습니다. 최종 위치는&amp;nbsp;top,&amp;nbsp;right,&amp;nbsp;bottom,&amp;nbsp;left&amp;nbsp;값이 지정합니다.&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/z-index&quot;&gt;z-index&lt;/a&gt;의 값이&amp;nbsp;auto가 아니라면 새로운&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context&quot;&gt;쌓임 맥락&lt;/a&gt;을 생성합니다. 절대 위치 지정 요소의 바깥 여백은 서로&amp;nbsp;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing&quot;&gt;상쇄&lt;/a&gt;되지 않습니다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends2&quot; data-emoticon-name=&quot;053&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/053.png&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends2/large/053.png&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;롸?&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;JjJmMaO&quot; data-editable=&quot;true&quot; data-user=&quot;jsg_8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen by JULIE (&lt;a href=&quot;https://codepen.io/jsg_8&quot;&gt;@jsg_8&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&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;&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;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&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 style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(parent와 grandparent의 position 요소를 수정해보세요! (&lt;span&gt;◞&lt;/span&gt;&lt;span&gt;ꈍ&lt;/span&gt;&amp;nabla;&lt;span&gt;ꈍ&lt;/span&gt;)&lt;span&gt;◞⋆&lt;/span&gt;**)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;absolute는&lt;b&gt; position 요소가 static이 아닌 부모&lt;/b&gt;(relative, fixed 등...)를 기준으로 위치&lt;/li&gt;
&lt;li&gt;부모가 static이라면 그 위에 있는 부모님(?) 조부모님(...??) 아무튼 이런식으로 끝(body)까지 찾아 올라감&lt;/li&gt;
&lt;li&gt;&amp;nbsp;body도 static이라면 그냥 body를 기준으로 함...^^&lt;/li&gt;
&lt;li&gt;아모튼 absolute는 조건에 맞는 태그를 기준으로 위치 (스크롤하면 이동)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; 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) fixed&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모의 속성에 상관없이 화면에서 절대적인 위치를 가짐(스크롤해도 그 자리에 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 그 외의 속성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) z-index&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;숫자가 큰 순서대로 위에 위치 (포토샵 레이어 느낌으로 쌓임)&lt;/li&gt;
&lt;/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;2) background-size&lt;/b&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-origin-width=&quot;857&quot; data-origin-height=&quot;407&quot; data-filename=&quot;스크린샷 2021-09-22 오후 9.04.03.png&quot; width=&quot;509&quot; height=&quot;242&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cttTWT/btrfzlbKoaz/SkmszavikZS5o0Db8kICkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cttTWT/btrfzlbKoaz/SkmszavikZS5o0Db8kICkk/img.png&quot; data-alt=&quot;background-size 속성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cttTWT/btrfzlbKoaz/SkmszavikZS5o0Db8kICkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcttTWT%2FbtrfzlbKoaz%2FSkmszavikZS5o0Db8kICkk%2Fimg.png&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;407&quot; data-filename=&quot;스크린샷 2021-09-22 오후 9.04.03.png&quot; width=&quot;509&quot; height=&quot;242&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;background-size 속성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;contain: 배경 이미지 비율에 맞춰서(빈 공간 발생할 수 있음) 적용&lt;/li&gt;
&lt;li&gt;cover: 배경을 꽉 채울 수 있도록 확대해서 적용&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;3) background-attachment&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배경 이미지의 스크롤 여부 결정&lt;/li&gt;
&lt;li&gt;scroll: 배경이랑 이미지랑 같이 움직임(평범한 상황)&lt;/li&gt;
&lt;li&gt;fixed: 스크롤해도 이미지는 그 자리에 가만히 있음&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;4) y축 중앙 정렬 방법&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1632312433978&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;... {
	top: 50%; /* 3차원 position만 가능 */
    	transform: translateY(-50%);
}&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;b&gt;5) 배경 이미지 슬라이드 적용하기 - Full Clip 플러그인(jQuary 사용)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/bdimitrovski/full_clip&quot;&gt;https://github.com/bdimitrovski/full_clip&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1632312557482&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - bdimitrovski/full_clip: Full Clip  - fullscreen body background image jQuery plugin&quot; data-og-description=&quot;Full Clip - fullscreen body background image jQuery plugin - GitHub - bdimitrovski/full_clip: Full Clip - fullscreen body background image jQuery plugin&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/bdimitrovski/full_clip&quot; data-og-url=&quot;https://github.com/bdimitrovski/full_clip&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/EoI9Y/hyLFFJIHBJ/gDjrWaejZklmWKiuVGfdp0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/bdimitrovski/full_clip&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/bdimitrovski/full_clip&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/EoI9Y/hyLFFJIHBJ/gDjrWaejZklmWKiuVGfdp0/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - bdimitrovski/full_clip: Full Clip - fullscreen body background image jQuery plugin&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Full Clip - fullscreen body background image jQuery plugin - GitHub - bdimitrovski/full_clip: Full Clip - fullscreen body background image jQuery plugin&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6) box-shadow&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 116px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;음수&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;문법 요소&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;양수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;왼쪽에 그림자가 만들어짐(가로)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;offset-x&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;오른쪽에 그림자가 만들어짐(가로)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;위쪽에 그림자가 만들어짐(세로)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;offset-y&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;아래쪽에 그림자가 만들어짐(세로)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;-&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;blur-radius&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 20px;&quot;&gt;값이 클 수록 흐려짐&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;그림자의 크기가 작아짐&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;spread-radius&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 18px;&quot;&gt;그림자의 크기가 커짐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot; colspan=&quot;2&quot;&gt;그 외의 문법 요소&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;color&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;색 이름 / 색 코드 / rgb(r, g, b) / rgba(r, g, b, 불투명도) 등&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;inset&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;안 쪽에 그림자 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;initial&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;기본값(none)으로 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;iniherit&lt;/td&gt;
&lt;td style=&quot;width: 50%;&quot;&gt;부모 요소로부터 프로퍼티를 상속받음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;codepen&quot; style=&quot;height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;&quot; data-height=&quot;300&quot; data-default-tab=&quot;html,result&quot; data-slug-hash=&quot;eYRPMYP&quot; data-editable=&quot;true&quot; data-user=&quot;jsg_8&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;See the Pen by JULIE (&lt;a href=&quot;https://codepen.io/jsg_8&quot;&gt;@jsg_8&lt;/a&gt;) on &lt;a href=&quot;https://codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;
&lt;script src=&quot;https://cpwebassets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>web</category>
      <category>Wil</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <category>웹</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/108</guid>
      <comments>https://bsscl.tistory.com/108#entry108comment</comments>
      <pubDate>Wed, 22 Sep 2021 18:40:06 +0900</pubDate>
    </item>
    <item>
      <title>[엘리스 AI트랙] 01-01 ~ 01-03 웹 프로그래밍 기초</title>
      <link>https://bsscl.tistory.com/107</link>
      <description>&lt;blockquote data-ke-style=&quot;style3&quot;&gt;WIL은 한 주간 새롭게 알게 된 내용 위주로 작성하고 있어요 ✏️&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #f6e199;&quot;&gt;[01-01] 9 / 14&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;□&amp;nbsp;실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;□&amp;nbsp;배포&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 인터넷과 웹의 차이점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;웹은 인터넷의 부분집합&lt;/li&gt;
&lt;li&gt;인터넷이 도로라면, 웹은 그 위에 달리는 자동차&lt;/li&gt;
&lt;li&gt;웹은 인터넷에서 운영되는 하나의 앱&lt;/li&gt;
&lt;/ul&gt;
&lt;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. 클라우드와 호스팅은 본질적으로는 같다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #f6e199;&quot;&gt;[01-02] 9 / 15&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;b&gt;1. Emmet&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;HTML 단축 플러그인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #f6e199;&quot;&gt;[01-03] 9 / 16&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 박스 모델&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;960&quot; data-filename=&quot;스크린샷 2021-09-22 오후 7.17.09.png&quot; width=&quot;553&quot; height=&quot;389&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADuP4/btrfBqX9dA4/7nKMEZPCazJ6oUQl2n54ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADuP4/btrfBqX9dA4/7nKMEZPCazJ6oUQl2n54ak/img.png&quot; data-alt=&quot;박스 모델의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADuP4/btrfBqX9dA4/7nKMEZPCazJ6oUQl2n54ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADuP4%2FbtrfBqX9dA4%2F7nKMEZPCazJ6oUQl2n54ak%2Fimg.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;960&quot; data-filename=&quot;스크린샷 2021-09-22 오후 7.17.09.png&quot; width=&quot;553&quot; height=&quot;389&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&gt;&lt;/span&gt;&lt;figcaption&gt;박스 모델의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;border를 기준으로 margin(안쪽) padding(바깥쪽) 나누기&lt;/li&gt;
&lt;li&gt;margin과 padding의 작성 순서
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;top / right / bottom / left (시계 방향)&lt;/li&gt;
&lt;li&gt;상하 / 좌우&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Block 요소와 Inline 요소&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;Block 요소: y축 정렬로 컨텐츠가 나타남
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;p, div, h1 ~ h6...&amp;nbsp;&lt;/li&gt;
&lt;li&gt;줄바꿈 현상이 나타남&lt;/li&gt;
&lt;li&gt;width / height 값 사용 가능&amp;nbsp;&amp;rarr; 공간 만들기 가능&lt;/li&gt;
&lt;li&gt;margin / padding 값 사용 가능 &amp;rarr; 상하 배치 작업 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Inline 요소: x축 정렬로 컨텐츠가 나타남
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;a, span...&lt;/li&gt;
&lt;li&gt;줄바꿈 현상 X&lt;/li&gt;
&lt;li&gt;width / height 사용 불가&lt;/li&gt;
&lt;li&gt;margin, padding의 top / bottom 사용 불가&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. margin 병합 현상&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;형제지간의 margin 병합
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;margin-bottom과 margin-top 중 값이 더 큰 값으로 적용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1632314642134&quot; class=&quot;css&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;.older { margin-bottom: 150px; }
.younger { margin-top: 100px; }
/* 이 경우 적용되는 margin 값은? 150px (O) 250px (X) */&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모자식간의 margin 병합
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자식에게 margin-top 값이 주어졌다면 부모에게도 영향이 간다&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1632314649691&quot; class=&quot;html xml&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// HTML
&amp;lt;main&amp;gt;
	&amp;lt;article&amp;gt;안냐세요&amp;lt;/article&amp;gt;
&amp;lt;/main&amp;gt;

// CSS
article {
	margin-top: 100px;
}

/* 이 경우 부모인 &amp;lt;main&amp;gt;도 같이 밑으로 내려가게 됨*/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 레이아웃에 영향을 미치는 속성&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;display
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;inline, block, inine-block&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;float
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;left, right&lt;/li&gt;
&lt;li&gt;브라우저를 기준으로 특정 방향으로 정렬하고자 할 때 사용&lt;/li&gt;
&lt;li&gt;공중에 떠 있어 레이어층을 만들게 됨&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;#footnote_107_1&quot; id=&quot;footnote_link_107_1&quot; onmouseover=&quot;tistoryFootnote.show(this, 107, 1)&quot; onmouseout=&quot;tistoryFootnote.hide(107, 1)&quot; style=&quot;color:#f9650d; font-family: Verdana, Sans-serif; display: inline;&quot;&gt;&lt;span style=&quot;display: none;&quot;&gt;[각주:&lt;/span&gt;1&lt;span style=&quot;display: none;&quot;&gt;]&lt;/span&gt;&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;레이어가 겹쳐지지 않는 상태로 왼쪽에서부터 정렬시키고 싶은 경우 float: left 를 연속적으로 입력&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;clear
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;left, right(한 쪽만), both(양쪽 다)&lt;/li&gt;
&lt;li&gt;float를 사용하면 레이어가 생겨서 이후 clear를 안 써주면 겹치게 됨&lt;/li&gt;
&lt;li&gt;&amp;rarr; float를 다 쓰면 이후 정상적인 배치가 되도록&amp;nbsp; clear로 꺼주기!&amp;nbsp;&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;float를 마지막으로 사용한 지점 그 다음 태그에 clear 넣기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;브라우저와 공간 사이의 공백 제거하기
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;
&lt;pre id=&quot;code_1632303362569&quot; class=&quot;css&quot; data-ke-language=&quot;css&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;* { padding: 0; margin: 0; }&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;html과 body 태그 및 다른 태그들도 margin과 padding값을 갖는 경우가 있기 때문에 *로 초기화하는 방법 추천&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;header / main - article / footer&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol class=&quot;footnotes&quot;&gt;
    &lt;li id=&quot;footnote_107_1&quot;&gt;z-index랑 관련이 있나...? &lt;a href=&quot;#footnote_link_107_1&quot;&gt;[본문으로]&lt;/a&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</description>
      <category>elice/토끼성장일지</category>
      <category>elice</category>
      <category>web</category>
      <category>Wil</category>
      <category>엘리스</category>
      <category>엘리스 AI트랙</category>
      <category>웹</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/107</guid>
      <comments>https://bsscl.tistory.com/107#entry107comment</comments>
      <pubDate>Wed, 22 Sep 2021 17:12:27 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 카펫 - Python</title>
      <link>https://bsscl.tistory.com/106</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1631114346520&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 카펫&quot; data-og-description=&quot;Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 &quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bvjZlN/hyLxD5cFPP/0jS4AjC5exOTgZYahemLk0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/GMrLn/hyLxCLYUzn/anrawK3NxHDn0dBQMgRzI1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42842?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bvjZlN/hyLxD5cFPP/0jS4AjC5exOTgZYahemLk0/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/GMrLn/hyLxCLYUzn/anrawK3NxHDn0dBQMgRzI1/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코딩테스트 연습 - 카펫&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. Leo는 집으로 돌아와서 아까 본 카펫의 노란색과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;636&quot; width=&quot;350&quot; height=&quot;264&quot; data-ke-mobilestyle=&quot;widthOrigin&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nuFJF/btrerc77gsH/KuE1D0okI7fA4ZM4Ij92c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nuFJF/btrerc77gsH/KuE1D0okI7fA4ZM4Ij92c0/img.png&quot; data-alt=&quot;카펫&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nuFJF/btrerc77gsH/KuE1D0okI7fA4ZM4Ij92c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnuFJF%2Fbtrerc77gsH%2FKuE1D0okI7fA4ZM4Ij92c0%2Fimg.png&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;636&quot; width=&quot;350&quot; height=&quot;264&quot; data-ke-mobilestyle=&quot;widthOrigin&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;/&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;Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&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;갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.&lt;/li&gt;
&lt;li&gt;노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.&lt;/li&gt;
&lt;li&gt;카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1631114387944&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(brown, yellow):
    area = brown + yellow # 넓이
    for i in range(3, (area//2) + 1):
        if area % i == 0: # 후보 찾는 중
            if 2*(area//i + i) - 4 == brown:
            # 2 * (가로 후보 + 세로 후보) - 4 == 둘레
                return [area//i, i]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뭔가 너무 수학적으로 푼거 같아서 이래도 되나...싶었던 풀이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 공부하다 보니까 자연스럽게 파이써닉한 코드에 더 관심이 가는것같다 &lt;/p&gt;</description>
      <category>PS:0</category>
      <category>lv2</category>
      <category>PS</category>
      <category>Python</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/106</guid>
      <comments>https://bsscl.tistory.com/106#entry106comment</comments>
      <pubDate>Thu, 9 Sep 2021 00:36:35 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 가장 큰 수 - Python</title>
      <link>https://bsscl.tistory.com/104</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42746#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/42746#&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1631091755462&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 가장 큰 수&quot; data-og-description=&quot;0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 &quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42746#&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42746&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/xmQZt/hyLxJYhV92/gbe6OpolkTcrkkXtYsxKXk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/cF79ij/hyLxHGcI4M/xWLflEyW7L3hn1kMBKHCJk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/42746#&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/42746#&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/xmQZt/hyLxJYhV92/gbe6OpolkTcrkkXtYsxKXk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/cF79ij/hyLxHGcI4M/xWLflEyW7L3hn1kMBKHCJk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코딩테스트 연습 - 가장 큰 수&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&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;numbers의 길이는&lt;b&gt; 1 이상 100,000 이하&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;numbers의 원소는 &lt;b&gt;0 이상 1,000 이하&lt;/b&gt;입니다.&lt;/li&gt;
&lt;li&gt;정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;u&gt;실패한&lt;/u&gt; 풀이 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 양쪽의 숫자를 합친 숫자를 저장하는 변수 temp1, temp2를 만들어 둘을 버블정렬했다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과: 테스트케이스는 통과했으나 제출시 전부 오답처리됐다...시간 복잡도도 큰 방법이었기 때문에 다른 방법 시도함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. key=str 방식으로 정렬하면 될 거라고 생각했지만 앞자리는 똑같고 자릿수가 다른 숫자 비교에서 오류 발생&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1, 1[2], 1[3] / 9, 9[1], 9[2]&lt;/li&gt;
&lt;li&gt;처음엔 단순히 맨 뒷자리를 반복하면 될거라고 생각해서(&amp;larr; 틀림...) ljust를 사용해서 자릿수를 똑같이 맞추려고 했다&lt;/li&gt;
&lt;li&gt;이 방법이 틀린 이유&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 케이스 [401, 40]을 예로 들면 답은 40401이지만 실행 결과는 40140이 나오게 된다(401과 400으로 비교했기 때문)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그래서 내린 결론
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;통째로 반복하자~!!&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;&lt;/b&gt;&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1)코드 설명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (1) int 리스트 n을 정렬한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (2) 리스트의 int형 숫자들을 map 메서드를 이용해서 str형으로 바꿔준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (3) 숫자들 중 가장 긴 숫자의 길이를 구해서 maxNum 변수에 저장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (4) 통째로 반복시킨 숫자들을 기준으로 정렬한 뒤, 거꾸로 뒤집는다 (큰 수부터 와야하기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (5) 리스트를 한 문자열로 join해서 result 변수에 저장한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (6) int(result)가 0(false)이라면 '0'을, 0이 아닌 다른 값이라면 result를 그대로 반환한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2)코드&lt;/p&gt;
&lt;pre id=&quot;code_1631093351336&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n):
    n.sort()
    n = list(map(str, n))
    maxNum = len((n[-1]))
    newArr = sorted(n, key = lambda x : x*(maxNum), reverse=True)
    result = ''.join(newArr)
    return result if int(result) else '0'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;근데 쓰면서 생각한건데 굳이 maxNum을 이용할 필요가 없는것 같다&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제한 조건이 있으니까 자연수를 곱해도 될듯...&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모범 답안에서 괜히 3을 곱해주는게 아니였다...  여기서는 숫자의 범위가 1 ~ 1000 &amp;rarr; 2 자릿수 차이 &amp;rarr; 3번을 반복해야 완벽하게 비교를 할 수 있다(범위가 1부터 시작하기 때문에 1000은 상관 없음)&lt;/li&gt;
&lt;li&gt;만약 1 ~ 10000이었으면 4를 곱해야겠다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 글을 보시는 다른 분들은 자연수를 곱하시길 바라면서,,,ㅎㅎ끝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PS:0</category>
      <category>lv2</category>
      <category>PS</category>
      <category>Python</category>
      <category>문제풀이</category>
      <category>파이썬</category>
      <category>프로그래머스</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/104</guid>
      <comments>https://bsscl.tistory.com/104#entry104comment</comments>
      <pubDate>Wed, 8 Sep 2021 18:52:51 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] 행렬의 덧셈 - Python</title>
      <link>https://bsscl.tistory.com/103</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;링크&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/12950?language=python3&quot;&gt;https://programmers.co.kr/learn/courses/30/lessons/12950?language=python3&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1630674025536&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;코딩테스트 연습 - 행렬의 덧셈&quot; data-og-description=&quot;행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/12950?language=python3&quot; data-og-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/12950?language=python3&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/N6SoT/hyLtV6HO6V/FuKkJBAZdJMkKHi5X4Hk2K/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/LBEXd/hyLtVMqkf2/w9Ugp7bcyK0jcDKgUapnlk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626&quot;&gt;&lt;a href=&quot;https://programmers.co.kr/learn/courses/30/lessons/12950?language=python3&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://programmers.co.kr/learn/courses/30/lessons/12950?language=python3&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/N6SoT/hyLtV6HO6V/FuKkJBAZdJMkKHi5X4Hk2K/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626,https://scrap.kakaocdn.net/dn/LBEXd/hyLtVMqkf2/w9Ugp7bcyK0jcDKgUapnlk/img.jpg?width=626&amp;amp;height=626&amp;amp;face=0_0_626_626');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;코딩테스트 연습 - 행렬의 덧셈&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&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;행렬 arr1, arr2의 행과 열의 길이는 500을 넘지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 풀이&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1630673963272&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(arr1, arr2):
    answer = []
    for i in range(0, len(arr1)):
        answer.append([])
        for j in range(0, len(arr1[0])):
            answer[i].append(int(arr1[i][j])+int(arr2[i][j]))
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category>PS:0</category>
      <category>LV1</category>
      <category>PS</category>
      <category>Python</category>
      <category>문제풀이</category>
      <category>프로그래머스</category>
      <author>Juliie</author>
      <guid isPermaLink="true">https://bsscl.tistory.com/103</guid>
      <comments>https://bsscl.tistory.com/103#entry103comment</comments>
      <pubDate>Fri, 3 Sep 2021 22:01:10 +0900</pubDate>
    </item>
  </channel>
</rss>