<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ming.log</title>
        <link>https://velog.io/</link>
        <description>밍기적 개발하기🐛</description>
        <lastBuildDate>Fri, 09 Jan 2026 16:10:07 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>ming.log</title>
            <url>https://velog.velcdn.com/images/dev_vming/profile/a889e2cb-f6fa-4b5a-8f5e-9c273d4a9df8/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. ming.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_vming" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[TIL] Vercel로 배포하기 - CI/CD]]></title>
            <link>https://velog.io/@dev_vming/TIL-Vercel%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-CICD</link>
            <guid>https://velog.io/@dev_vming/TIL-Vercel%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-CICD</guid>
            <pubDate>Fri, 09 Jan 2026 16:10:07 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/712ddc34-0b17-4bf3-9b24-e3d682b22dc8/image.png" alt=""></p>
<h1 id="📚-vercel로-배포하기">📚 Vercel로 배포하기</h1>
<hr>
<h2 id="📕-vercel이란">📕 Vercel이란?</h2>
<h3 id="정의">정의</h3>
<ul>
<li>정적 웹 사이트 및 애플리케이션을 빌드 &amp; 배포하기 위한 클라우드 플랫폼이다.</li>
<li>프론트엔드 &amp; 백엔드 개발자들이 코드를 더 쉽게 배포하고 호스팅할 수 있게 도와준다.</li>
<li>GitHub, GitLab, Bitbucket 등과 연동하여 CI/CD를 간편하게 설정할 수 있다.</li>
<li>사용성과 확장성이 좋아 많은 개발자들에게 인기가 있다.</li>
<li>Next.js와의 시너지가 극대화되어, 빠르고 효율적인 웹 애플리케이션 개발 및 배포 환경을 구축할 수 있다.</li>
</ul>
<h3 id="주요-기능">주요 기능</h3>
<ul>
<li><strong>웹 애플리케이션 호스팅</strong>: 정적 파일로 구성된 웹 애플리케이션을 배포하고 호스팅한다.</li>
<li><strong>빠른 배포</strong>: Git 저장소와 연동하여 변경 사항이 발생하면 자동으로 배포된다.</li>
<li><strong>CI/CD 통합</strong>: GitHub Actions, GitLab CI 등과 연동하여 지속적 통합 및 배포를 설정할 수 있다.</li>
<li><strong>환경 변수 관리</strong>: 환경 변수 설정을 지원하여 애플리케이션의 보안과 환경 설정을 관리한다.</li>
<li><strong>도메인 관리</strong>: 사용자의 도메인을 Vercel 플랫폼에 연결할 수 있도록 도와준다.</li>
<li><strong>서버리스 함수</strong>: Serverless Functions를 제공하여 손쉽게 백엔드 기능을 구축할 수 있다.</li>
<li><strong>애널리틱스</strong>: 애플리케이션 성능 및 사용 통계를 수집하고 모니터링하는 도구를 제공한다.</li>
</ul>
<hr>
<h2 id="📗-vercel로-배포하기">📗 Vercel로 배포하기</h2>
<h3 id="cli로-배포하기">CLI로 배포하기</h3>
<ul>
<li>프로젝트 디렉토리에서 Vercel CLI를 통해 수동으로 배포할 수 있다.</li>
<li><code>vercel</code> 명령어를 실행하면 배포 프로세스가 시작된다.</li>
<li>첫 배포 시 로그인 및 프로젝트 설정을 진행하게 된다.</li>
<li><code>vercel --prod</code> 명령어로 프로덕션 환경에 직접 배포할 수 있다.</li>
</ul>
<h3 id="githubgitlab-연동-배포-github-import">GitHub/GitLab 연동 배포 (GitHub Import)</h3>
<ul>
<li>GitHub, GitLab과 Vercel을 연동하여 저장소에 변경사항이 푸시될 때마다 자동으로 배포된다.</li>
<li>Vercel의 GitHub Import는 CI/CD(Continuous Integration / Continuous Deployment) 프로세스의 일부이다.</li>
<li><strong>CI (Continuous Integration)</strong><ul>
<li>개발자나 팀이 코드 변경을 일일이 검사하지 않고도 코드의 품질과 안정성을 유지하도록 도와주는 프로세스이다.</li>
<li>코드 변경이 이루어질 때마다 자동으로 테스트, 빌드 및 코드 검사를 수행하고, 오류를 미리 감지한다.</li>
</ul>
</li>
<li><strong>CD (Continuous Deployment)</strong><ul>
<li>CI의 확장으로, 코드 변경이 CI 테스트를 통과하면 자동으로 프로덕션 환경에 배포되도록 하는 프로세스이다.</li>
<li>이를 통해 새로운 기능과 버그 수정 사항이 빠르게 사용자에게 제공된다.</li>
</ul>
</li>
</ul>
<h3 id="환경-변수-설정">환경 변수 설정</h3>
<ul>
<li>Vercel 대시보드나 CLI를 통해 환경 변수를 설정할 수 있다.</li>
<li>프로젝트 설정의 Environment Variables 섹션에서 추가 및 관리가 가능하다.</li>
<li>Development, Preview, Production 환경별로 다른 값을 설정할 수 있다.</li>
</ul>
<hr>
<h2 id="📘-github-import를-통한-배포-과정">📘 GitHub Import를 통한 배포 과정</h2>
<h3 id="배포-과정">배포 과정</h3>
<ol>
<li><strong>Vercel 계정 생성</strong>: Vercel 웹사이트에 접속하여 계정을 생성한다.</li>
<li><strong>프로젝트 생성</strong>: 대시보드에서 &#39;New Project&#39; 또는 &#39;Import Project&#39; 버튼을 클릭한다.</li>
<li><strong>GitHub Import</strong>: &#39;Import Git Repository&#39;를 선택한 후 GitHub 계정으로 로그인한다.</li>
<li><strong>저장소 선택</strong>: 배포하고자 하는 원하는 레포지토리를 선택하여 import한다.</li>
<li><strong>배포 구성</strong>: Vercel은 프로젝트를 자동으로 감지하고 배포 구성을 설정한다(빌드 명령어 및 환경 변수는 추가 설정 가능).</li>
<li><strong>배포 실행</strong>: 프로젝트를 배포하려면 &#39;Deploy&#39; 버튼을 클릭한다.</li>
</ol>
<h3 id="배포-후-수정-사항">배포 후 수정 사항</h3>
<ul>
<li><strong>환경 변수 추가</strong>: Vercel 대시보드의 프로젝트 설정에서 필요한 환경 변수를 추가한다.</li>
<li><strong>빌드 명령어 수정</strong>: Prisma를 사용하는 경우 빌드 명령어를 <code>npx prisma generate &amp;&amp; next build</code>로 수정한다.</li>
<li><strong>OAuth 리다이렉트 URL 추가</strong>: 카카오, 네이버, 구글 디벨로퍼 콘솔에서 배포된 Vercel URL을 Redirect URI로 추가한다.</li>
<li><strong>도메인 설정</strong>: 커스텀 도메인을 사용하는 경우 Vercel 프로젝트 설정에서 도메인을 추가하고 DNS 설정을 진행한다.</li>
</ul>
<hr>
<h2 id="📙-cicd-파이프라인-이해하기">📙 CI/CD 파이프라인 이해하기</h2>
<h3 id="cicd의-장점">CI/CD의 장점</h3>
<ul>
<li><strong>자동화된 배포</strong>: 수동 배포 과정을 제거하여 배포 시간을 단축하고 휴먼 에러를 줄인다.</li>
<li><strong>빠른 피드백</strong>: 코드 변경 사항에 대한 즉각적인 피드백을 받을 수 있다.</li>
<li><strong>일관된 배포 프로세스</strong>: 모든 배포가 동일한 프로세스를 거쳐 일관성을 유지한다.</li>
<li><strong>품질 향상</strong>: 자동화된 테스트를 통해 코드 품질을 지속적으로 검증한다.</li>
</ul>
<h3 id="vercel의-배포-흐름">Vercel의 배포 흐름</h3>
<ol>
<li><strong>코드 푸시</strong>: 개발자가 GitHub 저장소에 코드를 푸시한다.</li>
<li><strong>자동 트리거</strong>: Vercel이 변경 사항을 감지하고 배포 프로세스를 자동으로 시작한다.</li>
<li><strong>빌드 과정</strong>: 설정된 빌드 명령어가 실행되고 정적 파일이 생성된다.</li>
<li><strong>Preview 배포</strong>: 브랜치별로 Preview URL이 생성되어 변경 사항을 미리 확인할 수 있다.</li>
<li><strong>프로덕션 배포</strong>: main/master 브랜치에 머지되면 프로덕션 환경으로 자동 배포된다.</li>
</ol>
<hr>
<h2 id="📒-vercel-활용-팁">📒 Vercel 활용 팁</h2>
<h3 id="preview-deployment-활용하기">Preview Deployment 활용하기</h3>
<ul>
<li>Pull Request를 생성하면 자동으로 Preview URL이 생성된다.</li>
<li>팀원들과 변경 사항을 공유하고 리뷰하기에 용이하다.</li>
<li>각 커밋마다 새로운 Preview가 생성되어 변경 이력을 추적할 수 있다.</li>
</ul>
<h3 id="성능-최적화">성능 최적화</h3>
<ul>
<li>Vercel은 전 세계 CDN을 통해 콘텐츠를 제공하여 로딩 속도를 최적화한다.</li>
<li>이미지 최적화를 위해 Next.js의 Image 컴포넌트를 활용하면 자동으로 최적화된다.</li>
<li>Analytics 기능을 활성화하여 성능 지표를 모니터링할 수 있다.</li>
</ul>
<h3 id="보안-관리">보안 관리</h3>
<ul>
<li>환경 변수를 통해 API 키와 같은 민감한 정보를 안전하게 관리한다.</li>
<li><code>.env.local</code> 파일은 Git에 커밋하지 않도록 <code>.gitignore</code>에 추가한다.</li>
<li>Vercel 대시보드에서만 환경 변수를 관리하여 보안을 강화한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] react-hook-form]]></title>
            <link>https://velog.io/@dev_vming/React-hook-form</link>
            <guid>https://velog.io/@dev_vming/React-hook-form</guid>
            <pubDate>Mon, 22 Dec 2025 12:05:40 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/cac3bf70-56ba-4e3d-9579-4b3a611f29a3/image.png" alt=""></p>
<h1 id="📚-react-hook-form">📚 React-hook-form</h1>
<hr>
<h2 id="📕-react-hook-form-이란">📕 React-hook-form 이란?</h2>
<h3 id="소개">소개</h3>
<ul>
<li>리액트 애플리케이션에서 폼 처리를 더욱 간편하게 만들어주는 라이브러리이다.</li>
</ul>
<h3 id="특징">특징</h3>
<ul>
<li><strong>폼 관리</strong> : 폼 요소의 상태와 유효성 검사를 관리하기 위한 라이브러리로, 필요한 상태를 간단한 훅으로 제공한다.</li>
<li><strong>훅 기반</strong> : Hook API를 사용하여 컴포넌트 내에서 폼 상태를 관리한다. (ex. useForm, useFieldArray, useWatch)</li>
<li><strong>커스텀 및 다양한 입력요소 지원</strong> : 모든 종류의 입력 요소 (텍스트, 라디오 버튼, 체크박스, 셀렉트 박스 등)와 커스텀 입력 요소를 지원한다.</li>
<li><strong>유효성 검사</strong> : 내장된 유효성 검사 규칙 또는 사용자 정의 검사 함수를 사용하여 입력값을 유효성 검사할 수 있다.</li>
<li><strong>폼 제출 처리</strong> : handleSubmit 함수를 사용하여 폼 제출을 처리하고, 필요한 로직을 실행할 수 있다.</li>
<li><strong>리액트 렌더링 최적화</strong> : 비제어 컴포넌트 방식으로 불필요한 리렌더링을 줄여 성능을 향상시킨다.</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li><strong>높은 성능</strong> : 비제어 컴포넌트를 사용하여 리렌더링 횟수를 최소화한다.</li>
<li><strong>작은 번들 사이즈</strong> : 의존성이 없고 가벼운 라이브러리이다. (약 9KB)</li>
<li><strong>간편한 통합</strong> : 기존 프로젝트에 쉽게 추가할 수 있으며, 다양한 UI 라이브러리와 호환할 수 있다.</li>
<li><strong>TypeScript 지원</strong> : 완벽한 타입스크립트 지원으로 타입 안정성을 보장한다.</li>
</ul>
<hr>
<h2 id="📗-설치-및-기본-설정">📗 설치 및 기본 설정</h2>
<h3 id="설치-방법">설치 방법</h3>
<pre><code class="language-bash">npm install react-hook-form
yarn add react-hook-form</code></pre>
<h3 id="기본-구조">기본 구조</h3>
<pre><code class="language-tsx">import { useForm } from &quot;react-hook-form&quot;;

function MyForm() {
    const {
        register,
        handleSubmit,
        formState: { errors },
    } = useForm();

    const onSubmit = (data) =&gt; {
        console.log(data);
    };

    return (
        &lt;form onSubmit={handleSubmit(onSubmit)}&gt;
            &lt;input {...register(&quot;name&quot;)} /&gt;
            &lt;button type=&quot;submit&quot;&gt;제출&lt;/button&gt;
        &lt;/form&gt;
    );
}</code></pre>
<hr>
<h2 id="📘-useform-주요-기능">📘 useForm 주요 기능</h2>
<h3 id="register">register</h3>
<pre><code class="language-tsx">// 기본 사용법
&lt;input {...register(&quot;name&quot;)} /&gt;

// 유효성 검사와 함께 사용
&lt;input 
    {...register(&quot;email&quot;, { 
        required: &quot;이메일은 필수입니다.&quot;,
        pattern: {
            value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
            message: &quot;올바른 이메일 형식이 아닙니다.&quot;
        }
    })} 
/&gt;

// 카테고리 선택 예시
&lt;select
    {...register(&quot;category&quot;, {
        required: true,
    })}
    className=&quot;block w-full rounded-md border-0 py-1.5&quot;
&gt;
    &lt;option value=&quot;&quot;&gt;카테고리 선택&lt;/option&gt;
    {CATEGORY_ARR.map((category) =&gt; (
        &lt;option key={category} value={category}&gt;
            {category}
        &lt;/option&gt;
    ))}
&lt;/select&gt;</code></pre>
<ul>
<li>폼 입력 요소를 react-hook-form에 등록하는 함수이다.</li>
<li>ref를 통해 입력 요소를 추적하고 값을 관리한다.</li>
<li>유효성 검사 규칙을 설정할 수 있다.</li>
</ul>
<h3 id="handlesubmit">handleSubmit</h3>
<pre><code class="language-tsx">const onSubmit = async (data) =&gt; {
    try {
        const result = await axios.post(&quot;/api/stores&quot;, data);
        if (result.status === 200) {
            toast.success(&quot;맛집을 등록했습니다.&quot;);
            router.replace(`/stores/${result.data.id}`);
        }
    } catch (e) {
        toast.error(&quot;데이터 생성 중 문제가 생겼습니다.&quot;);
    }
};

&lt;form onSubmit={handleSubmit(onSubmit)}&gt;
    {/* 폼 내용 */}
&lt;/form&gt;</code></pre>
<ul>
<li>폼 제출을 처리하는 함수이다.</li>
<li>유효성 검사를 통과한 경우에만 제출 함수를 실행한다.</li>
<li>두 개의 콜백 함수 사용할 수 있다. (성공 시, 실패 시)</li>
</ul>
<h3 id="formstate">formState</h3>
<pre><code class="language-tsx">const {
    formState: { errors, isSubmitting, isDirty },
} = useForm();

// 에러 메시지 표시
{errors.name?.type === &quot;required&quot; &amp;&amp; (
    &lt;div className=&quot;pt-2 text-xs text-red-600&quot;&gt;
        필수 입력 사항입니다.
    &lt;/div&gt;
)}

// 제출 중 버튼 비활성화
&lt;button type=&quot;submit&quot; disabled={isSubmitting}&gt;
    {isSubmitting ? &quot;처리 중...&quot; : &quot;등록하기&quot;}
&lt;/button&gt;</code></pre>
<ul>
<li>폼의 현재 상태를 담고 있는 객체이다.</li>
<li><code>errors, isDirty, isValid, isSubmitting 등의 정보</code>를 제공<ul>
<li><strong>errors</strong> : 각 필드의 유효성 검사 에러 정보를 담고 있다.</li>
<li><strong>isDirty</strong> : 사용자가 폼의 값을 변경했는지 여부를 나타낸다 (초기값과 다른 경우 true).</li>
<li><strong>dirtyFields</strong> : 변경된 필드들의 목록을 객체 형태로 제공한다.</li>
<li><strong>isValid</strong> : 모든 필드가 유효성 검사를 통과했는지 여부를 나타낸다.</li>
<li><strong>isSubmitting</strong> : 폼이 현재 제출 중인지 여부를 나타낸다 (비동기 제출 시 유용).</li>
<li><strong>isSubmitted</strong> : 폼이 제출되었는지 여부를 나타낸다.</li>
<li><strong>isSubmitSuccessful</strong> : 폼이 에러 없이 성공적으로 제출되었는지 여부를 나타낸다.</li>
<li><strong>submitCount</strong> : 폼이 제출된 횟수를 나타낸다.</li>
<li><strong>touchedFields</strong> : 사용자가 포커스했던 필드들의 목록을 나타낸다.</li>
<li><strong>isValidating</strong> : 유효성 검사가 진행 중인지 여부를 나타낸다 (비동기 검증 시).</li>
</ul>
</li>
</ul>
<h3 id="setvalue">setValue</h3>
<pre><code class="language-tsx">const { setValue } = useForm();

// 주소 검색 API 결과를 폼에 반영
const handleComplete = (data) =&gt; {
    let fullAddress = data.address;
    setValue(&quot;address&quot;, fullAddress);
};

// 데이터 불러오기 후 폼 초기화
useQuery(`store-${id}`, fetchStore, {
    onSuccess: (data) =&gt; {
        setValue(&quot;id&quot;, data.id);
        setValue(&quot;name&quot;, data.name);
        setValue(&quot;category&quot;, data.category);
        setValue(&quot;phone&quot;, data.phone);
    },
});</code></pre>
<ul>
<li>특정 필드의 값을 프로그래밍 방식으로 설정하는 함수이다.</li>
<li>외부 라이브러리나 API에서 받은 데이터를 폼에 반영할 때 유용하다.</li>
</ul>
<h3 id="reset">reset</h3>
<pre><code class="language-tsx">const { reset, resetField } = useForm();

// 전체 폼 초기화
&lt;button onClick={() =&gt; reset()}&gt;초기화&lt;/button&gt;

// 특정 필드만 초기화
const onSubmit = async (data) =&gt; {
    const result = await axios.post(&quot;/api/comments&quot;, data);
    if (result.status === 200) {
        resetField(&quot;body&quot;);
    }
};</code></pre>
<ul>
<li>폼 전체를 초기 상태로 되돌리는 함수이다.</li>
<li>특정 필드만 초기화하려면 resetField를 사용한다.</li>
</ul>
<h3 id="watch">watch</h3>
<pre><code class="language-tsx">const { watch } = useForm();

// 특정 필드 감시
const watchedValue = watch(&quot;fieldName&quot;);

// 모든 필드 감시
const allValues = watch();

// 조건부 렌더링
{watch(&quot;category&quot;) === &quot;한식&quot; &amp;&amp; (
    &lt;input {...register(&quot;subCategory&quot;)} /&gt;
)}</code></pre>
<ul>
<li>특정 필드의 값을 실시간으로 감시하는 함수이다.</li>
<li>입력 값에 따라 다른 필드를 동적으로 변경할 때 사용한다.</li>
</ul>
<hr>
<h2 id="📙-유효성-검사-규칙">📙 유효성 검사 규칙</h2>
<h3 id="기본-규칙">기본 규칙</h3>
<pre><code class="language-tsx">&lt;input
    {...register(&quot;name&quot;, {
        required: &quot;이름은 필수입니다.&quot;,
        minLength: {
            value: 2,
            message: &quot;최소 2자 이상 입력해주세요.&quot;
        },
        maxLength: {
            value: 20,
            message: &quot;최대 20자까지 입력 가능합니다.&quot;
        }
    })}
/&gt;

&lt;input
    {...register(&quot;phone&quot;, {
        required: true,
        pattern: {
            value: /^[0-9]{2,3}-[0-9]{3,4}-[0-9]{4}$/,
            message: &quot;올바른 전화번호 형식이 아닙니다.&quot;
        }
    })}
/&gt;</code></pre>
<ul>
<li><strong>required</strong> : 필수 입력 항목으로 지정한다.</li>
<li><strong>min / max</strong> : 숫자의 최소/최대값을 설정한다.</li>
<li><strong>minLength / maxLength</strong> : 문자열의 최소/최대 길이를 설정한다.</li>
<li><strong>pattern</strong> : 정규식 패턴을 사용한 검증을 수행한다.</li>
</ul>
<h3 id="커스텀-검증">커스텀 검증</h3>
<pre><code class="language-tsx">&lt;input
    {...register(&quot;password&quot;, {
        validate: {
            hasUpperCase: (value) =&gt; 
                /[A-Z]/.test(value) || &quot;대문자를 포함해야 합니다.&quot;,
            hasNumber: (value) =&gt; 
                /[0-9]/.test(value) || &quot;숫자를 포함해야 합니다.&quot;,
            minLength: (value) =&gt; 
                value.length &gt;= 8 || &quot;최소 8자 이상이어야 합니다.&quot;
        }
    })}
/&gt;

// 비동기 검증
&lt;input
    {...register(&quot;username&quot;, {
        validate: async (value) =&gt; {
            const exists = await checkUsernameExists(value);
            return !exists || &quot;이미 사용 중인 아이디입니다.&quot;;
        }
    })}
/&gt;</code></pre>
<ul>
<li><strong>validate</strong> : 사용자 정의 검증 함수를 작성 가능, 복잡한 검증 로직 구현에 사용한다.</li>
</ul>
<h3 id="에러-메시지-표시">에러 메시지 표시</h3>
<pre><code class="language-tsx">{errors.name &amp;&amp; (
    &lt;span className=&quot;text-red-600&quot;&gt;
        {errors.name.message}
    &lt;/span&gt;
)}

// type별 다른 메시지 표시
{errors.name?.type === &quot;required&quot; &amp;&amp; (
    &lt;div className=&quot;pt-2 text-xs text-red-600&quot;&gt;
        필수 입력 사항입니다.
    &lt;/div&gt;
)}
{errors.name?.type === &quot;minLength&quot; &amp;&amp; (
    &lt;div className=&quot;pt-2 text-xs text-red-600&quot;&gt;
        최소 2자 이상 입력해주세요.
    &lt;/div&gt;
)}</code></pre>
<ul>
<li>errors 객체를 통해 검증 실패 시 에러 메시지를 표시할 수 있다.</li>
</ul>
<hr>
<h2 id="📒-고급-기능-및-이슈-해결-방법">📒 고급 기능 및 이슈 해결 방법</h2>
<h3 id="usefieldarray">useFieldArray</h3>
<pre><code class="language-tsx">import { useForm, useFieldArray } from &quot;react-hook-form&quot;;

function DynamicForm() {
    const { control, register } = useForm({
        defaultValues: {
            items: [{ name: &quot;&quot;, price: 0 }]
        }
    });

    const { fields, append, remove } = useFieldArray({
        control,
        name: &quot;items&quot;
    });

    return (
        &lt;form&gt;
            {fields.map((field, index) =&gt; (
                &lt;div key={field.id}&gt;
                    &lt;input {...register(`items.${index}.name`)} /&gt;
                    &lt;input {...register(`items.${index}.price`)} /&gt;
                    &lt;button type=&quot;button&quot; onClick={() =&gt; remove(index)}&gt;
                        삭제
                    &lt;/button&gt;
                &lt;/div&gt;
            ))}
            &lt;button
                type=&quot;button&quot;
                onClick={() =&gt; append({ name: &quot;&quot;, price: 0 })}
            &gt;
                항목 추가
            &lt;/button&gt;
        &lt;/form&gt;
    );
}</code></pre>
<ul>
<li>동적으로 입력 필드를 추가/제거할 수 있는 훅이다.</li>
<li>배열 형태의 데이터를 다룰 때 유용하다.</li>
</ul>
<h3 id="usewatch">useWatch</h3>
<pre><code class="language-tsx">import { useForm, useWatch } from &quot;react-hook-form&quot;;

function WatchExample() {
    const { control, register } = useForm();

    const watchedValue = useWatch({
        control,
        name: &quot;category&quot;,
        defaultValue: &quot;&quot;
    });

    return (
        &lt;div&gt;
            &lt;select {...register(&quot;category&quot;)}&gt;
                &lt;option value=&quot;&quot;&gt;선택&lt;/option&gt;
                &lt;option value=&quot;A&quot;&gt;A 타입&lt;/option&gt;
                &lt;option value=&quot;B&quot;&gt;B 타입&lt;/option&gt;
            &lt;/select&gt;

            {watchedValue === &quot;A&quot; &amp;&amp; (
                &lt;input {...register(&quot;aSpecific&quot;)} /&gt;
            )}
            {watchedValue === &quot;B&quot; &amp;&amp; (
                &lt;input {...register(&quot;bSpecific&quot;)} /&gt;
            )}
        &lt;/div&gt;
    );
}</code></pre>
<ul>
<li>watch보다 더 세밀한 제어가 가능한 훅이다.</li>
<li>특정 필드의 변경을 감지하여 다른 로직을 실행할 수 있다.</li>
</ul>
<h3 id="리렌더링-최적화">리렌더링 최적화</h3>
<pre><code class="language-tsx">// 비효율적
const allValues = watch();

// 효율적
const specificValue = watch(&quot;fieldName&quot;);

// 또는 useWatch 사용
const specificValue = useWatch({
    control,
    name: &quot;fieldName&quot;
});</code></pre>
<ul>
<li>watch 사용 시 불필요한 리렌더링이 발생할 수 있다.</li>
<li>useWatch나 컨트롤러를 사용하여 최적화할 수 있다.</li>
</ul>
<h3 id="기본값-설정">기본값 설정</h3>
<pre><code class="language-tsx">// 방법 1: defaultValues 사용 (초기 렌더링에만 적용)
const { register } = useForm({
    defaultValues: {
        name: &quot;기본 이름&quot;,
        email: &quot;default@email.com&quot;
    }
});

// 방법 2: setValue 사용 (동적으로 변경 가능)
useEffect(() =&gt; {
    setValue(&quot;name&quot;, fetchedData.name);
    setValue(&quot;email&quot;, fetchedData.email);
}, [fetchedData]);

// 방법 3: reset 사용 (전체 폼 초기화)
useEffect(() =&gt; {
    reset(fetchedData);
}, [fetchedData]);</code></pre>
<ul>
<li>수정 폼에서 기본값을 설정할 때는 useForm의 defaultValues를 사용하거나 setValue를 사용한다.</li>
<li>defaultValues는 초기 렌더링 시에만 적용된다.</li>
</ul>
<h3 id="타입-지정">타입 지정</h3>
<pre><code class="language-tsx">interface FormData {
    name: string;
    email: string;
    age: number;
    category: string;
}

const {
    register,
    handleSubmit,
    formState: { errors },
} = useForm&lt;FormData&gt;();

// register 사용 시 자동완성 지원
&lt;input {...register(&quot;name&quot;)} /&gt;
&lt;input {...register(&quot;wrong&quot;)} /&gt; // 타입 에러</code></pre>
<ul>
<li>제네릭을 사용하여 폼 데이터의 타입을 명확하게 지정한다.</li>
<li>타입 안정성을 보장하고 자동완성을 활용할 수 있다.</li>
</ul>
<h3 id="비동기-제출-처리">비동기 제출 처리</h3>
<pre><code class="language-tsx">const {
    handleSubmit,
    formState: { isSubmitting },
} = useForm();

const onSubmit = async (data) =&gt; {
    try {
        await api.post(&quot;/endpoint&quot;, data);
        toast.success(&quot;성공!&quot;);
    } catch (error) {
        toast.error(&quot;실패!&quot;);
    }
};

&lt;button type=&quot;submit&quot; disabled={isSubmitting}&gt;
    {isSubmitting ? &quot;처리 중...&quot; : &quot;제출&quot;}
&lt;/button&gt;</code></pre>
<ul>
<li>async/await를 사용하여 비동기 로직을 처리한다.</li>
<li>로딩 상태를 관리하여 사용자 경험을 개선한다.</li>
</ul>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[ react-hook-form 공식문서] (<a href="https://react-hook-form.com/">https://react-hook-form.com/</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Prisma]]></title>
            <link>https://velog.io/@dev_vming/TIL-Prisma</link>
            <guid>https://velog.io/@dev_vming/TIL-Prisma</guid>
            <pubDate>Wed, 07 May 2025 02:46:14 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/8472f942-5687-42ae-9135-fa8d1ec88d5d/image.png" alt=""></p>
<h1 id="📚-prisma">📚 prisma</h1>
<hr>
<h2 id="📕-prisma-란">📕 prisma 란?</h2>
<h3 id="소개">소개</h3>
<ul>
<li>Node.js 기반의 ORM(Object-Relational Mapping)도구이다.</li>
<li>데이터베이스와의 상호작용을 단순화하고 개발 생산성을 높이는 데 도움을 주는 도구이다.</li>
<li>SQL 쿼리를 직접 작성하는 대신 자바스크립트 코드로 쿼리를 작성할 수 있게 해주며, 타입 세이프한 쿼리 작성을 통해 런타임 에러를 방지해준다.</li>
<li>데이터베이스 스키마 변경을 감지하고 자동으로 마이그레이션을 처리해준다.</li>
<li>복잡한 쿼리 및 데이터베이스 관계를 다루기 위한 강력한 문법을 제공한다.</li>
</ul>
<h3 id="구성요소">구성요소</h3>
<ul>
<li>Prisma Client : 프리즈마의 Node.js &amp; TypeScript 용 쿼리 작성 클라이언트</li>
<li>Prisma Migrate : 프리즈마의 마이그레이션 시스템</li>
<li>Prisma Studio : 프리즈마의 데이터를 보고 편집하는 GUI</li>
</ul>
<hr>
<h2 id="📗-prisma-기능">📗 Prisma 기능</h2>
<h3 id="prisma-client">Prisma Client</h3>
<ul>
<li>데이터베이스와 상호작용하기 위한 자바스크립트 코드를 자동으로 생성해준다.</li>
<li>데이터베이스의 스키마를 정의하고 관리한다.</li>
<li>데이터베이스 스키마 변경을 추적하고 적용할 수 있는 마이그레이션 기능을 제공한다.</li>
<li>복잡한 데이터베이스 관계를 정의하고 쿼리 기능을 제공한다.</li>
</ul>
<h3 id="prisma-스키마">Prisma 스키마</h3>
<ul>
<li>Model : 데이터 베이스의 특정 테이블이나 컬렉션과 대응한다.</li>
<li>Field : 모델 내에서 필드는 해당 모델이 가지는 데이터 속성을 나타낸다. 데이터 타입과 제약조건을 지정할 수 있다.</li>
<li>Relation : 모델 간의 연결을 나타낸다. 외래 키를 관리하고 연관된 데이터를 쿼리할 수 있다.</li>
</ul>
<hr>
<h2 id="📘-prisma-사용법">📘 Prisma 사용법</h2>
<h3 id="초기-셋팅">초기 셋팅</h3>
<ul>
<li>Prisma Schema에 generator를 정의한다.</li>
</ul>
<pre><code class="language-jsx">generator client {
    provider = &quot;prisma-client-js&quot;
}</code></pre>
<ul>
<li>prisma/client 패키지 설치 후 prisma를 생성한다.</li>
</ul>
<pre><code class="language-bash">yarn add @prisma/client
prisma generator</code></pre>
<ul>
<li>Prisma Client를 인스턴스화해서 사용할 수 있다.</li>
</ul>
<pre><code class="language-jsx">import { PrismaClient } from &quot;@prisma/client&quot;

const prisma = new PrismaClient()</code></pre>
<h3 id="crud-문법-예시">CRUD 문법 예시</h3>
<ul>
<li>데이터를 <code>생성</code>하기 위해서 create API를 사용한다.</li>
</ul>
<pre><code class="language-jsx">const user = await prisma.user.create({
    data: {
        email: &quot;user@prisma.io&quot;,
        name : &quot;user&quot;,
    },
})</code></pre>
<ul>
<li>prisma로 데이터를 조회하기 위해서는 findMany 또는 findUnique와 같은 메서드를 사용하면 된다.</li>
<li>where, orderBy, include, select 등의 옵션으로 쿼리를 조절 할 수 있다.</li>
</ul>
<pre><code class="language-jsx">const users = await prisma.user.findMany({
    where: {
        age: {
            gte: 18
        }
    },
    orderBy: {
        name: &quot;asc&quot;
    },
    include: {
        posts: true
    },
    select: {
        id: true,
        name: true
    }
});</code></pre>
<ul>
<li>데이터를 <code>수정</code>하기 위해 Update 메서드를 사용한다.</li>
<li>하나만 수정하기 위해서는 Update 메서드를 사용하고, 여러 레코드를 한번에 업데이트 하려면 updateMany 메서드를 사용한다.</li>
</ul>
<pre><code class="language-jsx">const updateUser = await prisma.user.update({
    where: {
        id: 1
    },
    data: {
        name: &quot;Upadated Name&quot;
    }
});</code></pre>
<ul>
<li>데이터를 삭제하기 위해서는 delete 메서드를 사용한다.</li>
<li>하나만 삭제하기 위해서는 delete 메서드, 여러 레코드 삭제를 위해서는 deleteMany 메서드를 사용한다.</li>
</ul>
<pre><code class="language-jsx">const deleteUser = await prisma.user.delete({
    where: {
        id: 1
    }
});

const deleteUsers = await prisma.user.deleteMany({
    where: {
        email: {
            contains: &quot;prisma.io&quot;,
        },
    },
});</code></pre>
<h3 id="마이그레이션">마이그레이션</h3>
<ul>
<li>스키마를 DB에 반영하기 위해서는 마이그레이션 명령어를 작성한다.</li>
</ul>
<pre><code class="language-bash">npx prisma migrate dev
npx prisma migrate dev --name init</code></pre>
<ul>
<li>마이그레이션 된 파일들은 prisma/migration에 생성. 현재 날짜와 시간, 그리고 —name 문자열 조합의 이름을 가진다.</li>
</ul>
<pre><code class="language-bash">ㄴprisma
    ㄴschema/prisma
    ㄴmigrations
        ㄴ20250413052907_init
            ㄴmigration.sql</code></pre>
<ul>
<li>마이그레이션 파일들은 직접 수정하면 안 된다.</li>
<li>항상 prisma migrate 명령어를 통해서만 파일 생성 / 디비 수정을 해야한다.</li>
<li>다음과 같은 파일이 만들어지면, 실제 테이블이 DB에도 만들어지며, 데이터 CRUD가 가능해진다.</li>
</ul>
<hr>
<h2 id="📙-prisma-셋팅방법">📙 prisma 셋팅방법</h2>
<h3 id="셋팅-방법">셋팅 방법</h3>
<pre><code class="language-bash">yarn add --dev prisma
npx prisma init

// supabase db url .env 에 설정 이후

yarn add @prisma/client

// 연결 확인
npx prisma studio 

// 스키마 파일 작성 후 마이그레이션 진행</code></pre>
<h3 id="새-프로젝트-시작-개발-환경">새 프로젝트 시작 (개발 환경)</h3>
<pre><code class="language-bash">// 초기 설정
npx prisma init

// schema.prisma 작성 (모델 정의)

// 마이그레이션 생성 및 DB 반영
npx prisma migrate dev --name init

// prisma 클라이언트 생성
npx prisma generate</code></pre>
<h3 id="기존-데이터베이스에서-시작할-때">기존 데이터베이스에서 시작할 때</h3>
<pre><code class="language-bash">// 초기 설정
npx prisma init

// 기존 DB에서 모델 불러오기
npx prisma db pull

// prisma 클라이언트 생성
npx prisma generate</code></pre>
<hr>
<h2 id="📒-prisma-data-seed">📒 prisma data seed</h2>
<h3 id="data-seed-란">data seed 란?</h3>
<ul>
<li><p>초기 데이터나 테스트 데이터를 생성하고 채우는 과정이다.</p>
</li>
<li><p>스키마 모델링 이후, 마이그레이션 명령어를 입력하면 된다.</p>
</li>
<li><p>package.json 파일에 seed 스크립트 추가한다.</p>
<ul>
<li><p>yarn add —dev ts-node</p>
<pre><code class="language-jsx">&quot;prisma&quot; : {
  &quot;seed&quot; : &quot;ts-node --compiler-options
  {\&quot;module\&quot;:\&quot;CommonJS\&quot;} prisma/seed.ts&quot;
},</code></pre>
</li>
</ul>
</li>
<li><p>Prisma 폴더 내에 seed.ts 파일 생성 후 seed 코드를 작성한다.</p>
</li>
</ul>
<pre><code class="language-jsx">import { PrismaClient } from &quot;@prisma/client&quot;;

const prisma = new PrismaClient();

async function seedData() {
    // seed 코드 작성
}

async function main() {
    await seedData();
}

main()
    .catch((e) =&gt; {
        console.log(e);
        process.exit(1);
    })
    .finally(() =&gt; {
        prisma.$disconnect();
    });</code></pre>
<ul>
<li>seed 함수 예시</li>
</ul>
<pre><code class="language-jsx">async function seedData() {
    data?.[&quot;DATA&quot;]?.map(async (store) =&gt; {
        const storeData = {
            phone: store?.tel_no,
            ...
        };
        const result = await prisma.store.create({data: storeData});
        console.log(result);
    });
}</code></pre>
<ul>
<li>npx prisma로 데이터 시드를 실행한다.</li>
</ul>
<pre><code class="language-jsx">npx prisma db seed</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Next.js] CSR vs SSR vs SSG]]></title>
            <link>https://velog.io/@dev_vming/Next.js-CSR-vs-SSR-vs-SSG</link>
            <guid>https://velog.io/@dev_vming/Next.js-CSR-vs-SSR-vs-SSG</guid>
            <pubDate>Tue, 15 Apr 2025 07:07:26 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/1712793f-62b8-4f29-b872-e03b1753f2b0/image.png" alt=""></p>
<h1 id="📚-csr-vs-ssr-vs-ssg">📚 CSR vs SSR vs SSG</h1>
<hr>
<h2 id="📕-csr">📕 CSR</h2>
<h3 id="소개">소개</h3>
<ul>
<li>클라이언트 측에서 페이지 렌더링을 수행하는 방식이다.</li>
<li>사용자의 브라우저에서 JavaScript를 사용하여 페이지를 동적으로 생성한다.</li>
<li>서버는 빈 HTML 페이지만 제공하고, 이후 데이터 &amp; 페이지를 렌더링하는 역할은 클라이언트가 수행한다.</li>
<li>주로 웹 애플리케이션에서 클라이언트 측 라우팅 및 상호작용이 많은 경우에 사용한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/7d0924e9-0846-46a7-9917-9e42bbf3b17f/image.png" alt=""></p>
<h3 id="장점">장점</h3>
<ul>
<li><strong>상호 작용성</strong> : 클라이언트에서 페이지를 렌더링 하므로 사용자와의 상호 작용이 빠르게 이루어진다.</li>
<li><strong>서버 부하 감소</strong> : 서버는 초기 HTML만 제공하고 이후에는 클라이언트에서 데이터를 로드한다.</li>
<li><strong>자연스러운 앱 경험</strong> : 싱글 페이지 애플리케이션 (SPA)으로 구현되는 경우가 많은데, 이는 자연스러운 앱과 유사한 사용자 경험을 제공한다.</li>
</ul>
<h3 id="단점">단점</h3>
<ul>
<li><strong>SEO 어려움</strong> : 검색엔진은 JS 실행 후의 콘텐츠를 색인화하기 때문에, 비교적 설정하기 까다롭다.</li>
<li><strong>그 외</strong> : 초기 로딩 후 콘텐츠 표시까지 시간이 걸리는 문제, 성능 문제, JS에 의존하는 문제 등이 있다.</li>
</ul>
<hr>
<h2 id="📗-ssr">📗 SSR</h2>
<h3 id="소개-1">소개</h3>
<ul>
<li>서버에서 페이지를 미리 생성한 뒤, 사용자가 요청 할 때마다 페이지를 렌더링하는 방식이다.</li>
<li>사용자가 페이지에 접속할 때 서버에서 미리 HTML을 생성하고 클라이언트로 보낸다.</li>
<li>사용자에게 초기 내용을 빠르게 표시하고 검색 엔진 최적화를 개선하는데 도움을 준다.</li>
<li>주로 동적 콘텐츠를 포함하고 있는 웹 애플리케이션에 적합하다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/aab5cf30-2826-468b-a367-ac2a83460ab7/image.png" alt=""></p>
<h3 id="장점-1">장점</h3>
<ul>
<li><strong>SEO 최적화</strong> : 서버에서 렌더링 된 페이지들은 검색 엔진에서 쉽게 색인화 가능</li>
<li><strong>초기 로딩 속도 개선</strong> : 사용자에게 초기 컨텐츠를 더 빠르게 표시할 수 있다.</li>
<li><strong>데이터 최신화</strong> : 매 요청마다 최신 데이터를 가져올 수 있다.</li>
</ul>
<h3 id="단점-1">단점</h3>
<ul>
<li><strong>서버 부하</strong> : 매 요청마다 서버에서 페이지를 가져오면서 서버 자원을 많이 사용할 수 있다.</li>
<li><strong>느린 네트워크 연결</strong> : 서버에서 HTML을 생성해서 가져오는데, 느린 네트워크 영향을 받으면 초기 로딩이 느려질 수 있다.</li>
</ul>
<hr>
<h2 id="📘-ssg">📘 SSG</h2>
<h3 id="소개-2">소개</h3>
<ul>
<li>SSG는 페이지를 사전에 빌드 시점에 한 번 생성하고 정적 파일로 제공하는 방식이다.</li>
<li>여러번 요청을 해도 빌드된 파일을 제공한다. (변화 X)</li>
<li>기본적으로 Next는 SSG 방식으로 데이터를 페칭한다.</li>
<li>하지만 정적 데이터를 사용하므로 동적 콘텐츠에는 제한이 있다.</li>
<li>주로 블로그, 포트폴리오 웹 사이트, 회사 홈페이지 등 정적인 사이트에 사용한다.</li>
</ul>
<h3 id="장점-2">장점</h3>
<ul>
<li><strong>SEO 우수</strong> : 초기 로딩 속도가 빨라 SEO가 우수하다.</li>
<li><strong>서버 부하 낮음</strong> : 미리 빌드된 페이지를 제공하므로 서버 부하가 낮다.</li>
</ul>
<h3 id="단점-2">단점</h3>
<ul>
<li>동적 데이터에 제한적이다.</li>
<li>업데이트 된 데이터에 대한 재빌드가 필요하다.</li>
</ul>
<hr>
<h2 id="📙-요약">📙 요약</h2>
<h3 id="csr-vs-ssr-vs-ssg">CSR vs SSR vs SSG</h3>
<ul>
<li>CSR : 초기 로딩이 빠르지만 SEO가 어려우며 클라이언트에서 데이터 로딩 필요</li>
<li>SSR : 초기 로딩이 빠르고 SEO가 우수하지만 서버부하가 증가할 수 있음</li>
<li>SSG : 초기 로딩이 빠르고 SEO 가 우수하며 서버부하가 낮지만 동적 데이터에 제한이 있음</li>
</ul>
<p>⇒ next.js는 세가지 방법 모두 지원! 적절하게 사용하는것이 중요</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] Firebase]]></title>
            <link>https://velog.io/@dev_vming/TIL-Firebase</link>
            <guid>https://velog.io/@dev_vming/TIL-Firebase</guid>
            <pubDate>Wed, 12 Mar 2025 08:59:34 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/1bf5236c-0275-4e9b-963f-2fd099256f76/image.png" alt=""></p>
<h1 id="📚-firebase">📚 Firebase</h1>
<hr>
<h2 id="📕-firebase란">📕 Firebase란?</h2>
<h3 id="소개">소개</h3>
<ul>
<li>실시간 데이터베이스, 인증, 스토리지, 분석 등 다양한 기능을 제공하는 모바일 및 웹앱 개발 플랫폼이다.</li>
<li>2011년 스타트업에서 시작했다. (실시간 채팅 기능) → 2014년 구글이 인수했다. (백엔드 서버리스)</li>
<li>백엔드 서버를 구축하고 관리할 필요 없이 google cloud platform 이용해 빠르고 효율적인 개발이 가능하다.</li>
<li>특히 실시간 기능 서비스나, 클라이언트 사이드 집중하고싶을 때, 초기 프로토타입 개발에 유용하다.</li>
</ul>
<h3 id="주요-기능">주요 기능</h3>
<ul>
<li>Authentication : 다중 플랫폼 로그인을 간편하게 구현할 수 있다.<ul>
<li>이메일 인증, 소셜 미디어 계정 인증, 전화번호 인증방식을 제공한다.</li>
<li>보안 강화, 사용자 인증 과정 안전하게 처리한다.</li>
</ul>
</li>
<li>Firestore : NoSQL 데이터베이스이다.<ul>
<li>Firebase에서 제공하는 NoSQL 형식의 클라우드 데이터 베이스이다.</li>
<li>실시간 데이터 동기화를 지원한다. (ex. 실시간 채팅)</li>
</ul>
</li>
<li>Storage: 사진 및 동영상을 저장할 수 있다.<ul>
<li>사용자의 파일 저장 및 공유가 가능하고, 강력한 보안을 기대할 수 있다.</li>
</ul>
</li>
<li>Hosting : 웹앱 호스팅이 가능하다.<ul>
<li>정적 및 동적 콘텐츠 모두 호스팅 가능하며, 웹 앱을 간단 배포할 수 있다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📗-firebase-특징">📗 Firebase 특징</h2>
<h3 id="장점">장점</h3>
<ul>
<li>백엔드 서버없이 개발이 가능해 시간이 절약되고, 클라이언트에 집중 가능하다.</li>
<li>사용자 데이터 실시간 공유, 실시간 채팅 등 실시간 데이터 베이스 기반 기능 개발이 쉽다.</li>
<li>google cloud platform 서비스 간편하게 이용 및 분석 가능하다.</li>
</ul>
<h3 id="단점">단점</h3>
<ul>
<li>NoSQL 데이터 베이스의 간단한 쿼리만 사용 가능하다.</li>
<li>확장성이 중요한 경우 비용이 빠르게 증가할 수 있다.</li>
<li>타 백엔드 서비스로 전환하는 경우 추가적인 작업이 필요하다. (마이그레이션 어려움)</li>
</ul>
<hr>
<h2 id="📘-firebase-설정-방법">📘 Firebase 설정 방법</h2>
<h3 id="프로젝트-생성">프로젝트 생성</h3>
<ul>
<li>프로젝트 만들기</li>
</ul>
<h3 id="firebase-앱-설정">Firebase 앱 설정</h3>
<ul>
<li>생성된 Firebase 프로젝트 페이지에서, “웹”을 선택하고 앱의 별칭을 입력할 수 있다.</li>
<li>Firebase SDK를 추가하는 과정에서, Firebase가 제공하는 구성 객체를 복사한다.</li>
</ul>
<h3 id="react-프로젝트에-firebase-설치">React 프로젝트에 Firebase 설치</h3>
<pre><code class="language-bash">yarn add firebase</code></pre>
<h3 id="react-앱에서-firebase-초기화">React 앱에서 Firebase 초기화</h3>
<pre><code class="language-jsx">import firebase from &#39;firebase/app&#39;;

const firebaseConfig = {
    apiKey: &quot;YOUR_API_KEY&quot;,
    authDomain: &quot;YOUR_AUTH_DOMAIN&quot;,
    projectId: &quot;YOUR_PROJECT_ID&quot;,
    storageBucket: &quot;YOUR_STORAGE_BUCKET&quot;,
    messagingSenderId: &quot;YOUR_MESSAGING_SENDER_ID&quot;,
    appID: &quot;YOUR_APP_ID&quot;
};

firebase.initializeApp(firebaseConfig);</code></pre>
<h3 id="react-앱에서-firebase-사용">React 앱에서 firebase 사용</h3>
<pre><code class="language-jsx">import &#39;firebase/auth&#39;;
import &#39;firebase/firestore&#39;;

const auth = firebase.auth();
const db = firebase.firestore();</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[CSS] 인접 형제 선택자]]></title>
            <link>https://velog.io/@dev_vming/CSS-%EC%9D%B8%EC%A0%91-%ED%98%95%EC%A0%9C-%EC%84%A0%ED%83%9D%EC%9E%90</link>
            <guid>https://velog.io/@dev_vming/CSS-%EC%9D%B8%EC%A0%91-%ED%98%95%EC%A0%9C-%EC%84%A0%ED%83%9D%EC%9E%90</guid>
            <pubDate>Thu, 27 Feb 2025 22:00:58 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/a9515a02-323a-40fd-b012-0a3d0c322155/image.png" alt=""></p>
<h1 id="📚-인접-형제-선택자">📚 인접 형제 선택자</h1>
<hr>
<h2 id="📕--선택자">📕 + 선택자</h2>
<h3 id="기본-문법">기본 문법</h3>
<pre><code class="language-css">A + B {
...
}</code></pre>
<ul>
<li>A와 같은 부모를 가지면서, 바로 다음에 나오는 B 요소만 선택된다.</li>
<li>A와 B 사이에 다른 요소가 있으면 적용되지 않는다.</li>
</ul>
<h3 id="예제">예제</h3>
<pre><code class="language-html">&lt;h1&gt;첫번째 제목&lt;/h1&gt;
&lt;p&gt;이 문장은 빨간색이 됩니다.&lt;/p&gt;
&lt;p&gt;이 문장은 영향을 받지 않습니다.&lt;/p&gt;</code></pre>
<pre><code class="language-css">h1 + p {
 color: red;
}</code></pre>
<ul>
<li>첫 번째 <code>&lt;h1&gt;</code> 바로 뒤에 오는 <code>&lt;p&gt;</code>만 빨간색으로 변경된다.</li>
<li>두 번째 <code>&lt;p&gt;</code>는 스타일이 적용되지 않는다.</li>
<li>h1과 같은 부모를 가진 p 중에서 바로 뒤에 위치한 한 개만 선택되는 것이다.</li>
</ul>
<hr>
<h2 id="📗--선택자">📗 ~ 선택자</h2>
<h3 id="기본-문법-1">기본 문법</h3>
<pre><code class="language-css">A ~ B { 
  ...
}</code></pre>
<ul>
<li>같은 부모를 가진 A 뒤에 위치하는 모든 B 요소를 선택한다.</li>
<li>바로 뒤가 아니라도 선택 가능하다. (형제 관계만 유지하면 된다.)</li>
</ul>
<h3 id="예제-1">예제</h3>
<pre><code class="language-html">&lt;input type=&quot;radio&quot; id=&quot;img-1&quot; name=&quot;carousel&quot; checked&gt;
&lt;input type=&quot;radio&quot; id=&quot;img-2&quot; name=&quot;carousel&quot;&gt;
&lt;input type=&quot;radio&quot; id=&quot;img-3&quot; name=&quot;carousel&quot;&gt;

&lt;div class=&quot;carousel__dots&quot;&gt;
  &lt;label id=&quot;img-dot-1&quot; for=&quot;img-1&quot;&gt;&lt;/label&gt;
  &lt;label id=&quot;img-dot-2&quot; for=&quot;img-2&quot;&gt;&lt;/label&gt;
  &lt;label id=&quot;img-dot-3&quot; for=&quot;img-3&quot;&gt;&lt;/label&gt;
&lt;/div&gt;</code></pre>
<pre><code class="language-css">input#img-1:checked ~ .carousel__dots label#img-dot-1,
input#img-2:checked ~ .carousel__dots label#img-dot-2,
input#img-3:checked ~ .carousel__dots label#img-dot-3 {
  background-color: black;
  opacity: 1;
}</code></pre>
<ul>
<li>input#img-1:checked ~ .carousel__dots label#img-dot-1<ul>
<li>#img-1이 체크되면 #img-dot-1의 스타일이 변경된다.</li>
</ul>
</li>
<li>현재 선택된 슬라이드에 해당하는 도트 버튼을 강조하는 역할을 한다.</li>
</ul>
<hr>
<h2 id="📘--vs-인접-형제-선택자의-차이">📘 ~ vs +(인접 형제 선택자)의 차이</h2>
<table>
<thead>
<tr>
<th>선택자</th>
<th>의미</th>
<th>적용 대상</th>
</tr>
</thead>
<tbody><tr>
<td><code>A + B</code></td>
<td><strong>A 바로 뒤에 나오는 B</strong></td>
<td>A와 <strong>바로 인접한</strong> B 1개</td>
</tr>
<tr>
<td><code>A ~ B</code></td>
<td><strong>A 뒤에 나오는 모든 B</strong></td>
<td>A와 같은 부모를 가진 <strong>모든 B</strong></td>
</tr>
</tbody></table>
<h3 id="예제-2"><strong>예제</strong></h3>
<pre><code class="language-css">h1 + p { color: red; } /* h1 바로 뒤의 p만 선택 */
h1 ~ p { color: blue; } /* h1 뒤에 오는 모든 p 선택 */</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] VueJS]]></title>
            <link>https://velog.io/@dev_vming/TIL-VueJS</link>
            <guid>https://velog.io/@dev_vming/TIL-VueJS</guid>
            <pubDate>Wed, 19 Feb 2025 12:50:29 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/68d4fab6-7d5c-4462-af05-beab96c51df5/image.png" alt=""></p>
<h1 id="📚-vuejs">📚 Vue.js</h1>
<hr>
<h2 id="📕-현대적-웹-프레임워크의-정립">📕 현대적 웹 프레임워크의 정립</h2>
<h3 id="정립-과정">정립 과정</h3>
<ul>
<li><code>MVVM 패턴의 등장</code> : 화면과 데이터의 분리, 템플릿과 데이터의 변화를 통해 화면을 제어한다.</li>
<li><code>SPA (Single Page Application)</code> 가 대중화 되었다.</li>
<li>모듈화와 빌드 도구가 등장하였다.</li>
<li>컴포넌트 기반 개발이 등장하였다.</li>
<li><strong>현대 프레임워크가 정립</strong>되었다.</li>
</ul>
<h3 id="mvvm에서-컴포넌트로의-진화">MVVM에서 컴포넌트로의 진화</h3>
<ul>
<li>MVVM 패턴을 통해 개발이 훨씬 간단해지고 규모가 커졌다.</li>
<li>대규모 서비스 개발 과정에서 UI들이 반복적으로 나타나는 것 발견하였다.</li>
<li>화면과 기능이 결합되어 반복적으로 등장하는 UI 형태를 재사용하고자 하는 요구가 발생하게 되었다.</li>
<li>별도의 재사용 가능한 컴포넌트로 만들어 조립해서 개발하는 방식이 등장하였다.</li>
</ul>
<hr>
<h2 id="📗-vuejs-소개">📗 Vue.js 소개</h2>
<h3 id="등장-배경">등장 배경</h3>
<ul>
<li>knockout.js, angular.js 등의 프레임워크들의 발전을 바탕으로 등장하게 되었다.</li>
<li>더 직관적이고 간소화된 현대적 MVVM 프레임워크 개념으로 정립되었다.</li>
</ul>
<hr>
<h2 id="📘-vuejs-핵심-개념">📘 Vue.js 핵심 개념</h2>
<h3 id="directive"><strong>Directive</strong></h3>
<ul>
<li>지시어를 분리하여 독립적이고 간결한 지시어로 작성한다. (knockout의 data-bind)<ul>
<li><strong>Text Binding</strong> : <div><code>{{message}}</code></div></li>
<li><strong>Attribute Binding</strong> : &lt;div <code>:id=””</code>&gt;,&lt;img <code>:src=””</code>&gt;</li>
<li><strong>Event Listener</strong> : &lt;div <code>@click=””</code>&gt;</li>
</ul>
</li>
</ul>
<h3 id="양방향-바인딩">양방향 바인딩</h3>
<ul>
<li>value의 변화에 model의 값을 변경, model 값의 변경에 따라 Control의 value값을 변경하는 기능이다.<ul>
<li>&lt;input <code>v-model=”data”</code>/&gt;</li>
</ul>
</li>
</ul>
<h3 id="구조-변화">구조 변화</h3>
<ul>
<li><strong>조건부 렌더링</strong> : 조건이 되었을 때만 보이는 지시자, 주로 템플릿과 사용한다.<ul>
<li>&lt;template <code>v-if=”cond”</code>&gt;</li>
</ul>
</li>
<li><strong>리스트 렌더링</strong> : foreach와 유사, 목록형 컨텐츠 생성하는 지시자이다.<ul>
<li>&lt;template <code>v-for=”todo in todos”</code>&gt;</li>
</ul>
</li>
</ul>
<h3 id="모델의-변화">모델의 변화</h3>
<ul>
<li><strong>computed</strong> : 기존 모델 데이터로부터 유도되는 값을 만드는 기능이다.</li>
<li><strong>watch</strong> : 기존 모델의 값이 변경될 때 마다 처리할 수 있는 기능이다.</li>
</ul>
<h3 id="컴포넌트">컴포넌트</h3>
<ul>
<li><strong>component</strong> : 화면의 기능이 결합된 재사용 가능한 UI 조각이다.</li>
<li><strong>props</strong> : 컴포넌트에 필요한 데이터를 전달하기 위한 방법이다.</li>
<li><strong>Emit</strong> : 자식 컴포넌트에서 부모 컴포넌트로 이벤트를 전달하는 방법이다.</li>
<li><strong>Slot</strong> : 컴포넌트의 빈 부분을 외부에서 채울 수 있도록 제공하는 기능이다.</li>
</ul>
<h3 id="컴포넌트-생명주기와-템플릿">컴포넌트 생명주기와 템플릿</h3>
<ul>
<li>mounted, unMounted, beforeCreate, created, beforeMount…</li>
<li><strong>ref</strong> : DOM 엘리먼트에 직접 접근하기 위한 지시어이다.</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] KnockoutJS]]></title>
            <link>https://velog.io/@dev_vming/TIL-KnockoutJS</link>
            <guid>https://velog.io/@dev_vming/TIL-KnockoutJS</guid>
            <pubDate>Mon, 17 Feb 2025 14:41:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/f0602331-4fbd-4b4e-8318-19f265ec7b09/image.png" alt=""></p>
<h1 id="📚-knockoutjs">📚 KnockoutJS</h1>
<hr>
<h2 id="📕-knockoutjs-소개">📕 KnockoutJS 소개</h2>
<h3 id="등장배경">등장배경</h3>
<ul>
<li><strong>Model-View 결합 문제</strong> : Controller가 결국 둘을 강하게 결합시켰다.</li>
<li><strong>Controller의 복잡성</strong> : 시스템 전반의 의존성과 결합도를 높여 유지보수와 확장이 어렵다.</li>
</ul>
<p>→ 직접 DOM을 조작하는 대신 Template에 ViewModel을 전달하는 방식을 채택하게 되었다.</p>
<hr>
<h2 id="📗-mvvm-아키텍쳐">📗 MVVM 아키텍쳐</h2>
<h3 id="mvvm-아키텍쳐의-정의">MVVM 아키텍쳐의 정의</h3>
<ul>
<li>ViewModel을 템플릿을 통해 선언적으로 작성하면 Model과 View의 상호작용을 자동으로 처리한다.</li>
<li>Model을 업데이트하고, View를 바인딩하는 데에 스크립트를 작성하는 것이 아니라 템플릿을 생성한다.</li>
</ul>
<h3 id="선언적-데이터-바인딩">선언적 데이터 바인딩</h3>
<ul>
<li>자주쓰는 Controller를 만들어두고 JS가 아닌 HTML에 작성해서 사용하는 것을 말한다.</li>
</ul>
<h3 id="mvvm-패턴이란-model-view-viewmodel">MVVM 패턴이란? (Model-View-ViewModel)</h3>
<ul>
<li>데이터와 화면을 분리하고,</li>
<li>데이터와 화면이 상호작용하는 방식을 미리 만들어두고,</li>
<li>선언적인 상호작용 모델(View Model)을 작성하여 자동으로 렌더링 되도록 하는 방식이다.</li>
</ul>
<h3 id="mvvm-패턴-개발-방식">MVVM 패턴 개발 방식</h3>
<ul>
<li>보여질 화면을 템플릿으로 작성한다.</li>
<li>화면의 변동이 있는 곳에 <code>데이터 바인딩</code> 을 걸어둔다. (data-bind와 지시어 작성)<ul>
<li>변경 감지가 가능한 모델을 만들어 연결한다.</li>
<li>DOM의 변경 방식 알려준다.</li>
<li>모델 변경 시 자동으로 HTML이 변경된다.</li>
</ul>
</li>
<li>이벤트를 연동한다. (이벤트 핸들러 작성)<ul>
<li>사용자 이벤트에 따라 데이터가 변경된다.</li>
<li>변경된 데이터에 따라 자동으로 화면이 변경된다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📘-knockoutjs-핵심-개념">📘 knockoutJS 핵심 개념</h2>
<h3 id="observable-model">Observable (Model)</h3>
<ul>
<li>이벤트에 따라 모델의 변화에 따른 지속적인 업데이트가 필요하다.</li>
<li><strong>모델의 값이 변경</strong>될 때마다 전달하는 함수를 만들어 사용한다.</li>
</ul>
<h3 id="templating-view">Templating (View)</h3>
<ul>
<li>모델 데이터의 기능으로 정교하고 중첩된 UI를 빠르게 생성한다.</li>
</ul>
<h3 id="declarative-binding-view-model">Declarative Binding (View-Model)</h3>
<ul>
<li>선언적 바인딩을 사용한다.</li>
<li>간결하고 읽기 쉬운 구문을 사용하여 DOM 요소를 모델 데이터와 쉽게 연결한다.</li>
</ul>
<h3 id="automatic-ui-refresh">Automatic UI Refresh</h3>
<ul>
<li>데이터 모델의 상태가 변경되면 UI가 <strong>자동</strong>으로 업데이트 된다.</li>
</ul>
<h3 id="dependency-tracking">Dependency Tracking</h3>
<ul>
<li>모델 데이터 간의 관계 체인을 암시적으로 설정하여 변환 및 결합한다.</li>
</ul>
<hr>
<h2 id="📙-knockoutjs-의의">📙 KnockoutJS 의의</h2>
<h3 id="현재-프레임워크에-끼친-영향">현재 프레임워크에 끼친 영향</h3>
<ul>
<li>Vue,React 등의 프레임워크들은 MVVM 기반이다.</li>
<li>knockout.js는 MVVM 패러다임의 초창기 모델이다.</li>
<li>Observable은 현재 Signal이라고 불리는 개념으로 진화하게 된다.</li>
</ul>
<h3 id="knockoutjs의-장점">knockoutjs의 장점</h3>
<ul>
<li>MVVM 템플릿과 데이터 바인딩을 통한 선언적 개발 방식을 확립했다.</li>
<li><strong>DOM API를 사용하지 않고</strong>서 웹 개발이 가능하다.</li>
<li>웹 애플리케이션의 구조화 및 유지보수 용이성 향상에 기여한다.</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[JavaScript] 2차원 배열 초기화]]></title>
            <link>https://velog.io/@dev_vming/JavaScript-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EC%B4%88%EA%B8%B0%ED%99%94</link>
            <guid>https://velog.io/@dev_vming/JavaScript-2%EC%B0%A8%EC%9B%90-%EB%B0%B0%EC%97%B4-%EC%B4%88%EA%B8%B0%ED%99%94</guid>
            <pubDate>Wed, 12 Feb 2025 15:10:40 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/4a7097d8-fb4e-4a71-944d-1e3de0f70fef/image.png" alt=""></p>
<h1 id="📚-2차원-배열-초기화">📚 2차원 배열 초기화</h1>
<hr>
<h2 id="📕-배열-초기화-메서드">📕 배열 초기화 메서드</h2>
<h3 id="arrayfill">Array.fill()</h3>
<p>주로 같은 수로 배열을 초기화 할 때 사용하는 메서드이다.</p>
<pre><code class="language-jsx">const zeroArr = Array(4).fill(0);
console.log(zeroArr);
// [0,0,0,0]</code></pre>
<h3 id="arrayfrom">Array.from()</h3>
<p>순회 가능, 유사 배열 객체에서 얕게 복사된 새로운 배열을 생성하는 메서드이다.</p>
<pre><code class="language-jsx">const helloArr = Array.from(&quot;hello&quot;);
console.log(helloArr);
// [&quot;h&quot;,&quot;e&quot;,&quot;l&quot;,&quot;l&quot;,&quot;o&quot;]

const plusArr = Array.from([1,2,3],(x)=&gt;x+x);
console.log(plusArr);
// [2,4,6]

const numArr = Array.from({length:5},(v,i)=&gt;i+1);
console.log(numArr);
// [1,2,3,4,5]</code></pre>
<hr>
<h2 id="📗-문제-상황-확인">📗 문제 상황 확인</h2>
<h3 id="기존-코드">기존 코드</h3>
<pre><code class="language-jsx">const arr = Array(4).fill(Array(4).fill(0));
console.log(arr);
// [
        [0,0,0,0],
        [0,0,0,0],
        [0,0,0,0],
        [0,0,0,0]
    ]</code></pre>
<p>0으로 채워진 4x4 배열을 만들고자 Array.fill()을 중첩 사용하였다.
배열은 정상적으로 잘 만들어진 상태였다.</p>
<h3 id="문제-상황">문제 상황</h3>
<pre><code class="language-jsx">const arr = Array(4).fill(Array(4).fill(0));
arr[0][1]++; 
arr[2][1]++; 
console.log(arr);

// 예상 출력
[
  [0, 1, 0, 0],
  [0, 0, 0, 0],
  [0, 1, 0, 0], 
  [0, 0, 0, 0]
]
// 실제 출력
[
  [0, 2, 0, 0],
  [0, 2, 0, 0],
  [0, 2, 0, 0], 
  [0, 2, 0, 0]
]</code></pre>
<p>arr[0][1]과 arr[2][1]이 각각 1이 되길 기대하였다.
그러나 arr[0][1], arr[1][1], arr[2][1], arr[3][1]이 모두 2가 되었다.</p>
<hr>
<h2 id="📘-문제-원인-파악">📘 문제 원인 파악</h2>
<h3 id="참조형-데이터의-복사">참조형 데이터의 복사</h3>
<pre><code class="language-jsx">const arr = Array(4).fill(Array(4).fill(0));</code></pre>
<p>위의 코드는 4개의 배열을 생성하는 것 처럼 보이지만 같은 배열 (참조형 데이터)를 4번 복사한다.
즉, fill()을 사용하여 arr[0] 부터 arr[3]은 같은 배열의 주소를 가리키게 된 것이다.</p>
<hr>
<h2 id="📙-문제-해결-방법">📙 문제 해결 방법</h2>
<h3 id="arrayfrom-사용">Array.from() 사용</h3>
<pre><code class="language-jsx">Array.from({ length: 4 }, () =&gt; Array(4).fill(0))</code></pre>
<p>Array.from()을 사용해 독립적인 배열을 생성한다.
길이가 4인 배열 내부에 원시 값인 0을 채워준다. 원시 값은 복사 될 때 새로운 값으로 저장되므로 문제가 없는 것 처럼 보인다.</p>
<p>그러나, 이 방법 역시 0이 아니라 []와 같이 참조형 데이터(객체,배열 등)을 사용할 경우 동일 문제가 발생한다.</p>
<h3 id="map-사용">map() 사용</h3>
<pre><code class="language-jsx">const arr = Array.from({ length: 4 }, () =&gt; [...Array(4)].map(() =&gt; 0));</code></pre>
<p>Array.from()을 사용해 독립적인 배열을 생성한다.
map()을 사용하여 각 원소를 독립적인 값으로 생성하면, 참조형 데이터를 사용하여도 문제가 발생하지 않는다.</p>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[ mdn - Array.prototype.fill() ] (<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/fill">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/fill</a>)</p>
</blockquote>
<blockquote>
<p>[ mdn - Array.from() ] (<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from">https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] BackboneJS]]></title>
            <link>https://velog.io/@dev_vming/TIL-BackboneJS</link>
            <guid>https://velog.io/@dev_vming/TIL-BackboneJS</guid>
            <pubDate>Wed, 12 Feb 2025 09:55:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/fd5bb297-8238-459c-8b69-32f87ecdbc27/image.png" alt=""></p>
<h1 id="📚-backbonejs">📚 BackboneJS</h1>
<hr>
<h2 id="📕-backbonejs-소개">📕 BackboneJS 소개</h2>
<h3 id="등장배경">등장배경</h3>
<ul>
<li>웹 서비스 규모 증가에 따른 복잡성이 증가하였다.</li>
<li>DOM 조작, jQuery 방식의 한계로 유지보수가 어려워졌다.</li>
<li>화면의 변화를 다루던 사고에서 화면과 데이터의 분리에 대한 인식으로 <code>MVC 아키텍처</code> 가 등장했다.</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li>기존 코드를 유지보수할 때, 불필요한 영향을 최소화 할 수 있다.</li>
<li>사용자 경험 개선과 비즈니스 로직을 분리할 수 있다.</li>
<li>서로의 수정간의 독립성을 확립할 수 있다.</li>
</ul>
<hr>
<h2 id="📗-mvc-아키텍처">📗 MVC 아키텍처</h2>
<h3 id="mvc-아키텍처-정의">MVC 아키텍처 정의</h3>
<p>화면과 데이터의 분리를 통해 Model과 View를 분리, 상호작용이 필요한 작업을<code>Controller</code>를 통해 수행한다.</p>
<h3 id="mvc-아키텍처-구성">MVC 아키텍처 구성</h3>
<ul>
<li><strong>Model</strong> : 화면과는 무관한 실제 데이터와 데이터 처리를 다룸. 주로 데이터 구조, 생성, 저장, 수정 등의 역할을 한다.</li>
<li><strong>View</strong> : 사용자에게 보여지는 화면 다룸. 어떤 모양 형태로 보여질 지 담당한다.</li>
<li><strong>Controller</strong> : Model과 View의 상호작용을 담당한다.</li>
</ul>
<hr>
<h2 id="📘-backbonejs-주요-개념">📘 BackboneJS 주요 개념</h2>
<h3 id="backbonejs-구조">BackboneJS 구조</h3>
<ul>
<li><strong>Model</strong> : 데이터만을 관리하며 변경사항의 전파 기능을 제공한다.</li>
<li><strong>Collection</strong> : Model의 리스트 형태를 관리하는 역할을 수행한다.</li>
<li><strong>Events</strong> : DOM Event 뿐 아니라, Model 변경 또한 이벤트로 간주하여 이벤트 기반 프로그래밍을 제공한다.</li>
<li><strong>View</strong> : Model의 값을 통해 화면에 출력(렌더링), 이벤트를 등록해 사용자 입력을 받아 Model을 변경한다.</li>
</ul>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[TIL] JQuery]]></title>
            <link>https://velog.io/@dev_vming/TIL-JQuery</link>
            <guid>https://velog.io/@dev_vming/TIL-JQuery</guid>
            <pubDate>Tue, 11 Feb 2025 11:33:44 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/6bf760b9-3718-43a3-88e3-cf6b490b82f9/image.png" alt=""></p>
<h1 id="📚-jquery">📚 JQuery</h1>
<hr>
<h2 id="📕-jquery-소개">📕 jQuery 소개</h2>
<h3 id="등장배경">등장배경</h3>
<p>Ajax와 DOM의 혁신, 웹 페이지에서 웹 어플리케이션으로의 전환으로 등장하게 되었다.</p>
<h3 id="기본-문법">기본 문법</h3>
<pre><code class="language-js">$(&quot;h1&quot;).css(&quot;color&quot;,&quot;red&quot;).text(&quot;hello, world&quot;)</code></pre>
<ul>
<li><code>$</code> : jQuery에서 제공하는 전역함수로, DOM을 jQuery의 Object 라이브러리로 만들어준다.</li>
<li><code>(selector)</code> : CSS 선택자 규칙을 이용하여 HTML내 원하는 DOM 요소 선택 가능하다.</li>
<li><code>action()</code> : 선택된 요소에 원하는 작업 수행, 기존 DOM API 대비 직관적 + 연속적으로 사용 가능하다.</li>
</ul>
<h3 id="핵심-개념">핵심 개념</h3>
<ul>
<li><strong>선택자</strong> : CSS 선택자를 사용하여 원하는 요소 선택하는 기능을 한다.</li>
<li><strong>메서드와 메서드 체인</strong> : DOM 조작을 간결하고 직관적인 방식으로 사용 가능하다.</li>
<li><strong>이벤트 위임</strong> : 존재하지 않는 요소들에도 이벤트 적용이 가능하다.</li>
<li><strong>플러그인</strong> : 기본 기능을 보완하거나 새로운 기능을 추가하여 확장 가능하다.</li>
<li><strong>Ajax</strong> : 서버에서 비동기로 데이터 가져오는 기능에 간결한 API를 제공하여 동적 웹 개발에 용이하다.</li>
</ul>
<hr>
<h2 id="📗-jquery-핵심-개념">📗 jQuery 핵심 개념</h2>
<h3 id="선택자-selector">선택자 (Selector)</h3>
<ul>
<li>웹 페이지의 HTML 요소를 쉽고 빠르게 선택할 수 있게 해주는 기능을 한다.</li>
<li>CSS 선택자와 유사한 문법을 사용한다.</li>
<li>element 나 document와 같은 node등에 직접 접근 가능하다.</li>
</ul>
<pre><code class="language-jsx">$(&quot;p.cls&quot;) // 모든 &lt;p&gt; 요소 중 class 가 &#39;cls&#39;인 모든 요소 선택
$(document) // document 노드에 jQuery 방식으로 접근</code></pre>
<h3 id="메서드-method와-체이닝chaining">메서드 (Method)와 체이닝(Chaining)</h3>
<ul>
<li><strong>메서드</strong> : HTML 요소를 선택하고 조작하는 기능을 제공한다. ( ex. <code>.text()</code>, <code>.html()</code>, <code>.css()</code> )</li>
<li><strong>체이닝</strong> : 여러 jQuery 명령어를 하나의 문장으로 연결하여 간결성과 가독성 향상시킨다.</li>
</ul>
<pre><code class="language-jsx">$(&quot;p&quot;).css(&quot;color&quot;,&quot;blue&quot;).html(&quot;Hello, jQuery!&quot;).fadeIn(&quot;slow&quot;)</code></pre>
<h3 id="이벤트-위임-event-delegation">이벤트 위임 (Event Delegation)</h3>
<ul>
<li>부모 요소에 이벤트 핸들러를 할당하여, 자식요소에서 발생하는 이벤트를 관리하는 방식이다.</li>
<li>여러 요소에 개별적으로 이벤트 리스너를 추가하는 것보다 효율적이다.</li>
<li><code>on() 메서드</code> : 선택한 요소에 이벤트 핸들러를 등록하고, 선택자를 인자로 전달하여 특정자식 요소에 대한 이벤트만 처리하도록 할 수 있다.</li>
</ul>
<pre><code class="language-jsx">$(&quot;#todo-list&quot;).on(&quot;click&quot;,&quot;.todo input[type=checkbox]&quot;, event =&gt; {
    alert(&quot;할 일 완료 토글&quot;);
} </code></pre>
<h3 id="플러그인-plug-in">플러그인 (Plug-in)</h3>
<ul>
<li>기존 jQuery 라이브러리에 외부에서 제작한 새로운 기능이나 UI 요소를 추가하는 작은 도구들을 말한다.</li>
<li>갤러리 플러그인을 사용한다면 캐러셀과 좌우 클릭 등 다른 사람들이 만든 기능을 사용 가능하다.</li>
<li>모듈성과 확장성의 원칙 강화함으로 추후 만들어지는 프레임워크와 라이브러리에 영감을 주었다.</li>
</ul>
<h3 id="ajax-animation-utility">Ajax, Animation, Utility</h3>
<ul>
<li><strong>Ajax</strong> : 서버와의 비동기 통신을 위한 기능 제공, 페이지를 새로고침하지 않고도 데이터 통신이 가능하다.</li>
<li><strong>애니메이션 및 효과</strong> : 다양한 내장 애니메이션을 제공한다. (ex. show, hide, toggle, fadeIn, fadeout)</li>
<li><strong>유틸리티 함수</strong> : 다양한 유틸리티 함수를 제공한다. (ex. 배열처리, 객체복사, 타입검사)</li>
</ul>
<hr>
<h2 id="📘-정리">📘 정리</h2>
<h3 id="jquery가-현대-웹-개발에-미친-영향력">jQuery가 현대 웹 개발에 미친 영향력</h3>
<ol>
<li><strong>Selector 개념</strong> : 추후 웹 표준의 document.querySelectorAll 메서드 도입에 영향을 주었다.</li>
<li><strong>DOM 조작</strong> : addClass, removeClass 등은 추후 classList 등의 웹 표준 기능 발전에 기여했다.</li>
<li><strong>DOM 탐색</strong> : closest(), matches()와 같은 선택자를 이용한 DOM 탐색 기능이 웹 표준에 추가되었다.</li>
<li><strong>배열 및 객체 유틸리티</strong> : $.each, @$.trim, $.extends 등은 forEach(), assign 등의 표준 기능이 되었다.</li>
<li><strong>$(selector).animate()</strong> : CSS3의 animation 및 JS의 Element.animate() 등 표준 기능에 영향을 주었다.</li>
<li><strong>$.ajax()</strong> : axios와 같은 ajax 전용 라이브러리나 fetch API 같은 표준 API 발전에 기여하였다.</li>
<li><strong>플러그인 시스템</strong> : 모듈화와 재사용 그리고 프로그래밍 생태계 개념에 큰 영향을 주었다.</li>
</ol>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 네트워크 기초 강의 - 혼자 공부하는 네트워크 #06]]></title>
            <link>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-06</link>
            <guid>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-06</guid>
            <pubDate>Sun, 25 Aug 2024 14:52:05 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/6e53974a-9f6c-4d34-bba4-1823b7bd376a/image.png" alt=""></p>
<h1 id="📚-nic와-케이블">📚 NIC와 케이블</h1>
<hr>
<h2 id="📕-nic란">📕 NIC란?</h2>
<h3 id="nic의-정의">NIC의 정의</h3>
<ul>
<li>Network Interface Controller의 약자이다.</li>
<li><strong>호스트를 네트워크(LAN)</strong>에 연결하고, <strong>MAC 주소가 부여</strong>되는 네트워크 장비이다.</li>
<li><code>케이블</code>은 NIC에 연결되는 물리 계층의 유선 통신 매체이다.</li>
<li>네트워크 인터페이스 카드, 네트워크 어댑터, LAN 카드, 네트워크 카드, 이더넷 카드 등 다양한 명칭으로 불린다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/4060c03f-3982-4e4e-bb1a-7531f22510fc/image.png" alt=""></p>
<h3 id="nic의-역할">NIC의 역할</h3>
<ul>
<li>호스트와 유무선 통신 매체를 연결한다.</li>
<li>통신 매체 신호와 컴퓨터가 이해하는 정보를 상호 변환한다.</li>
<li>자신과는 관련없는 수신지 MAC 주소가 명시된 프레임, FCS 필드를 토대로 오류 검출된 프레임은 폐기한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/323a8b9a-15b1-4edb-af7d-dac3de4c012e/image.png" alt=""></p>
<h3 id="nic-속도와-성능의-관계">NIC 속도와 성능의 관계</h3>
<ul>
<li>NIC 마다 지원되는 속도가 다르다.</li>
<li>네트워크 속도에 영향을 끼치기 때문에 높은 대역폭에서 많은 트래픽 감당해야 하는 환경에서는 고속 NIC를 추가하기도 한다.</li>
</ul>
<hr>
<h2 id="📗-케이블">📗 케이블</h2>
<h3 id="트위스티드-페어-케이블">트위스티드 페어 케이블</h3>
<ul>
<li>생김새 = 커넥터 + 케이블 본체 이다.<ul>
<li>주로 활용되는 커넥터는 RJ-45이다.</li>
<li>케이블 본체는 구리 선이 두 가닥씩 꼬아진 형태를 띈다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/985968da-8c27-4bbc-bd7e-6f79cdd1c68e/image.png" alt=""></p>
<ul>
<li><p><strong>구리 선</strong>으로 전기 신호를 주고받는 통신 매체이다.</p>
<ul>
<li><p>구리 선은 노이즈에 민감하다.</p>
</li>
<li><p><strong>차폐 (shielding)</strong> : 구리 선 주변을 감싸 노이즈를 감소 시키는 방식이다.</p>
</li>
<li><p>그물 모양의 철사인 브레이드와 포일로 구성되어 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/595b2f32-9b33-415a-9921-5741391c05d3/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 실드에 따른 트위스티드 페어 케이블의 분류이다.

    ![](https://velog.velcdn.com/images/dev_vming/post/6e6994f9-689c-427a-bd8f-14d4f484fd90/image.png)


    - XX에는 외부를 감싸는 실드의 종류가 하나 혹은 두개이다.
    - Y에는 꼬인 구리 선 쌍을 감싸는 실드의 종류이다.
    - U : 실드 없음, S : 브레이드 실드, F : 포일 실드
    - S/FTP : 케이블 외부 브레이드 실드와 구리선 쌍 포일 실드이다.
    - F/FTP : 케이블 외부와 구리선 쌍 모두 포일실드이다.
    - SF/FTP : 케이블 외부 브레이드 실드와 포일실드, 구리선 쌍 포일실드이다.
    - U/UTP : 아무것도 감싸지 않은 케이블이다.</code></pre><h3 id="광섬유-케이블">광섬유 케이블</h3>
<ul>
<li><p>빛을 이용해 정보를 주고받는 케이블이다.</p>
</li>
<li><p>전기 신호를 이용하는 케이블에 비해 속도도 빠르고, 먼 거리까지 전송이 가능하다.</p>
</li>
<li><p>노이즈로부터 간섭받는 영향도 적으므로 대륙 간 네트워크 연결에도 사용한다.</p>
</li>
<li><p>생김새 = 커넥터 (종류 다양함) + 본체 (머리카락과 같은 형태의 광섬유로 구성)이다.</p>
<ul>
<li><p>중심에는 코어라는 실질적으로 빛이 흐르는 부분인 <code>코어</code>가 있다.</p>
</li>
<li><p>빛이 코어안에서만 흐르도록 빛을 가두는 <code>클래딩</code>이 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/3ccebc07-76c5-41f7-8f49-1acc495d85ad/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 코어의 지름에 따라 **싱글 모드 광섬유 케이블**과 **멀티 모드 광섬유 케이블**로 나뉜다.</code></pre><hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 13강. NIC와 케이블] (<a href="https://www.youtube.com/watch?v=Ywg2BzLvWpc&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=16">https://www.youtube.com/watch?v=Ywg2BzLvWpc&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=16</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 네트워크 기초 강의 - 혼자 공부하는 네트워크 #05]]></title>
            <link>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-05</link>
            <guid>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-05</guid>
            <pubDate>Fri, 16 Aug 2024 09:46:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/2366b439-0b65-4d39-928b-b5f818b599e8/image.png" alt=""></p>
<h1 id="📚-이더넷">📚 이더넷</h1>
<hr>
<h2 id="📕-이더넷이란">📕 이더넷이란?</h2>
<h3 id="이더넷의-정의-ethernet">이더넷의 정의 (Ethernet)</h3>
<ul>
<li>현대 LAN, 특히 유선 LAN 환경에서 가장 대중적으로 사용되는 기술이다.</li>
<li>다양한 통신 매체의 규격, 송수신되는 프레임의 형태, 프레임을 주고받는 방법 등이 정의된 기술이다.</li>
<li>물리 계층에서 사용되는 연결매체, 데이터 링크 계층에서 주고받는 메시지의 형태는 이더넷의 규격과 프레임 형태를 따른다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/c54c3e2d-90e0-4d9e-b547-59347c78e59b/image.png" alt=""></p>
<h3 id="국제-표준으로써의-이더넷">국제 표준으로써의 이더넷</h3>
<ul>
<li>이더넷은 <code>IEEE 802.3</code>이라는 이름으로 국제 표준이 된다.</li>
<li>지속적으로 발전 중인 기술이기에, 단일이 아닌 이더넷 관련 다양한 표준의 모음이라고 볼 수 있다.</li>
<li>특정 버전을 표현하기 위해서 802.3 뒤에 <strong>버전을 나타내는 알파벳 기재 (ex. 802.3u, 802.3ab)</strong> 한다.</li>
<li>IEEE 802.3은 이더넷 관련 표준을 만드는 작업 그룹(전문가 단체)를 의미하기도 한다.</li>
<li>이더넷 표준에 따라 지원되는 네트워크 장비, 통신 매체의 종류, 전송 속도 등이 달라진다.</li>
</ul>
<hr>
<h2 id="📗-물리-계층-관련-이더넷-기술-통신-매체">📗 물리 계층 관련 이더넷 기술 (통신 매체)</h2>
<h3 id="이더넷-통신-매체-표기법">이더넷 통신 매체 표기법</h3>
<ul>
<li>IEEE 802.3u 케이블, IEEE 802.3af 케이블과 같이 지칭하지 않는다.</li>
<li><code>전송속도BASE-추가특성</code> 의 형식으로 표기한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/480d811c-461f-4e21-b204-e176d2312602/image.png" alt=""></p>
<ul>
<li><p>전송 속도</p>
<ul>
<li><p>숫자만 표기되어 있으면 Mbps의 속도를 지원한다.</p>
</li>
<li><p>숫자 뒤에 G가 붙는 경우 Gbps의 속도를 지원한다.</p>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/580a3e00-76dc-465d-a43d-573199b8ed70/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>BASE</p>
<ul>
<li>베이스밴드 (BASEbnand)의 약자로, 변조타입을 의미한다.</li>
<li>변조 타입이란 비트 신호로 변환된 데이터를 통신 매체로 전송하는 방법이다.</li>
</ul>
</li>
<li><p>추가 특성</p>
<ul>
<li><p>통신 매체의 특성을 명시하는 것으로 다양한 특성이 명시될 수 있다.</p>
</li>
<li><p>전송 가능 최대 거리, 물리 계층 인코딩 방식, 레인 수 등등이 있다.</p>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/360355bd-6b4e-4ceb-b8f1-5f0d9ed8184e/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<pre><code>- 가장 중요한 추가 특성은 **통신 매체의 종류** 이다.

![](https://velog.velcdn.com/images/dev_vming/post/727d0409-b76c-40e6-b386-88fa3033586c/image.png)


![](https://velog.velcdn.com/images/dev_vming/post/c6c47957-3c21-409b-ae4b-d0af71c00474/image.png)</code></pre><h3 id="지원-속도에-따른-분류">지원 속도에 따른 분류</h3>
<ul>
<li>고속 이더넷 (Fast Ethernet) : 100Mbps가량의 속도를 지원하는 이더넷 표준이다.</li>
<li>기가비트 이더넷 (Gigabit Ethernet) : 1Gbps가량의 속도를 내는 이더넷 표준이다.</li>
<li>10기가비트 이더넷 (10 Gigabit Ethernet) : 10Gbps가량의 속도를 내는 이더넷 표준이다.</li>
</ul>
<hr>
<h2 id="📘-데이터-링크-계층-관련-이더넷-기술-이더넷-프레임-형식">📘 데이터 링크 계층 관련 이더넷 기술 (이더넷 프레임 형식)</h2>
<h3 id="이더넷-프레임이란">이더넷 프레임이란?</h3>
<ul>
<li>이더넷 네트워크에서 주고받는 프레임이다.</li>
<li>캡슐화를 거쳐 송신, 역캡슐화를 거쳐 수신된다.<ul>
<li>헤더 : 프리앰블, 수신지 MAC 주소, 송신지 MAC 주소, 타입/길이</li>
<li>페이로드 : 데이터</li>
<li>트레일러 : FCS</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/5994e600-9561-4720-b5f8-16ff61910c94/image.png" alt=""></p>
<h3 id="이더넷-프레임의-구성요소">이더넷 프레임의 구성요소</h3>
<ul>
<li><p>프리앰블 (preamble)</p>
<ul>
<li><p><strong>이더넷 프레임의 시작</strong>을 알리는 8바이트 (64비트) 크기의 정보이다.</p>
</li>
<li><p>첫 7바이트는 10101010값을 가지고, 마지막 바이트는 10101011 값을 가진다.</p>
</li>
<li><p>송수신지 간의 동기화를 위해 사용되는 정보이다.</p>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/66e11f1b-04e0-4485-a52d-773698044c86/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>수신지 MAC 주소와 송신지 MAC 주소</p>
<ul>
<li><code>물리적 주소</code>라고도 불린다.</li>
<li><strong>일반적으로 고유한 주소이고, 일반적으로 변경되지 않는 주소</strong>이다.</li>
<li>MAC 주소는 네트워크 인터페이스(호스트가 네트워크와 연결되는 지점)마다 부여되는 6바이트 (48비트) 길이의 주소이다.</li>
<li><strong>LAN 내의 송수신지 특정</strong>하는데에 사용한다.</li>
<li>일반적으로 NIC(Network Interface Controller) 장치가 네트워크 인터페이스 역할을 담당한다.</li>
<li>한 컴퓨터에 MAC 주소가 여러개 있을 수 있다.</li>
</ul>
</li>
<li><p>타입 / 길이</p>
<ul>
<li>타입 혹은 길이를 명시하는 숫자이다.</li>
<li>필드에 명시된 크기가 <strong>1500(16진수 05DC) 이하</strong>일 경우 <code>프레임의 크기(길이)</code>를 명시한다.</li>
<li>필드에 명시된 크기가 <strong>1536(16진수 0600) 이상</strong>일 경우 <code>타입</code>을 명시한다.<ul>
<li>타입이란?
  이더 타입 (ethertype)이라고도 한다.
  어떤 정보를 캡슐화 했는지 나타내는 정보이다.
  대표적으로 상위 계층에서 사용된 프로토콜이 명시 된다.
  0800 → IPv4, 86DD → IPv6, 0806 → ARP 등이 있다.</li>
</ul>
</li>
</ul>
</li>
<li><p>데이터</p>
<ul>
<li>상위 계층에서 전달받거나 전달해야할 내용, 즉 <code>페이로드</code>를 말한다.</li>
<li><strong>최대 크기는 1500바이트, 최소 크기는 46바이트</strong> 이다.</li>
<li>최소 크기보다 작다면 크기 맞추기용 데이터인 <strong>패딩</strong>이 채워진다. (보통 0)</li>
</ul>
</li>
<li><p>FCS (Frame Check Sequence)</p>
<ul>
<li>수신한 이더넷 프레임에 <strong>오류가 있는지 확인</strong>하기 위한 필드이다.</li>
<li>이 필드에는 <code>CRC(Cyclic Redundancy Check)</code>라는 오류 검출용 값이 명시된다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📙-이더넷-외의-기술">📙 이더넷 외의 기술</h2>
<h3 id="토큰-링token-ring">토큰 링(token ring)</h3>
<ul>
<li>토큰 링 네트워크에서는 호스트들이 <strong>링 형태</strong>로 연결된다.</li>
<li>호스트끼리 돌아가며 <code>토큰</code>이라는 특별한 정보를 교환한다.</li>
<li>네트워크 내 다른 호스트에게 메시지를 송신하려면 반드시 토큰을 가지고 있어야 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/2dc913fc-462a-4081-8c98-06b7920d4894/image.png" alt=""></p>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 11강. 이더넷① | 이더넷과 연결 매체] (<a href="https://www.youtube.com/watch?v=m33biphNM2Q">https://www.youtube.com/watch?v=m33biphNM2Q</a>)</p>
</blockquote>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 12강. 이더넷② | 이더넷 프레임] (<a href="https://www.youtube.com/watch?v=eYdjpoBybNQ&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=15">https://www.youtube.com/watch?v=eYdjpoBybNQ&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=15</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 네트워크 기초 강의 - 혼자 공부하는 네트워크 #04]]></title>
            <link>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-04</link>
            <guid>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-04</guid>
            <pubDate>Fri, 16 Aug 2024 09:36:06 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/ca7071d9-5b4b-470f-89b4-a30fd2136e14/image.png" alt=""></p>
<h1 id="📚-트래픽과-네트워크-성능-지표">📚 트래픽과 네트워크 성능 지표</h1>
<hr>
<h2 id="📕-트래픽">📕 트래픽</h2>
<h3 id="트래픽이란">트래픽이란?</h3>
<ul>
<li>트래픽은 주로 노드에서 측정되며 <code>특정 시점에 노드를 경유하는 정보량</code>을 말한다.</li>
<li>과도한 트래픽이 야기하는 문제로는 <code>과부하 (성능 저하) 발생</code>이 있다.</li>
</ul>
<hr>
<h2 id="📗-네트워크-성능-지표">📗 네트워크 성능 지표</h2>
<h3 id="처리율-throughput">처리율 (throughput)</h3>
<ul>
<li>단위 시간 당 네트워크를 통해 실제로 전송되는 정보량을 말한다.<ul>
<li><strong>bps (bit/s)</strong> : bits per second</li>
<li><strong>Mbps (Mbit/s)</strong> : megabits per second</li>
<li><strong>Gbps (Gbit/s)</strong> : gigabits per second</li>
<li><strong>pps (p/s)</strong> : packets per second</li>
</ul>
</li>
</ul>
<h3 id="대역폭-bandwidth">대역폭 (bandwidth)</h3>
<ul>
<li>단위 시간 동안 통신 매체를 통해 송수신 할 수 있는 최대 정보량이다.</li>
<li>정보를 주고받을 폭이 클 수록 정보량이 많다.</li>
</ul>
<h3 id="패킷-손실-packet-loss">패킷 손실 (packet loss)</h3>
<ul>
<li>송수신되는 패킷이 손실된 상황을 말한다.</li>
<li>손실된 패킷 수로 명시적으로 나타내는 경우도 있고, 전체 패킷/유실된 패킷 으로 백분위 사용하기도 한다.</li>
</ul>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[ Youtube - [네트워크 기초 강의] 9강. 트래픽과 네트워크 성능 지표] (<a href="https://www.youtube.com/watch?v=qasao0UdZ00&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=12">https://www.youtube.com/watch?v=qasao0UdZ00&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=12</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 네트워크 기초 강의 - 혼자 공부하는 네트워크 #03]]></title>
            <link>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-03-leymqhqi</link>
            <guid>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-03-leymqhqi</guid>
            <pubDate>Fri, 09 Aug 2024 09:38:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/2e31df48-13c1-405f-b692-45366ce7dff2/image.png" alt=""></p>
<h1 id="📚-프로토콜-네트워크-참조-모델-캡슐화와-역캡슐화">📚 프로토콜, 네트워크 참조 모델, 캡슐화와 역캡슐화</h1>
<hr>
<h2 id="📕-프로토콜이란">📕 프로토콜이란?</h2>
<h3 id="프로토콜의-정의">프로토콜의 정의</h3>
<ul>
<li>노드 간에 정보를 올바르게 주고받기 위해 합의된 규칙이나 방법이다.</li>
<li>일상 속 언어와는 달리 통신 과정에서 일반적으로는 여러 프로토콜을 함께 사용한다.</li>
<li>각 프로토콜마다 <strong>목적과 특징이 다르다</strong>.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/ddf28b25-8dd3-416b-8358-a3dc6844af98/image.png" alt=""></p>
<hr>
<h2 id="📗-네트워크-참조-모델">📗 네트워크 참조 모델</h2>
<h3 id="네트워크를-통한-송수신-과정">네트워크를 통한 송수신 과정</h3>
<ul>
<li>정형화 된 여러 단계 존재한다.</li>
<li>계층적으로 표현 가능하다.</li>
<li>즉, <code>네트워크 참조 모델</code>은 통신이 이루어지는 각 과정을 계층으로 나눈 구조이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/4ebf0fc8-7659-44bc-9f92-730a4c1de247/image.png" alt=""></p>
<h3 id="통신-과정을-계층적으로-나누는-이유">통신 과정을 계층적으로 나누는 이유</h3>
<ul>
<li>네트워크 구성과 설계가 용이하다.</li>
<li>네트워크 문제 진단과 해결이 용이하다.</li>
</ul>
<h3 id="osi-모델-osi-7계층">OSI 모델 (OSI 7계층)</h3>
<ul>
<li>네트워크를 이론적으로 <strong>기술하고 이해</strong>할 때 주로 활용하는 모델이다.</li>
<li>국제 표준화 기구 ISO에서 만든 네트워크 참조 모델이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/509025e7-36f5-4368-96a3-2665e6ef3d87/image.png" alt=""></p>
<ul>
<li><p>물리 계층 (physical layer) : OSI 모델의 최하단, 1과 0으로 표현되는 비트 신호를 주고 받는 계층이다.</p>
</li>
<li><p>데이터 링크 계층 (data link layer) : 네트워크 내 주변 장치 간의 정보를 올바르게 주고받기 위한 계층이다.
  → 물리 계층과 데이터 링크 계층은 LAN, 하드웨어와 관련된 기술이 연관되어 함께 묶어 보는 경우가 많다.</p>
</li>
<li><p>네트워크 계층 (network layer) : 메시지를 다른 네트워크에 속한 수신지까지 전달하는 계층이다.</p>
</li>
<li><p>전송 계층 (transport layer) : 신뢰성 있고 안정성 있는 전송을 해야 할 때 필요한 계층이다.</p>
</li>
<li><p>세션 계층 (session layer) : 세션 (통신을 주고받는 호스트의 응용 프로그램 간 연결 상태)을 관리한다.</p>
</li>
<li><p>표현 계층 (presentation layer) : 문자를 컴퓨터가 이해할 수 있는 코드로 변환 (인코딩), 압축, 암호화하는 계층이다.</p>
</li>
<li><p>응용 계층 (application layer) : 사용자 및 사용자가 이용하는 응용 프로그램에 다양한 네트워크 서비스를 제공하는 계층이다.</p>
</li>
</ul>
<h3 id="tcpip-모델-tcpip-4계층-인터넷-프로토콜-스위트-tcpip-프로토콜-스택">TCP/IP 모델 (TCP/IP 4계층, 인터넷 프로토콜 스위트, TCP/IP 프로토콜 스택)</h3>
<ul>
<li>네트워크 프로토콜, <strong>구현에 중점</strong>을 둔 모델이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/58bf5943-5a60-4e94-b668-ea8831441f25/image.png" alt=""></p>
<ul>
<li>네트워크 엑세스 계층 (network access layer) : OSI 모델의 데이터 링크 계층과 역할이 유사하다.</li>
<li>인터넷 계층 (internet layer) : OSI 모델의 네트워크 계층과 역할이 유사하다.</li>
<li>전송 계층 (transport layer) : OSI 모델의 전송 계층과 역할이 유사하다.</li>
<li>응용 계층 (application layer) : OSI 모델의 세션 + 표현 + 응용 계층과 역할이 유사하다.</li>
</ul>
<hr>
<h2 id="📘-캡슐화와-역캡슐화">📘 캡슐화와 역캡슐화</h2>
<h3 id="캡슐화">캡슐화</h3>
<ul>
<li>메시지는 송신지 입장에서는 가장 높은 계층부터 가장 낮은 계층으로 이동한다.</li>
<li>계층 별 프로토콜의 목적과 특징에 부합하는 헤더(및 트레일러) 추가되는 과정이다.</li>
<li>다음 계층의 페이로드는 이전 계층의 헤더 + 페이로드이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/5d72d5dc-908a-4196-bbb1-c9256c8f0aed/image.png" alt=""></p>
<h3 id="역캡슐화">역캡슐화</h3>
<ul>
<li>메시지는 수신지 입장에서는 가장 낮은 계층부터 가장 높은 계층으로 이동한다.</li>
<li>계층 별 프로토콜의 목적과 특징에 부합하는 헤더(및 트레일러)를 제거하는 과정이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/6bd027e6-21c0-41d5-b6d6-e0a23d4c2c8e/image.png" alt=""></p>
<h3 id="pdu-protocol-data-unit">PDU (Protocol Data Unit)</h3>
<ul>
<li>각 계층에서 송수신되는 메시지의 단위이다.</li>
<li>현재 계층의 PDU = 상위 계층 데이터 + 현재 계층의 프로토콜 헤더(및 트레일러)이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/f4ee8e6d-a66e-4f3b-a2c4-af8df10b5ccd/image.png" alt=""></p>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 5강. 네트워크 미시적으로 살펴보기① | 프로토콜] (<a href="https://www.youtube.com/watch?v=HDMk9u4TXxU&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=8">https://www.youtube.com/watch?v=HDMk9u4TXxU&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=8</a>)</p>
</blockquote>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 6강. 네트워크 미시적으로 살펴보기② | 네트워크 참조 모델] (<a href="https://www.youtube.com/watch?v=H1Z4tnzs-HA&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=9">https://www.youtube.com/watch?v=HDMk9u4TXxU&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=9</a>)</p>
</blockquote>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 7강. 네트워크 미시적으로 살펴보기③ | 캡슐화와 역캡슐화] (<a href="https://www.youtube.com/watch?v=4LHEu_7k4FE&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=10">https://www.youtube.com/watch?v=HDMk9u4TXxU&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=9</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 네트워크 기초 강의 - 혼자 공부하는 네트워크 #02]]></title>
            <link>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-02</link>
            <guid>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-02</guid>
            <pubDate>Sun, 04 Aug 2024 14:21:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/07627bc5-494c-41c8-8af4-43ffd80fe3e9/image.png" alt=""></p>
<h1 id="📚-네트워크의-기본-구조와-분류">📚 <strong>네트워크의 기본 구조와 분류</strong></h1>
<hr>
<h2 id="📕-네트워크의-구조--그래프">📕 네트워크의 구조 = 그래프</h2>
<h3 id="그래프란">그래프란?</h3>
<ul>
<li>노드(node)와 노드를 연결하는 간선(edge)으로 이루어진 자료구조이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/b24778c3-ffe4-4032-b76d-33a7087153ee/image.png" alt=""></p>
<h3 id="네트워크-구조-살펴보기">네트워크 구조 살펴보기</h3>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/c708d8d5-908d-4a14-94c0-eeb4c9718f32/image.png" alt=""></p>
<ul>
<li>가장자리에 위치한 노드 : 사용자 기기 <code>호스트</code></li>
<li>중간에 위치한 노드 : <code>네트워크 장비</code></li>
<li>노드 간 연결하는 링크 : 유무선의 연결 매체 <code>통신매체</code></li>
<li>노드 간 주고받는 정보 : <code>메시지</code></li>
</ul>
<hr>
<h2 id="📗-네트워크-구성-요소">📗 네트워크 구성 요소</h2>
<h3 id="호스트">호스트</h3>
<ul>
<li>네트워크의 가장자리 노드이다.</li>
<li>네트워크를 통해 주고받는 메시지를 최초로 송신하거나, 최종 수신하는 대상이다.</li>
<li>스마트폰, 데스크탑, 서버 컴퓨터 등이 있다.</li>
<li>역할에 따라 <code>클라이언트(client)</code>와 <code>서버(server)</code>로 구분한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/33fef32d-cccc-4ae5-938f-ce0f935bccb9/image.png" alt=""></p>
<h3 id="네트워크-장비">네트워크 장비</h3>
<ul>
<li>호스트 간 주고받을 정보가 거치는 중간 노드이다.</li>
<li>이더넷 허브, 스위치, 라우터, 공유기 등이 있다.</li>
<li>호스트 간 주고받는 정보가 수신지까지 안정적이고 안전하게 전송하는 역할을 한다.</li>
</ul>
<h3 id="호스트와-네트워크-장비">호스트와 네트워크 장비</h3>
<ul>
<li>역할과 구조에 따라 구분한 개념일 뿐, <strong>배타적인 개념은 아니다!</strong><ul>
<li>호스트로 동작하는 노드도 네트워크 장비 역할 수행 가능</li>
<li>서버로 동작하는 노드도 클라이언트 역할 수행 가능</li>
<li>클라이언트로 동작하는 노드도 서버 역할 수행 가능</li>
</ul>
</li>
</ul>
<h3 id="통신매체">통신매체</h3>
<ul>
<li>각 노드를 연결하는 간선 (링크)이다.</li>
<li>연결 방식에 따라 <code>유선 매체</code>, <code>무선 매체</code>로 구분한다.</li>
</ul>
<h3 id="메시지">메시지</h3>
<ul>
<li>통신 매체로 연결된 노드가 주고받는 정보이다.</li>
<li>웹 페이지, 파일, 메일 등이 있다.</li>
</ul>
<hr>
<h2 id="📘-범위에-따른-네트워크-분류">📘 범위에 따른 네트워크 분류</h2>
<h3 id="lan-local-area-network">LAN (Local Area Network)</h3>
<ul>
<li><strong>가까운 지역</strong>을 연결한 근거리 통신망을 말한다.</li>
<li>개발자가 주로 구축하고 관리해야 할 네트워크이다.</li>
<li>일반 가정, 특정 회사, 다른 국가의 가정 내에서 연결된 네트워크 등이 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/69833cee-5346-487e-bc27-f6e39845fa3c/image.png" alt=""></p>
<h3 id="wan-wide-area-network">WAN (Wide Area Network)</h3>
<ul>
<li><strong>먼 지역</strong>을 연결하는 광역 통신망을 말한다.</li>
<li>다른 LAN에 속한 호스트와 메시지를 주고받아야 할 때 필요하다.</li>
<li><code>ISP (Internet Service Provider)</code>에서 구축하고 관리하는 경우가 많다.<ul>
<li>사용자에게 인터넷과 같은 WAN에 연결 가능한 회선을 임대하는 등 다양한 서비스를 제공한다.</li>
<li>국내의 대표적 ISP로 KT, LG U+, SK 등이 있다.</li>
</ul>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/63014b07-a836-49cb-9579-41a3fc784f76/image.png" alt=""></p>
<h3 id="추가적-분류">추가적 분류</h3>
<ul>
<li>CAN (Campus Area Network) : 학교 또는 회사의 여러 건물 단위의 네트워크</li>
<li>MAN (Metropolitan Area Network) : 도시나 대도시 단위의 네트워크</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/e909237a-2b4e-412f-b98e-f99a7e1615e8/image.png" alt=""></p>
<hr>
<h2 id="📙-메시지-교환-방식에-따른-네트워크-분류">📙 메시지 교환 방식에 따른 네트워크 분류</h2>
<h3 id="회선-교환-네트워크">회선 교환 네트워크</h3>
<ul>
<li>메시지를 주고받기 전 <code>회선(circuit)을 설정</code>한 뒤, 해당 회선을 통해 메시지 주고받는 방식이다.</li>
<li><strong>회선을 설정한다</strong> 는 것은 두 호스트 간의 연결, 두 호스트를 연결할 전송로 예약, 전송로 확보를 말한다.</li>
<li>호스트 간 1:1 전송로를 확보하는 것을<code>회선 스위치</code>라고 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/6f2ccb01-d1b8-4da4-baa2-899cb1b2ed02/image.png" alt=""></p>
<ul>
<li>두 호스트 간 연결 확보 후 메시지 주고받는 특성 덕분에 <code>주어진 시간 내 전송되는 정보 양이 일정하다.</code></li>
<li>회선의 이용 효율이 낮아질 수 있다.<ul>
<li>가능한 모든 회선에 끊임없이 메시지가 흐르고 있어야만 이용이 높다고 본다.</li>
<li>메시지를 주고받지 않으며 회선을 점유하는 것은 낭비이다.</li>
</ul>
</li>
</ul>
<h3 id="패킷-교환-네트워크">패킷 교환 네트워크</h3>
<ul>
<li>메시지를 <code>패킷 (packet)</code>이라는 단위로 쪼개어 전송하는 방식이다.</li>
<li>쪼개어 전송된 패킷들은 수신지에서 재조립한다.</li>
<li>패킷의 송수신지를 식별, 패킷이 이동할 최적의 경로를 결정하는 것을<code>패킷 스위치</code>라고 한다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/1e799710-5677-4ac0-b243-e8307e82070e/image.png" alt=""></p>
<ul>
<li><code>전송로의 이용 효율이 높아</code> 회선 교환 방식의 문제점 해결할 수 있다.</li>
<li><strong>현대 인터넷은 대부분 패킷 교환 방식을 이용한다.</strong></li>
</ul>
<hr>
<h2 id="📒-패킷">📒 패킷</h2>
<h3 id="패킷의-구조">패킷의 구조</h3>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/5f91ce23-e0d6-4bc7-9bc8-21caacbc5472/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/dev_vming/post/cfd53130-7918-408a-ae22-9bfb63a13f48/image.png" alt=""></p>
<h3 id="주소">주소</h3>
<ul>
<li>헤더에 담기는 대표적인 정보이다.<ul>
<li>송수신지를 특정하는 정보로 IP 주소, MAC 주소 등이 있다.</li>
<li>주소가 있으면 ‘누구에게 전송할 지’를 정할 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="송수신지-유형별-전송-방식">송수신지 유형별 전송 방식</h3>
<ul>
<li>유니캐스트 (unicast)<ul>
<li>가장 일반적인 송수신 형태이다.</li>
<li>하나의 수신지에 메시지를 전송하는 방식이다.</li>
<li>송신지와 수신지가 1:1로 메시지를 주고받는 경우에 사용된다.</li>
</ul>
</li>
<li>브로드캐스트 (broadcast)<ul>
<li>네트워크상의 모든 호스트에게 전송하는 방식이다.</li>
<li><code>브로드캐스트 도메인 (broadcast domain)</code> : 브로드캐스트가 전송되는 범위, 이를 LAN의 범위로 봐도 무방하다.</li>
</ul>
</li>
<li>멀티캐스트 (multicast)<ul>
<li>네트워크 내의 동일 그룹에 속한 호스트에게만 전송하는 방식이다.</li>
</ul>
</li>
<li>애니캐스트 (anycast)<ul>
<li>네트워크 내의 동일 그룹에 속한 호스트 중 가장 가까운 호스트에게 전송하는 방식이다.</li>
</ul>
</li>
</ul>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 2강. 네트워크 거시적으로 살펴보기① | 네트워크의 기본 구조] (<a href="https://www.youtube.com/watch?v=KuAlcc3I-Ao&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=5">https://www.youtube.com/watch?v=KuAlcc3I-Ao&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=5</a>)
[Youtube - [네트워크 기초 강의] 3강. 네트워크 거시적으로 살펴보기② | 네트워크의 분류] (<a href="https://www.youtube.com/watch?v=FVoPnnC12k8&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=6">https://www.youtube.com/watch?v=FVoPnnC12k8&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=6</a>)
[Youtube - [네트워크 기초 강의] 4강. 주소와 송수신지 유형에 따른 전송 방식] (<a href="https://www.youtube.com/watch?v=-ZQqH_qVK00&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=7">https://www.youtube.com/watch?v=-ZQqH_qVK00&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=7</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Network] 네트워크 기초 강의 - 혼자 공부하는 네트워크 #01]]></title>
            <link>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-01</link>
            <guid>https://velog.io/@dev_vming/Network-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B8%B0%EC%B4%88-%EA%B0%95%EC%9D%98-%ED%98%BC%EC%9E%90-%EA%B3%B5%EB%B6%80%ED%95%98%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-01</guid>
            <pubDate>Sun, 04 Aug 2024 14:07:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/2eb7a0e2-043f-49ca-a5e7-879ac9e1dae0/image.png" alt=""></p>
<h1 id="📚-컴퓨터-네트워크를-알아야-하는-이유">📚 컴퓨터 네트워크를 알아야 하는 이유</h1>
<hr>
<h2 id="📕-컴퓨터-네트워크란">📕 컴퓨터 네트워크란?</h2>
<h3 id="네트워크의-정의">네트워크의 정의</h3>
<ul>
<li>여러 개의 장치가 마치 그물처럼 <strong>서로 연결되어 정보를 주고받을 수 있는 통신망</strong>이다.</li>
<li>통신망은 <code>그래프</code> 자료구조의 형태를 띈다.</li>
<li>네트워크는 범위에 따라서 다양하게 나뉜다.</li>
<li><code>인터넷</code>은 여러 네트워크를 연결한 <strong>네트워크의 네트워크</strong>라고 할 수 있다.</li>
</ul>
<hr>
<h2 id="📗-개발자가-컴퓨터-네트워크를-알아야-하는-이유">📗 개발자가 컴퓨터 네트워크를 알아야 하는 이유</h2>
<h3 id="개발자의-업무와-네트워크-지식의-필요성">개발자의 업무와 네트워크 지식의 필요성</h3>
<ul>
<li>프로그램 제작에 네트워크 지식이 필요하다.</li>
<li>유지보수에 네트워크 지식이 필요하다.<ul>
<li>오류 진단 시</li>
<li>유지보수 도구 / 명령어 사용 시</li>
</ul>
</li>
<li>채용 시에도 네트워크 관련 기초 지식 보유자를 우대한다.</li>
</ul>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p>[Youtube - [네트워크 기초 강의] 1강. 컴퓨터 네트워크를 알아야 하는 이유] (<a href="https://www.youtube.com/watch?v=U2IX5JzgBis&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=2">https://www.youtube.com/watch?v=U2IX5JzgBis&amp;list=PLVsNizTWUw7HfOCgvlfHIDPPo3TE-2iQM&amp;index=2</a>)</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노개북] IT 5분 잡학사전 #11 - FINAL ]]></title>
            <link>https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-11</link>
            <guid>https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-11</guid>
            <pubDate>Thu, 21 Dec 2023 09:46:24 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/3501e79f-9c9d-42b6-98e6-16e070aba918/image.png" alt=""></p>
<h1 id="📖-노개북-til-11-final">📖 노개북 TIL #11 FINAL</h1>
<hr>
<h2 id="📌-기억하고-싶은-내용">📌 기억하고 싶은 내용</h2>
<h3 id="이전-게시물-링크">이전 게시물 링크</h3>
<p><a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-03#ep08-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9D%B4-c-%EC%96%B8%EC%96%B4%EB%B3%B4%EB%8B%A4-%EB%8A%90%EB%A6%B0-%EC%9D%B4%EC%9C%A0%EB%8A%94">인터프리터 언어 vs 컴파일 언어</a>
<a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-05#ep17-%EC%95%84-%EC%BF%A0%ED%82%A4%EA%B0%80-%EB%A8%B9%EB%8A%94-%EA%B2%8C-%EC%95%84%EB%8B%88%EB%9D%BC%EA%B3%A0%EC%9A%94">쿠키</a>
<a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-05#ep21-%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4%EB%8A%94-%EC%84%9C%EB%B2%84%EA%B0%80-%EC%97%86%EB%8B%A4%EB%8A%94-%EB%9C%BB">서버리스</a>
<a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-06#ep24-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%98-%EC%86%8D%EB%8F%84%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%91%9C%ED%98%84%ED%95%A0%EA%B9%8C">시간복잡도 : Big-O</a>
<a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-07#ep26-%EC%A0%95%EB%A0%AC-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%EC%9D%B4-%EB%AD%90%EC%A3%A0">정렬 알고리즘</a>
<a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-07#ep29-%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%95%84%EC%88%98-%EC%86%8C%EC%96%91-%ED%81%B4%EB%A6%B0-%EC%BD%94%EB%93%9C">클린코드</a>
<a href="https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-09#ep36-%EA%B0%9D%EC%B2%B4-%EC%A7%80%ED%96%A5-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EC%9D%B4-%EB%AD%90%EC%A3%A0-%E2%91%A0">객체 지향 프로그래밍</a></p>
<hr>
<h2 id="💬-오늘의-소감">💬 오늘의 소감</h2>
<h3 id="it-초심자가-읽으면-좋을-책">IT 초심자가 읽으면 좋을 책</h3>
<p>이 책을 누가 읽으면 좋을지 생각해보았는데, 아무래도 IT 분야에서 일을 하고 있는 사람보다는 IT에 관심을 가지기 시작한 사람에게 적합할 것 같다는 생각이 든다. 또, 책을 읽는 것에서 끝이 아니라 추가적으로 학습을 하고자 하는 의지 뿜뿜한 사람들을 위해 쓰여진 책이 아닐까 싶다. 책의 분량 자체가 많지 않고, 누구나 이해하기 쉽도록 예시를 들어 설명해주기 때문에 술술 읽히지만 그만큼 깊은 내용은 없기 때문이다. 조금 아쉽기는 했지만 의지 뿜뿜하면서 추가적으로 공부하기 위한 기초 지식을 튼튼히 할 수 있는 시간이었기에 충분히 유익했던 것 같다.</p>
<hr>
<h2 id="✨-추가로-공부할-내용">✨ 추가로 공부할 내용</h2>
<h3 id="쿠키-관련-내용">쿠키 관련 내용</h3>
<p>쿠키의 종류와 적용 방법
set-cookie를 이용하여 프론트에서 쿠키 생성</p>
<h3 id="시간-복잡도-관련-내용">시간 복잡도 관련 내용</h3>
<p>시간복잡도를 고려한 알고리즘 풀이</p>
<h3 id="해시테이블-관련-내용">해시테이블 관련 내용</h3>
<p><a href="https://evan-moon.github.io/2019/06/25/hashtable-with-js/">참고할 자료 1</a>
<a href="https://soldonii.tistory.com/72">참고할 자료 2</a></p>
<h3 id="객체-지향-프로그래밍-관련-내용">객체 지향 프로그래밍 관련 내용</h3>
<p><a href="https://yozm.wishket.com/magazine/detail/1396/">(요즘 IT) 테오의 프론트엔드 - 자바스크립트에서 객체지향을 하는 게 맞나요?</a></p>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p><a href="https://nomadcoders.co/c/it-dictionary/lobby">(이지스퍼블리싱) 노마드코더 - IT 5분 잡학사전 챌린지</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노개북] IT 5분 잡학사전 #10 - TIL ep.39~45]]></title>
            <link>https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-10</link>
            <guid>https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-10</guid>
            <pubDate>Wed, 20 Dec 2023 13:49:08 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/b674ce1d-3115-4075-9396-e37516eb717b/image.png" alt=""></p>
<h1 id="📖-노개북-til-10-ep3945">📖 노개북 TIL #10 ep.39~45</h1>
<hr>
<h2 id="📌-기억하고-싶은-내용">📌 기억하고 싶은 내용</h2>
<h3 id="ep39-인공지능-머신러닝-딥러닝-아직도-구분하기-힘들다고">ep.39 인공지능, 머신러닝, 딥러닝, 아직도 구분하기 힘들다고?</h3>
<p><code>인공지능</code>은 좁은 인공지능과 일반 인공지능으로 나눌 수 있다. </p>
<p><code>일반 인공지능</code>은 인간의 행동을 대부분 할 수 있거나 인간보다 능력이 더 뛰어난 경우를 말한다. 지금의 기술로는 일반 인공지능을 만들 수 없다. </p>
<p><code>좁은 인공지능</code>은 몇 가지 일만을 할 수 있으나 그것을 탁월하게 잘하는 경우를 말한다. 예를 들어 페이스북의 얼굴인식, 스마트폰의 빅스비나 시리와 같은 음성인식 등이 있다. (227p)</p>
<p><code>머신러닝</code>이란 인공지능을 학습시키는 방식을 말한다. 지도방식과 비지도방식으로 나눌 수 있다. </p>
<p><code>지도방식</code>은 인간이 기계에게 준 라벨을 토대로 학습, <code>비지도 방식</code>은 라벨이 없는 데이터를 통해 직접 학습하는 것을 말한다. (229p)</p>
<p><code>딥러닝</code>은 엄청나게 많은 층으로 구성되어 있는 머신러닝의 한 종류이다. (231p)</p>
<h3 id="ep40-rest-api라니-휴식-api인가-이거-대체-뭐죠">ep.40 REST API라니, 휴식 API인가? 이거 대체 뭐죠?</h3>
<p><code>REST API</code>의 REST는 representational state transfer의 줄임말이다. API를 작성할 때, URL에서 동사를 제외하고, HTTP 메서드를 사용, 쿼리를 도입함으로 이해하기 쉽고 확장성 좋게 만드는 것이다. (233p~236p)</p>
<h3 id="ep41-도커가-뭐지-왜-필요할까">ep.41 도커가 뭐지? 왜 필요할까?</h3>
<p><code>도커</code>는 개발 환경이 맞지 않는 상황 또는 개발 환경이 변경되었을 때 유연하게 대처할 수 있게 해준다. (238p)</p>
<p>원하는 개발 환경을 도커 파일에 저장하여 준비해주고, 마련한 개발환경이 컨테이너 형태로 존재하기 때문에 개발에 필요한 도구를 따로 모아 준비할 수도 있고 쉽게 복제할 수도있다. (241p)</p>
<h3 id="ep43-하이브리드--앱-뭐라고요">ep.43 하이브리드 ... 앱? 뭐라고요?</h3>
<p><code>하이브리드 앱</code>은 웹 사이트를 보여주는 웹 뷰를말한다. 웹 뷰로 만든 앱을 웹 앱이라고 한다. (251p)</p>
<p>하이브리드 앱의 장점은 네이티브 앱의 개발 지식이 크게 필요하지 않다는 것이다. 하지만 UI를 직접 하나하나 짜고, 스마트폰의 성능을 온전히 사용하지 못한다는 단점이 있다. (252p)</p>
<p><code>크로스플랫폼 앱</code>은 특정한 언어로 코딩하면, 그 코드가 나중에 네이티브 코드로 변환된다. 리액트 네이티브와 플러터라는 기술이 있다. (252p)</p>
<p>크로스플랫폼 앱은 개발자가 익숙한 코드로 한 번만 작성해도 된다는 점이 있다.그러나 네이티브 언어로 변환하는 과정이 있기에 네이티브앱에 비해 성능이 다소 떨어질 수는 있다. (254p)</p>
<p><code>네이티브 앱</code>은 말 그대로 iOS, 안드로이드만을 위한 언어로 코드를 작성해 개발한 것이다. 스마트폰의 성능을 최대로 이용할 수 있으나, 해당 언어를 배우는데에 시간이 필요하다는 점이 있다. (254p)</p>
<h3 id="ep45-멀웨어-바이러스-웜-개념-몽땅-정리">ep.45 멀웨어, 바이러스, 웜 개념 몽땅 정리</h3>
<p><code>멀웨어(malware)</code>는  malicious(악의있는)와 software의 합성어다. 보통 국가나 특정 기관에서 다른 국가의 핵심 시설이나 인프라를 감시, 파괴하기 위해 만든다. (260p)</p>
<p><code>바이러스</code>는 멀웨어의 한 종류로 파일과 같은 숙주를 통해 전파된다. 그에 반해 <code>웜</code>은 숙주가 필요없이 자신을 복제하며 전파된다. (261p)</p>
<p>웜은 <code>미사일</code>과 페이로드가 필요하다. 미사일을 통해 컴퓨터 안에 침투하고, 페이로드를 배포하는 방식으로 컴퓨터를 파괴시킨다. (262p)</p>
<hr>
<h2 id="💬-오늘의-소감">💬 오늘의 소감</h2>
<h3 id="책-한-권을-다-읽었다니">책 한 권을 다 읽었다니!</h3>
<p>챌린지를 시작하기 전에는 챌린지를 빠지지 않고 잘 할 수 있을지, 책 한권을 다 읽을 수 있을지 의문점이 많았다. 하지만 역시 하지 않고서는 알 수 없다. 이렇게 2주동안 책에 대한 내용을 정리하고 다 읽어냈기 때문이다. (역시 나는 강제성이 필요한 인간...😥) 책을 읽으면서 아예 처음 들어보는 용어는 없었기 때문에 더 술술 잘 읽을 수 있었던 것 같고, 긴가민가 한 용어들이 정리되어서 좋았던 것 같다. 이후에도 책을 읽고자 구매해뒀는데, 그 책을 읽으면서도 기억하고 싶은 내용이 있다면 기록해봐야 겠다.</p>
<hr>
<h2 id="✅-오늘의-미션">✅ 오늘의 미션</h2>
<p>나의 최애 북 TIL 선정하기</p>
<ul>
<li><a href="https://nomadcoders.co/community/thread/8917">kkmm080399님의 TIL</a></li>
<li><a href="https://nomadcoders.co/community/thread/8916">Hwayoon님의 TIL</a></li>
<li><a href="https://nomadcoders.co/community/thread/8915">skhan20님의 TIL</a></li>
</ul>
<p>중요한 개념을 강조하여 표시, </p>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p><a href="https://nomadcoders.co/c/it-dictionary/lobby">(이지스퍼블리싱) 노마드코더 - IT 5분 잡학사전 챌린지</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[노개북] IT 5분 잡학사전 #09 - TIL ep.35~38]]></title>
            <link>https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-09</link>
            <guid>https://velog.io/@dev_vming/%EB%85%B8%EA%B0%9C%EB%B6%81-IT-5%EB%B6%84-%EC%9E%A1%ED%95%99%EC%82%AC%EC%A0%84-09</guid>
            <pubDate>Tue, 19 Dec 2023 04:26:25 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/dev_vming/post/354162ae-3e65-4643-80a4-d1d1d00d3d6f/image.png" alt=""></p>
<h1 id="📖-노개북-til-09-ep3538">📖 노개북 TIL #09 ep.35~38</h1>
<hr>
<h2 id="📌-기억하고-싶은-내용">📌 기억하고 싶은 내용</h2>
<h3 id="ep35-비밀번호는-어떻게-저장될까">ep.35 비밀번호는 어떻게 저장될까?</h3>
<p><code>해시 함수</code>를 사용하면 비밀번호 시스템을 안전하게 구현할 수 있다. 사용자가 입력한 비밀번호를 무작위 값으로 만들어 저장한다. 이는 세가지 규칙을 따른다.</p>
<p><strong>규칙 1.</strong> 동일한 입력 값에 대해 동일한 출력 값을 가진다.
<strong>규칙 2.</strong> 입력값이 아주 살짝만 바뀌어도 출력 값은 완전 다른 값으로 바뀐다.
<strong>규칙 3.</strong> 반대로 입력해도 원래의 값이 나오지 않는다. (204p)</p>
<p>다만 해시 함수 완벽하지는 않다. 해시 함수가 변경한 값을 원래의 값과 연결한 표인 <code>레인보우 테이블(rainbow table)</code>이 있기 때문이다. 즉 레인보우 테이블이 노출되면 비밀번호를 알아낼 수 있다는 것이다. (205p)</p>
<p>이를 보완하기 위해 새로 나온 것이 <code>솔트(salt)</code>이다. 솔트는 아주 작은 무작위 텍스트이다. 비밀번호와 솔트를 더해 해시함수에 통과시키면 레인보우 테이블이 있어도 비밀번호를 찾을 수 없다. (206p)</p>
<h3 id="ep36-객체-지향-프로그래밍이-뭐죠-①">ep.36 객체 지향 프로그래밍이 뭐죠? ①</h3>
<p><code>프로그래밍 패러다임</code>은 프로그래밍을 할 때의 관점, 방식을 말한다. 프로그래밍 언어는 이런 프로그래밍 패러다임을 하나 또는 하나 이상 지원한다. 대표적인 프로그래밍 패러다임으로는 절차 지향 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍이 있다. </p>
<p><code>객체 지향 프로그래밍</code>의 <strong>클래스</strong>는 속성은 같지만 데이터는 다른 객체에 대해 반복적으로 작성함에서 오는 불편함을 줄여준다.(211p)</p>
<h3 id="ep37-객체-지향-프로그래밍이-뭐죠-②">ep.37 객체 지향 프로그래밍이 뭐죠? ②</h3>
<p><strong>상속</strong>도 클래스와 동일하게 중복되는 코드를 줄여주는데, 일부분만 재사용하는 데에 유용하다. 기본 속성을 가진 클래스를 나머지 클래스에 상속시키는 방식으로 사용한다. (215p)</p>
<h3 id="ep38-함수형-프로그래밍이-뭐죠">ep.38 함수형 프로그래밍이 뭐죠?</h3>
<p>BLT 샌드위치를 만드는 프로그램이 있다면 <code>선언형 프로그래밍</code>에서는 BLT 샌드위치를 만들어 줘!라고 원하는 결과값을 선언하고, <code>명령형 프로그래밍</code>에서는 빵을 굽고, 재료를 손질하고, 빵을 쌓는 과정을 거쳐 결과값에 어떻게 도달하는지 선언한다. (218p)</p>
<p><code>함수형 프로그래밍</code>에서는 선언형 프로그래밍 콘셉트를 유지하면서 함수 중심으로 코드를 작성한다. (221p)</p>
<hr>
<h2 id="💬-오늘의-소감">💬 오늘의 소감</h2>
<h3 id="코드를-작성할-때-고려해야-할-것들">코드를 작성할 때 고려해야 할 것들</h3>
<p>처음 공부를 시작했을 때는 별 생각 없이 따라치거나, 정말 꼬일대로 꼬여버린 코드를 작성하기도 했었다. 그러나 지금은 다르다. 조금 더 효율적이게 작성하는 법에 대해서도 생각해야 한다. 아직 어떤 코드가 효율적인지 어떤 코드가 클린한 코드인지는 잘 모르겠다. 아마 코드 리뷰와 피드백을 거듭받고, 스스로 공부해나가는 과정에서 답을 찾을 수 있지 않을까 싶다. 정말 공부만이 답이다. 오늘도 화이팅 🔥</p>
<hr>
<h2 id="🔍-궁금하거나-잘-이해되지-않는-내용">🔍 궁금하거나 잘 이해되지 않는 내용</h2>
<h3 id="ep36-37-객체-지향-프로그래밍이-뭐죠">ep.36, 37 객체 지향 프로그래밍이 뭐죠?</h3>
<p>객체 지향 프로그래밍이라는 용어를 굉장히 많이 들었는데, 정확한 뜻은 모르고 있었다. 이 책에서도 깊게 알려주지는 않는 것 같아 자세히 알기 위해 추가적으로 공부가 필요할 것 같다.</p>
<p><a href="https://yozm.wishket.com/magazine/detail/1396/">(요즘 IT) 테오의 프론트엔드 - 자바스크립트에서 객체지향을 하는 게 맞나요?</a></p>
<p>참고할 링크는 위의 글이며, 책에 나온 개념 외에도 캡슐화,추상화,다형성이라는 개념들이 있다.</p>
<hr>
<h2 id="📓-참고">📓 참고</h2>
<blockquote>
<p><a href="https://nomadcoders.co/c/it-dictionary/lobby">(이지스퍼블리싱) 노마드코더 - IT 5분 잡학사전 챌린지</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>