<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>_mieos.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Mon, 21 Sep 2026 07:57:20 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>_mieos.log</title>
            <url>https://velog.velcdn.com/images/_mieos/profile/df4b5a51-7908-4f83-9ee2-58ab06b59a91/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. _mieos.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/_mieos" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[웹 렌더링 방식]]></title>
            <link>https://velog.io/@_mieos/%EC%9B%B9-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%B0%A9%EC%8B%9D</link>
            <guid>https://velog.io/@_mieos/%EC%9B%B9-%EB%A0%8C%EB%8D%94%EB%A7%81-%EB%B0%A9%EC%8B%9D</guid>
            <pubDate>Mon, 21 Sep 2026 07:57:20 GMT</pubDate>
            <description><![CDATA[<h1 id="웹-렌더링">웹 렌더링</h1>
<h2 id="1-웹-렌더링">1. 웹 렌더링</h2>
<p>웹 렌더링은 <strong>웹 페이지를 사용자에게 보여주는 과정</strong>이다.
서버나 브라우저가 HTML, CSS, JavaScript 등을 이용해서 실제 화면을 만들어 보여준다.</p>
<p>렌더링 방식에 따라 <strong>로딩 속도, SEO, 사용자 경험</strong> 등이 달라질 수 있다.</p>
<h3 id="렌더링-방식">렌더링 방식</h3>
<ul>
<li>CSR (Client Side Rendering)</li>
<li>SSR (Server Side Rendering)</li>
<li>SSG (Static Site Generation)</li>
<li>ISR (Incremental Static Regeneration)</li>
</ul>
<hr>
<h2 id="2-csr">2. CSR</h2>
<p><strong>CSR은 브라우저에서 JavaScript를 이용해 웹페이지를 만드는 방식</strong>이다.</p>
<p>서버에서 HTML과 JavaScript를 받아온 후, 브라우저가 JavaScript를 실행해서 화면을 만든다.</p>
<h3 id="장점">장점</h3>
<ul>
<li>초기 로딩 이후에는 필요한 데이터만 가져와서 화면을 바꿀 수 있다.</li>
<li>사용자와의 인터랙션이 빠르다.</li>
<li>전체 페이지를 다시 렌더링하지 않아 서버 부담을 줄일 수 있다.</li>
</ul>
<h3 id="단점">단점</h3>
<ul>
<li>JavaScript를 불러오고 실행해야 해서 초기 로딩이 느릴 수 있다.</li>
<li>처음에는 빈 HTML이 전달되기 때문에 SEO에 불리할 수 있다.</li>
</ul>
<p>→ <strong>사용자와의 상호작용이 많은 대시보드나 어드민 페이지 등에 적합하다.</strong></p>
<hr>
<h2 id="3-ssr">3. SSR</h2>
<p><strong>SSR은 서버에서 HTML을 완성해서 브라우저로 보내는 방식</strong>이다.</p>
<p>사용자가 페이지를 요청하면 서버에서 필요한 HTML을 만들어서 보내준다.</p>
<h3 id="장점-1">장점</h3>
<ul>
<li>완성된 HTML을 바로 받을 수 있어서 초기 페이지를 빠르게 볼 수 있다.</li>
<li>검색 엔진이 내용을 쉽게 읽을 수 있어서 SEO에 유리하다.</li>
</ul>
<h3 id="단점-1">단점</h3>
<ul>
<li>사용자가 요청할 때마다 서버에서 페이지를 만들어야 해서 서버 부담이 커질 수 있다.</li>
</ul>
<p>→ <strong>사용자 맞춤 콘텐츠나 실시간으로 변경되는 데이터가 있는 웹사이트 등에 사용할 수 있다.</strong></p>
<hr>
<h2 id="4-ssg">4. SSG</h2>
<p><strong>SSG는 빌드할 때 웹페이지를 미리 HTML로 만들어 놓는 방식</strong>이다.</p>
<p>사용자가 접속하면 미리 만들어 놓은 HTML을 바로 보내준다.</p>
<h3 id="장점-2">장점</h3>
<ul>
<li>미리 만들어져 있어서 로딩이 빠르다.</li>
<li>서버에서 매번 페이지를 만들 필요가 없어서 서버 부담이 적다.</li>
</ul>
<h3 id="단점-2">단점</h3>
<ul>
<li>데이터가 변경될 때마다 다시 빌드해야 한다.</li>
</ul>
<p>→ <strong>회사 소개, 제품 소개, FAQ, 개인 블로그처럼 내용이 자주 바뀌지 않는 사이트에 적합하다.</strong></p>
<hr>
<h2 id="5-isr">5. ISR</h2>
<p><strong>ISR은 SSG처럼 페이지를 미리 만들어 놓지만, 일정 시간이 지나면 페이지를 다시 생성해서 변경된 데이터를 반영하는 방식</strong>이다.</p>
<p>즉, <strong>SSG와 SSR의 특징을 어느 정도 합친 방식</strong>이라고 볼 수 있다.</p>
<h3 id="장점-3">장점</h3>
<ul>
<li>미리 만들어진 페이지를 사용해서 빠르게 보여줄 수 있다.</li>
<li>데이터 변경 내용을 반영할 수 있다.</li>
<li>모든 요청마다 페이지를 새로 만들지 않아 서버 부담을 줄일 수 있다.</li>
</ul>
<h3 id="단점-3">단점</h3>
<ul>
<li>페이지 상태를 관리해야 해서 구현이 복잡할 수 있다.</li>
<li>페이지를 다시 만드는 시간이 필요하다.</li>
</ul>
<p>→ <strong>일부 데이터는 자주 변경되고, 일부 데이터는 자주 변경되지 않는 사이트에 적합하다.</strong></p>
<hr>
<h1 id="추가로-정리한-용어">추가로 정리한 용어</h1>
<h2 id="6-인터랙션">6. 인터랙션</h2>
<p><strong>인터랙션(Interaction)은 사용자와 웹페이지가 서로 상호작용하는 것</strong>이다.</p>
<p>예를 들어 버튼을 클릭했을 때 화면이 바뀌거나, 검색어를 입력했을 때 검색 결과가 나타나는 것이 인터랙션이다.</p>
<p>→ <strong>사용자의 행동에 웹페이지가 반응하는 것</strong></p>
<hr>
<h2 id="7-동적으로-페이지를-업데이트">7. 동적으로 페이지를 업데이트</h2>
<p><strong>동적으로 페이지를 업데이트한다는 것은 페이지 전체를 새로 불러오지 않고 필요한 부분만 변경하는 것</strong>이다.</p>
<p>예를 들어 검색 버튼을 눌렀을 때 페이지 전체가 새로고침되는 것이 아니라 검색 결과 부분만 바뀌는 것이다.</p>
<p>CSR에서는 필요한 데이터만 받아서 해당 부분을 동적으로 업데이트할 수 있다.</p>
<p>→ <strong>새로고침 없이 필요한 부분을 바꾸는 것</strong></p>
<hr>
<h2 id="8-seo">8. SEO</h2>
<p><strong>SEO(Search Engine Optimization)는 검색 엔진 최적화</strong>이다.</p>
<p>웹페이지의 내용을 검색 엔진이 잘 이해하고 검색 결과에 잘 나타날 수 있도록 하는 것이다.</p>
<p>렌더링 방식에 따라서 SEO에 유리하거나 불리할 수 있다. 예를 들어 SSR과 SSG는 완성된 HTML을 제공하기 때문에 SEO에 유리하고, CSR은 JavaScript 실행 전 빈 HTML이 먼저 보여 SEO에 불리할 수 있다.</p>
<p>→ <strong>검색 엔진에서 웹페이지가 잘 검색되도록 하는 것</strong></p>
<hr>
<h2 id="9-빌드">9. 빌드</h2>
<p><strong>빌드(Build)는 작성한 코드를 실제로 실행하거나 배포할 수 있는 형태로 만드는 과정</strong>이다.</p>
<p>특히 SSG에서는 <strong>빌드할 때 웹페이지를 미리 HTML로 생성</strong>한다.</p>
<p>→ <strong>작성한 코드를 배포할 수 있는 결과물로 만드는 과정</strong></p>
<hr>
<h1 id="한-번에-비교">한 번에 비교</h1>
<table>
<thead>
<tr>
<th>용어</th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>웹 렌더링</td>
<td>웹페이지를 화면에 보여주는 과정</td>
</tr>
<tr>
<td>인터랙션</td>
<td>사용자의 행동에 웹페이지가 반응하는 것</td>
</tr>
<tr>
<td>동적 업데이트</td>
<td>새로고침 없이 필요한 부분만 바꾸는 것</td>
</tr>
<tr>
<td>SEO</td>
<td>검색 엔진에서 잘 검색되도록 하는 것</td>
</tr>
<tr>
<td>빌드</td>
<td>코드를 실행·배포할 수 있는 형태로 만드는 것</td>
</tr>
<tr>
<td>CSR</td>
<td>브라우저에서 화면을 만드는 방식</td>
</tr>
<tr>
<td>SSR</td>
<td>서버에서 HTML을 만들어 보내는 방식</td>
</tr>
<tr>
<td>SSG</td>
<td>빌드할 때 HTML을 미리 만들어 놓는 방식</td>
</tr>
<tr>
<td>ISR</td>
<td>미리 만든 페이지를 필요할 때 다시 생성하는 방식</td>
</tr>
</tbody></table>
<h3 id="핵심">핵심</h3>
<p>렌더링 방식은 하나가 무조건 좋은 것이 아니라 <strong>웹사이트의 목적과 필요한 기능에 맞게 선택하는 것이 중요하다.</strong></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Scope, Closure]]></title>
            <link>https://velog.io/@_mieos/Scope-Closure</link>
            <guid>https://velog.io/@_mieos/Scope-Closure</guid>
            <pubDate>Mon, 07 Sep 2026 08:53:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/684b1d7f-8110-477e-9939-8d0c93a17826/image.jpg" alt=""></p>
<h2 id="scope">Scope</h2>
<blockquote>
<p>전역 / 지역       → 스코프의 범위
함수 / 블록       → 스코프가 만들어지는 기준
중첩 스코프       → 스코프가 들어가 있는 구조
렉시컬 스코프     → 스코프가 결정되는 기준
스코프 체인       → 변수를 찾는 방법</p>
</blockquote>
<h3 id="스코프란">스코프란?</h3>
<p><strong>변수를 사용할 수 있는 범위</strong></p>
<ul>
<li>전역 스코프 → 프로그램 전체에서 사용 가능</li>
<li>지역 스코프<ul>
<li>함수 스코프 → 함수 내부에서 사용 가능</li>
<li>블록 스코프 → <code>{}</code> 내부에서 사용 가능</li>
</ul>
</li>
</ul>
<h3 id="let-const-var">let, const, var</h3>
<ul>
<li>let → <code>{}</code> 블록을 기준으로 범위가 정해짐</li>
<li>const → <code>{}</code> 블록을 기준으로 범위가 정해짐</li>
<li>var → <code>{}</code> 블록으로는 범위가 제한되지 않고, 함수 기준으로 범위가 정해짐</li>
</ul>
<h3 id="중첩-스코프-렉시컬-스코프-스코프-체인">중첩 스코프, 렉시컬 스코프, 스코프 체인</h3>
<ul>
<li><p>중첩 스코프
→ 스코프 안에 또 다른 스코프가 있는 관계</p>
</li>
<li><p>렉시컬 스코프
→ 함수가 어디에 작성되었는지를 기준으로
   접근할 수 있는 바깥 스코프가 결정되는 것</p>
</li>
<li><p>스코프 체인
→ 현재 스코프에서 변수를 찾고,
   없으면 바깥쪽 스코프로 이동하면서 찾는 방식
   (현재 → 바깥 → 전역)</p>
</li>
</ul>
<h2 id="closure">Closure</h2>
<h3 id="클로저란">클로저란?</h3>
<p>*<em>내부 함수가 자신이 선언된 곳의 외부 변수를 기억해서, 외부 함수가 끝난 후에도 그 변수를 사용할 수 있는 현상
*</em></p>
<ul>
<li><p>외부 함수: 내부 함수를 포함하고 있는 함수</p>
</li>
<li><p>내부 함수: 함수 안에 선언된 함수</p>
</li>
<li><p>외부 변수: 현재 함수의 바깥쪽 스코프에 선언된 변수</p>
<pre><code>function outer() { 
  let name = &quot;민서&quot;; 

  function inner() { 
      console.log(name); 
  } 
}</code></pre></li>
<li><p><code>outer</code>: 외부 함수</p>
</li>
<li><p><code>inner</code>: 내부 함수</p>
</li>
<li><p><code>name</code>: 외부 변수</p>
</li>
</ul>
<h3 id="return-inner-return-inner">return inner, return inner()</h3>
<pre><code>return inner; // inner 함수 자체를 반환 
return inner(); // inner 함수를 실행하고 결과를 반환</code></pre><ul>
<li><code>inner</code>: 함수 이름</li>
<li><code>inner()</code>: 그 함수를 실행</li>
<li><code>return inner</code>: 그 함수 자체를 반환</li>
</ul>
<pre><code>function outer() {
  let name = &quot;민서&quot;;

  function inner() {
    console.log(name);
  }

  return inner;
}

const hello = outer();

hello(); // 민서</code></pre><p>outer() 실행→inner 함수 반환→outer() 실행 종료→hello() 실행→inner가 name 사용 가능</p>
<h3 id="클로저로-변수를-외부에서-직접-접근하지-못하게-하는-방법">클로저로 변수를 외부에서 직접 접근하지 못하게 하는 방법</h3>
<p>변수를 직접 공개하지 않고 필요한 기능만 함수로 제공 → 클로저를 이용하면 외부에서 변수에 직접 접근하지 못하게 하면서, 내부 함수로 값을 관리할 수 있다.</p>
<h3 id="클로저의-실제-활용">클로저의 실제 활용</h3>
<ul>
<li>값을 계속 유지해야 할 때</li>
<li>변수를 외부에서 직접 접근하지 못하게 하고 필요한 기능으로만 관리할 때</li>
<li>각각 독립적인 상태를 만들어야 할 때</li>
</ul>
<p>→ 클로저는 외부 변수의 값을 유지하거나, 변수를 보호하고, 독립적인 상태를 관리할 때 활용된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[React Hooks]]></title>
            <link>https://velog.io/@_mieos/React-Hooks</link>
            <guid>https://velog.io/@_mieos/React-Hooks</guid>
            <pubDate>Mon, 24 Aug 2026 07:47:19 GMT</pubDate>
            <description><![CDATA[<h2 id="1-react-hooks란">1. React Hooks란?</h2>
<ul>
<li><p><strong>Hook이란 무엇인가?</strong>: Hook은 함수 컴포넌트에서 React의 다양한 기능을 사용할 수 있도록 해주는 기능이다.</p>
<ul>
<li><code>useState</code> : 화면에 영향을 주는 상태를 저장한다.</li>
<li><code>useEffect</code> : 렌더링 이후 React 외부와 관련된 작업을 처리한다.</li>
<li><code>useRef</code> : 리렌더링 없이 값을 저장하거나 DOM 요소에 접근한다.</li>
<li><code>useMemo</code> : 계산된 값을 기억한다.</li>
<li><code>useCallback</code> : 함수 참조를 기억하여 필요할 때 같은 함수 참조를 재사용한다.</li>
</ul>
</li>
<li><p><strong>왜 Hooks를 사용하는가?</strong>: React 컴포넌트는 화면을 구성하지만, 단순히 화면만 보여주는 것 외에도 다양한 기능이 필요하다.
예)</p>
<ul>
<li>사용자가 입력한 값을 저장하기</li>
<li>버튼 클릭에 따라 값을 변경하기</li>
<li>API에서 데이터 가져오기</li>
<li>특정 HTML 요소에 접근하기</li>
<li>불필요한 계산이나 함수 생성을 줄이기</li>
</ul>
</li>
<li><p><strong>함수 컴포넌트와 Hooks의 관계</strong>: Hooks는 함수 컴포넌트 내부에서 React의 기능을 사용할 수 있도록 해준다. 즉, 함수 컴포넌트에서 상태를 관리하거나 렌더링 이후 특정 작업을 실행하기 위해 Hooks를 사용한다.</p>
<h2 id="2-hooks를-이해하기-전에-알아야-하는-개념">2. Hooks를 이해하기 전에 알아야 하는 개념</h2>
<h3 id="2-1-컴포넌트">2-1. 컴포넌트</h3>
</li>
<li><p><strong>컴포넌트란 무엇인가?</strong>: 컴포넌트(Component)는 웹사이트의 화면이나 기능을 독립적인 단위로 나눈 것이다. </p>
</li>
<li><p><strong>컴포넌트의 역할</strong>: 컴포넌트는 웹사이트를 여러 개의 독립적인 부분으로 나누어 관리할 수 있도록 한다.</p>
</li>
<li><p><strong>컴포넌트를 사용하는 이유</strong></p>
<ul>
<li>코드 재사용: 한 번 만든 컴포넌트를 여러 곳에서 사용할 수 있다.</li>
<li>코드 관리: 웹사이트의 기능을 나누어 관리할 수 있어 코드가 길어지는 것을 줄이고 수정과 관리가 쉬워진다.<h3 id="2-2-함수-컴포넌트">2-2. 함수 컴포넌트</h3>
</li>
</ul>
</li>
<li><p><strong>함수 컴포넌트란?</strong>: 함수 컴포넌트(Function Component)는 함수를 이용하여 만든 React 컴포넌트이다. 일반적으로 JSX를 반환하여 화면을 구성한다.</p>
</li>
<li><p><code>function</code>으로 선언하는 방법
<img src="https://velog.velcdn.com/images/_mieos/post/957ef8fa-aa5f-4edb-8cbc-5db00ab7a5a0/image.png" alt=""></p>
</li>
<li><p>화살표 함수로 선언하는 방법
<img src="https://velog.velcdn.com/images/_mieos/post/ff5d4fee-f4a2-4a3e-8b99-702200f92291/image.png" alt=""></p>
</li>
</ul>
<h3 id="2-3-state">2-3. State</h3>
<ul>
<li><strong>State란?</strong>: State는 컴포넌트가 기억하고 관리해야 하는 값이다.
예) 좋아요 수, 로그인 여부, 검색어, 게시글 목록, 선택한 카테고리 등이 있다.</li>
<li><strong>일반 변수와 State의 차이</strong><ul>
<li>일반 변수 변경 → 화면 업데이트 X</li>
<li>State 변경 → 리렌더링 → 화면 업데이트</li>
</ul>
</li>
<li><strong>State가 필요한 이유</strong>: 웹사이트에서는 값이 변경되면 화면도 함께 변경되어야 한다. 따라서 화면에 영향을 주는 값을 관리하기 위해 State를 사용한다.<h3 id="2-4-props">2-4. Props</h3>
</li>
<li><strong>Props란?</strong>: Props는 부모 컴포넌트가 자식 컴포넌트에게 전달하는 데이터이다.</li>
<li><strong>부모 컴포넌트와 자식 컴포넌트</strong>: 다른 컴포넌트를 포함하거나 사용하는 컴포넌트를 부모 컴포넌트, 그 안에서 사용되는 컴포넌트를 자식 컴포넌트라고 한다.</li>
<li><strong>Props를 이용한 데이터 전달</strong>: Props를 사용하면 부모 컴포넌트의 데이터를 자식 컴포넌트에게 전달할 수 있다. Props는 기본적으로 부모에서 자식 방향으로 전달된다.<h3 id="2-5-렌더링과-리렌더링">2-5. 렌더링과 리렌더링</h3>
</li>
<li><strong>렌더링이란?</strong>: 렌더링(Rendering)은 React가 컴포넌트를 실행하고 화면에 표시할 내용을 준비하는 과정이다.</li>
<li><strong>리렌더링이란?</strong>: 리렌더링(Re-rendering)은 컴포넌트가 다시 실행되어 화면에 필요한 변경 사항을 반영하는 과정이다.</li>
<li><strong>어떤 경우에 리렌더링되는가?</strong><ul>
<li>State가 변경되면 해당 컴포넌트가 리렌더링된다.</li>
<li>Props가 변경되면 해당 Props를 받는 컴포넌트가 리렌더링될 수 있다.</li>
<li>부모 컴포넌트가 리렌더링되면 자식 컴포넌트도 기본적으로 리렌더링될 수 있다.</li>
</ul>
</li>
<li><strong>React.memo와 리렌더링</strong><ul>
<li><code>React.memo</code>를 사용하면 Props가 변경되지 않은 자식 컴포넌트의 불필요한 리렌더링을 줄일 수 있다.<h2 id="3-usestate">3. useState</h2>
</li>
</ul>
</li>
<li><strong><code>useState</code>란?</strong>: <code>useState</code>는 컴포넌트의 State를 저장하고 관리하기 위한 Hook이다.</li>
<li><strong>역할</strong>: State 값을 저장하고, 값이 변경되면 React가 화면을 업데이트할 수 있도록 한다.</li>
<li><strong>기본 문법</strong>: <code>const [state, setState] = useState(initialValue);</code></li>
<li><strong>초기값</strong>: <code>useState</code>의 괄호 안에는 State의 초기값을 넣는다. ex) <code>useState(0)</code>→초기값은 0</li>
<li><strong>상태 변경 방법</strong>: State는 값을 직접 변경하는 것이 아니라 Setter 함수를 사용하여 변경한다.
예) <code>setCount(1)</code>과 같이 Setter 함수를 사용하여 State를 변경한다.</li>
<li><strong>State 변경과 리렌더링</strong>: State 변경 → 컴포넌트 리렌더링 → 변경된 화면 반영</li>
</ul>
<h2 id="4-useeffect">4. useEffect</h2>
<ul>
<li><strong><code>useEffect</code>란?</strong>: <code>useEffect</code>는 컴포넌트 렌더링 이후 API 요청, 이벤트 등록, 타이머 설정 등 React 외부와 관련된 작업을 처리하기 위한 Hook이다.</li>
<li><strong>역할</strong><ul>
<li>API 요청</li>
<li>이벤트 등록</li>
<li>타이머 설정</li>
<li>외부 데이터와 연결</li>
</ul>
</li>
<li><strong>기본 문법</strong>: <code>useEffect(() =&gt; { 실행할 작업 }, [dependencies]);</code></li>
<li><strong>Dependency Array란?</strong>: Dependency Array는 Effect가 다시 실행될 조건을 관리하는 배열이다.</li>
<li><strong>Dependency Array가 없는 경우</strong>: Dependency Array를 작성하지 않으면 렌더링이 완료될 때마다 Effect가 실행된다.</li>
<li><strong><code>[]</code></strong>: 빈 배열을 전달하면 일반적으로 컴포넌트가 처음 화면에 나타난 후 Effect가 실행된다.</li>
<li><strong><code>[value]</code></strong>: value가 변경되면 Effect가 다시 실행된다.</li>
<li><strong>Cleanup</strong>: Cleanup은 <code>useEffect</code>에서 생성한 작업을 정리하기 위한 기능이다. 예를 들어 타이머나 이벤트 리스너를 제거할 때 사용할 수 있다.</li>
<li><strong>API 요청과 <code>useEffect</code></strong>: 컴포넌트 렌더링 → useEffect 실행 → API 요청 → 데이터 받기 → State에 데이터 저장 → 리렌더링 → 화면에 데이터 표시</li>
</ul>
<h2 id="5-useref">5. useRef</h2>
<ul>
<li><p><strong><code>useRef</code>란?</strong>: <code>useRef</code>는 값을 저장하지만 값이 변경되어도 리렌더링을 발생시키지 않는 <code>Hook</code>이다.</p>
</li>
<li><p><strong>역할</strong></p>
<ul>
<li>리렌더링 없이 값을 저장</li>
<li>특정 DOM 요소에 접근</li>
</ul>
</li>
<li><p><strong>기본 문법</strong>: <code>const ref = useRef(initialValue);</code></p>
</li>
<li><p><strong><code>.current</code></strong>: <code>useRef</code>로 생성한 Ref 객체의 값은 <code>.current</code>에 저장된다. 값을 읽거나 변경할 때 <code>.current</code>를 사용한다.
예)
<img src="https://velog.velcdn.com/images/_mieos/post/47951190-75a9-4765-a3f7-8e5e19a2ea9e/image.png" alt=""></p>
</li>
<li><p><strong>값 저장</strong>: <code>useRef</code>에 저장된 값은 컴포넌트가 다시 렌더링되어도 유지된다.</p>
</li>
</ul>
<p>하지만 <code>.current</code>의 값을 변경해도 화면은 다시 렌더링되지 않는다.</p>
<ul>
<li><code>useState</code>와 차이</li>
</ul>
<table>
<thead>
<tr>
<th></th>
<th><code>useState</code></th>
<th><code>useRef</code></th>
</tr>
</thead>
<tbody><tr>
<td>값 저장</td>
<td>가능</td>
<td>가능</td>
</tr>
<tr>
<td>값 변경 시</td>
<td>Setter 함수 사용</td>
<td><code>.current</code> 변경</td>
</tr>
<tr>
<td>값 변경 시 리렌더링</td>
<td>발생</td>
<td>발생하지 않음</td>
</tr>
</tbody></table>
<ul>
<li><strong>DOM 접근</strong>: <code>useRef</code>는 특정 HTML 요소에 직접 접근할 때 사용할 수 있다. 예를 들어 input 요소에 포커스를 이동시키는 기능을 구현할 수 있다.</li>
</ul>
<h2 id="6-usememo">6. useMemo</h2>
<ul>
<li><p><strong><code>useMemo</code>란?</strong>: <code>useMemo</code>는 계산한 결과를 기억하는 Hook이다.</p>
</li>
<li><p><strong>역할</strong>: 컴포넌트가 리렌더링될 때 불필요하게 같은 계산을 반복하지 않도록 도와준다.</p>
</li>
<li><p><strong>기본 문법</strong>: <code>const value = useMemo(() =&gt; { 계산하는 코드 }, [dependencies]);</code></p>
</li>
<li><p><strong>계산 결과를 기억하는 이유</strong>: 컴포넌트가 리렌더링되면 컴포넌트 내부의 코드가 다시 실행될 수 있다. 계산 비용이 큰 작업을 매번 반복하면 성능에 영향을 줄 수 있기 때문에 <code>useMemo</code>를 사용하여 필요한 경우 이전 계산 결과를 재사용할 수 있다.</p>
</li>
<li><p><strong>Dependency Array</strong>: Dependency Array에 있는 값이 변경되면 계산을 다시 실행한다. 값이 변경되지 않았다면 이전에 계산한 결과를 사용할 수 있다.</p>
</li>
<li><p><strong>언제 사용하는가?</strong></p>
<ul>
<li>계산 비용이 큰 경우</li>
<li>같은 계산이 반복되는 경우</li>
<li>불필요한 계산이 반복되는 경우</li>
</ul>
</li>
<li><p><strong>무조건 사용하면 안 되는 이유</strong>: <code>useMemo</code> 역시 값을 기억하고 관리하는 과정이 필요하기 때문에 모든 값에 사용한다고 성능이 항상 향상되는 것은 아니다. 필요한 경우에 사용하는 것이 중요하다.</p>
</li>
</ul>
<h2 id="7-usecallback">7. useCallback</h2>
<ul>
<li><p><strong><code>useCallback</code>이란?</strong>: <code>useCallback</code>은 함수 참조를 기억하는 Hook이다.</p>
</li>
<li><p><strong>역할</strong>: 컴포넌트가 리렌더링될 때 함수가 불필요하게 새로 생성되는 것을 줄이는 데 사용할 수 있다.</p>
</li>
<li><p><strong>기본 문법</strong>: <code>const callback = useCallback(() =&gt; { 실행할 함수 }, [dependencies]);</code></p>
</li>
<li><p><strong>Dependency Array</strong>: Dependency Array의 값이 변경되면 새로운 함수 참조를 반환하고, 변경되지 않았다면 이전 함수 참조를 유지한다.</p>
</li>
<li><p><strong>함수를 기억하는 이유</strong>: 컴포넌트가 리렌더링되면 컴포넌트 내부에서 선언한 함수도 새로운 함수로 생성될 수 있다. 함수 참조가 변경되면 자식 컴포넌트의 Props가 변경된 것으로 판단될 수 있기 때문에 필요한 경우 <code>useCallback</code>을 사용한다.</p>
</li>
<li><p><strong><code>React.memo</code>와 관계</strong>: <code>React.memo</code>는 Props가 변경되지 않았을 때 컴포넌트의 불필요한 리렌더링을 줄이는 데 사용할 수 있다. 하지만 부모 컴포넌트가 리렌더링될 때마다 새로운 함수를 Props로 전달하면 함수 참조가 변경되어 자식 컴포넌트는 Props가 변경되었다고 판단할 수 있다. 이때 <code>useCallback</code>을 사용하여 함수 참조를 유지하면 <code>React.memo</code>와 함께 최적화에 도움이 될 수 있다.</p>
</li>
<li><p><strong>언제 사용하는가?</strong></p>
<ul>
<li>함수를 자식 컴포넌트의 Props로 전달하는 경우</li>
<li><code>React.memo</code>를 사용하는 경우</li>
<li>동일한 함수 참조를 유지해야 하는 경우</li>
</ul>
</li>
</ul>
<h2 id="8-usememo와-usecallback-비교">8. useMemo와 useCallback 비교</h2>
<table>
<thead>
<tr>
<th>Hook</th>
<th>기억하는 것</th>
</tr>
</thead>
<tbody><tr>
<td><code>useMemo</code></td>
<td>계산된 값</td>
</tr>
<tr>
<td><code>useCallback</code></td>
<td>함수 참조</td>
</tr>
</tbody></table>
<p>useMemo -&gt; 값 기억
useCallback -&gt; 함수 참조 기억</p>
<h2 id="9-전체-hook-비교">9. 전체 Hook 비교</h2>
<table>
<thead>
<tr>
<th>Hook</th>
<th>주요 역할</th>
<th>리렌더링</th>
</tr>
</thead>
<tbody><tr>
<td><code>useState</code></td>
<td>상태 관리</td>
<td>State 변경 시 발생</td>
</tr>
<tr>
<td><code>useEffect</code></td>
<td>렌더링 이후 작업 실행</td>
<td>직접 발생시키지 않음</td>
</tr>
<tr>
<td><code>useRef</code></td>
<td>값 저장, DOM 접근</td>
<td>발생하지 않음</td>
</tr>
<tr>
<td><code>useMemo</code></td>
<td>계산 결과 기억</td>
<td>직접 발생시키지 않음</td>
</tr>
<tr>
<td><code>useCallback</code></td>
<td>함수 참조 기억</td>
<td>직접 발생시키지 않음</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[git 명령어]]></title>
            <link>https://velog.io/@_mieos/%EA%B9%83-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@_mieos/%EA%B9%83-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Mon, 03 Aug 2026 06:36:15 GMT</pubDate>
            <description><![CDATA[<ul>
<li>git config --global user.name &quot;사용자명(닉네임)&quot; : 깃 저장소에서 사용할 사용자 정보 중 사용자명을 설정하는 깃 명령어</li>
<li>git config --global user.email &quot;사용자메일&quot;</li>
<li>git init : 터미널이 열려 있는 폴더를 깃 저장소로 초기화하는 깃 명령어</li>
<li>ls : 터미널이 열려 있는 폴더 내에 있는 항목들을 나열하는 시스템 명령어</li>
<li>git status : 깃 프로젝트 상태를 확인하는 깃 명령어</li>
<li>git add : 워킹 디렉터리 내 문서를 스테이징 영역에 추가하는 깃 명령어</li>
<li>git commit : 스테이징 영역 내에 대기 중인 문서를 리포지토리에 추가하는 깃 명령어</li>
<li>git log : 커밋한 수정 이력을 확인하는 깃 명령어</li>
<li>git log -p : 커밋의 변경사항까지 함께 출력하는 옵션</li>
<li>git log --oneline : 각 커밋을 요약해 한 줄 씩 출력하는 옵션</li>
<li>git checkout 커밋해시 : 문서 내용을 특정 커밋의 내용으로 되돌리는 깃 명령어</li>
<li>git reflog : HEAD 포인터의 참조 이력을 출력하는 깃 명령어</li>
<li>git reset 파일명 : 스테이징 실수를 되돌리기</li>
<li>git reset 커미해시 --옵션 : 커밋 실수를 되돌리기</li>
<li>git revert 커밋해시 : 커밋 실수 되돌리되 이름 기록하기 </li>
<li>git branch : 현재 브랜치 목록을 볼 수 있는 깃 명령어</li>
<li>git branch 브랜치이름 : 새로운 브랜치를 생성하는 깃 명령어</li>
<li>git checkout 브랜치이름 : 작업 중인 브랜치를 변경하는 깃 명령어</li>
<li>git merge 브랜치이름 : 현재 브랜치에 다른 브랜치의 내용을 병합하는 깃 명령어</li>
<li>git remote -v : 현재 깃 프로젝트에 등록된 원격저장소 확인하는 깃 명령어</li>
<li>git remote add 원격저장소이름 원격저장소주소 : 현재 깃 프로젝트에 원격 저장소를 등록하고, 여기에 이름(별칭)을 붙이는 깃 명령어</li>
<li>git push : 로컬 저장소의 내용을 원격 저장소에 공유할 때 사용하는 깃 명령어</li>
<li>git pull : 원격 저장소의 내용을 로컬 저장소로 가져와 자동 병합하는 깃 명령어</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 기초]]></title>
            <link>https://velog.io/@_mieos/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0</link>
            <guid>https://velog.io/@_mieos/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EA%B8%B0</guid>
            <pubDate>Sat, 11 Jul 2026 12:13:01 GMT</pubDate>
            <description><![CDATA[<h3 id="자주-쓰는-메서드">자주 쓰는 메서드</h3>
<p>배열(Array)</p>
<table>
<thead>
<tr>
<th>메서드</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td><code>length</code></td>
<td>배열의 길이</td>
</tr>
<tr>
<td><code>push()</code></td>
<td>마지막에 추가</td>
</tr>
<tr>
<td><code>pop()</code></td>
<td>마지막 요소 삭제</td>
</tr>
<tr>
<td><code>shift()</code></td>
<td>첫 번째 요소 삭제</td>
</tr>
<tr>
<td><code>unshift()</code></td>
<td>첫 번째에 추가</td>
</tr>
</tbody></table>
<h3 id="자주-쓰는-연산자">자주 쓰는 연산자</h3>
<table>
<thead>
<tr>
<th>연산자</th>
<th>의미</th>
</tr>
</thead>
<tbody><tr>
<td><code>+</code></td>
<td>더하기</td>
</tr>
<tr>
<td><code>-</code></td>
<td>빼기</td>
</tr>
<tr>
<td><code>*</code></td>
<td>곱하기</td>
</tr>
<tr>
<td><code>/</code></td>
<td>나누기</td>
</tr>
<tr>
<td><code>%</code></td>
<td>나머지</td>
</tr>
<tr>
<td><code>===</code></td>
<td>같다(값과 자료형 모두)</td>
</tr>
<tr>
<td><code>!==</code></td>
<td>다르다</td>
</tr>
<tr>
<td><code>&gt;</code></td>
<td>크다</td>
</tr>
<tr>
<td><code>&lt;</code></td>
<td>작다</td>
</tr>
<tr>
<td><code>&gt;=</code></td>
<td>크거나 같다</td>
</tr>
<tr>
<td><code>&lt;=</code></td>
<td>작거나 같다</td>
</tr>
<tr>
<td><code>&amp;&amp;</code></td>
<td>AND</td>
</tr>
<tr>
<td><code>||</code></td>
<td>OR</td>
</tr>
<tr>
<td><code>!</code></td>
<td>NOT</td>
</tr>
</tbody></table>
<h2 id="1변수variable">1.변수(variable)</h2>
<p>: 값을 저장하는 이름이 있는 공간.(<code>const</code>,<code>let</code>)</p>
<p><code>const name = &quot;Mike&quot;;</code>
-&gt;<code>name</code>이라는 상자 안에<code>&quot;Mike&quot;</code>를 저장함.</p>
<h3 id="변수-선언-방법">변수 선언 방법</h3>
<pre><code class="language-JavaScript">const name = &quot;Mike&quot;;
let age = 20; </code></pre>
<ul>
<li><code>const</code>:값을 바꾸지 않을 때</li>
<li><code>let</code>:값을 바꿀 때</li>
</ul>
<pre><code class="language-JavaScript">let age = 20;

age = 21;

console.log(age);</code></pre>
<p>-&gt; 결과: 21</p>
<h2 id="2자료data">2.자료(Data)</h2>
<p>: 변수에 저장되는 값. 예:<code>10</code>,<code>&quot;Mike&quot;</code>,<code>true</code></p>
<p><code>const age = 20;</code></p>
<ul>
<li>변수:<code>age</code></li>
<li>자료:<code>20</code>
<code>const name = &quot;Mike&quot;;</code></li>
<li>변수:<code>name</code></li>
<li>자료:<code>&quot;Mike&quot;</code></li>
</ul>
<h2 id="3자료형data-type">3.자료형(Data Type)</h2>
<p>: 자료의 종류. <code>number</code>,<code>string</code>,<code>boolean</code>,<code>object</code>,<code>undefined</code> 등</p>
<h4 id="number">number</h4>
<p>10
3.14
-5</p>
<h4 id="string">string</h4>
<p>&quot;Mike&quot;
&quot;안녕하세요&quot;</p>
<h4 id="boolean">boolean</h4>
<p>true
false</p>
<h4 id="object">object</h4>
<p>{
  name: &quot;Mike&quot;,
  age:20
}</p>
<h4 id="undefined">undefined</h4>
<p>let name;
-&gt; 값이 아직 없음.
자료형 확인
console.log(typeof 10);
-&gt; 결과: number</p>
<h2 id="4consolelog">4.<code>console.log()</code></h2>
<p>: 콘솔(터미널이나 개발자 도구)에 값을 출력하는 함수</p>
<p>console.log(&quot;Hello&quot;);
-&gt; 결과: Hello</p>
<h2 id="5alert">5.<code>alert()</code></h2>
<p>: 브라우저에 알림 창을 띄우는 함수</p>
<p>alert(&quot;안녕하세요&quot;);
-&gt;브라우저에서 나오는 창:
안녕하세요</p>
<p>[확인]</p>
<h2 id="6prompt">6.<code>prompt()</code></h2>
<p>: 사용자에게 입력을 받는 함수</p>
<p>const name = prompt(&quot;이름을 입력하세요&quot;);
-&gt; 사용자가 Mike입력
-&gt;name = &quot;Mike&quot;</p>
<h2 id="7confirm">7.<code>confirm()</code></h2>
<p>: 확인/취소 창을 띄워 <code>true</code> 또는 <code>false</code>를 반환하는 함수</p>
<p>확인 여부를 물어봄
const result = confirm(&quot;삭제하시겠습니까?&quot;);
사용자가
확인-&gt;true
취소-&gt;false</p>
<h2 id="8연산자operator">8.연산자(Operator)</h2>
<p>: 값을 계산하거나 비교하는 기호. 예: <code>+</code>,<code>-</code>,<code>*</code>,<code>/</code>,<code>===</code>,<code>&gt;</code>,<code>&amp;&amp;</code></p>
<h4 id="산술-연산">산술 연산</h4>
<p>10 + 5
10 - 5
10 * 5
10 / 5
-&gt;결과: 15
5
50
2</p>
<h4 id="비교-연산">비교 연산</h4>
<p>10 &gt; 5 -&gt; true
10 &lt; 5 -&gt; false
10 === 10 -&gt; true</p>
<h4 id="논리-연산">논리 연산</h4>
<ul>
<li>OR
true || false -&gt; true</li>
<li>AND
true &amp;&amp; false -&gt; false</li>
<li>NOT
!true -&gt; false</li>
</ul>
<h2 id="9조건문conditional">9.조건문(Conditional)</h2>
<p>: 조건에 따라 다른 코드를 실행. <code>if</code>,<code>else</code>,<code>switch</code></p>
<p>const age = 20;</p>
<p>if(age &gt;= 20){
    console.log(&quot;성인&quot;);
}
-&gt; 결과: 성인</p>
<ul>
<li>else</li>
</ul>
<p>if(age &gt;=20){
    console.log(&quot;성인&quot;);
}else{
    console.log(&quot;미성년자&quot;);
}</p>
<h2 id="10반복문loop">10.반복문(Loop)</h2>
<p>: 같은 코드를 여러 번 실행. <code>for</code>,<code>while</code></p>
<h4 id="for">for</h4>
<p>for(let i=1; i&lt;=5; i++){
    console.log(i);
}
-&gt; 결과: 1
2
3
4
5</p>
<h4 id="while">while</h4>
<p>let i=1;</p>
<p>while(i&lt;=5){
    console.log(i);
    i++;
}</p>
<h2 id="11함수function">11.함수(Function)</h2>
<p>: 여러 줄의 코드를 하나로 묶어 필요할 떄 실행하는 기능</p>
<p>function hello(){
    console.log(&quot;안녕하세요&quot;);
}
실행 -&gt; hello(); -&gt; 결과: 안녕하세요</p>
<p>매개변수
function hello(name){
    console.log(name);
}</p>
<p>hello(&quot;Mike&quot;);
-&gt; 결과: Mike
반환값
function add(a,b){
    return a+b;
}</p>
<p>console.log(add(3,5));
-&gt; 결과: 8</p>
<h2 id="12객체object">12.객체(Object)</h2>
<p>: 관련된 데이터를 하나로 묶는 자료형, 속성으로 데이터를 저장함.</p>
<p>관련된 정보를 하나로 묶는다:
const person = {
    name:&quot;Mike&quot;,
    age:20
};
꺼내기:
console.log(person.name); -&gt; Mike</p>
<p>console.log(person.age); 
-&gt; 20</p>
<h2 id="13배열array">13.배열(Array)</h2>
<p>: 여러 개의 값을 순서대로 저장하는 자료형</p>
<p>여러 개의 값을 저장한다.
const fruits = [
    &quot;사과&quot;,
    &quot;바나나&quot;,
    &quot;포도&quot;
];</p>
<h4 id="첫-번째">첫 번째</h4>
<p>console.log(fruits[0]); 
-&gt; 사과</p>
<h4 id="두-번째">두 번째</h4>
<p>console.log(fruits[1]);
-&gt; 바나나</p>
<h4 id="길이">길이</h4>
<p>console.log(fruits.length);
-&gt; 3</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[react-router-dom]]></title>
            <link>https://velog.io/@_mieos/react-router-dom</link>
            <guid>https://velog.io/@_mieos/react-router-dom</guid>
            <pubDate>Fri, 10 Jul 2026 14:50:12 GMT</pubDate>
            <description><![CDATA[<h1 id="리액트-라우터react-router-dom">리액트 라우터(react-router-dom)</h1>
<ul>
<li>리액트(React)는 메타(구 페이스북)에서 개발한 웹 애플리케이션의 사용자 인터페이스(UI)를 만들기 위한 자바스크립트 라이브러리이다.</li>
<li>리액트 라우터(React Router)는 리액트 앱에서 페이지 이동을 구현할 때 사용하는 표준 라이브러리이다.</li>
</ul>
<hr>
<h2 id="1--react-router-dom이-필요한-이유">1.  react-router-dom이 필요한 이유</h2>
<p>전통적인 웹사이트(MPA, Multi Page Application)는 페이지를 이동할 때마다 서버에 새로운 HTML 파일을 요청한다. 이 과정에서 화면 전체가 순간적으로 깜빡이며 <strong>새로고침</strong>된다.</p>
<p>하지만 리액트는 <strong>SPA(Single Page Application)</strong> 방식을 사용한다. 
SPA는 처음에 HTML을 딱 한 장만 받아두고, 주소가 바뀔 때마다 자바스크립트가 필요한 부분의 컴포넌트(화면 조각)만 동적으로 갈아끼우는 방식이다.</p>
<p>이때 <strong>주소창의 URL이 바뀜에 따라 어떤 컴포넌트를 화면에 보여줄지</strong> 결정하고 관리해 주는 내비게이션 역할을 하는 라이브러리가 바로 <code>react-router-dom</code>이다.</p>
<hr>
<h2 id="2-패키지-설치">2. 패키지 설치</h2>
<p>리액트 프로젝트 폴더의 터미널에 아래 명령어를 입력하여 라이브러리를 설치한다.</p>
<p>```bash
npm install react-router-dom</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[fetch & axios
]]></title>
            <link>https://velog.io/@_mieos/fetch-axios</link>
            <guid>https://velog.io/@_mieos/fetch-axios</guid>
            <pubDate>Tue, 07 Jul 2026 07:19:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/10f31420-83bd-40c6-81f8-e81a698217bc/image.jpg" alt=""></p>
<h2 id="fetch--axios">fetch &amp; axios</h2>
<p>서버와 비동기 통신을 하기 위해 자바스크립트에서 사용하는 가장 대표적인 두 가지 방법이다.</p>
<h3 id="1-fetch-api">1. fetch API</h3>
<p>브라우저에 기본적으로 내장되어 있는 API로, 별도의 설치 없이 즉시 사용할  수 있는 자바스크립트 내장 기능이다.</p>
<ul>
<li>장점: 내장 기능이기 때문에 외부 라이브러리 설치가 필요 없고, 프로젝트의 무게가 가벼워진다.</li>
<li>단점: 구형 브라우저 지원이 부족하며, 기능이 단순하여 개발자가 직접 추가로 코딩해야 하는 부분이 많다.</li>
</ul>
<h3 id="fetch의-특징">fetch의 특징</h3>
<ul>
<li>데이터를 보낼 때 객체를 문자열로 직접 변환(<code>JSON.stringify()</code>)해서 보내야 한다.</li>
<li>데이터를 받을 때도 response 데이터를 한 번 더 JSON 형식으로 변환(<code>response.json()</code>)하는 과정이 필요하다.</li>
<li>서버에서 에러가 발생해도(예:404, 500 에러) 통신 자체는 성공한 것으로 간주하여 에러를 자동으로 잡아내지 못한다.</li>
</ul>
<h3 id="2-axios">2. axios</h3>
<p>웹 브라우저와 Node.js 환경 모두에서 사용할 수 있는 별도의 외부 라이브러리(패키지)이다.</p>
<ul>
<li>장점: 기능이 매우 다양하고 편리하며, 구형 브라우저와의 호환성이 뛰어나 실무 및 대규모 프로젝트에서 가장 많이 쓰인다.</li>
<li>단점: 외부 라이브러리이기 때문에 설치 과정(<code>npm install axios</code>)이 필요하다.</li>
</ul>
<h3 id="axios의-특징">axios의 특징</h3>
<ul>
<li>서버와 데이터를 주고받을 때 자동으로 JSON 변환을 처리해 주므로 코드가 간결하다.</li>
<li>서버가 에러 상태 코드(예: 404 Not Found, 500 Server Error)를 반환하면 자동으로 에러를 인지하고 <code>catch</code>블록으로 넘겨준다.</li>
<li>요청을 보내기 전이나 응답을 받기 전에 가로채서 특정 작업(예: 로그인 토큰 검사)을 수행할 수 있는 인터셉터 기능을 제공한다.</li>
</ul>
<table>
<thead>
<tr>
<th align="left">특징 / 기능</th>
<th align="left">fetch API</th>
<th align="left">axios</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>설치 여부</strong></td>
<td align="left">설치 없음 (브라우저 내장)</td>
<td align="left">필요 (<code>npm</code> 또는 <code>CDN</code>)</td>
</tr>
<tr>
<td align="left"><strong>자동 JSON 변환</strong></td>
<td align="left">지원 안 함 (수동 변환 필수)</td>
<td align="left"><strong>자동 지원</strong></td>
</tr>
<tr>
<td align="left"><strong>에러 핸들링</strong></td>
<td align="left">404, 500 에러를 직접 걸러내야 함</td>
<td align="left"><strong>상태 코드 에러 시 자동 실패 처리</strong></td>
</tr>
<tr>
<td align="left"><strong>기능 확장성</strong></td>
<td align="left">단순하고 직관적임</td>
<td align="left">인터셉터 등 강력한 실무 기능 제공</td>
</tr>
</tbody></table>
]]></description>
        </item>
        <item>
            <title><![CDATA[API & 오픈 API ]]></title>
            <link>https://velog.io/@_mieos/API-%EC%98%A4%ED%94%88-API</link>
            <guid>https://velog.io/@_mieos/API-%EC%98%A4%ED%94%88-API</guid>
            <pubDate>Tue, 07 Jul 2026 06:56:18 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/f2c0751c-a364-4276-b8d9-4a81ce862cc0/image.jpg" alt=""></p>
<h2 id="api응용-프로그램-프로그래밍-인터페이스">API(응용 프로그램 프로그래밍 인터페이스)</h2>
<p>서로 다른 소프트웨어가 서로 통신하고 데이터를 주고받을 수 있게 해주는 연결 고리이다.</p>
<h3 id="--api의-역할">- API의 역할</h3>
<p>: 앱과 서버 간의 소통 창구이다. 예를 들어, 날씨 앱이 자체적으로 모든 날씨 정보를 생산하지 않고 기상청의 서버에 데이터를 요청하고 응답받아 화면에 띄우는 과정이 대표적인 API의 활용이다.</p>
<h2 id="오픈-api">오픈 API</h2>
<p>이 인터페이스를 누구나 제한 없이 사용할 수 있도록 외부에 공개한 것을 의미한다.</p>
<h3 id="--오픈-api란">- 오픈 API란?</h3>
<p>특정 기업이나 기관이 보유한 기능과 데이터를 외부 개발자들이 자유롭게 활용할 수 있도록 개방한 퍼블릭 API이다. 이를 통해 개발자는 방대한 데이터를 처음부터 수집할 필요 없이 효율적인 앱과 서비스를 만들 수 있다.</p>
<ul>
<li>공공 데이터: 정부 및 공공기관의 데이터를 활용할 수 있는 대한민국 공공데이터포털이나 서울열린데이터광장에서 실시간 버스/지하철 정보, 날씨 등을 제공한다.</li>
<li>AI 및 기계학습: OpenAI API를 통해 ChatGPT와 같은 강력한 언어 모델을 자체 서비스에 연동할 수 있다.</li>
<li>지도 및 위치: 지도 데이터를 앱에 그대로 가져다 쓸 수 있도록 네이버 지도나 카카오 맵 등에서 오픈 API를 제공한다.</li>
</ul>
<p>오픈API를 사용하려면 일반적으로 해당 제공 사이트에서 회원가입 후 인증키(API Key)를 발급받아야 하며, 이를 통해 호출 권한을 얻고 데이터를 받아올 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버통신]]></title>
            <link>https://velog.io/@_mieos/%EC%84%9C%EB%B2%84%ED%86%B5%EC%8B%A0</link>
            <guid>https://velog.io/@_mieos/%EC%84%9C%EB%B2%84%ED%86%B5%EC%8B%A0</guid>
            <pubDate>Tue, 07 Jul 2026 06:37:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/43b6a20b-fdd7-4652-89f5-98fc4b41c2b1/image.jpg" alt=""></p>
<h2 id="통신이란">통신이란?</h2>
<p>사람/기계들 간에 여러 종류의 매체를 이용해 정보를 전달하는 과정이다. 전화, 이메일 등 우리가 살아가면서 하는 모든 온라인상의 커뮤니케이션이 통신에 속한다.<img src="https://velog.velcdn.com/images/_mieos/post/d1495681-796e-469a-a927-0eea00975101/image.png" alt=""></p>
<h3 id="방식">방식</h3>
<ol>
<li>데이터 형식(데이터가 어떤 형태의 &#39;문자&#39;나 &#39;신호&#39;로 이루어져 있는가에 따른 분류이다.)</li>
</ol>
<ul>
<li><p>텍스트 기반: 사람이 메모장으로 열어도 읽을 수 있는 문자 형태이다.
ex) HTML, JSON, XML</p>
</li>
<li><p>바이너리 기반: 컴퓨터가 처리하기 빠른 0과 1의 이진 데이터 형태이다.
ex) gRPC, 이미지/동영상 파일, 이미지 스트리밍</p>
</li>
</ul>
<ol start="2">
<li>전송 방향(데이터가 어느 쪽으로 흐를 수 있는가에 따른 분류이다.)</li>
</ol>
<ul>
<li><p>단방향: 오직 한쪽 방향으로만 송신한다.
ex) 단방향 브로드캐스트</p>
</li>
<li><p>양방향(주고받는 것이 모두 가능하며, 두 가지로 나뉜다.)</p>
<ul>
<li>반이중: 양방향 소통은 되지만 동시는 불가능해 번갈아 가며 전송한다.
ex) 무전기, 일반 HTTP 요청-응답</li>
<li>전이중: 동시에 양방향으로 데이터를 주고받는다.
ex) 전화기, 웹소켓, 네트워크 소켓 통신</li>
</ul>
</li>
</ul>
<ol start="3">
<li>연결 방식(데이터를 보내기 전에 상대방과 통로를 개설하는가에 따른 분류이다.)</li>
</ol>
<ul>
<li><p>연결 지향:먼저 안전하게 연결을 확인하고 데이터를 보낸다. 신뢰성이 높다.
ex) TCP 프로토콜(웹 브라우징, 파일 다운로드)</p>
</li>
<li><p>비연결 지향: 연결 과정 없이 데이터를 목적지를 향해 던진다. 속도가 매우 빠르다
ex) UDP 프로토콜(실시간 온라인 게임, 실시간 라이브 영상 스트리밍)</p>
</li>
</ul>
<ol start="4">
<li>데이터 처리 타이밍</li>
</ol>
<ul>
<li>동기식: 요청을 보낸 후 응답(결과)이 올 때까지 다음 작업을 멈추고 대기한다.</li>
<li>비동기식: 요청을 보낸 후 응답 여부와 상관없이 즉시 다음 작업을 계속 수행한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[퍼블리싱 ]]></title>
            <link>https://velog.io/@_mieos/%ED%8D%BC%EB%B8%94%EB%A6%AC%EC%8B%B1</link>
            <guid>https://velog.io/@_mieos/%ED%8D%BC%EB%B8%94%EB%A6%AC%EC%8B%B1</guid>
            <pubDate>Tue, 07 Jul 2026 05:26:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/7e3515b9-c292-4b7e-9e7b-645a25d18291/image.webp" alt=""></p>
<h2 id="퍼블리싱">퍼블리싱</h2>
<h3 id="웹-퍼블리싱이란">웹 퍼블리싱이란?</h3>
<p>웹 퍼블리싱은 웹 디자이너가 만든 시각적 디자인을 웹 브라우저에서 실제 작동 가능한 웹 페이지로 구현하는 작업이다. HTML, CSS, JavaScript를 사용하여 뼈대를 잡고, 스타일을 적용하며, 동적 기능을 추가한다. 이를 전문적으로 담당하는 사람을 &#39;웹 퍼블러셔&#39;라고 부르며,<strong>디자이너와 프론트엔드 개발자 사이의 가교(다리) 역할</strong> 을 한다.</p>
<h4 id="1-웹-퍼블리싱-작업에-필요한-것">1. 웹 퍼블리싱 작업에 필요한 것</h4>
<ul>
<li>HTML(뼈대)<pre><code>&lt;!doctype html&gt;  &lt;!-- HTML5 버전이 쓰임. HTML 버전마다 들어가는 마커가 다름 --&gt;
&lt;html&gt;
&lt;head&gt; &lt;!-- head에는 제목, meta, css, js 적용 등 셋팅. 제목, 파비콘, 유니코드에 대한거, css 외부꺼를 뭘 가져올건지에 대해
웹페이지의 전반적인 셋팅 내용을 적어준다. --&gt;
  &lt;title&gt;제목을 적어보자&lt;/title&gt;  
&lt;/head&gt;
&lt;body&gt;&lt;!--body에는 실질적인 코드가 들어간다 --&gt;
  &lt;p&gt;Hello World!&lt;/p&gt;
&lt;/body&gt;
&lt;footer&gt; &lt;!-- 이용약관, 저작권 등에 대한 부분. 요즘에는 바디에도 많이 넣어놓음 --&gt;
&lt;/footer&gt;  
</code></pre></li>
</ul>
</html>
```
- CSS(데코레이션)
```
p{
    font-size: 110%;
    font-family: garamond, sans-serif;
}
h2{
    color: red;
    background: white;
}
```
- JavaScript(행동을 부여)
```
<script type="text/javascript">
document.write('<p>Hello world!</p>');
</script>
```
#### 2. 웹 퍼블리싱의 기술
웹 퍼블리싱은 다음 세 가지 언어를 조합하여 하나의 웹 페이지를 만든다.
- HTML(뼈대):마크업이라고 불린다.디자인이 되어 있는 부분을 웹 문서화 시켜준다. 제목, 본문, 이미지, 링크 등 웹 페이지에 들어갈 컨텐츠의 구조를 정의한다.
- CSS(데코레이션): 글자 크기, 색상, 정렬, 레이아웃 등 HTML로 만든 뼈대를 예쁘게 디자인한다.
- JavaScript(행동을 부여): 버튼을 누르면 팝업이 뜨거나, 이미지가 슬라이드되는 등 역동적인 움직임과 기능을 추가합니다.


<h4 id="3-웹-퍼블리셔의-역할">3. 웹 퍼블리셔의 역할</h4>
<p>과거에는 단순히 화면을 그대로 그리는 역할에 그쳤지만, 현대의 퍼블리싱은 다음과 같은 중요한 요구 조건을 충족해야 한다.</p>
<ul>
<li>반응현 웹(Responsive Web): Pc, 태블릿, 모바일 등 화면 크
기에 맞춰 레이아웃이 자동으로 변하도록 만든다.</li>
<li>웹 표준 &amp; 웹 접근성: 크롬, 사파리, 엣지 등 어떤 브라우저에서도 똑같이 보이고, 시각 장애인용 스크린 리더 프로그램도 사이트를 잘 읽을 수 있도록 표준 규칙에 맞춰 코딩한다.</li>
<li>크로스 브라우징: 구형 브라우저부터 최신 브라우저까지 깨짐 없이 화면이 잘 나오도록 검수한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Eslint, Prettier]]></title>
            <link>https://velog.io/@_mieos/Eslint-Prettier</link>
            <guid>https://velog.io/@_mieos/Eslint-Prettier</guid>
            <pubDate>Sat, 04 Jul 2026 06:43:22 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/17e0ec4e-efd1-4b4a-a536-20335e992348/image.jpg" alt=""></p>
<h2 id="eslint란">Eslint란?</h2>
<h4 id="eslint는-javascript와-typescript-코드에서-문법-오류나-코드-스타일-문제를-찾아주는-도구이다">Eslint는 JavaScript와 TypeScript 코드에서 문법 오류나 코드 스타일 문제를 찾아주는 도구이다.</h4>
<p>개발자가 실수한 부분을 미리 알려주기 때문에 오류를 줄이고, 여러 사람이 함께 개발할 때 일관된 코드를 작성하는 데 도움이 된다.</p>
<h3 id="주요-기능">주요 기능</h3>
<ul>
<li>문법 오류 검사</li>
<li>사용하지 않는 변수 확인</li>
<li>코드 스타일 검사</li>
<li>프로젝트 규칙 적용</li>
</ul>
<h2 id="예시">예시</h2>
<h3 id="❌-eslint-경고">❌ ESLint 경고</h3>
<pre><code class="language-javascript">let a = 10;
let b = 20;

console.log(a);</code></pre>
<p>위 코드에서는 <code>b</code>를 사용하지 않았기 때문에 ESLint가 <strong>사용하지 않는 변수(<code>no-unused-vars</code>)</strong>라고 경고한다.</p>
<hr>
<h2 id="prettier란">Prettier란?</h2>
<h4 id="prettier는-코드의-들여쓰기-줄바꿈-따옴표-등의-형식을-자동으로-맞춰주는-코드-포맷터이다">Prettier는 코드의 들여쓰기, 줄바꿈, 따옴표 등의 형식을 자동으로 맞춰주는 코드 포맷터이다.</h4>
<p>개발자가 직접 코드를 정리하지 않아도 일정한 스타일로 자동 저장해 준다.</p>
<h3 id="주요-기능-1">주요 기능</h3>
<ul>
<li>들여쓰기 자동 정렬</li>
<li>코드 줄바꿈</li>
<li>따옴표 통일</li>
<li>세미콜론 자동 정리</li>
<li>코드 가독성 향상</li>
</ul>
<h3 id="🎨-prettier-예시">🎨 Prettier 예시</h3>
<h4 id="정리-전">정리 전</h4>
<pre><code class="language-javascript">function hello(){console.log(&quot;Hello&quot;)}</code></pre>
<h4 id="정리-후">정리 후</h4>
<pre><code class="language-javascript">function hello() {
  console.log(&quot;Hello&quot;);
}</code></pre>
<p>Prettier는 코드의 들여쓰기, 줄바꿈, 세미콜론 등을 자동으로 정리하여 가독성을 높여준다.</p>
<h2 id="eslint와-prettier의-차이점">EsLint와 Prettier의 차이점</h2>
<table>
<thead>
<tr>
<th>ESLint</th>
<th>Prettier</th>
</tr>
</thead>
<tbody><tr>
<td>코드 오류를 검사</td>
<td>코드 형식을 자동 정리</td>
</tr>
<tr>
<td>잘못된 문법을 알려줌</td>
<td>보기 좋은 코드로 변경</td>
</tr>
<tr>
<td>코드 품질 향상</td>
<td>코드 스타일 통일</td>
</tr>
</tbody></table>
<p>ESLint는 코드의 오류를 검사하는 도구이고, Prettier는 코드의 형식을 자동으로 정리하는 도구</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[TailwindCSS]]></title>
            <link>https://velog.io/@_mieos/TailwindCSS-qzgoqizl</link>
            <guid>https://velog.io/@_mieos/TailwindCSS-qzgoqizl</guid>
            <pubDate>Wed, 03 Jun 2026 23:30:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/ddc11ad5-def1-48fb-a104-3967b1f14ac7/image.webp" alt=""></p>
<h2 id="tailwindcss란">TailwindCSS란?</h2>
<p>TailwindCSS는 <strong>유틸리티 퍼스트(Utility-First)</strong> CSS 프레임워크입니다.</p>
<p>HTML 클래스 속성 안에 스타일을 바로 작성하는 방식입니다. 별도의 CSS 파일 없이도 스타일링이 가능합니다.</p>
<p>예를 들어 버튼을 만들 때 기존 방식이랑 비교하면 이렇습니다:</p>
<pre><code class="language-css">/* 기존 방식 - styles.css */
.btn {
  background-color: #3b82f6;
  color: white;
  padding: 8px 16px;
  border-radius: 6px;
}</code></pre>
<pre><code class="language-html">&lt;!-- 기존 방식 - HTML --&gt;
&lt;button class=&quot;btn&quot;&gt;클릭&lt;/button&gt;</code></pre>
<pre><code class="language-html">&lt;!-- Tailwind 방식 --&gt;
&lt;button class=&quot;bg-blue-500 text-white px-4 py-2 rounded&quot;&gt;클릭&lt;/button&gt;</code></pre>
<p>처음에는 클래스가 너무 많았는데, HTML 파일 하나에서 스타일까지 바로 확인할 수 있다는 점이 생각보다 편리했습니다.</p>
<hr>
<h2 id="기존-css와-비교">기존 CSS와 비교</h2>
<table>
<thead>
<tr>
<th></th>
<th>기존 CSS</th>
<th>TailwindCSS</th>
</tr>
</thead>
<tbody><tr>
<td>스타일 위치</td>
<td>별도 <code>.css</code> 파일</td>
<td>HTML 클래스 안에 바로</td>
</tr>
<tr>
<td>클래스 이름</td>
<td>직접 지음 (<code>.card</code>, <code>.btn</code>...)</td>
<td>미리 정의된 유틸리티 클래스 사용</td>
</tr>
<tr>
<td>작업 흐름</td>
<td>HTML ↔ CSS 파일 왔다갔다</td>
<td>HTML 한 파일에서 작업 가능</td>
</tr>
<tr>
<td>빌드 결과물</td>
<td>안 쓰는 CSS도 포함될 수 있음</td>
<td>실제 사용한 클래스만 포함</td>
</tr>
</tbody></table>
<hr>
<h2 id="설치-방법">설치 방법</h2>
<h3 id="빠르게-테스트해보고-싶다면-cdn">빠르게 테스트해보고 싶다면 (CDN)</h3>
<p><code>&lt;head&gt;</code> 안에 한 줄 추가하면 바로 사용할 수 있습니다:</p>
<pre><code class="language-html">&lt;script src=&quot;https://cdn.tailwindcss.com&quot;&gt;&lt;/script&gt;</code></pre>
<p>다만 이 방법은 학습용이고, 실제 프로젝트에는 npm 설치를 권장한다고 합니다.</p>
<h3 id="npm으로-설치하기-일반-프로젝트">npm으로 설치하기 (일반 프로젝트)</h3>
<pre><code class="language-bash">npm install -D tailwindcss
npx tailwindcss init</code></pre>
<p>설치하면 <code>tailwind.config.js</code> 파일이 생기는데, 여기서 <code>content</code> 항목에 내 파일 경로를 적어줘야 합니다. 이걸 안 하면 클래스가 빌드 결과물에 포함이 안 됩니다.</p>
<pre><code class="language-js">/** @type {import(&#39;tailwindcss&#39;).Config} */
module.exports = {
  content: [&quot;./src/**/*.{html,js}&quot;],  // 내 파일 경로에 맞게 수정
  theme: {
    extend: {},
  },
  plugins: [],
}</code></pre>
<p>그다음 CSS 파일을 만들고 (<code>src/input.css</code>):</p>
<pre><code class="language-css">@tailwind base;
@tailwind components;
@tailwind utilities;</code></pre>
<p>빌드 명령어 실행:</p>
<pre><code class="language-bash">npx tailwindcss -i ./src/input.css -o ./dist/output.css --watch</code></pre>
<p><code>--watch</code>를 붙이면 파일을 저장할 때마다 자동으로 빌드됩니다.</p>
<h3 id="react--vite-프로젝트">React + Vite 프로젝트</h3>
<p>요즘 많이 쓰이는 조합이라 따로 정리했습니다:</p>
<pre><code class="language-bash">npm create vite@latest my-app -- --template react
cd my-app
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p</code></pre>
<p><code>-p</code> 옵션을 붙이면 <code>postcss.config.js</code>도 같이 만들어집니다.</p>
<hr>
<h2 id="클래스-규칙-이해하기">클래스 규칙 이해하기</h2>
<p>Tailwind 클래스에는 일정한 규칙이 있습니다. </p>
<pre><code>[속성]-[값]</code></pre><pre><code>text-red-500   →  color: 빨간색 계열
bg-blue-300    →  background: 파란색 계열 (연한 편)
p-4            →  padding: 1rem
mt-8           →  margin-top: 2rem
flex           →  display: flex
rounded-lg     →  border-radius: 0.5rem</code></pre><h3 id="숫자-크기-단위">숫자 크기 단위</h3>
<p><strong>Tailwind에서 숫자 1 = 0.25rem = 4px</strong></p>
<table>
<thead>
<tr>
<th>클래스</th>
<th>실제 크기</th>
</tr>
</thead>
<tbody><tr>
<td><code>p-1</code></td>
<td>4px</td>
</tr>
<tr>
<td><code>p-2</code></td>
<td>8px</td>
</tr>
<tr>
<td><code>p-4</code></td>
<td>16px (1rem)</td>
</tr>
<tr>
<td><code>p-8</code></td>
<td>32px (2rem)</td>
</tr>
<tr>
<td><code>p-16</code></td>
<td>64px (4rem)</td>
</tr>
</tbody></table>
<p><strong>4 = 1rem = 16px</strong> 이게 기준점이라고 생각하기</p>
<h3 id="색상-숫자-규칙">색상 숫자 규칙</h3>
<p>색상 숫자는 작을수록 밝고, 클수록 어둡습니다.</p>
<pre><code>gray-50   → 거의 흰색
gray-300  → 연한 회색
gray-500  → 중간 회색
gray-700  → 진한 회색
gray-900  → 거의 검정</code></pre><hr>
<h2 id="자주-쓰이는-클래스-정리">자주 쓰이는 클래스 정리</h2>
<h3 id="여백-padding--margin">여백 (Padding / Margin)</h3>
<pre><code class="language-html">&lt;!-- Padding --&gt;
&lt;div class=&quot;p-4&quot;&gt;       &lt;!-- 상하좌우 모두 16px --&gt;
&lt;div class=&quot;px-4&quot;&gt;      &lt;!-- 좌우만 --&gt;
&lt;div class=&quot;py-4&quot;&gt;      &lt;!-- 상하만 --&gt;
&lt;div class=&quot;pt-4 pb-2&quot;&gt; &lt;!-- 위 16px, 아래 8px --&gt;

&lt;!-- Margin --&gt;
&lt;div class=&quot;mt-4&quot;&gt;      &lt;!-- 위쪽만 --&gt;
&lt;div class=&quot;mx-auto&quot;&gt;   &lt;!-- 좌우 auto (수평 가운데 정렬) --&gt;
&lt;div class=&quot;mb-0&quot;&gt;      &lt;!-- 아래 여백 제거 --&gt;</code></pre>
<p><code>mx-auto</code>는 컨테이너를 가운데 정렬할 때 많이 쓰이는 것 같습니다. <code>max-w-xl mx-auto</code> 이렇게 세트로 자주 보입니다.</p>
<h3 id="텍스트">텍스트</h3>
<pre><code class="language-html">&lt;p class=&quot;text-sm&quot;&gt;     &lt;!-- 14px --&gt;
&lt;p class=&quot;text-base&quot;&gt;   &lt;!-- 16px, 기본 --&gt;
&lt;p class=&quot;text-lg&quot;&gt;     &lt;!-- 18px --&gt;
&lt;p class=&quot;text-xl&quot;&gt;     &lt;!-- 20px --&gt;
&lt;p class=&quot;text-2xl&quot;&gt;    &lt;!-- 24px --&gt;
&lt;p class=&quot;text-4xl&quot;&gt;    &lt;!-- 36px --&gt;

&lt;p class=&quot;font-bold&quot;&gt;       &lt;!-- 굵게 --&gt;
&lt;p class=&quot;font-semibold&quot;&gt;   &lt;!-- 약간 굵게 --&gt;
&lt;p class=&quot;text-center&quot;&gt;     &lt;!-- 가운데 정렬 --&gt;
&lt;p class=&quot;leading-relaxed&quot;&gt; &lt;!-- 줄간격 넓게 --&gt;</code></pre>
<h3 id="flexbox">Flexbox</h3>
<p>레이아웃 잡을 때 flex를 제일 많이 사용하게 됩니다:</p>
<pre><code class="language-html">&lt;div class=&quot;flex&quot;&gt;                 &lt;!-- 가로 배치 --&gt;
&lt;div class=&quot;flex flex-col&quot;&gt;        &lt;!-- 세로 배치 --&gt;
&lt;div class=&quot;flex items-center&quot;&gt;    &lt;!-- 세로 중앙 정렬 --&gt;
&lt;div class=&quot;flex justify-center&quot;&gt;  &lt;!-- 가로 중앙 정렬 --&gt;
&lt;div class=&quot;flex justify-between&quot;&gt; &lt;!-- 양 끝에 배치 --&gt;
&lt;div class=&quot;flex gap-4&quot;&gt;           &lt;!-- 아이템 간격 16px --&gt;
&lt;div class=&quot;flex flex-wrap&quot;&gt;       &lt;!-- 넘치면 줄 바꿈 --&gt;</code></pre>
<h3 id="grid">Grid</h3>
<pre><code class="language-html">&lt;div class=&quot;grid grid-cols-2 gap-4&quot;&gt;  &lt;!-- 2열 그리드 --&gt;
&lt;div class=&quot;grid grid-cols-3 gap-6&quot;&gt;  &lt;!-- 3열 그리드 --&gt;</code></pre>
<h3 id="크기">크기</h3>
<pre><code class="language-html">&lt;div class=&quot;w-full&quot;&gt;           &lt;!-- 너비 100% --&gt;
&lt;div class=&quot;w-1/2&quot;&gt;            &lt;!-- 너비 50% --&gt;
&lt;div class=&quot;w-64&quot;&gt;             &lt;!-- 너비 256px --&gt;
&lt;div class=&quot;h-screen&quot;&gt;         &lt;!-- 높이 100vh --&gt;
&lt;div class=&quot;max-w-lg&quot;&gt;         &lt;!-- 최대 너비 512px --&gt;
&lt;div class=&quot;max-w-2xl mx-auto&quot;&gt;&lt;!-- 컨테이너로 자주 쓰는 패턴 --&gt;</code></pre>
<h3 id="테두리--그림자">테두리 &amp; 그림자</h3>
<pre><code class="language-html">&lt;div class=&quot;rounded&quot;&gt;       &lt;!-- 살짝 둥글게 --&gt;
&lt;div class=&quot;rounded-lg&quot;&gt;    &lt;!-- 더 둥글게 --&gt;
&lt;div class=&quot;rounded-xl&quot;&gt;    &lt;!-- 많이 둥글게 --&gt;
&lt;div class=&quot;rounded-full&quot;&gt;  &lt;!-- 완전 원형 --&gt;

&lt;div class=&quot;border border-gray-200&quot;&gt; &lt;!-- 회색 테두리 --&gt;

&lt;div class=&quot;shadow&quot;&gt;     &lt;!-- 기본 그림자 --&gt;
&lt;div class=&quot;shadow-md&quot;&gt;  &lt;!-- 중간 그림자 --&gt;
&lt;div class=&quot;shadow-lg&quot;&gt;  &lt;!-- 큰 그림자 --&gt;</code></pre>
<hr>
<h2 id="반응형-디자인">반응형 디자인</h2>
<p>Tailwind는 <strong>모바일 퍼스트</strong> 방식입니다. 접두사 없는 클래스가 기본(모바일)이고, 접두사를 붙여서 큰 화면의 스타일을 추가합니다.</p>
<table>
<thead>
<tr>
<th>접두사</th>
<th>적용 시점</th>
</tr>
</thead>
<tbody><tr>
<td>(없음)</td>
<td>모든 화면 (모바일 기준)</td>
</tr>
<tr>
<td><code>sm:</code></td>
<td>640px 이상</td>
</tr>
<tr>
<td><code>md:</code></td>
<td>768px 이상</td>
</tr>
<tr>
<td><code>lg:</code></td>
<td>1024px 이상</td>
</tr>
<tr>
<td><code>xl:</code></td>
<td>1280px 이상</td>
</tr>
</tbody></table>
<p>사용 예시:</p>
<pre><code class="language-html">&lt;!-- 모바일: 1열 / 태블릿: 2열 / 데스크탑: 3열 --&gt;
&lt;div class=&quot;grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4&quot;&gt;
  ...
&lt;/div&gt;

&lt;!-- 모바일에서는 숨기고, 데스크탑에서만 표시 --&gt;
&lt;div class=&quot;hidden lg:block&quot;&gt;
  데스크탑에서만 보입니다
&lt;/div&gt;

&lt;!-- 화면 크기에 따라 텍스트 크기 조절 --&gt;
&lt;h1 class=&quot;text-2xl md:text-3xl lg:text-5xl font-bold&quot;&gt;
  제목
&lt;/h1&gt;</code></pre>
<p>미디어 쿼리를 별도로 작성하지 않아도 돼서 편리합니다.</p>
<hr>
<h2 id="상태에-따른-스타일-hover-focus-등">상태에 따른 스타일 (hover, focus 등)</h2>
<p>인터랙션 스타일도 접두사를 붙이는 방식으로 처리합니다:</p>
<pre><code class="language-html">&lt;!-- 마우스 올렸을 때 --&gt;
&lt;button class=&quot;bg-blue-500 hover:bg-blue-600&quot;&gt;버튼&lt;/button&gt;

&lt;!-- 포커스 상태 --&gt;
&lt;input class=&quot;border focus:border-blue-500 focus:outline-none&quot;&gt;

&lt;!-- 비활성화 상태 --&gt;
&lt;button class=&quot;bg-blue-500 disabled:opacity-50 disabled:cursor-not-allowed&quot;&gt;
  비활성화
&lt;/button&gt;</code></pre>
<p>전환 효과도 간단하게 추가할 수 있습니다:</p>
<pre><code class="language-html">&lt;button class=&quot;bg-blue-500 hover:bg-blue-600 transition-colors duration-200&quot;&gt;
  부드럽게 색상 변경
&lt;/button&gt;</code></pre>
<hr>
<h2 id="다크-모드">다크 모드</h2>
<p><code>dark:</code> 접두사를 붙이면 다크 모드 스타일을 별도로 지정할 수 있습니다:</p>
<pre><code class="language-html">&lt;div class=&quot;bg-white dark:bg-gray-900&quot;&gt;
  &lt;h1 class=&quot;text-gray-900 dark:text-white&quot;&gt;제목&lt;/h1&gt;
  &lt;p class=&quot;text-gray-600 dark:text-gray-400&quot;&gt;본문 텍스트&lt;/p&gt;
&lt;/div&gt;</code></pre>
<p><code>tailwind.config.js</code>에서 방식을 설정할 수 있습니다:</p>
<pre><code class="language-js">// 시스템 설정을 따르는 방식 (기본값)
darkMode: &#39;media&#39;

// 클래스로 직접 제어하는 방식
darkMode: &#39;class&#39;</code></pre>
<hr>
<h2 id="블로그-카드-만들어보기">블로그 카드 만들어보기</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;script src=&quot;https://cdn.tailwindcss.com&quot;&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body class=&quot;bg-gray-100 min-h-screen flex items-center justify-center p-8&quot;&gt;

  &lt;div class=&quot;bg-white rounded-2xl shadow-lg overflow-hidden max-w-sm w-full
              transition-transform duration-200 hover:-translate-y-1 hover:shadow-xl&quot;&gt;

    &lt;!-- 썸네일 영역 --&gt;
    &lt;div class=&quot;bg-gradient-to-br from-indigo-400 to-purple-500 h-44
                flex items-center justify-center&quot;&gt;
      &lt;span class=&quot;text-6xl&quot;&gt;🛠️&lt;/span&gt;
    &lt;/div&gt;

    &lt;!-- 카드 내용 --&gt;
    &lt;div class=&quot;p-5&quot;&gt;

      &lt;!-- 카테고리 태그 --&gt;
      &lt;span class=&quot;text-xs font-semibold text-indigo-600 bg-indigo-50
                   px-2.5 py-1 rounded-full&quot;&gt;
        TailwindCSS
      &lt;/span&gt;

      &lt;!-- 제목 --&gt;
      &lt;h2 class=&quot;text-lg font-bold text-gray-900 mt-3 mb-1.5 leading-snug&quot;&gt;
        TailwindCSS 공부 중입니다
      &lt;/h2&gt;

      &lt;!-- 요약 내용 --&gt;
      &lt;p class=&quot;text-sm text-gray-500 leading-relaxed line-clamp-2&quot;&gt;
        CSS 파일 없이 HTML에서 바로 스타일을 적용하는 방식인데,
        생각보다 빠르게 UI를 만들 수 있어서 공부해보고 있습니다.
      &lt;/p&gt;

      &lt;!-- 하단 정보 --&gt;
      &lt;div class=&quot;flex items-center justify-between mt-4 pt-4 border-t border-gray-100&quot;&gt;
        &lt;div class=&quot;flex items-center gap-2&quot;&gt;
          &lt;div class=&quot;w-7 h-7 rounded-full bg-gradient-to-br from-pink-400 to-orange-400&quot;&gt;&lt;/div&gt;
          &lt;span class=&quot;text-sm font-medium text-gray-700&quot;&gt;작성자&lt;/span&gt;
        &lt;/div&gt;
        &lt;span class=&quot;text-xs text-gray-400&quot;&gt;2025. 1. 1&lt;/span&gt;
      &lt;/div&gt;

    &lt;/div&gt;
  &lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;</code></pre>
<hr>
<h2 id="공부하면서-헷갈렸던-부분들">공부하면서 헷갈렸던 부분들</h2>
<h3 id="오타가-나도-에러가-안-납니다">오타가 나도 에러가 안 납니다</h3>
<p>오타가 있으면 에러 없이 그냥 스타일이 적용이 안 됩니다.</p>
<pre><code class="language-html">&lt;!-- 오타가 있어도 에러 없음 (그냥 적용 안 됨) --&gt;
&lt;div class=&quot;backgroud-blue-500&quot;&gt;

&lt;!-- 정상 --&gt;
&lt;div class=&quot;bg-blue-500&quot;&gt;</code></pre>
<h3 id="react에서-동적-클래스-이름-조합-시-주의">React에서 동적 클래스 이름 조합 시 주의</h3>
<p>클래스 이름을 문자열로 조합하면 빌드에 포함이 안 됩니다:</p>
<pre><code class="language-jsx">// ❌ 이렇게 하면 빌드에 포함이 안 됩니다
const color = &#39;red&#39;;
&lt;div className={`text-${color}-500`}&gt;

// ✅ 완성된 클래스 이름을 사용해야 합니다
const cls = isError ? &#39;text-red-500&#39; : &#39;text-green-500&#39;;
&lt;div className={cls}&gt;</code></pre>
<p>Tailwind가 빌드 시 소스 파일을 스캔해서 완성된 클래스 이름만 인식하기 때문이다.</p>
<h3 id="기본-클래스에-없는-값을-쓰고-싶을-때">기본 클래스에 없는 값을 쓰고 싶을 때</h3>
<p>대괄호 안에 값을 직접 넣는 방법이 있습니다:</p>
<pre><code class="language-html">&lt;div class=&quot;w-[342px]&quot;&gt;
&lt;div class=&quot;bg-[#1da1f2]&quot;&gt;
&lt;div class=&quot;text-[13px]&quot;&gt;</code></pre>
<p>이걸 Arbitrary Values라고 부른다.</p>
<hr>
<h2 id="도움이-됐던-자료들">도움이 됐던 자료들</h2>
<ul>
<li><strong><a href="https://play.tailwindcss.com">play.tailwindcss.com</a></strong> — 설치 없이 바로 실습할 수 있어서 처음 감 잡을 때 많이 사용했습니다.</li>
<li><strong><a href="https://tailwindcss.com/docs">tailwindcss.com/docs</a></strong> — 공식 문서인데 Ctrl+K로 클래스 검색이 가능합니다. 클래스 이름이 기억 안 날 때마다 찾아봤습니다.</li>
<li><strong>VS Code Tailwind CSS IntelliSense</strong> — 자동완성과 실제 CSS 값 미리보기가 돼서 편리합니다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로젝트가 진행 되는 방법/순서]]></title>
            <link>https://velog.io/@_mieos/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%B0%80-%EC%A7%84%ED%96%89-%EB%90%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%88%9C%EC%84%9C</link>
            <guid>https://velog.io/@_mieos/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EA%B0%80-%EC%A7%84%ED%96%89-%EB%90%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%88%9C%EC%84%9C</guid>
            <pubDate>Thu, 30 Apr 2026 03:23:43 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/596a2664-dd36-4f6f-a8a4-eb63dd35a087/image.jpg" alt=""></p>
<h1 id="기능-명세서">기능 명세서</h1>
<h3 id="1-기능-명세서란">1. 기능 명세서란?</h3>
<ul>
<li>기능 명세서는 <strong>&quot;우리가 만들 서비스가 구체적으로 어떻게 움직여야 하는지&quot;</strong>를 상세하게 정의한 프로젝트 설계도입니다. 사용자의 행동에 대해 시스템이 어떻게 반응해야 하는지 기획자, 개발자, 디자이너가 미리 약속하는 공통의 설명서와 같습니다.</li>
</ul>
<h3 id="2-왜-필요한가">2. 왜 필요한가?</h3>
<ol>
<li><p>커뮤니케이션의 기준: 팀원 간의 오해를 줄이고 &quot;말하지 않아도 아는&quot; 상태를 만듭니다.</p>
</li>
<li><p>빈틈 없는 설계: 글로 정리하는 과정에서 놓치기 쉬운 예외 상황(에러 등)을 발견하게 됩니다.</p>
</li>
<li><p>QA(검증)의 기준: 제품이 완성되었을 때, &quot;제대로 만들어졌는지&quot;를 판단하는 유일한 근거가 됩니다.</p>
</li>
</ol>
<h3 id="3-핵심-용어-정리">3. 핵심 용어 정리</h3>
<p>🛠 시스템 로직 관련</p>
<ul>
<li><p>요구사항 (Requirement): 구현해야 할 목표 (&quot;로그인이 되어야 함&quot;)</p>
</li>
<li><p>비즈니스 로직 (Business Logic): 서비스 운영의 핵심 규칙 (&quot;포인트는 1,000원부터 사용 가능&quot;)</p>
</li>
<li><p>유효성 검사 (Validation): 입력값이 규칙에 맞는지 확인 (&quot;이메일 형식이 맞는가?&quot;)</p>
</li>
</ul>
<h4 id="🎨-화면-및-동작-관련">🎨 화면 및 동작 관련</h4>
<ul>
<li><p>인터랙션 (Interaction): 사용자 동작에 대한 시스템의 반응 (클릭, 스크롤, 애니메이션)</p>
</li>
<li><p>컴포넌트 (Component): 화면을 구성하는 부품 (버튼, 입력창, 모달 등)</p>
</li>
<li><p>플레이스홀더 (Placeholder): 입력창 안에 미리 적힌 안내 문구</p>
</li>
</ul>
<h4 id="⚠️-상황-및-상태-관련">⚠️ 상황 및 상태 관련</h4>
<ul>
<li><p>예외 처리 (Exception/Edge Case): 정상적이지 않은 상황 대비 (&quot;결제 중 인터넷 끊김&quot;)</p>
</li>
<li><p>상태 (State): 요소의 현재 모습 (기본, 마우스 올림(Hover), 비활성화(Disabled), 로딩 중)</p>
</li>
<li><p>디폴트 (Default): 설정된 기본값</p>
</li>
</ul>
<h3 id="4-기능-명세서-작성-흐름-step-by-step">4. 기능 명세서 작성 흐름 (Step-by-Step)</h3>
<h4 id="단계-1-목적-및-시나리오-정의">[단계 1] 목적 및 시나리오 정의</h4>
<ul>
<li><p>이 기능이 왜 필요한가?</p>
</li>
<li><p>사용자가 어떤 순서로 이 기능을 사용하는가? (User Flow)</p>
</li>
</ul>
<h4 id="단계-2-기능-요구사항-상세화">[단계 2] 기능 요구사항 상세화</h4>
<ul>
<li><p>정상 경로: 사용자가 모든 정보를 올바르게 입력했을 때의 동작.</p>
</li>
<li><p>상태 정의: 버튼이 언제 활성화되고, 언제 비활성화되는지 명시.</p>
</li>
</ul>
<h4 id="단계-3-예외-케이스edge-case-발굴">[단계 3] 예외 케이스(Edge Case) 발굴</h4>
<ul>
<li><p>잘못된 값을 입력하면 어떤 메시지를 보여주는가?</p>
</li>
<li><p>서버 오류가 나면 어떻게 안내하는가?</p>
</li>
</ul>
<h4 id="단계-4-데이터-및-화면-이동-정의">[단계 4] 데이터 및 화면 이동 정의</h4>
<ul>
<li><p>버튼을 누르면 어느 페이지로 이동하는가?</p>
</li>
<li><p>입력한 데이터는 어디로 전송되는가?</p>
</li>
</ul>
<h3 id="5-작성-시-주의할-점-작성-팁">5. 작성 시 주의할 점 (작성 팁)</h3>
<ul>
<li><p>명확성: &#39;적절히&#39;, &#39;빠르게&#39; 같은 모호한 단어 대신 &#39;3초 이내&#39;, &#39;빨간색 1px 테두리&#39; 등 수치를 사용하세요.</p>
</li>
<li><p>객관성: 누가 읽어도 똑같이 이해할 수 있도록 주관을 배제하고 서술하세요.</p>
</li>
<li><p>시각화: 텍스트만으로 부족할 때는 와이어프레임(그림)을 함께 첨부하는 것이 좋습니다.</p>
</li>
</ul>
<h3 id="6-요약">6. 요약</h3>
<ul>
<li>입력 (무엇을 넣고) → 검증 (규칙에 맞는지 보고) → 처리 (어떻게 계산해서) → 출력 (결과를 보여줌)</li>
</ul>
<h1 id="api-명세서">API 명세서</h1>
<h3 id="1-api-명세서란">1. API 명세서란?</h3>
<ul>
<li>API 명세서는 <strong>&quot;프론트엔드(화면)와 백엔드(서버)가 데이터를 주고받는 규칙&quot;</strong>을 상세히 기록한 문서입니다. 서로 다른 환경에서 작동하는 프로그램들이 어떤 언어로, 어떤 정보를, 어떤 순서로 소통할지 약속하는 데이터 통신 규약입니다.</li>
</ul>
<h3 id="2-왜-필요한가-1">2. 왜 필요한가?</h3>
<ol>
<li><p>독립적 개발 가능: 명세서만 있으면 서버 개발이 끝나지 않아도 프론트엔드 개발자가 가짜 데이터(Mock Data)로 화면을 먼저 만들 수 있습니다.</p>
</li>
<li><p>데이터 정확성: 어떤 값이 숫자인지, 문자인지 명시하여 데이터 전달 과정에서 발생하는 오류를 방지합니다.</p>
</li>
<li><p>협업 효율성: &quot;데이터를 어떻게 보내야 하나요?&quot;라고 일일이 묻지 않고 명세서를 통해 스스로 해결할 수 있습니다.</p>
</li>
</ol>
<h3 id="3-핵심-용어-정리-1">3. 핵심 용어 정리</h3>
<h4 id="📡-통신-기본-방식">📡 통신 기본 방식</h4>
<ul>
<li><p>Endpoint (엔드포인트): API가 자원에 접근할 수 있는 주소입니다. (예: /api/v1/users)</p>
</li>
<li><p>HTTP Method (메서드): 데이터에 어떤 행위를 할지 정하는 방식입니다.</p>
</li>
<li><p><code>GET</code>: 데이터 조회 (가져오기)</p>
</li>
<li><p><code>POST</code>: 데이터 생성 (보내기/저장하기)</p>
</li>
<li><p><code>PUT/PATCH</code>: 데이터 수정 (바꾸기)</p>
<ul>
<li><code>DELETE</code>: 데이터 삭제 (지우기)</li>
</ul>
</li>
</ul>
<h4 id="📤-요청과-응답-request--response">📤 요청과 응답 (Request &amp; Response)</h4>
<ul>
<li><p>Parameter (파라미터): 데이터를 요청할 때 함께 보내는 조건입니다.</p>
</li>
<li><p>Request Body (바디): POST 등을 통해 서버로 보낼 실제 데이터 뭉치 (주로 JSON 형식).</p>
</li>
<li><p>Header (헤더): 데이터 외에 인증 토큰(Token), 브라우저 정보 등 부가 정보를 담는 공간.</p>
</li>
<li><p>Status Code (상태 코드): 요청의 결과 상태를 알려주는 숫자입니다.</p>
</li>
<li><p><code>200</code>: 성공</p>
</li>
<li><p><code>400</code>: 요청 오류 (사용자가 잘못 보냄)</p>
</li>
<li><p><code>401/403</code>: 권한 없음 (로그인 필요 등)</p>
</li>
<li><p><code>500</code>: 서버 내부 오류 (서버 쪽 고장)</p>
</li>
</ul>
<h3 id="4-api-명세서-작성-흐름-step-by-step">4. API 명세서 작성 흐름 (Step-by-Step)</h3>
<h4 id="단계-1-기본-정보-정의">[단계 1] 기본 정보 정의</h4>
<ul>
<li><p>API의 목적이 무엇인가? (예: &quot;회원 정보 수정&quot;)</p>
</li>
<li><p>주소(URL)와 HTTP 메서드 결정.</p>
</li>
</ul>
<h4 id="단계-2-요청request-규격-작성">[단계 2] 요청(Request) 규격 작성</h4>
<ul>
<li><p>필수 입력값이 무엇인가?</p>
</li>
<li><p>각 값의 데이터 타입은 무엇인가? (String, Number, Boolean 등)</p>
</li>
</ul>
<h4 id="단계-3-응답response-규격-작성">[단계 3] 응답(Response) 규격 작성</h4>
<ul>
<li><p>성공했을 때 서버가 돌려줄 데이터 구조 정의.</p>
</li>
<li><p>데이터가 없을 때는 어떤 빈 값을 보낼지 결정.</p>
</li>
</ul>
<h4 id="단계-4-예외-상황error-정의">[단계 4] 예외 상황(Error) 정의</h4>
<ul>
<li>실패했을 때의 에러 코드와 에러 메시지를 정의. (예: &quot;존재하지 않는 사용자입니다.&quot;)</li>
</ul>
<h3 id="5-작성-시-주의할-점">5. 작성 시 주의할 점</h3>
<ul>
<li><p>최신화: 코드 로직이 바뀌면 명세서도 즉시 업데이트해야 합니다. (문서와 코드가 다르면 큰 혼란이 생깁니다.)</p>
</li>
<li><p>JSON 형식 준수: 가장 범용적인 데이터 포맷인 JSON 형태를 기본으로 작성하세요.</p>
</li>
<li><p>도구 활용: 메모장보다는 Swagger, Postman, Notion 등 협업에 최적화된 도구를 사용하는 것이 좋습니다.</p>
</li>
</ul>
<h3 id="6-요약-1">6. 요약</h3>
<ul>
<li><p>어디로? (URL) + 어떻게? (Method) → 무엇을 주면? (Request) → 무엇을 돌려받나? (Response)</p>
<h1 id="qa">QA</h1>
<h3 id="1-qa란">1. QA란?</h3>
</li>
<li><p>QA는 <strong>&quot;서비스가 출시되기 전, 기획대로 잘 만들어졌는지 검증하고 품질을 확인하는 과정&quot;</strong>입니다. 단순히 버그를 찾는 것을 넘어, 사용자가 서비스를 이용할 때 불편함이 없는지, 보안이나 성능에 문제가 없는지 종합적으로 체크하는 최종 방어선입니다.</p>
</li>
</ul>
<h3 id="2-왜-필요한가-2">2. 왜 필요한가?</h3>
<ol>
<li><p>신뢰도 확보: 결함이 많은 서비스는 사용자의 이탈을 초래합니다. 출시 전 문제를 해결하여 서비스의 신뢰도를 높입니다.</p>
</li>
<li><p>비용 절감: 서비스 출시 후에 발견된 버그를 고치는 비용은 개발 중에 고치는 비용보다 훨씬 큽니다.</p>
</li>
<li><p>기획 준수 확인: 개발 결과물이 처음에 약속했던 &#39;기능 명세서&#39;와 일치하는지 확인합니다.</p>
</li>
</ol>
<h3 id="3-핵심-용어-정리-2">3. 핵심 용어 정리</h3>
<h4 id="📋-테스트-계획-및-설계">📋 테스트 계획 및 설계</h4>
<ul>
<li><p>테스트 케이스 (TC): 테스트를 위해 입력 값, 실행 조건, 예상 결과를 정리한 문서입니다. (QA의 가장 기본 단위)</p>
</li>
<li><p>체크리스트 (Checklist): 주요 기능을 간단하게 나열하여 누락 없이 확인하기 위한 목록입니다.</p>
</li>
<li><p>테스트 시나리오: 여러 기능을 엮어서 사용자의 실제 이용 흐름대로 테스트하는 과정입니다.</p>
</li>
</ul>
<h4 id="🐞-결함-관련-bugdefect">🐞 결함 관련 (Bug/Defect)</h4>
<ul>
<li><p>버그 리포트 (Bug Report): 발견된 결함을 개발자에게 전달하기 위해 작성하는 보고서입니다.</p>
</li>
<li><p>우선순위 (Priority): 얼마나 빨리 고쳐야 하는가? (P0: 즉시 수정, P1: 중요 등)</p>
</li>
<li><p>심각도 (Severity): 시스템에 얼마나 치명적인가? (Critical, Major, Minor 등)</p>
</li>
</ul>
<h4 id="🔄-테스트-종류">🔄 테스트 종류</h4>
<ul>
<li><p>회귀 테스트 (Regression Test): 버그를 고친 후, 그 수정으로 인해 잘 되던 다른 기능에 문제가 생기지 않았는지 다시 확인하는 테스트입니다.</p>
</li>
<li><p>스모크 테스트 (Smoke Test): 세부 테스트 전, 주요 기능(로그인, 결제 등)이 작동하는지 짧게 확인하는 테스트입니다.</p>
</li>
</ul>
<h3 id="4-qa-진행-흐름-step-by-step">4. QA 진행 흐름 (Step-by-Step)</h3>
<h4 id="단계-1-테스트-계획-및-tc-작성">[단계 1] 테스트 계획 및 TC 작성</h4>
<ul>
<li>기능 명세서를 바탕으로 &quot;무엇을 테스트할 것인가&quot;를 정하고 테스트 케이스(TC)를 작성합니다.</li>
</ul>
<h4 id="단계-2-테스트-수행-execution">[단계 2] 테스트 수행 (Execution)</h4>
<ul>
<li>작성된 TC를 하나씩 실행하며 결과가 &#39;통과(Pass)&#39;인지 &#39;실패(Fail)&#39;인지 기록합니다.</li>
</ul>
<h4 id="단계-3-결함-리포팅-및-수정">[단계 3] 결함 리포팅 및 수정</h4>
<ul>
<li>실패한 항목은 버그 리포트를 작성하여 개발팀에 전달합니다. 이때 재현 경로(Step)와 스크린샷이 필수입니다.</li>
</ul>
<h4 id="단계-4-재테스트-및-종료">[단계 4] 재테스트 및 종료</h4>
<ul>
<li>개발자가 수정을 완료하면 다시 확인(Retest)하고, 전체 품질이 기준을 통과하면 QA를 종료합니다.</li>
</ul>
<h3 id="5-작성-시-주의할-점-1">5. 작성 시 주의할 점</h3>
<ul>
<li><p>재현 경로 명확화: 개발자가 똑같은 버그를 볼 수 있도록 &quot;어떤 페이지에서 무엇을 눌렀는지&quot; 순서대로 적어야 합니다.</p>
</li>
<li><p>기대 결과 명시: &quot;로그인이 안 됨&quot;이라고 적지 말고, &quot;로그인 실패 팝업이 뜨고 페이지가 유지되어야 함&quot;처럼 정확한 기대를 적으세요.</p>
</li>
<li><p>기기 환경 기록: 버그가 발생한 OS(iOS/Android), 브라우저(Chrome/Safari), 기기명 등을 반드시 기록해야 합니다.</p>
</li>
</ul>
<h3 id="6-요약-2">6. 요약</h3>
<ul>
<li><p>무엇을 볼까? (TC 작성) → 직접 해보기 (테스트 실행) → 틀린 것 찾기 (버그 리포트) → 다시 확인 (재테스트)</p>
<h1 id="릴리즈">릴리즈</h1>
<h3 id="1-릴리즈란">1. 릴리즈란?</h3>
</li>
<li><p>릴리즈는 <strong>&quot;개발과 테스트(QA)가 완료된 서비스를 실제 사용자들에게 제공(배포)하는 과정&quot;</strong>입니다. 단순히 코드를 올리는 것을 넘어, 새로운 기능과 수정 사항을 문서화하고 사용자에게 알리는 모든 마무리를 포함하는 최종 출시 단계입니다.</p>
</li>
</ul>
<h3 id="2-왜-필요한가-3">2. 왜 필요한가?</h3>
<ol>
<li><p>가치 전달: 개발된 기능이 드디어 사용자에게 전달되어 서비스의 가치를 실현합니다.</p>
</li>
<li><p>버전 관리: 서비스가 언제, 어떤 모습으로 변화했는지 기록하여 장애 발생 시 복구(Rollback)의 근거를 만듭니다.</p>
</li>
<li><p>사용자 소통: 우리 서비스가 어떻게 개선되었는지 사용자에게 공식적으로 알리는 창구가 됩니다.</p>
</li>
</ol>
<h3 id="3-핵심-용어-정리-3">3. 핵심 용어 정리</h3>
<h4 id="🔢-버전-관리-versioning">🔢 버전 관리 (Versioning)</h4>
<ul>
<li><p>SemVer (Semantic Versioning): 버전을 세 자리 숫자로 관리하는 방식입니다. (예: v1.2.3)</p>
<ul>
<li><p>Major(1): 기존과 호환되지 않는 대대적인 변화</p>
</li>
<li><p>Minor(2): 기능 추가 (기존 기능과 호환됨)</p>
</li>
<li><p>Patch(3): 버그 수정 및 작은 개선</p>
</li>
</ul>
</li>
<li><p>RC (Release Candidate): 정식 출시 전, 마지막으로 테스트하는 후보 버전입니다.</p>
</li>
</ul>
<h4 id="📦-배포-관련">📦 배포 관련</h4>
<ul>
<li><p>배포 (Deployment): 코드를 실제 서버에 적용하는 행위입니다.</p>
</li>
<li><p>롤백 (Rollback): 릴리즈 후 심각한 문제가 발견되었을 때, 이전의 안정적인 버전으로 되돌리는 것입니다.</p>
</li>
<li><p>릴리즈 노트 (Release Note): 이번 업데이트에서 무엇이 바뀌었는지 적은 설명서입니다.</p>
</li>
</ul>
<h3 id="4-릴리즈-진행-흐름-step-by-step">4. 릴리즈 진행 흐름 (Step-by-Step)</h3>
<h4 id="단계-1-최종-빌드-및-환경-점검">[단계 1] 최종 빌드 및 환경 점검</h4>
<ul>
<li>개발 완료된 코드의 최종본(Build)을 만들고, 실제 서비스와 동일한 환경에서 마지막 점검을 합니다.</li>
</ul>
<h4 id="단계-2-배포-deployment">[단계 2] 배포 (Deployment)</h4>
<ul>
<li>자동화 도구(CI/CD) 등을 이용해 서버에 코드를 반영합니다. 사용자가 끊김 없이 서비스를 이용하도록 &#39;무중단 배포&#39;를 주로 사용합니다.</li>
</ul>
<h4 id="단계-3-릴리즈-노트-작성">[단계 3] 릴리즈 노트 작성</h4>
<ul>
<li>내부 공유 및 사용자 공지용으로 변경 사항을 정리합니다. (추가 기능, 수정된 버그, 개선 사항)</li>
</ul>
<h4 id="단계-4-모니터링">[단계 4] 모니터링</h4>
<ul>
<li>배포 직후 실시간으로 에러가 발생하는지, 서버 부하가 없는지 집중적으로 살핍니다.</li>
</ul>
<h3 id="5-작성-시-주의할-점-2">5. 작성 시 주의할 점</h3>
<ul>
<li><p>대상자 고려: 개발자용은 기술적으로(예: &quot;API 응답 지연 개선&quot;), 사용자용은 이해하기 쉽게(예: &quot;페이지 속도가 빨라졌어요&quot;) 작성합니다.</p>
</li>
<li><p>날짜 명시: 버전과 함께 배포 완료 날짜를 반드시 기록합니다.</p>
</li>
<li><p>영향도 안내: 사용자가 꼭 알아야 할 주의 사항이나 데이터 삭제 등의 변화가 있다면 가장 강조해서 적습니다.</p>
</li>
</ul>
<h3 id="6-요약-3">6. 요약</h3>
<ul>
<li>완성 확인 (Build) → 서버 반영 (Deploy) → 변경 기록 (Changelog) → 이후 관찰 (Monitoring)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[JAVASCIPT]]></title>
            <link>https://velog.io/@_mieos/JAVASCIPT</link>
            <guid>https://velog.io/@_mieos/JAVASCIPT</guid>
            <pubDate>Fri, 17 Apr 2026 14:44:49 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/7f7858c2-8f5e-4359-9eb2-0f84c8c89c0c/image.webp" alt=""></p>
<h1 id="javascript란">JavaScript란?</h1>
<h3 id="자바스크립트는-웹-페이지에-동적인-기능을-추가하기-위해-사용하는-프로그래밍-언어입니다">자바스크립트는 웹 페이지에 동적인 기능을 추가하기 위해 사용하는 프로그래밍 언어입니다.</h3>
<ul>
<li>HTML: 웹의 구조(뼈대)</li>
<li>CSS: 웹의 디자인(피부)</li>
<li>JavaScript: 웹의 동작(근육/신경)</li>
</ul>
<h3 id="주요-특징">주요 특징</h3>
<ol>
<li>동적 상호작용: 클릭 시 메뉴가 나타나거나, 폼 데이터를 검사하는 등 사용자와 소통합니다.</li>
<li>이벤트 기반: 클릭, 마우스 휠, 키보드 입력 등 특정 사건(Event)에 반응합니다.</li>
<li>웹 브라우저에서 실행: 별도의 설치 없이 크롬, 사파리 같은 브라우저만 있으면 작동합니다.</li>
</ol>
<h3 id="자바스크립트가-하는-일예시">자바스크립트가 하는 일(예시)</h3>
<ul>
<li>버튼을 클릭했을 때 알림창 띄우기</li>
<li>다크 모드/라이트 모드 전환하기</li>
<li>서버에서 데이터를 받아와서 화면에 보여주기</li>
<li>실시간 계산기나 게임 만들기</li>
</ul>
<hr>
<h1 id="변수">변수</h1>
<p>데이터를 저장하는 바구니입니다. 선언 방식에 따라 특징이 다릅니다.</p>
<ul>
<li><code>const</code>: 재할당 불가능 (상수). 값이 변하지 않을 때 사용합니다.</li>
<li><code>let</code>: 재할당 가능. 값이 변해야 할 때 사용합니다.</li>
<li><code>var</code>: 예전에 쓰던 방식(중복 선언 가능 등 문제가 있어 현재는 거의 쓰지 않습니다).</li>
</ul>
<h1 id="데이터-타입data-types">데이터 타입(Data Types)</h1>
<p>자바스크립트의 값은 크게 두 가지 타입으로 나뉩니다.</p>
<h4 id="원시-타입primitive-types-값이-하나인-단순한-타입">원시 타입(Primitive Types): 값이 하나인 단순한 타입</h4>
<ul>
<li><code>Number</code>: 숫자 (예: <code>10</code>,<code>3.14</code>)</li>
<li><code>String</code>: 문자열 (예: <code>&#39;Hello&#39;</code>,<code>&quot;안녕하세요&quot;</code>)</li>
<li><code>Boolean</code>: 참/거짓 (<code>true</code>,<code>false</code>)</li>
<li><code>null</code>: 값이 없음을 명시적으로 나타냄</li>
<li><code>undefined</code>: 값이 할당되지 않은 상태</li>
</ul>
<h4 id="객체-타입object-types-여러-데이터를-하나로-묶은-타입">객체 타입(Object Types): 여러 데이터를 하나로 묶은 타입</h4>
<ul>
<li><code>object</code>: 키(key)와 값(Value)의 쌍으로 이루어진 집합</li>
<li><code>Array</code>: 순서가 있는 데이터의 목록(배열)
💡정리</li>
</ul>
<ol>
<li>변수 선택: 기본적으로 <code>const</code>를 쓰고, 나중에 값을 바꿔야 할 떄만 <code>let</code>을 쓰기</li>
<li>객체(Object): 실제 사물을 묘사할 때 유용하다. (예: <code>자동차 = {색상: &#39;빨강&#39;, 속도: 100}</code>)</li>
<li>배열(Array): 같은 종류의 데이터 목록을 관리할 때 씁니다. (예: <code>상품리스트 = [&#39;사과&#39;, &#39;배&#39;, &#39;포도&#39;]</code>)</li>
</ol>
<hr>
<h1 id="dom-선택-메서드">DOM 선택 메서드</h1>
<p>DOM(Document Object Model) 선택 메서드는 자바스크립트가 HTML 뼈대에서 특정 요소를 집어내어 명령을 내릴 수 있게 해주는 통로이다.</p>
<h4 id="1-고전적인-선택-방식빠름">1. 고전적인 선택 방식(빠름)</h4>
<ul>
<li><code>document.getElementById(&#39;아이디&#39;)</code>: 해당 <code>id</code>를 가진 단 하나의 요소를 반환합니다.</li>
<li><code>document.getElementsByClassName(&#39;클래스&#39;)</code>: 해당 <code>class</code>를 가진 모든 요소를 리스트(HTMLCollection) 형태로 반환합니다.</li>
<li><code>document.getElementsByTagName(&#39;태그명&#39;)</code>: 해당 태그(<code>div</code>,<code>p</code>)를 가진 모든 요소를 반환합니다.</li>
</ul>
<h4 id="2-현대적인-선택-방식">2. 현대적인 선택 방식</h4>
<p>CSS 선택자 문법을 그대로 사용할 수 있어 매우 편리합니다.</p>
<ul>
<li><code>document.querySelector(&#39;CSS선택자&#39;)</code>: 조건에 맞는 요소 중 가장 첫 번째 것 하나만 가져옵니다.</li>
<li><code>document.querySelectorAll(&#39;CSS선택자&#39;)</code>: 조건에 맞는 모든 요소를 리스트(NodeList) 형태로 가져옵니다.
💡정리</li>
<li>하나만 고를 때: <code>getElementById</code> 또는 <code>querySelector</code>를 사용하세요.</li>
<li>여러 개를 고를 때: <code>querySelectorAll</code>이 가장 범용성이 높고 편리합니다. (<code>forEach</code> 반복문을 바로 쓸 수 있기 때문입니다.)</li>
<li>CSS 선택자 활용: <code>querySelector(&#39;.my-class&#39;)</code>, <code>querySelector(&#39;#my-id&#39;)</code>, <code>querySelector(&#39;div &gt; p&#39;)</code> 처럼 CSS에서 쓰던 방식 그대로 사용하면 됩니다.</li>
</ul>
<hr>
<h1 id="windowscroll">window.scroll()</h1>
<p>브라우저의 스크롤을 특정 위치로 이동시킬 수 있는 메소드. 사용 방법은 다음과 같다.</p>
<ol>
<li>문법</li>
</ol>
<ul>
<li>좌표 방식: <code>window.scroll(x좌표, y좌표)</code></li>
<li>옵션 방식: <code>window.scroll({ top: y좌표, left: x좌표, behavior: &#39;smooth&#39; })</code></li>
</ul>
<ol start="2">
<li>주요 속성</li>
</ol>
<ul>
<li><code>top</code>:이동하고 싶은 세로 위치(단위:px)</li>
<li><code>left</code>: 이동하고 싶은 가로 위치(단위:px)</li>
<li><code>behavior</code>: 스크롤 동작 방식<ul>
<li><code>auto</code>: 즉시 이동(기본값)</li>
<li><code>smooth</code>: 부드럽게 애니메이션 효과와 함께 이동</li>
</ul>
</li>
</ul>
<p>💡정리</p>
<ol>
<li><p><code>scroll()</code> vs <code>scrollTo()</code>: 둘은 완전히 같습니다. 보통 더 명확한 의미인 <code>scrollTo()</code>를 선호하기도 합니다.</p>
</li>
<li><p><code>scrollBy()</code>: 현재 스크롤 위치를 기준으로 상대적으로 이동합니다. (예: <code>scrollBy({top: 100}</code>)는 현재 위치에서 100px 더 아래로 내려감)</p>
</li>
<li><p>마크다운 정리 팁: &quot;특정 위치로 이동할 때는 <code>scrollTo</code>, 현재 위치에서 더 움직일 때는 <code>scrollBy</code>&quot;라고 요약해보기</p>
</li>
</ol>
<hr>
<h1 id="html요소offsettop">HTML요소.offsetTop</h1>
<p>요소의 윗면 경계가 최상위 요소의 윗면 경계와(쉽게 말해 브라우저 화면 맨 위) 얼마만큼 떨어져 있는지 그 거리를 반환해주는 속성이다.</p>
<h2 id="offsettop">offsetTop</h2>
<p><code>offsetTop</code> 속성은 읽기 전용 속성으로, 현재 요소의 상단 면과 <code>offsetParent</code>(가장 가까운 상위 배치 요소) 상단 면 사이의 거리를 픽셀(px) 단위로 반환합니다.</p>
<h4 id="1-특징">1. 특징</h4>
<ul>
<li>상대적 거리: 문서 전체(<code>body</code>) 기준이 아니라, 가장 가까운 포지셔닝된(Position이 static이 아닌) 부모를 기준으로 합니다.</li>
<li>단위: 숫자 값만 반환합니다. (예: <code>150</code> -&gt; 150px을 의미)</li>
<li>읽기 전용: <code>element.dffsetTop = 100</code>) 처럼 값을 직접 수정할 수 없습니다.</li>
</ul>
<h4 id="2-활용-사례">2. 활용 사례</h4>
<ul>
<li>스크롤 시 특정 섹션의 위치를 파악하여 메뉴 활성화</li>
<li>&quot;Top&quot;버튼이나 &quot;특정 위치로 이동&quot; 버튼 구현</li>
<li>무한 스크롤 구현 시 마지막 요소의 위치 파악</li>
</ul>
<p>💡정리</p>
<ol>
<li>기준점 확인: 만약 <code>offsetTop</code>값이 예상보다 작게 나온다면, 부모 요소에 <code>position: relative;</code>가 걸려 있는지 확인하기</li>
<li>문서 전체 기준: 만약 부모가 아닌 전체 문서 상단에서의 위치를 알고 싶다면, 요소의 <code>offsetTop</code>과 부모들의 <code>offsetTop</code>을 계속 더해나가거나 <code>getBoundingClientRect().top _ window.pageYOffset</code>공식을 주로 사용합니다.</li>
</ol>
<h2 id="offsetparent">offsetParent</h2>
<p><code>offsetParent</code>속성은 해당 요소의 위치를 계산할 떄 기준이 되는 가장 가까운 배치된(positioned) 조상 요소를 반환합니다.</p>
<h4 id="1-기준이-되는-조건-우선순위">1. 기준이 되는 조건 (우선순위)</h4>
<p>다음에 해당하는 가장 가까운 조상 요소를 찾습니다.</p>
<ol>
<li><code>position</code> 속성이 <code>static</code>이 아닌 요소(<code>relative</code>,<code>absolute</code>,<code>fixed</code>,<code>sticky</code>)</li>
<li><code>&lt;td&gt;</code>,<code>&lt;th&gt;</code>,<code>&lt;table&gt;</code>태그</li>
<li>위 조건에 아무도 해당하지 않으면 <code>&lt;body&gt;</code></li>
</ol>
<h4 id="2-예외-사항">2. 예외 사항</h4>
<ul>
<li>요소의 <code>display</code>가 <code>none</code>인 경우: <code>null</code> 반환</li>
<li>요소의 <code>position</code>이 <code>fixed</code>인 경우: 브라우저에 따라 다르지만 보통 <code>null</code>반환(화면 전체가 기준이 되기 때문)
💡정리</li>
</ul>
<ol>
<li>계산의 기초: <code>offsetTop: 100px</code>이라는 결과를 봤을 때, &quot;그 100px이 어디서부터의 100px인가?&quot;를 결정하는 것이 바로 <code>offsetParent</code>입니다.</li>
<li>레이아웃 팁: 자식 요소를 특정 박스안에서 절대 위치(<code>absolute</code>)로 배치하고 싶을 때 부모에게 <code>position: relative;</code>를 주는 이유가 바로 이 <code>offsetParent</code>를 해당 부모로 고정하기 위함입니다.</li>
</ol>
<hr>
<h1 id="textcontent와-innertext의-공통점">textContent와 innerText의 공통점</h1>
<p>textContent와 innerText는 요소와 그 자식 요소의 텍스트 콘텐츠를 반환하거나 대입할 수 있다.</p>
<hr>
<h1 id="textcontent와-innertext의-차이점">textContent와 innerText의 차이점</h1>
<p>&#39;텍스트 콘텐츠를 읽거나 변경한다...결국 둘은 같은 것 아니야?&#39;라고 생각하기 쉽지만, 실은 서로 조금씩 다르다.</p>
<h2 id="textcontent">textContent</h2>
<ul>
<li>엔터를 이용한 줄바꿈 포함</li>
<li>스페이스를 이용한 연속적인 공백 포함</li>
<li>모든 텍스트 노드를 반환</li>
<li>모든 노드 개체에 대해 정의</li>
</ul>
<h2 id="innertext">innerText</h2>
<ul>
<li>엔터를 이용한 줄바꿈 미포함</li>
<li>스페이스를 이용한 연속적인 공백 미포함</li>
<li>사용자가 볼 수 있는 텍스트 노드만을 반환</li>
<li>HTMLElement 개체에 대해서만 정의</li>
</ul>
<hr>
<h1 id="setinterval">setInterval</h1>
<p>일정한 시간 간격에 따라 함수를 반복 실행할 수 있도록 해주는 타이머 메소드</p>
<hr>
<h1 id="clearinterval">clearInterval</h1>
<p>setInterval 메소드가 호출되어 반복 실행할 함수 타이머를 등록하면, 타이머는 0이 아닌 숫자를 반환한다.
숫자는 타이머의 ID를 의미하며, 이를 clearInterval 메소드에 전달하면 해당 타이머의 반복 실행이 취소된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[CSS]]></title>
            <link>https://velog.io/@_mieos/CSS</link>
            <guid>https://velog.io/@_mieos/CSS</guid>
            <pubDate>Fri, 17 Apr 2026 14:44:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/15b81231-99f5-499f-9dec-3d781ac95d78/image.jpg" alt=""></p>
<h1 id="css란">CSS란</h1>
<p>CSS는 Cascading Style Sheets를 의미한다.</p>
<ul>
<li>Cascading:계단식</li>
<li>Style:멋을 내다</li>
<li>Sheets:(종이)한 장
-&gt; 계단식으로 스타일을 정의하는 문서
CSS는 HTML 문서에 스타일을 더해준다. HTML 문서는 태그가 태그를 포함하는 계단식 구조를 지니고 있다.</li>
</ul>
<hr>
<h2 id="css가-일하려면">CSS가 일하려면</h2>
<p>CSS문서(코드) 자체는 독립적으로 존재할 수 있지만, 그 목적이 구조화된 HTML 문서의 스타일을 정의하는 데 있으므로 HTML 문서가 없는 CSS 문서는 사실상 의미가 없다.
HTML: 웹 문서의 콘텐츠를 구성하는 언어
CSS: 웹 문서의 콘텐츠에 스타일을 추가하는 언어(색상, 크기, 위치 등)
-&gt; HTML과 함께 사용되지 않는 CSS는 단순 텍스트일 뿐이며, 웹브라우저를 통해 결과물을 확인하기 위해서는 반드시 HTML문서 작성이 선행되어야 합니다.</p>
<hr>
<h2 id="내용-정리">내용 정리</h2>
<ul>
<li>CSS는 웹문서를 꾸며주기 위해 사용하는 언어이다.</li>
<li>CSS코드는 CSS파일에 작성한다. 확장자는 *.css이다.</li>
<li>CSS코드는 HTML 문서에 스타일을 추가(정의)하는 언어이다. 따라서 HTML 문서가 존재하지 않을 때는 단순 텍스트에 불과하다.</li>
</ul>
<hr>
<h1 id="css-기본-문법">CSS 기본 문법</h1>
<ul>
<li>선택자:어떤 요소에 스타일을 적용 할지에 대한 정보</li>
<li>{중괄호}: 선택한 요소에 적용할 스타일을 정의하는 영역</li>
<li>속성명: 어떤 스타일을 정의하고 싶은지에 대한 정보(색상, 크기 등)</li>
<li>속성값: 어떻게 정의하고 싶은지에 대한 정보</li>
</ul>
<hr>
<h2 id="css-기본-문법-사용-예">CSS 기본 문법 사용 예</h2>
<ul>
<li>속성값: p 태그에 스타일을 적용하겠다.</li>
<li>{중괄호}: 이 안에 p 태그에 대한 스타일을 정의하겠다.</li>
<li>속성명: color를 정의하겠다. 이건 글자색을 의미한다.</li>
<li>속성값: red로 정의하겠다. 빨간색 글자를 원한다.</li>
</ul>
<hr>
<h2 id="주석">주석</h2>
<p>주석은 사람에게는 보이지만, 컴퓨터(웹브라우저)에게는 보이지 않는 코드이다.
주로 코드에 대한 메모를 남기기 위한 용도로 사용된다.</p>
<hr>
<h1 id="html에-css를-더하려면">HTML에 CSS를 더하려면</h1>
<p>HTML문서에 CSS 문서(코드)를 적용하고자 할 떄는 다음과 같은 방식들을 사용할 수 있다.</p>
<ul>
<li>인라인 스타일: 태그에 직접 기술하기</li>
<li>스타일 태그: 스타일시트를 위한 태그를 추가하여 기술하기</li>
<li>문서 간의 연결: 스타일시트 문서를 따로 작성하여 HTML 문서와 연결하기</li>
</ul>
<hr>
<h2 id="인라인-스타일">인라인 스타일</h2>
<p>태그에 style 속성을 추가하여 요소에 직접적으로 스타일을 정의하는 방식. 따라서 선택자는 필요 없다. 웹 콘텐츠와 스타일시트를 분리하기 위해서는 사용하지 않는 편이 좋다.</p>
<hr>
<h2 id="스타일-태그">스타일 태그</h2>
<p>HTML 문서에 <code>&lt;style&gt;&lt;/style&gt;</code>태그를 추가하여 그 안에 CSS코드를 작성할 수 있다.</p>
<hr>
<h2 id="문서-간의-연결">문서 간의 연결</h2>
<p>확장자가 *.css인 스타일시트 파일을 생성해 그 안에 CSS코드를 작성하고, HTML문서에 이를 연결해줄 수 있다. 이때는 <code>&lt;link&gt;</code>태그를 사용한다.</p>
<ul>
<li>href: 연결하고자 하는 외부 소스의 url을 기술하는 속성</li>
<li>rel: 현재 문서(HTML)와 외부 소스의 연관 관계를 기술하는 속성
-&gt; <code>&lt;link&gt;</code> 채그는 HTML 문서의 <code>&lt;head&gt;&lt;/head&gt;</code> 내부에서 사용해야 합니다.</li>
</ul>
<hr>
<h2 id="내용-정리-1">내용 정리</h2>
<ul>
<li>CSS 코드는 선택자, 중괄호 영역, 속성명, 속성값 등으로 구성된다.</li>
<li>CSS 코드에도 주석을 사용할 수 있다./<em>주석</em>/</li>
<li>CSS 코드를 HTML 문서에 적용하기 위해서는 인라인 스타일, 스타일 태그, 외부 문서 연결 등의 방식을 사용해야 한다.</li>
</ul>
<hr>
<h1 id="선택자">선택자</h1>
<p>선택자: 어떤 요소에 스타일을 적용 할 것인지에 대한 정보</p>
<hr>
<h2 id="선택자의-종류">선택자의 종류</h2>
<ul>
<li>기본 선택자</li>
<li>그룹 선택자</li>
<li>특성 선택자</li>
<li>결합 선택자</li>
<li>의사 클래스</li>
<li>의사 요소</li>
</ul>
<hr>
<h2 id="기본-선택자-1-전체-선택자">기본 선택자 1. 전체 선택자</h2>
<p>모든 요소를 선택한다.
*(애스터리스크)는 &#39;문서 내의 모든 요소&#39;를 의미하는 기호이다.</p>
<hr>
<h2 id="기본-선택자-2-태그-선택자">기본 선택자 2. 태그 선택자</h2>
<p>주어진 이름을 가진 요소를 선택한다. &#39;유형 선택자&#39;라고도 한다. 주어진 이름을 가진 요소가 다수일 경우, 해당 요소들을 모두 선택한다.</p>
<hr>
<h2 id="기본-선택자-3-클래스-선택자">기본 선택자 3. 클래스 선택자</h2>
<p>주어진 class 속성값을 가진 요소를 선택한다. 주어진 class 속성값을 가진 요소가 다수일 경우, 해당 요소를 모두 선택한다.</p>
<hr>
<h2 id="기본-선택자-4-아이디-선택자">기본 선택자 4. 아이디 선택자</h2>
<p>주어진 id 속성값을 가진 요소를 선택한다. id는 고유한(unique) 식별자 역할을 하는 전역 속성이다.</p>
<hr>
<h2 id="그룹-선택자">그룹 선택자</h2>
<p>다양한 유형의 요소를 한꺼번에 선택하고자 할 때 사용한다. 쉼표(,)를 이용해 선택자를 그룹화한다.</p>
<hr>
<h2 id="선택자가-겹치는-경우">선택자가 겹치는 경우</h2>
<p>선택자가 겹치는 경우, 기본적으로 나중에 작성된 스타일이 적용된다. 선택자가 다르지만 요소가 겹치는 경우, 선택자 우선순위에 의해 적용될 스타일이 결정된다.
선택자 우선순위: 아이디 선택자 &gt; 클래스 선택자 &gt; 태그 선택자</p>
<hr>
<h1 id="텍스트-관련-속성">텍스트 관련 속성</h1>
<ul>
<li>font-family: 글꼴을 정의한다.</li>
<li>font-size: 글자 크기를 정의한다.</li>
<li>text-align: 정렬 방식을 정의한다.</li>
<li>color: 글자 색상을 정의한다.</li>
</ul>
<hr>
<h2 id="font-family">font-family</h2>
<p>요소를 구성하는 텍스트의 글꼴을 정의한다. 글꼴명을 속성값으로 지정한다. 여러 개의 글꼴을 연달아 기입하여 우선 순위를 지정할 수 있다.</p>
<hr>
<h2 id="font-size">font-size</h2>
<p>수치와 단위를 지정해 글자의 크기를 정의할 수 있다.</p>
<ul>
<li>px: 모니터 상의 화소 하나 크기에 대응하는 절대적인 크기</li>
<li>rem: <code>&lt;html&gt;</code>태그의 font-size에 대응하는 상대적인 크기</li>
<li>em: 부모태그(상위태그)의 font-size에 대응하는 상대적인 크기</li>
</ul>
<hr>
<h2 id="text-align">text-align</h2>
<p>블록 내에서 텍스트의 정렬 방식을 정의한다. 미리 정의된 키워드 값을 지정한다.</p>
<ul>
<li>left/right: 왼쪽 또는 오른쪽 정렬한다</li>
<li>center: 가운데 정렬한다</li>
<li>justify: 양끝 정렬한다(마지막 줄 제외)</li>
</ul>
<hr>
<h2 id="color">color</h2>
<p>텍스트의 색상을 정의한다. 다양한 방법으로 색상을 지정할 수 있다.</p>
<ul>
<li>키워드: 미리 정의된 색상별 키워드를 사용한다(ex. red, blue)</li>
<li><h1 id="-여섯자리-16진수-값-형태로-지정한다">+ 여섯자리 16진수 값 형태로 지정한다</h1>
</li>
<li>Red, Green, Blue 의 수준을 각각 정의해 지정한다</li>
</ul>
<hr>
<h2 id="내용-정리-2">내용 정리</h2>
<ul>
<li>font-family는 글꼴을 지정하는 속성이며, 여러 글꼴을 연달아 기입하여 우선순위를 지정할 수 있다.</li>
<li>font-size는 글자 크기는 지정하는 속성이며, px,rem,em등의 단위를 사용할 수 있다.</li>
<li>text-align은 블록 내에서 텍스트의 정렬 방식을 정의한다.</li>
<li>color는 다양한 방법으로 텍스트의 색상을 정의한다.</li>
</ul>
<hr>
<h1 id="블록-레벨-요소-vs-인라인-요소">블록 레벨 요소 vs 인라인 요소</h1>
<p>블록 레벨 요소: 자기가 속한 영역의 너비를 모두 차지하여 블록을 형성한다. (ex.div,p,h1 등)
인라인 요소: 자기에게 필요한 만큼의 공간만 차지한다.(ex.span,a 등)</p>
<hr>
<h1 id="display-속성">display 속성</h1>
<p>display 속성은 요소를 블록과 인라인 요소 중 어느 쪽으로 처리할지 정의한다.</p>
<hr>
<h2 id="display-속성-값">display 속성 값</h2>
<ul>
<li>inline: 인라인으로 처리한다.</li>
<li>block: 블록 레벨로 처리한다.</li>
<li>inline-block: 인라인으로 배치하되, 블록 레벨 요소의 속성을 추가할 수 있도록 처리한다.</li>
<li>none:디스플레이(표시)하지 않는다.</li>
</ul>
<hr>
<h1 id="border-속성">border 속성</h1>
<p>border 속성을 사용하면 요소가 차지하고 있는 영역에 테두리를 그릴 수 있다. border 속성에는 속성값으로 테두리의 두께, 모양, 크기 등을 함께 지정할 수 있는데, 이러한 속성을 &#39;단축속성&#39;이라 한다.</p>
<hr>
<h2 id="border-속성의-하위-속성">border 속성의 하위 속성</h2>
<ul>
<li>border-color:color정의 방식과 동일</li>
<li>border-width: thin,medium,thick 등의 키워드 또는 px,em,rem 등의 단위</li>
<li>none(기본값),solid(직선),dotted(점선),dashed(긴 점선)등</li>
</ul>
<hr>
<h1 id="박스모델box-model">박스모델(Box-Model)</h1>
<p>브라우저가 요소를 렌더링 할 때, 각각의 요소는 기본적으로 사각형 형태로 영역을 차지하게 된다. 이 영역을 &#39;박스&#39;라 표현하며, CSS는 박스의 크기, 위치, 속성(색,배경,테두리 모양 등)을 결정할 수 있다.
하나의 박스는 다음 네 개의 영역으로 구성된다.</p>
<ul>
<li>콘텐츠 영역</li>
<li>안쪽 여백</li>
<li>경계선(테두리)</li>
<li>바깥쪽 여백</li>
</ul>
<hr>
<h2 id="박스-각-영역의-크기는-어떻게">박스 각 영역의 크기는 어떻게?</h2>
<ul>
<li>콘텐츠 영역: width,height</li>
<li>안쪽 여백:padding</li>
<li>바깥쪽 여백:margin</li>
<li>테두리:border-width</li>
</ul>
<hr>
<h1 id="box-sizing">box-sizing</h1>
<p>box-sizing 속성은 요소의 너비(width)와 높이(height)를 계산하는 방법을 지정한다.</p>
<ul>
<li>content-box: 기본값. 너비와 높이가 콘텐츠 영역만을 포함한다.</li>
<li>border-box: 너비와 높이가 안쪽 여백과 테두리까지 포함한다.</li>
</ul>
<hr>
<h1 id="background">background</h1>
<p>배경(background)은 콘텐츠의 배경을 정의한다.</p>
<ul>
<li>background-color</li>
<li>background-image</li>
<li>background-position</li>
<li>background-size</li>
<li>background-repeat</li>
</ul>
<hr>
<h1 id="float">float</h1>
<p>float 속성은 요소가 문서의 일반적인 흐름에서 제외되어 자신을 포함하고 있는 컨테이너의 왼쪽이나 오른쪽에 배치되게 한다.</p>
<ul>
<li>none</li>
<li>left</li>
<li>right</li>
</ul>
<hr>
<h1 id="clear">clear</h1>
<p>clear 속성은 float 요소 이후에 표시되는 요소가 float을 해제(clear)하여 float 요소의 아래로 내려가게 할 수 있다.</p>
<ul>
<li>none</li>
<li>left</li>
<li>right</li>
<li>both</li>
</ul>
<hr>
<h1 id="position">position</h1>
<p>position은 문서 상에 요소를 배치하는 방법을 정의한다.</p>
<ul>
<li>static</li>
<li>relative</li>
<li>absolute</li>
<li>fixed</li>
<li>sticky</li>
</ul>
<hr>
<h1 id="flexbox">flexbox</h1>
<p>flexbox란 박스 내 요소 간의 공간 배분과 정렬 기능을 제공하기 위한 1차원 레이아웃 모델이다.</p>
<ul>
<li>행(row)</li>
<li>열(column)</li>
</ul>
<hr>
<h2 id="flex-direction">flex-direction</h2>
<ul>
<li>row</li>
<li>row-reverse</li>
<li>column</li>
<li>column-reverse</li>
</ul>
<hr>
<h1 id="flexbox-다루기">flexbox 다루기</h1>
<ul>
<li>justify-content</li>
<li>align-items</li>
<li>align-self</li>
<li>flex-wrap</li>
</ul>
<hr>
<h1 id="의사클래스">의사클래스</h1>
<ul>
<li>hover</li>
<li>active</li>
<li>focus</li>
<li>disabled</li>
<li>nth-child()</li>
</ul>
<hr>
<h1 id="의사요소">의사요소</h1>
<ul>
<li>after</li>
<li>before</li>
<li>first-line</li>
<li>marker</li>
<li>placeholder</li>
</ul>
<hr>
<h1 id="상속">상속</h1>
<p>상속(Inheritance)이란 하위 요소가 상위 요소의 스타일 속성값을 물려받는 것을 의미한다.</p>
<p>공용 키워드</p>
<ul>
<li>inherit</li>
<li>initial</li>
<li>unset</li>
</ul>
<hr>
<h1 id="z-index">z-index</h1>
<p>z-index 속성은 요소의 쌓임 순서(stack order)를 정의할 수 있다.</p>
<ul>
<li>기본값: auto</li>
<li>값이 클수록 위에 표시됨</li>
</ul>
<h1 id="flexbox-1">Flexbox</h1>
<p>Flexbox(Flexible Box)는 요소들을 가로 또는 세로 방향으로 자유롭게 정렬하고 공간을 배분하기 위해 사용하는 1차원 레이아웃 모델입니다.</p>
<h3 id="1-주요-용어">1. 주요 용어</h3>
<ul>
<li>Flex Container:<code>display: flex;</code>가 적용된 부모 요소</li>
<li>Flex Item: 컨테이너 안에 포함된 자식 요소들</li>
<li>Main Axis(주축): 아이템이 배치되는 기본 방향</li>
<li>Cross Axis(교차축): 주축과 수직을 이루는 방향</li>
</ul>
<h3 id="2-컨테이너에-쓰는-속성-부모">2. 컨테이너에 쓰는 속성 (부모)</h3>
<ul>
<li><code>display: flex;</code>:Flex 컨테이너로 정의 (필수)</li>
<li><code>flex-direction</code>: 주축의 방향 설정(<code>row</code>,<code>colums</code>,<code>row-reverse</code>,<code>column-reverse</code>)</li>
<li><code>justify-content</code>: 주축 (가로) 정렬(<code>flex-start</code>,<code>center</code>,<code>space-between</code>,<code>space-around</code>)</li>
<li><code>align-items</code>: 교차축(세로) 정렬(<code>flex-start</code>,<code>center</code>,<code>stretch</code>)</li>
<li><code>flex-wrap</code>: 줄 바꿈 여부(<code>nowrap</code>,<code>wrap</code>)</li>
</ul>
<h3 id="3-아이템에-쓰는-속성-자식">3. 아이템에 쓰는 속성 (자식)</h3>
<ul>
<li><code>flex</code>: 아이템의 증가, 감소, 기본 크기를 한 번에 설정(<code>flex: 1;</code>)</li>
<li><code>align-self</code>: 특정 아이템 하나만 개별적으로 세로 정렬</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML]]></title>
            <link>https://velog.io/@_mieos/HTML</link>
            <guid>https://velog.io/@_mieos/HTML</guid>
            <pubDate>Fri, 17 Apr 2026 14:43:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/_mieos/post/fc1034c5-93a1-4e0c-9fed-9cf91e95f193/image.jpg" alt=""></p>
<h2 id="html이란">HTML이란</h2>
<h3 id="html은-hypertext-markup-language를-의미한다">HTML은 HyperText Markup Language를 의미한다.</h3>
<ul>
<li>HyperText:하이퍼링크를 통해 어떤 문서에서 다른 문서로 접근할 수 있는 텍스트</li>
<li>Markup:(콘텐츠를) 표시하다</li>
<li>Language:언어</li>
</ul>
<p>-&gt;하이퍼 텍스트와 콘텐츠를 표시해주는 언어, 웹페이지의 콘텐츠를 정의하기 위해 사용하는 언어이다.</p>
<hr>
<h2 id="웹페이지의-콘텐츠를-정의한다">웹페이지의 콘텐츠를 정의한다</h2>
<ul>
<li>HTML은 웹페이지의 콘텐츠를 정의하기 위해 사용하는 언어이다. 개발자는 HTML코드로 웹페이지에 어떤 내용이 표시될지를 정의한 HTML 문서를 만든다.
완성된 HTML코드를 웹브라우저에서 로딩하면 웹페이지가 만들어진다. HTML 코드가 웹브라우저를 통해 해석되고 표현되는 과정을 렌더링이라 한다.</li>
</ul>
<hr>
<h2 id="html-문서-만들기">HTML 문서 만들기</h2>
<h3 id="html-문서는-파일의-확장자가-html-또는-htm-이다">HTML 문서는 파일의 확장자가 html 또는 htm 이다.</h3>
<p>-&gt;파일을 수정하고 싶다면, 텍스트 편집기로 열기
-&gt;결과(웹페이지)를 확인하고 싶다면, 웹브라우저로 열기</p>
<p>-대표적인 텍스트 편집기:기본 메모장, Brackets, VSCode 등 -대표적인 웹브라우저:크롬, 파이어폭스, 사파리, 인터넷익스플로러, 엣지 등</p>
<hr>
<h2 id="내용-정리">내용 정리</h2>
<p>-HTML은 웹페이지 콘텐츠를 정의하는 언어(문서 작성 양식)이다.
-HTML 코드는 HTML 파일에 작성한다. 확장자는 _.html 또는 _.htm이다. -텍스트 에디어에서 작성한 HTML코드는 웹브라우저를 통해 표시할 수 있다.</p>
<hr>
<h2 id="개발자-도구">개발자 도구</h2>
<h3 id="웹브라우저에는-개발자-도구가-탑재되어-있다">웹브라우저에는 개발자 도구가 탑재되어 있다.</h3>
<h2 id="개발자-도구란">개발자 도구란?</h2>
<ul>
<li>웹사이트 개발용 도구로 대부분의 최신 브라우저에는 개발자 도구가 탑재되어 있다. HTML CSS코드 확인, 모바일 모니터링, 네트워크 상태 점검, 스크립트 명령어 확인 등 다양한 기능을 통해 개발자에게 편의를 제공한다.</li>
</ul>
<hr>
<h2 id="개발자-도구-열기크롬-기준">개발자 도구 열기(크롬 기준)</h2>
<ul>
<li>크롬은 브라우저가 열려 있는 상태에서 F12 버튼을 누르거나
우측 상단 메뉴 설정 -&gt; 도구 더 보기 -&gt; 개발자 도구 를 선택해 열 수 있다.</li>
</ul>
<hr>
<h2 id="개발자-도구의-활용">개발자 도구의 활용</h2>
<ul>
<li>네이버 사이트를 연 상태에서 개발자 도구를 열면, 네이버 홈페이지의 HTML 코드를 확인할 수 있다.</li>
</ul>
<hr>
<h2 id="코드-에디터">코드 에디터</h2>
<h3 id="코드-에디터란">코드 에디터란?</h3>
<ul>
<li>프로그래머가 프로그램 소스 코드를 편집하기 위해 사용하는 소프트웨어.
코드는 결국 텍스트이다. 그러나 이 텍스트를 더 빠르게, 더 편하게 작성하기 위해서는 코드 에디터를 사용하는 것이 좋다.</li>
<li><blockquote>
<p>텍스트 자동 완성 + 하이라이팅 기능이 추가된 메모장</p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="내용-정리-1">내용 정리</h2>
<p>-대부분의 최신 브라우저에는 개발자 도구가 탑재되어 있다. -개발자 도구는 개발자의 웹 개발 속도 및 편의를 증가시킨다. -개발자는 코드를 더 빠르고 편하게 편집하기 위해 코드 에디터를 사용한다.</p>
<hr>
<h2 id="html은-언어이다">HTML은 언어이다</h2>
<ul>
<li><p>한국어, 영어 등으로 사람들과 소통하기 위해 해당 언어의 문법에 맞는 표현을 사용해야 하듯, HTML 언어를 목적에 맞게 사용하기 위해서는 HTML의 문법에 맞는 표현을 사용해야 한다.
HTML의 문법은 딱 한 가지, 태그(tag)만 기억하면 된다.</p>
</li>
<li><p>태그란?</p>
</li>
<li><blockquote>
<p>HTML 코드에서 정보(콘텐츠)를 정의하는 형식</p>
</blockquote>
</li>
</ul>
<hr>
<h2 id="html-태그-사용법-시작과-끝">HTML 태그 사용법: 시작과 끝</h2>
<ul>
<li><p>태그는 &lt;&gt;과 &lt;/&gt;기호를 사용해 콘텐츠의 시작과 끝을 표시한다.
각 태그는 콘텐츠를 감싸며, 태그명은 콘텐츠의 성격과 의미를 나타낸다.</p>
</li>
<li><p>태그 사용 형태)
<code>&lt;태그명&gt;여기에 콘텐츠를 기입합니다&lt;/태그명&gt;</code></p>
</li>
</ul>
<hr>
<h2 id="html-태그-사용법-단일-태그">HTML 태그 사용법: 단일 태그</h2>
<ul>
<li><p>경우에 따라 시작과 끝을 구분할 필요가 없는 태그도 존재한다.
이를 단일 태그라 하며, 단일 태그의 형식은 다음 예와 같다.</p>
</li>
<li><p>단일 태그 사용 형태)
<code>&lt;태그명/&gt; 또는 &lt;태그명&gt;</code></p>
</li>
</ul>
<p>-&gt;단일 태그는 콘텐츠를 감쌀 필요가 없으므로 시작과 끝을 구분하지 않는다.</p>
<hr>
<h2 id="html-태그-사용법-속성">HTML 태그 사용법: 속성</h2>
<ul>
<li><p>속성은 태그의 부가적인 기능을 정의하는 것으로, 선택사항이다.
속성은 시작 태그의 내부에 정의한다. 속성의 개수에는 특별한 제한이 없다.</p>
</li>
<li><p>속성이 추가된 태그의 예)
<code>&lt;태그명 속성명=&quot;속성값&quot;&gt;내용이 들어감&lt;/태그명&gt;</code>
<code>&lt;태그명 속성명=&quot;속성값&quot;/&gt;</code></p>
</li>
</ul>
<p>-&gt;태그명과 속성 정의는 공백(space)으로 구분하며, 큰따옴표를 사용한다.</p>
<hr>
<h2 id="html-태그-사용법-주석">HTML 태그 사용법: 주석</h2>
<ul>
<li><p>주석은 사람에게는 보이지만, 컴퓨터(웹브라우저)에게는 보이지 않는 코드이다.
주로 코드에 대한 메모를 남기기 위한 용도를 사용된다.</p>
</li>
<li><p>HTML 주석의 예)
<code>&lt;!--이 사이에 작성한 내용은 주석으로 처리된다.--&gt;</code></p>
</li>
</ul>
<hr>
<h2 id="html-문서의-구조">HTML 문서의 구조</h2>
<ul>
<li>일반적으로 HTML문서는 다음과 같은 기본 구조를 가진다.</li>
</ul>
<hr>
<h2 id="doctype-html"><!DOCTYPE html></h2>
<ul>
<li>문서의 첫 부분에서 문서 유형을 지정하는 단일 태그이다.
HTML5 문서임을 브라우저에게 알린다.</li>
</ul>
<hr>
<h2 id="htmlhtml"><html>~</html></h2>
<ul>
<li>HTML 문서의 시작과 끝을 나타내는 태그이다.
이 태그 내부에 전체 HTML 코드가 작성된다.</li>
</ul>
<hr>
<h2 id="headhead"><head>~</head></h2>
<h4 id="웹-브라우저-화면에는-보이지-않지만-웹-브라우저가-알아야-할-정보가-들어간다">웹 브라우저 화면에는 보이지 않지만 웹 브라우저가 알아야 할 정보가 들어간다.</h4>
<pre><code>&lt;meta charset=&quot;utf-8&quot;&gt;</code></pre><ul>
<li>문자 인코딩을 설정한다.</li>
</ul>
<pre><code>&lt;title&gt;문서제목&lt;/title&gt;</code></pre><ul>
<li>브라우저 탭 제목을 설정한다.</li>
</ul>
<hr>
<h2 id="bodybody"><body>~</body></h2>
<h4 id="실제-브라우저-화면에-표시될-내용을-입력하는-태그이다">실제 브라우저 화면에 표시될 내용을 입력하는 태그이다.</h4>
<ul>
<li>텍스트</li>
<li>이미지</li>
<li>버튼</li>
<li>입력창</li>
<li>메뉴</li>
</ul>
<p>등이 들어간다.</p>
<hr>
<h2 id="문단paragraph">문단(paragraph)</h2>
<h4 id="p-태그는-문단-요소를-나타내는-태그이다">p 태그는 문단 요소를 나타내는 태그이다.</h4>
<ul>
<li>하나의 p 태그는 하나의 문단을 표현한다.</li>
</ul>
<hr>
<h2 id="제목headline">제목(headline)</h2>
<h4 id="h-태그는-제목-요소를-나타내는-태그이다">h 태그는 제목 요소를 나타내는 태그이다.</h4>
<ul>
<li>h1 가장 큼</li>
<li>h6 가장 작음</li>
</ul>
<hr>
<h2 id="수평선">수평선</h2>
<h4 id="hr-태그는-수평선을-표시하는-태그이다">hr 태그는 수평선을 표시하는 태그이다.</h4>
<hr>
<h2 id="줄바꿈-태그와-공백문자">줄바꿈 태그와 공백문자</h2>
<h3 id="html에서는-br-태그가-줄바꿈을-담당한다">HTML에서는 br 태그가 줄바꿈을 담당한다.</h3>
<ul>
<li>공백을 두 번 이상 표시할 때
<code>&amp;nbsp;</code> 사용</li>
</ul>
<hr>
<h2 id="텍스트-강조-태그">텍스트 강조 태그</h2>
<h3 id="굵게">굵게</h3>
<p><code>&lt;strong&gt;</code></p>
<h3 id="이탤릭">이탤릭</h3>
<p><code>&lt;em&gt;</code></p>
<h3 id="형광펜">형광펜</h3>
<p><code>&lt;mark&gt;</code></p>
<hr>
<h2 id="이미지-img-태그">이미지 img 태그</h2>
<h3 id="이미지를-표시할-때-사용하는-태그">이미지를 표시할 때 사용하는 태그</h3>
<h4 id="기본-형태">기본 형태</h4>
<pre><code>&lt;img src=&quot;이미지&quot; alt=&quot;설명&quot;&gt;</code></pre><hr>
<h2 id="이미지-크기-조절">이미지 크기 조절</h2>
<pre><code>&lt;img src=&quot;이미지&quot; alt=&quot;설명&quot; width=&quot;300&quot; height=&quot;200&quot;&gt;</code></pre><hr>
<h2 id="컨테이너-태그">컨테이너 태그</h2>
<h3 id="div">div</h3>
<h4 id="블록-레벨-컨테이너">블록 레벨 컨테이너</h4>
<h3 id="span">span</h3>
<h4 id="인라인-컨테이너">인라인 컨테이너</h4>
<hr>
<h2 id="링크">링크</h2>
<h4 id="a-태그-사용">a 태그 사용</h4>
<pre><code>&lt;a href=&quot;주소&quot;&gt;텍스트&lt;/a&gt;</code></pre><h4 id="새-탭-열기">새 탭 열기</h4>
<pre><code>&lt;a href=&quot;주소&quot; target=&quot;_blank&quot;&gt;</code></pre><hr>
<h2 id="목록">목록</h2>
<h3 id="목록은-연관-있는-항목item들을-나열한-것을-의미한다-html-목록은--순서-없는-목록과-순서-있는-목록으로-구분된다">목록은 연관 있는 항목(item)들을 나열한 것을 의미한다. HTML 목록은  &#39;순서 없는 목록&#39;과 &#39;순서 있는 목록&#39;으로 구분된다.</h3>
<h3 id="순서-없는-목록">순서 없는 목록</h3>
<pre><code>&lt;ul&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;</code></pre><h3 id="순서-있는-목록">순서 있는 목록</h3>
<pre><code>&lt;ol&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;</code></pre><hr>
<ul>
<li>목록은 연관 있는 항목들을 나열한 것이다.</li>
<li>목록 요소는 &#39;순서 없는 목록&#39;과 &#39;순서 있는 목록&#39;으로 구분할 수 있다.</li>
<li>목록 안에 들어가는 항목 요소를 표시할 때는 li태그를 사용한다.</li>
<li>ol,ul,li 태그는 모두 레벨 요소를 표시하는 태그이다.</li>
</ul>
<h2 id="input">input</h2>
<h3 id="input의-핵심-type-속성">input의 핵심, type 속성</h3>
<p>type의 값에 따라 입력 요소의 형태나 입력 데이터 유형 등이 달라진다. 사용 가능한 type은 20여 가지이며, 기본값은 text이다.</p>
<h4 id="사용자-입력-태그">사용자 입력 태그</h4>
<pre><code>&lt;input type=&quot;text&quot;&gt;</code></pre><hr>
<h2 id="select">select</h2>
<pre><code>&lt;select&gt;
&lt;option&gt;선택1&lt;/option&gt;
&lt;/select&gt;</code></pre><hr>
<h2 id="textarea">textarea</h2>
<pre><code>&lt;textarea&gt;&lt;/textarea&gt;</code></pre><hr>
<h2 id="form">form</h2>
<pre><code>&lt;form action=&quot;&quot; method=&quot;&quot;&gt;</code></pre><p>속성</p>
<ul>
<li>action : 서버 주소</li>
<li>method : GET / POST</li>
</ul>
<hr>
<h2 id="meta-태그">meta 태그</h2>
<h4 id="html-문서-정보-제공-태그">HTML 문서 정보 제공 태그</h4>
<pre><code>&lt;meta charset=&quot;utf-8&quot;&gt;</code></pre><hr>
<h2 id="viewport">viewport</h2>
<pre><code>&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;</code></pre><h2 id="모바일-화면-대응-설정">모바일 화면 대응 설정</h2>
]]></description>
        </item>
    </channel>
</rss>