<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>chance_777.log</title>
        <link>https://velog.io/</link>
        <description>열정적 끈기의 힘(GRIT)</description>
        <lastBuildDate>Sun, 27 Aug 2023 10:11:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>chance_777.log</title>
            <url>https://velog.velcdn.com/images/chance_777/profile/ab397b97-9b36-4e30-9d45-a78df497a3a4/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. chance_777.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/chance_777" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[JD분석] 업스테이지 Front-End ]]></title>
            <link>https://velog.io/@chance_777/JD%EB%B6%84%EC%84%9D-%EC%97%85%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-Front-End-2q7zd92d</link>
            <guid>https://velog.io/@chance_777/JD%EB%B6%84%EC%84%9D-%EC%97%85%EC%8A%A4%ED%85%8C%EC%9D%B4%EC%A7%80-Front-End-2q7zd92d</guid>
            <pubDate>Sun, 27 Aug 2023 10:11:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>AI 솔루션 전문기업 ‘업스테이지’ JD 분석하기</p>
</blockquote>
<br/>

<p><strong>[요약]</strong></p>
<ol>
<li>지원하고자 하는 직무의 JD를 보고 <strong>요구하는 역량 분석</strong>하기</li>
<li>어떤 <strong>인재상</strong>을 원하는지 한 문장으로 정리해보기</li>
<li>여러 회사의 JD에서 반복되거나 중요하다고 생각되는 <strong>키워드</strong>와 그 이유</li>
</ol>
<br/>

<hr>
<br/>

<h1 id="span-stylebackground-color-rgb166-159-255업스테이지upstagespan"><span style='background-color: rgb(166 159 255)'>업스테이지(Upstage)</span></h1>
<ul>
<li>AI챗봇 애스크업(AskUp, 아숙업)을 만든 국내 인공지능 스타트업</li>
<li>&#39;Upstage AI Pack&#39; 고객 맞춤형 올인원 AI 솔루션 보유
<img src="https://velog.velcdn.com/images/chance_777/post/15565402-3bfc-42ad-bfc3-ef0bc708a5bb/image.png" alt=""></li>
</ul>
<p><br/><br/></p>
<h2 id="📃-업스테이지-front-end-채용-정보">📃 업스테이지 Front-End 채용 정보</h2>
<br/>

<h3 id="description">[Description]</h3>
<p>업스테이지는 AI 기술로 해결할 수 있는 비즈니스 문제들을 풀어갑니다. Making AI Beneficial 이라는 미션 아래, 누구나 AI 기술의 혜택을 누릴 수 있도록 &#39;적용이 쉬운 AI 솔루션&#39;을 만들고 있습니다. 세계 최고 수준의 AI 모델과 그 모델을 지속적으로 관리, 개선, 운영하기 위한 데이터, 학습, 서빙과 관련된 모든 필수 소프트웨어를 하나로 묶은 “AI Pack” 그리고 OCR 및 개인화 기술을 다양한 분야에서 손쉽게 활용할 수 있는 API 시리즈를 출시하여 기업 고객들의 비즈니스 성공에 기여하고 있습니다.</p>
<p>또한 ChatGPT를 적용한 카카오톡 채널 기반 챗봇 &#39;애스크업&#39;(AskUp)을 통해 모바일 사용 경험의 혁신을 이루는 동시에 AI분야에 대한 대중들의 접근성과 신뢰성을 높여가고 있으며, Chat AI 기술을 비즈니스 환경에 맞게 최적화해 기업들의 업무 효율과 생산성을 높일 수 있는 ‘애스크업 비즈’(AskUp Biz)를 운영하는 등 AI가 세상에 이롭게 쓰이게 하기 위해 노력하고 있습니다.</p>
<p>업스테이지 프론트엔드 소프트웨어 엔지니어는 세계 최고 수준의 로코드, 노코드 AI 제품인 <span style='background-color: rgb(166 159 255)'>AI Pack 을 밑바닥부터 설계하고 구현하며 수천만건 이상의 사용자 요청과 텍스트, 이미지 데이터를 빠르고 안정적으로 다룰 수 있는 사용자 인터페이스를 개발합니다. 이를 위해 디자인 조직과의 협업을 통하여 회사의 모든 제품에 사용될 업스테이지 공통 디자인 시스템을 정의하고 구현합니다. 또한 업스테이지 제품의 사용 패턴을 분석하기 위한 사용자 로그를 수집하고 다양한 관점에서 이를 분석할 수 있는 플랫폼을 개발</span>합니다.</p>
<p>업스테이지 소프트웨어 개발팀은 업계 최고 수준의 <span style='background-color: rgb(166 159 255)'>기술 리더십과 도전 정신을 바탕으로 안정적이면서도 혁신적인 제품을 만들기 위해 노력</span>합니다. <span style='background-color: rgb(166 159 255)'>고객에게 더 좋은 AI 제품이 무엇인지 찾기 위해 끊임없이 연구하고 시도하며 제품과 구성원들이 함께 성장</span>할 수 있도록 적극적으로 지원하고 있습니다.</p>
<br/>

<h3 id="주요-업무">[주요 업무]</h3>
<ul>
<li><p>Upstage AI Pack 프론트엔드 개발</p>
</li>
<li><p>Upstage 디자인 시스템 개발</p>
</li>
<li><p>사용자 행동 패턴 분석 시스템 개발</p>
</li>
<li><p>FE 조직 리드</p>
</li>
</ul>
<br/>


<h3 id="requirements">[Requirements]</h3>
<h4 id="필수-사항">필수 사항</h4>
<ul>
<li><p>현업 5년 이상 (또는 그에 준하는) 시스템/서비스 개발 경험</p>
</li>
<li><p>주요 <span style='background-color: rgb(166 159 255)'>프론트엔드 프레임워크(예: React, Svelt, Vue.js 등)</span>에 대한 깊은 이해와 경험</p>
</li>
<li><p><span style='background-color: rgb(166 159 255)'>HTML, CSS, JavaScript (Typescript)</span> 및 관련 웹 기술에 대한 전문성</p>
</li>
<li><p><span style='background-color: rgb(166 159 255)'>웹 접근성, 반응형 디자인, 크로스 브라우저 호환성</span>에 대한 이해와 경험</p>
</li>
<li><p><span style='background-color: rgb(166 159 255)'>웹 성능 최적화</span> 기술과 경험</p>
</li>
<li><p>모던 개발 도구 및 프로세스(예: <span style='background-color: rgb(166 159 255)'>Git, CI/CD, 코드 리뷰</span> 등)에 대한 숙련도</p>
</li>
<li><p>다양한 이해 관계자(예: 백엔드 엔지니어, 디자이너, 제품 관리자 등)와 <span style='background-color: rgb(166 159 255)'>긴밀하게 협력할 수 있는 능력</span> </p>
</li>
<li><p><span style='background-color: rgb(166 159 255)'>탁월한 문제 해결 능력</span></p>
</li>
</ul>
<br/>

<h4 id="우대-사항">우대 사항</h4>
<ul>
<li><p>Remix, Next.js 등 SSR 프레임워크 사용 경험</p>
</li>
<li><p>각종 차트 및 대시 보드 개발 경험</p>
</li>
<li><p>i18n 지원 서비스 개발 경험</p>
</li>
<li><p>성능 또는 보안 취약점 개선 경험</p>
</li>
<li><p>조직 리드 경험</p>
</li>
<li><p>Full stack engineer 로 근무한 경험</p>
</li>
</ul>
<br/>

<hr>
<br/>

<h2 id="📝-업스테이지-jd-분석">📝 업스테이지 JD 분석</h2>
<br/>

<h3 id="span-stylebackground-color-rgb166-159-2551-요구하는-역량-분석span"><span style='background-color: rgb(166 159 255)'>1. 요구하는 역량 분석</span></h3>
<h4 id="🔴-중요하게-생각되는-기술-키워드">🔴 중요하게 생각되는 기술 키워드</h4>
<ul>
<li>React, Svelt, Vue.js</li>
<li>HTML/CSS</li>
<li>JavaScript(Typescript)</li>
<li>웹 접근성</li>
<li>반응형 디자인</li>
<li>크로스 브라우저 호환성 이해와 경험</li>
<li>웹 성능 최적화 기술과 경험</li>
<li>Git, CI/CD, 코드리뷰 숙련도</li>
</ul>
<br/>


<h3 id="span-stylebackground-color-rgb166-159-2552-업스테이지-인재상span"><span style='background-color: rgb(166 159 255)'>2. 업스테이지 인재상</span></h3>
<ul>
<li>고객에게 더 좋은 AI 제품을 제공하기 위해 다양한 이해 관계자들과 긴밀히 협력하고, 탁월한 문제 해결 능력을 가진 개발자</li>
</ul>
<br/>

<hr>
<br/>

<h3 id="span-stylebackground-color-fffec03-여러-회사에서-반복되거나-중요한-키워드span"><span style='background-color: #fffec0'>3. 여러 회사에서 반복되거나 중요한 키워드</span></h3>
<ul>
<li><span style='background-color: #fffec0'><strong>React</strong></span><ul>
<li>관심 분야 기업 7군데 모두 공통적으로 요구된 기술스택</li>
<li>React로 Web-app 개발 시, 마치 모바일 앱을 사용하는 것처럼 새로고침 없이 웹 탐색이 가능하기 때문에 사용자에게 긍정적인 느낌을 준다. 쇼핑몰의 경우 구매 전환율도 올라간다고 한다.</li>
<li><strong>결론: React를 사용하여 개발된 웹과 앱은 <span style='background-color: #fffec0'>긍정적인 사용자 경험</span>을 주기 때문에 프론트엔드 개발자의 필수 소양</strong></li>
</ul>
</li>
</ul>
<br/>

<hr>
<blockquote>
<p><strong>[느낀 점]</strong>
<strong>JD 분석</strong>은 앞으로 내가 배워야 할 새로운 기술을 알아가는 자연스러운 과정이라고 생각한다. <span style='color:gray'>(배우면 배울수록 배울게 많은 개발자 === 멋진 사람)</span>
특히, 여러 회사에서 공통적으로 요구된 React는 9월부터 배우게 되는데 아직 JavaScript도 제대로 하지 못하고 있어서 걱정 반 + 기대 반 + 설렘 반이다😂
그래도 기대하는 점이 조금 더 큰 이유는, React로 개발된 웹을 React Native를 사용해서 모바일 앱으로 만들 수 있다는 점이 흥미롭게 다가왔기 때문이다.
앞으로의 여정도 화이팅!!</p>
</blockquote>
<br/>
[참고자료]

<p><a href="https://www.upstage.ai/">Upstage 홈페이지</a>
<a href="https://careers.upstage.ai/o/software-engineer-frontend">Upstage | FE 채용정보</a>
<a href="https://www.upstage.ai/blog/people/what-swe-do-at-ai-company">Upstage | AI 회사에서 소프트웨어 엔지니어는 무슨 일을 하나요?</a>
<a href="https://www.youtube.com/watch?v=dKJHIAroh60">Upstage | 개발자가 AI회사에서 뭐해요? (Youtube)</a>
<a href="https://www.elancer.co.kr/blog/view?seq=167">React란?</a>
<a href="https://velog.io/@gusdh2/React%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0%EB%8A%94-%EB%AD%98%EA%B9%8C">React를 사용하는 이유</a>
<a href="https://www.youtube.com/watch?v=LclObYwGj90">React를 사용하는 이유2</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] JavaScript 조건문]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-JavaScript</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-JavaScript</guid>
            <pubDate>Sun, 13 Aug 2023 10:43:46 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>JavaScript 조건문 Remind하기</p>
</blockquote>
<h1 id="조건문">[조건문]</h1>
<h2 id="요약">요약</h2>
<ul>
<li>말 그대로 &#39;조건을 가진 문장&#39;으로, 특정한 조건에서만 코드 실행</li>
<li>주어진 조건에 참(true) 또는 거짓(false)여부에 따라 <strong>각각 다른 할 일을 정의</strong>하는 실행문</li>
</ul>
<hr>

<h2 id="조건문-종류">조건문 종류</h2>
<ul>
<li><strong><code>if문</code></strong><ul>
<li>if문에서는 괄호 안의 조건을 체크해서 결괏값이 true면 if문 다음에 나오는 명령 실행</li>
<li>false이면 아무것도 실행하지 않음<pre><code class="language-javascript">if(조건) {
조건이 true일 때 실행할 명령
}</code></pre>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong><code>if~else문</code></strong><ul>
<li>if~else 문은 if 조건의 결괏값이 true가 아닐 때 실행할 명령을 else문 다음에 추가<pre><code class="language-javascript">if(조건) {
조건이 true일 때 실행할 명령
} else {
조건 결괏값이 false일 때 실행할 명령
}</code></pre>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong><code>switch문</code></strong><ul>
<li>조건 값과 case의 값이 일치한 경우에만 동작을 실행하며, 케이스별로 명확히 구분하고 있어 if문에 비해 가독성이 좋음</li>
<li>조건과 일치하는 case 문이 없는 경우 default문 실행<pre><code class="language-javascript">switch(조건)
{
case 값1: 명령1
break;
case 값2: 명령2
break;
...
default: 명령n
}</code></pre>
</li>
</ul>
</li>
</ul>
<hr>

<h2 id="조건문-output">조건문 Output</h2>
<ul>
<li><strong><code>if~else문</code></strong></li>
</ul>
<pre><code class="language-javascript">// 5의 배수 확인하기

let userNumber = prompt(&quot;숫자를 입력하세요.&quot;);

if (userNumber !== null) { // 입력값이 null이 아니면(true) if~else문 실행   
  userNumber = parseInt(userNumber); /* prompt()문을 사용해 입력받은 값은 기본적으로 문자열로 저장됨.
parseInt()함수를 사용해 입력받은 값을 처음부터 숫자로 바꿔주는 것이 안전함
(문자열 값이라도 산술 연산에 사용할 경우 자동으로 숫자형으로 변환되지만,
데이터 유형이 자동으로 변환되기 때문에 예상치 못한 곳에서 다르게 변환될 수 있음)
*/ 
  if (!isNaN(userNumber)) { // userNubmber가 isNaN이 아니면(true) if~else문 실행
    if (userNumber % 5 === 0) { // userNumber가 5의 배수이면
      alert(&quot;5의 배수입니다.&quot;);
    } else {
      alert(&quot;5의 배수가 아닙니다.&quot;);
    }
  } else {  // userNumber가 isNaN이면
    alert(&quot;숫자가 아닙니다.&quot;);
  }
} else { // 사용자가 &#39;취소&#39;버튼을 눌렀을 경우
  alert(&quot;입력이 취소 되었습니다&quot;);
}</code></pre>
<br/>

<ul>
<li><strong><code>switch문</code></strong> + if문 응용</li>
</ul>
<pre><code class="language-javascript">let luckNumber = parseInt(prompt(&quot;오늘의 운세는?🤗 (1 ~ 3 사이의 숫자 하나만 입력해주세요!)&quot;));

switch(luckNumber) {
  case 1: 
    alert(&quot;오늘은 뭘 먹어도 살 안찌는 날😆 맛있는 음식 마음대로 드세요!!&quot;)
    break;  // break문을 사용해야 해당 switch문을 빠져나올 수 있음. break를 입력하지 않으면 다음 case문까지 실행 됨.
  case 2: 
    alert(&quot;오늘은 무엇을 해도 전부 잘 될거에요! 하고 싶은 일을 도전해 봐요~😘&quot;)
    break;
  case 3: 
    alert(&quot;금전운이 좋네요! 예상치 못했던 수입이 들어올 수 있어요!😎&quot;)
    break;
  default: 
    if (luckNumber &lt; 1 || luckNumber &gt; 3 || isNaN(luckNumber)) {
      alert(&quot;1 ~ 3 사이의 숫자를 입력하지 않았어요..😥&quot;);
    } // luckNumber가 1보다 작거나, 3보다 크거나, 숫자가 아닌 경우 3개 조건 중 1개라도 true이면 alert 실행
}</code></pre>
<br/>

<p><strong>Finding</strong> (배운 점)</p>
<blockquote>
<p>if~else문에서 <code>&quot;let userNumber = parseInt(prompt(&quot;숫자를 입력하세요.&quot;);</code>로 입력 했더니, 사용자가 입력을 취소할 때 &#39;입력이 취소되었습니다&#39; 문구가 나오지 않는 문제가 발생했다. 구글링&amp;챗GPT 도움 결과, prompt에서 취소를 누를 경우, <code>pasreInt(null)</code>이 되기 때문에 결과적으로 NaN이 반환되어 문제가 발생되었던 것이다.
문제 해결 방법: 최초에 prompt입력받을 때 parseInt를 없애주고 <code>&quot;let userNumber = prompt(&quot;숫자를 입력하세요.&quot;);</code>, if문 안에 parseInt를 작성하여 해결하였다. <code>if (userNumber !== null) { userNumber = parseInt(userNumber);...</code></p>
</blockquote>
<br/>

<p><strong>Feeling</strong> (느낀 점)</p>
<blockquote>
<p>내가 적용해보고 싶은 내용으로 실습을 하다보니 학습에 많은 도움이 되는 것을 느꼈다. 그 이유를 생각해보면 &#39;내 것&#39;이라는 마음이 크게 작용한 것 같다. 오늘 if~else문에서 문제가 발생한 부분을 어떻게든 해결하려고 몰입한 나를 발견해서 기분이 좋았다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230808]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-0808</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-0808</guid>
            <pubDate>Tue, 08 Aug 2023 15:07:06 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🟪-bootstrap">🟪 Bootstrap</h1>
<br/>

<h2 id="실습">실습</h2>
<ul>
<li><strong>실행</strong><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css&quot; integrity=&quot;sha512-z3gLpd7yknf1YoNbCzqRKc4qyor8gaKU1qmn+CShxbuBusANI9QpRohGBreCFkKxLhei6S9CQXFEbbKuqLg0DA==&quot; crossorigin=&quot;anonymous&quot; referrerpolicy=&quot;no-referrer&quot; /&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;css/bootstrap.min.css&quot;&gt;
  &lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.css&quot;&gt;
  &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;card border-0 shadow-lg mt-4&quot;&gt;
      &lt;div class=&quot;card-body&quot;&gt;
        &lt;div class=&quot;row p-3&quot;&gt;
            &lt;div class=&quot;col-7&quot;&gt;
              &lt;h2&gt;MISSION: IMPOSSIBLE - DEAD RECKONING, PART ONE&lt;/h2&gt;
            &lt;/div&gt;
            &lt;div class=&quot;col-5&quot;&gt;
                &lt;div class=&quot;card&quot;&gt;
                  &lt;div class=&quot;card-body&quot;&gt;
                    &lt;h3 class=&quot;display-6&quot;&gt;
                      &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                      4.8 
                    &lt;/h3&gt;
                    &lt;p class=&quot;text-center&quot;&gt;전문가 평점&lt;/p&gt;
                  &lt;/div&gt;
                &lt;/div&gt;
            &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&quot;row p-3&quot;&gt;
          &lt;div class=&quot;col-12&quot;&gt;
            &lt;div class=&quot;input-group input-group-lg&quot;&gt;
                &lt;span class=&quot;input-group-text rounded-start-5&quot;&gt;
                  &lt;i class=&quot;fa-solid fa-magnifying-glass&quot;&gt;&lt;/i&gt;
                &lt;/span&gt;
                &lt;input type=&quot;text&quot; class=&quot;form-control rounded-end-5&quot; placeholder=&quot;리뷰 검색하기&quot;&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&quot;row p-3&quot;&gt;
          &lt;div class=&quot;col-12 vstack gap-2&quot;&gt;
              &lt;h3&gt;리뷰&lt;/h3&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;5&lt;/span&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 80%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 5점&quot;&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;5&lt;/span&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 80%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 5점&quot;&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;5&lt;/span&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 80%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 5점&quot;&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;5&lt;/span&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 80%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 5점&quot;&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;5&lt;/span&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 80%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 5점&quot;&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div class=&quot;row p-3&quot;&gt;
          &lt;button class=&quot;btn btn-success rounded-5 btn-lg&quot;&gt;리뷰하기&lt;/button&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;script src=&quot;js/bootstrap.min.js&quot;&gt;
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</li>
<li><strong>결과</strong>
<img src="https://velog.velcdn.com/images/chance_777/post/16e3e7b5-c1b1-43f0-b457-18c4ec60df92/image.png" alt=""></li>
</ul>
<br/>
<br/>

<h2 id="추가-실습-해보기">추가 실습 해보기!</h2>
<p><strong>① ⭐ 4.8 &#39;점수&#39; 가운데 정렬</strong></p>
<ul>
<li><strong>AS-IS:</strong> 화면 크기를 키웠을 때 &#39;점수&#39;는 왼쪽, &#39;전문가 평점&#39; 텍스트는 가운데 정렬되어 가독성 저하
<img src="https://velog.velcdn.com/images/chance_777/post/af87f19c-73ba-44ed-9522-6ddddc94420e/image.png" alt=""></li>
<li><strong>TO-BE:</strong> &#39;점수&#39; 가운데 정렬하여 &#39;전문가 평점&#39;과 동일한 라인에 위치</li>
</ul>
<br/>

<p><strong>② &#39;리뷰 별점&#39; 수정</strong></p>
<ul>
<li><strong>AS-IS:</strong> 별점 숫자 (5, 5, 5, 5, 5) , progressbar (모두 동일)</li>
<li><strong>TO-BE:</strong> 별점 숫자 (5, 4, 3, 2, 1) , progressbar (모두 다르게 적용)</li>
</ul>
<br/>  

<p><strong>③ &#39;리뷰하기&#39; 버튼 수평 가운데 정렬</strong></p>
<ul>
<li><strong>AS-IS:</strong> 왼쪽에 위치</li>
<li><strong>TO-BE:</strong> 가운데 정렬</li>
</ul>
<br/> 

<ul>
<li><p><strong>실행</strong>
① ⭐ 4.8 &#39;점수&#39; 가운데 정렬</p>
<pre><code>&lt;h3 class=&quot;display-6 text-center&quot;&gt; &lt;!-- text-center 추가 --&gt;</code></pre><p>② &#39;리뷰 별점&#39; 수정</p>
<pre><code>      &lt;h3&gt;리뷰&lt;/h3&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;5&lt;/span&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 70%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 5점&quot;&gt; &lt;!-- progressbar width: 70% 수정 --&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;4&lt;/span&gt; &lt;!-- 5 → 4 수정 --&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 85%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 4점&quot;&gt; &lt;!-- 5 → 4 수정 / progressbar width: 85% 수정 --&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;3&lt;/span&gt; &lt;!-- 5 → 3 수정 --&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 50%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 3점&quot;&gt; &lt;!-- 5 → 3 수정 / progressbar width: 50% 수정 --&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;2&lt;/span&gt; &lt;!-- 5 → 2 수정 --&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 30%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 2점&quot;&gt; &lt;!-- 5 → 2 수정 / progressbar width: 30% 수정 --&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class=&quot;d-flex align-items-center gap-2&quot;&gt;
                &lt;span&gt;1&lt;/span&gt; &lt;!-- 5 → 1 수정 --&gt;
                &lt;i class=&quot;fa-solid fa-star&quot; style=&quot;color: #ffd43b;&quot;&gt;&lt;/i&gt;
                &lt;div class=&quot;progress&quot; aria-valuenow=&quot;25&quot; aria-valuemin=&quot;0&quot; aria-valuemax=&quot;100&quot;&gt;
                  &lt;div class=&quot;progress-bar bg-waring&quot; style=&quot;width: 10%&quot; role=&quot;progressbar&quot;
                  aria-label=&quot;평점 5점 중에 1점&quot;&gt; &lt;!-- 5 → 1 수정 / progressbar width: 10% 수정 --&gt;</code></pre><p>③ &#39;리뷰하기&#39; 버튼 수평 가운데 정렬</p>
<pre><code class="language-css">.btn{
    width: auto;
    margin: auto; /* margin: auto 추가 */
}</code></pre>
</li>
<li><p><strong>결과</strong>
<img src="https://velog.velcdn.com/images/chance_777/post/58ae19bf-7485-42a9-badc-b3d4419c84a2/image.jpg" alt=""></p>
</li>
</ul>
<br/>

<p><strong>Findings(배운 점)</strong></p>
<blockquote>
<ol>
<li>html에서 작성한 태그에 class를 통해 부트스트랩의 다양한 스타일을 적용할 수 있는 점</li>
<li>적용되는 스타일의 class는 정해져 있으며, 부트스트랩 페이지에 자세히 나와있으니 참고!! 
<a href="https://getbootstrap.com/docs/5.3/getting-started/introduction/">Bootstrap Docs</a></li>
</ol>
</blockquote>
<p><strong>Future Aciton(향후 액션 아이템)</strong></p>
<blockquote>
<p>로또 번호 추첨기를 만들 때, 부트스트랩을 이용한 다양한 디자인 적용 시도
ex) &#39;로또 번호 추첨하기&#39; 버튼 
(지금 당장 생각나는 건 버튼 뿐이지만!! 만들면서 다양하게 적용해보자)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230807]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230807</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230807</guid>
            <pubDate>Tue, 08 Aug 2023 15:01:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🟢-배열-array">🟢 배열 (Array)</h1>
<ul>
<li>배열은 <strong>데이터를 순서대로 저장하는 객체</strong></li>
<li>하나의 데이터를 표현하는 원시타입과 달리 <strong>여러 개의 데이터를 한 변수에 저장</strong>할 수 있기 때문에 데이터를 추가하거나, 제거, 정렬, 검색 등 다양한 작업을 수행할 수 있도록 여러가지 메소드 제공</li>
</ul>
<br/>

<h2 id="map">.map()</h2>
<ul>
<li>배열 내의 모든 요소 각각에 대해 주어진 함수를 실행하고, 그 결과를 새로운 배열로 반환</li>
<li>실무에서도 많이 사용되며, 면접 질문에서도 많이 나옴!</li>
</ul>
<br/>

<h3 id="map의-형태">map의 형태</h3>
<pre><code class="language-javascript">array.map((value, index, arr) =&gt; {
    console.log(value, index, arr)
      return value
})</code></pre>
<ul>
<li><strong>MDN</strong>
<img src="https://velog.velcdn.com/images/chance_777/post/f01db520-b470-45e9-a9df-77b31f04b928/image.png" alt=""></li>
</ul>
<p><br/><br/></p>
<h2 id="추가-학습">[추가 학습]</h2>
<ul>
<li>7월 KPT회고록 - Problem 해결을 위한 Try<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/1253b125-2655-4f2b-8d5f-8f56833940ef/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<hr>

<ul>
<li><strong>실행</strong><pre><code class="language-javascript">// &#39;노마드 코더&#39; 유튜브 강의
// .map은 React에 갔을 때 매우 유용함
// API로부터 배열을 받게 되면, 그 배열의 데이터를 이용해서 어떠한 component의 배열을 만듦
</code></pre>
</li>
</ul>
<p>// 이 배열의 모든 아이템에 이모티콘 또는 숫자를 추가하고싶다?
const days = [&quot;Mon&quot;, &quot;Tue&quot;, &quot;Wed&quot;, &quot;Thurs&quot;, &quot;Fri&quot;];</p>
<p>// days.map은 days에 있는 모든 요일에 function을 실행한다는 뜻
// 그리고 그 function에서 나온 값을 저장해서 새로운 배열을 만듦</p>
<p>// 1. days앞에 캘린더 이모티콘 넣기
const calendarDays = days.map(day =&gt; <code>📅 ${day}</code>)
console.log(calendarDays)</p>
<p>// 2. days앞에 숫자 넣기
const NumDays = days.map((day, index) =&gt; <code>#${index + 1} ${day}</code>)
console.log(NumDays)</p>
<pre><code>- **결과**
![](https://velog.velcdn.com/images/chance_777/post/68734ceb-f6ee-4b99-b8d4-b2ef5e61a2cd/image.png)

&lt;br/&gt;
&lt;hr&gt;
&lt;br/&gt;

- **실행**

```javascript
// &#39;zero cho&#39; 유튜브 강의
//.map은 각각의 요소를 반복문 돌면서 요소를 바꿔줄 수 있음

// array에 있는 모든 숫자에 2 곱하기
const array = [1, 2, 3, 4];
array.map((element, i) =&gt; {
    return element * 2;
})

// .map을 이용한 로또 추첨 번호 만들기(1~45)
Array(45)  // 길이가 45인데 텅 빈 배열
Array(45).fill()  // 길이가 45인데 undefined가 채워진 배열
Array(45).fill(0)  // 길이가 45인데 0으로 채워진 배열 
Array(45).fill(0).map((el, idx) =&gt; {  // el, idx는 매개변수이기 때문에 이름은 마음대로 지어도 됨. 중요한 건 &#39;자리&#39;임 (첫 번째는 &#39;요소&#39;, 두 번째는 &#39;인덱스&#39;)
        return idx + 1;
})</code></pre><ul>
<li><strong>결과</strong>
<img src="https://velog.velcdn.com/images/chance_777/post/da808244-0f67-4de5-b11e-03286391cd6b/image.png" alt=""></li>
</ul>
<p><br/><br/></p>
<p><strong>Finding(배운 점)</strong></p>
<blockquote>
<p>.map()은 실무에서 굉장히 많이 사용 되며, 특히 react에서 유용하게 사용된다고 한다. forEach와 차이점은 map은 새로운 배열을 만들고, return이 있다는 점이다.</p>
</blockquote>
<p><strong>Feeling(느낀 점)</strong></p>
<blockquote>
<p>.map()메소드를 사용하여 <strong>배열의 각 요소에 내가 원하는 결과값</strong>을 만들 수 있다는 점이 굉장히 효율적으로 느껴졌다.</p>
</blockquote>
<p><strong>Future Action(향후 액션 아이템)</strong></p>
<blockquote>
<p>로또 번호 추첨기 만들기:  .map()을 이용하여 1~45까지 숫자 생성하기</p>
</blockquote>
<p><br/><br/></p>
<p><strong>[참고자료]</strong></p>
<p><a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map#%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98">[Mdn] .map() </a>
<a href="https://www.youtube.com/watch?v=vUB3TfLWzL0&amp;list=PLRm5ad_6-R6XdZWBcJvQ0LAJE-fMhWRBx">[YouTube] 노마드 코더 - 자바스크립트 array.map을 설명해준다! </a>
<a href="https://www.youtube.com/watch?v=eMmkss4vr08">[YouTube] ZeroCho TV - 자바스크립트 강좌 5-8 배열 forEach, map, fill 알아보기 </a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 가고싶은 회사 JD 분석]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-analyze-JD</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-analyze-JD</guid>
            <pubDate>Sat, 05 Aug 2023 15:04:56 GMT</pubDate>
            <description><![CDATA[<h1 id="📃-jd란">📃 JD란?</h1>
<ul>
<li><strong>Job Description (직무기술)</strong></li>
<li>HRD 용어사전: 직무기술은 구체적으로 직무수행에 요구되는 지식과 기술, 업무조건, 감독지시, 다른 직무들과의 관계, 급여수준 등과 같은 요소들과 함께 직무의 과업과 책임에 관한 내용을 포함</li>
<li><strong>쉽게 말해, 현재 채용하려는 자리에서 하고 있는/해야 하는 일들, 즉 직무에 대해서 상세하게 설명해 놓은 것</strong></li>
</ul>
<br/>

<h2 id="jd-분석-방법">JD 분석 방법</h2>
<ol>
<li>내가 지원하고자 하는 직무의 JD를 보고 요구하는 역량 분석하기</li>
<li>특히, 여러 회사의 JD에서 반복되거나 중요하다고 생각되는 키워드 3가지 이상과 그 이유도 함께 작성해보기</li>
<li>어떤 인재상을 원하는지 한 문장으로 정리해보기</li>
<li>분석한 키워드를 기반으로, 내 이력서에는 무엇이 들어가야 할 지 미리 작성해보기 - 지도 만들기</li>
</ol>
<p><br/><br/></p>
<h1 id="👩🏻💻-ai챗봇-솔루션-기업-분석">👩🏻‍💻 AI챗봇 솔루션 기업 분석</h1>
<ul>
<li><strong>AI챗봇 솔루션 기업을 선택한 이유</strong><ul>
<li>이전 직장에서 1년 2개월 간 <strong>AI챗봇 PA(Project Assistant)</strong>역할 수행</li>
<li>AI챗봇 PA 경험을 바탕으로, 프론트엔드 개발자로서 업무 협업 시 원활한 커뮤니케이션과 시너지 창출</li>
</ul>
</li>
</ul>
<ul>
<li><strong>주 업무 경험</strong><ul>
<li>신상품 사전예약 웹챗봇 기획</li>
<li>챗봇 정확도 개선</li>
<li>고객 Pain Point 분석 및 UI/UX 개선</li>
<li>챗봇 상담쿼리 모니터링</li>
<li>챗봇 관리자 페이지 기능 추가 기획 참여</li>
</ul>
</li>
</ul>
<br/>

<blockquote>
<p>AI챗봇 솔루션 기업 중, 오늘은 &quot;꿈많은청년들&quot; JD분석을 진행해보도록 하겠습니다.</p>
</blockquote>
<br/>

<h2 id="span-stylebackground-color-rgb99-208-255꿈많은청년들span"><span style='background-color: rgb(99 208 255)'>꿈많은청년들</span></h2>
<ul>
<li>2015년 5월 설립된 인공지능 챗봇 개발 전문 기업</li>
<li>대표적인 솔루션으로는 인공 지능 챗봇 솔루션 <strong>&#39;클라우드 튜링(Cloud Turing)&#39;</strong>과 업무 효율화를 위한 근태관리 솔루션 <strong>&#39;오늘의업무&#39;</strong>가 있다.</li>
</ul>
<ul>
<li><strong>&#39;클라우드 튜링(Cloud Turing)&#39;</strong><ul>
<li>커스텀 챗봇 개발 (챗봇 제작 의뢰)</li>
<li>챗봇 빌더 (고객이 직접 챗봇을 만들 수 있는 챗봇 제작 툴(Tool))<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/d81e7c46-8cd6-4635-b35c-67d99dd5942b/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong>&#39;오늘의업무&#39;</strong><ul>
<li>사내 메신저 &#39;슬랙(Slack)&#39;에서 챗봇으로 근태관리를 할 수 있는 서비스<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/062a9d0e-79dc-4973-91a4-d3ad2228ab85/image.png" alt="">
<img src="https://velog.velcdn.com/images/chance_777/post/1dbbc368-0988-4a1a-9a9a-b75d95c66059/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="꿈많은청년들-front-end-채용-정보">꿈많은청년들 Front-End 채용 정보</h2>
<p><span style="color:#cdcdcd">(23.08.06 기준 / 채용 일시 마감 상태)</span></p>
<h3 id="front-end-team">Front End Team</h3>
<hr>
<aside>
💬 프론트엔드 개발팀은 웹브라우저를 이용하여 서버와 데이터를 주고받으며 <span style='background-color: rgb(99 208 255)'>사용자가 데이터를 편하게 볼 수 있도록 변환하고, 사용자의 액션을 서버로 전달할 수 있도록 구현</span>을 하는 팀입니다.

<p><span style='background-color: rgb(99 208 255)'>하나의 기능을 구현하기 위해 많은 팀과 커뮤니케이션을 수행</span>해야 합니다.</p>
<p><span style='background-color: rgb(99 208 255)'>기획팀, BackEnd팀, 디자인팀 등 유관 부서와 원활하게 의사소통</span>할 수 있어야 합니다. 
꿈많은청년들은 다 같이 소통하고 의사 결정합니다.</p>
</aside>

<h3 id="front-end-tech-stack">Front End Tech Stack</h3>
<ul>
<li><span style='background-color: rgb(99 208 255)'>HTML</span></li>
<li><span style='background-color: rgb(99 208 255)'>CSS</span></li>
<li><span style='background-color: rgb(99 208 255)'>JavaScript</span></li>
<li><span style='background-color: rgb(99 208 255)'>TypeScript</span></li>
<li><span style='background-color: rgb(99 208 255)'>React / Next.js</span></li>
<li><span style='background-color: rgb(99 208 255)'>WebSocket</span></li>
</ul>
<h3 id="-주요업무-">[ 주요업무 ]</h3>
<hr>
<ul>
<li>챗봇 빌더 <span style='background-color: rgb(99 208 255)'>솔루션 웹페이지</span></li>
<li><span style='background-color: rgb(99 208 255)'>실시간 채팅</span>이 가능한 <span style='background-color: rgb(99 208 255)'>웹용 챗봇</span></li>
<li>챗봇, 사용자 <span style='background-color: rgb(99 208 255)'>관리를 위한 대시보드</span> (관리자 페이지)</li>
</ul>
<aside>
💬 위의 화면들에 대한 프론트 개발을 의미합니다.
여기서 프론트 개발은 <span style='background-color: rgb(99 208 255)'>퍼블리싱을 포함하여 React로 BackEnd와 연동</span>하는 작업입니다.

</aside>

<h3 id="-자격-요건-">[ 자격 요건 ]</h3>
<hr>
<h4 id="공통-자격-요건">공통 자격 요건</h4>
<ul>
<li>필요 기술<ul>
<li><span style='background-color: rgb(99 208 255)'>React</span>를 이용하여 개발을 할 수 있는 능력이 필요합니다.</li>
<li><span style='background-color: rgb(99 208 255)'>REST API</span>를 이해하고, 실제로 연동이 가능한 능력이 필요합니다.</li>
<li><span style='background-color: rgb(99 208 255)'>HTML, CSS, JS</span>로 페이지를 구현하는데 어려움이 없으며, <span style='background-color: rgb(99 208 255)'>DOM</span>에 대한 기본적인 개념에 대한 최소한의 이해가 필요합니다.</li>
<li>브라우저에서 제공하는 기본적인 <span style='background-color: rgb(99 208 255)'>VanillaJS</span>에 대한 함수들에 대한 이해와 기초적인 자료구조에 대한 이해가 필요합니다.</li>
</ul>
</li>
<li>필요 언어<ul>
<li><span style='background-color: rgb(99 208 255)'>한국어</li>
</ul>
</li>
</ul>
<h4 id="경력-자격-요건">경력 자격 요건</h4>
<ul>
<li>요구 경력<ul>
<li><span style='background-color: rgb(99 208 255)'>최소 1년 이상 프론트 개발 실무 경력</span></li>
</ul>
</li>
<li>필요기술<ul>
<li>학습(연습)용 프로젝트가 아닌 <span style='background-color: rgb(99 208 255)'>실제 프로젝트에서 최소 1년 이상의 React 개발 경험</span>이 필요합니다.</li>
<li><span style='background-color: rgb(99 208 255)'>React Hook</span>에 대한 이해 및 개발 경험이 필요합니다.</li>
<li><span style='background-color: rgb(99 208 255)'>Redux 상태관리 및 미들웨어 라이브러리를 사용한 비동기 통신 개발 경험</span>이 필요합니다.</li>
</ul>
</li>
</ul>
<h3 id="-우대-사항-">[ 우대 사항 ]</h3>
<hr>
<aside>
⚠️ 아래의 사항들은 단순 우대입니다. 
필수적인 요건이 아니며, 저희가 사용하는 기술 스택과 관련이 있을 뿐입니다.

</aside>

<ul>
<li>Typescript 및 Next.js 기반 프로젝트 개발 경험이 있으신 분</li>
<li>Node.js에 대한 이해가 있으신 분</li>
<li>WebSocket에 대한 이해가 있으신 분</li>
</ul>
<p><br/><br/></p>
<h2 id="📝-꿈많은청년들-jd-분석">📝 꿈많은청년들 JD 분석</h2>
<h3 id="jd-keywords">JD Keywords</h3>
<h4 id="🔴-all">🔴 All</h4>
<ul>
<li>HTML</li>
<li>CSS</li>
<li>JavaScript(VanillaJS)</li>
<li>React (실제 프로젝트에서 React 1년 이상 개발 경험, React Hook 이해 및 개발 경험, BackEnd연동)</li>
<li>REST API</li>
<li>DOM</li>
<li>Redux (상태관리 및 미들웨어 라이브러리를 사용한 비동기 통신 개발 경험)</li>
<li>WebSocket</li>
</ul>
<h4 id="🟠-often">🟠 Often</h4>
<ul>
<li>TypeScript</li>
<li>Next.js</li>
<li>Node.js</li>
</ul>
<br/>

<h3 id="그-밖의-keywords">그 밖의 Keywords</h3>
<ul>
<li>사용자 편리성이 우수한 서비스 구현, 원활한 커뮤니케이션 능력, 협업 능력</li>
</ul>
<br/>


<h3 id="span-stylebackground-color-rgb99-208-255꿈많은청년들-인재상span"><span style='background-color: rgb(99 208 255)'>꿈많은청년들 인재상</span></h3>
<ul>
<li>사용자 만족을 위한 기능을 구현하기 위해, 원활한 커뮤니케이션 능력과 BackEnd연동이 능숙한 프론트엔드 개발자</li>
</ul>
<p><br/><br/></p>
<p>[참고자료]</p>
<ul>
<li><a href="https://blog.naver.com/PostView.naver?blogId=79ipjun&amp;logNo=222851501601&amp;categoryNo=36&amp;parentCategoryNo=0&amp;viewDate=&amp;currentPage=1&amp;postListTopCurrentPage=1&amp;from=postView">JD분석으로 알아보는 요즘</a></li>
<li><a href="https://terms.naver.com/entry.naver?docId=2178791&amp;cid=51072&amp;categoryId=51072">HRD 용어사전: 직무기술</a></li>
<li><a href="https://dreamyoungs.com/">꿈많은청년들 | 회사 페이지</a></li>
<li><a href="https://cloudturing.com/">꿈많은청년들 | Cloud Turing</a></li>
<li><a href="https://onul.works/">꿈많은청년들 | 오늘의업무</a></li>
<li><a href="https://www.youthassembly.kr/news/697652">꿈많은청년들 | 오늘의업무 관련기사</a></li>
<li><a href="https://dreamys.notion.site/12a142c273a44782a6a023e4c4e0c951">꿈많은청년들 | FE 직무소개</a></li>
<li><a href="https://dreamys.notion.site/Front-End-94db8f4af8f44eaa8b6975c6330ced06">꿈많은청년들 | FE 채용정보</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[회고록] 멋사 7월 KPT 회고]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-review-0805</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-review-0805</guid>
            <pubDate>Sat, 05 Aug 2023 07:12:07 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>23.07.03 ~ 23.07.31 멋쟁이사자처럼 프론트엔드 스쿨 7월 수강 회고록</p>
</blockquote>
<br/>

<h1 id="🚩-들어가기-전">🚩 들어가기 전..</h1>
<br/>

<h2 id="회고의-의미">회고의 의미</h2>
<ul>
<li>돌아보는 것</li>
<li>지나간 일을 돌이켜 생각하는 것</li>
</ul>
<br/>

<h2 id="회고의-목적">회고의 목적</h2>
<ul>
<li>과거를 되돌아보고 &quot;그럼 이제 무엇을 해야할까?&quot;라는 것을 생각하며,
문제 인지 및 개선하기 위함</li>
<li>궁극적인 목적은 &#39;성장&#39;</li>
</ul>
<br/>

<h2 id="회고-방법">회고 방법</h2>
<ul>
<li>회고 방법론은 KPT, 4L, 5F 등 다양한 방법들이 있다.</li>
<li>회고 방법론들의 핵심 메세지는 비슷하며, 방법이 중요하기 보다 <span style="color:royalblue"><strong>자신이 했던 일에 대해 생각하고 그 후에 무엇을 할지 고민</strong></span>하는 것이 핵심이다.</li>
<li><span style="color:salmon"><strong>솔직하게 작성</strong></span>하는 것이 중요</li>
</ul>
<h3 id="kpt-회고">[KPT 회고]</h3>
<ul>
<li>Keep(잘한 것), Problem(아쉬운 것), Try(시도할 것)의 약자<ul>
<li>K: 잘 해와서 유지하고 싶은 것</li>
<li>P: 어려움을 느껴서 개선하고 싶은 것</li>
<li>T:  구체적인 시도할 내용</li>
</ul>
</li>
</ul>
<br/>

<h3 id="4l-회고">[4L 회고]</h3>
<ul>
<li>Liked : 좋았던 점은 무엇인가?</li>
<li>Lacked : 아쉬웠던 점, 부족한 점은 무엇인가?</li>
<li>Learned : 배운 점은 무엇인가?</li>
<li>Longed for : 앞으로 바라는 것은 무엇인가?</li>
</ul>
<br/>

<h3 id="5f-회고">[5F 회고]</h3>
<ul>
<li>Facts : 사실. 무슨 일이 있었는가?</li>
<li>Feeling : 느낀 점, 감정. 어떤 느낌이 들었는가?</li>
<li>Finding : 배운 점, 인사이트. 어떤 것을 기억하고 싶은가?</li>
<li>Future Action : 향후 액션 아이템. 앞으로 무엇을 할 것인지?</li>
<li>Feedback : 피드백. Future Action에서 정한 액션 아이템을 실행하고, 어떤 피드백을 받았는가?</li>
</ul>
<p><br/><br/></p>
<h1 id="🚩-7월-kpt-회고">🚩 7월 KPT 회고</h1>
<p><img src="https://velog.velcdn.com/images/chance_777/post/35108977-df6e-4e48-9f9c-3cd6bb517ebb/image.png" alt=""></p>
<h2 id="span-stylecolor177cc4keepspan"><span style="color:#177cc4">Keep</span></h2>
<ul>
<li><strong>건강 관리</strong><ul>
<li>건강식 만들어 먹기</li>
<li>주 4회 이상 30분~1시간씩 운동(헬스, PT, 공원 산책, 홈트)</li>
</ul>
</li>
</ul>
<ul>
<li><strong>TIL 블로그</strong><ul>
<li>당일 학습 내용 복습 및 정리</li>
<li>1일 1포스팅 <del>(종종 하루 gap 발생하는 경우 있음)</del></li>
</ul>
</li>
</ul>
<ul>
<li><strong>멋사 회고조 활동</strong><ul>
<li>매주 1회 정기 회의 통하여 회고조 자체 스터디 문화 형성 </li>
<li>Github PR 협업 연습 진행 중</li>
<li>휴강일 or 주말 오프라인 모각코 진행</li>
</ul>
</li>
</ul>
<ul>
<li><strong>멋사 블로그 스터디 활동</strong><ul>
<li>매주 일요일 오후 8시 블로그 공유회 진행</li>
<li>한 주 동안 배운 학습 내용 중, 더 깊게 파고 싶은 부분 혹은 이해가 어려웠던 부분 포스팅하여 공유</li>
<li>3~5분 이내 발표 후, 질문 받는 시간을 가지며 &quot;내가 정확히 이해하고 있는가&quot;를 알 수 있음.</li>
</ul>
</li>
</ul>
<br/>

<h2 id="span-stylecolorredproblemspan"><span style="color:red">Problem</span></h2>
<ul>
<li><strong>학습 진도</strong><ul>
<li>학습 진도 follow 어려움<ul>
<li>why? 비전공 + 멋사에서 코딩 공부 처음 시작 </li>
<li>지금 당장 이해가 안되는 부분은 반복적으로 나오기 때문에 넘어가도 된다고 하셨는데, 나는 거의 다 넘어가는 것 같다..(안돼...😭😭😭)</li>
</ul>
</li>
<li>과제가 주어지면 많은 시간이 소모됨<ul>
<li>why? 도움을 요청하기 전에, 먼저 스스로의 힘으로 해결해보고 싶은 욕망이 가득했다..내가 직면한 문제를 스스로 해결했을 때의 쾌감을 느끼면서 체득화 하고 싶었는데 쉽지 않았다. 내가 해볼 수 있는 방법을 총 동원해보고 이 후에 도움 요청을 한다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><strong>블로그 포스팅</strong><ul>
<li>TIL 블로그 포스팅 패턴 개선 필요<ul>
<li>why? 기초 지식이 전무한 상태다보니, 현재 나의 TIL 포스팅 패턴은 &#39;기본 개념 + 간단한 실습 코드&#39;의 나열이다.</li>
<li>블로그를 작성하면서 스스로에게 이런 생각이 들 때가 많았다. &quot;이 정도면 그냥 교안에 있는 내용 복사 붙여넣기 한 거 아닌가..&quot;</li>
<li>블로그를 위한 블로그가 아니라, 체득화를 하기 위해 효율적으로 포스팅 할 수 있도록 패턴 개선 필요성을 느꼈다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<br/>

<h2 id="span-stylecolor12b886tryspan"><span style="color:#12b886">Try</span></h2>
<ul>
<li><span style="color:#12b886"><strong>Problem에 대한 해결책</strong></span><ul>
<li><strong>학습 진도 follow</strong><ul>
<li>정규 수업 종료 후, 수업 내용 관련한 동영상 강의(유튜브, 인프런 등) 찾아서 수강하기</li>
</ul>
</li>
<li><strong>과제</strong><ul>
<li>우선, 스스로 만들어 볼 수 있는 영역까지 만들기</li>
<li><strong>3번 이상</strong> 시도했을 때 해결이 안 된 부분은 회고조 분들과 함께 집단 지성을 이용하여 문제 해결</li>
</ul>
</li>
<li><strong>TIL 블로그 포스팅</strong><ul>
<li>블로그 스터디 조원분들 포스팅 참고</li>
<li>각 기업 기술 블로그 참고</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><span style="color:#12b886"><strong>다음 회고 때 판별 가능한 것</strong></span><ul>
<li><strong>학습 진도 follow</strong><ul>
<li>수업 내용 관련 동영상 시청 기록 및 Finding(배운 점), Future Action(향후 액션 아이템) 간단히 기록</li>
</ul>
</li>
<li><strong>과제</strong><ul>
<li>회고조 Github에 과제 실습 코드 추가/수정 내역</li>
<li><strong>TIL 블로그 포스팅</strong><ul>
<li>포스팅 패턴의 변화 (AS-IS: &#39;개념+간단한 코드&#39; → TO-BE: ???)</li>
<li>나만의 방법을 찾았는가</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li><span style="color:#12b886"><strong>당장 실행 가능한 것</strong></span><ul>
<li>정규 수업 종료 후, 추가로 동영상 강의(유튜브, 인프런) 시청 및 기록</li>
<li>블로그 스터디 및 각 기업 기술 블로그 참고</li>
</ul>
</li>
</ul>
<p><br/><br/>
[&#39;회고&#39; 관련 참고]
<a href="https://zzsza.github.io/diary/2023/06/05/how-to-retrospect/">https://zzsza.github.io/diary/2023/06/05/how-to-retrospect/</a>
<a href="https://brunch.co.kr/@jinha0802/35">https://brunch.co.kr/@jinha0802/35</a>
<a href="https://techblog.woowahan.com/2677/">https://techblog.woowahan.com/2677/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230803]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230803</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230803</guid>
            <pubDate>Fri, 04 Aug 2023 08:05:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🟢-javascript-type">🟢 Javascript Type</h1>
<br/>

<h2 id="원시-타입-primitve-types">원시 타입 (Primitve Types)</h2>
<h3 id="undefined">undefined</h3>
<ul>
<li>아무런 값도 <strong>할당받지 않은, 정의되지 않은</strong> 상태</li>
<li>정의되지 않은 변수에 접근하려고 할 때 undefined 반환</li>
<li>undefined는 falsy 값으로 평가되기 때문에, 조건문에서 변수에 값이 할당되어 있는 상태인지 확인하고자 할 때 자주 사용함<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/344d7b00-74f3-478a-819c-4ee1dba4ff08/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<br/>

<h3 id="null">null</h3>
<ul>
<li>null은 <strong>값이 없음</strong>을 나타냄</li>
<li>어떤 값이 <strong>의도적으로 비어있음</strong>을 표현하며, Boolean연산에서는 false로 취급<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/f684f591-0e63-4672-a4a7-944e8b2a45c9/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<br/>

<h3 id="bigint">bigInt</h3>
<ul>
<li><code>Number</code>원시 값이 안정적으로 나타낼 수 있는 최대치인 2^53 - 1 (9007199254740991) 보다 큰 정수를 표현할 수 있는 객체</li>
<li>정수 뒤에 <code>n</code>을 붙이거나 함수 <code>bigInt()</code>를 호출해 생성<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/3bd8a195-9fd2-4749-a669-1b48d574470c/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h2 id="객체-타입-object-types">객체 타입 (Object Types)</h2>
<ul>
<li>프로퍼티와 메서드를 가지며, 이 둘은 각각 객체의 상태와 동작을 나타냄</li>
<li>값을 변수에 저장할 때 값 자체가 아닌 <span style=color:royalblue><strong>값의 위치</strong></span>가 저장됨</li>
<li>객체 값을 다른 변수에 할당 할 때는 값 자체가 복사되어 저장되는 것이 아닌 <span style=color:royalblue><strong>값의 참조(위치)</strong></span>가 저장됨</li>
</ul>
<br/>

<h3 id="배열-array">배열 (Array)</h3>
<ul>
<li>배열은 데이터를 순서대로 저장하는 객체</li>
<li>여러 개의 데이터를 한 변수에 저장할 수 있기 때문에 데이터를 추가, 제거, 정렬, 검색 등 다양한 작업을 수행할 수 있도록 여러 메소드 제공<pre><code class="language-javascript">// 1. array의 여러가지 형태
let arr1 = []
</code></pre>
</li>
</ul>
<p>let arr2 = [1, 2, 3]</p>
<p>let arr3 = [[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]]
arr3[0] // 출력: [1, 2, 3]
arr3[1] // 출력: [4, 5, 6]
arr3[2] // 출력: [7, 8, 9]
arr3[1][2] // 출력: 6</p>
<p>// 2. array 길이 출력
let arr1 = [1, 2, 3]
arr1.length // 출력: 3
arr1.length = 100
arr1 // 출력: [1, 2, 3, empty × 97]
arr1[10] = null
arr1 // 출력: [1, 2, 3, empty × 7, null, empty × 89]</p>
<p>let arr2 = [[1, 2, 3],
            [4, 5, 6],
            [7, 8, 9]]
arr2.length // 출력: 3
arr2.flat().length // 출력: 9</p>
<p>let arr3 = [[[10, 20], [10, [10, 20]], 3],
            [[10, 20], [10, [10, 20]], 6],
            [[10, 20], [10, [10, 20]], 9]]
arr3.flat()
arr3.flat().flat().flat()
arr3.flat(3)
arr3.flat(Infinity)</p>
<pre><code>
&lt;br/&gt;&lt;br/&gt;

# 🟠 function (함수)
- 특정한 작업을 수행하기 위해 만들어진 &quot;명령어 묶음&quot;
- 반복적으로 필요한 코드를 하나의 덩어리로 묶어서 필요할 때마다 꺼내 쓸 수 있음

**[함수 설명 예시]**
```javascript
// 건물 올리기 할 예정

// 땅 다지기()
// 말뚝세우기()
// 기초콘크리트()
// 철근바인딩()
// 기둥세우기()
// 외벽올리기()
// 지붕올리기()

// 1번째 장점
// 아키텍처 파악: 이 코드를 보고 건물올리기를 한다는 것을 알 수 있음.

// 2번째 장점
// 유지보수 용이: 예를 들어 기둥에 문제가 생기면 기둥세우기() 함수로 가면 됨

// 3번째 장점
// 재사용성: 새로운 건물을 세울 때, 똑같은 함수를 다시 사용하면 됨

// 함수의 장점
// scope 변수가 다른 변수를 침범하지 못하게 보호해주는 보호막 같은 것.


// 이렇게 선언하면 인부들이 투입된 상태는 아닌 것. 
// 실제로 이대로 일을 해라! 하는 것은 &#39;호출&#39;을 해야 함.
// 이 부분은 &#39;정의&#39;부분 임.
function 땅다지기(삽, 인원){ // &#39;삽&#39;과 &#39;인원&#39;은 파라미터 (파라미터는 선언할 때)
      // 기능
      console.log(`${삽}개의 삽을 가지고 ${인원}명이 땅을 다진다!`)
      return &#39;다져진 땅&#39;  
      // return은 해당 함수가 실행되면 반환하는 값 전달
      // 함수 내부에서 return 구문을 만나면 해당 함수는 &#39;종료&#39; 됨
}

땅다지기(10,30) // &#39;10&#39;과 &#39;30&#39;은 아규먼트 (실제로 값을 넣는 것)
</code></pre><blockquote>
<p><strong>[중요 포인트]</strong>
&#39;파선아실&#39;
<strong>파</strong>라미터는 <strong>선</strong>언  (파라미터 = 매개변수)
<strong>아</strong>규먼트는 <strong>실</strong>제 값  (아규먼트 = 전달인자,인수)</p>
</blockquote>
<br/>

<h2 id="함수의-종류">함수의 종류</h2>
<h3 id="함수-선언문">함수 선언문</h3>
<ul>
<li>지정된 매개변수(parameter)를 갖는 함수를 정의</li>
</ul>
<p>[구문]</p>
<pre><code class="language-javascript">function 함수이름 (매개변수) {   
     [함수가 수행하는 작업] 
}


function sum(x, y) {
    return x + y;
}

sum(1, 2);  // result: 3</code></pre>
<br/>

<h3 id="함수-표현식">함수 표현식</h3>
<ul>
<li>함수를 다른 변수에 할당하여 정의하는 방식 (= 함수를 변수에 넣는 것)<pre><code class="language-javascript">function sumXY = function (x, y) {
  return x + y;
};
console.log(sumXY(10, 20));  // result: 30</code></pre>
</li>
</ul>
<br/>

<h3 id="화살표-함수">화살표 함수</h3>
<ul>
<li>function 키워드를 화살표 기호로 대체하여 표현</li>
<li>화살표 함수는 선언 시 제목을 정할 수 없기 때문에 표현식으로 사용해야 함<pre><code class="language-javascript">// 1. return문만 있는 경우
function sum(x, y) {
  return x + y;
}
</code></pre>
</li>
</ul>
<p>// 위 함수를 화살표 함수로 작성하면 아래와 같음
let sum = (x, y) =&gt; x + y</p>
<p>// 2. 함수의 기능 + return이 있는 경우
function sum(x, y) {
    let z = x + y;
    console.log(z)
    return z;
}</p>
<p>// 위 함수를 화살표 함수로 작성하면 아래와 같음
let sum = (x, y) =&gt; {
    let z = x + y;
    console.log(z)
    return z;
}</p>
<p>// 3. 인자가 하나인 경우
function pow(x) {
    return x * x;
}</p>
<p>// 위 함수를 화살표 함수로 작성하면 아래와 같음
let pow = x =&gt; x * x;
let pow = (x) =&gt; x * x;</p>
<pre><code>
&lt;br/&gt;

### 즉시 실행 함수
- 함수를 &#39;정의&#39;함과 동시에 즉시 실행하는 방법
- 전역변수 충돌을 피하기 위해 초기화 코드 부분에서 많이 사용 됨
```javascript
(function () {
  console.log(&#39;즉시 실행!&#39;)
})()</code></pre><br/>

<h3 id="전역변수--지역변수">전역변수 , 지역변수</h3>
<ul>
<li>전역변수(Global Variable)<ul>
<li>함수 밖에서 선언된 변수</li>
<li>프로그램 전체에서 접근 가능</li>
</ul>
</li>
</ul>
<ul>
<li>지역변수(Local Variable)<ul>
<li>함수 내에서 선언된 변수</li>
<li>지역변수는 해당 함수 내에서만 유효하며, 다른 함수나 전역 스코프에서는 접근 불가</li>
</ul>
</li>
</ul>
<pre><code class="language-javascript">// 1. 전역변수
let a = 10; // 전역변수
function test() {
  console.log(a)
}
test()  // result: 10


// 2. 지역변수
let a = 10
function one() {
  let a = 100 // 지역변수
  function two() {
      function three() {
          console.log(a)
      }
      three()
  }
  two()
}
one()  // result: 100

// 자신의 공간에 해당 변수가 없으면 상위 공간에서 찾음
// 못 찾으면 error</code></pre>
<br/>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230802]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230802</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230802</guid>
            <pubDate>Wed, 02 Aug 2023 13:44:02 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<br/>

<h1 id="🟢-javascript-type">🟢 Javascript Type</h1>
<br/>

<h2 id="문자열string">문자열(String)</h2>
<ul>
<li><code>.replace()</code><ul>
<li>문자열 안에서 일치하는 첫 번째 문자열을 찾고, 대체하여 새로운 문자열 반환</li>
<li>&quot;첫 번째 인자는 찾아야 할 문자열&quot;, &quot;두 번째 인자는 대체할 값&quot;</li>
<li><code>/ /g</code> g플래그를 사용하면 일치하는 모든 부분 대체 가능<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/3868a9df-545b-4835-8041-f8863071807a/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><code>.includes()</code><ul>
<li>문자열에서 특정 부분 문자열이 포함되어 있는지 여부를 판별</li>
<li>불리언(boolean)값을 반환하며, 찾고자 하는 부분 문자열이 포함되어 있다면 true, 없으면 false<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/fe1588b0-7d95-4a92-81de-912775c0f300/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><code>.split()</code><ul>
<li>문자열을 특정 구분자를 기준으로 분리하여 배열로 반환 (=쪼개다)</li>
<li><code>.split(separatior, limit)</code> 형태로 사용</li>
<li><code>separator</code>: 문자열을 분리할 구분자(delimiter)</li>
<li><code>limit</code>(선택): 반활할 배열의 최대 길이 지정<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/f11171a1-07b9-4fab-b2df-385a66f7d362/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><code>.trim()</code><ul>
<li>문자열 앞 뒤의 공백 제거<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/63e33d8c-d579-4f10-bbec-6a8f5767d79a/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><code>.padStart()</code><ul>
<li>자릿수에 맞춰 값을 시작 부분부터 채움</li>
</ul>
</li>
<li><code>.padEnd()</code><ul>
<li>자릿수에 맞춰 값을 끝 부분부터 채움<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/90f6799d-6573-4958-8fb2-e19074bf4aee/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><code>.concat()</code><ul>
<li>하나 이상의 문자열을 기존 문자열에 연결하여 새로운 문자열 생성<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/45b8d02c-7cbb-40f8-b5f3-5eeafff0cf0b/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h2 id="숫자형number">숫자형(Number)</h2>
<ul>
<li>숫자를 처리하기 위해 고안된 자료형</li>
<li>배정밀도 64비트 부동소수점 형식을 따름<ul>
<li>배정밀도: 숫자 하나를 표현하는데 64비트 용량 사용</li>
<li>부동소수점: 부(떠서) + 동(움직이다) 즉, 소수점을 이동시켜면서 숫자를 표현</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>산술 연산</strong><blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/f6d275dc-bdcb-46a0-a34b-744b724f6926/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<br/>

<ul>
<li><strong>단항 연산자</strong><ul>
<li>일반적인 <code>1+1</code>과 같은건 피연산자가 두 개 이므로 &#39;이항 연산자&#39;이고, <strong>피연산자가 하나인 연산자</strong>를 단항 연산자 라고 함.<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/27037001-f37c-4fb4-a232-829e2b74533d/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>증감 연산자</strong>  <blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/cc9c747a-2855-40d9-8988-2682fa0e7db4/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<br/>

<ul>
<li><strong>비교 연산자</strong>  <blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/c4976634-1bbf-474a-b999-27d8d53805e9/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h3 id="숫자를-표현하는-여러가지-기법">숫자를 표현하는 여러가지 기법</h3>
<ul>
<li><strong>Infinity</strong><ul>
<li>무한대를 의미하는 숫자로, 아주 큰 수를 표현하거나 불가능한 연산(0으로 나누기)이 발생했을 때 그 결과값을 infinity로 취급<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/15dc22b5-7777-4a78-aaab-5ffa37cff6aa/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>10의 거듭제곱 <code>e</code></strong> <ul>
<li>숫자형 데이터에 알파벳 <code>e</code>를 붙이면 0을 손쉽게 추가할 수 있음<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/712966ee-939d-455e-9a02-009a10f321f4/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>NaN (Not a Number)</strong><ul>
<li>산술 연산이 불가능한 데이터 타입과 연산을 진행하려고 할 때 반환되는 값<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/c6dfd9a6-c863-4ebe-a9ca-087794242fda/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>parseInt, parseFloat</strong><ul>
<li><code>parseInt</code>: 문자열을 <strong>정수</strong>로 바꿈</li>
<li><code>parseFloat</code>: 문자열을 <strong>부동소수점 숫자(실수)</strong>로 바꿈 / 수가 아닌 문자로 시작하면 NaN 반환 <blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/4b20ca3d-6dfc-47ab-8b51-e8052ebde5ce/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>toString</strong><ul>
<li>숫자를 문자열로 변환. 전달 인자를 통해 원하는 진수로 표현 가능<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/d003700a-d55f-4d1d-976f-886a7f400b57/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>isNaN (Number.isNaN)</strong><ul>
<li>어떤 값이 NaN인지 판별 (숫자가 아닌지 판별함)</li>
<li>숫자로 판별되지 않으면 true, 숫자로 판별되면 false</li>
<li>ES6 추가 도입: Number.isNaN (사용 권장)<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/729862f3-029d-4404-8936-c68250ca7ada/image.png" alt="">
<img src="https://velog.velcdn.com/images/chance_777/post/80bb37c5-22e3-4324-9a68-7eec176c467f/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>Math</strong><ul>
<li>Javascript가 기본적으로 가지고 있는 Math 객체를 이용하면 좀 더 유용한 여러 연산 가능<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/1956f201-c796-4df4-b6f9-f066cfd086b1/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h2 id="논리-자료형boolean">논리 자료형(Boolean)</h2>
<ul>
<li>Boolean 타입은 true 또는 false 값 중 하나를 가지며, 주로 조건문(if)의 결과값으로 사용</li>
<li>true(참, 1), false(거짓, 0)</li>
</ul>
<h3 id="논리-연산자">논리 연산자</h3>
<ul>
<li>Boolean 값을 가지는 피연산자를 대상으로 하는 연산자</li>
</ul>
<br/>

<ul>
<li><strong>논리곱 (&amp;&amp;, and) 연산자</strong><ul>
<li>두 개의 피연산자가 모두 &#39;true&#39; 일 때만 &#39;true&#39; 반환</li>
<li>그 외에는 &#39;false&#39; 반환<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/41f0c146-b2d1-4349-a23a-ba88d34eaf28/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>논리합 (||, or) 연산자</strong><ul>
<li>두 개의 피연산자 중 하나 이상 &#39;true&#39; 일 때 &#39;true&#39; 반환</li>
<li>두 개의 피연산자 모두 &#39;false&#39; 인 경우 &#39;false&#39;<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/e72f2ee9-8d12-4d8b-9523-f31e6849538f/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><strong>논리부정 (!, not) 연산자</strong><ul>
<li>단일 피연산자를 가지며, 피연산자가 &#39;true&#39; 이면 &#39;false&#39;를 반환하고, 피연산자가 &#39;false&#39;이면 &#39;true&#39;를 반환.</li>
<li>즉, 대상의 Boolean(true,false) 값을 부정하는 것<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/787ae010-a10a-4043-b3b3-fde04a0db9d2/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h2 id="할당-연산자">할당 연산자</h2>
<ul>
<li>오른쪽 피연산자의 값을 왼쪽 피연산자에 할당</li>
<li>기본적인 할당 연산자는 오른쪽 피연산자 값을 왼쪽 피연산자 값에 할당하는 등호(<code>=</code>)<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/47b5e585-7924-49cc-99f8-16df5e220765/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h2 id="삼항-연산자">삼항 연산자</h2>
<ul>
<li>세 개의 피연산자를 받는 유일한 연산자</li>
<li>주어진 조건에 따라 두 값 중 하나를 반환함</li>
<li>구문 <code>(조건식) ? (참일 경우 실행되는 표현식) : (거짓일 경우 실행되는 표현식);</code><blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/66529ff2-567a-4b33-b86f-1754d2cdee4e/image.png" alt=""></p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230801]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230801</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230801</guid>
            <pubDate>Tue, 01 Aug 2023 14:42:55 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🟨-javascript">🟨 Javascript</h1>
<br/>

<h2 id="javascript를-사용하는-방법">Javascript를 사용하는 방법</h2>
<h3 id="html-파일-내부-삽입">HTML 파일 내부 삽입</h3>
<ul>
<li>HTML 태그 내 삽입<pre><code>&lt;button onclick=&quot;window.alert(&#39;hello world&#39;);&quot;&gt;hello&lt;/button&gt;</code></pre></li>
<li>script 태그를 통해 삽입<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
      window.alert(&#39;hello world!&#39;);
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="html-파일-외부-삽입">HTML 파일 외부 삽입</h3>
</li>
<li>외부파일(.js)로 저장하고 로드<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script src=&quot;test.js&quot;&gt;&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><h3 id="javascript-연습-브라우저-콘솔창">Javascript 연습 (브라우저 콘솔창)</h3>
</li>
<li><code>about:blank</code> 페이지 접속</li>
<li>브라우저 콘솔창 열기: 크롬 브라우저는 <code>Ctrl + Shift + i</code> 버튼 클릭 시 열림</li>
<li>아래 예시 콘솔창에서 확인해보기!<pre><code>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;title&gt;javascript console&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;script&gt;
      let x = 10;
      let y = 20;
      console.log(x);
      x = x + y;
      console.log(x);
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre></li>
</ul>
<p><br/><br/></p>
<h2 id="🔵-자주-사용하는-console-종류">🔵 자주 사용하는 console 종류</h2>
<h3 id="consoleclear">console.clear()</h3>
<ul>
<li>이전에 기록된 로그 메시지, 오류, 경고 및 기타 콘솔 출력 모두 제거</li>
</ul>
<br/>

<h3 id="consoledir">console.dir()</h3>
<ul>
<li>객체의 속성들을 log로 출력하는데 사용</li>
<li>각 속성의 값이나 타입에 대한 정보도 함께 표시됨<pre><code class="language-javascript">const person = {
name: &#39;멋쟁이사자&#39;,
age: 30,
address: {
  city: &#39;New York&#39;,
  country: &#39;USA&#39;
}
};
</code></pre>
</li>
</ul>
<p>console.dir(person);</p>
<pre><code>&gt;![](https://velog.velcdn.com/images/chance_777/post/866b9185-268c-442e-8034-7119c18852fd/image.png)


&lt;br/&gt;

### console.table()
- Javascript에서 배열이나 객체의 내용을 테이블 형태로 콘솔에 출력
- 구조적인 데이터를 더 쉽게 시각화하고 분석할 수 있음
```javascript
let data = {a:1, b:2, c:3}

console.table(data)</code></pre><blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/de018e65-d587-426f-ac19-8b64a6f7939e/image.png" alt=""></p>
</blockquote>
<br/>

<h3 id="consolegroup">console.group()</h3>
<ul>
<li><p>콘솔 출력을 그룹화하여 복잡한 코드의 실행 흐름을 시각적으로 파악하고, 로그를 논리적으로 묶어서 표시할 수 있음</p>
<pre><code class="language-javascript">console.group(&#39;TF&#39;);
      console.log(&#39;사자/팀장&#39;);
      console.log(&#39;호랑이/팀원&#39;);
      console.log(&#39;코끼리/팀원&#39;);
      console.groupEnd();

      console.group(&#39;Sub&#39;);
      console.log(&#39;거북이/팀장&#39;);
      console.group(&#39;Sub-1&#39;);
      console.log(&#39;토끼/팀원&#39;);
      console.log(&#39;다람쥐/팀원&#39;);
      console.groupEnd();</code></pre>
<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/b7aa3956-5964-4527-92d7-64cf05914518/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<br/>

<h3 id="consoleerrorwarninfo">console.error/warn/info</h3>
<ul>
<li>console.error (&#39;에러발생&#39;)</li>
<li>console.warn (&#39;경고발생&#39;)</li>
<li>console.info (&#39;정보&#39;)<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/73f05c4a-335d-419c-8dad-867958567a86/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h2 id="🟣-변수">🟣 변수</h2>
<ul>
<li>변수는 &#39;변할 수 있는 수&#39;, &#39;변할 수 있는 정보&#39;를 뜻 함</li>
<li>데이터를 보관할 공간에 데이터가 무엇인지 이름을 붙이는 <strong>포스트잇</strong> 같은 역할</li>
</ul>
<br/>

<h3 id="변수-선언">변수 선언</h3>
<ul>
<li>변수는 선언하고, 할당하고, 사용할 수 있음</li>
<li>변수는 &#39;변할 수 있는 수&#39; 이므로, <code>const</code>를 제외하고 지정된 값을 계속 바꿀 수 있음</li>
</ul>
<h3 id="변수명">변수명</h3>
<ul>
<li>변수 이름은 $, _ 를 제외한 공백, 특수문자, 반점(,). 온점(.), 물음표(?) 등..사용 할 수 없음</li>
<li>첫 글자는 숫자가 될 수 없음</li>
<li>대소문자 구별</li>
<li>예약어(let, const, var, if, else 등)가 쓰일 수 없음.<blockquote>
<p><strong><code>let</code>과 <code>const</code> 알고 넘어가기!</strong>
let : 재할당이 가능한 변수를 선언할 때 사용
const : 재할당이 불가능한 상수를 선언할 때 사용</p>
</blockquote>
</li>
</ul>
<br/>

<h3 id="블록-스코프block-scope">블록 스코프(block scope)</h3>
<ul>
<li>여러 줄의 코드를 하나로 묶어주는 단위인 블록( { } ) 이 있음</li>
<li>그런 블록 안에서만 유효한 코드의 범위를 블록 스코프라고 함<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/c1e2398e-af6b-412a-adb4-6fe11a01110f/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<p><br/><br/></p>
<h2 id="🟢-javascript-type">🟢 Javascript Type</h2>
<ul>
<li>&#39;자료형&#39;이라는 뜻으로, 변수의 타입은 다양한 데이터를 <strong>용도에 맞게 쓰기 위해 사용</strong> 함</li>
<li>ex) 1234와 같은 숫자는 <code>number type</code>으로, &#39;가나다&#39;와 같은 문자는 <code>string type</code>으로 나누어 각각의 데이터 형에 맞는 여러가지 기능 지원</li>
</ul>
<h3 id="javascript-type의-종류">Javascript Type의 종류</h3>
<ul>
<li>원시타입<ul>
<li>값 변경 불가하며, 참조가 아닌 실제 값 자체가 변수에 저장됨</li>
<li>string, number, boolean, undefined, symbol, null<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/695e426d-0e62-4f04-ae0a-75288df7dbe0/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ul>
<li>참조타입(객체(Object))<ul>
<li>원시 타입과 달리 값을 직접 포함하지 않고, 객체의 주소(메모리 위치)를 참조하여 변수에 할당하는 방식</li>
<li>객체, 배열, 함수, 정규표현식</li>
</ul>
</li>
</ul>
<br/>

<h3 id="문자열string">문자열(String)</h3>
<ul>
<li>작은따옴표( &#39; ), 큰따옴표( &#39; &#39; ), backtick ( ` ) 으로 둘러싼 일련의 문자</li>
<li>문자열은 순서가 있으며, 0부터 시작하고 띄어쓰기도 문자로 취급함.<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/f91db373-545b-4169-89a7-a70ae0ac3733/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<br/>

<ul>
<li><code>.length</code><ul>
<li>문자열의 길이</li>
</ul>
</li>
</ul>
<ul>
<li><code>.toUpperCase()</code><ul>
<li>대문자로 변환</li>
</ul>
</li>
</ul>
<ul>
<li><code>.toLowerCase()</code><ul>
<li>소문자로 변환</li>
</ul>
</li>
</ul>
<ul>
<li><code>.indexOf()</code><ul>
<li>문자열 안에 존재하는 특정한 문자를 검색하여 <strong>문자의 인덱스 반환</strong>
문자열 안에 검색하고자하는 <strong>문자가 존재하지 않으면 -1 반환</strong></li>
</ul>
</li>
</ul>
<ul>
<li><code>.search()</code><ul>
<li>정규 표현식을 사용하여 문자열 검색 가능하며, <code>g</code>플래그 기능을 사용하여 전역 검색 가능<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/f564799a-0d06-429b-a95b-441d36aef075/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br/>

<ul>
<li><code>.slice</code><ul>
<li>문자열의 일부분을 잘라냄</li>
<li>시작 인덱스와 종료 인덱스를 인자로 전달</li>
<li>종료 인덱스 바로 직전 (-1)까지 잘라냄</li>
<li>음수 인덱스를 허용하고, 음수 값은 문자열 끝에서부터 추출함<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/0ad513b0-2e0d-4dce-8366-6deb8e73b896/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
<ul>
<li><code>.substring</code><ul>
<li>시작 인덱스부터 종료 인덱스 바로 직전(-1)까지 잘라냄</li>
<li>음수 값은 0으로 처리되며, &#39;start&#39;가 &#39;end&#39;보다 큰 경우 자동으로 위치를 바꿔 처리함<blockquote>
<p><img src="https://velog.velcdn.com/images/chance_777/post/3720c223-aaf9-4c84-b6e2-91dea1c34cda/image.png" alt=""></p>
</blockquote>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230731]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230731</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230731</guid>
            <pubDate>Mon, 31 Jul 2023 14:43:50 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🌃-css-실무-테크닉">🌃 CSS 실무 테크닉</h1>
<h2 id="반응형-이미지">반응형 이미지</h2>
<h3 id="이미지-포맷의-종류">이미지 포맷의 종류</h3>
<ul>
<li>GIF(Graphics Interchange Format)<ul>
<li>256색의 컬러만 표현 가능하여 선명하지 않음</li>
<li>용량이 작음</li>
<li>투명 표현 가능(투명도는 조절 불가)</li>
<li>그림자 표현 불가능</li>
<li>애니메이션 처리 가능</li>
</ul>
</li>
</ul>
<ul>
<li>JPG/JPEG (Joint Photographic Expert Group image)<ul>
<li>화소가 매우 높음</li>
<li>용량이 작음</li>
<li>투명 처리 불가</li>
</ul>
</li>
</ul>
<ul>
<li>PNG (Portable Network Graphics)<ul>
<li>웬만한 컬러는 모두 표현 가능</li>
<li>투명 처리 가능</li>
<li>용량이 큼</li>
</ul>
</li>
</ul>
<ul>
<li>SVG (Scalable Vector Graphics)<ul>
<li>손실이나 품질 저하 없이 모든 크기에서 렌더링 가능  </li>
</ul>
</li>
</ul>
<ul>
<li>WebP (Web Picture Graphics)<ul>
<li>JPEG 이미지에 비해 용량이 70% 수준으로 낮음</li>
<li>더 뛰어난 색상을 지원하는 포맷</li>
<li>PNG처럼 투명도 표현 가능</li>
<li>GIF처럼 애니메이션 표현 가능</li>
<li>아직 지원하지 않는 브라우저가 많기 때문에 <strong>브라우저 지원 여부 확인 필수</strong></li>
</ul>
</li>
</ul>
<ul>
<li>AVIF (AV1 Image File Format)<ul>
<li>WebP와 성능 같으며, JPEG 이미지에 비해 50% 수준으로 낮은 용량을 자랑하는 차세대 이미지 포맷</li>
<li>아직 지원하지 않는 브라우저가 많기 때문에 <strong>브라우저 지원 여부 확인 필수</strong></li>
</ul>
</li>
</ul>
<ul>
<li>image 포맷 별 브라우저 지원 여부 확인<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types#avif_image">https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types#avif_image</a></li>
</ul>
</li>
</ul>
<br/>

<h3 id="반응형-이미지-만들기">반응형 이미지 만들기</h3>
<ul>
<li><code>width: 100%;</code>
-화면 너비(viewport)가 바뀌면 이미지 사이즈도 함께 움직임. 단, 이미지가 너무 커지면 화질이 깨질 수 있음</li>
</ul>
<ul>
<li><code>max-width: 100%;</code>
-그냥 width와 차이점은 <strong>원본 사이즈</strong>를 지킴. 이미지가 깨지면 안될 경우 max-width 사용</li>
</ul>
<br/>


<h3 id="반응형-백그라운드-이미지">반응형 백그라운드 이미지</h3>
<ul>
<li><p>단축속성</p>
<blockquote>
<p>background: url(&quot;이미지 링크&quot;) center /cover no-repeat;</p>
</blockquote>
</li>
<li><p><code>background-position: center;</code>
-중심축을 중앙에 위치함으로써 반응형 효과를 줄 수 있음</p>
</li>
</ul>
<ul>
<li><code>background-size: cover;</code>
-화면을 가득 채움. 반응형으로 조절되지 않으며 컨테이너를 완전 덮어버림.
-빈 공간, 여백없이 가득 채움.
-이미지가 짤려도 괜찮으니 일단 가득 채우겠다는 성질
-만약, 중심축을 바꾸게 된다면 반응형처럼 효과를 줄 수 있음</li>
</ul>
<ul>
<li><code>background-size: contain;</code>
-원본 이미지 자체를 온전히 보전하려는 특성을 가지고 있음
-빈 공간, 여백이 생기며 짤리는 부분없이 모든 이미지를 보존한 상태에서 반응형으로 컨테이너를 채우려고 하는 것
-<strong>Logo 혹은 icon 처럼 이미지가 짤리면 안되는 경우에 contain사용</strong></li>
</ul>
<p><br/><br/></p>
<h2 id="반응형-동영상">반응형 동영상</h2>
<h3 id="동영상-상식">동영상 상식</h3>
<ul>
<li>브라우저가 지원하는 비디오 포맷
<a href="https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers">https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers</a></li>
</ul>
<ul>
<li>video 속성<ul>
<li>preload = &quot;none&quot;, &quot;auto&quot;: 페이지 로드 시, 영상을 미리 로드할지 말지 결정</li>
<li>poster: 비디오를 내려받을 동안 혹은 영상을 재생할 때까지 표시할 이미지 지정</li>
<li>controls: 브라우저가 재생에 필요한 컨트롤러를 제공할지 지정</li>
<li>autopay: 파일 다운로드가 완료되면 자동으로 재생될지 지정</li>
<li>muted: 음소거</li>
<li>loop: 비디오가 끝나고 반복 재생할지 지정</li>
</ul>
</li>
</ul>
<br/>

<h3 id="반응형-동영상-만들기">반응형 동영상 만들기</h3>
<ul>
<li>반응형 이미지와 동일하게 <code>width</code>, <code>max-width</code>를 이용하여 반응형으로 적용 가능</li>
</ul>
<pre><code class="language-css">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;&lt;/title&gt;
    &lt;style&gt;

        video {
        min-width: 100%; /*동영상 크기도 반응형으로 만들 수 있다*/
        position: fixed; /* 화면을 뷰포트 기준으로 움직임 */
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        height: 100vh; /* 영상의 높이를 뷰포트 높이만큼 맞추겠다 (꽉채워짐) */
        /* min-height: 100%; 동영상 최소 너비가 100%라는 뜻으로 위 height 100vh과 같은 결과가 나옴(꽉참) */
        opacity: 0.2; /* 배경의 투명도. 그래서 보통 뒷 배경으로 사용할 때 사용함 */
        pointer-events: none; /* 사용자가 상호작용하지 못하도록 함 */
        }

    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;!-- &lt;video autoplay controls loop muted src=&quot;nextlevel.mp4&quot;&gt;&lt;/video&gt; --&gt;
    &lt;article&gt;
        &lt;video src=&quot;./nextlevel.mp4&quot; autoplay muted loop&gt;&lt;/video&gt;
    &lt;/article&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><br/><br/></p>
<h2 id="💜-bootstrap">💜 Bootstrap</h2>
<ul>
<li>CSS 라이브러리
-&#39;라이브러리&#39;란?<ul>
<li>함수의 집합 or 코드의 집합</li>
<li>누군가 만들어 놓은 것을, 내가 필요할 때 가져다 사용할 수 있음 = 종합 공구세트</li>
</ul>
</li>
</ul>
<ul>
<li>반응형 사이트를 구축하기에 최적화 되어있음</li>
<li>Bootstrap4와 Bootstrap5의 가장 큰 차이는 <strong>jQuery</strong>가 없어졌다는 것 </li>
</ul>
<br/>

<h3 id="적용-방법">적용 방법</h3>
<ul>
<li><p>Bootstrap 사이트 접속
<a href="https://getbootstrap.com/">https://getbootstrap.com/</a></p>
</li>
<li><p>Download 클릭하여 작업 환경에 맞게 설치 (실습은 <strong>CDN</strong>으로 진행)
!codepen[CreateSong/embed/yLQGQYw?default-tab=html%2Cresult]</p>
</li>
</ul>
<br/>

<h3 id="그리드-시스템">그리드 시스템</h3>
<ul>
<li>반응형 웹 디자인을 구현할 때 사용되는 레이아웃 시스템</li>
<li>웹페이지를 일련의 열과 행으로 분할하여 콘텐츠를 쉽게 배치하고 정렬할 수 있음</li>
<li>그리드 시스템은 <strong>12개의 열</strong>로 구성되어 있으며, 이 열들을 조합하여 원하는 레이아웃을 만듦
!codepen[CreateSong/embed/zYMyMZG?default-tab=html%2Cresult]</li>
</ul>
<br/>

<blockquote>
<p>부트스트랩을 잘 활용하면 효율적으로 개발 할 수 있고, 생산성이 매우 향상될 것 같다. 특히 &#39;그리드 시스템&#39;이 가장 핵심이라고 강조해주셨는데, 개인 실습 할 때 부트스트랩도 다양하게 활용해보도록 하자!</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[알쓸아지] git ignore 개념과 사용 방법]]></title>
            <link>https://velog.io/@chance_777/gitignore</link>
            <guid>https://velog.io/@chance_777/gitignore</guid>
            <pubDate>Sun, 30 Jul 2023 09:52:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>git ignore에 대해 알아보자</p>
</blockquote>
<h1 id="🙄-git-ignore란">🙄 git ignore란?</h1>
<ul>
<li>ignore 사전적 의미: 무시하다, 못 본 체 하다.</li>
<li>사용자가 원하지 않는 파일,폴더들을 git 버전 관리에서 제외하겠다.</li>
</ul>
<br/>

<h2 id="git-ignore-사용하는-이유">git ignore 사용하는 이유?</h2>
<ul>
<li><strong>보안 및 개인정보 보호</strong></li>
<li>비밀번호, 인증 토큰, API 키 등과 같이 보안에 민감한 정보가 포함된 파일</li>
<li><strong>임시 파일 및 로그 파일</strong></li>
<li>개발 시스템에서 발생하는 임시 파일이나 로그 파일은 git저장소에 저장할 필요가 없으므로, 이러한 파일들을 무시하여 저장소 관리를 깔끔하게 유지할 수 있음</li>
<li><strong>혹여나 발생할 수 있는 데이터 충돌로 인한 손실 방지</strong></li>
<li><strong>내가 작업하는 공간에는 필요하지만 원격 저장소에는 제외하고 싶은 경우</strong></li>
</ul>
<blockquote>
<p>쉽게 말해, git ignore는
&quot;남에게 보여주고 싶지 않은(혹은 보여주면 안되는) 내용과 불필요한 내용들을 push할 때 제외하는 것&quot;</p>
</blockquote>
<p><br/><br/></p>
<h2 id="git-ignore-사용-방법">git ignore 사용 방법</h2>
<ul>
<li><p>git ignore를 설정할 수 있는 방법은 다양하지만, 간단하게 설정할 수 있는 방법은 아래 사이트에 접속하여 <strong>프로젝트에 맞는 .gitignore 파일을 생성</strong> 해준다.
<a href="https://www.toptal.com/developers/gitignore">https://www.toptal.com/developers/gitignore</a></p>
</li>
<li><p>현재 사용중인 개발 환경을 검색하여 추가하고, 생성하면 됨
예시) windows(운영체제), Visual Studio Code(개발환경) 등..
예외) 검색해도 안나오면 없는 것</p>
</li>
<li><p>위 사이트는 자신의 프로젝트 환경에 맞는 git ignore파일을 만들어 줌</p>
</li>
</ul>
<br/>

<h2 id="git-ignore-적용-방법">git ignore 적용 방법</h2>
<p><strong>위 사이트에서 생성된 git ignore를 에디터에 적용하는 방법</strong></p>
<ul>
<li><p>.git이 있는 디렉토리에 .gitignore파일 생성 (=프로젝트 최상위 위치)</p>
</li>
<li><p>.gitignore파일 안에, 위 사이트에서 생성된 내용 복사 붙여넣기</p>
</li>
<li><p>추가로 ignore 하고 싶은 파일 or 폴더가 있는 경우 아래와 같이 작성 후 저장</p>
<pre><code>예를 들어 test.txt파일과 test 폴더를 ignore 한다고 가정했을 때,
무시할 파일 및 폴더는 아래와 같이 작성.
&lt;!--gitignore 파일에서 # 뒤에 쓰는 내용은 주석처리 됨--&gt;
</code></pre></li>
</ul>
<h2 id="파일-무시">파일 무시</h2>
<p>test.txt</p>
<h2 id="다음과-같은-확장자는-전체-무시">다음과 같은 확장자는 전체 무시</h2>
<p>*.text
*.exe
*.zip</p>
<h2 id="폴더-무시">폴더 무시</h2>
<p>test/</p>
<pre><code>- 저장 후, ignore할 파일, 폴더명이 **회색처리**된 것을 확인
- 그리고  add &gt; commit &gt; push

&lt;br/&gt;

## 🚨 이미 git에 올라간 파일,폴더인 경우?
- git의 관리를 받고 있던(commit &amp; push 된 것들) 파일이나 폴더는 .gitignore 파일에 작성하고 add &gt; commit &gt; push 하여도 **ignore(무시) 되지 않음**

- 이런 경우, 기존에 가지고 있는 cache를 제거해야 함</code></pre><h2 id="파일-이라면">파일 이라면</h2>
<p>git rm --cached test.txt</p>
<h2 id="전체파일-이라면">전체파일 이라면</h2>
<p>git rm --cached *.txt</p>
<h2 id="폴더-라면">폴더 라면</h2>
<p>git rm --cached test/ -r</p>
<pre><code>- 다시 말해, 
이미 git에 올라간 파일, 폴더인 경우 위 명령어(캐시 제거)를 먼저 실행하고나서 .gitignore파일을 commit해줘야 ignore됨!

### git rm에 대해 더 알아보자
- `rm`: remove(제거하다)
  - `git rm -r`: 원격 저장소와 로컬의 파일 모두 삭제 
  - `git rm -r --cached`: 원격 저장소에서만 파일이 삭제되고, 로컬의 파일은 그대로 유지 
- `-r`: recursive(재귀적)의 약자. 하위 디렉토리를 포함하여 모든 내용 삭제


&lt;br/&gt;&lt;br/&gt;
[참고]
https://codinglevelup.tistory.com/120
https://okeybox.tistory.com/338
https://kcmschool.com/194
https://webstudynote.tistory.com/114</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230727]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230727</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230727</guid>
            <pubDate>Fri, 28 Jul 2023 05:15:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="💛-일단-만드는-javascript">💛 일단 만드는 JavaScript</h1>
<p><img src="https://velog.velcdn.com/images/chance_777/post/1db07991-33c9-42ed-9bf4-d62336a57d7d/image.png" alt=""></p>
<p>멋사 테킷 강의는 <strong>강의 화면에서 바로 실습</strong>해볼 수 있는 점이 굉장히 신기했고, 자체 미니 브라우저와 콘솔 창을 통해 결과도 바로 확인할 수 있어서 편리했다. </p>
<p><strong>[JS기초 클래스]</strong></p>
<ol>
<li>JavaScript 사용 방법</li>
<li>로또 번호 추첨기</li>
<li>글자수 계산기</li>
<li>기념일 계산기</li>
</ol>
<p><br/><br/></p>
<h2 id="1-javascript-사용-방법">1. JavaScript 사용 방법</h2>
<h3 id="1-1-javascript-적용-방법">1-1. JavaScript 적용 방법</h3>
<ul>
<li>내부 연결(html 파일에 직접 작성)<ul>
<li>body 태그가 끝나는 지점 <strong>바로 위</strong>에 작성하는 경우가 많음<pre><code>&lt;body&gt;
&lt;h1&gt;JavaScript 사용 방법&lt;/h1&gt;
&lt;script&gt;
  document.write(&#39;자바스크립트 연결&#39;) 
  // document.wirte() 웹 문서에 콘텐츠를 출력하는 방법 
&lt;/script&gt;
&lt;/body&gt;
</code></pre></li>
</ul>
</li>
</ul>
<pre><code>
- 외부 연결(js파일 연결)</code></pre><body>
    <h1>JavaScript 사용 방법</h1>
    <script src="myScript.js"></script>
</body>
```

<br/>

<h3 id="1-2-세미콜론과-주석">1-2. 세미콜론(;)과 주석</h3>
<ul>
<li>세미콜론(;) : 하나의 명령어가 끝났다는 의미</li>
<li>주석: 컴퓨터는 읽을 수 없는 글<ul>
<li>용도: 코드 설명을 적어줄 때, 특정 코드를 동작 시키지 않고 싶을 때</li>
<li>사용방법: // 한 줄 주석 , /**/ 여러 줄 주석</li>
</ul>
</li>
</ul>
<br/>

<h3 id="1-3-데이터-상자-만들기">1-3. 데이터 상자 만들기</h3>
<ul>
<li>프로그래밍에서는 데이터 값들을 이름표가 붙은 어떤 상자에 담아서 이게 어떤 의미인지 쉽게 알 수 있도록 해줌 = 변수(variable)<ul>
<li><code>var 변수명 = 값;</code><pre><code class="language-javascript">var name = &#39;홍길동&#39;;
var age = 30;
var eyesight = 1.2;
var single = true;
// 각 데이터 마다 특징이 다른데, 이것을 &#39;자료형&#39; 이라고 함
// 문자열(String) : &quot;홍길동&quot;, &#39;홍길동&#39;
// 숫자(int, float) : 정수형(int) - 30 , 실수형(float) - 1.2
// 불(bool) : true, false (진실인지 거짓인지)
// typeof 를 통해 해당 데이터의 자료형이 무엇인지 확인할 수 있음
(ES6 최신문법)
let 변수명 = 값;
const 변수명 = 값;

</code></pre>
</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h2 id="2-로또-번호-추첨기">2. 로또 번호 추첨기</h2>
<h3 id="2-1-1번45번-공-중에서-6개-뽑기">2-1. 1번~45번 공 중에서 6개 뽑기</h3>
<ul>
<li>공 1개부터 뽑아보자!<ul>
<li>기본- Math.random(); ⇒ 0이상~1미만 실수(float) , 임의의 숫자를 뽑을 수 있음</li>
<li>응용- Math.random() * 45 + 1; ⇒  1이상~45미만 실수(float)</li>
<li>응용2- parseInt(); ⇒ 소수점은 버리고 정수로 변환<br/>

</li>
</ul>
</li>
</ul>
<h3 id="2-2-배열array">2-2. 배열(Array)</h3>
<ul>
<li>로또 번호는 6개의 숫자로 이루어짐(var ball1, var ball2, var ball3..)</li>
<li>만약 수 천개의 변수를 줘야할 때, 코드를 일일이 다 짜기 어렵기 때문에 <strong>배열(Array)</strong>을 사용함</li>
</ul>
<ul>
<li>배열(Array): 마치 서랍장을 사용하는 것 처럼, 하나의 변수 안에 여러 개의 값들을 넣어줄 수 있음<ul>
<li>var lotto = [1,2,3,4,5,6];</li>
<li>불러올 위치의 값은 index라고 하며, index는 <strong>0부터 시작</strong>함</li>
<li>.push() → 배열의 끝 부분에 새로운 요소 추가<br/>

</li>
</ul>
</li>
</ul>
<h3 id="2-3-반복문-for">2-3. 반복문 for</h3>
<ul>
<li>반복되는 문법을 효율적으로 사용<ul>
<li>종류: for, while</li>
</ul>
</li>
</ul>
<pre><code class="language-javascript">// for문 기본 문법
for (시작; 끝; 증가) {
   반복하려는 코드
}

/* i가 0부터 반복하려는 코드를 한번씩 실행할때마다 i가 1씩 증가하게 되고,
계속 코드가 실행되고 증가하고 반복하다가 i가 6이 되면, &#39;끝&#39; 조건이 깨지면서 반복문 종료 */
for (var i = 0; i &lt; 6; 1++) { 
        반복하려는 코드
}

var lotto = [];
for (var i = 0; i &lt; 6; i++) {
    lotto.push(parseInt(Math.random() * 45 + 1));
  }
    document.write(lotto);</code></pre>
<br/>

<h3 id="2-4-조건문-if">2-4. 조건문 if</h3>
<ul>
<li>중복된 값 없애기</li>
<li>조건문 → &#39;만약&#39; lotto num이 중복이 아니라면 .push()</li>
</ul>
<pre><code class="language-javascript">// if 조건문 기본문법
if (조건) {
  참 일 경우
}

//만약 중복이 아니라면 .push()
var lotto = [];
        for (var i = 0; i &lt; 6; i++){
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num)
            }
        }
        document.write(lotto);</code></pre>
<br/>

<h3 id="2-5-반복문-while">2-5. 반복문 While</h3>
<ul>
<li>for 문은 특정 횟수만큼 어떤 코드를 동작시킬 때 사용된다면, while문은 특정 조건까지 코드를 반복하는 조건문</li>
<li><code>.length</code>: 배열의 길이<pre><code class="language-javascript">// while문 기본 문법
while (언제까지 반복할지 조건) {
  반복하려는 코드    
}
</code></pre>
</li>
</ul>
<p>var lotto = [];
        while (lotto.length &lt; 6) {
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num)
            }
        }
        document.write(lotto);</p>
<pre><code>&lt;br/&gt;

### 2-6. 오름차순
- 숫자가 점점 커지는 오름차순을 해보자
```javascript
.sort() //배열 값 정렬

var lotto = [1,2,3,33,22,11];
lotto.sort(); //사전 순으로 정렬되기때문에 결과가 1,11,2,22,3,33 으로 나옴
document.write(lotto);


var lotto = [1,2,3,33,22,11];
.sort((a, b)=&gt;a-b) //숫자 오름차순 정렬 (b-a)는 내림차순
document.write(lotto);


var lotto = [];
        while (lotto.length &lt; 6) {
            var num = parseInt(Math.random() * 45 + 1);
            if (lotto.indexOf(num) == -1) {
                lotto.push(num);
            }
        }
        lotto.sort((a,b)=&gt;a-b); //반복문이 끝나는 지점에 작성
        document.write(lotto);</code></pre><br/>

<h3 id="2-7-로또-번호-추첨기">2-7. 로또 번호 추첨기</h3>
<p>!codepen[CreateSong/embed/bGQQNbV?default-tab=html%2Cresult]</p>
<p><br/><br/></p>
<h2 id="3-글자수-계산기">3. 글자수 계산기</h2>
<p><strong>DOM</strong></p>
<ul>
<li>Document Object Model
-웹 화면을 구성하는 html코드를 쉽게 접근할 수 있도록 만든 모델</li>
<li>자바스크립트는 DOM을 활용하여 화면을 구성하는 모든 것들에 접근할 수 있고, 원하는대로 바꿀 수 있다.</li>
</ul>
<br/>

<h3 id="3-1-document--consolelog">3-1. document. / console.log</h3>
<ul>
<li>document.
-DOM의 진입점 역할을 수행. 화면에 html문서를 가져와서 수정할 수 있음</li>
<li>console.log
-콘솔 화면에 출력됨 (원하는 값이 맞는지 확인하기 위함)</li>
</ul>
<br/>

<h3 id="3-2-문자열의-길이">3-2. 문자열의 길이</h3>
<ul>
<li><code>.length</code>: 문자열의 길이를 나타냄<pre><code class="language-javascript">&lt;h1&gt;자기소개&lt;/h1&gt;
&lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;안녕하세요.&lt;/textarea&gt;
&lt;script&gt;
  var content = document.getElementById(&#39;jasoseol&#39;).value;
  console.log(content.length);
  &lt;/script&gt;</code></pre>
<br/>

</li>
</ul>
<h3 id="3-3-innerhtml">3-3. .innerHTML</h3>
<ul>
<li>자바스크립트 내에서만 숫자를 가지고 있을게 아니라, 우리가 보는 화면에 몇 글자가 있는지 표시할 수 있고, 원하는 위치에 넣어줄 수 있음<pre><code class="language-javascript">&lt;h1&gt;자기소개&lt;/h1&gt;
&lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;안녕하세요.&lt;/textarea&gt;
&lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
&lt;/textarea&gt;
&lt;script&gt;
  var content = document.getElementById(&#39;jasoseol&#39;).value;
  document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
&lt;/script&gt;</code></pre>
<br/>

</li>
</ul>
<h3 id="3-4-function">3-4. function</h3>
<ul>
<li>긴 코드를 여러 번 사용하지 않고, function 함수(명령 모음)를 이용하여 긴 명령어를 여러 번 쓰지 않아도 됨.<pre><code class="language-javascript">// function 기본식
function 함수이름() {
명령어1;
명령어2;
}
</code></pre>
</li>
</ul>
<h1>자기소개</h1>
<textarea class="form-control" rows="3" id="jasoseol">안녕하세요.</textarea>
<span id="count">(0/200)</span>
</textarea>
<script>
    function counter() {
    var content = document.getElementById('jasoseol').value;
    document.getElementById('count').innerHTML = '(' + content.length + '/200)';
    };
    counter();

<pre><code>&lt;/script&gt;</code></pre><pre><code>&lt;br/&gt;

### 3-5. 이벤트 &amp; 이벤트 핸들링
- 글자를 쓸 때마다 자동으로 글자 수를 세려면 어떻게 해야 할까?
  - 키보드를 누를 때 마다 글자 수 세기
- 이벤트: 마우스 클릭, 키보드 누름, 값 변화, 페이지 로딩 등..
- 이벤트 핸들링: 이벤트가 발생하면 &#39;____해라&#39; 라는 의미
- **키보드를 누를 때 마다(이벤트) 글자 수를 세주어라(이벤트 핸들링)**
```javascript
// 기본 문법: 사용할 태그 안에 이벤트=이벤트핸들링 작성
&lt;textarea 이벤트=이벤트핸들링&gt;&lt;/textarea&gt;


&lt;h1&gt;자기소개&lt;/h1&gt;
&lt;textarea onkeydown=&#39;counter()&#39; class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot;&gt;안녕하세요.&lt;/textarea&gt;
&lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
&lt;/textarea&gt;
&lt;script&gt;
    function counter() {
    var content = document.getElementById(&#39;jasoseol&#39;).value;
    document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
    };
    counter();

    &lt;/script&gt;</code></pre><br/>

<h3 id="3-6-substring">3-6. .substring</h3>
<ul>
<li>글자수가 넘었을 때, 더 이상 작성되지 않게 하려면?<ul>
<li>200자 넘으면(~하면 조건문if) 더 이상 안써지도록(200글자 이후는 자르기)</li>
</ul>
</li>
<li>.substring(0, 200) → index 0에서부터 200까지 자른다. (index에는 띄어쓰기도 포함 됨)<pre><code class="language-javascript">&lt;h1&gt;자기소개&lt;/h1&gt;
  &lt;textarea class=&quot;form-control&quot; rows=&quot;3&quot; id=&quot;jasoseol&quot; onkeydown=&quot;counter();&quot;&gt;안녕하세요.&lt;/textarea&gt;
  &lt;span id=&quot;count&quot;&gt;(0/200)&lt;/span&gt;
  &lt;script&gt;
      function counter() {
          var content = document.getElementById(&#39;jasoseol&#39;).value;
          if (content.length &gt; 200) {
             content = content.substring(0,200);
             document.getElementById(&#39;jasoseol&#39;).value = content;
          }
          document.getElementById(&#39;count&#39;).innerHTML = &#39;(&#39; + content.length + &#39;/200)&#39;;
      }
      counter();
  &lt;/script&gt;
</code></pre>
</li>
</ul>
<p>/* 함수 counter선언
변수 content = id jasoseol 안의 값
만약, content가 200글자가 넘어가면
content 안의 글자를 200글자까지 잘라줘
200글자까지 자른 content는 id jasoseol의 content가 될거야</p>
<p>id count에는 content의 입력한 글자수와 200글자 제한 이라는 표시가 나타나게 해줘</p>
<p>counter();
 */</p>
<pre><code>
!codepen[CreateSong/embed/NWEEYeK?default-tab=html%2Cresult]

&lt;br/&gt;&lt;br/&gt;


## 4. 기념일 계산기

**객체(Object) 알아보기**
- 배열(Array)처럼 여러 개의 값을 담는 자료형
![](https://velog.velcdn.com/images/chance_777/post/1a84dbdf-0aeb-4861-8fc4-67209031e07f/image.png)
- 객체로 만들어진 정보가 필요할 때, 객체에 접근해서 그 값을 가져오는 방법?
  - 객체.키;
```javascript
&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;title&gt;객체(Object)&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    &lt;h1&gt;객체(Object)&lt;/h1&gt;
    &lt;script&gt;
        var person = {
            name: &#39;홍길동&#39;,
            age: 20,
            hobby: [&#39;코딩&#39;,&#39;건강식 만들어 먹기&#39;,&#39;예능 보기&#39;],
            sayFighting: function() { console.log(&#39;다이어트 화이팅&#39;); },
        }
        console.log(person.name);
        console.log(person.age);
        console.log(person.hobby[1]);
        person.sayFighting();
    &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre><br/>

<h3 id="4-1-date-객체">4-1. Date 객체</h3>
<ul>
<li>자바스크립트에는 이미 많은 내장 객체가 있으며, Date는 그 중 하나<pre><code class="language-javascript">// var now = new Date();
</code></pre>
</li>
</ul>
<h1>Date 객체</h1>
    <script>
        //1. Date 객체 생성
        var now = new Date();
        //2. 연도를 가져오는 메서드 .getFullYear()
        console.log(now.getFullYear());
        //3. 월 정보를 가져오는 메서드 .getMonth() {0: 1월, 1: 2월, ... 10: 11월, 11: 12월}
        console.log(now.getMonth());
        //4. 일 정보를 가져오는 메서드 .getDate()
        console.log(now.getDate());
        //5. 1970년 1월 1일 00:00:00을 기준으로 흐른 시간을 밀리초로 표시하는 메서드 .getTime()
        console.log(now.getTime());
        //6. 특정 일의 Date 객체 생성
        var christmas = new Date('2023-12-25');
        console.log(christmas);
        //7. 특정 ms의 Date 객체 생성
        var ms = new Date(1000);
        console.log(ms);
    </script>
```
<br/>

<h3 id="4-2-만난-지-0일째">4-2. 만난 지 0일째</h3>
<p><img src="https://velog.velcdn.com/images/chance_777/post/db855fa3-4472-4a21-a777-21c73270d997/image.png" alt=""></p>
<pre><code class="language-javascript">&lt;div class=&#39;container d-flex flex-column justify-content-center align-items-center mt-3&#39;&gt;
        &lt;h3&gt;갑돌♥갑순&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2022.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2022-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);
    &lt;/script&gt;</code></pre>
<br/>

<h3 id="4-3-기념일까지-남은-날짜">4-3. 기념일까지 남은 날짜?</h3>
<p><img src="https://velog.velcdn.com/images/chance_777/post/8a366d1d-5c3a-449f-b11e-68f352e5e0c0/image.png" alt=""></p>
<pre><code class="language-javascript">&lt;h3&gt;갑돌♥갑순&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2022.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;발렌타인 데이&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;valentine&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p class=&#39;date&#39;&gt;2024.2.14&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2022-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);

        var valentine = new Date(&#39;2024-02-14&#39;);

        var timeDiff2 = valentine.getTime() - now.getTime();
        var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;valentine&#39;).text(day2 + &#39;일 남음&#39;);

        console.log(timeDiff2)
    &lt;/script&gt;</code></pre>
<br/>

<h3 id="4-4-1000일은-언제인가">4-4. 1000일은 언제인가?</h3>
<p><img src="https://velog.velcdn.com/images/chance_777/post/874e781e-d316-48c0-b241-9791b72d058b/image.png" alt=""></p>
<pre><code class="language-javascript">&lt;h3&gt;갑돌♥갑순&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2022.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;발렌타인 데이&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;valentine&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p class=&#39;date&#39;&gt;2024.2.14&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;1000일&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;thousand&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p id=&#39;thousand-date&#39; class=&#39;date&#39;&gt;0000.00.00&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2022-06-30&#39;);

        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);

        var valentine = new Date(&#39;2024-02-14&#39;);
        var timeDiff2 = valentine.getTime() - now.getTime();
        var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#valentine&#39;).text(day2 + &#39;일 남음&#39;);

        var ms = start.getTime() + 999 * (1000 * 60 * 60 * 24);
        var thousand = new Date(ms);
        var thousandDate = thousand.getFullYear() + &#39;.&#39; + (thousand.getMonth()+1) + &#39;.&#39; + thousand.getDate();
        $(&#39;#thousand-date&#39;).text(thousandDate);
    &lt;/script&gt;</code></pre>
<hr/>

<h3 id="4-5-기념일-계산기-완성">4-5. 기념일 계산기 완성</h3>
<pre><code class="language-javascript"> &lt;div class=&#39;container d-flex flex-column justify-content-center align-items-center mt-3&#39;&gt;
        &lt;h3&gt;갑돌♥갑순&lt;/h3&gt;
        &lt;h3 id=&#39;love&#39;&gt;0일째&lt;/h3&gt;
        &lt;h4 class=&quot;date&quot;&gt;2022.6.30&lt;/h4&gt;
    &lt;/div&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;발렌타인 데이&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;valentine&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p class=&#39;date&#39;&gt;2024.2.14&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;section class=&#39;special-day&#39;&gt;
        &lt;h3 class=&#39;title&#39;&gt;1000일&lt;/h3&gt;
        &lt;div class=&#39;date-box&#39;&gt;
            &lt;p id=&#39;thousand&#39; class=&#39;days-left&#39;&gt;0일 남음&lt;/p&gt;
            &lt;p id=&#39;thousand-date&#39; class=&#39;date&#39;&gt;0000.00.00&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    &lt;hr/&gt;
    &lt;script
  src=&quot;https://code.jquery.com/jquery-3.5.1.min.js&quot;
  integrity=&quot;sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=&quot;
  crossorigin=&quot;anonymous&quot;&gt;&lt;/script&gt;
    &lt;script&gt;
        var now = new Date();
        var start = new Date(&#39;2022-06-30&#39;);

        //우리 몇 일째?
        var timeDiff = now.getTime() - start.getTime();
        var day = Math.floor(timeDiff / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#love&#39;).text(day + &#39;일째&#39;);

        //기념일까지 남은 날짜는?
        var valentine = new Date(&#39;2024-02-14&#39;);
        var timeDiff2 = valentine.getTime() - now.getTime();
        var day2 = Math.floor(timeDiff2 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#valentine&#39;).text(day2 + &#39;일 남음&#39;);

        //천일은 언제인가?
        var thousand = new Date(start.getTime() + 999 * (1000 * 60 * 60 * 24));
        var thousandDate = thousand.getFullYear() + &#39;.&#39; + (thousand.getMonth()+1) + &#39;.&#39; + thousand.getDate();
        $(&#39;#thousand-date&#39;).text(thousandDate);

        //기념일까지 남은 날짜는?
        var timeDiff3 = thousand.getTime() - now.getTime();
        var day3 = Math.floor(timeDiff3 / (1000 * 60 * 60 * 24) + 1);
        $(&#39;#thousand&#39;).text(day3 + &#39;일 남음&#39;);
    &lt;/script&gt;</code></pre>
<p>!codepen[CreateSong/embed/KKrroYV?default-tab=html%2Cresult]</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230726]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230726</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230726</guid>
            <pubDate>Wed, 26 Jul 2023 11:49:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🌊-tailwind">🌊 Tailwind</h1>
<ul>
<li><span style="color:royalblue">＊utility-first</span> 목적으로 만들어진<span style="color:royalblue">＊CSS 프레임워크</span><ul>
<li>미리 정의된 CSS의 특성들을 class를 통해 불러와 적용시킴</li>
</ul>
</li>
<li>CSS 문서로 가지 않고, 오직 HTML 문서 내에서 웹 사이트 구축이 가능하게 만듦</li>
</ul>
<p><span style="color:gray">＊utility-first란?
 -미리 세팅된 유틸리티 클래스를 활용하여 HTML코드 내에서 CSS를 적용시키는 것</span></p>
<p> <span style="color:gray">＊CSS 프레임워크란?
 -웹 디자인을 빠르고 쉽게 구축할 수 있도록 미리 개발된 완성형 디자인을 가져다 사용할 수 있는 도구 </span></p>
<h2 id="장점">장점</h2>
<ul>
<li>클래스 이름 고민하지 않아도 됨</li>
<li>속도와 생산성 향상</li>
<li>일관성있는 디자인</li>
<li>유지보수 용이성</li>
<li>반응형 디자인</li>
</ul>
<h2 id="단점">단점</h2>
<ul>
<li>HTML 파일 크기 증가</li>
<li>기존 CSS코드와 충돌</li>
</ul>
<br/>

<h1 id="✍🏻-tailwind-실습">✍🏻 Tailwind 실습</h1>
<h2 id="tailwind-span-stylecolorsalmon미적용span---htmlcss">Tailwind <span style="color:salmon">미적용</span> - HTML/CSS</h2>
<p>!codepen[CreateSong/embed/mdQzJym?default-tab=html%2Cresult]</p>
<br/>

<h2 id="tailwind-span-stylecolorroyalblue적용span---html">Tailwind <span style="color:royalblue">적용</span> - HTML</h2>
<p>!codepen[CreateSong/embed/mdQzJym?default-tab=html%2Cresult]</p>
<br/>

<p><strong>[코드 해석]</strong></p>
<pre><code class="language-html">&lt;!-- Tailwind연결 --&gt;
&lt;script src=&quot;https://cdn.tailwindcss.com&quot;&gt;&lt;/script&gt; 

&lt;!-- text-2xl의미: font-size: 1.5rem; /* 24px */line-height: 2rem; /* 32px */ --&gt;
&lt;!-- font-bold의미: font-weight: 700; --&gt;
&lt;h1 class=&quot;text-2xl font-bold&quot;&gt;Hello, World!&lt;/h1&gt; 

&lt;!-- text-red-500의미: color: rgb(239 68 68); --&gt;
&lt;p class=&quot;text-red-500 font-bold&quot;&gt;This is a red bold text.&lt;/p&gt;

&lt;!-- underline의미: text-decoration: underline; --&gt;
&lt;!-- decoration-wavy의미: text-decoration-style: wavy; --&gt;
&lt;p class=&quot;text-blue-700 underline decoration-wavy&quot;&gt;
  This is a wavy underline blue text.&lt;/p&gt;</code></pre>
<p><br/><br/></p>
<blockquote>
<p><strong>[느낀 점]</strong>
html 작성과 동시에 표현하고자 하는 스타일과 디자인 요소를 class에 작성하여 바로 적용할 수 있는 점이 굉장히 편리하게 느껴졌다.
다만, 클래스가 많아진다면 가독성 측면에서는 조금 아쉬울 것 같다는 생각이 든다. 더 사용해보고 경험해보아야 장단점을 확실히 느낄 수 있겠다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230725]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230725</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230725</guid>
            <pubDate>Tue, 25 Jul 2023 09:52:40 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🐱🏍-css-실무-tip">🐱‍🏍 CSS 실무 Tip</h1>
<br/>

<h2 id="1-커스텀-input-select-박스">1. 커스텀 input, select 박스</h2>
<ul>
<li>디자인적인 개성을 주기 위해 실무에서는 input 요소, select 박스를 브라우저 스타일과 다르게 표현함</li>
<li>input, select 박스를 커스텀하는 이유?<ul>
<li>시각적인 디자인 개선</li>
<li>일관성 유지</li>
<li>사용자 경험 개선</li>
<li>접근성 향상</li>
</ul>
</li>
</ul>
<br/>


<h3 id="input-check-박스-커스텀-실습">input check 박스 커스텀 실습</h3>
<ul>
<li>스타일링이 까다로운 input 요소를 화면에서 숨기고, label요소를 연결하여 스타일링</li>
</ul>
<p>!codepen[CreateSong/embed/MWzqrMx?default-tab=html%2Cresult]</p>
<p><br/><br/></p>
<h2 id="2-irimage-replacement-테크닉">2. IR(Image Replacement) 테크닉</h2>
<ul>
<li>디자인적으로 보이진 않지만, <strong>스크린리더나 브라우저를 위해</strong> 정보를 전달하는 텍스트를 html 곳곳에 숨겨두는 방법</li>
<li><code>&lt;img&gt;</code>태그에는 <code>alt=&quot;&quot;</code>속성으로 이미지에 대한 설명이 가능하지만, background-image에는 설명을 줄 수 없기 때문의 별도의 작업 필요</li>
</ul>
<p>!codepen[CreateSong/embed/OJaoQXZ?default-tab=html%2Cresult]</p>
<br/>

<p><strong>[카카오 IR 테크닉 중에서..]</strong></p>
<ul>
<li>중요한 이미지가 off 되었을 때, 대체 텍스트를 보여줌<ul>
<li>사용자의 네트워크가 끊기거나, 이미지가 저장되어있는 서비스가 다운되거나 등등의 이유로, 이미지에 대한 설명을 보여줘야 할 때 대체 텍스트를 보여줌<ul>
<li>예시) daum &#39;검색&#39; 돋보기 이미지를 지우기 해보면 &#39;검색&#39;이라는 텍스트가 나옴<pre><code class="language-css">.ir_wa{
display:block;
overflow:hidden;
position:relative;
z-index:-1;
width:100%;
height:100%
}</code></pre>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<ul>
<li>daum &#39;쇼핑&#39;은 텍스트가 &#39;쇼핑&#39;임에도 불구하고, ir_wa를 사용한 이유?<ul>
<li>background-image로 적용되어있기 때문</li>
<li>텍스트에 똑같은 텍스트 이미지를 적용하는 이유는?</li>
<li>폰트마다 두껍게, 얇게 보이는 경우가 많기 때문에 <strong>일관성</strong>을 위해 이미지로 사용하는 것 (=이미지 폰트)</li>
</ul>
</li>
</ul>
<br/>

<p><strong>숨김처리 관련 참고하면 좋은 자료</strong>
<a href="https://mulder21c.io/screen-hide-text/">https://mulder21c.io/screen-hide-text/</a></p>
<p><br/><br/></p>
<h2 id="3-css-sprite-기법">3. CSS Sprite 기법</h2>
<ul>
<li>여러가지의 이미지를 하나의 이미지 파일 안에 배치하여 이미지 로드 부담을 줄이는 방법</li>
<li>이미지 편집은 온라인 에디터를 사용하거나 직접 에디팅 앱(포토샵, 피그마, 스케치 등)을 사용해 개발자가 직접 편집함<ul>
<li><a href="https://www.toptal.com/developers/css/sprite-generator/">https://www.toptal.com/developers/css/sprite-generator/</a></li>
</ul>
</li>
<li>단점: 이미지 교체 어려움, 이미지가 추가될수록 용량이 무거워짐</li>
<li><code>&lt;img&gt;</code>태그에 쓰이는 이미지들은 sprite 이미지로 쓰이지 않음<ul>
<li>why? 항상 동적으로 바뀌는 이미지이기 때문
<img src="https://velog.velcdn.com/images/chance_777/post/0d72568b-272c-4b11-a835-c7dfaae70822/image.png" alt=""></li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h2 id="4-레티나-디스플레이-대응법">4. 레티나 디스플레이 대응법</h2>
<ul>
<li><strong>레티나</strong>: 특정한 시야 거리에서 인간의 눈으로는 화소를 구분할 수 없는 화소 밀도(300 PPI가 넘을 경우)를 가진 애플의 LCD제품의 브랜드 이름<ul>
<li>PPI(Pixel Per Inch): 1inch에 몇 개의 픽셀이 들어있는가의 비율<ul>
<li>고해상도 디스플레이 기술</li>
</ul>
</li>
<li>더 많은 픽셀을 화면에 표시하여 뚜렷하고 선명한 이미지 제공</li>
</ul>
</li>
</ul>
<p><strong>문제점</strong> (What)
레티나 디스플레이에서 종종 이미지가 흐려져 보이는 경우가 있음</p>
<p><strong>원인</strong> (Why)
레티나 디스플레이로 넘어오면서 논리픽셀(css에서 표현하는 화소의 기본 단위)과 물리픽셀(디바이스가 실제로 처리할 수 있는 화소의 기본 단위)의 차이 발생</p>
<p><strong>해결방법</strong> (How)
원본 이미지의 가로세로 2배 이미지를 하나 더 생성한다.
피그마에서 디자인 이미지를 Export할 때 x2 이미지로 저장</p>
<p>*만약, 저장한 아이콘들을 Sprite로 만들 때는 padding값도 2배를 줘야 함
아이콘의 position값은 절반 줄인 값으로 줘야 제대로 위치해서 나타나게 됨</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230724]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230724</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230724</guid>
            <pubDate>Mon, 24 Jul 2023 16:07:37 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="✍🏻-html--css-실습">✍🏻 HTML &amp; CSS 실습</h1>
<br/>

<p>오늘은 그동안 배웠던 HTML/CSS 학습 내용을 바탕으로 &#39;밴딩머신&#39;을 만드는 실습을 진행하였다.</p>
<p><img src="https://velog.velcdn.com/images/chance_777/post/2aff3f60-75d6-4e26-a31f-5557864b6bf5/image.png" alt=""></p>
<br/>

<h2 id="작업-순서">[작업 순서]</h2>
<h3 id="1-문서-구조화">1. 문서 구조화</h3>
<ul>
<li>피그마 디자인 파일을 참고하여, 전체적인 &#39;문서 영역 나누기&#39; = HTML 문서 구조화</li>
<li>큰 영역부터 구조화하고 그 다음 세부 영역 짜기
<img src="https://velog.velcdn.com/images/chance_777/post/630bb3ca-ecbf-4991-b64d-0be360930498/image.jpg" alt=""></li>
</ul>
<br/>


<h3 id="2-html-작성">2. HTML 작성</h3>
<ul>
<li>&#39;문서 영역 나누기&#39; 참고하여, HTML파일 작성하기</li>
<li><span style="color:royalblue">*중요: 반응형 디자인, 브라우저 호환성, 사용자 경험(UX), 웹 접근성 등을 고려하여 작성할 것<ul>
<li>기획, 디자인 의도를 정확히 파악하는 것이 중요하기 때문에 디자이너와 원활한 커뮤니케이션과 협업은 굉장히 중요함! </span> 
<img src="https://velog.velcdn.com/images/chance_777/post/565a0d5d-6c7d-4903-bf46-befff8d59236/image.jpg" alt=""></li>
</ul>
</li>
</ul>
<br/>

<h3 id="3-css-초기화">3. CSS 초기화</h3>
<ul>
<li>브라우저의 기본 스타일을 초기화하여 일관성 있게 만들기 위함</li>
<li>작성한 HTML문서 안에 있는 요소만 초기화 해도 되지만, <code>normalize.css</code> (CSS 리셋 라이브러리)를 사용하기도 함<ul>
<li><a href="https://necolas.github.io/normalize.css/">https://necolas.github.io/normalize.css/</a></li>
</ul>
</li>
<li>바로 CSS파일에 적용할 수 있는 에릭 마이어의 reset CSS<ul>
<li><a href="https://meyerweb.com/eric/tools/css/reset/">https://meyerweb.com/eric/tools/css/reset/</a>
<img src="https://velog.velcdn.com/images/chance_777/post/846344b7-4f7c-4381-a490-a453289f0bdd/image.png" alt=""></li>
</ul>
</li>
</ul>
<br/>

<h3 id="4-html구조-순서대로-작업">4. HTML구조 순서대로 작업</h3>
<ul>
<li>웹 페이지 최상단 부터 순서대로 작업 진행</li>
<li>예시) 밴딩머신 실습<ul>
<li>로고 이미지 삽입 및 위치 조정</li>
<li>메인 section 레이아웃 나누기</li>
<li>section1부터 차례대로 작업하기</li>
</ul>
</li>
<li><span style="color:royalblue">*중요: 반복되는 항목 파악 (button, list, box 등..)<ul>
<li>반복 항목에는 공통된 class값을 작성하여 재사용성, 유지보수 등 효율적인 관리가 가능하다.</span></li>
</ul>
</li>
</ul>
<br/>

<h3 id="html--css-마크업-검사-습관화-하기">HTML / CSS 마크업 검사 습관화 하기!</h3>
<ul>
<li>HTML 마크업 검사
<a href="https://validator.w3.org/">https://validator.w3.org/</a></li>
<li>CSS 마크업 검사
<a href="https://jigsaw.w3.org/css-validator/">https://jigsaw.w3.org/css-validator/</a></li>
</ul>
<p><br/><br/></p>
<blockquote>
<p><strong>[소감 및 느낀점]</strong> 
처음에는 어디서부터 어떻게 손을 대야하나..막막하기만 했다.
강의 중간중간 과제, 실습을 통해서 계속 시도해보고, 따라해보고, 구조화 연습을 하다보니 이제 조금씩 구조가 보이는 것 같다. 
<span style="color:royalblue"><em><strong>&quot;아는 만큼 보인다.&quot;</strong></em></span>
요즘 개발 공부하면서 뼈저리게 느끼는 점이다. 아는 만큼 보인다...
아직은 실눈 뜬 것 마냥 넓게 보이진 않지만, 언젠가 큰 눈을 뜨고 많은 것을 볼 수 있는 그날까지 <strong>꾸준히</strong> 학습하고 연습해서 시야를 넓혀가야겠다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] CSS 가운데(중앙) 정렬 방법 복습]]></title>
            <link>https://velog.io/@chance_777/likelion-fes7-study-230723</link>
            <guid>https://velog.io/@chance_777/likelion-fes7-study-230723</guid>
            <pubDate>Sun, 23 Jul 2023 11:05:11 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>헷갈리거나 이해가 잘 안되었던 부분 복습하기!!</p>
</blockquote>
<p><strong>[들어가기 전..]</strong>
멋쟁이사자처럼 FE스쿨 과정 3주 동안 HTML/CSS 과정에 대해 학습하였다.
체득화 해야 할 속성들이 굉장히 많지만, 그 중에서 오늘은 CSS 속성을 활용해 <strong>컨텐츠를 가운데(중앙)정렬</strong>하는 방법에 대해 복습하고자 한다.</p>
<p>CSS에서 컨텐츠를 정렬하는 방법은 굉장히 다양하다.
그렇다면 다양한 방법마다 &quot;주로 어디에 쓰일까?&quot; 하는 관점으로 복습을 시작해보고자 한다.</p>
<br/>

<h1 id="css-가운데-정렬-방법">CSS 가운데 정렬 방법</h1>
<h2 id="1-text-align">1. text-align</h2>
<ul>
<li><code>text-align: center;</code><ul>
<li>텍스트 중앙 정렬</li>
<li>Element 안의 구성요소가 텍스트, inline 또는 inline계열일 때 <strong>수평 방향</strong>으로 가운데 정렬하는 방법</li>
<li><span style="color:royalblue">주로 블록 요소 또는 테이블 셀 상자 내부의 텍스트 가운데 정렬</span>
!codepen[CreateSong/embed/rNQrKKW?default-tab=html%2Cresult]</li>
</ul>
</li>
</ul>
<br/>

<h2 id="2-vertical-align">2. vertical-align</h2>
<ul>
<li>인라인, 인라인 블록 및 테이블 셀 요소의 <strong>수직 정렬</strong>(블록 요소X)</li>
<li>단, 같은 줄에 인라인 요소가 없으면 해당 속성 적용안됨(상대 적용)</li>
<li><span style="color:royalblue">주로 테이블 셀이나 이미지와 같은 인라인 레벨 요소의 정렬에 사용</span><h2 id="3-line-height">3. line-height</h2>
</li>
<li>높이 값을 설정하여 요소를 <strong>수직 가운데</strong>로 정렬</li>
<li>부모 요소의 높이값과 동일한 높이값을 줘야 수직 가운데로 위치하게 됨</li>
<li><span style="color:salmon">line-height 값은 폰트 사이즈를 포함해서 leading이 차지하는 부분이 합쳐진 총 폰트의 높이</span></li>
<li><span style="color:royalblue">주로 한 줄의 텍스트가 있는 블록 레벨 요소를 정렬할 때 사용</span></li>
</ul>
<h2 id="4-margin-auto">4. margin: auto;</h2>
<ul>
<li>블록 레벨 요소를 <strong>수평 가운데</strong>로 정렬</li>
<li>부모 요소의 너비를 지정해야 동작함</li>
<li><span style="color:royalblue">주로 메인 콘텐츠 컨테이너를 수평 중앙에 둘 때 사용</span>
!codepen[CreateSong/embed/bGQjjGN?default-tab=html%2Cresult]</li>
</ul>
<br/>

<h2 id="5-position--transform">5. position &amp; transform</h2>
<ul>
<li><code>position: absolute;</code>는 부모 엘리먼트의 위치를 기준으로 절대적인 위치 값을 설정할 수 있다.<ul>
<li>left와 top을 50%로 설정해 중앙에 정렬</li>
<li>하지만, position 값만 주게되면 정중앙에 정렬되지 않음</li>
<li><code>transform: translate(-50%,-50%);</code>까지 설정해서 정중앙에 위치</li>
</ul>
</li>
<li><code>transform</code>은 대상의 형태를 변형하는 명령어로, translate는 위치를 조정하는데 사용함<ul>
<li>translate의 첫 번째 값과 두 번째 값은 각각 x축, y축</li>
<li>-50%라는 값은 대상 요소(h1)의 크기의 <strong>절반(50%)만큼을 빼서(-) 이동</strong>하라는 의미</li>
</ul>
</li>
<li><span style="color:royalblue">다양한 상황에서 유용하게 사용되며, 절대 위치를 이용하여 요소를 가운데로 정렬할 때 많이 활용됨</span><ul>
<li>모달 박스 / 팝업 창</li>
<li>로딩 스피너</li>
<li>배경 이미지 가운데 정렬
!codepen[CreateSong/embed/poQZZqd?default-tab=html%2Cresult]</li>
</ul>
</li>
</ul>
<br/>


<h2 id="6flex">6.flex</h2>
<ul>
<li><code>display: flex;</code>를 사용하면 중앙 정렬을 간편하게 할 수 있음</li>
<li>장점: <code>position:absolute;</code>를 쓰기 어려운 환경에 사용하기 적절함</li>
<li><span style="color:royalblue"><code>div</code>안에 텍스트를 정중앙에 위치시키거나, 버튼의 이미지를 정중앙에 위치시킬 때 등 절대 위치를 적용하기 힘든 모든 상황에 적절하게 사용 가능</span>
!codepen[CreateSong/embed/bGQjmKy?default-tab=html%2Cresult]</li>
</ul>
<br/>

<blockquote>
<p><strong>🤔 이렇게는 안될까?</strong></p>
</blockquote>
<ul>
<li>text-align과 flex를 이용해서 텍스트를 box 정중앙에 위치시키기?!</li>
</ul>
<ol>
<li>우선, 부모 요소에 <code>display: flex;</code>를 준다.</li>
<li>자식 요소에 <code>text-align: center;</code> (수평 중앙 정렬) 해주고, <code>display: flex;</code>, <code>align-items: center;</code>(수직 중앙 정렬) 해준다.
그렇게 나의 호기심이 불러온 실험 결과는..?? 적용 안 됨❌❌❌</li>
</ol>
<blockquote>
<p><strong>🤷🏻‍♀️ Why???</strong>
<code>text-align</code>과 flexbox의 <code>align-items</code> 속성을 같이 사용하여 가운데 정렬하려고 하면, <strong>두 속성의 역할과 적용 대상을 혼동</strong>할 수 있다. 이 두 속성은 서로 다른 방향으로 요소들을 정렬하는데 사용되며, 한 속성의 영향을 다른 속성이 덮어쓸 수 있다.</p>
</blockquote>
<ul>
<li>위와 같은 이유로 박스 안에 있는 text를 수평, 수직 정중앙에 위치하고 싶다면<ul>
<li>자식 요소에도 동일하게 <code>display: flex;</code> <code>justify-content: center;</code> <code>align-items: center;</code> 을 사용하거나,</li>
<li><code>text-align: center;</code> <code>line-height: 부모 height 동일하게</code>를 사용하면 된다.</li>
</ul>
</li>
</ul>
<br/>

<h2 id="7-grid">7. grid</h2>
<ul>
<li><code>place-content: center;</code>를 사용하여 수직,수평 가운데 정렬<ul>
<li>이 속성은 <code>align-content</code>와 <code>justify-content</code>를 함께 설정하는 단축 속성으로, 수평 및 수직 가운데로 정렬됨</li>
</ul>
</li>
<li><span style="color:royalblue">그리드 아이템을 가운데로 정렬하거나, 이미지 또는 콘텐츠를 가운데로 정렬할 때, 반응형 디자인에서 요소들을 가운데로 정렬할 때 많이 사용함</span>
!codepen[CreateSong/embed/dyQjQza?default-tab=html%2Cresult]</li>
</ul>
<p>CSS 중앙 정렬 참고: <a href="https://brunch.co.kr/@skykamja24/514">https://brunch.co.kr/@skykamja24/514</a>
<br/></p>
<h1 id="가운데-정렬-복습을-마치며">[가운데 정렬 복습을 마치며...]</h1>
<p>복습을 하기 전에는 &quot;가운데 정렬 방법이 엄청 다양하네..😵뭐뭐 있었더라..?&quot; 하면서 가장 기억하기 쉬웠던 <code>margin: auto;</code>만 열심히 적용했었다..
<code>margin: auto;</code>가 적용이 안될 때는 구글링, 챗gpt의 도움을 받곤 했다. 이번 복습을 통해서 가운데 정렬 방법의 종류에 대해 조금 더 명확히 알 수 있었고, 앞으로는 상황에 맞는 가운데 정렬 방법을 사용할 수 있도록 업그레이드 해야겠다!</p>
<blockquote>
<p><strong>[복습 소감 요약]</strong>
복습 전: &quot;가운데 정렬...<code>margin: auto</code>....&quot;
복습 후: &quot;가운데 정렬에는 이런 방법들이 있구나! 다양하게 적용해보자!&quot;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230721]]></title>
            <link>https://velog.io/@chance_777/like-lion-fes7-study-230721</link>
            <guid>https://velog.io/@chance_777/like-lion-fes7-study-230721</guid>
            <pubDate>Fri, 21 Jul 2023 13:55:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="👨🏻🏫-웹-접근성-특강">👨🏻‍🏫 웹 접근성 특강</h1>
<ul>
<li>웹 접근성 특강 강사님<ul>
<li>김혜일 님</li>
<li>카카오 디지털 접근성 책임자(Digital Accessibility Officer, DAO)</li>
</ul>
</li>
</ul>
<br/>

<h2 id="웹-접근성의-중요성">웹 접근성의 중요성</h2>
<ul>
<li>접근성을 고려하지 않으면 <strong>누군가는 소외</strong>될 수 있다.</li>
<li>우리가 기대하는 <strong>즐거운 경험</strong>을 누군가는 놓칠 수 있다.</li>
<li>접근성이 없다면, <strong>장애가 없어도 장애가 있는 삶</strong>이 될 것이다.</li>
<li>우리는 더 많은 사람들이 다양한 컨텐츠를 즐겁게 누릴 수 있도록,</li>
<li><em>웹 접근성*</em>을 당연히 알고 있어야 한다.</li>
</ul>
<br/>

<h2 id="디지털--no-접근성">디지털 &amp; NO 접근성</h2>
<ol>
<li>사회에 참여하는 것을 저해</li>
<li>자기결정권의 침해<ul>
<li>일상생활 - 식당, 교통, 금융, 의료, 공공서비스, 택배, 안내 등..</li>
<li>비장애인: 자아 → 독립적 행동 → 목표달성</li>
<li>장애인: 자아 → <strong>보조인</strong> → 목표달성 (본인과 보조인 사이에 노이즈 발생)</li>
</ul>
</li>
</ol>
<br/>

<h2 id="접근성---대체alternavtive">접근성 - 대체(Alternavtive)</h2>
<ul>
<li>시각 어려움 - 듣는 콘텐츠</li>
<li>신체 어려움 - 쉬운 조작</li>
<li>청각 어려움 - 보는 콘텐츠</li>
</ul>
<br/>

<h2 id="시각-어려움---듣는-콘텐츠">시각 어려움 - 듣는 콘텐츠</h2>
<h3 id="화면-낭독-프로그램---스크린-리더">[화면 낭독 프로그램] - 스크린 리더</h3>
<ul>
<li>모바일 기기의 IT 보조기술 (Assistive Technology)</li>
<li>iOS<ul>
<li>iPhone, iPad, Mac</li>
<li>설정 → 손쉬운 사용 → VoiceOver</li>
<li>세 손가락으로 위/아래 쓸기(목록 스크롤), 좌/우 쓸기 (페이지 전환)</li>
</ul>
</li>
<li>Android<ul>
<li>Samsung Galaxy</li>
<li>설정 → 접근성 → Talkback</li>
<li>설정 → 접근성 → 스크린 리더 → 보이스</li>
<li>한 손가락 한 번 탭: 포커스 접근</li>
<li>한 손가락 좌/우 쓸기: 이전/다음 초점 이동</li>
<li>한 손가락 두 번 탭: 포커스 된 콘텐츠 실행</li>
<li>화면 낭독 프로그램 종류<ul>
<li>센스리더 (국내 점유율 90%이상)</li>
<li>NVDA (무료)</li>
<li>JAWS (세계적으로 점유율 높음)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="초점">[초점]</h3>
<ul>
<li>초점 이동 크기와 순서도 굉장히 중요함(논리적 순서)<h3 id="보이지-않는-텍스트-넣을-때-주의">[보이지 않는 텍스트 넣을 때 주의]</h3>
</li>
<li><code>visibility: hidden;</code> <code>display:none;</code><ul>
<li>VoiceOver, Talkback 모두 읽어지지 않음</li>
</ul>
</li>
<li><code>text-indent: -999px;</code><ul>
<li>실제 콘텐츠와 다른 위치에 초점이 접근됨</li>
</ul>
</li>
<li><code>position:absolute;</code><ul>
<li>부모 요소의 블록에 따라 초점이 상단으로 튀는 현상 발생</li>
</ul>
</li>
<li><code>font-size: 0;</code><ul>
<li>VoiceOver의 초점이 접근되지 않음<h3 id="자동-재생-금지">[자동 재생 금지]</h3>
</li>
</ul>
</li>
<li>사용자가 손 쉽게 멈춤, 일시정지, 음량 조절 등과 같이 제어할 수 있는 수단 제공</li>
<li>단, 3초 미만의 배경음은 예외 인정<h3 id="명확한-지시사항-제공">[명확한 지시사항 제공]</h3>
</li>
<li>지시사항은 모양,크기,위치,방향,색 등에 관계없이 인식할 수 있어야 함<ul>
<li>ex) 파란색 글씨를 입력하세요, 빨간 버튼을 클릭하세요 등..</li>
</ul>
</li>
<li>대명사 보다 고유명사 사용<h3 id="사용자-요구에-따른-실행">[사용자 요구에 따른 실행]</h3>
</li>
<li>라이브러리 aria-live 주의<ul>
<li>배너 자동 롤링 + aria-live=&quot;polite&quot; = 배너를 계속 읽어주며, 무한 음성 출력됨<h3 id="표의-구성---행과-열의-제목">[표의 구성 - 행과 열의 제목]</h3>
</li>
</ul>
</li>
<li>th scope 사용하기<h3 id="명도-대비">[명도 대비]</h3>
</li>
<li>텍스트 콘텐츠의 명도 대비 - W3C 기준 참고</li>
<li>비텍스트 콘텐츠의 명도 대비 - W3C 기준 참고</li>
</ul>
<br/>

<h2 id="gaad-세계-접근성-인식의-날">GAAD (세계 접근성 인식의 날)</h2>
<ul>
<li>Global Accessibility Awareness Day (5월 셋째주 목요일)</li>
<li>유명 기업들의 웹 접근성 발표를 볼 수 있음</li>
<li>세계적으로 어떤 컨퍼런스와 움직임이 있는지 참고</li>
</ul>
<p><br/><br/></p>
<blockquote>
<h1 id="span-stylecolorroyalblue나의-코드-한-줄이-한-사람의-일상생활을-바꿀-수-있다span"><span style="color:royalblue">나의 코드 한 줄이 한 사람의 일상생활을 바꿀 수 있다.</span></h1>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230720]]></title>
            <link>https://velog.io/@chance_777/likelionfes7study230720</link>
            <guid>https://velog.io/@chance_777/likelionfes7study230720</guid>
            <pubDate>Thu, 20 Jul 2023 14:06:28 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="📲-반응형-이미지">📲 반응형 이미지</h1>
<ul>
<li>웹페이지는 다양한 디바이스 환경을 고려해 적절한 이미지를 제공해야 함</li>
<li>네트워크, 메모리, 성능 등을 고려한 다양한 크기의 이미지<ul>
<li>해상도 전환 문제</li>
</ul>
</li>
<li>화면 크기, 방향 등을 고려한 다양한 레이아웃 이미지<ul>
<li>아트 디렉션 문제</li>
</ul>
</li>
</ul>
<br/>

<h2 id="해상도-전환">해상도 전환</h2>
<ul>
<li><p>크기만 다른 동일한 컨텐츠의 이미지를 보여주고 싶을 때 사용</p>
<ul>
<li>큰 이미지가 필요없는 좁은 화면에서 더 작은 이미지를 제공하고 싶을 때</li>
<li>선택적으로 다양한 해상도의 이미지를 고/저밀도 화면에 제공하고 싶을 때</li>
</ul>
</li>
</ul>
<h3 id="벡터-그래픽-이미지-사용svg">벡터 그래픽 이미지 사용(SVG)</h3>
<ul>
<li>벡터 이미지는 용량도 작고 확대해도 깨지지 않는 장점이 있으나, 그래픽이 복잡해지면 용량이 늘어나게 됨. 보통 간단한 그래픽, 패턴, 인터페이스 요소 등에 적합함</li>
</ul>
<h3 id="img요소에-srcset과sizes속성-이용하기"><code>&lt;img&gt;</code>요소에 <code>srcset</code>과<code>sizes</code>속성 이용하기</h3>
<ul>
<li><code>srcset</code>: 브라우저에게 이미지 선택권을 <strong>위임</strong>하는 속성</li>
<li><code>sizes</code>: 이미지가 차지하게 될 사이즈를 <strong>브라우저에게 알려주는</strong> 속성</li>
</ul>
<br/>

<h2 id="아트-디렉션">아트 디렉션</h2>
<ul>
<li><p>연출 방향, 중요한 부분을 자른 이미지를 보여줌</p>
</li>
<li><p>이미지의 의도가 제대로 전달되도록 기기에 따라 <strong>사진의 핵심을 확대</strong>해서 보여주는 형태의 방법</p>
<h3 id="picture-요소-사용하기"><code>&lt;picture&gt;</code> 요소 사용하기</h3>
</li>
<li><p><code>&lt;source&gt;</code></p>
<ul>
<li>브라우저가 고를 수 있는 소스 제공</li>
</ul>
</li>
<li><p><code>&lt;img&gt;</code></p>
<ul>
<li>src, alt 속성 포함하여 필수적으로 넣어줘야 함</li>
<li><code>&lt;source&gt;</code>요소 중 사용가능한 이미지가 없을 경우 해당 이미지로 적용</li>
</ul>
</li>
</ul>
<p><br/><br/></p>
<h1 id="🎲-3d-관련-속성">🎲 3D 관련 속성</h1>
<br/>

<h2 id="perspective">perspective</h2>
<ul>
<li>3D 위치 요소에 <strong>원근감</strong>을 주기 위해 평면과 사용자 사이의 거리를 결정</li>
<li>값이 클수록 변형이 작고, 값이 작을수록 변형이 커짐</li>
<li>해당 속성은 부모에게 사용하고, 적용 범위는 직계 자식만 가능(자손 적용X)</li>
<li>음수값 사용 불가<br/>

</li>
</ul>
<h2 id="perspective-origin">perspective-origin</h2>
<ul>
<li>소실점(기본값: 정 중앙)</li>
<li>사용자가 보고 있는 위치(x,y) 결정</li>
<li>해당 속성은 부모에게 사용</li>
</ul>
<br/>

<h2 id="transform">transform</h2>
<ul>
<li>요소에 2D 또는 3D 변형 적용</li>
</ul>
<h3 id="3d-변형과-관련된-method">3D 변형과 관련된 method</h3>
<ul>
<li>메소드를 사용하려면 원근감을 표현할 기준을 명시해야 함</li>
<li><code>perspective()</code>필수<h4 id="translatezz">translateZ(z)</h4>
</li>
<li>z축 거리만큼 이동<h4 id="rotatezz">rotateZ(z)</h4>
</li>
<li>z축 기준으로 회전</li>
<li>rotate()와 동일<h4 id="scalezz">scaleZ(z)</h4>
</li>
<li>z축 기준으로 크기를 배율 증감<h4 id="translate3dxyz">translate3d(x,y,z)</h4>
</li>
<li>현재의 위치에서 주어진 x축,y축,z축의 거리만큼 이동<h4 id="rotate3dxyzangle">rotate3d(x,y,z,angle)</h4>
</li>
<li>주어진 각도만큼 x축,y축,z축을 기준으로 회전<h4 id="scale3dxyz">scale3d(x,y,z)</h4>
</li>
<li>크기를 주어진 배율만큼 x축,y축,z축 방향으로 늘리거나 줄임<br/>

</li>
</ul>
<h2 id="transform-style">transform-style</h2>
<ul>
<li>요소에 변형 적용 시, 자식요소에게 적용 여부 설정</li>
<li><code>flat</code>: 평면에 배치(기본값)</li>
<li><code>preserve-3d</code>: 3D 공간에 배치<br/>

</li>
</ul>
<h2 id="backface-visibility">backface-visibility</h2>
<ul>
<li>요소의 <strong>뒷면</strong>이 사용자를 향할 때 보이게 할지 설정</li>
<li>3D 공간에서는 회전되면 노출 될 수 있음</li>
<li><code>visible</code>: 뒷면 보임(기본값)</li>
<li><code>hidden</code>: 뒷면 보이지 않음</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230719]]></title>
            <link>https://velog.io/@chance_777/likelionfes7study0719</link>
            <guid>https://velog.io/@chance_777/likelionfes7study0719</guid>
            <pubDate>Wed, 19 Jul 2023 14:06:35 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="📝-양식form">📝 양식(form)</h1>
<ul>
<li>사용자에게 입력받은 데이터를 제출, 전송하기 위해 사용하는 태그</li>
</ul>
<br/>


<h2 id="method-속성">method 속성</h2>
<ul>
<li>입력받은 데이터를 서버에 전달할 방식(HTTP 메서드)</li>
</ul>
<h3 id="post">POST</h3>
<ul>
<li>HTTP 요청 본문 내부에 양식 데이터 전송 (URL에 표시 안 됨)</li>
<li>데이터의 길이 제한이 없으며, GET보다 보안성이 높음</li>
<li>브라우저에 의해 캐시되지 않고, 브라우저 히스토리에도 남지 않음<h3 id="get">GET</h3>
</li>
<li>양식 데이터를 action URL과 ?구분자 뒤에 이어 붙여 전송</li>
<li>브라우저에 의해 캐시되어 저장</li>
<li>URL 길이의 제한이 있음(브라우저마다 다름. 약 3000자)</li>
<li>보안상 취약점이 존재하므로, 중요한 데이터는 POST 방식 사용</li>
</ul>
<br/>

<table>
<thead>
<tr>
<th align="left"></th>
<th align="left">POST</th>
<th align="left">GET</th>
</tr>
</thead>
<tbody><tr>
<td align="left">전송</td>
<td align="left">양식 데이터를 요청 본문으로 전송</td>
<td align="left"><code>https://example.com?name=홍길동&amp;age=20</code></td>
</tr>
<tr>
<td align="left">캐시</td>
<td align="left">X</td>
<td align="left">O</td>
</tr>
<tr>
<td align="left">길이제한</td>
<td align="left">X</td>
<td align="left">O</td>
</tr>
<tr>
<td align="left">보안</td>
<td align="left">GET 방식보다 높음</td>
<td align="left">취약</td>
</tr>
</tbody></table>
<h3 id="namevalue">name/value</h3>
<ul>
<li>이름/값(name/value)의 짝으로 양식과 함께 전송</li>
</ul>
<br/>

<h2 id="action-속성">action 속성</h2>
<ul>
<li>양식 데이터를 처리할 프로그램의 <strong>목적지 URL</strong> 지정</li>
</ul>
<h2 id="autocomplete-속성">autocomplete 속성</h2>
<ul>
<li>이전에 해당 양식의 입력된 값이 있을 경우 <strong>자동완성</strong> 지정<ul>
<li>브라우저에 기록이 남아있을 경우 나타남</li>
</ul>
</li>
</ul>
<br/>


<h2 id="input">input</h2>
<ul>
<li>다양한 form에서 사용자가 입력한 정보를 받을 때 사용</li>
<li><code>input type=&quot; &quot;&gt;</code></li>
</ul>
<h3 id="공통-속성">공통 속성</h3>
<p><code>type</code>: input 양식 컨트롤 유형(button, text, email..)
<code>name</code>: input 양식 컨트롤의 이름
<code>value</code>: input 양식 컨트롤의 값
<code>autocomplete</code>: on/off 양식 자동완성 기능에 대한 힌트
<code>placeholder</code>: 양식 컨트롤이 비어있을 때 나타나는 내용(입력 힌트 제공)
<code>required</code>: 양식 전송을 위해 필수로 입력해야하는 값
<code>disabled</code>: 비활성화
<code>readonly</code>: 수정불가(읽기전용)</p>
<h3 id="button-reset-submit">button, reset, submit</h3>
<ul>
<li><code>&lt;button type=&quot; &quot;&gt;</code>태그와 동일한 기능 수행</li>
</ul>
<h3 id="text--password--url--search--tel">text / password / url / search / tel</h3>
<ul>
<li><code>maxlength</code>: 문자수 최대 길이</li>
<li><code>minlength</code>: 문자수 최소 길이</li>
</ul>
<h3 id="checkbox--radio">checkbox / radio</h3>
<ul>
<li><code>checkbox</code>: 2개 이상 항목 선택 가능</li>
<li><code>radio</code>: 1개 항목만 선택 가능</li>
<li><code>checked</code>: 체크 여부</li>
</ul>
<h3 id="file">file</h3>
<ul>
<li>파일 지정</li>
<li><code>accept</code>: 허용하는 파일 유형 지정</li>
<li><code>multiple</code>: 사용자가 여러 개의 파일을 선택할 수 있음</li>
</ul>
<h3 id="number">number</h3>
<ul>
<li>숫자 입력 (화살표 컨트롤 제공)</li>
<li><code>max</code>: 최대값</li>
<li><code>min</code>: 최소값</li>
<li><code>step</code>: 증가값</li>
</ul>
<br/>

<h2 id="label">label</h2>
<ul>
<li>입력란 가까이에 &#39;아이디&#39;나 &#39;비밀번호&#39;처럼 붙여 놓은 텍스트</li>
<li><code>input</code>태그와 같은 form요소에 레이블을 붙일 때 사용<ul>
<li><code>input</code>과 함께 사용해야 서로 연결되었다는 것을 웹브라우저가 알게 됨</li>
<li>스크린 리더기에서 입력해야하는 내용이 무엇인지 사용자가 쉽게 이해할 수 있음</li>
</ul>
</li>
</ul>
<p><strong>for-id를 이용한 연결</strong></p>
<pre><code class="language-html">&lt;label for=&quot;user-id&quot;&gt;아이디&lt;/label&gt;
&lt;input id=&quot;user-id&quot; type=&quot;text&quot;&gt;</code></pre>
<p><strong>label 안에 input 중첩하여 연결</strong></p>
<pre><code class="language-html">&lt;label&gt;
    아이디
    &lt;input type=&quot;text&quot;&gt;
&lt;/label&gt;</code></pre>
<br/>

<h2 id="select">select</h2>
<ul>
<li>옵션 메뉴 제공</li>
<li><code>multiple</code>: 여러개의 항목을 동시에 선택</li>
<li><code>size</code>: 한번에 노출되는 항목의 수 조절</li>
<li><code>required</code>: 선택 필수</li>
<li><code>disabled</code>: 선택 불가<h3 id="option">option</h3>
</li>
<li>메뉴의 각 옵션 정의</li>
<li>모든 <code>option</code>은 자신이 선택되었을 때 값으로 사용할 value 속성이 필요<ul>
<li>지정하지 않으면 option 내 텍스트 값을 사용함</li>
</ul>
</li>
<li>selected 특성을 지정하면 해당 옵션을 선택한 상태로 페이지를 불러옴<h3 id="optgroup">optgroup</h3>
</li>
<li><code>option</code>요소를 <code>optgroup</code>요소 안에 배치하면 드롭다운 내에서 옵션그룹 생성</li>
</ul>
<br/>

<h2 id="fieldset">fieldset</h2>
<ul>
<li>form 관련 요소들을 묶을 때 사용</li>
<li><code>disabled</code>를 사용하면 모든 자손 컨트롤을 비활성화<h3 id="legend">legend</h3>
</li>
<li>그룹의 제목 제공</li>
</ul>
<br/>

<h2 id="datalist">datalist</h2>
<ul>
<li>사용자가 고를 수 있거나, 혹은 추천하는 선택지를 나타내는 option요소를 담음</li>
<li>input과 select 기능을 합친 개념</li>
<li>사용자에게 기본적으로 선택할 수 있는 옵션을 제공하고, 원하는 값이 없을 경우 다른 값을 입력할 수 있도록 함<br/>

</li>
</ul>
<h2 id="textarea">textarea</h2>
<ul>
<li>여러 줄의 text를 입력받을 수 있음<h3 id="text-속성">text 속성</h3>
</li>
<li><code>cols</code>: 입력창의 너비. 문자의 평균적인 넓이를 기준</li>
<li><code>rows</code>: 기본적으로 보여줄 입력 줄 수</li>
<li><code>maxlength</code>: 사용자가 입력할 수 있는 문자 최대 길이</li>
<li><code>minlength</code>: 사용자가 입력해야 할 문자 최소 길이</li>
<li><code>placeholder</code>: 컨트롤에 무엇을 입력해야하는지 알려주는 힌트</li>
</ul>
<br/>

<h1 id="📝-form-동적-가상-선택자">📝 form 동적 가상 선택자</h1>
<h2 id="enabled-disabled">:enabled, :disabled</h2>
<ul>
<li>활성화 / 비활성화 상태<h2 id="read-only-read-write">:read-only, :read-write</h2>
</li>
<li>사용자가 편집할 수 없는/있는 상태<h2 id="checked">:checked</h2>
</li>
<li>input <code>checkbox</code>, <code>radio</code> 유형일 때 선택된 상태를 나타냄<h2 id="required">:required</h2>
</li>
<li>필수 입력값일 경우<h2 id="placeholder-가상-요소">::placeholder (가상 요소)</h2>
</li>
<li>입력에 대한 추가 정보가 있을 경우</li>
</ul>
<p><br/><br/></p>
<h1 id="📱-미디어쿼리-media">📱 미디어쿼리 @media</h1>
<ul>
<li>반응형 작업 할 때 사용</li>
<li>PC, 스마트폰, 태블릿PC 등 다양한 디바이스에 따라 viewport크기가 다르기 때문에 여러 디바이스에 대응하기 위해 사용<h2 id="미디어-유형">미디어 유형</h2>
</li>
<li><code>all</code>: 모든 장치 대상(기본값)</li>
<li><code>print</code>: 인쇄 결과물 및 출력 미리보기 화면에 표시</li>
<li><code>screen</code>: 모니터나 스크린이 있는 디바이스</li>
<li><code>speech</code>: 음성 합성장치 대상</li>
</ul>
<br/>

<h2 id="미디어-특성">미디어 특성</h2>
<ul>
<li><p><code>width</code>: 스크롤바를 포함한 뷰포트의 너비</p>
<ul>
<li>min-width, max-width 최소 최대 너비</li>
</ul>
</li>
<li><p><code>height</code>: 뷰포트의 높이</p>
<ul>
<li>min-height, max-height 최소 최대 높이</li>
</ul>
</li>
<li><p><code>orientation</code>: 뷰포트의 방향</p>
<ul>
<li><code>portrait</code>:세로  <code>landscape</code>:가로</li>
</ul>
</li>
<li><p><code>aspect-ratio</code>: 뷰포트의 가로세로 비율</p>
</li>
<li><p><code>resolution</code>: 출력 장치의 픽셀 밀도 - 단위 <code>dppx</code>(Device pixel ratio)</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[멋사] 프론트엔드 스쿨 7기 학습 230718]]></title>
            <link>https://velog.io/@chance_777/likelionfes7study0718</link>
            <guid>https://velog.io/@chance_777/likelionfes7study0718</guid>
            <pubDate>Tue, 18 Jul 2023 10:35:34 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>멋쟁이사자처럼 프론트엔드 스쿨 7기 학습내용 정리 및 복습</p>
</blockquote>
<h1 id="🏃🏻♀️-animation">🏃🏻‍♀️ Animation</h1>
<ul>
<li>JavaScript 없이 애니메이션 효과를 적용할 때 사용</li>
<li><code>transition</code>은 요소의 상태가 변해야 실행할 수 있지만, <code>animation</code>은 <strong>요소의 상태 변화와 관계없이</strong> 실행</li>
</ul>
<br/>

<h2 id="keyframes">@keyframes</h2>
<ul>
<li>두 개 이상의 애니메이션 중간 상태 설정</li>
<li>0%는 시작점, 100%는 종료시점 (from, to도 사용가능)<blockquote>
<pre><code class="language-css">/* [ from ~ to 속성 ] */
@keyframes animation-name {
  from {}
  to {}
}
/* [ 0% ~ 100% 속성 ] */
@keyframes animation-name {
  0% {}
  50% {}
  100% {}
}</code></pre>
</blockquote>
</li>
</ul>
<br/>


<h2 id="animation-name">animation-name</h2>
<ul>
<li>요소에 적용할 애니메이션을 설명하는 이름 지정</li>
<li>이름의 시작에는 <code>영문 소문자, 문자열, 언더바(_), 하이픈(-)</code>을 사용함</li>
<li>여러 개의 animation-name을 동시 나열할 경우 <code>,</code> 사용</li>
</ul>
<br/>


<h2 id="animation-duration">animation-duration</h2>
<ul>
<li>애니메이션이 한 사이클을 완료하는데 걸리는 시간 지정</li>
<li>음수값으로 설정하면 애니메이션 실행 안 됨</li>
</ul>
<br/>


<h2 id="animation-timing-function">animation-timing-function</h2>
<ul>
<li><p>애니메이션이 진행되는 방식 설정</p>
<blockquote>
<pre><code class="language-css">animation-timing-function: ease;
animation-timing-function: cubic-bezier(0.1, 0.7, 1, 0.1);
animation-timing-function: steps(4);</code></pre>
</blockquote>
</li>
<li><p><code>ease</code>: 기본값. 애니메이션 중간으로 갈수록 속도가 증가하고 끝에서 느려짐</p>
</li>
<li><p><code>linear</code>: 균일한 속도로 움직임</p>
</li>
<li><p><code>steps(n)</code>: n개의 단계</p>
</li>
</ul>
<br/>

<h2 id="animation-delay">animation-delay</h2>
<ul>
<li>언제 애니메이션이 시작될지 지정</li>
<li>음수값 지정 시, 애니메이션이 도중에 시작됨<ul>
<li>지정한 시간이 지난 뒤 장면부터 <strong>지연 없이</strong> 애니메이션 시작</li>
<li>-1s = 시퀀스 1초부터 시작</li>
</ul>
</li>
</ul>
<br/>

<h2 id="animation-iteration-count">animation-iteration-count</h2>
<ul>
<li>애니메이션 재생 횟수 설정<ul>
<li><code>infitnite</code>: 무한 반복</li>
<li><code>0.5</code>: 절반 재생</li>
</ul>
</li>
</ul>
<br/>

<h2 id="animation-direction">animation-direction</h2>
<ul>
<li>애니메이션의 재생 방향 및 반복 여부 지정<ul>
<li><code>normal</code>: 기본값. 정방향 재생</li>
<li><code>reverse</code>: 역방향 재생</li>
<li><code>alternate</code>: 정방향, 역방향 반복</li>
<li><code>alternate-reverse</code>: 역방향, 정방향 반복</li>
</ul>
</li>
</ul>
<br/>

<h2 id="animation-fill-mode">animation-fill-mode</h2>
<ul>
<li>실행 전과 후에, 대상에 스타일을 적용하는 방법<ul>
<li><code>normal</code>: 기본값. 스타일 적용 없음</li>
<li><code>forwards</code>: 요소의 기존 스타일로 시작. 애니메이션 마지막 속성값 유지</li>
<li><code>backwards</code>: 첫 번째 정의된 애니메이션 값으로 시작. 요소의 기존 스타일로 돌아감</li>
<li><code>both</code>: 첫번째 정의된 값으로 시작. 마지막 값 유지</li>
</ul>
</li>
</ul>
<br/>

<h2 id="animation-play-state">animation-play-state</h2>
<ul>
<li>애니메이션 재생 여부 설정<ul>
<li><code>paused</code>: 정지</li>
<li><code>runnig</code>: 재생</li>
</ul>
</li>
</ul>
<br/>

<h2 id="animation">animation</h2>
<ul>
<li>단축 속성<ul>
<li><code>animation-name</code> <code>animation-duration</code> <code>animation-timing-function</code> <code>animation-delay</code> <code>animation-iteration-count</code> <code>animation-direction</code> <code>animation-fill-mode</code> <code>animation-play-state</code></li>
</ul>
</li>
</ul>
<br/>


<h1 id="✍🏻-실습">✍🏻 실습</h1>
<ul>
<li>피그마 디자인 &amp; 애니메이션 실습 진행</li>
</ul>
<h2 id="피그마-실습-1">[피그마 실습 #1]</h2>
<p><img src="https://velog.velcdn.com/images/chance_777/post/02527f05-fbf0-4648-9e4d-a16dae2ecc2c/image.png" alt=""></p>
<h2 id="애니메이션-결과물-1">[애니메이션 결과물 #1]</h2>
<p><img src="https://velog.velcdn.com/images/chance_777/post/93ba9174-e573-4972-b5ff-cb5b59d97236/image.gif" alt=""></p>
<h2 id="실습코드-1">[실습코드 #1]</h2>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;애니메이션 실습&lt;/title&gt;
    &lt;style&gt;
    .snowman {
        width:  195px;
        height: 205px;
        /* border: 4px solid #000; */
        background-image: url(./img/keyframes-snowman2.png);
        background-repeat: no-repeat;
        background-position: left top;
        background-size: auto 100%;

        animation-name: move-snow;
        animation-duration: 1s;
        animation-iteration-count: infinite;
        animation-timing-function: steps(6);
    }

    @keyframes move-snow {
        /* 0% {
            background-position: left 0;
        } */
        100% {
            background-position: right 0;
        }
    }
    &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;snowman&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<br/>

<h2 id="피그마-실습-2">[피그마 실습 #2]</h2>
<p><img src="https://velog.velcdn.com/images/chance_777/post/f8e857c7-745a-4e5c-a078-2f9d25d158e4/image.png" alt=""></p>
<h2 id="애니메이션-결과물-2">[애니메이션 결과물 #2]</h2>
<p><img src="https://velog.velcdn.com/images/chance_777/post/4c22734a-c94a-4250-98f1-85c482652cf6/image.gif" alt=""></p>
<h2 id="실습코드-2">[실습코드 #2]</h2>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
    &lt;meta charset=&quot;UTF-8&quot;&gt;
    &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
    &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
    &lt;title&gt;애니메이션 실습&lt;/title&gt;
    &lt;style&gt;
    .ghost {
        width:  200px;
        height: 200px;
        border: 4px solid #000;
        background-image: url(./img/keframes-ghost5.png);
        background-repeat: no-repeat;
        background-position: left top;
        background-size: auto 100%;

        animation-name: move-ghost;
        animation-duration: 2s;
        animation-iteration-count: infinite;
        animation-timing-function: steps(4);
    }

    @keyframes move-ghost {
        0% {
            background-position: left 0;
        }
        100% {
            background-position: right 0;
        }
    }
    &lt;/style&gt;

&lt;/head&gt;
&lt;body&gt;
    &lt;div class=&quot;ghost&quot;&gt;&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><br/><br/></p>
<h1 id="📺-video--audio">📺 video &amp; audio</h1>
<br/>

<h2 id="video">video</h2>
<ul>
<li><p>영상을 삽입할 수 있는 태그</p>
</li>
<li><p>video 태그의 속성</p>
<ul>
<li><p><code>autoplay</code>: 동영상 자동 재생</p>
</li>
<li><p><code>controls</code>: 재생, 정지 등 조작 메뉴 노출</p>
</li>
<li><p><code>loop</code>: 동영상 반복 재생</p>
</li>
<li><p><code>poster</code>: 동영상 재생 전에 보여 줄 이미지(썸네일)</p>
</li>
<li><p><code>preload</code>: 페이지를 열 때 무엇을 로드할지 결정</p>
<ul>
<li><p><code>none</code> : 비디오 파일을 미리 로딩하지 않음. 서버가 최소한의 트래픽을 유지하며 페이지 로딩이 조금 더 빨라짐</p>
</li>
<li><p><code>metadata</code> : 비디오 파일을 미리 로딩하지 않지만 파일의 메타데이터(예를 들어서 영상의 길이)를 미리 가져옴</p>
</li>
<li><p><code>auto</code> : 비디오 파일을 미리 로딩하여 사용자가 바로 영상을 볼 수 있도록 준비</p>
</li>
</ul>
</li>
<li><p><code>src</code>: 동영상 주소</p>
</li>
<li><p><code>type</code>: 동영상 타입(mp4, webm, ogg)</p>
</li>
<li><p><code>&lt;track&gt;</code> : <code>&lt;audio&gt;</code> 혹은 <code>&lt;video&gt;</code> 요소의 자식으로 <strong>자막</strong>과 같은 시간 기반 텍스트 데이터(텍스트 트랙) 지정</p>
<ul>
<li><p><code>kind</code> : 텍스트 트랙 종류. subtitles(자막), captions(설명) 등</p>
</li>
<li><p><code>srclang</code> : 텍스트 트랙 언어 지정</p>
</li>
<li><p><code>label</code> : 텍스트 트랙 제목 지정</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<pre><code class="language-html">&lt;video controls poster=&quot;batman.jpeg&quot; preload=&quot;auto&quot; width=&quot;450&quot; height=&quot;300&quot;&gt;
 &lt;source src=&quot;batman.mp4&quot; type=&quot;video/mp4&quot;&gt;
 &lt;source src=&quot;batman.ogv&quot; type=&quot;video/ogg&quot;&gt;
 &lt;source src=&quot;batman.webm&quot; type=&quot;video/webm&quot;&gt;
 &lt;track kind=&quot;subtitles&quot; src=&quot;foo.en.vtt&quot; srclang=&quot;ko&quot; label=&quot;batman&quot;&gt;
&lt;/video&gt;</code></pre>
</blockquote>
<br/>

<h2 id="audio">audio</h2>
<ul>
<li>문서에 audio 컨텐츠를 삽입하는 태그</li>
<li>공식적으로 지원하는 표준 오디오 파일: <code>MP3</code>, <code>WAV</code>, <code>Ogg</code></li>
<li>audio 태그 속성<ul>
<li><code>src</code>: 파일의 경로</li>
<li><code>controls</code>: 기본적인 동작을 조절하는 패널(재생, 볼륨, 탐색, 일시정지)</li>
<li><code>autoplay</code>: 자동 재생 여부</li>
<li><code>loop</code>: 반복 재생 여부</li>
<li><code>preload</code>: 파일의 내용을 모두 불러올지 여부</li>
</ul>
</li>
</ul>
<br/>

<p><strong>💡 알고 넘어가기!</strong></p>
<ul>
<li>Youtube 동영상 → 공유 → 퍼가기 → iframe으로 영상 태그 가져올 수 있음</li>
<li>&#39;연결을 거부했습니다&#39; = 일부 사이트에서는 iframe 거부하기도 함</li>
</ul>
<p><br/><br/></p>
<h1 id="🏁-svg-canvas">🏁 SVG, Canvas</h1>
<br/>

<h2 id="svg">SVG</h2>
<ul>
<li>확장 가능한 <strong>벡터 그래픽</strong>(scalable vector graphics)으로, <strong>XML</strong> 기반의 2차원 그래픽<ul>
<li><strong>벡터 그래픽이란?</strong> 수학 방정식을 기반으로 점, 직선, 곡선, 다각형과 같은 그림을 표현하는 방식</li>
<li><strong>XML이란?</strong> (eXtensible Markup Language) W3C에서 여러 특수 목적의 마크업 언어를 만드는데 사용하도록 권장하는 다목적 마크업 언어 </li>
</ul>
</li>
<li>HTML 태그의 집합으로 이루어져 있음</li>
<li>CSS와 JavaScript로 컨트롤 가능</li>
</ul>
<br/>

<h2 id="svg-장단점">SVG 장단점</h2>
<ul>
<li>장점<ul>
<li>확대: 아무리 확대해도 이미지가 깨지지 않음</li>
<li>용량: 이미지의 크기를 키워도 용량이 늘어나지 않음</li>
</ul>
</li>
<li>단점<ul>
<li>용량: 코드로 이루어져 있어, 복잡한 이미지의 경우 파일사이즈가 커짐</li>
</ul>
</li>
</ul>
<p>📌 단순한 아이콘, 로고, 도형 등을 구현할 때 많이 사용됨</p>
<br/>

<h2 id="sgv-사용-방법">SGV 사용 방법</h2>
<ol>
<li>HTML <code>&lt;img&gt;</code> 태그 사용</li>
<li>CSS <code>background</code> 배경으로 넣기</li>
<li>인라인으로 넣기</li>
</ol>
<ul>
<li>SVG 이미지 파일에 별다른 조작을 하지 않는다면 html <code>&lt;img&gt;</code>태그나 css <code>background</code> 속성 사용</li>
<li>이미지에 조작(색상, 모양 변경 등)이 필요한 경우 인라인 속성 사용</li>
</ul>
<br/>

<h2 id="canvas">Canvas</h2>
<ul>
<li>JavaScript와 HTML 요소를 통해 그래픽을 그림</li>
<li>픽셀 기반의 비트맵 방식</li>
<li>그래픽이 주작업인 게임에 적합함</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>