<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Dong.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 15 Feb 2026 12:18:59 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Dong.log</title>
            <url>https://velog.velcdn.com/images/dongeun-i/profile/918b2606-41b3-4692-8a88-1cdfc2274c93/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Dong.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dongeun-i" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[CDD(Component-Driven Development) ]]></title>
            <link>https://velog.io/@dongeun-i/CDDComponent-Driven-Development</link>
            <guid>https://velog.io/@dongeun-i/CDDComponent-Driven-Development</guid>
            <pubDate>Sun, 15 Feb 2026 12:18:59 GMT</pubDate>
            <description><![CDATA[<h2 id="component-driven-development-란">Component-Driven Development 란?</h2>
<p>Component-Driven Development(CDD)는 <strong>UI 컴포넌트 단위로 설계·개발·검증하는 개발 방식</strong>을 말한다.</p>
<blockquote>
<p>화면을 먼저 만들고, 나중에 쪼개는 방식 ❌
작은 UI 컴포넌트를 먼저 만들고 조합해서 화면을 구성하는 방식 ✅</p>
</blockquote>
<p><em>마치 레고 블록을 하나씩 조립해서 거대한 성을 만드는 것</em>  </p>
<h2 id="cdd-를-사용했을때-장점은-">CDD 를 사용했을때 장점은 ?</h2>
<ul>
<li><strong>재사용성</strong> : 중복 코드 최소화</li>
<li><strong>독립적 개발</strong> : 데이터가 준비되어있지 않아도 UI를 미리 만들고 테스트가 가능</li>
<li><strong>유지보수 용이</strong> : 특정 요소의 스타일을 바꾸어야 할때, 해당 컴포넌트만 수정하여 전체 서비스에 적용 </li>
</ul>
<h2 id="기존방식page-driven-vs-cdd-방식">기존방식(Page-Driven) vs CDD 방식</h2>
<table>
<thead>
<tr>
<th align="left">구분</th>
<th align="left">기존 방식 (Page-Driven)</th>
<th align="left">CDD (Component-Driven)</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>접근 방식</strong></td>
<td align="left">Top-Down (페이지 → 컴포넌트)</td>
<td align="left"><strong>Bottom-Up (컴포넌트 → 페이지)</strong></td>
</tr>
<tr>
<td align="left"><strong>작업 단위</strong></td>
<td align="left">페이지(Page) 중심</td>
<td align="left">컴포넌트(Component) 중심</td>
</tr>
<tr>
<td align="left"><strong>의존성</strong></td>
<td align="left">데이터 구조에 의존적</td>
<td align="left">UI 자체의 독립성 강조</td>
</tr>
</tbody></table>
<h3 id="기존방식-코드">기존방식 코드</h3>
<pre><code class="language-javascript">// MainDashboard.jsx (페이지 중심)
function MainDashboard() {
  return (
    &lt;div className=&quot;dashboard-container&quot;&gt;
      {/* 검색 바 영역: 페이지 안에서 직접 정의 */}
      &lt;header style={{ display: &#39;flex&#39;, padding: &#39;10px&#39; }}&gt;
        &lt;input type=&quot;text&quot; placeholder=&quot;검색어를 입력하세요&quot; style={{ border: &#39;1px solid gray&#39; }} /&gt;
        &lt;button style={{ backgroundColor: &#39;blue&#39;, color: &#39;white&#39; }}&gt;검색&lt;/button&gt;
      &lt;/header&gt;

      {/* 컨텐츠 영역 */}
      &lt;main&gt;
        &lt;h1&gt;대시보드 메인&lt;/h1&gt;
        &lt;p&gt;환영합니다!&lt;/p&gt;
      &lt;/main&gt;
    &lt;/div&gt;
  );
}</code></pre>
<h3 id="cdd-방식의-코드-atomic-방식">CDD 방식의 코드 (Atomic 방식)</h3>
<h4 id="1-가장-작은-단위atoms">1. 가장 작은 단위(Atoms)</h4>
<pre><code class="language-javascript">// src/components/atoms/Button.jsx
export const Button = ({ label, color }) =&gt; (
  &lt;button style={{ backgroundColor: color, color: &#39;white&#39; }}&gt;{label}&lt;/button&gt;
);

// src/components/atoms/Input.jsx
export const Input = ({ placeholder }) =&gt; (
  &lt;input type=&quot;text&quot; placeholder={placeholder} style={{ border: &#39;1px solid gray&#39; }} /&gt;
);</code></pre>
<h4 id="2원자요소-molecules">2.원자요소 (Molecules)</h4>
<pre><code class="language-javascript">// src/components/molecules/SearchBar.jsx
import { Button } from &#39;../atoms/Button&#39;;
import { Input } from &#39;../atoms/Input&#39;;

export const SearchBar = () =&gt; (
  &lt;div style={{ display: &#39;flex&#39;, gap: &#39;5px&#39; }}&gt;
    &lt;Input placeholder=&quot;검색어를 입력하세요&quot; /&gt;
    &lt;Button label=&quot;검색&quot; color=&quot;blue&quot; /&gt;
  &lt;/div&gt;
);</code></pre>
<h4 id="3page-에서의-조합">3.Page 에서의 조합</h4>
<pre><code class="language-javascript">// src/pages/MainDashboard.jsx
import { SearchBar } from &#39;../components/molecules/SearchBar&#39;;

function MainDashboard() {
  return (
    &lt;div className=&quot;dashboard-container&quot;&gt;
      &lt;header&gt;
        &lt;SearchBar /&gt; {/* 조립만 하면 끝! */}
      &lt;/header&gt;
      &lt;main&gt;
        &lt;h1&gt;대시보드 메인&lt;/h1&gt;
      &lt;/main&gt;
    &lt;/div&gt;
  );
}</code></pre>
<h2 id="실전-사용-예시-atomic-design-패턴">실전 사용 예시: Atomic Design 패턴</h2>
<p>저는 CDD를 실천하기 위해 <strong>아토믹 디자인(Atomic Design)</strong> 패턴을 주로 사용합니다. 이 패턴은 UI를 화학적 단위로 쪼개어 관리합니다.</p>
<ol>
<li><strong>Atoms(원자)</strong>: 버튼, 입력창, 라벨처럼 더 이상 쪼갤 수 없는 최소 단위</li>
<li><strong>Molecules(분자)</strong>: 원자들을 조합한 기능 단위 (예: 검색창 = 입력창 + 버튼)</li>
<li><strong>Organisms(유기체)</strong>: 분자와 원자를 조합한 복잡한 섹션 (예: 헤더, 내비게이션 바)</li>
<li><strong>Templates(템플릿)</strong>: 데이터가 없는 레이아웃 구조</li>
<li><strong>Pages(페이지)</strong>: 실제 데이터가 주입되어 완성된 최종 화면</li>
</ol>
<blockquote>
<p><em>저는 프로젝트를 진행할 때 Templates까지를 순수한 UI 레벨로 두려고 노력합니다. 예외도 있지만..😂</em>
<strong>Templates</strong>: 데이터가 어떻게 보여야 하는지, 컴포넌트들이 어디에 배치되어야 하는지 등 <strong>&#39;UI 구조&#39;</strong>만을 담당합니다. (Props로 데이터를 받기만 함)
<strong>Pages</strong>: 실제 API 호출, 상태 관리(State), 데이터 가공 등의 <strong>&#39;비즈니스 로직&#39;</strong>을 담당하여 그 결과를 Template으로 전달합니다.</p>
</blockquote>
<h2 id="마무리">마무리</h2>
<p>요즘은 AI 도구를 활용한 <strong>&#39;바이브 코딩(Vibe Coding)&#39;</strong>이 대세가 되면서, 명령어 한 줄로 페이지 전체를 뚝딱 만들어낼 수 있는 시대가 되었습니다. 저 또한 AI에 의존하다 보니, 어느덧 차근차근 컴포넌트를 설계하던 CDD의 원칙을 조금씩 소홀히 하고 있지는 않았나 하는 반성을 하게 됩니다..😭
AI는 당장 돌아가는 &#39;통코드&#39;를 짜주는 데는 능숙하지만, 그 코드가 우리 프로젝트의 구조에 맞는지, 재사용성이 고려되었는지까지 완벽하게 챙겨주지는 못합니다. 결국 AI로 작업할수록 결과물은 빠르게 나오지만, 역설적으로 <strong>컴포넌트 간의 경계가 모호해지고 유지보수가 어려워지는 &#39;기술 부채&#39;</strong>가 쌓이는 기분도 듭니다.</p>
<p>이번 포스팅을 정리하며 다시금 다짐해 봅니다.</p>
<p>&quot;AI는 강력한 엔진이지만, 설계도(CDD/Atomic Design)를 그리는 것은 여전히 개발자의 몫이다.&quot;</p>
<p>그래서 앞으로는 AI와 협업할 때 나만의 <strong>&#39;CDD 가이드라인&#39;</strong>을 더 명확히 전달해 보려 합니다. 예를 들어, AI에게 코딩 룰을 설정할 때 <strong>&quot;모든 UI는 아토믹 패턴에 따라 구현해 줘&quot;</strong>라거나 &quot;Templates와 Pages의 책임을 엄격히 분리해 줘&quot; 같은 프롬프트를 활용하는 것이죠</p>
<p>속도에 매몰되어 CDD의 본질을 놓치기보다, AI를 활용해 더 정교한 컴포넌트를 더 빠르게 만드는 방식으로 나아가야 할 것 같습니다.  </p>
<p><em>CDD를 정리하다보니 Storyboo이라는 도구를 알게되었습니다. 이것도 한번 사용해보고, 포스팅을 해보고자 합니다.</em></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[GitPod 를 적용해보자]]></title>
            <link>https://velog.io/@dongeun-i/GitPod-%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90</link>
            <guid>https://velog.io/@dongeun-i/GitPod-%EB%A5%BC-%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EC%9E%90</guid>
            <pubDate>Sat, 12 Jul 2025 08:50:30 GMT</pubDate>
            <description><![CDATA[<p>친구와 함께 같이 개발을 진행 하다가 작업환경 설정에 익숙하지 않고 직접 나도 다시 세팅하려니 너무 번거로워서 협업하여 개발 중인 Repository 에 Gitpod 를 적용해보기로 했다</p>
<h2 id="탭도-하나-구매했는데-탭으로도-개발-작업-할-수-있으면-편하겠다-싶었다"><em>+탭도 하나 구매했는데 탭으로도 개발 작업 할 수 있으면 편하겠다 싶었다..</em></h2>
<h2 id="gitpod-알아보기">Gitpod 알아보기!</h2>
<blockquote>
<p>Gitpod은 GitHub, GitLab, Bitbucket 등 Git 기반의 모든 저장소(Repository)를 클릭 한 번으로 완벽하게 구성된 개발 환경으로 만들어주는 서비스이다. 웹 브라우저만 있다면 언제 어디서든 코드를 작성하고 실행하며 협업할 수 있도록 돕는다.</p>
</blockquote>
<h3 id="1-왜-gitpod이-필요한가-등장-배경-및-해결하는-문제">1. 왜 Gitpod이 필요한가? (등장 배경 및 해결하는 문제)</h3>
<p>전통적인 개발 환경은 다음과 같은 문제점들을 가지고 있었다:</p>
<ul>
<li><strong>환경 설정의 번거로움:</strong> 새로운 프로젝트를 시작할 때마다 필요한 도구, 라이브러리, 의존성 등을 일일이 설치하고 설정해야 했다. 이는 많은 시간과 노력을 소모하며, 때로는 예상치 못한 오류를 유발한다.</li>
<li><strong>&quot;내 컴퓨터에서는 잘 되는데?&quot; (환경 불일치):</strong> 팀원마다 다른 운영체제나 개발 도구 버전을 사용하면서 발생하는 환경 불일치 문제는 디버깅을 어렵게 하고 생산성을 저해한다.</li>
<li><strong>자원 제약:</strong> 고사양의 개발 환경이 필요할 경우 개인 컴퓨터의 성능 제약에 부딪히곤 한다.</li>
<li><strong>이동성의 한계:</strong> 특정 컴퓨터에 개발 환경이 종속되어 있어 다른 장소나 기기에서는 작업하기 어려웠다.</li>
</ul>
<p>Gitpod은 이러한 문제들을 <strong>&#39;클라우드 기반의 일관된 개발 환경&#39;</strong>을 제공함으로써 해결한다.</p>
<h3 id="2-gitpod의-핵심-기능-및-특징">2. Gitpod의 핵심 기능 및 특징</h3>
<ul>
<li><strong>클릭 한 번으로 즉시 시작하는 개발 환경 (Instant Dev Environments):</strong><ul>
<li>어떤 Git 저장소든 URL 앞에 <code>gitpod.io/#</code>를 붙이거나 Gitpod 대시보드를 통해 클릭 한 번이면, 해당 프로젝트에 필요한 모든 도구와 의존성이 미리 설정된 개발 환경이 몇 초 내에 준비된다.</li>
</ul>
</li>
<li><strong>사전 빌드 (Prebuilds):</strong><ul>
<li><code>.gitpod.yml</code> 파일에 워크스페이스 설정(의존성 설치, 빌드 명령 등)을 정의하면, Gitpod은 코드가 변경될 때마다(예: Git Push) 워크스페이스를 미리 빌드해 놓는다. 덕분에 개발자가 환경을 열자마자 코딩을 시작할 수 있다.</li>
</ul>
</li>
<li><strong>일시적인(Disposable) 워크스페이스:</strong><ul>
<li>각 워크스페이스는 독립적이며, 작업이 끝나면 쉽게 버릴 수 있다. &quot;깨끗한 상태&quot;에서 다시 시작하거나, 여러 기능을 동시에 개발할 때 각기 다른 환경을 활용하기 용이하다.</li>
</ul>
</li>
<li><strong>브라우저 기반의 VS Code IDE:</strong><ul>
<li>Gitpod은 강력한 VS Code를 웹 브라우저에서 사용할 수 있도록 제공한다. 익숙한 단축키, 확장 프로그램, 터미널 등을 웹에서 그대로 경험할 수 있다.</li>
</ul>
</li>
<li><strong>협업 기능:</strong><ul>
<li>팀원들과 동일한 개발 환경을 공유하고, 실시간으로 함께 코드를 편집하며 페어 프로그래밍을 할 수 있다.</li>
</ul>
</li>
</ul>
<h3 id="3-gitpod을-사용하면-좋은-점">3. Gitpod을 사용하면 좋은 점</h3>
<ul>
<li><strong>설정 시간 제로:</strong> 더 이상 개발 환경 설정에 시간을 낭비하지 않고, 바로 코드 작성에 집중할 수 있다.</li>
<li><strong>&quot;Works on my machine&quot; 문제 해결:</strong> 모든 팀원이 동일하고 일관된 클라우드 개발 환경에서 작업하므로 환경 불일치로 인한 문제가 사라진다.</li>
<li><strong>어디서든 개발 가능:</strong> 웹 브라우저만 있다면 어떤 컴퓨터(저사양 노트북, 태블릿 등)에서도 모든 기능을 갖춘 개발 환경을 이용할 수 있다.</li>
<li><strong>강력한 클라우드 자원 활용:</strong> 필요에 따라 고성능의 CPU와 RAM이 할당되므로, 복잡한 빌드나 테스트도 빠르게 처리할 수 있다.</li>
<li><strong>온보딩 가속화:</strong> 새로운 팀원이 프로젝트에 합류할 때, 복잡한 환경 설정 가이드 없이 Gitpod 워크스페이스만 공유하면 바로 개발을 시작할 수 있다.</li>
</ul>
<hr>
<h2 id="gitpod-적용해보기-">Gitpod 적용해보기 !</h2>
<h3 id="1-gitpod-접속후-dashboard-를-누른뒤-접속">1. <a href="https://www.gitpod.io">Gitpod</a> 접속후 Dashboard 를 누른뒤 접속</h3>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/8ebb4d90-78e7-4777-955f-98be87a3a0c9/image.png" alt="">
작업중인 Repository 를 연결하고, 나는 Vscode 로 설정했다</p>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/bfe3a1a4-87c6-460e-9b91-afdb82deb414/image.png" alt="">
사양을 선택하고 Continue 를 통ㅇ해 생성 하면..</p>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/b29f3d47-e8a7-49d5-ab1e-f8f052d3b563/image.png" alt=""></p>
<p>_쉽게는 안된다..😩 _ </p>
<h3 id="2-권한-부여">2. 권한 부여</h3>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/8b7b2b95-a5ee-46ce-b9a0-ec942c6fa164/image.png" alt="">
권한문제인것 같은데 메일을 확인해보니 third-part 를 허용해줘야된다고한다 링크를 들어가서 
<img src="https://velog.velcdn.com/images/dongeun-i/post/2e85b35e-5e40-4e59-863c-5748177fc0b2/image.png" alt=""><code>Request</code> 버튼 딸깍 하니 문제가 해결되었다</p>
<h3 id="3-접속">3. 접속</h3>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/f9afdbee-0613-4a64-8fb8-de654b0f8f78/image.png" alt="">Workspace를 보면 연결된 목록이나오고 
<img src="https://velog.velcdn.com/images/dongeun-i/post/a838239f-1ef4-48be-ad86-7b33fb00ebf8/image.png" alt="">
접속해보면 브라우저에서 vscode 화면이 나온다 👍</p>
<h3 id="4-테스트">4. 테스트</h3>
<pre><code class="language-javascript">// helloworld.js
import express from &#39;express&#39;;
import dotenv from &#39;dotenv&#39;; // .env 파일에서 환경 변수를 로드하기 위해 사용

dotenv.config();

const app = express();
const port = process.env.PORT || 3000;

// JSON 요청 본문을 파싱하기 위한 미들웨어
app.use(express.json());
// URL-encoded 요청 본문을 파싱하기 위한 미들웨어
app.use(express.urlencoded({ extended: true }));

// 기본 경로 (루트)에 대한 GET 요청 처리
app.get(&#39;/&#39;, (req, res) =&gt; {
  res.send(&#39;Hello World! This is the root of the sanner_worker.&#39;);
});

// /helloworld 경로에 대한 GET 요청 처리
app.get(&#39;/helloworld&#39;, (req, res) =&gt; {
  res.send(&#39;Hello World from /helloworld API!&#39;);
});

// 서버 시작
app.listen(port, () =&gt; {
  console.log(`Server running on port ${port}`);
  console.log(`Access it at: http://localhost:${port}`);
  console.log(`Or via Gitpod URL once exposed.`);
});
</code></pre>
<p>대충 hello world 코드를 작성해서</p>
<pre><code class="language-bash">pm2 start helloworld.js</code></pre>
<p>실행을 해보면 <img src="https://velog.velcdn.com/images/dongeun-i/post/6b395b78-1a0a-4a2a-aad2-a26326088337/image.png" alt="">
<img src="https://velog.velcdn.com/images/dongeun-i/post/20beb822-3c1c-4982-93a9-9d5f1e5d5ebc/image.png" alt=""></p>
<p>잘실행이 된다👏👏👏</p>
<hr>
<h2 id="gitpodyml"><code>.gitpod.yml</code></h2>
<p>Gitpod 워크스페이스에서 웹 서버나 API 서버 등을 실행할 때, 이 서버에 외부에서 접속하려면 포트를 적절히 설정해야 한다. <code>.gitpod.yml</code> 파일의 <code>ports</code> 섹션은 워크스페이스 내에서 열리는 포트들을 Gitpod이 어떻게 다룰지 정의한다.</p>
<h3 id="1-ports-설정-예시">1. <code>ports</code> 설정 예시</h3>
<pre><code class="language-yaml">ports:
  - port: 3000          # 필수: 서버가 사용하는 포트 번호를 명시한다. (예: Node.js 앱)
    onOpen: open-browser # 선택: 워크스페이스 시작 시 이 포트에 대해 Gitpod이 취할 동작을 지정한다.
    visibility: public  # 선택: 이 포트로 열리는 URL의 접근 권한을 설정한다. (기본값은 &#39;private&#39;)

  - port: 8080          # 다른 서버(예: 개발용 프론트엔드 서버)가 사용하는 포트
    onOpen: open-preview # IDE 내에서 미리보기 패널로 연다.
    visibility: private # Gitpod에 로그인한 사용자만 접근을 허용한다.</code></pre>
<h3 id="2-ports-옵션-상세-설명">2. <code>ports</code> 옵션 상세 설명</h3>
<p><code>ports</code> 섹션 아래 각 포트는 여러 옵션을 가질 수 있다.</p>
<ul>
<li><p><strong><code>port</code> (필수)</strong></p>
<ul>
<li><strong>설명</strong>: 워크스페이스 내에서 실행되는 애플리케이션이 실제로 사용하는 포트 번호를 지정한다. Gitpod은 이 번호를 통해 내부 포트를 외부 URL과 연결한다.</li>
<li><strong>예시</strong>: <code>3000</code>, <code>8080</code>, <code>5173</code> 등.</li>
</ul>
</li>
<li><p><strong><code>onOpen</code> (선택)</strong></p>
<ul>
<li><strong>설명</strong>: 워크스페이스가 열릴 때 Gitpod이 해당 포트에 대해 어떤 동작을 할지 지정하는 옵션이다.</li>
<li><strong>사용 가능한 값</strong>:<ul>
<li><code>open-browser</code>: 새 웹 브라우저 탭을 열어 해당 포트의 URL로 접속시킨다. (기본값)</li>
<li><code>open-preview</code>: Gitpod IDE 내부에 분할 화면으로 미리보기 패널을 열어준다. 간단한 웹 앱 미리보기에 유용하다.</li>
<li><code>notify</code>: 포트가 열렸다는 알림만 표시한다. 사용자가 직접 클릭하여 접속할 수 있다.</li>
<li><code>ignore</code>: 아무런 동작도 하지 않는다. 포트는 열리지만, Gitpod이 자동으로 사용자에게 보여주거나 알리지 않는다.</li>
</ul>
</li>
</ul>
</li>
<li><p><strong><code>visibility</code> (선택)</strong></p>
<ul>
<li><strong>설명</strong>: 이 포트로 생성되는 외부 URL의 접근 권한을 설정한다.</li>
<li><strong>사용 가능한 값</strong>:<ul>
<li><code>public</code>: 인터넷상의 <strong>누구나</strong> 이 포트의 URL에 접근할 수 있다. (예: <code>https://3000-워크스페이스ID.gitpod.io</code>) 디버깅이나 외부 테스트를 위해 일시적으로 사용된다.</li>
<li><code>private</code>: <strong>Gitpod에 로그인한 사용자만</strong> 이 포트의 URL에 접근할 수 있다. 보안상 더 권장되는 설정이며, 팀원 간 공유에 적합하다. (기본값)</li>
<li><code>private-internal</code>: 워크스페이스 <strong>내부에서만 접근 가능</strong>하다. 외부로 노출되지 않는다. 주로 내부 서비스 간 통신이나 백그라운드 프로세스에 사용된다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>이 설정들을 통해 Gitpod 워크스페이스의 네트워크 환경을 유연하게 제어할 수 있다. 특히 <code>visibility</code> 옵션은 보안과 직접적으로 연관되므로 신중하게 선택하는 것이 중요하다.</p>
<hr>
<h2 id="마치며">마치며</h2>
<blockquote>
<p>Gitpod 연결해야지 해야지 했었는데... 막상 해보니 금방하기도 했고 재미있고 유익했던것 같다 <em>시간이되면 Github Action 같은것도 같이 연동해서 환경을 자동적으로 세팅할 수 있게 해봐야겠다</em></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 변수네이밍 규칙]]></title>
            <link>https://velog.io/@dongeun-i/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B3%80%EC%88%98%EB%84%A4%EC%9D%B4%EB%B0%8D-%EA%B7%9C%EC%B9%99</link>
            <guid>https://velog.io/@dongeun-i/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%B3%80%EC%88%98%EB%84%A4%EC%9D%B4%EB%B0%8D-%EA%B7%9C%EC%B9%99</guid>
            <pubDate>Wed, 19 Mar 2025 13:37:57 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>자바스크립트 변수 네이밍 규칙에 대하여 정리해보자 !</p>
</blockquote>
<h2 id="변수variable">변수(variable)</h2>
<p>자바스크립트에서 사용하는 변수에는 <strong><del>var</del></strong>,<strong>let</strong>,<strong>const</strong> 가 있다.
각 변수 선언 방식에는 범위(Scope), 재할당 가능 여부, 호이스팅(Hoisting) 등의 차이가 있다.</p>
<h3 id="var">var</h3>
<ul>
<li>ES6 이전에 사용되었던 변수 선언방식으로 현재는 더이상 사용하는 것을 권장하지 않는다.</li>
</ul>
<h4 id="비권장이유">비권장이유</h4>
<ol>
<li><p>변수를 선언하기도 전에 값이 저장이 가능하다. 아래의 코드로 예시를 들어보겠다.</p>
<pre><code class="language-js">     console.log(name) // undefined
     var name =&#39;DongEun&#39;;

     console.log(name) // ReferenceError 출력
     let name = &#39;DongEun&#39;;
</code></pre>
<p>위와 같이 난타나는 이유는 호이스팅(Hoisting)으로 인해 변수 선언이 최상단으로 올라가기 때문이다.
반면 let을 사용하면 호이스팅은 발생하지만 <strong>초기화되지 않은 상태(TDZ, Temporal Dead Zone)</strong>에 있기 때문에 <strong>ReferenceError</strong> 가 발생한다.
이처럼 var는 예상하지 못한 동작을 유발할 수 있기 때문에 사용을 지양하는 것이 좋다.호이스팅(Hoisting)에 대해서는 나중에 다시 다뤄 보도록 하겠다.</p>
</li>
<li><p>블록 스코프(Block Scope)를 무시한다.</p>
</li>
</ol>
<pre><code class="language-js">    {
        var name = &#39;DoongEun&#39;;
    }
    console.log(name) // DongEun&quot;

    {
      let name = &#39;DongEun&#39;;
    }
    console.log(name) // ReferenceError: name is not defined</code></pre>
<p><code>var</code>로 선언한 변수는 블록 스코프를 따르지 않고 함수 스코프를 따른다.
즉, {}(중괄호) 내부에서 선언해도 해당 블록을 벗어나 접근 가능하므로 예상치 못한 값이 출력될 수 있다.
반면 <code>let</code>을 사용하면 블록 스코프가 적용되어 {} 내부에서만 변수를 사용할 수 있어 보다 안전한 코드 작성이 가능하다.</p>
<p>앞서 설명한 두 가지 이유(호이스팅으로 인한 예상치 못한 동작, 블록 스코프 무시)로 인해 현대적인 자바스크립트 개발에서는 var를 사용하지 않는 것이 일반적이다.</p>
<p><em><del>ES6를 사용하는 환경인데도 불구하고, var로 변수를 선언한다면 혼줄을 ...</del></em></p>
<h3 id="let">let</h3>
<ul>
<li>블록 스코프(Block Scope) 적용 → {} 내부에서만 접근 가능하다.</li>
<li>재할당이 가능</li>
<li>중복 선언이 불가능하다.</li>
<li>호이스팅이 발생하지만 초기화 되지 않는다.<pre><code class="language-js">let name = &quot;Dongeun&quot;;
console.log(name); // &quot;Dongeun&quot;
</code></pre>
</li>
</ul>
<p>name = &quot;DongEunLee&quot;; // 재할당 가능
console.log(name); // &quot;DongEunLee&quot;</p>
<p>let name = &quot;Foo&quot;; // SyntaxError (중복 선언 불가)</p>
<pre><code>
```js
{
    let currentYear = 2025;
    console.log(currentYear); // 2025 (블록 내부에서 접근 가능)
}
console.log(currentYear); // ReferenceError (블록 외부에서 접근 불가능)</code></pre><h3 id="const">const</h3>
<ul>
<li>블록 스코프(Block Scope) 적용 → {} 내부에서만 접근 가능</li>
<li>재할당 불가능</li>
<li>선언과 동시에 초기화 필수이다.</li>
<li>객체(Object)와 배열(Array)의 경우에는 내부 값 변경 가능하다. (단, 참조 주소 변경 불가능)</li>
</ul>
<pre><code class="language-js">const TEST_NUMBER = 3;
console.log(TEST_NUMBER) // 3
TEST_NUMBER = 10; // TypeError 재할당 불가</code></pre>
<pre><code class="language-js">const user = { name: &quot;Foo&quot;, age: 25 };

// 객체의 속성 변경 가능
user.age = 30; 
console.log(user); // { name: &quot;Foo&quot;, age: 30 }

// user = { name: &quot;Bar&quot; }; // TypeError (객체 자체 재할당 불가능)</code></pre>
<h2 id="변수-선언-규칙">변수 선언 규칙</h2>
<h3 id="선언-규칙">선언 규칙</h3>
<ol>
<li>영문, 숫자, _(언더스코어), $(달러)만 사용 가능<pre><code class="language-js"> let name, _name, $name; ✅</code></pre>
</li>
<li>숫자로 시작할 수 없다<pre><code class="language-js"> let 1stUser = &quot;foo&quot;; ❌ Error 발생</code></pre>
</li>
<li>자바스크립트 예약어(Reserved Words)는 변수명으로 사용 할 수 없다.<pre><code class="language-js"> let let = &quot;test&quot;; ❌ Error 발생
 let const = &quot;helloConst&quot;; ❌ Error 발생</code></pre>
</li>
<li>Kebab-case는 선언할 수없다.<pre><code class="language-js"> let my-name = &quot;Dongeun&quot;; //  ❌ 연산자로 해석된다</code></pre>
</li>
</ol>
<h3 id="네이밍-컨벤션naming-convention-이란">네이밍 컨벤션(Naming Convention) 이란?</h3>
<p>네이밍 컨벤션(Naming Convention)이란 <strong>코드에서 변수, 함수, 클래스 등의 이름을 정하는 일관된 규칙</strong>을 의미한다.<br>일관된 네이밍 규칙을 따르면 <strong>가독성, 유지보수성, 협업 효율성</strong>이 향상된다.</p>
<h2 id="자바스크립트에서-사용하는-주요-네이밍-컨벤션">자바스크립트에서 사용하는 주요 네이밍 컨벤션</h2>
<h3 id="camelcase-자바스크립트에서-기본적으로-사용"><code>camelCase</code> (자바스크립트에서 기본적으로 사용)</h3>
<ul>
<li>첫 단어는 소문자로 시작하고, 이후 단어의 첫 글자는 대문자로 작성</li>
<li><strong>변수명, 함수명</strong>에서 주로 사용</li>
<li>권장 ✅</li>
</ul>
<p><em>이번 주제로 포스팅하는 이유 중 하나가 camelCase가 권장되고 뒤에 설명할 SnakeCase는 비권장한다는 것을 보고 SnakeCase보다 camelCase 사용을 지향하기위해서이다.</em></p>
<pre><code class="language-js">let userName = &quot;Dongeun&quot;;  // 변수
function getUserData() {...} // 함수</code></pre>
<h3 id="pascalcase클래스-및-생성자-함수">PascalCase(클래스 및 생성자 함수)</h3>
<ul>
<li>모든 단어의 첫 글자를 대문자로 작성.</li>
<li>클래스명, 생성자 함수명에서 주로 사용.</li>
<li>권장 ✅<pre><code class="language-js">class UserAccount {}  // 클래스
function CreateUser() {}  // 생성자 함수 (잘 사용되지 않음)</code></pre>
<h3 id="upper_snake_case상수">UPPER_SNAKE_CASE(상수)</h3>
</li>
<li>모든 글자를 대문자로 작성하고, 단어를 _(언더스코어)로 구분.</li>
<li>변하지 않는 상수 값에 사용.</li>
<li>권장 ✅</li>
</ul>
<pre><code class="language-js">const MAX_VALUE = 100;
const API_URL = &quot;https://api.example.com&quot;;</code></pre>
<h3 id="snake_case-자바스크립트에서는-사용하지-않음">snake_case (자바스크립트에서는 사용하지 않음)</h3>
<ul>
<li>모든 글자를 소문자로 작성하고, 단어를 _(언더스코어)로 구분.</li>
<li>Python, SQL에서는 일반적이지만, JavaScript에서는 잘 사용되지 않음.</li>
<li>비권장 ❌</li>
</ul>
<pre><code class="language-js">let user_name = &quot;dong_eun&quot;; // JS에서는 사용을 권장하지 않는다.</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[지오해시(GeoHash) 란 ?]]></title>
            <link>https://velog.io/@dongeun-i/%EC%A7%80%EC%98%A4%ED%95%B4%EC%8B%9CGeoHash-%EB%9E%80</link>
            <guid>https://velog.io/@dongeun-i/%EC%A7%80%EC%98%A4%ED%95%B4%EC%8B%9CGeoHash-%EB%9E%80</guid>
            <pubDate>Wed, 09 Oct 2024 13:09:42 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>최근 책을 보다가 지오해시에 대해 언급이 되어 정리하는 시간을 가져본다</p>
</blockquote>
<h3 id="지오해시geohash">지오해시(GeoHash)</h3>
<p>지오해시(Geohash)는 공간 인덱싱(spatial indexing) 기법으로, 지리적 좌표(위도와 경도)를 이진수로 변환한 후, 다시 문자열로 인코딩하는 방식을 말한다. 이 방식은 위치 정보를 효율적으로 저장하고 검색할 수 있게 해주며, 특정한 패턴을 통해 근처 위치를 쉽게 식별할 수 있게 한다.</p>
<h3 id="주요특징">주요특징</h3>
<ol>
<li><p>위도와 경도의 압축: 위도와 경도를 짧은 문자열로 압축하여 저장하거나 검색할 때 사용하기에 용이하다.</p>
</li>
<li><p>공간적 근접성 유지: 지오해시의 문자열 앞부분이 동일하다면, 해당 위치들이 가까운 지역에 있음을 나타낸다.</p>
</li>
<li><p>계층적 구조: 지오해시 문자열의 길이에 따라 위치의 정확도가 달지게된다 따라서 문자열이 길수록 더 세밀한 지역을 나타내고, 짧을수록 더 넓은 범위를 나타낸다.</p>
</li>
</ol>
<ul>
<li><p>Level 1: 지오해시의 첫 글자에 해당하는 부분으로, 지구 전체를 대략적으로 4개의 큰 구역으로 나눈다.</p>
</li>
<li><p>Level 2: 두 번째 글자가 추가되면서 각 구역이 더 작은 16개의 구역으로 세분화된다.</p>
</li>
<li><p>Level 3: 세 번째 글자가 추가되면 더 작은 구역으로 나뉘며, 점점 더 구체적인 위치를 나타내게 된다.
...
지오해시는 12단계 (level) 의 정밀도를 가지게되는데, 레벨에 따라 격자 크기를 결정하게된다.</p>
<table border=1>
  <tr>
    <th style="text-align:right">Geohash 레벨</th>
    <th style="text-align:right">Geohash 문자열 길이</th>
    <th style="text-align:right">격자 너비 (동서 방향)</th>
    <th style="text-align:right">격자 높이 (남북 방향)</th>
  </tr>
  <tr>
    <td style="text-align:right">1</td>
    <td style="text-align:right">1</td>
    <td style="text-align:right">5,000 km</td>
    <td style="text-align:right">5,000 km</td>
  </tr>
  <tr>
    <td style="text-align:right">2</td>
    <td style="text-align:right">2</td>
    <td style="text-align:right">1,250 km</td>
    <td style="text-align:right">625 km</td>
  </tr>
  <tr>
    <td style="text-align:right">3</td>
    <td style="text-align:right">3</td>
    <td style="text-align:right">156 km</td>
    <td style="text-align:right">156 km</td>
  </tr>
  <tr>
    <td style="text-align:right">4</td>
    <td style="text-align:right">4</td>
    <td style="text-align:right">39.1 km</td>
    <td style="text-align:right">19.5 km</td>
  </tr>
  <tr>
    <td style="text-align:right">5</td>
    <td style="text-align:right">5</td>
    <td style="text-align:right">4.89 km</td>
    <td style="text-align:right">4.89 km</td>
  </tr>
  <tr>
    <td style="text-align:right">6</td>
    <td style="text-align:right">6</td>
    <td style="text-align:right">1.22 km</td>
    <td style="text-align:right">0.61 km</td>
  </tr>
  <tr>
    <td style="text-align:right">7</td>
    <td style="text-align:right">7</td>
    <td style="text-align:right">153 m</td>
    <td style="text-align:right">153 m</td>
  </tr>
  <tr>
    <td style="text-align:right">8</td>
    <td style="text-align:right">8</td>
    <td style="text-align:right">38.2 m</td>
    <td style="text-align:right">19.1 m</td>
  </tr>
  <tr>
    <td style="text-align:right">9</td>
    <td style="text-align:right">9</td>
    <td style="text-align:right">4.77 m</td>
    <td style="text-align:right">4.77 m</td>
  </tr>
  <tr>
    <td style="text-align:right">10</td>
    <td style="text-align:right">10</td>
    <td style="text-align:right">1.19 m</td>
    <td style="text-align:right">0.597 m</td>
  </tr>
  <tr>
    <td style="text-align:right">11</td>
    <td style="text-align:right">11</td>
    <td style="text-align:right">149 mm</td>
    <td style="text-align:right">149 mm</td>
  </tr>
  <tr>
    <td style="text-align:right">12</td>
    <td style="text-align:right">12</td>
    <td style="text-align:right">37.2 mm</td>
    <td style="text-align:right">18.6 mm</td>
  </tr>
</table>

</li>
</ul>
<p><em>지오해시 작동원리에서 좀더 상세하게 다뤄보자</em></p>
<ol start="4">
<li>빠른 검색 성능: 특정 지역 내의 위치를 찾거나, 범위 검색을 할 때 효율적으로 사용할 수 있다. 
 ex) 인접한 지오해시 값을 사용하여 근처 지역을 쉽게 검색할 수 있다.</li>
</ol>
<h3 id="작동원리">작동원리</h3>
<ol>
<li><p>위도와 경도를 분리해 이진수로 변환</p>
<h4 id="위도와-경도는-어떻게-이진수로-변환하지">위도와 경도는 어떻게 이진수로 변환하지?</h4>
<ul>
<li>위도는 절반을 나누었을때 왼쪽이면 0 오른쪽이면 1 로 표기.</li>
<li>경도는 절반을 나누었을때 위쪽이면 1 아래쪽이면 0 로 표기.</li>
<li>순서는 위도 -&gt; 경도 순서로 번갈아 가면서 표기합니다.
<img src="https://velog.velcdn.com/images/dongeun-i/post/22a3c4c0-db40-4a62-9e57-44bc2fdb76cd/image.png" alt=""><p align="right" style="font-size:14px;">
    이미지 출처: <a href="https://itlamp.tistory.com/14">Velog[사진속의 램프]</a>
</p></li>
</ul>
</li>
<li><p>위도와 경도의 이진값을 교차 결합</p>
</li>
<li><p>결합된 이진수를 Base32로 인코딩</p>
 <table>
   <thead>
     <tr>
       <th>이진수</th>
       <th>Base32 문자</th>
     </tr>
   </thead>
   <tbody>
     <tr><td>00000</td><td>A</td></tr>
     <tr><td>00001</td><td>B</td></tr>
     <tr><td>00010</td><td>C</td></tr>
     <tr><td>00011</td><td>D</td></tr>
     <tr><td>00100</td><td>E</td></tr>
     <tr><td>00101</td><td>F</td></tr>
     <tr><td>00110</td><td>G</td></tr>
     <tr><td>00111</td><td>H</td></tr>
     <tr><td>01000</td><td>J</td></tr>
     <tr><td>01001</td><td>K</td></tr>
     <tr><td>01010</td><td>M</td></tr>
     <tr><td>01011</td><td>N</td></tr>
     <tr><td>01100</td><td>P</td></tr>
     <tr><td>01101</td><td>Q</td></tr>
     <tr><td>01110</td><td>R</td></tr>
     <tr><td>01111</td><td>S</td></tr>
     <tr><td>10000</td><td>T</td></tr>
     <tr><td>10001</td><td>V</td></tr>
     <tr><td>10010</td><td>W</td></tr>
     <tr><td>10011</td><td>X</td></tr>
     <tr><td>10100</td><td>Y</td></tr>
     <tr><td>10101</td><td>Z</td></tr>
     <tr><td>10110</td><td>2</td></tr>
     <tr><td>10111</td><td>3</td></tr>
     <tr><td>11000</td><td>4</td></tr>
     <tr><td>11001</td><td>5</td></tr>
     <tr><td>11010</td><td>6</td></tr>
     <tr><td>11011</td><td>7</td></tr>
     <tr><td>11100</td><td>8</td></tr>
     <tr><td>11101</td><td>9</td></tr>
   </tbody>
   </table>

<h4 id="서울로-위치로-예시를-들어보자">서울로 위치로 예시를 들어보자</h4>
<p> 서울의 대략적인 위치를 위도와 경도로 표기하였을때 위도: 37.5665° 경도: 126.9780°</p>
<pre><code> 위도는 -90 ~ +90 경도는 -180에서 +180 사이의 값이다. 위도값으로 범의를 좁혀 보겠다.</code></pre><p> 처음 범위는 [-90, +90]입니다. 중간값은 0으로, 서울의 위도는 0보다 크기 때문에 1을 할당하고, 범위를 <strong>[0, +90]</strong>으로 축소합니다.
 [0, 90]에서 중간값은 45입니다. 37.5665는 45보다 작으므로 0을 할당하고, 범위를 <strong>[0, 45]</strong>로 축소합니다.
 [0, 45]에서 중간값은 22.5입니다. 37.5665는 22.5보다 크므로 1을 할당하고, 범위를 <strong>[22.5, 45]</strong>로 축소합니다.
 이 과정을 반복하여 위도의 이진값을 점차 좁혀 나갑니다.
 이렇게 단계별로 위도 값을 이진수로 변환할 수 있으며, 경도도 유사한 방식으로 처리된다.</p>
<p> level6 까지 구하였을 때 위도 : <code>101101010110110</code>, 경도 <code>111001111001100</code>
 위도와 경도의 이진수의 교차결합  = <code>1110011110011001001110100110110</code>
 위도와 경도의 이진수 값을 5비트로 나눌경우 <code>11100</code>,<code>11110</code>,<code>01100</code>,<code>10011</code>,<code>01001</code>,<code>10110</code>
 wy이를 Base32로 변환 하였을때 <code>wydm9q</code></p>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/6c1233b5-343d-4ef3-bd80-246eb8bead7c/image.png" alt=""></p>
<p align="right" style="font-size:16px;">
    <a href="(https://www.movable-type.co.uk/scripts/geohash.html)">Movalbe-type.co.kr</a>
</p>



<h3 id="마치며">마치며</h3>
<blockquote>
<p>다시 한번 정리를 해보면서 어떻게 해시값을 구하고 세분화 하는지 정리해보는 시간을 가질 수 있었고, 지오해시관련 라이브러리를 사용해보거나 직접 한번 코드로 구현해보는 시간도 가져보면 좋겠다는 생각도 들었다.
또 시간을 내서 <strong>균등격자방식</strong>이나 <strong>쿼드트리</strong> 등 다른 위치를 식별하는 방법에 대해 다뤄볼 생각이다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 클래스에 대한 정리]]></title>
            <link>https://velog.io/@dongeun-i/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dongeun-i/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sat, 10 Feb 2024 08:02:13 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>react 16.8이 나오기 전까지는 컴포넌트가 클래스로 작성이 되어 있다고 한다.
현재는 함수형태의 컴포너트를 작성하고있고, 종종 클래스형태로 작성된 컴포넌트들을 마주치는 경험도 있다. 이번 시간에는 자바스크립트의 클래스가 어떤식으로 동작하고 있는지 정리를 해보려고한다.</p>
</blockquote>
<h3 id="클래스class란">클래스(Class)란?</h3>
<p>자바스크립트의 클래스란? 특정한 객체를 만들기 위한 일종의 템플릿과 같은 개념으로 볼 수 있다.
즉, 특정한 형태의 객체를 반복적으로 만들어내기 위해 사용하는 틀이라고 생각해 볼수 있다.</p>
<pre><code class="language-javascript">//클래스 객체의 선언 ex) Person 이라는 클래스를 선언     
class Person {
  //`constructor`는 생성자다. 최초에 생성할 때 어떤 인수를 받을지 결정이가능하고 객체를 초기화하는 용도로 사용
  constructor(name) {
    this.name = name;
  }


  // 객체에서 메서드를 정의할 때 사용하던 문법을 그대로 사용하면, 메소드가 자동으로 `Person.prototype`에 저장됩니다.
  introduce() {
    return `안녕하세요, 제 이름은 ${this.name}입니다.`;
  }
}
// 정적메서드
static hello{
    console.log(&#39;안녕하세요.&#39;);
}
// setter 
set age(value){
    this.age = value;
}

// getter
get age(){
    return this.age;
}
// 클래스를 활용하여 Person 객체 생성
const dongeun = new Person(&#39;dongeun&#39;);

//메서드 호출
dongeun.introduce(); // 안녕하세요, 제 이름은 dongeun 입니다.

// 정적 메서드는 클래스에서 직접호출한다.
Person.hello(); // 안녕하세요.

// 정적 메서드는 클래스로 만든 객체에서는 호출할 수 없다.
dongeun.hello(); //Uncaught TypeError: dongeun.hello is not a function

// setter를 통해 값을 할당할 수 있다.
dongeun.age = 28;

// getter를 통해 값을 가져올 수 있다.
console.log(dongeun.age); // 28</code></pre>
<hr>
<h3 id="constructor란">constructor란?</h3>
<p> constructor는 생성자로 , 객체를 생성하는데 사용되는 메서드이며, 여러개가 존재할수 없고 별다르게 수행할 작업이 없다면 생략도 가능하다.</p>
<pre><code class="language-javascript">// X
class Person {
  constructor(name) {
    this.name = name;
  }
  // SyntaxError: A class may only have one constructor
  constructor(name) {
    this.name = name;
  }
}

// O
class Person {
}</code></pre>
<hr>
<h3 id="프로퍼티property란">프로퍼티(property)란?</h3>
<p>property란 클래스로 인스턴스를 생성할 때 내부에 정의할 수 있는 속성값으로 일반적으로 내부 변수와 그 변수에 접근하는 메소드(getter 및 setter)로 구성되며, 이를 통해 외부에서 해당 프로퍼티에 접근할 때 특정 로직을 실행하거나 값을 검증할 수 있다. </p>
<h4 id="getter">getter</h4>
<p>클래스에서 무언가 값을 가져올때 사용되고, 사용하기 위해서 get이라는 키워드를 앞에 붙여야하고, 뒤이어서 getter의 이름을 선언한다.</p>
<h4 id="setter">setter</h4>
<p>클래스 필드에 값을 할당할때 사용한다. set 이라는 키워드를 선언하고, 그 뒤에 이름을 붙인다.</p>
<pre><code class="language-javascript">class Person {
    constructor(name, age) {
        // 프로퍼티 정의
        this._name = name; // private 프로퍼티 (관례적으로 _를 사용)
        this._age = age; // private 프로퍼티
    }

    // Getter와 Setter 메소드
    get name() {
        return this._name;
    }

    set name(newName) {
        this._name = newName;
    }

    get age() {
        return this._age;
    }

    set age(newAge) {
        if (newAge &gt; 0) { // 나이는 음수가 될 수 없도록 설정
            this._age = newAge;
        } else {
            console.log(&quot;나이는 음수가 될 수 없습니다.&quot;);
        }
    }
}

// 예시 사용
const dongeun = new Person(&#39;dongeun&#39;, 28);
console.log(dongeun.name); // 출력: dongeun
console.log(dongeun.age); // 출력: 28

dongeun.age = -5; // 음수 나이를 설정하려고 하면 에러 메시지 출력
console.log(dongeun.age); // 출력: 28 (변경되지 않음)

dongeun.age = 35; // 올바른 나이를 설정
console.log(dongeun.age); // 출력: 35</code></pre>
<p>처음에 예시로 작성했던 코드와 비교를 해보았을때 name 프로퍼티를 선언할때 _name으로 선언한것을 볼 수 있다. 
<code>_name</code>과 같은 네이밍 컨벤션은 자바스크립트에서 private 프로퍼티를 나타내는데 일반적으로 사용되는 관례하고 한다고 한다. 이는 명시적으로 private 프로퍼티를 지원하는 것이 아니라, 개발자들 사이에 널리 사용되는 약속이며, 주로 다른 개발자들이 private 프로퍼티임을 파악할 수 있도록 돕기 위한 목적으로 사용된다.</p>
<h3 id="상속extends">상속(extends)</h3>
<p>상속은 기존의 클래스를 상속받아서 자식 클래스에서 부모클래스를 상속 받는 개념이다.
React에서 클래스형 컴포넌트를 만들기위해서 extends React.component 나 extends React.PuerComponent 를 선언한 것을 예시로 들 수 있다.</p>
<pre><code class="language-javascript">class Person {
    constructor(name, age) {
        this._name = name;
        this._age = age;
    }

    get name() {
        return this._name;
    }

    set name(newName) {
        this._name = newName;
    }

    get age() {
        return this._age;
    }

    set age(newAge) {
        if (newAge &gt; 0) {
            this._age = newAge;
        } else {
            console.log(&quot;나이는 음수가 될 수 없습니다.&quot;);
        }
    }
}

class Employee extends Person {
    constructor(name, age, position, salary) {
        super(name, age); // 부모 클래스의 생성자 호출
        this._position = position;
        this._salary = salary;
    }

    get position() {
        return this._position;
    }

    set position(newPosition) {
        this._position = newPosition;
    }

    get salary() {
        return this._salary;
    }

    set salary(newSalary) {
        this._salary = newSalary;
    }
}

// 예시 사용
const employee1 = new Employee(&#39;dongeun&#39;, 28, &#39;Front-end Engineer&#39;, 60000);
console.log(employee1.name); // 출력: dongeun
console.log(employee1.age); // 출력: 28
console.log(employee1.position); // 출력: Front-end Engineer
console.log(employee1.salary); // 출력: 60000

</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트의 데이터 타입 및 동등 비교]]></title>
            <link>https://velog.io/@dongeun-i/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EB%B0%8F-%EB%8F%99%EB%93%B1-%EB%B9%84%EA%B5%90</link>
            <guid>https://velog.io/@dongeun-i/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%83%80%EC%9E%85-%EB%B0%8F-%EB%8F%99%EB%93%B1-%EB%B9%84%EA%B5%90</guid>
            <pubDate>Sun, 10 Dec 2023 09:05:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>리액트의 가상 DOM 과 실제 DOM 의 비교, 리액트 컴포넌트가 렌더링을할지를 판단하는 방법, 변수나 함수의 메모제이션 등 모든 작업은 작업은 자바스크립트의 동등 비교를 기반으로 하게되는데 자바스크립트의 데이터 타입은 어떤것이 있고 동등비교란 무엇인지 정리해보자</p>
</blockquote>
<hr>
<h3 id="자바스크립트의-데이터-타입">자바스크립트의 데이터 타입</h3>
<ul>
<li><p>원시타입(Primitive)
JavaScript에서, 원시 값(primitive, 또는 원시 자료형)이란 객체가 아니면서 메서드 또는 속성도 가지지 않는 데이터라고 정의를 한다.
<a href="https://developer.mozilla.org/ko/docs/Web/JavaScript/Equality_comparisons_and_sameness">출처:Mdn web doc</a>
간단하게 자크립트에서의 원시타입이란 객체가 아닌 다른 모든 타입을 의미한다라고 생각을 하면 되겠다.</p>
<ol>
<li><p><code>boolean</code>
참(true)과 거짓(false)만을 가질 수 있는 데이터 타입
주로 조건문에서 많이 쓰이는 데이터 타입이다.
boolan형의 값 외에도 조건문에서 true,false 처럼 취급되는 trthy,falsy값이 존재한다.</p>
<h4 id="falsey-값정리">falsey 값정리</h4>
<p>조건문 내부에서 <code>false</code> 취급되는 값.</p>
<table>
<thead>
<tr>
<th>값</th>
<th>타입</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>false</td>
<td>Boolean</td>
<td><code>false</code>는 대표적인 falsly 값이다</td>
</tr>
<tr>
<td>0,-0,0n,0x0n</td>
<td>Number,BigInt</td>
<td>0은 부호나 소수점 유무에 상관없이 falsy 한 값이다.</td>
</tr>
<tr>
<td>NaN</td>
<td>Number</td>
<td>Number가 아니라는 것을 뜻하는 NaN(Not a Number)</td>
</tr>
<tr>
<td>&#39;&#39;,&quot;&quot;,``</td>
<td>String</td>
<td>공백이 없는 빈 문자일때</td>
</tr>
<tr>
<td>null</td>
<td>null</td>
<td>-</td>
</tr>
<tr>
<td>undefined</td>
<td>undefined</td>
<td>-</td>
</tr>
</tbody></table>
<h4 id="trthy">trthy</h4>
<p>조건문 내부에서 <code>true</code>로 취급되는 값. falsy로 취급되는 값외에는 모두<code>true</code>로 취급
객체와 배열은 내부에 값이 존재하는지 여부와 상관없이 trthy로 취급된다.</p>
</li>
</ol>
</li>
</ul>
<ol start="2">
<li><p><code>null</code>
아직 값이 없거나 비어있는 값을 표현할때 사용
<code>null</code>는 <code>null</code>라는 값만 가질수있다.
<code>null</code>은 다른 원시값들이랑 다르게 <code>typeof</code>로 <code>null</code>을 확인 했을때 해당 타입이 <code>object</code>라는 결과가 반환된다.</p>
<pre><code class="language-javascript">typeof null === &#39;object&#39; // true 가 출력된다.</code></pre>
</li>
<li><p><code>undefined</code>
 선언후 값을 할당하지 않은 변수 또는 값이 주어지지 않은 인수에 자동으로 할당된값
<code>undefined</code>는 <code>undefined</code>라는 값만 가질수있다.</p>
<pre><code class="language-javascript">let test;
type of test === &#39;undefiend&#39; // true
function add_hello(hello){
   return hello
}
type of add_hello() === &#39;undefiend&#39; // true</code></pre>
</li>
<li><p><code>number</code>
 -(2<sup>53</sup> -1)$ 과 2<sup>53</sup>-1 사이의 값을 저장 할 수 있다.</p>
</li>
<li><p><code>string</code>
 텍스트 타입의 데이터를 저장하기 위해 사용되며, 작은따옴표(&#39;) 큰따옴표(&quot;) 또는 백틱(`)    으로 감싸 표현한다.
백틱으로 표현하는 문자열은 템플릿 리터널(template literal)이라고 하는데, 같은 문자열을 반환하지만 줄바꿈이 가능하고, 문자열 내부에 표현식을 쓸 수 있다.
자바스크립트 string은 문자열이 원시타입이며, 변경이 불가능하다.(한번 문자열이 생성되면 그문자열을 변경할수 없음을 의미)</p>
<pre><code class="language-javascript">//&#39;\n안녕하세요.\n&#39;
const literaltext = `
안녕하세요.
`;
// Uncaught SyntaxError: Invalid or unexpected token
const text = &quot;
안녕하세요
&quot;;
const text2 = &quot;hello&quot;;
console.log(text2[0]) // &#39;h&#39;
text2[0] = &#39;t&#39;;
console.log(text2) //hello가 출력</code></pre>
</li>
<li><p><code>symbol</code>
 ES6에서 새롭게 추가된 7번째 타입으로, 중복되지 않는 어떠한 고유값을 나타내기 위해 만들어졌다.</p>
<pre><code class="language-javascript">//Symbol() 함수를 사용해서 만들어진다.
const key = Symbol(&#39;key&#39;);
const key2 = Symbol(&#39;key&#39;);

key===key2 // false

//동일한 값을 사용하기 위해서는 for 함수를 사용한다
Symbol.for(&#39;test&#39;) === Symbol.for(&#39;test&#39;) // true</code></pre>
</li>
<li><p><code>bigint</code>
 <code>number</code>가 다룰 수 있는 숫자 크기의 제한을 극복하기 위해 ES2020에서 새롭게 나온것으로,2<sup>53</sup>-1 를넘어서 더 큰숫자를 저장할 수 있게 해준다.</p>
<pre><code class="language-javascript">9007199254740992 === 9007199254740993 // 더이상 다룰 수 없는 크기이기 때문에 true로 출력
const bigInt1 = 9007199254740995n // 끝에 n을 붙이거나
const bigInt2 = BigInt(9007199254740995) // 끝에 BigInt함수를 사용</code></pre>
</li>
</ol>
<ul>
<li>객체타입(object/reference type)<h4 id="객체타입이란">객체타입이란</h4>
<ul>
<li>일반적으로 컴퓨터 과학에서 객체는 식별자로 참조할 수 있는 메모리 상의 값을 말한다.</li>
<li>객체는 데이터와 그 데이터 관련한 동작을 모두 포함하는 개념적 존재<h4 id="javascript에서-객체타입"><code>javascript</code>에서 객체타입</h4>
원시타입 7가지 이외의 배열, 함수, 정규 표현식 등
객체타입(object type)은 참조를 전달한다고 해서 참조타입(reference type)이라고도 불린다.</li>
</ul>
</li>
</ul>
<hr>
<h4 id="동등비교">동등비교</h4>
<blockquote>
<p>객체 타입의 동등 비교는 언어에 따라 다르지만, 여러 언어에서는 주로 두 가지 개념으로 나눌 수 있습니다: 참조 동등성(Reference Equality)과 값 동등성(Value Equality) 이다</p>
</blockquote>
<ul>
<li><p>참조 동등성</p>
<ul>
<li>참조 동등성은 객체가 동일한 메모리 위치를 참조하는지 여부에 기반한다.</li>
<li>두 변수나 객체가 동일한 인스턴스를 가리키는 경우에 참이 된다.</li>
<li>주로 언어에서는 이를 확인하기 위해 == 또는 === 연산자를 사용한다.</li>
</ul>
<pre><code class="language-javascript">const obj1 = { key: &#39;value&#39; };
 const obj2 = { key: &#39;value&#39; };

 const obj3 = obj1;

 console.log(obj1 === obj2);  // false (참조가 다름)
 console.log(obj1 === obj3);  // true (참조가 동일)</code></pre>
</li>
<li><p>값 동용성(Value Equality)</p>
<ul>
<li>값 동등성은 객체가 동일한 값 또는 내용을 가지는지 여부에 기반한다.</li>
<li>두 객체의 내용이 동일하면 두 객체는 값 동등하다고 간주된다.</li>
<li>객체의 내용을 비교하기 위해서는 객체의 속성을 하나씩 비교하거나, 언어에 따라 제공되는 특별한 메서드를 사용할 수 있다.<pre><code class="language-javascript">const obj1 = { key: &#39;value&#39; };
const obj2 = { key: &#39;value&#39; };
console.log(Object.is(obj1, obj2));  // false (값 동등성 비교)
console.log(JSON.stringify(obj1) === JSON.stringify(obj2));  // true (값 동등성 비교)</code></pre>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>자료 참고
[자바스크립트 원시타입과 객체 타입] (<a href="https://velog.io/@forlecture1013/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9B%90%EC%8B%9C%ED%83%80%EC%9E%85%EA%B3%BC-%EA%B0%9D%EC%B2%B4-%ED%83%80%EC%9E%85">https://velog.io/@forlecture1013/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EC%9B%90%EC%8B%9C%ED%83%80%EC%9E%85%EA%B3%BC-%EA%B0%9D%EC%B2%B4-%ED%83%80%EC%9E%85</a>)
모던 리액트 Deep Dive</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[package.json / package-lock.json 알고 사용하자 !]]></title>
            <link>https://velog.io/@dongeun-i/package.json-package-lock.json-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90</link>
            <guid>https://velog.io/@dongeun-i/package.json-package-lock.json-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EC%9E%90</guid>
            <pubDate>Mon, 27 Nov 2023 12:45:38 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>개발자인 친구랑 이야기를 하다가 npm , yarn을 이용하여 패키지를 설치할때 생성되는 <code>package.json</code> , <code>package-lock.json</code> 파일에 대해 질문을 듣고 이참에 정리하고 알아보는 시간을 가져보려고 합니다.</p>
</blockquote>
<h3 id="package-manager란-">Package Manager란 ?</h3>
<ul>
<li><p>패키지 매니저는 소프트웨어 <strong>개발 프로젝트에서 필요한 패키지(라이브러리, 모듈 등)를 관리하고 설치하는 도구</strong>를 말합니다.</p>
</li>
<li><p>대표적인 패키지 매니저로는 Node.js의 npm(Node Package Manager), Python의 pip, Ruby의 RubyGems 등이 있고 해당 포스팅에서는 Node.js 기준으로 작성을 해보려고합니다.</p>
</li>
</ul>
<hr>
<h3 id="packagejson-이란-무엇일까">Package.json 이란 무엇일까?</h3>
<p><img src="https://velog.velcdn.com/images/dongeun-i/post/05171553-3d7b-425e-9bac-8623146c6458/image.png" alt="">
<a href="https://docs.npmjs.com/cli/v7/configuring-npm/package-json#description">출처: npm doc</a>
npm doc 에서 설명하고 있는 <code>package.json</code>문서의 한부분이다. 위의 영문을 번역하면..</p>
<p>패키지에 package.json 파일을 추가하여 다른 사용자가 쉽게 관리하고 설치할 수 있도록 할 수 있습니다. 레지스트리에 발행된 패키지는 반드시 package.json 파일을 포함해야 합니다.</p>
<p>package.json 파일은 다음을 수행합니다.</p>
<ul>
<li>프로젝트가 의존하는 패키지 목록을 나열합니다.</li>
<li>시맨틱 버전 규칙을 사용하여 프로젝트가 사용할 수 있는 패키지 버전을 지정합니다.</li>
<li>빌드를 재현 가능하게 하여, 다른 개발자들과 쉽게 공유할 수 있습니다.</li>
</ul>
<blockquote>
<p>참고: 패키지를 npm 웹사이트에서 쉽게 찾을 수 있게 만들기 위해, package.json 파일에 사용자 정의 설명을 포함하는 것을 권장합니다.</p>
</blockquote>
<p>GPT를 이용하여서 package.json 에 대하여 설명을 해달라고 했을때 아래와 같이 답변한 것도 같이 참고해보았다.</p>
<ul>
<li>package.json 파일은 프로젝트의 메타데이터 및 종속성(dependency) 정보를 담고 있는 파일입니다.</li>
<li>프로젝트 정보(프로젝트명, 버전, 설명 등)와 함께 필요한 패키지의 목록과 버전 정보가 기록됩니다.</li>
<li>이 파일을 통해 프로젝트의 종속성을 다른 개발자와 공유하고, 프로젝트를 배포하거나 다시 설치할 때 사용됩니다.</li>
</ul>
<p><strong>즉, npm에서 오픈소스(패키지)를 설치하기 위해 사용하거나, 프로젝트의 의존성 관리를 하거나,배포를 위한 파일이구나라는 결론을 지어보았다.</strong></p>
<hr>
<h3 id="packagejson-구성요소-및-구조">package.json 구성요소 및 구조</h3>
<pre><code class="language-bash">npm init -y</code></pre>
<p>을 통해 package.json을 생성할 수 있다.</p>
<pre><code class="language-json">{
  &quot;name&quot;: &quot;my-project&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;description&quot;: &quot;My project description&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node index.js&quot;,
    &quot;test&quot;: &quot;mocha&quot;
  }
   &quot;dependencies&quot;: {
    &quot;express&quot;: &quot;^4.17.1&quot;,
    &quot;lodash&quot;: &quot;^4.17.21&quot;
  },
  &quot;devDependencies&quot;: {
    &quot;eslint&quot;: &quot;^7.32.0&quot;,
    &quot;mocha&quot;: &quot;^9.0.0&quot;
  }
  &quot;keywords&quot;: [],
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;MIT&quot;,
  &quot;repository&quot;: {
    &quot;type&quot;: &quot;git&quot;,
    &quot;url&quot;: &quot;https://github.com/username/my-project.git&quot;
  }
}
</code></pre>
<p><code>package.json</code> 파일은 Node.js 프로젝트의 루트 디렉토리에 위치하며, 프로젝트의 구성과 의존성을 기술하는 JSON 형식의 파일이다.</p>
<p><code>name</code></p>
<ul>
<li>프로젝트의 이름을 나타내며, 필수 항목이다.</li>
<li>다른 패키지와 구별되도록 유일해야 합니다.</li>
</ul>
<p><code>version</code></p>
<ul>
<li>프로젝트의 현재 버전을 나타내며, 필수항목이다.</li>
<li>버전의 경우 <code>semantic versioning guidelines</code>를 따르며, x.x.x의 형태로 작성해야한다.</li>
</ul>
<p><code>description</code> </p>
<ul>
<li>프로젝트에 대한 설명</li>
</ul>
<p><code>main</code></p>
<ul>
<li>프로젝트의 진입점(main entry point)을 지정한다.</li>
</ul>
<p><code>scripts</code></p>
<ul>
<li>프로젝트에서 사용할 수 있는 스크립트 명령어를 정의</li>
</ul>
<p>다른 개발자분의 블로그를 참고하여, 예시를 가져와 보았다.</p>
<pre><code>facebook/create-react-app/package.json
</code></pre><pre><code class="language-json">{
  &quot;scripts&quot;: {
    &quot;build&quot;: &quot;cd packages/react-scripts &amp;&amp; node bin/react-scripts.js build&quot;,
    &quot;changelog&quot;: &quot;lerna-changelog&quot;,
    &quot;create-react-app&quot;: &quot;node tasks/cra.js&quot;,
    &quot;e2e&quot;: &quot;tasks/e2e-simple.sh&quot;,
    &quot;e2e:docker&quot;: &quot;tasks/local-test.sh&quot;,
    &quot;postinstall&quot;: &quot;npm run build:prod -w react-error-overlay&quot;,
    &quot;publish&quot;: &quot;tasks/publish.sh&quot;,
    &quot;start&quot;: &quot;cd packages/react-scripts &amp;&amp; node bin/react-scripts.js start&quot;
    // ...
  }
}</code></pre>
<p>value로 일련의 command(명령어)를 정의해 두고 key로 지정한 alias를 이용해 간편하게 호출 할 수 있다.</p>
<pre><code>ex) npm start , npm create-react-app ..</code></pre><p><a href="https://hoya-kim.github.io/2021/09/14/package-json/#package-json">출처:알고쓰자 package.json</a></p>
<p><code>dependencies</code>및 <code>evDependencies</code></p>
<ul>
<li>프로젝트가 의존하는 패키지와 그 버전을 나타냅니다</li>
<li>dependencies: 프로젝트가 실행될 때 필요한 핵심 의존성</li>
<li>devDependencies: 개발 중에만 필요한 의존성</li>
</ul>
<blockquote>
<p>버전을 작성할때는 Semantic Versioning (SemVer)규칙에 기반하여 작성한다.
_ Semantic Versioning (SemVer) 은 나중에 정리를 해보려고 한다.._</p>
</blockquote>
<p><code>license</code></p>
<ul>
<li>프로젝트에 적용된 라이선스를 나타낸다</li>
</ul>
<p><code>repository</code></p>
<ul>
<li>프로젝트의 소스 코드 저장소를 지정한다</li>
</ul>
<h4 id="packagejson-작성규칙">package.json 작성규칙</h4>
<ul>
<li>must be lowercase, 소문자로 작성되어야 한다.</li>
<li>must be one word, 한 단어로 작성되어야 한다.</li>
<li>may contain hyphens and underscore, -(하이픈)이나 _(언더스코어)를 포함할 수 있다.</li>
</ul>
<hr>
<h3 id="package-lockjson-이란-무엇일까">Package-lock.json 이란 무엇일까?</h3>
<ul>
<li><code>package-lock.json</code> 파일은 npm 버전 5부터 사용되기 시작한 파일로, 의존성 트리를 정확하게 기록합니다.</li>
<li><code>package-lock.json</code> 파일은 패키지 매니저가 패키지를 설치할 때, 각 패키지의 정확한 버전과 의존성을 고정시켜주는 역할을 합니다.</li>
<li>다른 환경이나 다른 개발자가 동일한 패키지를 설치할 때, <code>package-lock.json</code> 파일이 있다면 정확한 의존성 버전을 사용하여 설치하게 됩니다.</li>
</ul>
<p>자료를 찾아서 정리를 해보니 위와 같았지만 크게 와닿진 않았다..
자료를 찾던 중 예시를 통해 설명해주는 글을 보았다.</p>
<ul>
<li><a href="https://hyunjun19.github.io/2018/03/23/package-lock-why-need/">https://hyunjun19.github.io/2018/03/23/package-lock-why-need/</a></li>
</ul>
<p><em>예시와 함께보니 나도 비슷하게 개발중인 프로젝트에서 package를 추가하고, package.json 만 커밋했던 기억이났었는데 이제야 이유를 알았다는 것이 놀라웠다....</em></p>
<h3 id="package-lockjson-구성요소-및-구조">package-lock.json 구성요소 및 구조</h3>
<p><code>package-lock.json</code>은 <code>npm install</code> 명령어를 사용하여 패키지를 설치할때 생성된다.</p>
<pre><code>{
  &quot;name&quot;: &quot;my-project&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;lockfileVersion&quot;: 1,
  &quot;dependencies&quot;: {
    &quot;express&quot;: {
      &quot;version&quot;: &quot;4.17.1&quot;,
      &quot;resolved&quot;: &quot;https://registry.npmjs.org/express/-/express-4.17.1.tgz&quot;,
      &quot;integrity&quot;: &quot;sha512-...&quot;,
      &quot;dev&quot;: true,
      &quot;dependencies&quot;: {
        // Express 패키지의 의존성 정보
      }
    },
    &quot;lodash&quot;: {
      &quot;version&quot;: &quot;4.17.21&quot;,
      &quot;resolved&quot;: &quot;https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz&quot;,
      &quot;integrity&quot;: &quot;sha512-...&quot;,
      &quot;dev&quot;: true
    },
    // 다른 패키지들의 의존성 정보
  }
}</code></pre><p><code>lockfileVersion</code></p>
<ul>
<li><code>package-lock.json</code> 파일의 버전을 나타냅니다. 현재는 1이 가장 일반적으로 사용되고 있다</li>
</ul>
<p><code>requires</code></p>
<ul>
<li>현재 <code>package-lock.json</code> 파일이 생성된 npm 버전을 나타냅니다.</li>
</ul>
<p><code>dependencies</code></p>
<ul>
<li>프로젝트에 설치된 각 패키지의 정보가 여기에 포함된다.<pre><code>&quot;dependencies&quot;: {
&quot;express&quot;: {
  &quot;version&quot;: &quot;4.17.1&quot;,
  &quot;resolved&quot;: &quot;https://registry.npmjs.org/express/-/express-4.17.1.tgz&quot;,
  &quot;integrity&quot;: &quot;sha512-...&quot;,
  &quot;dev&quot;: true,
  &quot;dependencies&quot;: {
    // Express 패키지의 의존성 정보
  }
},
&quot;lodash&quot;: {
  &quot;version&quot;: &quot;4.17.21&quot;,
  &quot;resolved&quot;: &quot;https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz&quot;,
  &quot;integrity&quot;: &quot;sha512-...&quot;,
  &quot;dev&quot;: true
},
}</code></pre></li>
<li><code>version</code>: 패키지의 정확한 버전을 나타냅니다.</li>
<li><code>resolved</code>: 패키지가 실제로 위치한 경로 또는 URL입니다.</li>
<li><code>integrity</code>: 패키지의 무결성 체크를 위한 해시값입니다.</li>
<li><code>dev</code>: 패키지가 <code>dependencies</code> 또는 <code>devDependencies</code>에 속하는지 여부를 나타냅니다.</li>
<li><code>dependencies</code>: 패키지의 의존성 정보가 있을 경우, 해당 의존성 정보도 포함됩니다.</li>
</ul>
<blockquote>
<p>** 결론: <code>package.json</code>은 패키지 설치, 배포, 의존성 등에 대한 정보를 가지고 있으며, <code>package-lock.json</code>은 패키지의 정확한 버전과  의존성 트리를 정확하게 기록한 파일이다 !**</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[React] 왜 리액트인가 ?]]></title>
            <link>https://velog.io/@dongeun-i/React-%EC%99%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@dongeun-i/React-%EC%99%9C-%EB%A6%AC%EC%95%A1%ED%8A%B8%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Sun, 26 Nov 2023 08:26:00 GMT</pubDate>
            <description><![CDATA[<h3 id="목표">목표</h3>
<blockquote>
<p>react를 사용하여 개발하면서 react 말고도 vue,angular 등 여러 Front-end 프레임워크들이 있음에도 불구하고 &#39;react가 떠오르는 이유가 무엇일까?&#39;라는 생각을 가지고 모던리액트 deep dive 책을 읽고 정리를 해보는 시간을 가져보려고 한다.</p>
</blockquote>
<h3 id="왜-리액트인가-">왜 리액트인가 ?</h3>
<p>2011년 페이스북의 뉴스티드 페이지에서 처음선보인 react는 출시된지 10년이 넘은 라이브러이다.Front-end 채용시장만 보더라도 리액트의 대한 개발 경험을 요구하고 있는 곳도 많이 보이는것만봐도 Front-end 개발자에게 필수적인 기술로 자리잡은 것으로 판단할 수 있다.</p>
<p>아래의 그림은 스텍오버플로우에서 설문 조사 &#39;지난 한 해 동안 광범위한 개발 작업을 수행한 웹 프레임워크 및 웹 기술은 무엇 이며, 내년에는 어떤 작업을 수행하고 싶습니까?&#39; 에 대한 응답을 정리한것이다. 
<img src="https://velog.velcdn.com/images/dongeun-i/post/d83fccf4-82ef-4944-ac8d-54386b16deca/image.png" alt=""></p>
<p><a href="https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web-frameworks-and-technologies">출처:스텍오버플로우 설문조사</a></p>
<p>왜 리액트가 개발자들이 선호하는 라이브러리가 될수 있었을까? </p>
<ul>
<li><strong>명시적인상태변화 : 리액트는 단방향 바인딩만 지원한다.</strong></li>
</ul>
<p><strong><code>단방향 바인딩</code>이란 데이터의 흐름이 한쪽으로만 간다는것이다.</strong> 이와 반대되는 내용은 Angular의 <strong>양뱡향 바인딩</strong>이다. <strong><code>양방향 바인딩</code>의 경우 뷰의 변화가 컴포넌트에 영향을 미칠수도,반대로 컴포넌트의 상태가 변경되면 뷰의 상태도 변화할 수 있는 편리함이 있지만, 상태변화가 무엇으로 인해 일어났는지 파악하기 어려워진다.</strong> 코드의 규모가 커질수록 이 같은 상태의 변화가 무엇으로 일어났는지 파악하기 힘들어지기 때문에 <strong><code>단방향 바인딩</code>의 경우 간단함과 유연함을 제공해주게 된다.</strong></p>
<pre><code class="language-javascript">//angular의 상태변화 예제.
import {Component} from &quot;@angular/core&quot;
@Component({
    selector:&#39;app-root&#39;,
      template:`&lt;input type =&quot;text&quot; [ngModel]=&quot;name&quot;&gt;`,
})
export class Appcomponent {
    name=&#39;&#39;
}
// name이 변경된 이유를 파악하려면 template나 class 내부에서 name을 변경하는 곳을 찾아야된다.</code></pre>
<pre><code class="language-javascript">//react의 상태변화 예제.
function App(){
    const [name,setName] = useState(&#39;&#39;);

      function onChange(e){
         setName(e.target.value);
    }
  return &lt;input type=&quot;text&quot; value={name}/&gt;
}
// name이 변경된 이유를 파악하려면 &#39;setName&#39;을 호출하는 곳을 찾으면된다.</code></pre>
<ul>
<li><strong>JSX(JavaScript XML)</strong>
<code>angular</code>는 view를 표현하기 위해 문자열 템플릿(string template)를 사용하고, angular 디렉티브라고 해서 ngif처럼 angular의 전용문법을 익혀야 했다. react의 경우 기존의 자바스크립트 문법에서 HTML을 약간 가미한 수준이고 자바스크립트 문법을{}으로 감싸야된다.와 같은 고유의 몇가지 특징만 이해한다면 손쉽게 JSX를 구현할 수 있다.<pre><code class="language-javascript">//자바스크립트 문법을 {} 감싸야된다는 것의 예시코드.
{content? &lt;div&gt;content text &lt;/div&gt; : null }
</code></pre>
</li>
</ul>
<pre><code>
- **비교적 배우기 쉽고 간결하다.**
- **강력한 커뮤니티**
---

### 리액트등장과 역사
- **2010년대 Front-end 개발 환경을 향한 페이스북의 도전**
페이스북의 타임라인에서는 자신의 상태를 업로드할 수 있고, 여기에 다른 사람들의 댓글이 추가되는 것을 실시간으로 확인할 수 있다. 만약 이러한 작업이 모두 서버에서 렌더링 된다고하면 매번 새로운 페이지를 보여주기 위해 서버에서 렌더링하고,다시 로딩되는 과정을 반복하게 될 것이고,사용자는 매번 깜빡이거나 느리게 작동하는 것처럼 보일것이다. 이러한 문제를 해결하기 위해 페이스북은 **어떤 데이터가 변할 때마다 어떤 변화를 주는 것이 아니라 기존 뷰를 날려 버리고 처음부터 새로 렌더링하는 방식을 고안했다.** 
시간이 흘러 JSConf US 2013에서 공개된 리액트에 대한 반응은 그다지 좋지 못했다.대부분의 개발자들은 JSX구문의 특징과 자바스크립트 코드 내에 HTML을 추가한다는 것을 그다지 좋아하지 않았다고 한다. HTML과 JS는 항상 다른 파일에 존해했고,이를 컴퓨터 공학에서 말하는 `관심사 분리 원칙`을 지키기 위한 기초적인 사실로 받아 들여졌기 때문에 HTML과 JS가 같이 존재하는 JSX는 말도 안되는 것으로 비쳤다.

---

### 최초 버전의 리액트에서 컴포넌트를 렌더링 하는 방식
```javascript
var TextBoxList = React.createClass({
    getInitialState: function(){
        return {count:1}
    },
      add : function(){
        this.setState({count:this.state.count +!})
    },
    render : function(){
        var items=[];
        for(var i=0; i&lt;this.state.count; i++){
            items.push(
                &lt;li key={i}&gt;
                      &lt;input type=&#39;text&#39;/&gt;
                &lt;li&gt;
            )
        }
      return (
          &lt;ul&gt;
            {items}
            &lt;input type=&quot;button&quot; value =&#39;add an item&#39; onClick={this.add}/&gt;
        &lt;/ul&gt;
      )
    }, 
})
ReactDOM.render(
    &lt;div&gt;
          &lt;TextBoxList/&gt;
      &lt;/div&gt;,
      ...
)</code></pre><p>위의 예제 코드에서 배열(items)에 새로운 텍스트를 추가하게 되면,리액트는 전체 배열을 새로 렌더링 하지만 기존의 Input 내용에 있던 것은 그대로 유지된다.기존의 모든 DOM요소를 초기화하지 않고, 새로운 text를 추가하는 방식으로 작동하였다.</p>
<h3 id="현재2023">현재(2023)</h3>
<p>2013년도 5월에 최초 공개된 리액트의 버전은 0.3.0 이고, 현재 글을 작성하고 있는 2023년 11월 기준 최신버전은 18.2.0 이다. <a href="https://github.com/facebook/react/releases">facebook/react github</a> 의 releases를 보다보면 0.14.7이후로 버전이 껑충 뛰어 15.0.0 으로 넘어갔다는 것이 궁금하기도 하고 인상깊었다.</p>
<p>리액트와 함께 사용할 수 있는 다양한 라이브러리는 예시는 아래와 같이 정리해 보았다</p>
<ul>
<li>상태관리 : Redux , Zustand, Recoil 등 </li>
<li>서버 사이드 렌더링 : Next.js,Remix, Hydrogen 등</li>
<li>폼 : React Hook Form, Formik, React Final Form 등</li>
</ul>
<h2 id="마치며">마치며</h2>
<blockquote>
<p>모던리액트 책을 한번 읽고 정리하는 한다 생각하고 글을 적으며 정리를 해보았다. 다시 적어보면서 페이스북 깃허브에 들어가서 내용을 참고하고, 스텍오버플로우 설문 조사를 직접 찾아보면서 다시 한번 리액트가 정말 인정받고 있구나 싶었다. 또 요즘 많이 사용한다는 Next.js를 공부해서 하루 빨리 프로젝트를 개발해보고 싶다는 생각이 들었다 ! 또 앞으로도 책을 읽어보고 내용을 정리하는 시간을 가져볼수 있도록 해야겠다.</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[마크다운 문법정리]]></title>
            <link>https://velog.io/@dongeun-i/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EB%AC%B8%EB%B2%95%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@dongeun-i/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EB%AC%B8%EB%B2%95%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Sun, 26 Nov 2023 06:21:44 GMT</pubDate>
            <description><![CDATA[<h2 id="마크다운이란">마크다운이란?</h2>
<blockquote>
<p> 마크다운(Markdown)은 텍스트 기반의 마크업언어로 2004년 존그루버에 의해 만들어졌으며 쉽게 쓰고 읽을 수 있으며 HTML로 변환이 가능하다. 특수기호와 문자를 이용한 매우 간단한 구조의 문법을 사용하여 웹에서도 보다 빠르게 컨텐츠를 작성하고 보다 직관적으로 인식할 수 있다.
HTML과 리치 텍스트(RTF) 등 서식 문서로 쉽게 변환되기 때문에 응용 소프트웨어와 함께 배포되는 README 파일이나 온라인 게시물 등에 많이 사용된다.</p>
</blockquote>
<hr>
<h2 id="eelemetsblock">Eelemets(block)</h2>
<p><strong>제목(title)</strong>
<code>h1</code>텍스트부터 <code>h6</code>을 이용해서 제목을 표현할 수 있다.</p>
<h4 id="💻code">💻Code</h4>
<pre><code class="language-html"># title h1..
## title h2..
### title h3..
#### title h4..
##### title h5..
###### title h6..</code></pre>
<h4 id="✔result">✔Result</h4>
<h1 id="title-h1">title h1..</h1>
<h2 id="title-h2">title h2..</h2>
<h3 id="title-h3">title h3..</h3>
<h4 id="title-h4">title h4..</h4>
<h5 id="title-h5">title h5..</h5>
<h6 id="title-h6">title h6..</h6>
<hr>
<p><strong>인용문(Blockquotes)</strong></p>
<blockquote>
<p>본문 안에서 인용된 내용을 표시하고자 할 때 사용한다.</p>
</blockquote>
<h4 id="💻code-1">💻Code</h4>
<pre><code class="language-html">&gt; ## title1
 text
 text
&gt;&gt; ## title2
text
text
&gt;&gt;&gt; ### title3
text</code></pre>
<h4 id="✔result-1">✔Result</h4>
<blockquote>
<h2 id="title1">title1</h2>
<p> text
 text</p>
<blockquote>
<h2 id="title2">title2</h2>
<p>text
text</p>
<blockquote>
<h3 id="title3">title3</h3>
<p>text</p>
</blockquote>
</blockquote>
</blockquote>
<hr>
<p><strong>목록(List)</strong></p>
<blockquote>
<p><code>*</code> <code>+</code> <code>-</code> 중 아무 기호나 사용하여 표현을 하거나 <code>1.</code> <code>2.</code> 순차적인 목록을 나타내기도 한다.</p>
</blockquote>
<h4 id="💻code-2">💻Code</h4>
<pre><code>* LIST
+ LIST
- LIST
1. LIST1
2. LIST2
3. LIST3</code></pre><h4 id="✔result-2">✔Result</h4>
<ul>
<li>LIST</li>
<li>LIST</li>
<li>LIST</li>
</ul>
<ol>
<li>LIST1</li>
<li>LIST2</li>
<li>LIST3</li>
</ol>
<hr>
<p><strong>코드(Code Block)</strong></p>
<blockquote>
<p><code>tab</code> 키를 이용하여 한줄로된 코드 블록을 만들거나 여러줄의 코드 블록의 경우 백틱(`) 3개로 감싸서 작성한다.</p>
</blockquote>
<h4 id="💻code-3">💻Code</h4>
<pre><code class="language-javascript">function helloworld(){
    console.log(&#39;Hello World !&#39;);
}</code></pre>
<h5 id="코드블럭-시작점에-사용하는-언어를-선언하면-syntax-highlighting이-가능하다">코드블럭 시작점에 사용하는 언어를 선언하면 Syntax Highlighting이 가능하다.</h5>
<table>
<thead>
<tr>
<th>Bash</th>
<th align="left">bash</th>
</tr>
</thead>
<tbody><tr>
<td>C#</td>
<td align="left">cs</td>
</tr>
<tr>
<td>C++</td>
<td align="left">cpp</td>
</tr>
<tr>
<td>CSS</td>
<td align="left">css</td>
</tr>
<tr>
<td>Diff</td>
<td align="left">diff</td>
</tr>
<tr>
<td>HTML, XML</td>
<td align="left">html</td>
</tr>
<tr>
<td>HTTP</td>
<td align="left">http</td>
</tr>
<tr>
<td>Ini</td>
<td align="left">ini</td>
</tr>
<tr>
<td>JSON</td>
<td align="left">json</td>
</tr>
<tr>
<td>Java</td>
<td align="left">java</td>
</tr>
<tr>
<td>JavaScript</td>
<td align="left">javascript</td>
</tr>
<tr>
<td>PHP</td>
<td align="left">php</td>
</tr>
<tr>
<td>Perl</td>
<td align="left">perl</td>
</tr>
<tr>
<td>Python</td>
<td align="left">python</td>
</tr>
<tr>
<td>Ruby</td>
<td align="left">ruby</td>
</tr>
<tr>
<td>SQL</td>
<td align="left">sql</td>
</tr>
</tbody></table>
<p>출처: <a href="https://velog.io/@cateto/%EB%A7%88%ED%81%AC%EB%8B%A4%EC%9A%B4-%EC%99%95%EC%B4%88%EB%B3%B4-%EC%BD%94%EB%93%9C%EB%B8%94%EB%A1%9D-%EC%82%AC%EC%9A%A9%EA%B0%80%EB%8A%A5%ED%95%9C-%EC%96%B8%EC%96%B4-%EB%AA%A9%EB%A1%9D%EC%B4%88%EA%B0%84%EB%8B%A8">마크다운 왕초보 코드블록 사용가능한 언어 목록</a></p>
<p>*<em>선 삽입 *</em></p>
<blockquote>
<p>가로선을 넣어서 맥락을 구분해줄 수 있다.</p>
</blockquote>
<h4 id="💻code-4">💻Code</h4>
<pre><code>* * *
***
*****
- - -
---
-----
_ _ _
___
_____</code></pre><h4 id="✔result-3">✔Result</h4>
<hr>
<hr>
<hr>
<hr>
<hr>
<hr>
<hr>
<hr>
<h2 id="eelemetsinline">Eelemets(Inline)</h2>
<p><strong>링크(HyperLinkText)</strong></p>
<blockquote>
<p>인라인 링크, url 링크, 참조 링크 3가지 방식으로 링크를 나타낼 수 있다.</p>
</blockquote>
<h4 id="💻code-5">💻Code</h4>
<pre><code>인라인 링크
[인라인 링크](https://velog.io/)

url 링크
&lt;https://velog.io/&gt;

참조 링크
[velog]:https://velog.io/ --&gt; 선언을 해두고

[velog] --&gt; 호출하여 사용</code></pre><h4 id="✔result-4">✔Result</h4>
<p><a href="https://velog.io/">인라인 링크</a></p>
<p><a href="https://velog.io/">https://velog.io/</a></p>
<p><a href="https://velog.io/">velog</a></p>
<hr>
<p><strong>Style TEXT</strong></p>
<blockquote>
<p>볼드, 이탤릭, 취소선</p>
</blockquote>
<h4 id="💻code-6">💻Code</h4>
<pre><code>*이탤릭*
_이탤릭_
**볼드**
__볼드__
~~취소선~~</code></pre><h4 id="✔result-5">✔Result</h4>
<p><em>이탤릭</em>
<em>이탤릭</em>
<strong>볼드</strong>
<strong>볼드</strong>
<del>취소선</del></p>
<hr>
<p><strong>이미지 삽입(Images)</strong></p>
<blockquote>
<p>링크 삽입 방식과 유사하나, 맨 앞에 !를 붙여불러온다. </p>
</blockquote>
<pre><code>1. 일반 이미지 삽입하기: ![대체 텍스트](이미지 링크)
예시: ![PlaceHolder](https://via.placeholder.com/200x200)

2. 이미지에 설명 삽입하기: ![대체 텍스트](이미지 링크 &quot;이미지 설명 문구&quot;)
예시: ![PlaceHolder](https://via.placeholder.com/200x200&quot;이미지 예시입니다.&quot;)
** 참고: 이미지에 마우스를 올렸을 때 나타나는 설명을 의미함

3. 이미지에 링크 걸기: [![대체 텍스트](이미지 링크)](연결할 url &quot;url 설명 문구&quot;)
예시: [![CloudScape]((https://via.placeholder.com/200x200)](https://via.placeholder.com &quot;Via Image&quot;)
</code></pre><ol>
<li><p>일반 이미지 삽입하기: ![대체 텍스트](이미지 링크)
예시: <img src="https://via.placeholder.com/200x200" alt="PlaceHolder"></p>
</li>
<li><p>이미지에 설명 삽입하기: ![대체 텍스트](이미지 링크 &quot;이미지 설명 문구&quot;)
예시: <img src="https://via.placeholder.com/200x200" alt="PlaceHolder" title="이미지 예시입니다."></p>
</li>
</ol>
<p>** 참고: 이미지에 마우스를 올렸을 때 나타나는 설명을 의미함</p>
<ol start="3">
<li>이미지에 링크 걸기: [![대체 텍스트](이미지 링크)](연결할 url &quot;url 설명 문구&quot;)
예시: <a href="https://placeholder.com" title="Via Image"><img src="https://via.placeholder.com/200x200" alt="CloudScape"></a></li>
</ol>
<hr>
<p>** 기호 표시(Backslash Escapes)**</p>
<blockquote>
<p>마크다운 문법에 있는 기호를 그대로 출력하고 싶다면, 역방향 슬래시를 앞에 붙여주면 된다.</p>
</blockquote>
<h4 id="💻code-7">💻Code</h4>
<pre><code>\*
\_
\()
\{}
\[]
\#
\+
\-
\.
\!
\\</code></pre><h4 id="✔result-6">✔Result</h4>
<p>*
_
()
{}
[]
#
+
-
.
!
\</p>
<hr>
<p><strong>테이블(Table)</strong></p>
<blockquote>
<p>수직선 기호(|)로 열을 구분할 수 있다
하이픈 기호(-)를 여러 개 붙여서 th와 tr을 구분할 수 있다.
콜론 기호(:)로 정렬을 표현할 수 있다.</p>
</blockquote>
<h4 id="💻code-8">💻Code</h4>
<pre><code>|    |left |center|right
|----|:----|:----:|----:
|row1|l1   |  c1  |   r1
|row2|l2   |  c2  |   r2
|row3|l3   |  c3  |   r3</code></pre><h4 id="✔result-7">✔Result</h4>
<table>
<thead>
<tr>
<th></th>
<th align="left">left</th>
<th align="center">center</th>
<th align="right">right</th>
</tr>
</thead>
<tbody><tr>
<td>row1</td>
<td align="left">l1</td>
<td align="center">c1</td>
<td align="right">r1</td>
</tr>
<tr>
<td>row2</td>
<td align="left">l2</td>
<td align="center">c2</td>
<td align="right">r2</td>
</tr>
<tr>
<td>row3</td>
<td align="left">l3</td>
<td align="center">c3</td>
<td align="right">r3</td>
</tr>
</tbody></table>
<hr>
<h2 id="end">END</h2>
<p>벨로그를 잘 작성해보자는 의미로 마크다운언어를 정리해보았다.
업무할때 구글 체팅을 이용하여 사내에서 체팅을 사용하고 있는데 구글 체팅에서도 사용이가능 했었다.
알아두면 참 요긴하게 쓸 것으로 보인다 !</p>
<p><strong>참고 사이트</strong></p>
<blockquote>
<p><a href="https://velog.io/@ybkim3603/Velog%EB%B2%A8%EB%A1%9C%EA%B7%B8-%EC%82%AC%EC%9A%A9%EB%B2%95-%ED%8A%9C%ED%86%A0%EB%A6%AC%EC%96%BC">내가 보려고 정리한 Velog(벨로그) 사용법 튜토리얼</a></p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>