<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>mia.log</title>
        <link>https://velog.io/</link>
        <description>새로운 것은 언제나 재밌어 🎶</description>
        <lastBuildDate>Wed, 30 Oct 2024 12:18:33 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>mia.log</title>
            <url>https://velog.velcdn.com/images/gyeongmi_lee/profile/9c56bf12-18d4-43a9-a8c8-79e2b3fc2751/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. mia.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/gyeongmi_lee" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[인프콘] 프론트엔드 개발의 결정적 순간들]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EC%9D%B8%ED%94%84%EC%BD%98-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EA%B2%B0%EC%A0%95%EC%A0%81-%EC%88%9C%EA%B0%84%EB%93%A4</link>
            <guid>https://velog.io/@gyeongmi_lee/%EC%9D%B8%ED%94%84%EC%BD%98-%ED%94%84%EB%A1%A0%ED%8A%B8%EC%97%94%EB%93%9C-%EA%B0%9C%EB%B0%9C%EC%9D%98-%EA%B2%B0%EC%A0%95%EC%A0%81-%EC%88%9C%EA%B0%84%EB%93%A4</guid>
            <pubDate>Wed, 30 Oct 2024 12:18:33 GMT</pubDate>
            <description><![CDATA[<h3 id="7년동안-하나-만들었습니다-프론트엔드-개발의-결정적-순간들---이찬희">7년동안 하나 만들었습니다. 프론트엔드 개발의 결정적 순간들 - 이찬희</h3>
<ul>
<li>지금 개발하는 (만드는) 제품의 7년뒤는 어떨까?<ul>
<li>현재 개발한 제품의 기능들 (airbridge): 데이터 추출, 연동, 리포트 ..</li>
<li>기술적으로는 초당 15억건 실시간으로 받아서 처리</li>
</ul>
</li>
</ul>
<h3 id="첫번째-순간--처음으로-만든-기능">첫번째 순간 : 처음으로 만든 기능</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/1ba77f16-6c55-42ae-a752-ab7f231472fa/image.png" alt=""></p>
<ul>
<li>문제: 매우 큰 고객이 들어오고 나서 api 응답이 느려지고 다운되는 일이 잦아짐</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/762a6e35-a22b-4dc2-bfaa-82f4549fd06a/image.png" alt=""></p>
<ul>
<li><p>메타 데이터?</p>
<h3 id="메타-데이터-예시">메타 데이터 예시</h3>
<p>  <strong>예시 상황</strong>: 쇼핑몰 웹사이트에서 상품 페이지에 필요한 메타 데이터를 추가한다고 가정해봅시다.</p>
<pre><code class="language-html">  html
  코드 복사
  &lt;!-- HTML 메타 태그 예시 --&gt;
  &lt;head&gt;
    &lt;meta name=&quot;description&quot; content=&quot;신상품 출시! 최신 유행 신발을 만나보세요.&quot;&gt;
    &lt;meta name=&quot;keywords&quot; content=&quot;신발, 최신, 유행, 패션&quot;&gt;
    &lt;meta property=&quot;og:title&quot; content=&quot;신상 신발 출시!&quot;&gt;
    &lt;meta property=&quot;og:image&quot; content=&quot;https://example.com/shoes.jpg&quot;&gt;
  &lt;/head&gt;
</code></pre>
<p>  위 예시처럼 메타 데이터를 설정하면 <strong>검색 엔진</strong>은 이 정보를 이용해 더 잘 검색될 수 있게 도와주고, <strong>SNS 공유</strong> 시에도 특정 이미지나 제목이 보이게 해줍니다.</p>
<h3 id="이벤트-수-증가와-메타-데이터가-api-서버에-미치는-영향">이벤트 수 증가와 메타 데이터가 API 서버에 미치는 영향</h3>
<p>  이제 메타 데이터를 <strong>JavaScript 코드</strong>에서 설정하는 예시를 들어볼게요. 이벤트 수가 많아질 때 메타 데이터가 API 서버에 미치는 영향도 이어서 설명하겠습니다.</p>
<h3 id="1-javascript에서-메타-데이터-생성-예시">1. JavaScript에서 메타 데이터 생성 예시</h3>
<p>  상품 페이지의 경우 사용자가 보는 상품마다 서로 다른 정보를 보여줘야 하므로, 프론트엔드에서 동적으로 메타 데이터를 생성할 수 있습니다.</p>
<pre><code class="language-jsx">  javascript
  코드 복사
  function setMetaData(product) {
    document.title = `${product.name} - 최신 패션`;
    document.querySelector(&#39;meta[name=&quot;description&quot;]&#39;).setAttribute(&quot;content&quot;, product.description);
    document.querySelector(&#39;meta[property=&quot;og:image&quot;]&#39;).setAttribute(&quot;content&quot;, product.imageUrl);
  }
</code></pre>
<p>  사용자가 상품 페이지를 클릭할 때마다, <code>setMetaData</code> 함수가 상품 정보를 기반으로 페이지의 메타 데이터를 설정해줍니다.</p>
<h3 id="2-api-서버에-미치는-영향">2. API 서버에 미치는 영향</h3>
<p>  <strong>이벤트 수가 많아지면</strong>:</p>
<ul>
<li><p>상품 페이지를 사용자들이 많이 탐색할 경우, 각 상품 정보(상품 이름, 설명, 이미지 등)를 매번 API 요청으로 가져오게 됩니다.</p>
</li>
<li><p>사용자가 많아지고 요청 빈도가 높아지면, 서버는 그만큼의 <strong>트래픽 부담</strong>을 가지게 됩니다.</p>
</li>
<li><p>결과적으로, 서버의 처리 능력을 초과할 경우 <strong>응답 지연</strong>이 발생하거나 심한 경우 <strong>서버 다운</strong> 문제가 생길 수 있습니다.</p>
<p>이를 해결하기 위해 서버나 프론트엔드에서 <strong>캐시(Cache)</strong> 를 이용해 자주 요청되는 메타 데이터를 저장해두면, 서버에 매번 요청하지 않아도 되므로 부하를 줄일 수 있습니다.</p>
</li>
</ul>
</li>
<li><p>즉, 사용자 경험에는 데이터 양과 변화량이 핵심</p>
<ul>
<li>즉, 무한스크롤등 화면의 변화가 많아질수록 렌더링의 부화가 더 심해짐</li>
</ul>
</li>
<li><p>이를 해결하려면?</p>
<ul>
<li><p>페이지네이션: 데이터를 나눠서 보여줄 수 있음</p>
</li>
<li><p>렌더링 가상화:스크롤할 때마다 화면에 보이는 부분만 렌더링해 성능 최적화</p>
<pre><code class="language-jsx">  import { FixedSizeList as List } from &#39;react-window&#39;;

  const ProductList = ({ products }) =&gt; (
    &lt;List height={500} itemCount={products.length} itemSize={50}&gt;
      {({ index, style }) =&gt; (
        &lt;div style={style}&gt;
          {products[index].name}
        &lt;/div&gt;
      )}
    &lt;/List&gt;
  );
</code></pre>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/1fcd05fc-6743-4112-a562-a345a36cd98c/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/ff159207-9532-49b3-8bde-0aa02b551f39/image.png" alt=""></p>
<ul>
<li>정규화 : 데이터를 중복 없이 효율적으로 관리하기 위해 <code>자주 쓰이는 값이나 주요 속성을 기준으로 데이터 구조를 최적화</code>하는 것을 의미</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/bef5efe0-6d9b-4d5f-ac71-add27a718394/image.png" alt=""></p>
<h3 id="두번째-순간-캘린더-컴포넌트">두번째 순간: 캘린더 컴포넌트</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/f7873e5c-3191-496c-8101-68c8c1e6606e/image.png" alt=""></p>
<ul>
<li>기존에는 캘린더 라이브러리를 쓰다가 → 만들기로 결심</li>
<li>기능들
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/f8b08d36-798b-413b-b45c-dfa9251f669d/image.png" alt=""></li>
</ul>
<p>→ 문제 </p>
<ul>
<li>3일,7일 단위의 블록 선택 없어짐</li>
<li>last 7 days → 오늘을 포함하지 않아야함(모든 코드에 오늘 포함 관련 코드 추가 삽입)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/bb0a0aeb-8e3f-4c31-9237-16151e248975/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/c54cf44f-3223-441a-98d3-5ef0b543751a/image.png" alt=""></p>
<ul>
<li><p>타임존은 서머타임 등으로 인해 매년 여러 개의 버전이 나옵니다. 하지만 각 환경에서 쓰는 버전이 다릅니다. 이를 맞추기 위해 프론트는 날짜 라이브러리의 커스텀 플러그인을 구현하고, 캘린더의 코어부터, 서비스 내의 모든 날짜 연산이 들어가는 곳까지 모두 뜯어고쳐야 했음</p>
<ul>
<li><p>교훈: 처음부터 … 표준 협정시를 써라</p>
</li>
<li><p>추가적으로 표준 협정시(UTC)에 관련하여</p>
<p>  <strong>타임존을 표준협정시(UTC)를 사용한다는 것</strong>은, 시간 데이터를 전 세계적으로 동일한 기준인 UTC를 기반으로 저장하고 관리한다는 의미입니다. UTC(협정 세계시)는 지구상의 모든 타임존이 기준으로 삼는 표준 시간이기 때문에, 이를 사용하면 위치에 관계없이 모든 데이터가 동일한 시간을 참조할 수 있습니다.</p>
<h3 id="표준협정시utc-사용의-의미와-필요성">표준협정시(UTC) 사용의 의미와 필요성</h3>
<ol>
<li><p><strong>일관된 시간 기준</strong>: UTC를 기준으로 모든 데이터를 저장하면, 위치에 따라 시간이 달라지지 않고 언제 어디서든 <strong>동일한 시간 데이터</strong>를 참조할 수 있습니다. 예를 들어, 한국(KST)은 UTC보다 9시간 빠르지만 UTC를 기준으로 하면 시간 데이터를 전 세계에서 일관되게 관리할 수 있습니다.</p>
</li>
<li><p><strong>타임존 변환의 용이성</strong>: 저장된 UTC 시간을 사용자에게 제공할 때, 그들의 <strong>지역 타임존으로 변환</strong>하여 보여주기만 하면 됩니다. 예를 들어, 한국에서 웹사이트에 접속한 사용자는 UTC에 +9시간을 더한 시간으로 표시됩니다.</p>
</li>
<li><p><strong>데이터 통합과 비교 용이성</strong>: 여러 타임존에서 발생하는 이벤트를 동일한 기준으로 기록하면 <strong>비교와 분석</strong>이 쉬워집니다. 예를 들어, 다국적 팀이 협업하는 상황에서 미국과 한국에서 동시에 발생한 이벤트의 시간을 비교할 때 UTC를 기준으로 저장된 데이터는 정확한 비교가 가능합니다.</p>
<h3 id="예시">예시</h3>
<p>서버에서 이벤트 발생 시간을 UTC로 저장한다고 가정해 봅시다.</p>
</li>
</ol>
<ul>
<li><p>한국에서 10월 31일 오후 6시에 저장한 이벤트는 UTC로 변환하면 10월 31일 오전 9시가 됩니다.</p>
</li>
<li><p>데이터베이스에는 UTC 시간인 <code>2024-10-31T09:00:00Z</code>로 저장됩니다.</p>
<p>이후 다른 타임존의 사용자가 이 데이터를 확인할 때 <strong>자신의 지역 타임존으로 변환</strong>해 보여주면, 전 세계 어디서나 정확한 시간대를 반영한 이벤트 시간을 확인할 수 있습니다.</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/655e15d4-c508-4f7d-af5b-275f809fee42/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/8d4c3a76-68d6-4707-baa2-1b4b7cea14c1/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/3ff470c9-1d4f-4b1d-8f3c-39d25dfa410e/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/72c8b1a1-0379-45d6-a907-e6b50de54912/image.png" alt=""></p>
<ul>
<li>결과를 먼저 그려보는건 수명이 길어질수록 도움이 됨</li>
</ul>
<h3 id="세번째-순간-기술-교체의-순간">세번째 순간: 기술 교체의 순간</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/11d84479-5c9a-498a-8d3b-5de7f6130780/image.png" alt="">
→ 이때 등장한게 Recoil
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/60404dcc-413a-4544-9b61-49876525e1b6/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/bd83945a-6092-40a0-b9b8-868eb29b40b2/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/37e7e487-66f2-4f9e-8320-aebe94f4e264/image.png" alt=""></p>
<p><strong>교훈:</strong></p>
<ul>
<li><strong>유예 전략</strong>: 새로운 기술 도입에 앞서 시간을 두고 필요성을 재검토하는 것이 중요함.</li>
<li><strong>거꾸로 생각하기</strong>: 특정 기술 도입 여부를 결정할 때 반대 상황을 가정해봄으로써 선택의 편향성을 줄일 수 있음.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/43e19661-807f-4e83-be94-817cc9de7eca/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬 뿌시자 프로젝트] tuple, set]]></title>
            <link>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%BF%8C%EC%8B%9C%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-tuple-set</link>
            <guid>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%BF%8C%EC%8B%9C%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-tuple-set</guid>
            <pubDate>Mon, 21 Oct 2024 14:24:33 GMT</pubDate>
            <description><![CDATA[<pre><code># tuple : 읽기 전용, 대신 list보다 읽는 속도가 빠르다!
menu = (&quot;mia&quot;, &quot;lena&quot;) # 괄호, 콤마
print(menu[0]) # 꺼내서 읽는건 동일하지만, add는 못함!
# menu[0] = &#39;aa&#39; 이렇게도 불가능!

# 한줄에 여러 변수의 값 정의 가능
(name, age, hobby) = (&quot;mia&quot;, 28, &quot;coding&quot;) # 이 작업은 튜플이 아니라 변수의 재할당
print(name, age, hobby)
name = &quot;lena&quot;
print(name)
(departure, arrival) = (&#39;김포&#39;, &#39;제주&#39;)
print(departure, arrival)
(departure, arrival) = (arrival, departure) # 이 작업은 튜플의 언패킹을 이용해 변수의 값을 재할당(새로운 튜플을 생성해서 다시 변수에 대입한 것)
print(departure, arrival)

# 집합(set)
# 중복 안됨, 순서 없음
my_set = {1,2,3,3,3}
print(my_set) # {1,2,3}

# set을 선언하는 방법
javascript = {&#39;mia&#39;, &#39;lena&#39;, &#39;dinah&#39;}
python = set([&#39;mia&#39;, &#39;dido&#39;])

# 교집합 ( &amp; , .intersection )
print(javascript &amp; python)
print(python.intersection(javascript))

# 합집합, 둘다 할수있는 ( |, .union) -&gt; 근데 순서 보장 안됨 ~
print(javascript | python)
print(javascript.union(python))

# 차집합, javascript 할수있지만 python 할 줄 모르는 개발자 (-, .difference)
print(javascript - python)
print(javascript.difference(python))

# python 할줄 아는 사람이 늘어남! (.add)
python.add(&#39;luke&#39;)
print(python)

# javascript 까먹음 (.remove)
javascript.remove(&#39;dinah&#39;)
print(javascript)

# 자료구조의 변경 (list, set, tuple)
menu = {&#39;coffee&#39;, &#39;milk&#39;, &#39;juice&#39;} # set
print(menu, type(menu))

menu = list(menu) # list로 변환
print(menu, type(menu))

menu = tuple(menu) # tuple로 변환
print(menu, type(menu))

menu = set(menu)
print(type(menu))

# 문제 풀기
&#39;&#39;&#39;
댓글 작성자들 중에 추첨을 통해 1명 치킨, 3명은 커피 쿠폰 추첨 프로그램 작성

조건1. 20명이 작성, 아이디는 1-20
조건2. 무작위로 추첨, 중복 불가 (한명이 치킨 받았으면 커피는 못받음)
조건3. random 모듈의 shuffle, sample 활용
&#39;&#39;&#39;

from random import *
lst = []
print(lst)

for num in range(20):
 lst.append(num+1) 
print(lst)

## 나의 답 (반절만 맞음)
shuffle(lst) # 섞는 역할
print(lst)
chicken = sample(lst, 1)
print(&#39;치킨&#39;, chicken) # 치킨 1개
print(&#39;커피 쿠폰&#39;,sample(lst, 3)) # 치킨 1개

# 중복 방지를 위해 4명을 미리 뽑고 -&gt; 1,3명을 주면 됨 ㅎㅎ
# 선생님의 답!
users = range(1,21) # 1~20까지 숫자 생성
users = list(users) # list형태로 바꿔야 random 내장함수 쓸수있음
print(users)

# shuffle
shuffle(users)

winners = sample(users, 4) # 4명 뽑음
print(winners)

print(&quot;-- 당첨자 발표 --&quot;)
print(&quot;-- 치킨 당첨자: {0}&quot;.format(winners[0]))
print(&quot;-- 커피 당첨자: {0}&quot;.format(winners[1:]))
print(&quot;-- 축하합니다 --&quot;)


# 또 다른 접근(차집합)
print(users)
chicken = sample(users, 1)
remain = set(users) - set(chicken)
print(list(remain))
coffee = sample(remain, 3)
print(&#39;chicken&#39;, chicken)
print(&#39;coffee&#39;, coffee)

# 셀프체크
&#39;&#39;&#39;
문제 : 수강신청중 일부 과목이 중복 신청되는 문제 발생. 중복 과목을 제거하는 프로그램 작성 

조건1 : 신청과목은 리스트로 관리된다
조건2 : 리스트에 같은 과목이 2번 이상 포함된 경우 1개만 남기고 나머지 삭제
조건3 : 출력시 신청 과목의 순서는 변경해도 괜찮다
&#39;&#39;&#39;

subjects = [&#39;자료구조&#39;, &#39;알고리즘&#39;, &#39;자료구조&#39;, &#39;운영체제&#39;]
subjects = set(subjects) # 중복 안되는 set으로 변경
print(subjects, type(subjects))

subjects = list(subjects)
print(subjects)
</code></pre><h4 id="--추가적으로-적어두는-튜플">- 추가적으로 적어두는 튜플</h4>
<ol>
<li><p>튜플은 변경이 필요없는 데이터를 묶어 표현할때 사용</p>
</li>
<li><p>가독성 위해 괄호는 쓰는것이 좋음</p>
</li>
<li><p>여러개의 값 리턴시 사용하기도 함</p>
</li>
<li><p>리스트보다 빠른 접근 필요할때 사용</p>
</li>
<li><p>딕셔너리의 키로 사용하기도 함(리스트는 mutable 하므로 키로 못씀)</p>
</li>
</ol>
<h4 id="--추가적으로-적어두는-집합과-딕셔너리">- 추가적으로 적어두는 집합과 딕셔너리</h4>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/2c7a5302-ac83-4491-b92c-14a2bb32aedb/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[도서후기] 나도코딩의 파이썬 입문]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EB%8F%84%EC%84%9C%ED%9B%84%EA%B8%B0-%EB%82%98%EB%8F%84%EC%BD%94%EB%94%A9%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%AC%B8</link>
            <guid>https://velog.io/@gyeongmi_lee/%EB%8F%84%EC%84%9C%ED%9B%84%EA%B8%B0-%EB%82%98%EB%8F%84%EC%BD%94%EB%94%A9%EC%9D%98-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%AC%B8</guid>
            <pubDate>Mon, 14 Oct 2024 14:48:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/5eb550ab-3d00-461a-8467-2a3c8e108146/image.png" alt=""></p>
<h3 id="사게-된-계기">사게 된 계기</h3>
<ul>
<li>프론트엔드 개발자로 1년이 조금 넘었는데, 아예 새로운 언어를 배워보고 싶다는 생각이 들어서 사게 되었습니다!</li>
</ul>
<h3 id="장점">장점</h3>
<ol>
<li><code>코딩 자율 학습단</code> 이라는 프로그램과 같이 진행할 수 있어서 하기싫어도(?) 억지로 하게 되는 것 같습니다! 역시 처음 공부할때는 스터디만한게 없습니다😘</li>
<li><code>무료 유튜브 강의</code> 가 너무 잘 되어있습니다! 책을 읽고도 잘 이해하지 못하는 것들은 영상으로 한번 더 볼수 있으니 쉽게 공부할 수 있습니다!</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬 뿌시자 프로젝트] 연산자(operator)]]></title>
            <link>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%BF%8C%EC%8B%9C%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90operator</link>
            <guid>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%BF%8C%EC%8B%9C%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90operator</guid>
            <pubDate>Mon, 14 Oct 2024 14:44:16 GMT</pubDate>
            <description><![CDATA[<pre><code># 산술연산자
# + , - , *, / 

print(1+1)
print(3-2)
print(5*2)
print(6/3) # 대신 이건 2.0으로 실수!

print(2**3) # 거듭제곱 8
print(5%3)  # 나머지 즉 2
print(10%3) # 1
print(5//3) # 몫 즉 1
print(10//3) # 3

# 비교연산자
print(10 &gt; 3) # true
print(4 &gt;= 7) # false
print(10 &lt; 3) # false
print(5 &lt;= 5) #true

print(5 == 7) # false 앞 뒤가 같은지 비교
print(7 != 5) # true 앞 뒤가 다른지 비교

# 논리연산자
print(not(1 != 3)) # false
print((3 &gt; 0) and (3 &lt; 5)) # true (둘 다 true여야 true)
print((3 &gt; 0) &amp; (3 &lt; 5)) # true (and == &amp;)

print((3 &gt; 0) or (3 &gt; 5)) # true (둘 중 하나만 참이어도 true)
print((3 &gt; 0) | (3 &gt; 5)) # true (or == |)

# 단축 평가
print(5 &gt; 4 &gt; 3) # true
print(5 &lt; 6 &lt; 3) # false(이를 단축평가로 표현함, 앞만 봐도 이미 false)

# 문제
print(5 + 3) # 8
print(6 / 3) # 2.0
print(5 % 3) # 2
print(5 &lt; 3 | 7 &lt; 3) # false  

# 연산자의 우선순위
num = 2 + 3 * 4 # 14
num = num + 2 
num += 2 # 위와 동일!
print(num) # 18
num *= 2 # 36
print(num)
num /= 2 # 18.0
print(num)
num -= 2
print(num) # 16.0
num %= 5 # 1.0
print(num)

# 함수로 연산하기
print(abs(-5)) # 절대값 5
print(pow(4, 2)) # 4^2 = 16
print(max(5, 12)) # 12
print(min(5, 12)) # 5
print(round(3.14)) # 3
print(round(4.132, 2)) # 소수점 두번쨰 자리 이하에서(세번째 자리) 반올림, 4.13

# math 모듈
from math import * # math 모듈에 있는걸 다 가져오겠다~
floorNum = floor(4.99) 
print(floorNum) # 내림, 4
ceilNum = ceil(3.14)
print(ceilNum) # 올림, 4
sqrtNum = sqrt(16)
print(sqrtNum) # 제곱근, 4

# 모듈은 이렇게 가져와서 써도된다
import math

result = math.floor(4.56) 
print(result) # 4
result = math.ceil(5.44)
print(result) # 5
result = math.sqrt(36)
print(result) # 6.0

# random 모듈
from random import *
print(random()) # 0.0 이상 ~ 1.0 미만 임의의 값 생성 
print(random() * 10) # 0.0 이상 ~ 10.0 미만 임의의 값 생성 
print(int(random() * 45 + 1)) # 1 이상 46 미만 정수난수 뽑고 싶다면?

# 주어진 범위 안에서 정수인 난수 생성(끝 숫자 미포함)
print(randrange(1,46)) # 1 이상 46 미만
print(randint(1,45)) # 1 이상 45 이하

# 문제 풀이
print(round(0.1357, 2)) # 0.14

# 스터디 날짜 정하기
&#39;&#39;&#39;
1. 날짜를 무작위로 뽑는다.
2. 28일까지만 날짜 선정
3. 매월 1~3일은 스터디 준비하니까 제외
4. 형태는 &quot;오프라인 스터디 모임 날짜는 매월 18일로 선정됐습니다&quot;
&#39;&#39;&#39;
from random import *
result = randint(4,28) # 4일부터 28일이하
print(f&#39;오프라인 스터디 모임 날짜는 매월 {result}일로 선정됐습니다&#39;)

# 온도 단위를 변환하는 프로그램 만들기
&#39;&#39;&#39;
1. 온도 저장 변수 만들기
2. 화씨온도 변환하고 새로운 변수저장
3. 출력
&#39;&#39;&#39;
temp = 30
hwatemp = (temp * 9 / 5) + 32
print(&#39;섭씨온도 :&#39;+str(temp))
print(&#39;화씨온도 :&#39;+str(hwatemp))

temp = 10
hwatemp = (temp * 9 / 5) + 32
print(&#39;섭씨온도 :&#39;+str(temp))
print(&#39;화씨온도 :&#39;+str(hwatemp))</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[git .... 기억하기 위해 쓰는 게시글]]></title>
            <link>https://velog.io/@gyeongmi_lee/git-....-%EA%B8%B0%EC%96%B5%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%B4-%EC%93%B0%EB%8A%94-%EA%B2%8C%EC%8B%9C%EA%B8%80</link>
            <guid>https://velog.io/@gyeongmi_lee/git-....-%EA%B8%B0%EC%96%B5%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%B4-%EC%93%B0%EB%8A%94-%EA%B2%8C%EC%8B%9C%EA%B8%80</guid>
            <pubDate>Tue, 08 Oct 2024 13:34:11 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>echo : 주로 텍스트 출력하거나 파일을 생성하고 기록하는데 사용
<code>echo &quot;This is a test.&quot; &gt; test.txt</code>
&quot;This is a test&quot;라는 문장을 test.txt 라는 파일에 생성하면서 저장</p>
</li>
<li><p>git add
<code>git add practice.py</code>
해당 파일의 현재 상태가 커밋 대기 상태로 이동하게 됨</p>
</li>
<li><p>git commit
<code>git commit -m &quot;first commit&quot;</code></p>
</li>
<li><p>m는 메세지</p>
</li>
<li><p>git push origin main
origin: 일반적으로 원격 저장소의 기본 이름
main: 푸쉬할 브랜치의 이름! </p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파이썬 뿌시자 프로젝트] 자료형과 변수]]></title>
            <link>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%BF%8C%EC%8B%9C%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%90%EB%A3%8C%ED%98%95%EA%B3%BC-%EB%B3%80%EC%88%98</link>
            <guid>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%BF%8C%EC%8B%9C%EC%9E%90-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9E%90%EB%A3%8C%ED%98%95%EA%B3%BC-%EB%B3%80%EC%88%98</guid>
            <pubDate>Tue, 08 Oct 2024 13:00:31 GMT</pubDate>
            <description><![CDATA[<pre><code># 자료형 : number, string, boolean

# number
age = 23
print(age)

# string
name = &#39;미아&#39;
print(name)

# number + string
# f를 사용할 떄
print(f&#39;{name}의 나이는 {age}야&#39;)
# +를 사용할 때(boolean, number는 둘다 str을 붙여야한다~!)
print(name+ &#39;의 나이는&#39; + str(age) + &#39;야&#39;)
# ,를 사용할 때 (무조건 띄어쓰기를 포함한다)
print(name,&#39;의 나이는&#39;,age,&#39;야&#39;)

# boolean
is_adult = age &gt; 20
print(f&#39;{name}은 아무래도 어른일까요? -&gt; {is_adult}&#39;)

# 형변환하기
# str()처럼 int(): 정수형태로 형변환, float(): 실수형태로 형변환

# 다음은 모두 3으로 출력됨 -&gt; 오로지 숫자로 된 문자열만 출력 가능!
print(int(&quot;3&quot;))
print(int(3.5))
# 다음은 소수점이 들어간 실수로 출력됨
print(float(&quot;3.5&quot;))
print(float(&quot;3&quot;))

# 주석 처리!
&#39;&#39;&#39; 작은 따옴표로 둘러싸면 한번에 주석처리&#39;&#39;&#39;

# 변수를 이용해서 다음 문장을 출력하시오
stations = [&#39;사당&#39;, &#39;신도림&#39;, &#39;인천공항&#39;]
for station in stations:
    print(f&#39;{station}행 열차가 들어오고 있습니다.&#39;)

# 자료형 확인할떄 type()
# 결과값은 &lt;class &#39;int&#39;&gt; / &lt;class &#39;str&#39;&gt; / &lt;class &#39;float&#39;&gt; 이런식으로 출력됨
print(type(3))
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[젭라 저를 인프콘에 데려가주세요]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EC%A0%AD%EB%9D%BC-%EC%A0%80%EB%A5%BC-%EC%9D%B8%ED%94%84%EC%BD%98%EC%97%90-%EB%8D%B0%EB%A0%A4%EA%B0%80%EC%A3%BC%EC%84%B8%EC%9A%94</link>
            <guid>https://velog.io/@gyeongmi_lee/%EC%A0%AD%EB%9D%BC-%EC%A0%80%EB%A5%BC-%EC%9D%B8%ED%94%84%EC%BD%98%EC%97%90-%EB%8D%B0%EB%A0%A4%EA%B0%80%EC%A3%BC%EC%84%B8%EC%9A%94</guid>
            <pubDate>Fri, 12 Jul 2024 11:44:04 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/4f27c4f8-820e-4cbb-9f16-ea75d1a6142e/image.jpeg" alt=""></p>
<p>신입개발자 1년 1개월 ..... 개발자들과의 네트워킹에 목말라 있습니다.
프론트엔드 개발자로 일하면서 새로운 개념에 접할 때 마다 개가티 인프런을 찾아
매번 강의를 들으면서 일했읍니다 ...
이번에도 염치불구하고 인프콘에서 새로운 개념들을 학습하겠습니다.</p>
<h3 id="인생에-이토록-간절히-원한-이벤트가-없습니다"><em>인생에 이토록 간절히 원한 이벤트가 없습니다....</em></h3>
<p>인프콘에 응모하고 떨어진 날 하루종일 엉엉 울고싶은 마음이었습니다(정말로 ..)</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/a2f0a6b3-b202-4220-8317-6c6dd66d4a97/image.png" alt=""></p>
<p>사실 이 메세지를 읽진 않으셨지만 제 기도에 응답해준것 마냥(아님)
이벤트를 열어주심에 정말 감사드리며 이 글을 작성합니다.</p>
<h3 id="제발-저를-인프콘에-데려가주세요-">제발 저를 인프콘에 데려가주세요 ....</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/7ee50cb1-cd03-4dfd-8783-ea5ac96dc3e6/image.png" alt="">
시간표도 물론 준비되어있습니다 ... 헤르미온느 마냥 열심히 참여하겠읍니다 ...</p>
<h2 id="제일-중요한-이벤트-참여-">제일 중요한!!! 이벤트 참여 !!!</h2>
<p><a href="https://www.rallit.com/hub/resumes/170948/%EC%9D%B4%EA%B2%BD%EB%AF%B8?isExpanded=true">https://www.rallit.com/hub/resumes/170948/%EC%9D%B4%EA%B2%BD%EB%AF%B8?isExpanded=true</a></p>
<p>=&gt; 저를 꼬옥 뽑아주세요 .......</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[러닝타입스크립트]3. 유니언과 리터럴]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EB%9F%AC%EB%8B%9D%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B83.-%EC%9C%A0%EB%8B%88%EC%96%B8%EA%B3%BC-%EB%A6%AC%ED%84%B0%EB%9F%B4-32q1z52z</link>
            <guid>https://velog.io/@gyeongmi_lee/%EB%9F%AC%EB%8B%9D%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B83.-%EC%9C%A0%EB%8B%88%EC%96%B8%EA%B3%BC-%EB%A6%AC%ED%84%B0%EB%9F%B4-32q1z52z</guid>
            <pubDate>Mon, 24 Apr 2023 10:07:12 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/72982431-64f7-4546-8932-13ca170fca53/image.png" alt=""></p>
<h4 id="사전에-알아두면-좋을-기본-타입">사전에 알아두면 좋을 기본 타입</h4>
<pre><code>/* ts의 문자열, 숫자, 배열 기본타입*/
// js 문자열 선언
var str = &#39;hello&#39;;
// ts 문자열 선언
let str2: string = &#39;hello&#39;;
const num: number = 2;
// ts 배열 선언
let arr: Array&lt;number&gt; = [1,2,3]; // arr에는 배열(A는 대문자여야함), 그 안에는 숫자만 들어갈 수 있다.
let arr2:Array&lt;string&gt; = [&quot;a&quot;,2]; // 이러면 에러다
// 배열 리터럴 사용해서 선언
let items: number[] = [1,2,3];

// ts 튜플(tuple)
let address: [string,number] = [&#39;gangnam&#39;, 12] // 요런식으로 배열의 규칙까지 정해주는것, 요소의 타입과 개수가 고정된 배열을 표현할 수 있음

// ts 객체
let obj: object = {};
let person:object = {
    name: &#39;gyoengmi&#39;,
    age:100
} // 위에서 지정한대로만하면 어떤 속성이든지 상관 x , 객체이기만 하면된다

// 하지만 
let person2:{name: string, age: number} = {
    name:&quot;gyoengmi&quot;,
    age:100
} // 이런식으로 타입을 지정해두면 무조건 속성이 있어야만 오류를 안낸다!

// 진위값
let show:boolean = true;</code></pre><h1 id="3-유니언과-리터럴">3. 유니언과 리터럴</h1>
<ul>
<li>유니언 : 값에 허용된 타입을 두개 이상의 가능한 타입으로 확장하는 것</li>
<li>내로잉 : 값에 허용된 타입이 하나 이상의 가능한 타입이 되지 않도록 좁히는 것 <h2 id="31-유니언-타입">3.1 유니언 타입</h2>
<pre><code>let mathmatician = Math.random() &gt; 0.5 ? undefined : &quot;a&quot;;
// 값이 어떤것이냐에 따라 달라질수 있다</code></pre><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/7fc95062-d4c2-4666-a446-593b0301dad9/image.png" alt="">
&#39;이거 혹은 저거&#39; 같은 타입 =&gt; <code>유니언</code> 이라고 한다.</li>
<li>타입스크립트는 <code>|</code> 를 사용해 유니언 타입을 나타낸다.</li>
</ul>
<h3 id="311-유니언-타입-선언이-언제-필요해">3.1.1 유니언 타입 선언이 언제 필요해!</h3>
<p>=&gt; 변수 초깃값이 존재하더라도 <code>명시적(분명한) 타입 애너테이션</code> 제공하는것이 필요할때!</p>
<blockquote>
<p>유니언 타입의 순서는 중요하지 않다.</p>
</blockquote>
<h3 id="312-유니언-속성">3.1.2 유니언 속성</h3>
<ul>
<li>✔ 값이 유니언 타입일때 타입스크립트는 <code>모든 타입에 존재하는 속성</code>에만 접근가능.<pre><code>let physicist = Math.random() &gt; 0.5 ? &quot;Marie Curie&quot; : 84;
physicist.toString(); // OK, number와 string 모두 사용가능
physicist.toUpperCase();
// Error: Property &#39;toUpperCase&#39; does not exist on type &#39;string | number&#39;</code></pre>=&gt; 근데 만약 내가 유니언 타입으로 정의된 타입들 중 하나의 속성만 사용하고 싶다면! =&gt; <code>내로잉</code> 과정을 사용해야함</li>
</ul>
<h2 id="32-내로잉">3.2 내로잉</h2>
<h4 id="내로잉">내로잉</h4>
<ul>
<li>타입의 범위를 좁히는 과정</li>
<li>값이 이전에 유추된 것보다 더 구체적 타입임을 유추하는것</li>
</ul>
<h4 id="타입검사">타입검사</h4>
<ul>
<li>이때 타입을 좁히는 데 사용할 수 있는 논리적 검사</li>
</ul>
<h2 id="내로잉을-하는-방법들💨">내로잉을 하는 방법들💨</h2>
<h3 id="321-값-할당을-통한-내로잉">3.2.1 값 할당을 통한 내로잉</h3>
<pre><code>let admiral: number | string = &quot;grace&quot;; 
// 📌admiral이 string이므로 narrowing 한것
admiral.toUpperCase(); // OK: String

admiral = 23; 
// 📌admiral이 number이므로 narrowing 한것
admiral.toFixed(); // OK</code></pre><h3 id="322-조건-검사를-통한-내로잉">3.2.2 조건 검사를 통한 내로잉</h3>
<ul>
<li>if문으로 변수값 좁히는 방법<pre><code>let scientist = Math.random() &gt; 0.5
  ? &quot;Frank&quot;
  : 51;
</code></pre></li>
</ul>
<p>if(scientist === &quot;Frank&quot;) {
    scientist.toupperCase(); // OK
}</p>
<p>scientist.toupperCase(); // 📌Error 유니언타입 두가지 다 만족해야함</p>
<pre><code>### 3.2.3 typeof 검사를 통한 내로잉
- `typeof`연산자 사용하여 타입 좁히기 = 실용적 방법!</code></pre><p>let something = Math.random() &gt; 0.5 ? &quot;leekoby&quot; : 1;</p>
<p>// type이 number 일 때로 타입 좁히기
if (typeof something === &#39;number&#39;) {
    something.toFixed();
}
// type이 string 일 때로 타입 좁히기
if (typeof something === &#39;string&#39;) {
    something.toUpperCase();
}</p>
<p>// ! 를 사용한 논리 부정과 else 문도 가능 
// type이 number 일 때로 타입 좁히기
if (!(typeof something === &#39;number&#39;)) {
    something.toUpperCase();
} else something.toFixed();
// type이 string 일 때로 타입 좁히기</p>
<p>// 삼항연산자도 사용가능
typeof something === &quot;string&quot; ? something.toUpperCase():something.toFixed()</p>
<p>// ❌ Error : Property &#39;toUpperCase&#39; does not exist on type &#39;number&#39;.
something.toUpperCase();</p>
<pre><code>## 3.3 리터럴 타입
- 리터럴타입: 좀 더 구체적인 버전의 원시타입(원시타입 값 중 어떤것이 아닌 `특정 원싯값`으로 알려진 타입!)</code></pre><p>let name = &quot;mia&quot;; // 📌이 변수의 타입은 string이 아닌 &quot;mia&quot; 다</p>
<pre><code>- 원시 타입에는 무한한 수의 리터럴 타입이 있다.
&gt; boolean: true | false
number: 0 | 1 | 2 | 3 | 0.1 | 0.2 | …
string : “” | “a” | “b” | “ab” | “adkdfo” | …

### 3.3.1 리터럴 할당 가능성
- 동일한 원시타입이어도, 서로 다른 리터럴 타입은 할당할 수 없다</code></pre><p>let name: &quot;mia&quot; = &quot;mia&quot;; // type이 &quot;mia&quot;, 할당한값도 &quot;mia&quot;
something = &quot;you&quot;; // 📌 Error: Type &#39;&quot;you&quot;&#39; is not assignable to type &#39;&quot;mia&quot;&#39;.</p>
<pre><code>- 리터럴 타입은 원시값에 할당 가능 ⭕
- 원시값은 리터럴 타입에 할당 불가 ❌

## 3.4 엄격한 null 검사

- 자바스크립트는 타입이 필요한 위치에 `null값`을 허용한다!
(= 이를 십억달러의 실수라고 부르기도 한다, 이때문에 수많은 오류, 취약성 및 시스템 충돌이 발생했기 때문)

#### strictNullChecks 활성화하는 방법
![](https://velog.velcdn.com/images/gyeongmi_lee/post/336aeb84-7ccd-4318-b6f5-3e2af69b3333/image.png)
</code></pre><p>// ❌ strictNullChecks
let name: string;
console.log(name.length); // No error, but runtime error</p>
<p>// ⭕ With strictNullChecks
let name: string | null;
console.log(name.length); // Error: Object is possibly &#39;null&#39;.</p>
<pre><code>### 3.4.2 참 검사를 통한 내로잉

- 자바스크립트에서 false, 0, -0, &quot;&quot;, null, undefined, NaN 등 `falsy`로 정의된 값을 제외한 모든 값은 참이다
=&gt; 이를 이용해서 검사할 수 있음!</code></pre><p>let okk = Math.random() &gt; 0.5
    ? &quot;mia&quot;
    : undefined; //undefined는 falsy값</p>
<p>if(okk){
    sth.toUpperCase(); //✅
}
okk.toUpperCase();
// ❌ Error : okk&#39; is possibly &#39;undefined&#39;.</p>
<pre><code>&gt;=&gt; `&amp;&amp;`와 `?` 또한 가능하지만 이의 단점으로는
1. 참 여부 확인 회의 다른 기능 제공하지 않음
2. falsy값이 &quot;&quot;라면 빈문자열인지, undefined인지 알수 없음

### 3.4.3 초기값이 없는 변수
- 자바스크립트에서 초기값이 없는 변수는 `undefined`가 된다
- 타입스크립트에서 할당하지 않은 (초기값 없는) 변수 사용하려고 하면 =&gt; 오류 발생
</code></pre><p>let sth: string;
sth.length;
// ❌ Error : Variable &#39;sth&#39; is used before being assigned.</p>
<p>let someth: string | undefined; 
// 변수 타입에 undefined가 포함되어있는 경우에는 오류 보고 안됨</p>
<p>someth?.length; //✅</p>
<p>someth = &quot;leekoby&quot;;
someth.length; // ✅</p>
<pre><code>
## 3.5 타입 별칭
#### 타입별칭
- 재사용하는 타입에 더 쉬운 이름을 할당하는것
- 사용 방법
&gt; type 새로운이름 = 타입
=&gt; pascalCase로 작성
</code></pre><p>type sth = string | name;
let something: sth = &quot;mia&quot;;</p>
<p>type sth2 = boolean | number | string | null | undefined;
let first: sth2;
let second: sth2;
let third: sth2; 
// ⭕ 훨씬 간단한 형태!</p>
<p>console.log(sth2); 
//❌ Error : &#39;sth&#39; only refers to a type, 
but is being used as a value here.</p>
<pre><code>=&gt; 타입별칭은 자바스크립트엔 없다!
=&gt; 컴파일되지 않는다!


### 3.5.2 타입 별칭 결합
- 타입 별칭은 다른 타입 별칭을 참조할 수 있다!</code></pre><p>type Id = number | string;
type Idmaybe = Id | undefined | null
// IdMaybe의 타입은 number | string | undefined | null</p>
<pre><code></code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[타입스크립트 입문] 기본타입들]]></title>
            <link>https://velog.io/@gyeongmi_lee/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%85%EB%AC%B8-%EA%B8%B0%EB%B3%B8%ED%83%80%EC%9E%85%EB%93%A4</link>
            <guid>https://velog.io/@gyeongmi_lee/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9E%85%EB%AC%B8-%EA%B8%B0%EB%B3%B8%ED%83%80%EC%9E%85%EB%93%A4</guid>
            <pubDate>Mon, 24 Apr 2023 08:54:14 GMT</pubDate>
            <description><![CDATA[<pre><code>/* ts의 문자열, 숫자, 배열 기본타입*/
// js 문자열 선언
var str = &#39;hello&#39;;
// ts 문자열 선언
let str2: string = &#39;hello&#39;;
const num: number = 2;
// ts 배열 선언
let arr: Array&lt;number&gt; = [1,2,3]; // arr에는 배열(A는 대문자여야함), 그 안에는 숫자만 들어갈 수 있다.
let arr2:Array&lt;string&gt; = [&quot;a&quot;,2]; // 이러면 에러다
// 배열 리터럴 사용해서 선언
let items: number[] = [1,2,3];

// ts 튜플(tuple)
let address: [string,number] = [&#39;gangnam&#39;, 12] // 요런식으로 배열의 규칙까지 정해주는것, 요소의 타입과 개수가 고정된 배열을 표현할 수 있음

// ts 객체
let obj: object = {};
let person:object = {
    name: &#39;gyoengmi&#39;,
    age:100
} // 위에서 지정한대로만하면 어떤 속성이든지 상관 x , 객체이기만 하면된다

// 하지만 
let person2:{name: string, age: number} = {
    name:&quot;gyoengmi&quot;,
    age:100
} // 이런식으로 타입을 지정해두면 무조건 속성이 있어야만 오류를 안낸다!

// 진위값
let show:boolean = true;
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[PL-900] 파워플랫폼 기초과정 3주차]]></title>
            <link>https://velog.io/@gyeongmi_lee/PL-900-%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%B4%88%EA%B3%BC%EC%A0%95-3%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@gyeongmi_lee/PL-900-%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%B4%88%EA%B3%BC%EC%A0%95-3%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 11 Apr 2023 06:00:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/155421e5-faa7-409b-8bdc-25c5b9f24219/image.png" alt="">
<a href="https://blog.naver.com/ilovehandson/222419854150">https://blog.naver.com/ilovehandson/222419854150</a> =&gt; 참고!
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/8a3ea8ce-d0e8-4cc4-9004-ff240ca9d836/image.png" alt=""></p>
<ul>
<li>캔버스앱에서는 레이아웃 완전 제어 가능 / 모델기반앱에서는 추가하는 <code>구성요소</code>에 의해 대부분 레이아웃 결정됨!
=&gt; 데이터를 빠르게 보고 의사결정 내리는데 더 중점을 둔다</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/34efc738-632d-4eae-a115-5b7f86067534/image.png" alt=""></p>
<p>=&gt; 즉 데이터!!! 중요 !!!!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PL-900] 파워플랫폼 기초과정 2주차]]></title>
            <link>https://velog.io/@gyeongmi_lee/PL-900-%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%B4%88%EA%B3%BC%EC%A0%95-2%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@gyeongmi_lee/PL-900-%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%B4%88%EA%B3%BC%EC%A0%95-2%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Tue, 11 Apr 2023 01:20:28 GMT</pubDate>
            <description><![CDATA[<p><a href="https://blog.naver.com/ilovehandson/222416558156">https://blog.naver.com/ilovehandson/222416558156</a>
<a href="https://learn.microsoft.com/ko-kr/training/modules/build-app-solution/2-learn-basic-elements">https://learn.microsoft.com/ko-kr/training/modules/build-app-solution/2-learn-basic-elements</a></p>
<h1 id="canvas-app">Canvas App</h1>
<ul>
<li>Power Apps에는 화면, 입력, 갤러리, 양식 등을 포함하여 솔루션을 빌드하기 위한 다양한 구성요소가 있다!</li>
</ul>
<h2 id="1-power-apps-studio">1. Power Apps Studio</h2>
<ul>
<li>power apps studio는 앱을 빌드하는데 사용하는 <code>웹 인터페이스</code>의 이름(다운이나 설치가 필요하지않다!)</li>
</ul>
<h2 id="2-app-format">2. App format</h2>
<ul>
<li>앱을 만드는 첫번째 단계는 앱 형식을 선택하는것!</li>
</ul>
<ol>
<li>mobile</li>
<li>tablet
=&gt; 한번 셋업을 하면 바꿀 수 없다!</li>
</ol>
<h2 id="3-gallery">3. Gallery</h2>
<ul>
<li>갤러리 컨트롤은 데이터 테이블의 <code>행</code>을 표시하는데 사용!</li>
<li>사용자의 요구에 맞게 사용자정의할 수 있는 템플릿에 의해 행 표시가 정의(이를 통해 표시되는 열과 형식 지정 방법 제어가능)
=&gt; 파워앱스는 이 탬플릿을 데이터의 모든 행에 자동으로 적용!</li>
</ul>
<h2 id="4-forms">4. Forms</h2>
<ul>
<li>form은 종종 갤러리에서 선택한 항목을 기반으로 하는 특정 레코드 작업에 중점!(사용자는 갤러리 탐색 =&gt; 원하는 행을 찾아 선택해 양식의 세부 정보를 본다)
=&gt; 갤러리와 폼은 이미 구조적으로 만들어져있는 형태!</li>
</ul>
<h2 id="5-input-controls">5. Input Controls</h2>
<ul>
<li>커스터마이징!</li>
<li>앱을 사용자 지정할때 최대한 유연성 허용위해 =&gt; 다양한 입력 컨드롤 존재(ex. 텍스트입력, 버튼, 드롭 다운, 토글, 날짜 선택기 및 슬라이더)</li>
<li>이러한 컨트롤을 =&gt; 갤러리, 양식 및 화면에 추가할 수 있다</li>
</ul>
<h2 id="6-intelligent-controls">6. Intelligent Controls</h2>
<ul>
<li>카메라, 바코드 스캐너, gps 및 기타 하드웨어 기능에 엑세스 할 수 있는 하드웨어 기반 컨트롤</li>
<li>코드 작성하지 않고도, 앱에 인공지능 추가할 수 있는 <code>명함 판독기</code> 또는 <code>객체감지기</code> 같은 서비스 지원 컨트롤도 있음</li>
</ul>
<h2 id="7-functions">7. Functions</h2>
<ul>
<li>모든 컨츠롤, 입력 및 데이터 소스 묶는 !! like 접착제 </li>
<li>하나 이상의 함수를 사용하여 앱에서 수식 만들기 삽가능</li>
<li>excel 함수와 유사! 데이터 원본으로 데이터 보내기, 정보 서식 지정, 애니메이션 만들기 같은 작업에 사용할 수 있다!!!!!!!</li>
</ul>
<h1 id="데이터-원본-연결하기">데이터 원본 연결하기</h1>
<ul>
<li>대부분의 비즈니스 앱은 테이블 형태의 데이터를 다룸</li>
</ul>
<h2 id="어떻게-진행할거냐면요">어떻게 진행할거냐면요</h2>
<p>1) Power Apps로 채울 수 있는 <code>비즈니스 요구사항</code>식별
2) Power Apps에서 필요한 데이터에 연결
3) 최종 사용자가 데이터와 상호작용하여 <code>비즈니스 요구사항</code> 충족할 수 있도록 컨트롤, 버튼 및 사용하기 쉬운 인터페이스 사용해 앱 설계
4) 앱 저장 및 게시 및 기능 테스트
5) 사용자와 앱 공유!</p>
<h3 id="1-power-apps에서-캔버스로-열기">1. power apps에서 캔버스로 열기</h3>
<ul>
<li>그전에 
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/123762a7-b35b-4dbe-b1b1-bdd5b81275cd/image.png" alt="">
=&gt; onedrive에 저장</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/2c86326f-bebb-4841-be8c-3441369a385c/image.png" alt="">
=&gt; canvas 앱에서 연결</p>
<h4 id="엑셀파일에-뭐있냐면">엑셀파일에 뭐있냐면</h4>
<ul>
<li>id</li>
<li>title</li>
<li>subtitle</li>
<li>description</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/adf11e7f-48ac-468a-9db5-fb5c014df95c/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/93f3389e-611d-4006-b15a-2f48cf56cf50/image.png" alt="">
=&gt; 만들어진 것을 볼 수 있음!(데이터를 읽어서 대략 만들어준것임!)</p>
<p>=&gt; 모바일로 열수있음 왕 개쩐다..</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/9368475c-8748-4d65-871d-761c789f8c86/image.png" alt="">
=&gt; 사용자의 요구에 맞게 사용자정의할 수 있는 템플릿에 의해 행 표시가 정의(이를 통해 표시되는 열과 형식 지정 방법 제어가능)
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/b7545f35-488c-4ca2-8466-b1f530d910c7/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/c0d2b00c-6665-420d-ab30-24dd7589499f/image.png" alt="">
=&gt; 요 하나하나가 갤러리 컨트롤 안에 들어있는 서브 컨트롤!</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/47e49808-8521-4d70-b1e3-50443f578015/image.png" alt="">
=&gt; 이렇게 3가지 화면으로 구성되어있고! 각 안에 속성으로 구성되어있는 구조!!</p>
<h3 id="커스터마이징-해보자">커스터마이징 해보자!</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/07392ebc-bc28-44d2-9d9b-4abc83f5a22d/image.png" alt=""></p>
<ul>
<li>보이는갤러리 방식 바꾸기</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/5f66e7ef-6f8d-4dad-a4df-730277355169/image.png" alt="">
=&gt; ThisItem.Address =&gt; ThisItem.Title로 바꾸기</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/f276424f-bcf6-4226-8d73-9ffd1612349b/image.png" alt="">
=&gt; 이렇게 하면 보여지는 부분 좀 더 늘릴 수 있겠다!</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/8aae544c-c963-4ba9-b195-d0d528d3ec49/image.png" alt="">
=&gt; self와 ThisItem의 차이!(수식넣을땐 self 쓰는듯)</p>
<h3 id="다른-데이터도-연결가능하다">다른 데이터도 연결가능하다~</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/d8041af2-65a4-4da0-a5c7-628e5399535a/image.png" alt="">
=&gt; office 365 outlook 같은 다른 데이터도 연결 가능하다!
(데이터 추가를 꼭 눌러야한다!)</p>
<h3 id="detail-screen">Detail Screen</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/98a7a8b0-e650-4d6f-9752-cab338cdc306/image.png" alt=""></p>
<ul>
<li>필드 추가할것임</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/973b9134-42eb-41d2-bcdc-3bdb536b9dad/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/a12810b8-6ca7-47e8-82f0-92b0012ab5a1/image.png" alt="">
=&gt; 추가완! (근데 스크롤 생김)
=&gt; 드래그 앤 드랍으로 조절 가능</p>
<h3 id="edit-screen">Edit Screen</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/c4e58ce2-a664-4dba-ad53-007d065e989b/image.png" alt="">
=&gt; 여러줄 보이게</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/02cfd83c-4c65-4ca1-a192-f38da0d53c2c/image.png" alt="">
=&gt; 이건 그냥 해본것 TrueText / FalseText 속성 있다!</p>
<h3 id="function-사용하기">function 사용하기</h3>
<p><a href="https://blog.naver.com/ilovehandson/222419637480">https://blog.naver.com/ilovehandson/222419637480</a></p>
<ul>
<li>데이터 필터링</li>
<li>데이터 유효성 검사</li>
<li>데이터 계산 ..</li>
</ul>
<p>=&gt; 엑셀함수와 유사하게 사용가능하다!</p>
<h4 id="많이-쓰이는-함수들">많이 쓰이는 함수들</h4>
<ul>
<li>Filter</li>
<li>Match : 주어진 패턴을 따르는지 확인 가능/ 이를 사용하여 사용자가 올바른 형식의 이메일 주소를 입력했는지 확인하고, 입력하지 않은 경우 유효한 이메일이 필요하다는 경고 표시 가능! (즉, 조건부 서식에 적합)</li>
<li>Distinct : 데이터 목록에서 고유한 값 반환 가능 / 사용자에게 주어진 열에 대해 유효한 값만 표시하는 동적 드롭다운을 쉽게 만들 수 있다</li>
<li>Math functions: Sum / Average와 같은 단순 데이터부터, 복잡한 공식까지 포함!(radian사용하는 Atan , Sin 등등)
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/06fa4673-b476-4bdc-9c90-480143258a16/image.png" alt=""></li>
</ul>
<p>=&gt; 추가적으로 학습하면 좋은 자료
<a href="https://learn.microsoft.com/ko-kr/training/paths/use-basic-formulas-powerapps-canvas-app/">https://learn.microsoft.com/ko-kr/training/paths/use-basic-formulas-powerapps-canvas-app/</a></p>
<h2 id="앱-공유하기">앱 공유하기</h2>
<p><a href="https://blog.naver.com/ilovehandson/222419715900">https://blog.naver.com/ilovehandson/222419715900</a></p>
<ul>
<li>개인별 공유</li>
<li>전체 공유</li>
<li>특정 그룹 대상 공유(보안 그룹)
=&gt; 보안그룹 / 개별 공유 둘다 있으면 어떤게 우선? 개별 공유가 우선!(그룹 해제여도 개별로 되어있으면 볼 수 있다고함)
=&gt; 공유 받는 계정은 반드시 파워 앱 라이센스가 있어야한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/3b0b738d-d54e-404f-8093-158f045c5be7/image.png" alt="">
=&gt; 나는 이메일 아는 사람이 없어서 아직... 못보내는데 암튼간에 이런식으로 작성하면 됨</p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/6316abb8-8458-48a6-8131-4c6c39a82466/image.png" alt=""></p>
<h4 id="knowledge-check">knowledge check!</h4>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/3d5be033-a659-40f6-9ba9-64cbfcb03ecc/image.png" alt="">
=&gt; 갤러리 복합적인 데이터 보여줄때
=&gt; form 형식은 각각의 개별 레코드를 보여줄때/ 수정할때 좋음!
=&gt; input 컨트롤은 복합데이터~
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/9a22111b-a42a-4499-b0e0-8edeca936c91/image.png" alt="">
=&gt; 미디어: 하드웨어와 직접적으로 연관될때 쓰임 (ex. 바코드 스캐너)(미디어 컨트롤 안에 intelligent control이 들어있음)
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/77485f99-de0d-418b-a131-032cdaefe995/image.png" alt=""></p>
<h4 id="추가적으로">추가적으로</h4>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/11352902-87d1-49e2-8cd7-5ab0841a92c6/image.png" alt="">
=&gt; 아이콘 또한 변경 가능하다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[엑셀정복] Excel이란✔️]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EC%97%91%EC%85%80%EC%A0%95%EB%B3%B5-Excel%EC%9D%B4%EB%9E%80</link>
            <guid>https://velog.io/@gyeongmi_lee/%EC%97%91%EC%85%80%EC%A0%95%EB%B3%B5-Excel%EC%9D%B4%EB%9E%80</guid>
            <pubDate>Mon, 10 Apr 2023 11:28:42 GMT</pubDate>
            <description><![CDATA[<ul>
<li>원페이지 보고서의 가장 좋은 방법이다!</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/556cf65b-a690-408e-9116-7cd5cb9e590a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[파워플랫폼 기본 사항] 모델 기반 앱]]></title>
            <link>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EB%B3%B8-%EC%82%AC%ED%95%AD-%EB%AA%A8%EB%8D%B8-%EA%B8%B0%EB%B0%98-%EC%95%B1</link>
            <guid>https://velog.io/@gyeongmi_lee/%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EB%B3%B8-%EC%82%AC%ED%95%AD-%EB%AA%A8%EB%8D%B8-%EA%B8%B0%EB%B0%98-%EC%95%B1</guid>
            <pubDate>Mon, 10 Apr 2023 06:13:05 GMT</pubDate>
            <description><![CDATA[<p>참고 : <a href="https://blog.naver.com/ilovehandson/222419854150">https://blog.naver.com/ilovehandson/222419854150</a>
(local - lab3 모델 기반앱으로 주문 관리 만들기)</p>
<h1 id="모델-기반-앱-소개">모델 기반 앱 소개</h1>
<ul>
<li><p>모델 기반 앱 디자인 : 대시보드, 양식, 보기 및 차트를 앱에 추가하는데 초점을 맞춘 접근 방식
=&gt; 코드가 거의 또는 전혀없이 간단하거나, 매우 복잡한 앱을 빌드 할 수 있다!</p>
</li>
<li><p><code>캔버스 앱</code>에서 제작자는 앱 레이아웃을 완조니 제어가능!</p>
</li>
<li><p>반면 <code>모델 기반 앱</code>에서는 구성요소에 의해 대부분의 레이아웃 결정됨
=&gt; 복잡한 앱 디자인 대신 비즈니스 데이터를 빠르게 보고 의사결정 내리는데 더 중점 둔다!</p>
</li>
</ul>
<h2 id="실습내용">실습내용</h2>
<ol>
<li>모델 기반 앱(Machine Orders) 만들기</li>
<li>Machine Orders에 procurement(=가공) 열 추가!
=&gt; 이 과정에서 비즈니스 프로세스 흐름을 만들었다!</li>
<li>비즈니스 프로세스 흐름 만들기
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/4e705903-b283-4d8f-add8-721538879e76/image.png" alt=""></li>
<li>조건 분기 추가</li>
<li>양식수정</li>
<li>보기수정
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/99eec787-004a-45bc-8d61-86bffde0d94d/image.png" alt="">
=&gt; 이런식으로 보여지는 방식을 수정함!</li>
<li>앱 테스트</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PL-900] 파워플랫폼 기초과정 1주차]]></title>
            <link>https://velog.io/@gyeongmi_lee/PL-900-%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%B4%88%EA%B3%BC%EC%A0%95-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@gyeongmi_lee/PL-900-%ED%8C%8C%EC%9B%8C%ED%94%8C%EB%9E%AB%ED%8F%BC-%EA%B8%B0%EC%B4%88%EA%B3%BC%EC%A0%95-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Mon, 10 Apr 2023 02:11:10 GMT</pubDate>
            <description><![CDATA[<p><a href="https://learn.microsoft.com/ko-kr/training/modules/introduction-common-data-service/1-introduction">https://learn.microsoft.com/ko-kr/training/modules/introduction-common-data-service/1-introduction</a>
=&gt; 참고 DOCS ko / en 버전!
<a href="https://learn.microsoft.com/en-us/training/modules/introduction-common-data-service/1-introduction">https://learn.microsoft.com/en-us/training/modules/introduction-common-data-service/1-introduction</a></p>
<h2 id="커넥터란">커넥터란</h2>
<ul>
<li>MS 파워플랫폼에서 다양한 데이터 소스 및 애플리케이션에 연결할 수 있는 프리미엄 및 표준 연결 모듈!
ex. Salesforce, Dynamics 365, Dropbox, Gmail등 다양한 애플리케이션과 데이터 소스에 연결 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/73e113ec-8731-415a-a8bd-ef9378db4296/image.png" alt=""></p>
<h3 id="action">Action</h3>
<ul>
<li>커넥터를 통해 애플리케이션에서 수행할 작업을 정의
ex. dynamics 365 커넥터에서 &quot;새로운 고객 만들기&quot; 액션 수행 가능</li>
</ul>
<h3 id="trgger">Trgger</h3>
<ul>
<li>특정 이벤트가 발생하면 실행되는 작업
ex. 새로운 이메일이 수신되었을 때, OneDrive에 파일이 업로드되었을 때 등과 같은 이벤트가 트리거될 수 있습니다.</li>
</ul>
<p>=&gt; 이들은 비즈니스 프로세스 자동화 구축, 실행하는데 중요한 역할</p>
<h3 id="데이터-보호">데이터 보호!</h3>
<p>=&gt; 가능하다</p>
<p><a href="https://learn.microsoft.com/ko-kr/training/modules/introduction-power-platform/10-knowledge-check">https://learn.microsoft.com/ko-kr/training/modules/introduction-power-platform/10-knowledge-check</a>
=&gt; knowledge check
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/66b78947-d2ac-475a-b422-37e56c371e31/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/3aaa8472-2b9e-47c5-adf3-24cdf1c188b7/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/7bebc7dc-6407-4d48-b9ec-2e6c6d49fa6a/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/53c88c57-1266-411b-95d8-41eaf7594ea1/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/b565bdf3-4418-419a-a5c5-b53da7940ebc/image.png" alt=""></p>
<h3 id="사용자-지정-커넥터">사용자 지정 커넥터</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/7a68cea4-0151-44af-80c9-962c753590d7/image.png" alt="">
ex. </p>
<ul>
<li>구글 맵스 api 만들어서 연결하거나!</li>
<li>로그인 api 가져오거나!</li>
</ul>
<h3 id="데이터-원본">데이터 원본</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/584b3495-44ea-4e4a-ad72-b330423f857b/image.png" alt=""></p>
<ul>
<li>json(javascript object notation)은 트리구조이다! (데이터를 계층적 형식으로 나타내기 때문에)
=&gt; json데이터는 이름과 값의 쌍으로 이루어진다.
=&gt; <code>,</code> 로 나열
=&gt; 객체는 중괄호로 둘러쌓아 표현 / 배열은 대괄호로 둘러쌓아 표현
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/642c07d4-bd5c-4882-ae41-fa649b7e9c3a/image.png" alt=""></li>
</ul>
<p>=&gt; ✨중요한건 JSON은 데이터를 나타내는 트리 구조를 사용하여 데이터를 효율적이고 체계적으로 저장하고 검색할 수 있게한다. 대부분 프로그래밍 언어에는 트리와 같은 데이터 구조를 지원하므로 <code>프로그래밍 언어 사용하여</code> 데이터를 쉽게 구문 분석하고 조작할 수 있다!</p>
<h1 id="dataverse-소개--범주와-서비스-내용">Dataverse 소개 : 범주와 서비스 내용</h1>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/90a543d5-ba9d-4ca1-9404-9e096b96fc88/image.png" alt=""></p>
<h2 id="ms-dataverse">MS Dataverse?</h2>
<ul>
<li>파워플랫폼에서 사용되는 데이터 플랫폼. 엔터프라이즈급 애플리케이션에서 사용되는 데이터를 저장, 분석, 관리하는데 사용!
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/c9076e85-5479-4c7e-8693-8346e7e301b9/image.png" alt="">
=&gt; Ms Dataverse는 안전하고 규정 준수 방식으로 상호 연결된 애플리케이션 및 프로세스를 지원하도록 다양한 데이터 및 비즈니스 논리를 쉽게 <code>구조화</code>하는 클라우드 기반 솔루션! =&gt; 인터넷 연결 필요</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/b282d915-fe52-47f3-9873-29accf9e60a1/image.png" alt=""></p>
<h3 id="환경에-대해-알아보기">환경에 대해 알아보기</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/f5c74d59-e691-4e09-ac8c-52432aaac7ec/image.png" alt=""></p>
<ul>
<li><p>Tenant : <code>ms 클라우드 서비스</code>를 사용하는 조직 또는 엔터프라이즈를 나타내는 용어(세포의 오그같은 개념인듯)</p>
</li>
<li><p>환경: Ms Power Platform 에서 조직의 비즈니스 데이터, 앱, 흐름을 저장, 관리, 공유하는데 사용됨. 
(환경에서는 사용자 액세스, 보안 설정 및 해당 데이터베이스와 연결된 스토리지 관리 가능)
=&gt; 환경은 테넌트 아래 만들어짐. 사용자는 각 테넌트 내에서 해당 리소스에만 액세스 가능~
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/5ad9058b-2617-425d-ad69-f3ce470580bd/image.png" alt="">
=&gt; 환경은 지역에 따라 나뉘어질수있고, 목적에 따라 나뉘어질 수 있음</p>
</li>
</ul>
<h3 id="비즈니스-규칙-검색">비즈니스 규칙 검색</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/7ea8c36b-6af1-4491-a54d-3dc288061bae/image.png" alt=""></p>
<ul>
<li>내가 비즈니스에 필요한 조건을 붙여넣는것!
=&gt; ex. 승인을 받을때는 무조건 vp 승인자 입력 요청을 받아야해!라는 조건을 걸어둔것
=&gt; 전체 테넌트에 조건이 걸리는것(관리가 쉬움!)
장점 : 확장성
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/4ce1071a-b569-478d-9fa3-08c5aa346e2a/image.png" alt=""></li>
</ul>
<h3 id="어떻게-하는데">어떻게 하는데!</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/ab16b971-88bf-47b4-a6d2-4f4d8fa9719a/image.png" alt=""></p>
<p>파워앱스 &gt; 설정 &gt; 관리센터
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/4fa74835-abad-470c-aa53-bc588be6f94f/image.png" alt=""></p>
<ul>
<li>시작하려면 먼저 Ms Dataverse에서 표준화된 클라우드 기반 데이터베이스 인스턴스 하나 이상 만든다!
(db에는 거의 모든 조직과 비즈니스에서 일반적으로 발견되는 데이터를 저장하는 미리 정의된 테이블과 열이 포함되어있다!)
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/e3ad4bc7-1412-4a8a-b6d8-b63ee0b25052/image.png" alt=""></li>
</ul>
<h3 id="dataverse의-테이블-형식">dataverse의 테이블 형식</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/d2e84638-51e2-4272-ae2a-121fa4df8f89/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/37062e7c-0ba0-4f62-86bb-eadf5eef8067/image.png" alt="">
(강의에선 복합이었는데 바뀐듯?)</p>
<h3 id="관계-이해">관계 이해</h3>
<blockquote>
<p>판매 주문을 관리하는 시스템을 만들어야 한다고 가정.</p>
</blockquote>
<ol>
<li>보유중인 재고, 항목의 비용 및 판매 가격과 함께 제품 목록이 필요.</li>
<li>주소 및 신용등급이 포함된 마스터 고객 목록도 필요.</li>
<li>청구서 데이터를 저장하는데 도움이 되도록 작성한 판매 청구서 관리해야함(날짜, 청구서 번호 및 판매원과 같은 정보, 주소 및 신용등급을 포함한 고객정보, 청구서의 각 항목에 대한 품목 포함!)</li>
</ol>
<p>=&gt; 이 기능 지원 위해서 단일 테이블 만드는것은 비효율적</p>
<ul>
<li>고객</li>
<li>제품</li>
<li>송장</li>
<li>품목
=&gt; 4개의 테이블 만들기, 분할로 만들고 서로 관련시키면 효과적으로 만들 수 있다~</li>
</ul>
<h4 id="일대다-관계--부모-자식-관계">일대다 관계 : 부모-자식 관계</h4>
<ul>
<li>청구서 테이블(부모) / 품목 테이블(자식)
=&gt; 청구서 테이블의 unique한 열(고유한 열! = <code>키!</code>)
=&gt; 동일한 값이 관련된 자식행에 저장
(자식 행이 부모 키 값을 저장하는데 사용된 경우 = <code>외래키</code></li>
</ul>
<p>=&gt; Ms Dataverse에는 대부분 조직에 필요한 여러 테이블들이 이미 포함되어있다! 표준 테이블을 사용하고 확장하면 솔루션에 사용되는 검증되고 스케일링 가능한 데이터 저장 방법 기반으로 솔루션 빌드 가능~</p>
<h4 id="지식-확인">지식 확인</h4>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/4118b975-1093-4b4a-8e08-22366972fe28/image.png" alt="">
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/b45eafb8-78b5-4427-8c20-542c501d96c8/image.png" alt=""></p>
<ul>
<li>비용센터 : 번호를 채워야함...! =&gt; 얘를 잊지않도록 해야하니까 조건 걸어두는것임!
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/27abb4a8-7a1a-4537-ab55-8e184ec79cb6/image.png" alt=""></li>
</ul>
<h1 id="power-apps">Power Apps</h1>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/340b1dea-8d27-4683-b54c-d9e3081d4756/image.png" alt=""></p>
<ul>
<li>사용조건이 있음! : 테넌트 조직에 따라 갈린다!
(포털앱은 누구나 사용가넝, 캔버스앱 / 모델기반 앱은 테넌트 내에서만 사용가능하다)
=&gt; 모델기반앱 : 데이터를 중심으로 하는 앱(데이터 논리구조, 보안만 신경쓰면됨!)
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/1ea64af1-0860-436c-9a09-173b3b71e771/image.png" alt=""></li>
</ul>
<h3 id="출석-앱-만들어보기">출석 앱 만들어보기</h3>
<p><a href="https://blog.aliencube.org/ko/2020/04/01/capturing-images-from-browser-to-azure-blob-storage-via-azure-functions/">https://blog.aliencube.org/ko/2020/04/01/capturing-images-from-browser-to-azure-blob-storage-via-azure-functions/</a>
<a href="https://blog.aliencube.org/ko/2020/04/15/building-online-check-in-app-with-power-apps/">https://blog.aliencube.org/ko/2020/04/15/building-online-check-in-app-with-power-apps/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[러닝타입스크립트]2. 타입 시스템]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EB%9F%AC%EB%8B%9D%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B82%EC%9E%A5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C</link>
            <guid>https://velog.io/@gyeongmi_lee/%EB%9F%AC%EB%8B%9D%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B82%EC%9E%A5-%ED%83%80%EC%9E%85-%EC%8B%9C%EC%8A%A4%ED%85%9C</guid>
            <pubDate>Sun, 09 Apr 2023 09:20:21 GMT</pubDate>
            <description><![CDATA[<h3 id="또-까먹은-js파일-console로-찍는법">또 까먹은 js파일 console로 찍는법</h3>
<p><a href="https://velog.io/@akwnsldj1/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Javascript-%ED%99%95%EC%9E%A5%EC%9E%90-.js%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C-%EC%BD%98%EC%86%94%EC%B0%BD-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95">https://velog.io/@akwnsldj1/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Javascript-%ED%99%95%EC%9E%A5%EC%9E%90-.js%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C-%EC%BD%98%EC%86%94%EC%B0%BD-%EC%B6%9C%EB%A0%A5%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</a></p>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/c4488d22-8d30-4d0c-b8d2-741f8d4ac6f9/image.png" alt=""></p>
<blockquote>
<p>자바스크립트의 힘은 유연함에서 나온다! 유연함 조심!</p>
</blockquote>
<p>=&gt; 타입스크립트는</p>
<p>1) 코드가 작동하는 방식을 이해하고
2) 오류가 있는 부분을 알려주는 타입 검사기의 역할을 한다!
(지난 1장에서 살펴봄 ~)</p>
<h2 id="그니까-그거-어케하는건데">그니까 그거 어케하는건데</h2>
<h2 id="21-타입의-종류">2.1 타입의 종류</h2>
<pre><code>let singer = &quot;ME!&quot;;</code></pre><ul>
<li><p>마우스 오버하면 string타입이라고 알려줌!</p>
</li>
<li><p>타입 : 자바스크립트에서 다루는 <code>값의 형태</code>에 대한 설명
(여기서 형태란, 값에 존재하는 속성과 메서드 그리고 내장되어있는 typeof 연산자가 설명하는것을 의<del>미</del>)</p>
</li>
</ul>
<h3 id="일곱가지의-원시타입">일곱가지의 원시타입</h3>
<ol>
<li>null</li>
<li>undefined</li>
<li>boolean</li>
<li>string</li>
<li>number</li>
<li>bigint</li>
<li>symbol</li>
</ol>
<h3 id="211-타입-시스템">2.1.1 타입 시스템</h3>
<ul>
<li>타입 시스템 ❓: 프로그래밍 언어가 프로그램에서 가질 수 있는 타입을 이해하는 방법에 대한 규칙 집합</li>
</ul>
<p>=&gt; 어케 작동하냐면요!</p>
<ul>
<li>코드를 읽고 존재하는 모든 타입과 값을 이해한다</li>
<li>각 값이 초기 선언에서 가질 수 있는 타입을 확인</li>
<li>각 값이 추후 코드에서 어떻게 사용될 수 있는 지 모든 방법을 확인</li>
<li>값의 사용법이 타입과 일치하지 않으면 사용자에게 오류 표시!</li>
</ul>
<h3 id="212-오류-종류">2.1.2 오류 종류</h3>
<ul>
<li>구문 오류 : 타입스크립트 =&gt; 자바스크립트로 변환되는 것을 차단한 경우<pre><code>let let wat;
// Error: &#39;,&#39; expected.</code></pre></li>
<li>타입 오류 : 타입 검사기에 따라 일치하지 않는것이 감지된 경우<pre><code>console.blub(&quot;Notiong&quot;);
// Error: Property &#39;blub&#39; does not exist on type &#39;Console&#39;.</code></pre></li>
</ul>
<h2 id="22-할당-가능성">2.2 할당 가능성</h2>
<ul>
<li><p>타입스크립트는 변수의 초깃값을 읽고 해당 변수가 허용되는 타입을 결정한다.
ex. 첨 string =&gt; 재할당 string 문제 안되지만, 
string =&gt; boolean은 안된단 소리</p>
</li>
<li><p>즉, 전달된 값이 예상된 타입으로 할당 가능한지 여부를 <code>할당 가능성</code>이라고 함</p>
</li>
</ul>
<pre><code>let lastName = &quot;mia&quot;;
lastName = true;
// Error : type &quot;boolean&quot; is not assignable to type &quot;string&quot;.</code></pre><h2 id="23-타입-애너테이션">2.3 타입 애너테이션</h2>
<ul>
<li><p>초깃값이 없는 경우라면 타입 애너테이션을 이용해 타입 지정가능.</p>
</li>
<li><p>초기값을 유추할 수 없는 변수는 <code>진화하는 any</code>라고 부른다</p>
</li>
</ul>
<pre><code>let myName: string;
myName = &quot;mia&quot;;
myName = 22; // Error : &quot;number&quot;은 &quot;string&quot; 형식에 할당 할 수 없다.</code></pre><ul>
<li><p>타입스크립트는 초깃값을 할당하지않고도 변수의 타입을 선언할 수 있는 구문인 <code>type annotation</code>을 제공!</p>
</li>
<li><p>타입애너테이션은 타입스크립트에만 존재하며, 런타임 코드에도 영향 주지 않고 유효한 자바스크립트 구문도 아님!</p>
</li>
<li><p>명시적 타입정의(타입 애너테이션)는 타입스크립트가 자체적으로 수집할 수 없을때만 사용하는것이 좋다.</p>
</li>
</ul>
<h2 id="24-타입-형태">2.4 타입 형태</h2>
<ul>
<li>타입스크립트는 해당 변수의 타입에 사용하려는 <code>속성이 존재하는지</code>도 확인한다.<pre><code>let rapper = &quot;Queen&quot;;
rapper.length; // OK
</code></pre></li>
</ul>
<p>rapper.push(&#39;!&#39;);
// Error: Property &#39;push&#39; does not exist on type &#39;string&#39;</p>
<pre><code>
### 2.4.1 모듈
- ECMA 스크립트 2015에서는 import, export 구문을 표준화하기위해 `모듈`이 추가됨!
- `모듈` : export 또는 import가 있는 파일
- `스크립트` : 모듈이 아닌 모든 파일!

=&gt; 모듈은 전역 스코프가 아닌 자체 스코프 내에서 실행됨!
(즉 모듈 내에서 선언된 변수, 함수, 클래스 등은 export 양식중 하나를 사용하여 명시적으로 export하지 않는 한 모듈 외부에서 보이지 앟음)
- 즉 export한 변수, 함수, 클래스, 인터페이스 등을 사용하기 위해서는 import양식중 하나를 사용하여 import 해야함!

![](https://velog.velcdn.com/images/gyeongmi_lee/post/6d311e32-14dd-43c1-a03e-e180694c8f59/image.png)
</code></pre><p>import {value} from &quot;./values&quot;;
export const doubled = value * 2;</p>
<pre><code>
1. 모듈 : 한 모듈에서 다른 파일에 선언된 변수와 동일한 이름으로 선언된 변수는 다른 파일의 변수를 가져오지 않는 한 이름 충돌로 간주하지 않는다!
</code></pre><p>// a.ts
export const myName = &quot;Lee&quot;;</p>
<p>// b.ts
expoprt const myName = &quot;Lee&quot;;</p>
<p>// c.ts
import { myName } from &quot;./a&quot;;
console.log(myName);</p>
<pre><code>
2. 스크립트 : 파일이 스크립트라면 해당 파일을 전역 스코프로 간주하므로! 모든 스크립트가 파일의 내용에 접근 가능이다. 즉, 스크립트 파일에 선언된 변수는 다른 스크립트 파일에 선언된 동일 이름 가질 수 없다!!
</code></pre><p>// a.ts
const myName = &quot;Lee&quot;
// Error : Cannot redeclare blok-scoped varible &quot;myName&quot;.</p>
<p>// b.ts
const myName = &quot;Lee&quot;;
// Error : Cannot redeclare block-scoped varible &quot;myName&quot;.</p>
<p>// a.ts &amp;&amp; b.ts
const myName = &quot;Lee&quot;;<br>export {};
```</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[러닝 타입스크립트]1. 자바스크립트에서 타입스크립트로]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EB%9F%AC%EB%8B%9D-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B81.-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C</link>
            <guid>https://velog.io/@gyeongmi_lee/%EB%9F%AC%EB%8B%9D-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B81.-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A1%9C</guid>
            <pubDate>Mon, 03 Apr 2023 12:34:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/e0ecaf5a-adb7-446f-ac9d-4bdb7eb37768/image.png" alt=""></p>
<h2 id="타입스크립트">타입스크립트</h2>
<ul>
<li>타입스크립트는 4가지로 설명된다</li>
</ul>
<ol>
<li><strong>프로그래밍언어</strong>: 자바스크립트의 모든 구문과, 타입을 정의하고 사용하기 위한 타입스크립트 고유 구문이 포함된 언어</li>
<li><strong>타입 검사기</strong>: 자바스크립트 및 타입스크립트로 작성된 일련의 파일에서 생성된 모든 구성요소(변수, 함수 등)를 이해하고, 잘못 구성된 부분을 알려주는 프로그램</li>
<li><strong>컴파일러</strong>: 타입 검사기를 실행하고 문제를 보고한 후 이에 대응되는 자바스크립트 코드를 생성하는 프로그램</li>
<li><strong>언어 서비스</strong>: 타입 검사기를 사용해 비주얼 스튜디오 코드와 같은 편집기에 개발자에게 유용한 유틸리티 제공법을 알려주는 프로그램</li>
</ol>
<h2 id="공식-웹사이트">공식 웹사이트</h2>
<p><a href="https://www.typescriptlang.org/ko/play">https://www.typescriptlang.org/ko/play</a>
=&gt; 공식 웹사이트는 플레이그라운드 편집기를 제공!</p>
<h3 id="바벨이-뭐였더라">바벨이 뭐였더라</h3>
<ul>
<li>바벨 : 바벨은 최신버전의 JavaScript 코드를 모든 브라우저에서 실행할 수 있는 이전 버전으로 변환하기 위해 웹 개발자가 사용하는 인기있는 오픈 소스 도구!</li>
</ul>
<p>=&gt; 바벨은 코드의 다른 부분을 변환하는 데 사용할 수 있는 <code>플러그인</code>이라는 기능을 활용하여 이를 달성한다!</p>
<h4 id="그니까-타입스크립트에서-바벨쓰는이유">그니까 타입스크립트에서 바벨쓰는이유~</h4>
<blockquote>
<p>Babel은 개발자가 최신 JavaScript 코드를 작성한 다음 모든 브라우저에서 지원하는 이전 버전의 JavaScript로 변환할 수 있는 도구입니다. Babel은 코드의 다른 부분을 변환하는 데 사용할 수 있는 &quot;플러그인&quot;이라는 기능을 활용하여 이를 달성합니다.
TypeScript는 유형 주석 및 기타 기능을 언어에 추가하는 JavaScript의 상위 집합입니다. TypeScript 컴파일러를 사용하여 TypeScript를 JavaScript로 변환할 수 있지만 Babel이 필요한 경우가 여전히 있을 수 있습니다.
TypeScript와 함께 Babel을 사용하는 한 가지 이유는 Babel이 제공하는 고급 변환 플러그인 중 일부를 활용하기 위해서입니다. 예를 들어 Babel을 사용하여 TypeScript에서 아직 지원하지 않는 실험적인 JavaScript 기능을 변환할 수 있습니다.
TypeScript와 함께 Babel을 사용하는 또 다른 이유는 출력 코드가 최신 JavaScript 기능을 지원하지 않는 브라우저를 포함하여 모든 브라우저와 호환되도록 하기 위해서입니다. Babel은 특정 버전의 JavaScript를 대상으로 구성할 수 있으므로 개발자는 최신 구문을 사용하여 코드를 작성하면서 이전 브라우저에서도 실행할 수 있습니다.
전반적으로 TypeScript와 함께 Babel을 사용하면 개발자에게 출력 코드에 대한 더 많은 유연성과 제어 기능을 제공하는 동시에 더 넓은 범위의 브라우저와 호환되도록 할 수 있습니다.</p>
</blockquote>
<h3 id="로컬에서-시작하려면">로컬에서 시작하려면</h3>
<ul>
<li>Node.js가 설치되어있다면 타입스크립트를 실행 할 수 있다!</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] 데이터베이스란?]]></title>
            <link>https://velog.io/@gyeongmi_lee/MySQL-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%9E%80</link>
            <guid>https://velog.io/@gyeongmi_lee/MySQL-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EB%9E%80</guid>
            <pubDate>Tue, 21 Mar 2023 08:44:43 GMT</pubDate>
            <description><![CDATA[<h2 id="mysql">MySQL</h2>
<ul>
<li><code>RDBMS</code>(Relational Database Management System)</li>
</ul>
<h3 id="데이터베이스란">데이터베이스란?</h3>
<ul>
<li>한곳에 저장된 정보들을 원하는 어떤 곳에서든 사용할 수 있다는것
=&gt; 즉 특정 소프트웨어나 프로그램에 종속되지 않고 독립된 정보의 집합 내지 저장소</li>
</ul>
<p>🙌 즉 데이터베이스 자체는 <code>빈창고</code>나 <code>캐비넷</code>처럼 별다른 기능이 없다!
=&gt; 원하는 기능들을 넣어서 <code>자판기</code>처럼 만들어둔것이 =&gt; <code>DBMS</code> (Database Management System)</p>
<h3 id="sql이란">SQL이란?</h3>
<ul>
<li>Structured Query Language를 사용해서 정보를 입력, 조회, 수정, 삭제하는 등 데이터를 관리할 수 있도록 제공하는 방식이 있다!</li>
</ul>
<h3 id="mysql에-정보가-저장되는-방식">MySQL에 정보가 저장되는 방식</h3>
<blockquote>
<p>EX. 백화점에 푸드코드가 있고, 거기서 사먹을수 있는 메뉴의 정보를 데이터베이스로 정리해서 서버에 저장하려고 한다면?</p>
</blockquote>
<p>=&gt; 방법1: 폴더 만든 후 &gt; 메뉴마다 정보들을 TXT파일로 적어서 &gt; 폴더에 저장
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/29bac536-6280-43ab-914b-3060608b01ab/image.png" alt="">
✔ 실제로 MONGODB에서 이런 방식들을 사용한다!
 ✨ 문제: 저장하는 데이터형식이 다른 문제를 야기할수 있고 =&gt; 이는 오류를 일으킨다.</p>
<p> =&gt; 즉! 데이터 형식을 맞춰줄 필요가 있다! LIKE 표처럼!
 =&gt; 이럴때 사용하는 방식이 <code>DBMS</code> (Database Management System)</p>
<h3 id="근데-mysql은-rdbms">근데 MySQL은 RDBMS!</h3>
<p><code>Relational</code>이란 관계형! 이라는 뜻
=&gt; 중복되는 데이터가 있을 경우, 비효율과 오류의 소지가 많음</p>
<p>=&gt; 이 테이블을 적절히 분리해야함!</p>
<h3 id="어떻게-알아보는데">어떻게 알아보는데?</h3>
<p>=&gt; id 즉 고유한 값으로 알아본다
(너무 알아보기 불편함)</p>
<h3 id="이때-등장한게-join">이때 등장한게 Join</h3>
<ul>
<li>Join : 분리된 여러 테이블들을 이어주는 기능
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/67edf310-d098-4d92-ab4b-f4cfe00e540e/image.png" alt=""></li>
</ul>
<h3 id="그니까">그니까</h3>
<p>관계형은 SQL, 비관계형은 NoSQL 데이터베이스다.</p>
<p><a href="https://www.yalco.kr/lectures/sql/">https://www.yalco.kr/lectures/sql/</a> 
=&gt; 보조교재!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CS] 클라우드의 이해 IAAS, PAAS, SAAS]]></title>
            <link>https://velog.io/@gyeongmi_lee/CS-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EC%9D%98-%EC%9D%B4%ED%95%B4-IAAS-PAAS-SAAS</link>
            <guid>https://velog.io/@gyeongmi_lee/CS-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C%EC%9D%98-%EC%9D%B4%ED%95%B4-IAAS-PAAS-SAAS</guid>
            <pubDate>Wed, 08 Mar 2023 05:27:29 GMT</pubDate>
            <description><![CDATA[<p>영상 참고
<a href="https://youtu.be/7TLUmbpU9qY">https://youtu.be/7TLUmbpU9qY</a></p>
<h2 id="클라우드">클라우드</h2>
<ul>
<li>클라우드: &#39;인터넷&#39;을 통해 접근할 수 있는 서버, 그 안에서 구동되는 소프트웨어, 데이터베이스 의미</li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/de187c4e-e163-4d65-86a5-cbe72fcef3b5/image.png" alt=""></p>
<p>=&gt; 즉 사진처럼 나의 컴퓨터 장비를 사용하지 않고 컴퓨터 장비를 통해 구축해야할 작업을! 온라인에 분산되어 존재하는 <code>데이터센터(이하 클라우드)</code>에 맡겨 수행하는것!</p>
<p>✔️ 당연히 서버를 직접 구매해서 쓰는게 아니므로 전력, 위치, 서버세팅, 확장성 등을 고민하지 않고 서비스 운영에만 집중할수 있다 =&gt; <code>off-premise방식</code>
(직접 서버 사서 직접 구현하는게 <code>on-premise방식</code> 기업이나 개인이 자체 시설에서 보유하고 직접 유지관리하는 프라이빗 데이터 센터)</p>
<p>🙋‍♀️즉 쉽게 말하자면 클라우드는 인터넷을 통해 언제 어디서나 데이터와 애플리케이션을 사용할 수 있는 기술</p>
<h3 id="그럼-iaas-paas-saas는-뭔데">그럼 IAAS, PAAS, SAAS는 뭔데?</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/bc4445bb-359a-49ee-bbaf-e0639c0af63a/image.png" alt=""></p>
<h4 id="saassoftware-as-a-service">SaaS(Software as a service)</h4>
<p>-&gt; (사진에서도 보이듯 직접 관리해야하는거 없다!)</p>
<ul>
<li>SAAS는 인터넷을 통해 소프트웨어를 제공하는 방법. 완제품!
ex. 세일즈포스, 구글드라이브, n드라이브, 구글 DOCS등
=&gt; 마치 넷플릭스 구독 서비스처럼 클라우드 기업에서 호스팅 방식으로 소프트웨어를 제공하는 클라우드 서비스</li>
</ul>
<h5 id="saas의-장점">SaaS의 장점</h5>
<ul>
<li>사용자는 소프트웨어를 다운로드하거나 설치할 필요가 없으므로 비용 절감 가능(인터넷이 연결된 기기에서 즉시 사용 가능)</li>
<li>SaaS 제공업체는 보안 및 유지보수와 같은 기술문제를 처리하기때문에 사용자는 이러한 문제에 대해서 부담을 덜 수 있음</li>
<li>SaaS 솔루션은 유연하며 필요에 따라 쉽게 확장 가능</li>
</ul>
<h4 id="iaasinfrastructure-as-a-service">IaaS(Infrastructure-as-a-Service)</h4>
<ul>
<li>IaaS(Infrastructure-as-a-Service). 인프라를 제공(서버와 저장소를 준다) =&gt; 즉 빈방을 주는것!</li>
<li>가상머신 위에서 애플리케이션의 각 컴포넌트가 구동됨. </li>
<li>특정 클라우드에 종속 x.</li>
<li>운영비가 상승, 이식성 좋음</li>
<li>ex. AWS의 EC2, NCP(네이버 클라우드 플랫폼)등(하나하나 명령어 쳐서 설치)</li>
</ul>
<p>📌가상머신: 가상컴퓨터, 컴퓨터 시스템을 에뮬레이션(가상현실화)하는 소프트웨어</p>
<h4 id="paasplatform-as-a-service">PaaS(Platform-as-a-Service)</h4>
<ul>
<li>PaaS는 platform을 제공(like 빌트인방)</li>
<li>운영비는 절감할 수 있고, 모니터링 CI/CD제공</li>
<li>그러나 IaaS보다는 유연하지않고 플랫폼에 종속되게 되어있음</li>
<li>ex. heroku</li>
</ul>
<h5 id="iaas와-paas의-차이">IaaS와 PaaS의 차이</h5>
<ul>
<li>PaaS는 IaaS보다 자유도가 떨어짐(heroku로 예를들면 들어가서 설치할 목록 선택하고 설치함), 이식성 어려움</li>
<li>IaaS는 설치가 어려움(하나하나 해야함)</li>
<li>PaaS는 ex. node.js와 mongoDB 쓴다는 가정하에, 클라우드 서비스를 구매해서 연결해야함(쓰고싶은 서버와 디비에 관련된) , IaaS는 이와반대로 그냥 설치해서 쓰면된다(이식성 쉬움)</li>
<li>IaaS는 운영비 높고, PaaS는 운영비낮음(여기서 말하는 운영비는 인적자원, 시간을 포함시킨다)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[리액트 스터디] useMemo란?]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-useMemo%EB%9E%80</link>
            <guid>https://velog.io/@gyeongmi_lee/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-useMemo%EB%9E%80</guid>
            <pubDate>Tue, 28 Feb 2023 06:42:24 GMT</pubDate>
            <description><![CDATA[<h2 id="usememo란">useMemo란?</h2>
<p>useMemo는 컴포넌트의 성능을 최적화시킬 수 있는 대표적인 리액트 훅중에 하나이다.
(성능 최적화하기 위해서는 useCallback, useMemo, React.memo등이 쓰인다)</p>
<h3 id="memo-memoization✏️">Memo..? Memoization..?✏️</h3>
<ul>
<li>Memoization : &#39;기억되어야 할 것&#39;이라는 뜻의 라틴어에서 파생된 단어로, 기존에 수행한 연산의 결과값을 어딘가에 저장해두고 동일한 입력이 들어오면 재활용하는 프로그래밍 기법을 말한다.</li>
</ul>
<h3 id="시작하기전-함수형-컴포넌트란">시작하기전, &#39;함수형 컴포넌트란&#39;?</h3>
<ul>
<li>함수형 컴포넌트는 랜더링 ➡️ 함수 호출(아래 예제에선 component함수) ➡️ 모든 내부 변수 초기화 순서를 거친다!
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/f69a1866-0686-4acf-9a95-fd603b3b7ba6/image.png" alt=""></li>
</ul>
<p>=&gt; 즉, value 변수는 반복적으로 내부 초기화, cal함수는 반복적으로 호출!
=&gt; 이는 굉장히 비효율적(특히 무거운 일을 하는 함수라면)</p>
<h3 id="usememo는-어떻게-쓰이는데">useMemo는 어떻게 쓰이는데?</h3>
<p>!codesandbox[cocky-sid-ktqulg?fontsize=14&amp;hidenavigation=1&amp;theme=dark]</p>
<p>=&gt; 두번째 인자의 &#39;값&#39;이 변경될때에만 첫번째 인자인 <code>calculatorFactorial</code> 함수를 호출하고, 이전에 계산한 결과를 재 사용할 수 있게 된다!</p>
<p>=&gt; 그렇다면 <code>빈배열</code> 넣는다면?
처음 컴포넌트가 mount 되었을때만 값 계산하고, 이후에는 항상 memoization된값을 꺼내와서 사용!</p>
<h3 id="usememo는-언제-쓰이나">useMemo는 언제 쓰이나?</h3>
<h4 id="1-계산량이-많은-함수를-호출할때-성능을-향상시키기-위해위의-예시-factorial">1. 계산량이 많은 함수를 호출할때 성능을 향상시키기 위해(위의 예시, factorial)</h4>
<h4 id="2-랜더링-결과를-캐싱하여-중복-계산을-방지하기위해">2. 랜더링 결과를 캐싱하여 중복 계산을 방지하기위해</h4>
<p>(* 캐싱: 값을 저장해 두었다가 재사용하는것)</p>
<pre><code>import { useMemo, useState } from &#39;react&#39;;

function MemoExample() {
  const [firstName, setFirstName] = useState(&#39;John&#39;);
  const [lastName, setLastName] = useState(&#39;Doe&#39;);

  const fullName = useMemo(() =&gt; {
    console.log(&#39;Full name computed&#39;);
    return `${firstName} ${lastName}`;
  }, [firstName, lastName]);

  function handleFirstNameChange(event) {
    setFirstName(event.target.value);
  }

  function handleLastNameChange(event) {
    setLastName(event.target.value);
  }

  return (
    &lt;div&gt;
      &lt;input type=&quot;text&quot; value={firstName} onChange={handleFirstNameChange} /&gt;
      &lt;input type=&quot;text&quot; value={lastName} onChange={handleLastNameChange} /&gt;
      &lt;p&gt;Full name: {fullName}&lt;/p&gt;
    &lt;/div&gt;
  );
}
</code></pre><p>=&gt; 위의 예시처럼, fullName은 firstName과 lastName을 합쳐서 만들어지는 문자열이다. useMemo사용하여 fullName을 캐싱하고(기억하고) firstName과 lastName이 변경되었을때만 fullName 계산!</p>
<h3 id="주의할점">주의할점!</h3>
<ul>
<li>꼭 필요할떄만 사용해야함</li>
</ul>
<p>=&gt; 값을 재활용하기 위해 따로 메모리를 소비해서 저장을 해놓는것!
=&gt; 즉 불필요한 값을 모두 memoization하면 성능에 오히려 악영향</p>
<h3 id="주의할점-2-원시타입과-객체타입의-차이">주의할점 2: 원시타입과 객체타입의 차이</h3>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/ead92645-19e6-44a4-9817-917d0d547933/image.png" alt=""></p>
<ul>
<li>변수에 원시타입을 할당하면: 변수공간에 값이 바로 들어감!</li>
<li>변수에 객체타입을 할당하면: 변수공간에 값이 아닌 메모리의 주소가 들어감!(객체는 아주 크기 때문)
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/8213c3c2-9376-4d73-b09f-3d9c1a0b3fbd/image.png" alt=""></li>
</ul>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/6366defe-19f4-4304-9905-d57c87ea6da0/image.png" alt="">
=&gt; 객체타입을 비교하는건 <code>다른 주소</code>를 비교하는 것이므로 false 나옴!</p>
<p>!codesandbox[gallant-neco-hwt6iq?fontsize=14&amp;hidenavigation=1&amp;theme=dark]</p>
<p><a href="https://youtu.be/e-CnI8Q5RY4">https://youtu.be/e-CnI8Q5RY4</a> =&gt; 참고!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[리액트 스터디] useRef란?]]></title>
            <link>https://velog.io/@gyeongmi_lee/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-useRef</link>
            <guid>https://velog.io/@gyeongmi_lee/%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%8A%A4%ED%84%B0%EB%94%94-useRef</guid>
            <pubDate>Mon, 27 Feb 2023 07:38:06 GMT</pubDate>
            <description><![CDATA[<h2 id="1-useref를-왜-사용하는가">1. useRef를 왜 사용하는가?</h2>
<p><img src="https://velog.velcdn.com/images/gyeongmi_lee/post/32e19e77-885b-455e-844c-d27e619d268a/image.png" alt="">
(출처: chatGpt)</p>
<p>(참고: ✔️ 순수 js를 사용하면서 특정 DOM을 선택해야 하는 상황에서는 <code>getElementById</code>나 <code>querySelector</code> 같은 DOM Selector 함수 사용해서 DOM을 선택한다!)</p>
<h2 id="2-useref를-언제-사용하는가">2. useRef를 언제 사용하는가?</h2>
<h3 id="2-1-컴포넌트에-focus를-위치시킬-필요가-있는-경우">2-1. 컴포넌트에 focus를 위치시킬 필요가 있는 경우</h3>
<p>!codesandbox[restless-violet-co2m9c?fontsize=14&amp;hidenavigation=1&amp;theme=dark]</p>
<h3 id="2-2-setinterval-settimeout-함수-clear-하는-경우">2-2. setInterval, setTimeout 함수 clear 하는 경우</h3>
<p>✔️ setInterval이나 setTimeout 같은 함수는 clear 시키지 않으면 메모리 많이 소모! =&gt; 즉, 함수를 구현하고 컴포넌트가 unmount 될때나 특정 상황에서 clear 해줘야함!</p>
<p>!codesandbox[nifty-silence-hxw833?fontsize=14&amp;hidenavigation=1&amp;theme=dark]</p>
<p>🙋‍♀️여기서 궁금했던점! 초기값에 null을 넣는 경우와 안넣는 경우의 차이?
1️⃣ useRef 사용시 초기값 지정 안하면 =&gt; <code>undefined</code>가 기본값
2️⃣ 초기값 null이라면 =&gt; <code>null</code>이 기본값</p>
<p>=&gt; null반환이 undefined 반환보다 더 안전하기 때문에! 초기값 지정하지않는것은 가능하지만, null이 더 <code>안전한</code> 방법이다!</p>
<h3 id="2-3-컴포넌트-안의-변수-관리">2-3. 컴포넌트 안의 변수 관리</h3>
<p>✔️ useRef로 변수관리 하게 되면, 그 변수가 업데이트 되어도 컴포넌트가 리랜더링 되지 않는다.
<img src="https://velog.velcdn.com/images/gyeongmi_lee/post/360bd7ef-7d4b-4239-9313-68e892a375c4/image.png" alt="">
=&gt; 감정일기장의 한 부분</p>
]]></description>
        </item>
    </channel>
</rss>