<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>silver-bell.log</title>
        <link>https://velog.io/</link>
        <description>leggo</description>
        <lastBuildDate>Thu, 01 Jun 2023 03:00:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>silver-bell.log</title>
            <url>https://velog.velcdn.com/images/silver-bell/profile/7c290bbe-cfff-4ac9-91be-68fe87dda112/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. silver-bell.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/silver-bell" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[mac 설정하기] m2 nvm 설치하기 (nodemon version manager)]]></title>
            <link>https://velog.io/@silver-bell/mac-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-nvm-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-intel-%EB%B2%84%EC%A0%84nodemon-version-manager</link>
            <guid>https://velog.io/@silver-bell/mac-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-nvm-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-intel-%EB%B2%84%EC%A0%84nodemon-version-manager</guid>
            <pubDate>Thu, 01 Jun 2023 03:00:05 GMT</pubDate>
            <description><![CDATA[<pre><code>$ brew install nvm</code></pre><p><img src="https://velog.velcdn.com/images/silver-bell/post/014862df-d9b3-4969-88b9-ed62c4dd7e04/image.png" alt=""></p>
<p>위의 붉은 박스 안내에 따라서 / 위치에 .nvm 디렉토리를 생성합니다.</p>
<pre><code>$ mkdir ~/.nvm </code></pre><p>zshrc가 없으므로, 생성해줍니다. </p>
<pre><code>$vi ~/.zshrc</code></pre><p>~/.zshrc 파일을 텍스트 에디터로 열어서 아래 설정을 추가합니다. (해당 설정 명령어는 녹색 박스에 있다.)</p>
<pre><code>export NVM_DIR=&quot;$HOME/.nvm&quot;
  [ -s &quot;/opt/homebrew/opt/nvm/nvm.sh&quot; ] &amp;&amp; \. &quot;/opt/homebrew/opt/nvm/nvm.sh&quot;  # This loads nvm
  [ -s &quot;/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm&quot; ] &amp;&amp; \. &quot;/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm&quot;</code></pre><p>아래 명령어로 수정사항을 바로 적용되도록 합니다.</p>
<pre><code>$ source ~/.zshrc</code></pre><p>설치 여부를 확인합니다. </p>
<pre><code>$ nvm --version</code></pre><p><img src="https://velog.velcdn.com/images/silver-bell/post/24245434-3ab6-4c85-808f-cdb813461069/image.png" alt=""></p>
<p>참고 : 위코드 위스터디 자료</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[mac 설정하기] mac air m2 homebrew 설치]]></title>
            <link>https://velog.io/@silver-bell/mac-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-mac-air-m2-homebrew-%EC%84%A4%EC%B9%98</link>
            <guid>https://velog.io/@silver-bell/mac-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0-mac-air-m2-homebrew-%EC%84%A4%EC%B9%98</guid>
            <pubDate>Thu, 01 Jun 2023 02:34:41 GMT</pubDate>
            <description><![CDATA[<p><a href="https://brew.sh/index_ko">homebrew 다운로드 페이지</a>
여기서 하라는 데로 복사하여 터미널에 붙여넣기 하면 아래와 같이
비밀번호 입력하라고 나옴. (그 비밀번호라 하면, 맥북 노트북 비밀번호)</p>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/4b33a696-0a0a-4d04-b59d-2a86ebc5a05a/image.png" alt=""></p>
<p>비번 치고 나면 아래와 같이 return 또는 enter 키 누르라고 함. 나는 enter를 눌렀다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/159b9175-651d-4d71-9fa7-d0a1f17af595/image.png" alt=""></p>
<p>꽤 시간이 흐른 후,,,(한 3분?) 엄청난 길이의 문장들을 끝으로, 또 무언가 하라는 말이 나온다...
<img src="https://velog.velcdn.com/images/silver-bell/post/50a1e800-8533-4445-a411-832639b8fa51/image.png" alt="">
붉은 박스 명령어를 복사하여 입력한다.
설치가 완료되었다!
<img src="https://velog.velcdn.com/images/silver-bell/post/f47471c4-282f-43ee-a0b4-683ed704884d/image.png" alt=""></p>
<p>아래 명령어로 잘 설치되었는지 확인하기</p>
<pre><code>$ brew --version</code></pre><p>나는 Homebrew 4.0.20 으로 잘 설치되었는 것이 확인되었다.</p>
<p>참고 : <a href="https://velog.io/@twentizz20/Homebrew-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0">https://velog.io/@twentizz20/Homebrew-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git-hub][실수 노트]Github에 잘못 올라간 파일 삭제하기]]></title>
            <link>https://velog.io/@silver-bell/git-hub-Github%EC%97%90-%EC%9E%98%EB%AA%BB-%EC%98%AC%EB%9D%BC%EA%B0%84-%ED%8C%8C%EC%9D%BC-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@silver-bell/git-hub-Github%EC%97%90-%EC%9E%98%EB%AA%BB-%EC%98%AC%EB%9D%BC%EA%B0%84-%ED%8C%8C%EC%9D%BC-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 15 Apr 2023 03:05:48 GMT</pubDate>
            <description><![CDATA[<p>[참고 자료] (<a href="https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-Github%EC%97%90-%EC%9E%98%EB%AA%BB-%EC%98%AC%EB%9D%BC%EA%B0%84-%ED%8C%8C%EC%9D%BC-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0">https://inpa.tistory.com/entry/GIT-%E2%9A%A1%EF%B8%8F-Github%EC%97%90-%EC%9E%98%EB%AA%BB-%EC%98%AC%EB%9D%BC%EA%B0%84-%ED%8C%8C%EC%9D%BC-%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0</a>)</p>
<h2 id="❗️문제-상황">❗️문제 상황</h2>
<p>EC2 암페어 파일을 프로젝트 directory로 옮겨두었고, .gitignore에 추가하지 않았다. 
그 결과.. 레포에 암페어 파일이 공유되었다.... </p>
<h2 id="✅-해결-">✅ 해결 :</h2>
<h3 id="1-파일-삭제하기">1. 파일 삭제하기</h3>
<pre><code class="language-javascript"># 원격 저장소와 로컬 저장소에 있는 파일을 삭제한다.
$ git rm {File Name}

# 원격 저장소에 있는 파일을 삭제한다. 로컬 저장소에 있는 파일은 삭제하지 않는다.
$ git rm --cached {File Name}

# .idea 폴더 하위의 모든 파일 삭제 
$ git rm --cached -r .idea/</code></pre>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/9849d680-2673-419d-9a0c-9d2528c81b97/image.png" alt=""></p>
<h3 id="2-gitignore-설정하기">2. .gitignore 설정하기</h3>
<p>이미 .gitignore 파일 생성된 이후로, 파일에 암페어 파일만 추가했다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/08db306f-e3a7-4dcd-9c4a-a9c03fc4603d/image.png" alt=""></p>
<h3 id="3-원격-저장소에-적용하기">3. 원격 저장소에 적용하기</h3>
<pre><code class="language-javascript"># 버전 관리에서 완전히 제외하기 위해서는 반드시 commit 명령어를 수행해야 한다.
$ git commit -m &quot;Fixed untracked files&quot;

# 원격 저장소(origin)에 push
$ git push origin fix/users</code></pre>
<h3 id="4-ignore된-파일-확인">4. ignore된 파일 확인</h3>
<pre><code>$ git status --ignored</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Js] node.js 는 런타임, Express 는 프레임워크]]></title>
            <link>https://velog.io/@silver-bell/Js-node.js-%EB%8A%94-%EB%9F%B0%ED%83%80%EC%9E%84-Express-%EB%8A%94-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</link>
            <guid>https://velog.io/@silver-bell/Js-node.js-%EB%8A%94-%EB%9F%B0%ED%83%80%EC%9E%84-Express-%EB%8A%94-%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC</guid>
            <pubDate>Thu, 13 Apr 2023 15:05:14 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>Node.js 는 프레임워크도 라이브러리도 아니다. 
브라우저 외부에서 javascript를 컴퓨터가 이해할 수 있도록 도와주는 런타임 환경이라고 보면된다.  </p>
</blockquote>
<blockquote>
<p>프레임 워크가 라이브러리보다 더 포괄적인 개념이며, 뼈대라고 보면 된다. 
예) Express가 프레임워크이다. </p>
</blockquote>
<blockquote>
<p>라이브러리는  애플리케이션에 특정 기능을 추가하기 위해 사용할 수 있는 미리 작성된 코드 모음이다. 
예) &#39;body-parser&#39;, &#39;cookie-parser&#39;, &#39;cors&#39;, &#39;morgan&#39;</p>
</blockquote>
<blockquote>
<p>router 는 Node.js와 Express를 사용한 웹 개발의 맥락에서, 라우터는 라이브러리가 아닌 Express 프레임워크의 내장 기능이다. </p>
</blockquote>
<p>[프레임워크와 라이브러리]</p>
<p>프레임워크는 소프트웨어 애플리케이션 개발을 위한 미리 디자인되고 코딩된 구조로, 개발자가 애플리케이션을 만드는 데 필요한 규칙, 관례 및 최선의 방법을 정의합니다. 프레임워크에는 개발자가 빠르고 효율적으로 애플리케이션을 구축하기 위해 사용할 수 있는 미리 구축된 구성 요소와 라이브러리가 일반적으로 포함됩니다.</p>
<p>프레임워크를 건물의 뼈대로 생각해보세요. 건물이 견고한 프레임워크를 필요로 하는 것처럼, 애플리케이션은 지지할 수 있는 견고한 프레임워크가 필요합니다. 프레임워크는 개발자가 빌드할 수 있는 구조를 제공하여, 기존에 있는 빌딩 블록을 사용하여 시간과 노력을 절약합니다.</p>
<p>반면 라이브러리는 개발자가 애플리케이션에 특정 기능을 추가하기 위해 사용할 수 있는 미리 작성된 코드 모음입니다. 라이브러리는 일반적으로 사용자 인터페이스 디자인, 데이터베이스 액세스 또는 이미지 처리와 같은 특정 작업에 중점을 둡니다. 라이브러리는 일반적으로 프레임워크와 함께 사용되어 프레임워크에서 기본적으로 제공하지 않는 추가 기능을 제공합니다.</p>
<p>[Router]
Express의 라우터는 클라이언트로부터 수신되는 HTTP 요청을 처리하기 위한 경로와 엔드포인트를 정의하는 데 사용됩니다. 애플리케이션의 코드와 논리를 서로 다른 라우트 핸들러로 분리하여 구성하는 데 도움이 됩니다.</p>
<p>라이브러리는 특정 작업을 수행하는 데 필요한 특정 기능을 제공하는 반면, Express의 라우터는 HTTP 요청 처리와 웹 애플리케이션 구축을 위한 구조와 지침을 제공하는 프레임워크의 필수적인 부분입니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error note] error 1045 (28000): access denied for user 'root'@'localhost' (using password: yes) (Ubuntu EC2 Mysql 접속 시 발생)]]></title>
            <link>https://velog.io/@silver-bell/Error-note-error-1045-28000-access-denied-for-user-rootlocalhost-using-password-yes-Ubuntu-EC2-Mysql-%EC%A0%91%EC%86%8D-%EC%8B%9C-%EB%B0%9C%EC%83%9D</link>
            <guid>https://velog.io/@silver-bell/Error-note-error-1045-28000-access-denied-for-user-rootlocalhost-using-password-yes-Ubuntu-EC2-Mysql-%EC%A0%91%EC%86%8D-%EC%8B%9C-%EB%B0%9C%EC%83%9D</guid>
            <pubDate>Fri, 07 Apr 2023 02:44:51 GMT</pubDate>
            <description><![CDATA[<h3 id="❗️문제-상황">❗️문제 상황</h3>
<p>EC2 Ubuntu 에서 mysql root 계정에 접속하려 시도했다. 
비밀번호를 내 root password로 입력했더니 아래와 같은 에러메세지가 나타났다. </p>
<blockquote>
<p>error 1045 (28000): access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: yes)</p>
</blockquote>
<p>구글링 해보니 해당 에러는 잘못된 password를 입력했을 경우에 나타난다.</p>
<blockquote>
<p>error 1045 (28000): access denied for user &#39;root&#39;@&#39;localhost&#39; (using password: no)</p>
</blockquote>
<p>위 에러는 비밀번호 입력을 안했을 때 나타나는 에러이다. </p>
<h3 id="✅-해결--ec2서버를-구축한-사람준우님의-mysql-root-계정의-비밀번호를-입력하니-접속이-되었다">✅ 해결 : EC2서버를 구축한 사람(준우님)의 mysql root 계정의 비밀번호를 입력하니 접속이 되었다.</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[[git-hub] permission denied → fork repository]]></title>
            <link>https://velog.io/@silver-bell/git-hub-permission-denied-fork-repository</link>
            <guid>https://velog.io/@silver-bell/git-hub-permission-denied-fork-repository</guid>
            <pubDate>Thu, 30 Mar 2023 11:21:05 GMT</pubDate>
            <description><![CDATA[<p>원티드 백엔드 도커 사전 미션 수행 완료 후, git push를 진행하였으나, permission denied 에 따라 push가 되지 않았다. </p>
<p>원티드 백엔드 도커 미션 레파지토리 issue 탭에 
나와 같은 문제가 있는 사람이 해당 사항에 대해 문의한 이력이 있었다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/03e56c8b-0fb7-49ab-af6f-9cbadcf35e4a/image.png" alt="git-hub issue 이미지"></p>
<p>✅ 해결방법 </p>
<p>1) docker-pro-wanted 레파지토리를 fork 한다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/fc754c6b-6bd6-4100-8fac-c0b761d8b09c/image.png" alt="">
2) fork 한 레파지토리의 git 주소를 로컬에 clone한다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/ad8ef55a-92bb-49b9-b9fa-20993928e3f6/image.png" alt="">
<img src="https://velog.velcdn.com/images/silver-bell/post/133d56de-7524-4f31-896c-6a7381f77b34/image.png" alt="">
3) readme.md에 따라서 미션 수행 후, push를 하여 PR을 올린다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/5a9a5d3d-e94a-4f36-b297-b5c35437c889/image.png" alt=""></p>
<p>4) 본 원티드 도커 미션 레파지토리를 확인 해 보니 나의 PR이 잘 올라가 있음을 확인했다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/39bba6d5-acc3-4bb4-b208-0854510169e4/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Markdown에서 toggle 사용하는 방법]]></title>
            <link>https://velog.io/@silver-bell/Markdown%EC%97%90%EC%84%9C-toggle-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</link>
            <guid>https://velog.io/@silver-bell/Markdown%EC%97%90%EC%84%9C-toggle-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95</guid>
            <pubDate>Mon, 27 Mar 2023 09:02:23 GMT</pubDate>
            <description><![CDATA[<details>
<summary> markdown 에서 toggle 사용 방법 </summary>
<div>

<p>```html
  <details>
    <summary> {toggle 큰 주제} </summary>
    <div>
      담고 싶은 내용
    </div>
  </details></p>
</div>
</details>]]></description>
        </item>
        <item>
            <title><![CDATA[[git-hub][실수 노트] 다른 브랜치에서 수정 후, git push origin {branch}가 아니라 git push main을 함 ➔ git push 되돌리기]]></title>
            <link>https://velog.io/@silver-bell/%EC%8B%A4%EC%88%98-%EB%85%B8%ED%8A%B8-%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90%EC%84%9C-%EC%88%98%EC%A0%95-%ED%9B%84-git-push-origin-branch%EA%B0%80-%EC%95%84%EB%8B%88%EB%9D%BC-git-push-main%EC%9D%84-%ED%95%A8-git-push-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@silver-bell/%EC%8B%A4%EC%88%98-%EB%85%B8%ED%8A%B8-%EB%8B%A4%EB%A5%B8-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%97%90%EC%84%9C-%EC%88%98%EC%A0%95-%ED%9B%84-git-push-origin-branch%EA%B0%80-%EC%95%84%EB%8B%88%EB%9D%BC-git-push-main%EC%9D%84-%ED%95%A8-git-push-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Mon, 27 Mar 2023 07:39:51 GMT</pubDate>
            <description><![CDATA[<h3 id="❗️-상황-">❗️ 상황 :</h3>
<p>feature 브랜치에서 작업 완료 후, push 하는 중 머리가 이상해졌는지 git push origin main을 해버림</p>
<p>git homepage 내 원격 main branch가 내 로컬 main이랑 동일한 상황이 되어, 준우님이 merge한 이력이 사라져버림 (나는 바로 pull을 안했다.. conflict가 두려워서) </p>
<h3 id="🥲-해결-방안-모색-">🥲 해결 방안 모색 :</h3>
<p>push를 취소하거나 원격 main 히스토리를 되돌리자.</p>
<h3 id="✅-해결-">✅ 해결 :</h3>
<p>feature 브랜치에서 reflog 하여 망치기 전의 시점으로 되돌아가서</p>
<ol>
<li>git reflog</li>
<li>git reset --hard {망치기 이전 시점의 commit number}</li>
<li>git commit -m &#39;new message&#39;</li>
<li>git push origin {branch명}</li>
</ol>
<p>다행히, 원격 main에서 준우님 merge이력도 살아났다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error note] Error: write EPROTO 4832868872:error:100000f7:SSL routines:OPENSSL_internal:WRONG_VERSION_NUMBER:../../../../src/third_party/boringssl/src/ssl/tls_record.cc:242:]]></title>
            <link>https://velog.io/@silver-bell/Error-write-EPROTO-4832868872error100000f7SSL-routinesOPENSSLinternalWRONGVERSIONNUMBER........srcthirdpartyboringsslsrcssltlsrecord.cc242</link>
            <guid>https://velog.io/@silver-bell/Error-write-EPROTO-4832868872error100000f7SSL-routinesOPENSSLinternalWRONGVERSIONNUMBER........srcthirdpartyboringsslsrcssltlsrecord.cc242</guid>
            <pubDate>Tue, 21 Mar 2023 13:38:27 GMT</pubDate>
            <description><![CDATA[<p><a href="https://stackoverflow.com/questions/62658941/error-write-eproto-34557064error100000f7ssl-routinesopenssl-internalwrong">해당 에러에 대한 stackoverflow 링크</a></p>
<p>❗️원인 : 해당 API는 http 만 지원하는데, https로 POST method 요청을 한 것이 원인</p>
<p>✅ 해결 : postman에서 요청 시, https에서 &#39;s&#39;만 삭제하고 재요청시 통신이 된 것을 확인함. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[wecode] 1차 프로젝트 회고]]></title>
            <link>https://velog.io/@silver-bell/wecode-1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</link>
            <guid>https://velog.io/@silver-bell/wecode-1%EC%B0%A8-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%ED%9A%8C%EA%B3%A0</guid>
            <pubDate>Wed, 15 Mar 2023 09:24:25 GMT</pubDate>
            <description><![CDATA[<h1 id="🌳🫖-teatalk-🍃🍵">🌳🫖 TeaTalk 🍃🍵</h1>
<img src = "https://cdn-icons-png.flaticon.com/512/5303/5303997.png" width = "100" height = "100">


<p>[Tea Talk 팀 소개]</p>
<ul>
<li><p>Wecode 코딩 부트캠프 42기 수강생 중 5명이 모여 진행하는 첫 번째 프로젝트 팀</p>
</li>
<li><p>&#39;<a href="https://www.osulloc.com/kr/ko">오설록</a>&#39;을 모티브 사이트로 선정</p>
<p>→&#39;오설록&#39; 은 대한민국이 가진 천혜의 자연 유산인 제주에서 자란 차 잎을 활용한 다양한 티 제품을 판매하는 사이트입니다.</p>
</li>
</ul>
<br>

<h2 id="⭐️-프로젝트-결과-영상">⭐️ <a href="https://youtu.be/LW9Ws-q5GtY">프로젝트 결과 영상</a></h2>
<br>

<h2 id="🗓-project기간">🗓 Project기간</h2>
<p>2023/02/06 ~ 2023/02/17 (약 2주)</p>
<br>

<h2 id="👩👧👨👨👦-팀-구성원-소개">👩‍👧👨‍👨‍👦 팀 구성원 소개</h2>
<h3 id="front-end">Front-End</h3>
<p><a href="https://github.com/seungchannn">강승찬 (Product Manager)</a>, <a href="https://github.com/HYUK9086">이종혁</a>, <a href="https://github.com/seobinbang7">방서빈</a></p>
<h3 id="back-end">Back-End</h3>
<p><a href="https://github.com/Indobobusang">박준우 (Project Manager)</a>, <a href="https://github.com/Silver-bell11">김은경</a></p>
<h2 id="📒-git-hub-repositories">📒 Git-hub repositories</h2>
<ul>
<li><a href="https://github.com/wecode-bootcamp-korea/42-1st-TeaTalk-frontend">Front-end ropository</a></li>
<li><a href="https://github.com/wecode-bootcamp-korea/42-1st-TeaTalk-backend">Back-end repository</a></li>
</ul>
<br>

<h2 id="🧩-구현-사항-정리">🧩 구현 사항 정리</h2>
<br>
👁️ 목표 구현 기능 : 회원가입, 로그인, 장바구니, 결제(포인트)

<br>

<h3 id="💾-back-end">💾 back-end</h3>
<table>
<thead>
<tr>
<th>기능</th>
<th>구현 내용</th>
<th>개발 담당</th>
</tr>
</thead>
<tbody><tr>
<td>DB 모델링 설계</td>
<td><img src="https://user-images.githubusercontent.com/112492840/219868842-940f5974-cc6d-4181-a4f4-c35c457446b5.png" width = "500"></td>
<td>박준우 <br> 김은경</td>
</tr>
<tr>
<td>모델링 기반 테이블 생성</td>
<td>- mysql 및 dbmate 를 활용한 테이블 생성</td>
<td>박준우</td>
</tr>
<tr>
<td>회원가입 <br> 로그인</td>
<td>- 회원가입/로그인 엔드포인트 설정 <br> - 비밀번호 유효성 검사, e-mail 유효성 검사 <br> - bcrypt를 사용한 비밀번호 암호화 <br> - 핸드폰 번호 자리수 제한 설정 <br> - jsonwebtoken을 사용한 로그인</td>
<td>김은경</td>
</tr>
<tr>
<td>제품 리스트 <br> 제품 상세 페이지</td>
<td>- 삼항 연산자와 Inner Join 활용한 필터링과 정렬 <br> - 페이지네이션 <br> - Query Parameter를 이용해 카테고리별 상품 호출</td>
<td>박준우</td>
</tr>
<tr>
<td>장바구니</td>
<td>- 장바구니에 상품 담기 <br> - 결제 후 장바구니 삭제 <br> - 장바구니 상품의 데이터를 발급된 JWT 토큰 내 저장된 유저 정보에 저장</td>
<td>박준우</td>
</tr>
<tr>
<td>결제 (장바구니 &amp; 최종결제)</td>
<td>- transaction으로 카트페이지 상품 get, Delete를 구현 <br> - 포인트 부족 시, 결제 차단 <br> - 중복 배송지 추가에 대한 차단 <br> - 총 결제 금액 확인 및 결제 금액 불일치 시 결제 차단</td>
<td>김은경</td>
</tr>
</tbody></table>
<br>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error note] error 1045 (28000): access denied for user 'root'@'localhost' (using password: yes) (local에서 .env 파일 내 mysql 비밀번호 틀림)]]></title>
            <link>https://velog.io/@silver-bell/Error-access-denied-for-user-rootlocalhost-using-password-yes</link>
            <guid>https://velog.io/@silver-bell/Error-access-denied-for-user-rootlocalhost-using-password-yes</guid>
            <pubDate>Wed, 15 Mar 2023 09:05:59 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/silver-bell/post/a0d9fec8-21fb-4b87-9837-e39d7c3e0b15/image.png" alt=""></p>
<h4 id="❗️-원인--env-파일에서-mysql-비밀번호가-틀린것이-원인">❗️ 원인 : .env 파일에서 mysql 비밀번호가 틀린것이 원인</h4>
<h4 id="✅-해결--env-파일에서-mysql-비밀번호-올바르게-수정">✅ 해결 : .env 파일에서 mysql 비밀번호 올바르게 수정</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error note] git-hub add 후, node package 10805 개 추가되는 문제]]></title>
            <link>https://velog.io/@silver-bell/Error-git-hub-add-%ED%9B%84-node-package-10805-%EA%B0%9C-%EC%B6%94%EA%B0%80%EB%90%98%EB%8A%94-%EB%AC%B8%EC%A0%9C</link>
            <guid>https://velog.io/@silver-bell/Error-git-hub-add-%ED%9B%84-node-package-10805-%EA%B0%9C-%EC%B6%94%EA%B0%80%EB%90%98%EB%8A%94-%EB%AC%B8%EC%A0%9C</guid>
            <pubDate>Wed, 15 Mar 2023 09:03:02 GMT</pubDate>
            <description><![CDATA[<p>현상 : 초기 세팅 진행 시, 변경 사항이 10개 밖에 없다가, add . 만 하면 아래와 같이 변경 사항이 10805개가 추가된다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/4e1883ab-91a5-401c-bc68-b79ccc991580/image.png" alt=""></p>
<p>❗️원인 : .gitignore 파일을 생성하지 않았고, Node를 추가하지 않았기 때문에 node_module 폴더가 ignore되지 않고 commit 된것이 원인.</p>
<p>✅ 해결 : <a href="https://www.toptal.com/developers/gitignore">gitignore</a> .gitignore 파일을 추가하고, 아래 그림과 같이 node를 추가해준다.
<img src="https://velog.velcdn.com/images/silver-bell/post/cf396c81-c95c-4391-aae4-9d4e23a015d6/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Error note] TypeError: appDataSource.initialize is not a function]]></title>
            <link>https://velog.io/@silver-bell/Error-List-TypeError-appDataSource.initialize-is-not-a-function</link>
            <guid>https://velog.io/@silver-bell/Error-List-TypeError-appDataSource.initialize-is-not-a-function</guid>
            <pubDate>Wed, 15 Mar 2023 06:02:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/silver-bell/post/6b4d0f31-66ad-47f7-ac24-78638d238659/image.png" alt=""></p>
<p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Not_a_function">MDN TypeError 원인 리스트</a></p>
<h4 id="❗️원인--datasourcejs에서-moduleexports--appdatasource에서-r을-빼먹은-오타가-원인이였다">❗️원인 : dataSource.js에서 module.exports = appDataSource에서 &#39;r&#39;을 빼먹은 오타가 원인이였다.</h4>
<pre><code class="language-javascript"> module.expo&#39;r&#39;ts = appDataSource</code></pre>
<p>현상 : 따라서, appDataSource가 함수가 아니라고 에러가 나타남. </p>
<p>appDataSource가 제대로 import되었다면 아래와같이 나타남</p>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/834f5ecf-cd10-4f79-a951-51ddbd0f0204/image.png" alt=""></p>
<p>appDataSource가 제대로 import되어 있지 않았다면 커서를 댔을 때, 아래와 같이 간단히 나타남</p>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/8476795e-b13f-44b9-bd1b-e8fcdd080495/image.png" alt=""></p>
<h4 id="✅-해결방법--moduleexports-오타를-정정하였음">✅ 해결방법 : module.exports 오타를 정정하였음</h4>
]]></description>
        </item>
        <item>
            <title><![CDATA[[wecode]-(1주차 2일) node.js intro (2) node.js 설치/ npm/ REPL]]></title>
            <link>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-2%EC%9D%BC-node.js-intro-2-node.js-%EC%84%A4%EC%B9%98REPL</link>
            <guid>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-2%EC%9D%BC-node.js-intro-2-node.js-%EC%84%A4%EC%B9%98REPL</guid>
            <pubDate>Sat, 14 Jan 2023 13:06:44 GMT</pubDate>
            <description><![CDATA[<p>javascript를 실행하는 방법에는 2가지가 있는데, REPL (Read Eval Print Loop)과 .js 파일에 코드를 작성하고 실행하는 방법이다.</p>
<h1 id="1-nodejs-설치">1. node.js 설치</h1>
<h3 id="1-homebrew-설치">1) homebrew 설치</h3>
<blockquote>
<p>홈브류란?
Homebrew는 MacOS(Linux도 포함)용 opensource 패키지 관리 시스템입니다.</p>
</blockquote>
<p>(1) 아래 설치 스크립트를 터미널에서 실행하만 설치가 진행됩니다.</p>
<pre><code class="language-javascript">$ /bin/bash -c &quot;$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)&quot;</code></pre>
<p>(2) 설치가 완료되면 마지막으로 안내 메시지가 터미널에 출력됩니다.</p>
<pre><code class="language-javascript">==&gt; Next steps:
- Add Homebrew to your PATH in /Users/&lt;USER_ID&gt;/.zprofile:
    echo &#39;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&#39; &gt;&gt; /Users/&lt;USER_ID&gt;/.zprofile
    eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;
- Run `brew help` to get started
- Further documentation:
    https://docs.brew.sh</code></pre>
<p>(3) 안내를 따라 다음 2줄을 복사하여 터미널에 다시 붙여넣기 합니다.</p>
<pre><code class="language-javascript">$ echo &#39;eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;&#39; &gt;&gt; /Users/&lt;USER_ID&gt;/.zprofile
$ eval &quot;$(/opt/homebrew/bin/brew shellenv)&quot;</code></pre>
<p>(4) 최신 Homebrew가 잘 설치되었는지 버전을 확인합니다.</p>
<pre><code class="language-javascript">$ brew --version
Homebrew 3.1.5</code></pre>
<h3 id="2-nvmnode-version-manager-설치">2) NVM(node version manager) 설치</h3>
<blockquote>
<p>Node의 버전을 관리해주기 위해서 node를 바로 설치하지 않고, node 버전 관리 매니저인 NVM을 설치합니다. homebrew를 사용해서 NVM(Node Version Manager)를 설치합니다.</p>
</blockquote>
<p>(1) NVM 설치</p>
<pre><code class="language-javascript">$ brew install nvm</code></pre>
<p>(2) 설치가 완료되면 아래와 같은 추가 안내가 터미널에 출력됩니다.</p>
<pre><code class="language-javascript">Please note that upstream has asked us to make explicit managing
nvm via Homebrew is unsupported by them and you should check any
problems against the standard nvm install method prior to reporting.

You should create NVM&#39;s working directory if it doesn&#39;t exist:

  mkdir ~/.nvm

Add the following to ~/.zshrc or your desired shell
configuration file:

  export NVM_DIR=&quot;$HOME/.nvm&quot;
  [ -s &quot;/usr/local/opt/nvm/nvm.sh&quot; ] &amp;&amp; \. &quot;/usr/local/opt/nvm/nvm.sh&quot;  # This loads nvm
  [ -s &quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&quot; ] &amp;&amp; \. &quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&quot;  # This loads nvm bash_completion

You can set $NVM_DIR to any location, but leaving it unchanged from
/usr/local/opt/nvm will destroy any nvm-installed Node installations
upon upgrade/reinstall.
위에 설치 안내에 따라서 / 위치에 .nvm 디렉토리를 생성합니다.</code></pre>
<p>(2) 위에 설치 안내에 따라서 / 위치에 .nvm 디렉토리를 생성합니다.</p>
<pre><code class="language-javascript">$ mkdir ~/.nvm</code></pre>
<p>(3) 터미널에서 ~/.zshrc 열어서 아래 설정을 추가합니다.</p>
<pre><code class="language-javascript">export NVM_DIR=&quot;$HOME/.nvm&quot;
  [ -s &quot;/usr/local/opt/nvm/nvm.sh&quot; ] &amp;&amp; \. &quot;/usr/local/opt/nvm/nvm.sh&quot;  # This loads nvm
  [ -s &quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&quot; ] &amp;&amp; \. &quot;/usr/local/opt/nvm/etc/bash_completion.d/nvm&quot;  # This loads nvm bash_completion</code></pre>
<p>(4) nvm 스크립트를 사용하려면 아래 source 명령어를 입력해 .zshrc 파일을 수정한 값을 바로 적용되도록 해야합니다.</p>
<pre><code class="language-javascript">$ source ~/.zshrc</code></pre>
<p>(5) 설치 여부를 확인합니다.</p>
<pre><code class="language-javascript">$ nvm --version</code></pre>
<h3 id="3-nvm으로-unodejs-lts-버전-설치u">3) NVM으로 <u>node.js LTS 버전 설치</u></h3>
<p>(1) 아래 명령어를 입력해 설치 가능한 노드 버전을 볼 수 있습니다.</p>
<pre><code class="language-javascript">$nvm list-remote
&gt;
v14.15.2   (LTS: Fermium)
v14.15.3   (LTS: Fermium)
v14.15.4   (Latest LTS: Fermium)
v15.0.0
v15.0.1
v15.1.0
v15.2.0
v15.2.1
v15.3.0
v15.4.0
v15.5.0
v15.5.1
. . 
위 리스트 중에 원하는 버전을 선택하여 설치할 수 있습니다.</code></pre>
<p>(2) 설치</p>
<pre><code class="language-javascript">선택하여 설치하려면 아래와 같이 명령어 입력
$ nvm install v16.15.0 

latest long-term support version 설치
$ nvm install lts/erbium</code></pre>
<p>(3) 아래 명령어를 사용해서 설치되어 있는 nvm 버전들을 확인 할 수 있습니다.</p>
<pre><code class="language-javascript">$ nvm list
&gt;
-&gt;     v16.15.0
default -&gt; v16.15.0
node -&gt; stable (-&gt; v16.15.0) (default)
stable -&gt; 16.15 (-&gt; v16.15.0) (default)</code></pre>
<p>(4) 설치를 완료 했다면, 원하는 버전의 가상환경을 활성화해서 사용할 수 있습니다.</p>
<pre><code class="language-javascript">$ nvm use v16.15.0
&gt; Now using node v16.15.0 (npm v8.5.5)</code></pre>
<p>(5) Javascript file 실행 : </p>
<pre><code class="language-javascript">$ node {파일이름.js}

예) node app.js</code></pre>
<h3 id="4-✋잠깐-npmnode-package-manager-알아보기">4) ✋잠깐!! npm(node package manager) 알아보기</h3>
<blockquote>
<p>Node.js 기반의 패키지를 사용하려면 npm(node package manager)이라는 패키지 관리 도구가 필요합니다. npm을 통해 다양한 패키지를 설치하고 버전을 관리할 수 있습니다. 즉, 각 종 웹 개발 라이브러리 설치 및 관리 도우미라고 보면 됩니다. 
(Node.js를 설치하면 npm이 자동으로 설치 됩니다.)</p>
</blockquote>
<p>모듈은 크게 Built-in module, Custom module, 3rd-party module로 나눌 수 있습니다. 커스텀(Custom) 모듈은 Node.js CommonJS 방식으로 만들 모듈을 의미하고, 빌트인(Built-in) 모듈은 Node.js가 설치되면서 기본으로 내장되어 있는 모듈들을 의미합니다. 대표적으로 모듈을 import 할 때 사용하는 require 함수도 빌트인 모듈입니다. 마지막으로 3rd-party module은 다른 개발자들이 만들어 놓은 모듈을 의미합니다.</p>
<p>3rd-party module의 소스 코드들이 모아져 있는 저장소(npm registry), 웹 사이트(website), 그리고 npm CLI를 통칭해서 NPM이라고 합니다. 앞으로 개발에 필요한 여러가지 패키지를 NPM을 통해서 관리하게 됩니다. </p>
<h4 id="1-packagejson">(1) package.json</h4>
<ul>
<li><p>프로젝트에 대한 메타 정보와 프로젝트에서 사용중인 npm 패키지에 대한 정보를 담은 파일입니다.</p>
</li>
<li><p>프로젝트 초기 세팅할 때 package.json부터 만들고 시작합니다.
이때, 프로젝트 별로 필요한 npm 패키지가 버전별 다를 수 있기 때문에 버전까지 명확하게 기록해두어야 합니다.</p>
</li>
<li><p>동일한 버전을 설치하지 않으면 문제가 생길 수 있습니다.</p>
</li>
</ul>
<pre><code class="language-javascript"># project 폴더에서 아래 명령어 실행

$ npm init

# npm init -y이 완료되면 폴더에 package.json이 생성됨(기본적인 디폴트 내용의 최종 내용은 다음 package.json 상에 기록되며, 추후에 언제든지 원하는 내용을 추가 및 수정할 수 있습니다.)</code></pre>
<h4 id="2-packagejson-파일-내-몇-가지-속성">(2) package.json 파일 내 몇 가지 속성</h4>
<ul>
<li>name: 패키지의 이름입니다. package.json의 name 속성에 저장됩니다.</li>
<li>version: 패키지의 버전입니다. npm의 버전은 다소 엄격하게 관리됩니다.</li>
<li>scripts : node.js command line을 정의해서 사용할 수 있습니다.</li>
<li>dependencies : 프로젝트에서 사용하는 배포용 패키지와 각 버전을 명시합니다.</li>
<li>devDependencies : 프로젝트에서 사용하는 로컬 개발용 패키지와 각 버전이 명시되어 있습니다.</li>
<li>git repository: 소스코드를 저장해둔 Git 저장소 주소를 의미합니다. 나중에 소스에 문제가 생겼을 때 사용자들이 이 저장소에 방문해 문제를 제기할 수도 있고, 코드 수정본을 올릴 수도 있습니다. package.json의 repository 속성에 저장됩니다.</li>
<li>keywords: 키워드는 npm 공식 홈페이지(<a href="https://npmjs.com)%EC%97%90%EC%84%9C">https://npmjs.com)에서</a> 패키지를 쉽게 찾을 수 있게 해줍니다. package.json의 keywords 속성에 저장됩니다.</li>
<li>license: 해당 패키지의 라이선스를 넣어주면 됩니다. MIT는 오픈소스를 의미합니다.</li>
</ul>
<h4 id="3-npm-자주-사용하는-명령어-목록">(3) npm 자주 사용하는 명령어 목록</h4>
<ul>
<li>npm outdated : 사용하는 어떤 패키지에 업데이트된 내역을 확인합니다.</li>
<li>npm install + package : 배포용 패키지를 설치한 후에 package.json의 dependencies 속성에 추가합니다.</li>
<li>npm install --save-dev + package : 개발용 패키지를 설치한 후에 package.json의 devDependencies 속성에 추가합니다.</li>
<li>npm uninstall + package : 패키지를 삭제 합니다. (npm rm + package도 가능)</li>
<li>npm search + 검색어 : npm 패키지를 검색합니다.</li>
<li>npm info + package : 패키지의 세부 정보 출력합니다.</li>
<li>npm login : npm에 로그인을 하기 위한 명령어로 사전에 npmjs.com에서 회원가입이 필요합니다.</li>
<li>npm whoami : 현재 사용자가 누구인지 출력합니다.</li>
<li>npm logout : 로그인한 계정에서 로그아웃 합니다.</li>
<li>npm version + major : package.json에서 major version 올립니다.</li>
<li>npm deprecate + [package][version][message] : 패키지를 설치할 때 경고 메시지를 띄우게 합니다.</li>
<li>npm publish : 만든 패키지를 npm에 배포합니다.</li>
<li>npm unpublish : 만든 패키지의 배포를 중단합니다.</li>
</ul>
<h3 id="5-nodemon-설치">5) nodemon 설치</h3>
<blockquote>
<p>nodemon이란 ? node monitor의 약자로, 노드가 실행하는 파일이 속한 디렉터리를 감시하고 있다가 파일이 수정되면 자동으로 노드 애플리케이션을 재시작하는 확장 모듈이다. nodemon을 설치하면 재시작 없이 코드를 자동 반영 할수 있다.</p>
</blockquote>
<p>(1)  아래 명령어를 터미널에 입력한다. </p>
<pre><code class="language-javascript">$ npm init -y //-y 는 --yes와 같은 의미로 디폴트 값으로 package.json이 생성된다. 
//$npm init을 하면, 정보들을 일일히 입력해주어야 한다. 
$ npm install --save-dev nodemon</code></pre>
<p>(2) 생성된 package.json 파일로 이동하면 아래와 같이 설정 되어 있다. 아래는 npm 명령어를 저장해두는 부분으로 자주 쓰는 명령어 값으로 주고 지정한 키로 쓸 수 있다. </p>
<pre><code class="language-javascript">&quot;scripts&quot; : {
  &quot;start&quot; : &quot;node ./bin/www&quot;
}</code></pre>
<p>이는 터미널에 npm start를 입력하면 &quot;node ./bin/www&quot;를 실행시키겠다는 의미이다. 하지만 우리는 nodemon으로 실행시킬 것이기 때문에 scripts부분을 아래와 같이 수정해준다.</p>
<pre><code class="language-javascript">&quot;scripts&quot; : {
  &quot;start&quot; : &quot;nodemon ./bin/www&quot;
}</code></pre>
<p>(3) nodemon을 실행하귀 위해 아래 명령어를 입력한다. </p>
<pre><code class="language-javascript">$npm start</code></pre>
<h1 id="2-repl-read-eval-print-loop">2. REPL (Read Eval Print Loop)</h1>
<blockquote>
<p>파일을 생성하지 않고도 Javascript 코드를 테스트하는 빠른 방법입니다.</p>
</blockquote>
<p>이미 node.js가 설치되어 있는 상황이라면, Node.js REPL 역시 설치되어 있습니다. REPL을 시작하는 방법은 간단하게 터미널에 node라고 입력하면 됩니다. &gt; 기호는 이제 사용자가 입력하는 Javascript 코드는 즉시 평가해서 실행시켜준다는 의미입니다.</p>
<pre><code class="language-javascript">$ node

Welcome to Node.js v16.3.0.
Type &quot;.help&quot; for more information.

&gt; &quot;Hello &quot; + &quot;World&quot;
&#39;Hello World&#39;
&gt;2+2
4</code></pre>
<p>참고: wecode &amp; <a href="https://codingsalon.tistory.com/67">https://codingsalon.tistory.com/67</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[wecode]-(1주차 2일) node.js intro (1) 정의/장점]]></title>
            <link>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-2%EC%9D%BC-node.js-intro-1-%EC%A0%95%EC%9D%98%EC%9E%A5%EC%A0%90</link>
            <guid>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-2%EC%9D%BC-node.js-intro-1-%EC%A0%95%EC%9D%98%EC%9E%A5%EC%A0%90</guid>
            <pubDate>Sat, 14 Jan 2023 12:27:03 GMT</pubDate>
            <description><![CDATA[<h1 id="1-nodejs-란-">1. node.js 란 ?</h1>
<blockquote>
<p>Node.js를 한 문장으로 정의하면, Chrome 브라우저의 V8 Javascript 엔진을 탑재한 Server Side 오픈소스 Javascript 런타임입니다. </p>
</blockquote>
<h3 id="v8-javascript-엔진---javascript-언어로-작성된-코드를-컴퓨터가-해석하기-쉬운-바이트-코드로-변환하는-역할을-수행합니다">V8 Javascript 엔진 :  Javascript 언어로 작성된 코드를 컴퓨터가 해석하기 쉬운 바이트 코드로 변환하는 역할을 수행합니다.</h3>
<p>이렇게 속도까지 얻게 된 Javascript는 생태계가 더욱 커지게 되면서, Browser에서만 실행 가능한 Javascript를 웹 브라우저가 아닌 곳에서도 실행 가능하도록 만들고자 하는 목소리가 커지게 됩니다.</p>
<p>V8 엔진을 브라우저에서 독립시킨 Javascript의 또 다른 실행 환경(runtime)인 Node.js 탄생,
그러면서, 브라우저에서 할 수 없는 운영체제의 파일 시스템에 접근해서 파일을 조작한다든지 등의 다양한 일들이 가능하게 되었습니다.</p>
<h3 id="nodejs의-목적--이벤트-기반의-높은-처리-성능을-낼-수-있는-network-서버를-만드는-것">node.js의 목적 : 이벤트 기반의 높은 처리 성능을 낼 수 있는 network 서버를 만드는 것</h3>
<ul>
<li><p>Node.js는 주로 API 서버(HTTP 서버)를 구축하는데 활용됩니다.</p>
</li>
<li><p>Node.js 기반의 네트워크 서버(API)의 장점은 Frontend와 Backend 기술 스택 통합, 빠른 처리 속도와 높은 동시 요청 처리 성능, 그리고 MSA (Micro Service Architecture)에 적합 등이 있습니다.</p>
</li>
</ul>
<h1 id="2-nodejs-장점">2. node.js 장점</h1>
<h3 id="2-1-frontend와-backend-기술-스택-통합">2-1) Frontend와 Backend 기술 스택 통합</h3>
<ul>
<li>프론트엔드와 백엔드 양쪽에 동일한 언어 사용으로 코드를 모듈로 만들어서 재사용할 수 있음 &gt;&gt; 생산성 향상</li>
</ul>
<h3 id="2-2-빠른-처리-속도와-동시-요청-처리-성능">2-2) 빠른 처리 속도와 동시 요청 처리 성능</h3>
<ul>
<li>V8의 기능(우리가 작성한 코드를 컴퓨터가 해석하기 쉽게 함) : 성능이 매년 향상</li>
<li>libuv라는 비동기 I/O에 중점을 둔 오픈 소스 라이브러리를 사용함으로써 이벤트 기반(Event Driven), Single Thread, non-blocking I/O 모델을 구현  &gt;&gt; 지연(blocking) 없이 동시 요청을 빠르게 처리</li>
</ul>
<h3 id="2-3-msa-micro-service-architecture에-적합">2-3) MSA (Micro Service Architecture)에 적합</h3>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/f25778dc-aa28-4ff6-8ee6-4aad95fce53e/image.png" alt=""></p>
<p>MSA는 요즘 널리 사용되는 아키텍처입니다. 
MSA 구조 안에서는 기능이 추가될 때마다 기존 시스템에 더해지는 것이 아니라 가벼운 시스템을 새롭게 구축하는 방법으로 확장하게 됩니다. </p>
<p>결과적으로 Node.js는 상대적으로 가벼운 런타임이기 때문에 MSA와 아주 잘 조화되어 사용될 수 있습니다.</p>
<h3 id="2-4-풍부한-생태계라이브러리-약-80만개를-갖고-있고-json-형식을-그대로-사용할-수-있음">2-4) 풍부한 생태계(라이브러리 약 80만개)를 갖고 있고, JSON 형식을 그대로 사용할 수 있음</h3>
<blockquote>
<p>이러한 이유로 자바스크립트와 노드로 백엔드 API 서버를 구축하는 것은 좋은 선택일 수 있습니다. </p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[wecode]-(1주차 2일) 데이터베이스]]></title>
            <link>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-2%EC%9D%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</link>
            <guid>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-2%EC%9D%BC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4</guid>
            <pubDate>Sat, 14 Jan 2023 11:53:10 GMT</pubDate>
            <description><![CDATA[<h1 id="1-데이터-베이스">1. 데이터 베이스</h1>
<blockquote>
<p>📍 컴퓨터 시스템에 저장된 정보나 데이터를 모두 모아 놓은 집합</p>
</blockquote>
<p>데이터베이스를 사용하는 이유는 데이터를 휘발성으로 사라지게 하지 않고, 오래 기간 저장하며, 동시에 체계적으로 보관하기 위해서입니다.</p>
<h1 id="2-rdbms">2. RDBMS</h1>
<blockquote>
<p>📍 관계형 데이터베이스에서 모든 데이터는 2차원 테이블(table)로 표현할 수 있습니다.</p>
</blockquote>
<blockquote>
<p>📍 각 로우는 저만의 고유 키(Primary Key)가 있습니다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/575ede56-a3cb-45f3-9159-98ddac687f30/image.png" alt=""></p>
<blockquote>
<p>테이블에 저장된 데이터들의 관계에 따라 세가지 타입이 있습니다. </p>
</blockquote>
<p>1) one-to-one, 
2) one-to-many, 
3)many-to-many</p>
<h3 id="1-one-to-one">1) one to one</h3>
<blockquote>
<p>데이터들이 서로 하나씩만 연결이 된 경우</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/5815d2af-0fec-40f3-a79f-bbb3bf9de088/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/2eb05752-fd33-49a6-8e20-dec43e4117a2/image.png" alt=""></p>
<p>우리에게는 users 라는 테이블이 이미 있고, 이름 데이터들을 이미 저장해뒀는데, 같은 이름들을 중복 해서 여러번 저장하면 불필요한 메모리를 사용하게 됩니다. 따라서 user 란에 이름을 직접 저장하기 보다는 아래 그림처럼 user_id 를 저장해주는 것이죠(id는 Primary key로 항상 존재하니깐요).</p>
<p>이를 참조한다 라고 표현합니다. 
<img src="https://velog.velcdn.com/images/silver-bell/post/a717c461-444a-4fc2-86ab-2a8880fa2f2a/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/b5ebdd83-da2a-494e-b7b7-d896ddd9adcd/image.png" alt=""></p>
<blockquote>
<p>📍 1:1 은 두 테이블이 서로가 서로의 오로지 한 로우에만 연결되어야만 합니다.</p>
</blockquote>
<h4 id="-normalization정규화">*** normalization(정규화)</h4>
<blockquote>
<p>중복된 데이터를 저장하지 않음으로 디스크를 더 효율적으로 쓰고,
또한 서로 같은 데이터이지만 부분적으로만 내용이 다른 데이터가 생기는 문제가 없어집니다.</p>
</blockquote>
<ul>
<li>Foreign key(외부키)라는 개념을 사용하여 주로 연결합니다.</li>
</ul>
<h3 id="2-one-to-many">2) one to many</h3>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/73335418-7fee-4636-a73a-7cf6df207876/image.png" alt=""></p>
<p>Users 테이블의 로우 하나는 Pets 테이블의 여러 로우와 연결됩니다. Pets 테이블의 로우 하나는 Users 테이블의 로우 하나와 연결됩니다.
따라서, users 테이블이 one, pets 테이블이 many가 되겠네요</p>
<blockquote>
<p>이렇게, 한 테이블의 로우 하나가 다른 테이블의 여러 로우와 연결되는 경우를 One To Many 관계 혹은 일대다 관계라고 부릅니다. </p>
</blockquote>
<blockquote>
<p>📍 1:N 은 한 테이블의 로우 하나에 다른 테이블의 로우 여러개가 연결될 수 있습니다.
<img src="https://velog.velcdn.com/images/silver-bell/post/b4c7a1a4-7e55-4f42-8da4-72ebf15ae59b/image.png" alt=""></p>
</blockquote>
<h3 id="3-many-to-many">3) many to many</h3>
<p>우선은 테이블의 행 하나에는 딱 하나의 데이터만 들어가야 한다는 사실만 알아두세요.
<img src="https://velog.velcdn.com/images/silver-bell/post/7b6f3b30-9f68-4f7f-be59-2023ebe3edc0/image.png" alt=""></p>
<hr>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/cfaf1ae2-01ea-40b1-8a38-aa487e148557/image.png" alt=""></p>
<hr>
<p><img src="https://velog.velcdn.com/images/silver-bell/post/739dd88d-2667-4a9b-85ce-672fbbdfa92a/image.png" alt=""></p>
<h1 id="4스타벅스-메뉴판-정규화-모델링">4.스타벅스 메뉴판 정규화 모델링</h1>
<p><a href="https://dbdiagram.io/d/63bd37206afaa541e5d179b0">https://dbdiagram.io/d/63bd37206afaa541e5d179b0</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[wecode]-(1주차 1일) web 역사와 발전/ API/ 백엔드 공부 목표]]></title>
            <link>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-1%EC%9D%BC</link>
            <guid>https://velog.io/@silver-bell/wecode-1%EC%A3%BC%EC%B0%A8-1%EC%9D%BC</guid>
            <pubDate>Sat, 14 Jan 2023 10:19:30 GMT</pubDate>
            <description><![CDATA[<h1 id="1-web-역사와-발전">1. web 역사와 발전</h1>
<ul>
<li><p>인터넷(Internet)이란 전 세계의 컴퓨터가 서로 연결되어 정보를 교환할 수 있는 하나의 거대한 컴퓨터 통신망입니다.</p>
</li>
<li><p>웹(Web)이란 인터넷 네트워크를 이용하여 통신되는 정보의 집합입니다.</p>
</li>
<li><p>1세대 웹의 특징은 웹 서버가 HTML 페이지 전체와 CSS를 클라이언트에 전송하는 구조입니다.</p>
</li>
<li><p>2세대 웹의 특징은 동일한 서버에서 HTML, CSS, Javascript, 그리고 Data 전부가 클라이언트로 전송하는 구조입니다.</p>
</li>
<li><p>3세대 웹의 특징은 SPA(Single Page Application)의 등장으로 단일 HTML 페이지와 메인 Javascript 파일로 HTML 요소 생성부터 모든 페이지 및 기능을 동적으로 처리할 수 있게 됩니다.</p>
</li>
<li><p>현대 웹 시스템 아키텍처에서는 동시 접속자 수와 데이터 양의 증가로 Micro Service Architecture 구조를 갖습니다.
현대 웹 시스템 개발에는 PM, Designer, Scrum Master, Tester, Frontend Developer, Backend Developer, Full Stack Developer, DevOps, SysOps, Data Sientist, Data Engineer 직군이 필요합니다.
<img src="https://velog.velcdn.com/images/silver-bell/post/3c213550-10c1-4c6e-811f-e7e122bff007/image.png" alt=""></p>
</li>
</ul>
<h1 id="2-apiapplication-programming-interface">2. API(Application Programming Interface)</h1>
<ul>
<li><p>인터페이스(Interface)란 서로 다른 두 개의 물체가 상호간에 정보나 신호를 주고받기 위해서 필요한 접점이나 경계면을 말합니다.</p>
</li>
<li><p>사용자 인터페이스(User Interface, UI)는 인간과 컴퓨터 사이에서 의사소통을 목적으로 만들어진 물리적, 가상적 접점(매개체)을 의미합니다.</p>
</li>
<li><p>응용 프로그램(Application)이란 운영체제(MacOS, Linux, Window 등)에서 실행되는 모든 소프트웨어를 말합니다.</p>
</li>
<li><p>웹 시스템에서 API란 클라이언트 application(Chrome 브라우저)와 데이터베이스 application(MySQL, Oracle, Postgres, 인스타그램 서비스의 데이터 집합), 데이터를 읽거나 쓰기위해서 이 두 애플리케이션 사이에서 소통의 역할을 하는 접점이 API입니다.
<img src="https://velog.velcdn.com/images/silver-bell/post/5042035d-f86a-476f-b283-f8cacc32679b/image.png" alt=""></p>
</li>
</ul>
<h1 id="3-백엔드-개발자로서-wecode에서-공부-목표">3. 백엔드 개발자로서 wecode에서 공부 목표</h1>
<ul>
<li><p>주니어 개발자로 커리어를 시작하는 지금 초기에는 <strong>API 개발</strong>에서 시작해서 <strong>서비스 서버 구축 및 운영 업무</strong>까지 <strong>역량을 키우는 것을 목표</strong>로 잡는 것이 중요합니다. (내가 서버 구축이 잘되어 있는 큰 회사에 갈수도 있지만, 서버 구축이  잘 되어 있지 않은 회사에 갈 수도 있으므로)</p>
</li>
<li><p>API와 데이터베이스와의 연결(Connection)을 포함한 RESTful HTTP API 구조(아래 그림 참고)를 스스로 만들 수 있게 되는 것을 목표로 학습하시길 바랍니다.
<img src="https://velog.velcdn.com/images/silver-bell/post/c0f65471-960e-4660-a60f-56e0987a7ffc/image.png" alt=""></p>
</li>
</ul>
<ul>
<li>주차별 학습 목표 : <a href="https://study.wecode.co.kr/session/content/285">https://study.wecode.co.kr/session/content/285</a> (4-1부터 참고)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[HTML, CSS, JS] 네이버 언론사 목록 JS DOM 구현하기]]></title>
            <link>https://velog.io/@silver-bell/HTML-CSS-JS-%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%96%B8%EB%A1%A0%EC%82%AC-%EB%AA%A9%EB%A1%9D-JS-DOM-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@silver-bell/HTML-CSS-JS-%EB%84%A4%EC%9D%B4%EB%B2%84-%EC%96%B8%EB%A1%A0%EC%82%AC-%EB%AA%A9%EB%A1%9D-JS-DOM-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 05 Jan 2023 07:51:26 GMT</pubDate>
            <description><![CDATA[<p>JSFiddle 에서 연습했다. 나는 <li> tag를 DOM으로 &#39;document.createElement(&#39;li&#39;)&#39;를 매번 작성해주어야 하나 .. 고민을 했는데.. 이 코드를 for 내부에 작성함으로서 반복적으로 만들어 줄 수 있었음. </p>
<ul>
<li>HTML 코드<pre><code class="language-HTML">&lt;ul id=&quot;news-list&quot;&gt;
</code></pre>
</li>
</ul>
</ul>
```

<ul>
<li>CSS 코드
```CSS</li>
<li>{box-sizing: border-box;}</li>
</ul>
<p>#news-list li {
  height: 65px;
      border : 1px solid grey;
     display: flex;
     justify-content: center;
     align-items: center;
}</p>
<p>#news-list li img {
  height: 20px; 
}</p>
<pre><code>
- js 코드 (DOM 과 for 문을 이용)
```javascript
let arr = [&#39;https://s.pstatic.net/static/newsstand/2020/logo/light/0604/925.png&#39;,
&#39;https://s.pstatic.net/static/newsstand/2020/logo/light/0604/902.png&#39;,
&#39;https://s.pstatic.net/static/newsstand/2020/logo/light/0604/422.png&#39;,
&#39;https://s.pstatic.net/static/newsstand/up/2020/0708/nsd94830278.png&#39;]

const ul = document.getElementById(&#39;news-list&#39;)

for (i=0; i &lt; arr.length; i++) {
const newsItem = document.createElement(&#39;li&#39;)
const newsImg = document.createElement(&#39;img&#39;)

newsItem.appendChild(newsImg)

newsImg.src = arr[`${i}`]

ul.appendChild(newsItem)

}</code></pre><p>아래는 JSFiddle 페이지 에서 연습한 페이지 이미지
<img src="https://velog.velcdn.com/images/silver-bell/post/35a376a4-d1ce-40a2-9e0c-59fda13a19e3/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Replit-Js-exercise] 22. Math.random & mix/max 범위]]></title>
            <link>https://velog.io/@silver-bell/Replit-Js-exercise-22.-Math.random-mixmax-%EB%B2%94%EC%9C%84</link>
            <guid>https://velog.io/@silver-bell/Replit-Js-exercise-22.-Math.random-mixmax-%EB%B2%94%EC%9C%84</guid>
            <pubDate>Sun, 25 Dec 2022 14:23:35 GMT</pubDate>
            <description><![CDATA[<h3 id="✅-mathrandom-메소드">✅ Math.random 메소드</h3>
<pre><code class="language-javascript">Math.random()// 0 ≤ x &lt; 1 </code></pre>
<p>Math.random()은 0.000000 ~ 0.999999 중 임의 숫자(난수)를 반환한다.  </p>
<h3 id="✅-자주-사용하는-수학-관련-메소드">✅ 자주 사용하는 수학 관련 메소드</h3>
<pre><code class="language-javascript">Math.floor() // 내림버림
Math.ceil() // 오름버림
Math.round() // 반올림</code></pre>
<h3 id="✅-최솟값최댓값-지정-범위-내-랜덤-숫자">✅ 최솟값&amp;최댓값 지정 범위 내 랜덤 숫자</h3>
<h4 id="1-최댓값을-포용하지-않는-범위-min-≤-x--max">1. 최댓값을 포용하지 않는 범위 (min ≤ x &lt; max)</h4>
<pre><code class="language-javascript">function Num (min, max) {
  return Math.floor(Math.random * (max-min)) + min }</code></pre>
<ul>
<li><p>floor은 내림버림으로 0 ~ (N-1)
ex) max = 7 , Math.random = 7 x 0.99999999 = 6.999999, Math.floor(Math.random) = 6</p>
</li>
<li><p>ceil은 올림버림으로 1 ~ N</p>
</li>
</ul>
<h4 id="2-최댓값을-포용하는-범위-min-≤-x-≤-max">2. 최댓값을 포용하는 범위 (min ≤ x ≤ max)</h4>
<pre><code class="language-javascript">function Num (min, max) {
  return Math.floor(Math.random * (max+1-min)) + min }</code></pre>
<h4 id="3-해당-메소드를-이해해-보자">3. 해당 메소드를 이해해 보자.</h4>
<p>1) 최댓값(max) 범위 만들어주기 (Ex: 0 ≤ x &lt; 10)</p>
<pre><code class="language-javascript">     Math.random() * 10 </code></pre>
<p>2) 최솟값(min) 범위 만들어주기 (Ex: 2 ≤ x &lt; 10)</p>
<pre><code class="language-javascript">     (Math.random() * 10) + 2</code></pre>
<p>이렇게 되면 최솟값(2)은 만족되지만, 최댓값이 9.99999+2 = 11.9999가 되어 틀어짐. (최댓값 붕괴)</p>
<hr>
<p>3) 최솟값(2)를 더해도 9.9999로 유지하려면 최솟값을 미리 빼주면 되겠다. &gt;&gt; 최솟값 붕괴 </p>
<pre><code class="language-javascript">     (Math.random() * 10 - 2) + 2</code></pre>
<p>3-1) 최댓값 : </p>
<p>Math.random() * 10의 최대값 9.999999999999999 - 2 = 7.999999999999999
7.999999999999999 + 2 = 9.999999999999999 </p>
<p>3-2) 최솟값 : </p>
<p>Math.random() * 10의 최소값  0.0000000000000000 - 2 = -2
-2 + 2 = 0 (2가 아니라 다시 0으로 됨.. 최솟값 틀어짐)</p>
<hr>
<h4 id="4-결론--최솟값2를-더해도-99999로-유지하려면-최댓값에-미리-최솟값을-빼주면-되겠다-">4) 결론 : 최솟값(2)를 더해도 9.9999로 유지하려면 최댓값에 미리 최솟값을 빼주면 되겠다 !</h4>
<pre><code class="language-javascript">     Math.random() * (10 - 2) + 2</code></pre>
<p>3-1) 최댓값 : 
Math.random() * 10의 최대값 9.999999999999999 - 2 = 7.999999999999999
7.999999999999999 + 2 = 9.999999999999999 </p>
<p>3-2) 최솟값 : 
Math.random() * 10의 최소값  0.0000000000000000 + 2 = 2.0000000000</p>
<h3 id="✅-정-리">✅ 정 리</h3>
<p>1) Math.random * (max - min) :  0  ≤  x  &lt; (max - min)
2) + min                     : min ≤  x  &lt; (max - min) + min 
3) ∴ min ≤  x  &lt; max</p>
<hr>
<p>1) Math.random * (max + 1 - min) :  0  ≤  x  &lt; (max + 1 - min)
2) + min                     : min ≤  x  &lt; (max + 1 - min) + min 
3)  min ≤  x  &lt; max + 1 
4) ∴  min ≤  x  ≤ max</p>
<hr>
<p>ex) min = 3, max = 7, 
3 ≤ Math.floor(Math.random = 3 ~ 6.999999) &lt; 7</p>
<p>3 ≤ Math.random = Math.floor(3 ~ (6.999999 + 1 = 7.999999)) ≤ 7</p>
<hr>
<p>참고 : 
<a href="https://kangdanne.tistory.com/105">https://kangdanne.tistory.com/105</a></p>
<p><a href="https://velog.io/@mementomori/Javascript-%EC%B5%9C%EC%86%8C-%EC%B5%9C%EB%8C%80%EA%B0%92-%EC%82%AC%EC%9D%B4%EC%9D%98-%EB%9E%9C%EB%8D%A4-%EC%88%AB%EC%9E%90-%EB%BD%91%EA%B8%B0">https://velog.io/@mementomori/Javascript-%EC%B5%9C%EC%86%8C-%EC%B5%9C%EB%8C%80%EA%B0%92-%EC%82%AC%EC%9D%B4%EC%9D%98-%EB%9E%9C%EB%8D%A4-%EC%88%AB%EC%9E%90-%EB%BD%91%EA%B8%B0</a></p>
<p><a href="https://velog.io/@hope9405/%EC%99%9C-%EB%9E%9C%EB%8D%A4-%EC%A0%95%EC%88%98%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%95%8C-Math.floor%EB%A5%BC-%EC%93%B8%EA%B9%8C">https://velog.io/@hope9405/%EC%99%9C-%EB%9E%9C%EB%8D%A4-%EC%A0%95%EC%88%98%EB%A5%BC-%EB%A7%8C%EB%93%A4%EB%95%8C-Math.floor%EB%A5%BC-%EC%93%B8%EA%B9%8C</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Js] 변수 선언 방식 var, let, const]]></title>
            <link>https://velog.io/@silver-bell/Js-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%EB%B0%A9%EC%8B%9D-var-let-const</link>
            <guid>https://velog.io/@silver-bell/Js-%EB%B3%80%EC%88%98-%EC%84%A0%EC%96%B8-%EB%B0%A9%EC%8B%9D-var-let-const</guid>
            <pubDate>Fri, 16 Dec 2022 04:43:06 GMT</pubDate>
            <description><![CDATA[<h2 id="✅span-spanspan-stylecolorindianredvarspan">✅<span> </span><span style='color:indianred'>var</span></h2>
<ul>
<li>동일한 변수에 다른 값 할당이 가능하다.<pre><code class="language-javascript">var mypet = &#39;dog&#39;
console.log(mypet) // dog
</code></pre>
</li>
</ul>
<p>var mypet = &#39;cat&#39;
console.log(mypet) // cat</p>
<pre><code>
이는 나중에 코드가 길 때, 혼동을 줄 수도 있을 뿐 아니라 개발자가 동일한 변수를 사용하여 값이 변경되는 부작용이 있음. 그래서 let, const가 탄생함. 
(사담으로.. 코드에 var가 있다면 그 회사는 매우 힘든 회사일 수 있다고 누가 말해주었다.)
## ✅&lt;span&gt; &lt;/span&gt;&lt;span style=&#39;color:slateblue&#39;&gt;let&lt;/span&gt;

- 동일한 변수에 다른 값 할당이 불가능하다.
```javascript
let mypet = &#39;dog&#39;
console.log(mypet)//dog

let mypet= &#39;cat&#39;// error 발생
```

- 변수에 할당 된 값을 변경(재 할당)할 수 있다. **(이 때, &#39;변경&#39;은 메모리 주소 변경를 뜻한다. 자세한 내용은 https://charming-kyu.tistory.com/19 참고)**
```javascript
let mypet = &#39;dog&#39;
console.log(mypet)//dog

mypet = &#39;cat&#39;
console.log(mypet)//cat
```

## ✅&lt;span&gt; &lt;/span&gt;&lt;span style=&#39;color:olive&#39;&gt;const&lt;/span&gt;

- 동일한 변수에 다른 값 할당이 불가능하다

- 변수에 할당 된 값을 변경(재 할당)할 수 없다. (== 메모리 주소 변경 불가) 
```javascript
let mypet = &#39;dog&#39;
console.log(mypet)//dog

mypet = &#39;cat&#39;
console.log(mypet)// error 발생
```

- **const 변수에 객체 데이터가 할당될 때, push or pop과 같은 요소 추가/삭제가 가능한 이유** : 
push,pop을 사용하면 마치 객체 값이 변경된 것처럼 보이지만, 이는 객체가 저장된 메모리 주소는 변경이 일어나지 않고 그 주소에서 객체에 요소가 추가/삭제되기 때문에 가능함.

```javascript
let array = []

for (i=1; i&lt;=5; i++) {
  array.push(i) }

console.log(array)// array = [1,2,3,4,5]



## ✅ [정리]:

![](https://velog.velcdn.com/images/silver-bell/post/06878676-ff42-47a4-b7e9-e54d16c5365e/image.png)




</code></pre>]]></description>
        </item>
    </channel>
</rss>