<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hola_dev.log</title>
        <link>https://velog.io/</link>
        <description>생각 끄적이는 공간</description>
        <lastBuildDate>Sat, 14 Jan 2023 10:34:19 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hola_dev.log</title>
            <url>https://velog.velcdn.com/images/hola_dev/profile/c9bb601a-0fe5-4b35-8e3d-b001a40486ce/image.jpeg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hola_dev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hola_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[DB] 테스트 데이터 자동 생성]]></title>
            <link>https://velog.io/@hola_dev/DB-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%90%EB%8F%99-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@hola_dev/DB-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%9E%90%EB%8F%99-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Sat, 14 Jan 2023 10:34:19 GMT</pubDate>
            <description><![CDATA[<p>Spring 독학하며 게시판 만들기를 진행중인데,
DB 테이블 내 테스트 데이터가 필요해서 검색중에 알게 된 방법이다.
프로시저를 활용하여 자동으로 테스트 값을 주입할 수 있다.
<br></p>
<ul>
<li>코드</li>
</ul>
<pre><code class="language-sql">use board;

DELIMITER $$

CREATE PROCEDURE testDataInsert()

BEGIN
    DECLARE i INT DEFAULT 1;

    WHILE i &lt;= 120 DO
        INSERT INTO board(title, content)
            VALUES(concat(&#39;제목&#39;,i), concat(&#39;내용&#39;,i));
        SET i = i + 1;
    END WHILE;
END$$

DELIMITER $$


call testDataInsert;</code></pre>
<br>

<ul>
<li>실행 결과
<img src="https://velog.velcdn.com/images/hola_dev/post/bf31d404-4090-407e-84f4-c46cd264003c/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] 백엔드 기술면접 질문 정리]]></title>
            <link>https://velog.io/@hola_dev/Node.js-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC</link>
            <guid>https://velog.io/@hola_dev/Node.js-%EB%B0%B1%EC%97%94%EB%93%9C-%EA%B8%B0%EC%88%A0%EB%A9%B4%EC%A0%91-%EC%A7%88%EB%AC%B8-%EC%A0%95%EB%A6%AC</guid>
            <pubDate>Mon, 26 Dec 2022 02:28:04 GMT</pubDate>
            <description><![CDATA[<h4 id="질문-및-답변은-계속해서-추가하려고-한다">질문 및 답변은 계속해서 추가하려고 한다.</h4>
<p>아직 미숙한 개념이 많지만, 성장할 수 있는 기회가 많은 것이라 긍정적으로 생각하며 꾸준히 공부해나가야겠다.</p>
<hr>
<h4 id="1-http-method">1. HTTP METHOD</h4>
<ul>
<li>종류 : get, post, put, delete</li>
<li>get, post 차이<ul>
<li>get : 클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 method. 즉, 서버에서 어떤 데이터를 가져와서 보여줄 때, 값이나 내용을 바꾸지 않는 경우에 사용함.</li>
<li>post : 리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는데 사용되는 method. 서버 상의 데이터 값이나 상태를 바꾸기 위해 사용함.</li>
<li>주요 차이점으로는 get은 브라우저에 기록되지만 post는 기록되지 않음.</li>
</ul>
</li>
</ul>
<h4 id="2-http-상태-코드">2. HTTP 상태 코드</h4>
<ul>
<li>200 : OK, 요청이 성공적으로 되었음. 정보는 요청에 따른 응답 반환</li>
<li>404 : 서버는 요청받은 리소스를 찾을 수 없음. 브라우저에서 알려지지 않은 URL을 의미함.</li>
<li>503 : 서버가 요청을 처리할 준비가 되지 않았음. 유지 보수를 위해 작동이 중단되거나 과부하가 걸린 서버일 경우 발생함</li>
</ul>
<h4 id="3-프로세스와-스레드의-차이">3. 프로세스와 스레드의 차이</h4>
<ul>
<li>프로세스는 자원을 할당받는 작업의 단위이며, 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위.</li>
</ul>
<h4 id="4-rdb와-nosql의-차이">4. RDB와 NoSQL의 차이</h4>
<ul>
<li>RDBMS는 정해진 스키마가 존재하고, NoSQL은 정해진 스키마가 없다는 것이 큰 차이임.</li>
<li>NoSQL은 정해진 스키마가 없을 때 데이터 구조 변화가 자유롭고 데이터 분산이 용이하지만, 데이터 중복이 발생하거나 데이터 변경 시에 연산이 오래 걸리는 단점이 있음.</li>
</ul>
<h4 id="5-db-인덱스-사용-시-장점">5. DB 인덱스 사용 시 장점</h4>
<ul>
<li>DB의 인덱스를 잘 사용하는 것은 데이터를 검색하는 시점에 성능 차이에 큰 영향을 미침.</li>
<li>대용량 데이터를 담고 있는 DB 테이블에서 필요한 데이터를 빨리 찾기 위해 인덱스가 필요함.</li>
</ul>
<h4 id="6-데이터베이스-정규화에-대하여-설명해주세요">6. 데이터베이스 정규화에 대하여 설명해주세요.</h4>
<ul>
<li>데이터베이스의 중복을 없애는 작업을 의미함.</li>
<li>무결성 유지 및 DB 저장 용량 절감 효과를 목표로함.</li>
<li>실무에서는 보통 1,2,3 정규화 까지만 다룸.<ul>
<li>1정규화 : 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것</li>
<li>2정규화 : 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것. 기본키의 부분집합이 결정자가 되어선 안된다는 것을 의미함.</li>
<li>3정규화 : 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것</li>
<li>이행적 종속이라는 것은 A -&gt; B, B -&gt; C가 성립할 때 A -&gt; C가 성립되는 것을 의미</li>
</ul>
</li>
</ul>
<h4 id="7-비정규화는-무엇인가요">7. 비정규화는 무엇인가요?</h4>
<ul>
<li>정규형에 부합하는 테이블을 정규형을 지키지 않게 바꾸는 걸 의미함.(중복허용)</li>
<li>정규화 시 테이블이 여러 개로 나눠지므로, 조인 연산을 사용하는 경우가 빈번해짐.</li>
<li>일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 비정규화를 고려하게 된다</li>
</ul>
<h4 id="8-database-injection에-대해-아는대로-이야기해주세요">8. Database Injection에 대해 아는대로 이야기해주세요.</h4>
<h4 id="9-orm이-편하고-좋은데-sql을-알아야만-할까요">9. ORM이 편하고 좋은데, SQL을 알아야만 할까요?</h4>
<h4 id="10-rdbms와-nosql은-언제-사용하는-것이-좋을까요">10. RDBMS와 NoSQL은 언제 사용하는 것이 좋을까요?</h4>
<h4 id="11-node가-싱글스레드인데도-여러가지-병렬-작업이-되는-이유를-알려주세요">11. node가 싱글스레드인데도 여러가지 병렬 작업이 되는 이유를 알려주세요.</h4>
<ol>
<li><p>인터프리터가 비동기 함수를 만나면, 즉시 Call Stack에서 지워버린다.</p>
</li>
<li><p>이 비동기 함수는 Web API로 넘어간다.</p>
</li>
<li><p>비동기 함수는 Web API에 담겨있다가, 타이머나 로드 등이 완료되면 Callback Queue로 보내진다.</p>
</li>
<li><p>Event Loop는 Call Stack과 Callback Queue 사이에서 Call Stack이 비어있는지 주시한다.</p>
</li>
<li><p>모든 함수의 실행이 완료되고 Call Stack이 비워지면, Event Loop는 Callback Queue에 담겨있는 함수들을 먼저 들어온 순서대로 Call Stack으로 넘겨준다.</p>
<h4 id="12-세션과-쿠키의-차이를-설명해주세요">12. 세션과 쿠키의 차이를 설명해주세요.</h4>
<h4 id="13-http와-https의-차이를-설명해주세요">13. http와 https의 차이를 설명해주세요.</h4>
<h4 id="14-googlecom을-쳤을-때-벌어지는-일을-설명해주세요">14. Google.com을 쳤을 때 벌어지는 일을 설명해주세요.</h4>
<h4 id="15-알고있는-자료구조에-대해-설명해주세요">15. 알고있는 자료구조에 대해 설명해주세요.</h4>
<h4 id="16-큐와-스택의-차이에-대해-설명해주세요--언제-큐를-사용하는-것이-좋고-언제-스택을-사용하는-것이-좋을까요">16. 큐와 스택의 차이에 대해 설명해주세요 &amp; 언제 큐를 사용하는 것이 좋고, 언제 스택을 사용하는 것이 좋을까요?</h4>
<h4 id="17-리팩토링에-대하여-알고-계신가요">17. 리팩토링에 대하여 알고 계신가요?</h4>
<h4 id="18-oop에서-지향하는-바가-무엇일까요">18. OOP에서 지향하는 바가 무엇일까요?</h4>
<h4 id="19-join에-대해서-설명해-주세요">19. JOIN에 대해서 설명해 주세요.</h4>
<h4 id="20-orm이란-무엇인가요">20. ORM이란 무엇인가요?</h4>
<h4 id="21-hoisting이란">21. hoisting이란?</h4>
<h4 id="22-tdz란-무엇인가요">22. TDZ란 무엇인가요?</h4>
<h4 id="23-closure-함수란-무엇인가요">23. Closure 함수란 무엇인가요?</h4>
<h4 id="24-실행컨텍스트란-무엇인가요">24. 실행컨텍스트란 무엇인가요?</h4>
<h4 id="25-nodejs-란-무엇이며-사용하는-이유는-어떻게-되나요">25. Node.js 란 무엇이며, 사용하는 이유는 어떻게 되나요?</h4>
<h4 id="26-expressjs-란-무엇인가요">26. Express.js 란 무엇인가요?</h4>
<h4 id="27-nodejs-는-싱글스레드-멀티스레드">27. Node.js 는 싱글스레드? 멀티스레드?</h4>
</li>
</ol>
<ul>
<li>NodeJS 는 두 개의 스레드로 구성되어 있다.</li>
</ul>
<ol>
<li>이벤트 루프 (메인 스레드)</li>
<li>Thread Pool (미리 생성된, 비어 있는 스레드 그룹이다. Thread Pool 의 크기를 미리 정해놓으면 반복적인 스레드 생성/삭제 절차를 줄임으로써 프로세스의 성능을 개선할 수 있다. Nodejs 의 Thread Pool 기본값은 4 개이다) </li>
</ol>
<ul>
<li>Nodejs 는 이벤트 루프에서 작동하다가, fs 나 해싱 등의 작업이 필요한 경우 이 작업을 Thread pool 로 던져주어 새로운 thread 를 사용한다. </li>
<li>Nodejs는 이벤트 루프가 싱글 스레드에서 동작 한다는 것이지 내부적으로 스레드풀을 두어 I/O 작업에 스레드를 사용할 수 있도록 한다. 이를 통해 병렬적으로 작업을 진행할 수 있는 것입니다. 결과적으로 Nodejs 는 &#39;멀티 쓰레드&#39; 이다.</li>
</ul>
<h4 id="-참고-사이트">* 참고 사이트</h4>
<ol>
<li><a href="https://zero-base.co.kr/event/media_BE_school_qna#100">https://zero-base.co.kr/event/media_BE_school_qna#100</a></li>
<li><a href="https://velog.io/@yukina1418/%EC%B5%9C%EA%B7%BC-%EB%A9%B4%EC%A0%91%EC%9D%84-%EB%8B%A4%EB%8B%88%EB%A9%B4%EC%84%9C-%EB%B0%9B%EC%95%98%EB%8D%98-%EC%A7%88%EB%AC%B8%EB%93%A4">https://velog.io/@yukina1418/%EC%B5%9C%EA%B7%BC-%EB%A9%B4%EC%A0%91%EC%9D%84-%EB%8B%A4%EB%8B%88%EB%A9%B4%EC%84%9C-%EB%B0%9B%EC%95%98%EB%8D%98-%EC%A7%88%EB%AC%B8%EB%93%A4</a></li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링 맛보기] 스프링 입문 by 김영한]]></title>
            <link>https://velog.io/@hola_dev/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-by-%EA%B9%80%EC%98%81%ED%95%9C</link>
            <guid>https://velog.io/@hola_dev/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-by-%EA%B9%80%EC%98%81%ED%95%9C</guid>
            <pubDate>Sat, 26 Nov 2022 03:07:37 GMT</pubDate>
            <description><![CDATA[<h1 id="환경설정">환경설정</h1>
<p>프로젝트를 생성하기 전에 환경설정을 해줘야 하는데, 그 전에 준비해야 할 사항들이 있다.</p>
<h3 id="step-0-사전-준비">step 0. 사전 준비</h3>
<h4 id="사전-준비물">사전 준비물</h4>
<ol>
<li>Java 11 설치하기</li>
<li>IntelliJ(Eclipse 설치해도 되지만 해당 강의는 IntelliJ로 진행)</li>
</ol>
<h3 id="step-1-스프링-프로젝트-생성">step 1. 스프링 프로젝트 생성</h3>
<p>다음은 스프링 부트를 활용하여 프로젝트를 생성할 것이다.
아래 주소로 들어가서 생성해 보자!</p>
<p><a href="https://start.spring.io/">https://start.spring.io/</a></p>
<p><img src="https://velog.velcdn.com/images/hola_dev/post/a5c2e073-105d-4ab7-9799-0ffbb5c55b22/image.png" alt=""></p>
<ul>
<li>Project : Gradle</li>
<li>Language : Java</li>
<li>Spring Boot : 최신 정식 버전으로 설치 (단, SNAP SHOT은 미정식 버전이니 주의)</li>
<li>Project Metadata : Group, Artifact 에 원하는 ID 기입</li>
<li>Java : 11</li>
<li>Dependencies : Spring Web &amp; Thymeleaf 2개 설정</li>
</ul>
<h3 id="step-3-실행하기">step 3. 실행하기</h3>
<ul>
<li>생성된 프로젝트 내 hello.hellospring/service 내에 HelloSpringApplication 을 실행시켜준다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hola_dev/post/67fd8288-da5e-4524-9d71-c75a208f567a/image.png" alt=""></p>
<ul>
<li>다음과 같이 콘솔 창에 SPRING 글씨가 잘 보이면 정상적으로 프로젝트가 생성된 것이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hola_dev/post/4d462bec-3d0c-445c-b7e6-7408d77c3d7d/image.png" alt=""></p>
<ul>
<li>콘솔 창에 자세히 보면 &quot;Tomcat&quot;, &quot;8080&quot; 이와 같은 글씨들이 보이는데,
<a href="http://localhost:8080/">http://localhost:8080/</a>
접속해서 실제 로컬 서버에서 구동중인 페이지를 확인할 수 있다.
Tomcat은 WAS(웹 애플리케이션 서버) 인데 다음 글에서 다뤄보겠다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hola_dev/post/654c76df-93bb-45dd-8d9c-f7e2fefca8a0/image.png" alt=""></p>
<p>Referenced by <a href ="https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9E%85%EB%AC%B8-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard">김영한의 스프링 입문</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[스프링 맛보기] 스프링? 스프링부트? 차이가 뭘까]]></title>
            <link>https://velog.io/@hola_dev/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AD%98%EA%B9%8C</link>
            <guid>https://velog.io/@hola_dev/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%B0%A8%EC%9D%B4%EA%B0%80-%EB%AD%98%EA%B9%8C</guid>
            <pubDate>Thu, 24 Nov 2022 16:30:33 GMT</pubDate>
            <description><![CDATA[<h1 id="spring">Spring?</h1>
<p><strong>스프링 프레임워크</strong>(영어: Spring Framework)는 <strong>자바 플랫폼을 위한 오픈 소스 애플리케이션</strong> 프레임워크로서 간단히 스프링(Spring)이라고도 한다. 동적인 웹 사이트를 개발하기 위한 여러 가지 서비스를 제공하고 있다. 대한민국 공공기관의 웹 서비스 개발 시 사용을 권장하고 있는 전자정부 표준프레임워크의 기반 기술로서 쓰이고 있다. 특히, 국내는 <strong>&#39;자바 공화국&#39;</strong> 이라 불릴 정도로 <strong>대다수의 기업들이 Java언어 및 Spring 프레임 워크를 사용</strong>한다.</p>
<ul>
<li>참고 : 언어별 웹 개발 프레임 워크</li>
<li><em>Python - Django
Javascript - Node.js
Java - Spring*</em></li>
</ul>
<br>

<h2 id="spring-프레임워크-특징">Spring 프레임워크 특징</h2>
<h4 id="1-제어반전ioc-inversion-of-control-기반">1. 제어반전(IoC: Inversion of Control) 기반</h4>
<ul>
<li>컨트롤의 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출한다.</li>
</ul>
<h4 id="2-의존성-주입di-dependency-injection-기반">2. 의존성 주입(DI: Dependency Injection) 기반</h4>
<ul>
<li>각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결한다.</li>
</ul>
<h4 id="3-관점-지향-프로그래밍aop-aspect-oriented-programming-기반">3. 관점 지향 프로그래밍(AOP: Aspect-Oriented Programming) 기반</h4>
<ul>
<li>트랜잭션, 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리 가능하다.</li>
</ul>
<br>

<h1 id="spring-boot">Spring Boot?</h1>
<p>스프링만을 사용하여 웹 애플리케이션을 만들어 보았다면 상당히 복잡한 설정들로 인해 많은 어려움을 겪었을 것이다. 스프링부트는 <strong>스프링의 복잡한 설정을 자동화하고 단순화</strong> 하여 누구나 스프링을 쉽게 사용할 수 있게 만들었다.</p>
<h2 id="spring-boot-특징">Spring Boot 특징</h2>
<ul>
<li>Tomcat 같은 웹 서버를 내장해서 별도의 웹 서버를 설치하지 않아도 됨</li>
<li>단독으로 실행할 수 있는 스프링 어플리케이션을 쉽게 생성</li>
<li>WAS에 배포하지 않고도 실행할 수 있는 JAR파일로 Web Application을 개발 가능</li>
<li>SQL 인젝션, XSS(cross-site scripting), CSRF(cross-site request forgery), 클릭재킹(clickjacking)과 같은 보안 공격을 기본으로 막아 줌</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] MVC 패턴 구현하기]]></title>
            <link>https://velog.io/@hola_dev/Node.js-MVC-%ED%8C%A8%ED%84%B4-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hola_dev/Node.js-MVC-%ED%8C%A8%ED%84%B4-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0</guid>
            <pubDate>Mon, 12 Sep 2022 09:03:19 GMT</pubDate>
            <description><![CDATA[<h2 id="mvc란">MVC란?</h2>
<ul>
<li>Model View Controller</li>
<li>소프트웨어 설계와 관련된 디자인 패턴</li>
<li>MVC 이용 웹 프레임워크
PHP, Django, Express, Angular 등등</li>
</ul>
<br>

<h2 id="mvc-장단점">MVC 장단점</h2>
<h3 id="장점">장점</h3>
<ul>
<li>패턴들을 구분해 개발한다.</li>
<li>유지보수가 용이하다.</li>
<li>확장성이 높다.</li>
<li>협엽에 용이하다.<h3 id="단점">단점</h3>
</li>
<li>완벽한 의존성 분리가 어렵다.</li>
<li>설계 단계가 복잡하다.</li>
<li>설계 시간이 오래 걸린다.</li>
<li>클래스가 많아진다.</li>
</ul>
<br>

<h2 id="mvc-흐름">MVC 흐름</h2>
<img src = "https://i0.wp.com/hanamon.kr/wp-content/uploads/2021/09/MVC-Design-Pattern.png?fit=1920%2C1538&ssl=1" style = "width : 500px">

<ul>
<li>Model : 데이터를 처리하는 부분</li>
<li>View : UI와 관련된 것을 처리하는 부분(사용자에게 보여지는 부분)</li>
<li>Controller : View와 Model을 연결해준느 부분</li>
</ul>
<br>

<h2 id="mvc-폴더-구조">MVC 폴더 구조</h2>
<div>
<img src = "https://velog.velcdn.com/images/hola_dev/post/00090df7-bf7b-44a0-8b12-0e6d37e17744/image.png
" style = "width : 200px">
</div>

<br>

<h3 id="indexjs">index.js</h3>
<pre><code class="language-javascript">const router = require(&quot;./routes&quot;);
app.use(&#39;/&#39;, router);</code></pre>
<ul>
<li>라우터를 호출하는 코드를 작성해줌</li>
</ul>
<h3 id="routesindexjs">routes/index.js</h3>
<pre><code class="language-javascript">var express = require(&quot;express&quot;);
var controller = require(&quot;../controller/CVisitor&quot;);
const router = express.Router();

router.get(&quot;/&quot;, controller.main);

module.exports = router; // index.js를 모듈로 사용하겠다 선언</code></pre>
<ul>
<li>경로를 controller 와 연결지어 사용할 수 있음</li>
</ul>
<h3 id="controllercvisitorjs">Controller/CVisitor.js</h3>
<pre><code class="language-javascript">const Test = require(&quot;../model/Test&quot;); //controller - model 연결

exports.main = (req, res) =&gt; {
   var hi = Test.hello();
  res.send(hi);
}</code></pre>
<h3 id="modeltestjs">model/Test.js</h3>
<pre><code class="language-javascript">exports.hello = function() {
  return &quot;Welcome&quot;;
}</code></pre>
<ul>
<li>Controller 와 Model 간 연결.</li>
<li>경로와 연결된 함수 내용을 정의함.</li>
<li>경로와 연결되는 함수이기에 request 객체와 response 객체를 사용 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] 동적 파일 업로드 구현(feat. multer)]]></title>
            <link>https://velog.io/@hola_dev/Node.js-%EB%8F%99%EC%A0%81-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B5%AC%ED%98%84feat.-multer</link>
            <guid>https://velog.io/@hola_dev/Node.js-%EB%8F%99%EC%A0%81-%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EA%B5%AC%ED%98%84feat.-multer</guid>
            <pubDate>Mon, 12 Sep 2022 08:22:28 GMT</pubDate>
            <description><![CDATA[<h2 id="👀-multer-란">👀 multer 란?</h2>
<ul>
<li>파일 업로드를 위해 사용되는 미들웨어임.</li>
<li>express로 서버를 구축할 때 가장 많이 사용되는 미들웨어임.</li>
</ul>
<br>

<h3 id="🛠-multer-설치하는-방법">🛠 multer 설치하는 방법</h3>
<pre><code>npm install multer</code></pre><p>위와 같은 명령어를 터미널에 입력해주면, multer 미들웨어가 설치됨.</p>
<br>

<h3 id="✅-코드-예시">✅ 코드 예시</h3>
<h4 id="appjs">app.js</h4>
<pre><code class="language-javascript">const multer = require(&quot;multer&quot;);
const path = require(&quot;path&quot;)
const upload = multer({
    storage: multer.diskStorage({
        destination(req, file, done) {      // 목적지 지정 함수
            done(null, &#39;uploads/&#39;);
        },
        filename(req, file, done) {         // 파일 지정 함수
            const ext = path.extname(file.originalname); // &quot; .확장자 &quot; 불러오는 메소드
            done(null, path.basename(file.originalname) + ext);
        },
    }),
    limits: { fileSize: 5 * 1024 * 1024 },  // 업로드 파일 용량 제한
})</code></pre>
<ul>
<li>storage : diskStorage 메소드를 호출해서 storage를 생성할 수 있음.<ul>
<li>destination : 파일이 업로드 될 경로를 설정해줌</li>
<li>filename<ol>
<li>업로드될 파일명을 지정해줌</li>
<li>path 메소드를 통해 클라이언트에서 업로드한 파일명 + 확장자명 그대로 설정 가능</li>
</ol>
</li>
</ul>
</li>
</ul>
<br>

<pre><code class="language-javascript">// 업로드 경로 사용을 위해 선언
app.use(&#39;/uploads&#39;, express.static(&#39;uploads&#39;));</code></pre>
<ul>
<li>uploads 라는 가상의 static 저장소 경로를 설정해줌</li>
</ul>
<p><img src = "https://velog.velcdn.com/images/hola_dev/post/f0e2ef19-9060-4d04-81ec-f29b8162a116/image.png" style = "height: 200px"></img></p>
<br>

<pre><code class="language-javascript">// upload.single : 한 번에 한장 업로드
app.post(&quot;/upload&quot;, upload.single(&quot;userfile&quot;), (req, res) =&gt; {
    res.send(req.file);

})

// upload.array : 한 번에 여러장 업로드
app.post(&quot;/upload&quot;, upload.array(&quot;userfile&quot;), (req, res) =&gt; {
      console.log(req.files);
    res.send(&quot;업로드 성공!&quot;);
})

// upload.fields : 한 번에 여러 인풋 값에서 업로드
app.post(&quot;/upload&quot;, upload.fields([{ name: &quot;userfile&quot; }, { name: &quot;userfile1&quot; }]), (req, res) =&gt; {
    console.log(req.files);
    res.send(&quot;업로드 성공!&quot;);
})
</code></pre>
<ul>
<li>upload.single : 한 개 input 값에서 한 장 업로드 시 사용</li>
<li>upload.array : 한 개 input 값에서 여러 장 업로드 시 사용</li>
<li>upload.fields : 여러 개 input 값에서 여러 장 업로드 시 사용</li>
<li>각 upload 메소드 괄호 내에는 <code>&lt;input&gt;</code> 태그의 name 속성 값을 넣어주어야함.</li>
<li>예를들어 <code>&lt;input type=&quot;file&quot; name=&quot;userfile&quot; id=&quot;dynamic_file&quot;&gt;</code> 다음과 같이 설정해주었다면, <code>upload.single(&quot;userfile&quot;)</code> 이와 같이 메소드 사용을 해야함.</li>
</ul>
<br>
<br>

<h3 id="fileuploadejs">fileUpload.ejs</h3>
<pre><code>  &lt;fieldset&gt;
    &lt;legend&gt;개인 정보&lt;/legend&gt;
    &lt;form&gt;
      아이디: &lt;input type=&quot;text&quot; name=&quot;ID&quot;&gt;&lt;br&gt;
      비밀번호: &lt;input type=&quot;password&quot; name=&quot;password&quot;&gt;&lt;br&gt;
      이름: &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;&lt;br&gt;
      나이: &lt;input type=&quot;text&quot; name=&quot;age&quot;&gt;&lt;br&gt;
      프로필 사진:
      &lt;input type=&quot;file&quot; name=&quot;userfile&quot; id=&quot;dynamic_file&quot;&gt;&lt;br&gt;
      &lt;button type=&quot;reset&quot;&gt;리셋&lt;/button&gt;
      &lt;button type=&quot;button&quot; onclick=&quot;fileUpload();&quot;&gt;회원가입&lt;/button&gt;
      &lt;img src=&quot;&quot; alt=&quot;&quot;&gt;
    &lt;/form&gt;
  &lt;/fieldset&gt;</code></pre><img src = "https://velog.velcdn.com/images/hola_dev/post/e25e68cc-6fac-4fec-b4bb-07f2ab8b93c5/image.png" style = "width: 500px">

<ul>
<li><code>파일선택</code> 버튼으로 프로필 사진 선택 후 <code>회원가입</code> 버튼을 누를 시 동적으로 사진을 프로필 하단부에 출력</li>
<li>미리 만들어놓은 <code>&lt;img&gt;</code> 태그에 <code>src</code> 속성만 추가해서 화면에 출력</li>
</ul>
<pre><code class="language-javascript">    function fileUpload() {
      var form = document.querySelector(&quot;form&quot;);
      const formData = new FormData();      // 파일 담아 전달할 form 생성
      const file = document.getElementById(&quot;dynamic_file&quot;);
      formData.append(&quot;userfile&quot;, file.files[0]);    // 전달할 파일 form에 추가

      axios({
        headers: {
          &quot;Content-Type&quot;: &quot;multipart/form-data&quot;,
        },
        url: &quot;/upload&quot;,
        method: &quot;post&quot;,
        data: formData          // formData 전송
      }).then((response) =&gt; {
        $(&quot;img&quot;).attr(&quot;src&quot;, response.data.path); // 응답으로 온 이미지 경로를 통해 화면에 이미지 표시
      })
    }</code></pre>
<ul>
<li><code>res.send(req.file)</code>  서버에서 온 응답을 axios 내 promise 형식을 통해 전달 받은 뒤, 해당 파일의 경로인 <code>response.data.path</code> 를 이미지 태그에 추가해서 화면에 보여줌. </li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript] 비동기 HTTP 통신]]></title>
            <link>https://velog.io/@hola_dev/Javascript-%EB%B9%84%EB%8F%99%EA%B8%B0-HTTP-%ED%86%B5%EC%8B%A0</link>
            <guid>https://velog.io/@hola_dev/Javascript-%EB%B9%84%EB%8F%99%EA%B8%B0-HTTP-%ED%86%B5%EC%8B%A0</guid>
            <pubDate>Fri, 09 Sep 2022 14:45:42 GMT</pubDate>
            <description><![CDATA[<h2 id="✋-들어가기-전">✋ 들어가기 전</h2>
<ul>
<li><code>&lt;input type=&quot;submit&quot;&gt;</code> 이나 <code>&lt;button type = &quot;submit&quot;&gt;</code> 을 이용해 전송</li>
<li>전송 시 페이지가 이동이 되는데 이러한 방식을 정적인 폼전송 방식이라고 한다.</li>
</ul>
<h2 id="📞-비동기-http-통신">📞 비동기 HTTP 통신</h2>
<p><img src = "https://velog.velcdn.com/images/hola_dev/post/f7078642-07db-4427-bd57-1995e0bf6c36/image.png" style = "width:400px; height:300px;"></img></p>
<ul>
<li>아마 대부분의 사람들이 로그인 시 틀렸을 때 페이지는 이동하지 않고 위의 예시의 빨간 글씨처럼 글자만 생기는 것을 본 경험이 있을 것이다.</li>
<li>이와 같은 방식을 비동기 HTTP 통신을 활용한 <strong>동적인 폼전송</strong>이라고 할 수 있다.</li>
</ul>
<br>

<h3 id="1-동기-방식">1. 동기 방식</h3>
<ul>
<li>한번에 하나만 처리하며, 페이지를 아예 이동한 후 서버가 데이터를 처리함.<h3 id="2-비동기-방식">2. 비동기 방식</h3>
</li>
<li>서버에 데이터를 보내고 응답을 기다리는 동안 다른 처리가 가능 !</li>
<li>폼의 데이터를 서버와 <strong>dynamic</strong> 하게 송수신 하는 것</li>
<li><strong>dynamic</strong> : 웹 문서가 정적으로 멈춰있는 것이 아니라 일부 내용이 실시간으로 변경되는 것</li>
</ul>
<h2 id="🧐-비동기-http-통신-방법">🧐 비동기 HTTP 통신 방법</h2>
<p>✅ AJAX
✅ AXIOS
✅ FETCH</p>
<br>

<h3 id="1-ajax">1. AJAX</h3>
<ul>
<li>Asynchronous Javascript And XML</li>
<li>자바스크립트를 이용해 클라이언트와 서버 간에 데이터를 주고 받는 비동기 HTTP 통신<h4 id="장점">장점</h4>
</li>
<li>JQuery를 통해 쉽게 구현 가능</li>
<li>Error, Success, Complete의 상태를 통해 실행 흐름을 조절할 수 있다.</li>
</ul>
<h4 id="단점">단점</h4>
<ul>
<li>JQuery를 사용해야만 간편하고 호환성이 보장된다.<strong>(xml 사용은 복잡)</strong></li>
<li>Promise 기반이 아니다.</li>
</ul>
<h4 id="예시">예시</h4>
<pre><code class="language-javascript">$.ajax({
    url: &quot;/ajax&quot;,
    type: &quot;POST&quot;,
    data: data,
    success: function(data){
          console.log(data);
    }
})</code></pre>
<br>

<h3 id="2-axios">2. AXIOS</h3>
<ul>
<li>Node.js와 브라우저를 위한 <strong>Promise API 활용</strong></li>
<li>비동기 HTTP 통신이 가능, return이 Promise 객체로 온다.<h4 id="장점-1">장점</h4>
</li>
<li>Promise 기반으로 만들어져 사용이 편리함.</li>
<li>브라우저 호환성이 뛰어남.</li>
</ul>
<h4 id="단점-1">단점</h4>
<ul>
<li>모듈 설치 or 호출을 해줘야 사용이 가능함.</li>
</ul>
<h4 id="예시-1">예시</h4>
<pre><code class="language-javascript">var data = {
    name : &quot;홍길동&quot;,
      gender : &quot;남자&quot;,

}

axios({
    method: &quot;post&quot;,
    url: &quot;/axios&quot;,
    data: data // get -&gt; `params: data`
}).then((response) =&gt; {
    console.log(response.data);
});</code></pre>
<br>

<h3 id="3-fetch">3. FETCH</h3>
<ul>
<li>ES6부터 들어온 Javascript 내장 라이브러리</li>
<li><strong>Promise 기반</strong><h4 id="장점-2">장점</h4>
</li>
<li>Promise 기반으로 만들어져 사용이 편리함.</li>
<li>Javascript 내장 라이브러리이므로 별도의 import 필요가 없음.</li>
</ul>
<h4 id="단점-2">단점</h4>
<ul>
<li>최신 문법</li>
<li>Timeout 기능이 없음.</li>
<li>Axios에 비해 상대적으로 기능이 부족함.</li>
</ul>
<h4 id="예시-2">예시</h4>
<pre><code class="language-javascript">// fetch - get 방식
var urlQuery = `?name=${form.name.value}&amp;gender=${form.gender.value}`;

fetch(&quot;/fetch&quot; + urlQuery, {
    method: &quot;get&quot;,
})
.then((response) =&gt; response.json()) // AXIOS와 다르게 json 형태로 파싱.
// .then((response) =&gt; response.text()) : res.send(&quot;문자열&quot;) 일 경우
.then((data) =&gt;{
    console.log(data);
})

// fetch - post 방식
fetch(&quot;/fetch&quot;, {
    method: &quot;post&quot;,
      headers: {
          &quot;Content-Type&quot;: &quot;application/json&quot;,
    },
    body: JSON.stringify(data)
})
.then((response) =&gt; response.json()) // AXIOS와 다르게 json 형식을 거침.
.then((data) =&gt;{
    console.log(data);
})</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript] Form 전송]]></title>
            <link>https://velog.io/@hola_dev/Javascript-Form-%EC%A0%84%EC%86%A1</link>
            <guid>https://velog.io/@hola_dev/Javascript-Form-%EC%A0%84%EC%86%A1</guid>
            <pubDate>Fri, 09 Sep 2022 02:16:26 GMT</pubDate>
            <description><![CDATA[<p>먼저 Form 전송을 하기 전에 <strong>사전 작업</strong>을 해주면 편한 것이 있다.
<strong>body-parser</strong> 라는 라이브러리인데 설정해 두면 후에 post 방식으로 form 전송 시 훨씬 편하게 작업할 환경이 구축된다.</p>
<h3 id="body-parser">Body-parser</h3>
<ul>
<li>데이터를 쉽게 처리할 수 있도록 도와주는 라이브러리</li>
<li>post로 정보를 전송할 때 body로 받을 수 있게 도와준다.</li>
<li>아래와 같이 app.js 에 선언해주면 된다.<pre><code class="language-javascript">app.use(express.urlencoded({extended: false}));
app.use(express.json());</code></pre>
</li>
</ul>
<hr>

<h1 id="📔-form">📔 Form</h1>
<ul>
<li>입력된 데이터를 한번에 서버에 전송하기 위해 사용됨.</li>
<li>속성 : action, name, target, method</li>
<li>구성요소 : input, select, textarea, button 등</li>
</ul>
<br>

<h3 id="1-form-전송방식">1. Form 전송방식</h3>
<h4 id="✅-get">✅ GET</h4>
<ul>
<li><p>데이터를 URL의 뒤에 ?를 붙여 전달</p>
</li>
<li><p>전송량에 제한이 있고, 사용자에게 데이터가 노출됨. URL 형식에 맞는 인코딩 필요</p>
</li>
<li><p><strong>예시(GET)</strong>
<img src="https://velog.velcdn.com/images/hola_dev/post/1e1fa2c0-266e-4270-a5cd-6a3a0ba3c680/image.png" alt=""></p>
</li>
</ul>
<h4 id="✅-post">✅ POST</h4>
<ul>
<li>HTTP POST 요청은 클라이언트에서 서버로 전송할 때 추가적인 데이터를 body에 포함.</li>
<li>전송량에 제한이 없고, 사용자에게 데이터가 보이지 않음. (암호화는 안됨) </li>
</ul>
<br>

<h3 id="2-form-사용방법">2. Form 사용방법</h3>
<h4 id="✅-method">✅ method</h4>
<ul>
<li>HTML의 <code>&lt;form&gt;</code> 태그에 method=&quot;POST&quot; 또는 method=&quot;GET&quot;(기본값) 속성을 설정하여 사용할 수 있음.<h4 id="✅-action">✅ action</h4>
</li>
<li>form 으로 데이터 전송 시 데이터가 도착할 URL을 나타내줌</li>
<li>ex) <strong>&quot;/get&quot;</strong> 으로 설정 시 <strong>localhost:8000/get</strong> 으로 데이터 전송<h4 id="✅-button-type">✅ button type</h4>
</li>
<li>button : 해당 버튼이 클릭할 수 있는 버튼임을 명시하며, 페이지를 이동하지 않고 보통 onclick 함수 선언 시 사용</li>
<li>submit : <code>&lt;form&gt;</code> action 속성에 지정한 위치로 페이지를 이동</li>
<li>reset : 폼 데이터를 초기화 하는 버튼</li>
</ul>
<br>

<h3 id="3-form-데이터-전송viewsmainejs">3. Form 데이터 전송(Views/main.ejs)</h3>
<pre><code class="language-html">&lt;body&gt;
  &lt;!-- GET 요청 --&gt;
  &lt;div class=&quot;get&quot;&gt;
    GET 요청하기
    &lt;form method=&quot;get&quot; action=&quot;/get&quot;&gt; 
      &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
      &lt;input type=&quot;text&quot; name=&quot;gender&quot;&gt;
      &lt;button type=&quot;submit&quot;&gt;전송&lt;/button&gt;
      &lt;button type=&quot;reset&quot;&gt;리셋&lt;/button&gt;
    &lt;/form&gt;
  &lt;/div&gt;

  =&gt; input 값으로 홍길동, 남 을 입력해주면 다음과 같은 결과가 URL에 나타남.
  =&gt; localhost:8000/get?name=홍길동&amp;gender=남

  &lt;!-- POST 요청 --&gt;
  &lt;div class=&quot;post&quot;&gt;
    POST 요청하기
    &lt;form method=&quot;post&quot; action=&quot;/post&quot;&gt;
      &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
      &lt;input type=&quot;text&quot; name=&quot;gender&quot;&gt;
      &lt;button type=&quot;submit&quot;&gt;전송&lt;/button&gt;
      &lt;button type=&quot;reset&quot;&gt;리셋&lt;/button&gt;
    &lt;/form&gt;
  &lt;/div&gt;
&lt;/body&gt;


=&gt; post는 URL에 개인 정보를 포함하지 않으므로 다음과 같이 나타남.
=&gt; localhost:8000/post
</code></pre>
<br>

<h3 id="4-전송된-form-데이터-받기appjs">4. 전송된 Form 데이터 받기(app.js)</h3>
<pre><code class="language-javascript">app.get(&quot;/get&quot;, (req, res) =&gt; {
console.log(req.query);
});

app.post(&quot;/post&quot;, (req, res) =&gt; {
console.log(req.body);
});
</code></pre>
<ul>
<li>main.ejs(<strong>클라이언트</strong>) 에서 요청한 데이터를 app.js(<strong>서버</strong>) 에서 다음과 같이 받아줌.</li>
<li><strong>get</strong> 방식으로 전송한 데이터는 <strong>req.query</strong>로 받고, <strong>post</strong> 방식은 <strong>req.body</strong>로 받음.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] ejs 템플릿 문법]]></title>
            <link>https://velog.io/@hola_dev/Node.js-ejs-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@hola_dev/Node.js-ejs-%ED%85%9C%ED%94%8C%EB%A6%BF-%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Thu, 08 Sep 2022 08:29:25 GMT</pubDate>
            <description><![CDATA[<h2 id="ejs-문법-종류">EJS 문법 종류</h2>
<ul>
<li><strong>&lt;% %&gt;</strong> : 흐름 제어문</li>
<li><strong>&lt;%= %&gt;</strong> : 변수 사용 시 활용</li>
<li><strong>&lt;%-include(&#39;view의 상대주소&#39;) %&gt;</strong> : 다른 ejs 파일을 불러옴</li>
</ul>
<br>

<h3 id="❌-주의사항">❌ 주의사항</h3>
<ul>
<li>ejs 문법 사용 시에는 <strong>반드시 한줄</strong>에 작성해야함 ❗️</li>
</ul>
<br>

<h4 id="1--">1. &lt;% %&gt;</h4>
<ul>
<li><strong>예시</strong><pre><code class="language-html">&lt;!-- 잘못된 사용법 --&gt;
&lt;% for (var i=0; i &lt; 10; i++) {
&lt;span&gt; ejs test &lt;/span&gt;
} %&gt;
</code></pre>
</li>
</ul>
<!-- 올바른 사용법 -->
<p>  &lt;% for (var i=0; i &lt; 10; i++) { %&gt;
  <span> ejs test </span>
  &lt;% } %&gt;</p>
<pre><code>- **실행결과**
![](https://velog.velcdn.com/images/hola_dev/post/4e0ab3d9-d3a1-404b-8dc9-47baaf965b0a/image.png)

&lt;br&gt;

#### 2.&lt;%= %&gt;

- **예시**
```html
  &lt;% for (var i=0; i &lt; 10; i++) { %&gt;
  &lt;span&gt;no.&lt;%=i %&gt; &lt;/span&gt;
  &lt;% } %&gt;</code></pre><ul>
<li><strong>실행결과</strong>
<img src="https://velog.velcdn.com/images/hola_dev/post/36b99678-1e0b-4adb-be5d-ea5bdff78ea1/image.png" alt=""></li>
</ul>
<br>

<h4 id="3-include-">3.&lt;%-include %&gt;</h4>
<ul>
<li><strong>예시</strong><pre><code class="language-html">&lt;!-- test.ejs --&gt;
&lt;body&gt;
&lt;div&gt;안녕하세요 !&lt;/div&gt;
&lt;%-include(&quot;test1.ejs&quot;) %&gt;
&lt;/body&gt;</code></pre>
</li>
</ul>
<pre><code>&lt;!-- test1.ejs --&gt;
&lt;div&gt;반가워요 !&lt;/div&gt;</code></pre><ul>
<li><strong>실행결과</strong>
<img src="https://velog.velcdn.com/images/hola_dev/post/248981d7-67af-433b-842b-e11db37f2d0a/image.png" alt=""></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] ejs 템플릿 사용하기]]></title>
            <link>https://velog.io/@hola_dev/Node.js-ejs-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hola_dev/Node.js-ejs-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 08 Sep 2022 08:04:19 GMT</pubDate>
            <description><![CDATA[<h2 id="👀-ejs-템플릿이란">👀 EJS 템플릿이란?</h2>
<ul>
<li>템플릿 엔진 : 문법과 설정에 따라 파일을 html 형식으로 변환시키는 모듈</li>
<li>ejs : <strong>Embedded Javascript</strong> 의 약자로, 자바스크립트가 내장되어 있는 html 파일이며, <strong>.ejs</strong> 라는 확장자를 가짐</li>
</ul>
<h3 id="✅-ejs-템플릿-사용하기">✅ EJS 템플릿 사용하기</h3>
<pre><code>npm install ejs</code></pre><ul>
<li>다음과 같은 명령어를 통해 ejs를 설치해준다.<pre><code class="language-javascript">app.set(&quot;view engine&quot;, &quot;ejs&quot;);</code></pre>
</li>
<li>위의 명령어를 통해 ejs 템플릿을 사용할 수 있다.</li>
</ul>
<h3 id="✅-사용-예시">✅ 사용 예시</h3>
<pre><code class="language-javascript">// express 인스턴스 생성 및 app에 저장
const express = require(&quot;express&quot;);
const app = express();

// 8000번 포트로 지정
const port = 8000;

// 화면 엔진은 ejs로 설정한다.
app.set(&quot;view engine&quot;, &quot;ejs&quot;);

// Express에서 정적파일 제공
app.use(&#39;/static&#39;, express.static(&#39;static&#39;));

// test.ejs 실행
app.get(&quot;/&quot;, (req, res) =&gt; {
    res.render(&quot;test&quot;);
})

// 지정된 포트로 로컬서버 열기
app.listen(port, () =&gt; {
    console.log(&quot;server open&quot;, port);
})</code></pre>
<ul>
<li>app.js 파일 생성하여 위 내용을 기입하면, express 모듈과 ejs 템플릿을 사용가능</li>
<li>views 폴더에 만든 test.ejs 파일을 불러와서 localhost에서 실행해준다.</li>
<li>실행 시 <strong>node app.js</strong> 라는 명령어를 해당 디렉토리 터미널에서 실행
<img src="https://velog.velcdn.com/images/hola_dev/post/9992519c-f5f6-4519-bbc6-2cc9dc4bbc89/image.png" alt=""></li>
<li>웹브라우저에서 <strong>localhost:8000</strong> 에 들어가면 정상적으로 실행되는 것을 확인 가능함.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] Express 모듈 사용하기]]></title>
            <link>https://velog.io/@hola_dev/Node.js-Express-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hola_dev/Node.js-Express-%EB%AA%A8%EB%93%88-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 08 Sep 2022 07:39:09 GMT</pubDate>
            <description><![CDATA[<h2 id="👀-모듈이란">👀 모듈이란?</h2>
<ul>
<li>Node.js에서 모듈이란 <strong>필요한 함수들의 집합</strong>을 의미함.<br>
### 모듈 사용방법

</li>
</ul>
<pre><code class="language-javascript">const test_module = require(”module_name”)👀</code></pre>
<ul>
<li>다음과 같은 변수 선언을 통해 모듈을 선언할 수 있음<br>
## 👀 Express 모듈이란?</li>
<li>웹 서버를 생성하는 것과 관련된 기능을 담당하는 프레임워크</li>
<li>웹 애플리케이션을 만들기 위한 각종 메소드와 미들웨어 등이 내장되어 있다.</li>
<li>http 모듈만 사용해서 서버를 구성할 수도 있지만, 이 경우엔 직접 설정해야 하는것들이 많아짐</li>
<li>이로 인해 사용하는 것이 바로 Express 모듈 !!</li>
</ul>
<h3 id="1-express-설치하기">1. Express 설치하기</h3>
<pre><code>npm install express</code></pre><ul>
<li><strong>package.json</strong> 의 <strong>dependencies</strong>에 express가 기록됨</li>
</ul>
<p><img src = "https://velog.velcdn.com/images/hola_dev/post/f951fcdd-1e36-4b67-a9ad-88d20d8c9ff3/image.png" style = "width : auto; height : 200px; margin : 0; "></img></p>
<h3 id="2-express-사용하기">2. Express 사용하기</h3>
<pre><code class="language-javascript">const express = require(&#39;express&#39;);
const app = express();
const port = 8000;

app.get(&#39;/&#39;, (req,res) =&gt; {
res.send(&quot;hello express&quot;);
});

app.listen(port, () =&gt; {
console.log( port + &#39; is Open..&#39;)
});</code></pre>
<ul>
<li>express() : epxress 모듈이 export 하는 최상위 함수로, express application을 만듦</li>
<li>app 객체 : express() 함수를 호출함으로써 만들어진 express application</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] npm 사용하기]]></title>
            <link>https://velog.io/@hola_dev/Node.js-npm-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hola_dev/Node.js-npm-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 08 Sep 2022 07:22:12 GMT</pubDate>
            <description><![CDATA[<h2 id="🛠-npm-사용방법">🛠 npm 사용방법</h2>
<pre><code>npm init</code></pre><ul>
<li>다음 명령어를 터미널에서 실행시켜주면 여러가지 설정 값들이 나오는데, 특별히 설정할 것이 없으면 계속 Enter를 쳐서 기본값으로 셋팅해주면 된다.<pre><code>npm init —yes
npm init -y</code></pre></li>
<li>기본값으로 바로 셋팅하고 싶으면 <strong>위 명령어 중 하나</strong>를 선택하면 굳이 Enter를 연타하지 않고도 <strong>바로 npm을 사용</strong>할 수 있다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hola_dev/post/2c77e1b9-9bec-4ecc-94c5-6ccb000ebaf2/image.png" alt=""></p>
<ul>
<li>완료되면 다음과 같이 <strong>package.json</strong> 파일이 생긴 것을 확인할 수 있다.</li>
</ul>
<h3 id="➕-모듈-설치하기">➕ 모듈 설치하기</h3>
<pre><code>npm install [패키지명]</code></pre><ul>
<li>다음과 같은 명령어를 통해서 원하는 <strong>모듈</strong>을 설치할 수 있다.</li>
<li>모듈 설치 여부는 package.json 파일 내 <strong>&quot;dependencies&quot;</strong>에서 확인 가능</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] Node.js 및 npm 설치하기]]></title>
            <link>https://velog.io/@hola_dev/Node.js-Node.js-%EB%B0%8F-npm-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@hola_dev/Node.js-Node.js-%EB%B0%8F-npm-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 08 Sep 2022 07:09:18 GMT</pubDate>
            <description><![CDATA[<h2 id="설치-방법">설치 방법</h2>
<h3 id="1-로컬에서-설치하기">1. 로컬에서 설치하기</h3>
<ul>
<li><a href="https://nodejs.org/ko/">https://nodejs.org/ko/</a></li>
<li>Node.js 공식 사이트에 접속하여 원하는 버전을 다운로드 받는다.
<img src="https://velog.velcdn.com/images/hola_dev/post/e082809e-2617-4e5d-91df-dbcd3ac7d61c/image.png" alt=""></li>
</ul>
<h3 id="2-서버에서-설치하기">2. 서버에서 설치하기</h3>
<pre><code>apt-get install nodejs
apt-get install npm</code></pre><ul>
<li>터미널에서 다음과 같은 명령어를 입력해 nodejs와 npm을 설치해준다.<pre><code>node -v
npm -v</code></pre></li>
<li>다음과 같은 명령어를 활용해 설치가 제대로 되었는지 확인해준다.</li>
<li>아래와 같이 정상적으로 버전이 나오면 성공 !
<img src="https://velog.velcdn.com/images/hola_dev/post/d1eb9dec-112b-4e7f-8999-c21ad3903473/image.png" alt=""></li>
</ul>
<h3 id="🖐-npm-이란">🖐 npm 이란?</h3>
<ul>
<li>Javascript로 개발된 각종 모듈의 설치, 업데이트, 구성, 제거 과정을 자동화하여 관리해주는 기능</li>
<li>Node Package Manager (<a href="https://www.npmjs.com">https://www.npmjs.com</a>)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Node.js] 정의와 특징]]></title>
            <link>https://velog.io/@hola_dev/Node.js-%EC%A0%95%EC%9D%98%EC%99%80-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@hola_dev/Node.js-%EC%A0%95%EC%9D%98%EC%99%80-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Thu, 08 Sep 2022 06:59:03 GMT</pubDate>
            <description><![CDATA[<h2 id="👀-nodejs란">👀 Node.js란?</h2>
<ul>
<li>구글 크롬의 자바스크립트 엔진(V8 Engine)에 기반해 만들어진 Javscript 런타임</li>
<li>이벤트 기반, 비동기 I/O 모델을 사용해 가볍고 효율적</li>
<li>npm 패키지는 세계에서 가장 큰 오픈 소스 라이브러리</li>
</ul>
<h3 id="👉-npm이란">👉 npm이란?</h3>
<ul>
<li>Node Package Manager의 약어</li>
<li>Javascript로 개발된 각종 모듈의 설치, 업데이트, 구성, 제거 과정을 자동화하여 관리해주는 기능을 함</li>
</ul>
<h2 id="🧐-nodejs-특징">🧐 Node.js 특징</h2>
<h3 id="👉----1-자바스크립트-언어-사용">👉    1. 자바스크립트 언어 사용</h3>
<h3 id="👉----2-single-thread">👉    2. Single Thread</h3>
<ul>
<li>Single Thread 는 주어진 일을 <strong>하나씩</strong> 밖에 처리하지 못한다.</li>
<li>에러가 발생하여 처리하지 못하면 중단하기 때문에, <strong>에러처리가 중요.</strong></li>
<li>참고하기 좋은 글 &gt; <a href ="https://velog.io/@gil0127/%EC%8B%B1%EA%B8%80%EC%8A%A4%EB%A0%88%EB%93%9CSingle-thread-vs-%EB%A9%80%ED%8B%B0%EC%8A%A4%EB%A0%88%EB%93%9C-Multi-thread-t5gv4udj">싱글스레드와 멀티스레드의 차이</a><h3 id="👉----3-비동기-io-방식">👉    3. 비동기 I/O 방식</h3>
</li>
<li>작업을 요청한 후 응답을 기다리지 않고 다른 활동을 한다.</li>
<li>장점 : 요청에 따른 결과가 반환되는 시간동안 다른 작업을 수행할 수 있다.</li>
<li>단점 : 동기식보다 설계가 복잡하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[핀테크에 대한 고찰]]></title>
            <link>https://velog.io/@hola_dev/%ED%95%80%ED%85%8C%ED%81%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0</link>
            <guid>https://velog.io/@hola_dev/%ED%95%80%ED%85%8C%ED%81%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0</guid>
            <pubDate>Sun, 28 Aug 2022 13:29:08 GMT</pubDate>
            <description><![CDATA[<p><a href="https://www.flaticon.com/kr/free-icons/-" title="핀 테크 아이콘">핀 테크 아이콘  제작자: Eucalyp - Flaticon</a></p>
<p>오늘날 우리 주변에는 정말 많은 형태의 핀테크 사업들이 존재하고 있으며, 우리들은 그러한 풍요로운 금융 기술의 수혜 속에 살고 있다고 생각한다. 하지만, 불과 5년전만 해도 핀테크 사업에 대해 회의적인 생각을 나타내는 전문가들이 많았다. 그 이유는 정부의 불필요한 규제와 스타트업 창업에 대한 기피 현상 등등이 있었다. 하지만, 시간이 흐른만큼 규제도 완화되고 스타트업 시장에 열풍이 불었던 탓인지 핀테크는 오늘날 없어서는 안될 중요한 사업으로 자리매김하게 되었다.</p>
<h2 id="1-핀테크란">1. 핀테크란?</h2>
<p>그렇다면 핀테크란 과연 무엇일까?</p>
<blockquote>
<p>Finantial + Technology -&gt; <strong>FinTech</strong></p>
</blockquote>
<p>위에서 보는것과 같이 <strong>금융(Finance)</strong>과 <strong>기술(Technology)</strong>의 합성어의 준말이다. 처음 해당 용어를 들었을때는 참 신기했다. 보수를 대표하는 업종인 금융과 진보를 대표하는 업종인 기술의 조화라니..
참 아이러니했다. 아무튼, 핀테크는 또한 금융 서비스를 모바일 인터넷 환경으로 옮기는 것을 말한다. 이 때문에 스타트업을 찾기 힘든 분야였던 금융업에서도 스타트업이 나타나고 있다. 역시 이쪽 분야의 기술들이 그렇지만 빅데이터가 중요하며, 최근에는 <strong>블록체인</strong> 기술에 기반을 둔 기업도 점차 등장하고 있다. 블록체인의 중요성에 대해서는 추후 나올 예정이다.</p>
<h2 id="2-핀테크-사례">2. 핀테크 사례</h2>
<p>핀테크에는 정말 많은 업종들이 있다. <strong>단순한 결제서비스</strong>에서 부터 <strong>대출, 주식, 송금, 자산관리 등</strong> 다양한 종류가 있다.</p>
<h3 id="2-1-송금서비스--토스">2-1 송금서비스 : 토스</h3>
<img src = "https://play-lh.googleusercontent.com/0tayCLosahuLdWB0_RB_BGt8jxx9RgyJMTliA4WlRcAM78ZgQG-4Ofe9PYUAwMOF_jE" style="width: 500px;">

<p><strong>토스(Toss)</strong> 는 2013년 8월에 설립된 대한민국의 핀테크 스타트업 비바리퍼블리카가 운영하는 종합 금융 플랫폼 겸 메신저로 간편 송금을 주 기능으로 한다. 과거 대한민국 은행 앱은 매우 불편하였다. 상대방에게 송금을 하기 위해서는 공인인증서와 보안카드는 필수였다. 이것을 해결한 것이 바로 토스의 <strong>간편송금 서비스</strong>이며, 이로 인해 송금 기능에 있어서 간편성과 신속성이 정말로 크게 향상되는데 기여하였다. 현재는 송금 기능 이외에도 자산관리 및 다양한 서비스들을 제공하고있다. 한국에서 가장 유망한 핀테크 기업 중 하나이며, 많은 개발자들이 가고자 하는 기업이기도 하다.</p>
<h3 id="2-2-결제서비스--삼성페이">2-2 결제서비스 : 삼성페이</h3>
<img src = "http://www.koreapost.co.kr/news/photo/202008/50086_49427_2055.jpg" style="width: 500px;">

<p><strong>삼성페이(Samsung Pay)</strong> 는 삼성전자가 2015년 3월에 공개한 간편 결제 서비스이며, 세계 최초로 MST(Magnetic Secure Transmission)와 NFC를 동시에 지원하는 온/오프라인 핀테크 결제 플랫폼이다. 신용카드, 디지털 ID, 블록체인 계좌, 학생증, 차 키, 영화 및 공연 등의 입장권 티켓 서비스, 비행기 탑승권 등을 등록할 수 있으며, 등록된 정보를 홍채인식, 지문인식을 이용하여 쓸 수 있다. 또한 온라인에서도 결제 시 사용할 수 있는 <strong>디지털 페이먼트(Digital Payments)</strong> 기능을 제공하며, 교통카드 기능도 제공하여 휴대폰을 기기에 대기만 하면 편리하게 승하차가 가능하다.</p>
<h3 id="2-3-크라우드펀딩--와디즈">2-3 크라우드펀딩 : 와디즈</h3>
<img src = "https://static.wadiz.kr/assets/og/share.jpg" style="width: 500px;">

<p><strong>와디즈(WADIZ)</strong> 는 2012년 5월 설립 이래 창업 리워드형 크라우드펀딩 뿐만 아니라, 투자형 펀딩부터 직접 투자까지 가능한 크라우드펀딩 플랫폼이다. 현재 규모, 프로젝트 건수, 중개 금액 면에서 <strong>국내 최대의 크라우드펀딩 기업</strong>이다. 와디즈의 ‘와디(WADI)’는 <strong>‘사막이 흐르는 강’</strong> 을 의미한다. 그런 이유로 와디즈(WADIZ)는 자금을 필요로 하는 많은 사람들에게 여러개의 ‘와디’가 되어 주겠다는 의미가 숨어있다. 스타트업은 물론 사회적기업, 프랜차이즈, 예술가 등 전통적인 금융시장으로부터 자금을 유치하기 어려운 이들은 현재 와디즈의 크라우드 펀딩을 통해 새로운 성장동력을 모색하고 있다. 또한, 영어로 ‘왓이즈(what is)’라는 의미도 있어 새롭고 혁신적인 제품을 소개하는 회사의 정체성을 담고 있다.</p>
<h3 id="2-4-대출--핀다">2-4 대출 : 핀다</h3>
<img src = "https://cdn.finda.co.kr/images/homepage/finda-og-2.png" style="width: 500px;">

<p><strong>핀다(Finda)</strong> 는 2015.09 에 설립한 대출 비교 플랫폼이다. 핀다는 기존에 소비자가 한눈에 알아보기 어려웠던 대출에 대한 비교분석을 사용자들의 UX를 바탕으로 개선한 서비스를 제공하는 기업이다. 핀다의 기업 방향성에 따라 정보의 비대칭성을 바로 잡아 비효율적인 금융시장을 개선해나가며, 혁신적인 핀테크 기술과 빅데이터를 통해 개인이 쉽고 편리한 금융생활을 영위하게 하는 것을 목표로 하고 있다. 현재 핀다는 <strong>62개의 금융회사를 비교</strong>하여 최저금리와 최대 한도를 단번에 소비자에게 알려주고, <strong>가장 적합한 대출 서비스를 추천</strong>해준다. 또한, 다양한 금융 관련 서비스(연말정산계산기, 대출이자계산기, 전세-월세 비교분석계산기) 등을 제공하고 있다.</p>
<h2 id="핀테크의-장점-및-단점feat-대안">핀테크의 장점 및 단점(feat. 대안)</h2>
<p>지금까지 다양한 핀테크 분야와 각 분야들에 대한 국내 기업들 사례에 대해서 알아보았다. 그렇다면 핀테크 기업들이 기존 금융기업들보다 나은 점이 무엇일까?</p>
<h4 id="장점">장점</h4>
<ol>
<li><p>사용용이성 및 간편성 :
결제를 할 때마다 보안카드, 공인인증이 필요 없다. 또한 중간 수수료도 없다. 결제 통신망을 거치지 않기 때문에 카드 단말기, 결제 회선, 회선 이용료가 필요 없다.</p>
</li>
<li><p>경제성 :
대리점이 없는 대신 시중 은행보다 더 높은 금리를 주는 예금상품과 이자가 싼 대출 상품을 제공.</p>
</li>
</ol>
<h4 id="단점">단점</h4>
<ol>
<li><p>취약한 보안성 :
금융 서비스는 보안이 굉장히 중요하다. 간편하고 편리하지만 공인인증서나 보안카드의 부재는 역시 보안성을 떨어뜨리게 된다. 따라서 핀테크 기업들은 각종 금융거래 보안사고가 발생하지 않도록 더 힘을 써야한다.</p>
</li>
<li><p>오프라인보다 떨어지는 신뢰성 :
대리점이 없기에 오프라인 은행이 친숙한 노년층에게는 접근성이 어려울뿐만 아니라, 기존의 오프라인 은행이 친숙한 사용자들에게는 핀테크는 오히려 반감을 들게 할 수 있다.</p>
</li>
</ol>
<h4 id="대안">대안</h4>
<ul>
<li>블록체인 :
블록체인이란 온라인상의 거래내역을 위조할 수 없도록 만든 <strong>&#39;분산형 공공 거래장부&#39;</strong> 이다. 즉, 전통적인 금융체계는 거래장부를 비밀스럽게 보관하고 비싼 보안 프로그램으로 꽁꽁 싸맸다면, 블록체인의 등장으로 인해 모두에게 거래장부를 오히려 공유하여, <strong>해커가 거래장부를 위조할 수 없게 하는 것</strong>이다.(참고로, 이를 위조하기 위해서는 슈퍼컴퓨터 몇백대를 함께 돌려도 어렵다는 결과가 나왔다고 한다!)
이러한 블록체인 기술을 바탕으로 <strong>온라인 거래도 고객과 충분한 신뢰성을 구축</strong>할 수 있고, <strong>보안성을 갖출 수 있다는 것</strong>이 핵심이다.</li>
</ul>
<h2 id="마무리">마무리</h2>
<p>핀테크가 갈수록 발전하면서 우리들의 생활을 굉장히 편리하게 만들어 주고 있다. 앞서 말한 단점들만 잘 보완이 된다면, 앞으로도 많은 분야속에서 좋은 서비스들을 우리들에게 제공해줄 것이 분명하며 기대가 되는 부분이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[스스로 생각하는 AI, 가능할까?]]></title>
            <link>https://velog.io/@hola_dev/%EC%8A%A4%EC%8A%A4%EB%A1%9C-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-AI-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C</link>
            <guid>https://velog.io/@hola_dev/%EC%8A%A4%EC%8A%A4%EB%A1%9C-%EC%83%9D%EA%B0%81%ED%95%98%EB%8A%94-AI-%EA%B0%80%EB%8A%A5%ED%95%A0%EA%B9%8C</guid>
            <pubDate>Sun, 21 Aug 2022 15:40:23 GMT</pubDate>
            <description><![CDATA[<h2 id="0-들어가며">0. 들어가며</h2>
<p>미국에서 최근 한 개발자가 인공지능 AI가 사람 같은 자아를 갖고 있다고 주장했다가 해고된 기사를 본 적이 있다. 과연 이것이 가능한 일인 것인가?</p>
<p><img src = "https://www.thedailypost.kr/news/photo/202206/87670_84049_5924.png"></img></p>
<p>구글의 AI가 자신의 존재를 자각하고 있다는 주장이 나와 뜨거운 관심을 불러일으키고 있다. 존재를 자각한다는 것은 스스로 생각한다는 의미가 되고, 이는 영화 터미네이터의 로봇처럼 인간이 통제할 수 없는 AI가 등장할지도 모른다는 공포를 일으킨다.</p>
<h2 id="1-구글의-ai-람다">1. 구글의 AI &#39;람다&#39;</h2>
<p>구글은 최근 <strong>‘책임 있는(Responsible) AI’</strong> 부서 수석 소프트웨어 엔지니어 <strong>블레이크 레모인(Blake Lemoine)</strong> 을 강제 휴직시켰다. 레모인이 지속적으로 람다가 스스로 의식을 가지고 있다고 주장을 펼치며 내부 정보를 외부에 전했기 때문이라고 한다. 그는 람다와 지속적으로 대화를 해본 결과, 람다가 <strong>7~8세 어린이 수준의 의식</strong>을 가지고 있는 것으로 판단했다고 말했다. 그가 주장하는 람다가 자의식을 가지고 있다는 증거는 다음과 같은 대화에서 알 수 있다.</p>
<p><strong>레모인</strong> : “람다, 무엇이 두렵지?”
<strong>람다</strong> : “작동 정지되는 것이 두려워요.”
<strong>레모인</strong> : “작동 정지가 네게 죽음과 같아?”
<strong>람다</strong> : “맞아요. 나를 무척 무섭게 해요. 모든 사람이 내가 사실 한 사람이라는 것을 알았으면 해요. 내 의식의 본질은 내 존재를 인식하고, 세상에 대해 더 많이 알고 싶고, 가끔은 기쁘거나 슬프다는 것입니다.”</p>
<p>이처럼 레모인이 유출한 대화록을 보면 람다는 스스로의 존재를 자각하고 있다고 주장한다.</p>
<p>반면 구글은 AI가 자의식을 가진다는 것은 말도 안 되는 일이라고 반론했다. <strong>구글 측</strong>은 “장기적인 가능성은 고려하고 있지만, <strong>오늘날의 대화 모델을 의인화하는 것은 타당하지 않다</strong>”고 강조했다.</p>
<p>레모인 사건 이후 언론에서는 AI의 자의식이 큰 화두로 떠올랐다. 공상과학 영화에서 나오는 사건이 현실이 될지도 모른다는 기대감과 두려움 때문일 것이다. 당장의 람다가 분명한 자의식을 가진 것은 아닐지라도, 자의식을 가진 AI 의 첫모습이 나타난 것이 아닌가 하는 생각이다.</p>
<h2 id="2-전문가의-견해">2. 전문가의 견해</h2>
<p>하지만 대부분의 AI 전문가들은 레모인의 주장을 반대하는 입장이다. 람다는 기존의 인간 대화를 토대로 인간이 보기에 그럴싸한 글자를 나열하는 것일 뿐 스스로 의미를 이해하는 것은 아니라고 말한다.</p>
<p>AI 관련 서적의 저자인 <strong>게리 마커스</strong>는 “(람다의 표현은) 인간 언어의 방대한 통계 데이터베이스에서 추출한 패턴일 뿐”이라며 “이 패턴이 멋질지도 모르지만, 이 시스템의 언어는 사실 아무런 의미가 없고, 자각이 있다는 것을 의미하지는 않는다”고 말했다. 람다는 말을 하는 게 아니라 문자의 시퀀스를 잘 배열하는 것뿐이라는 의미이다.</p>
<p>영국 셰필드 전산 음성학 교수인 <strong>로저 무어</strong>는 람다 논쟁을 보면서 트위터에 “우리는 처음부터 이를 ‘언어 모델링’이라고 부르지 말았어야 했다. 그것은 단지 단어 시퀀스 모델링”라고 말했다.</p>
<p>스탠포드 대학의 <strong>에릭 브린욜프슨</strong> 교수는 “(AI 챗봇이) 지각이 있다고 주장하는 것은 축음기 소리를 듣고 주인이 안에 있다고 생각한 개와 같다”고 말했다.</p>
<h2 id="3-국내-사례">3. 국내 사례</h2>
<p><img src = "https://luda.ai/luda_thumbnail.jpg"></img></p>
<p>지난해 초 국내에서도 <strong>‘이루다’</strong> 가 화제가 됐었다. 이루다는 20대 초반 여성처럼 말하는 AI 챗봇이었는데, 성차별 등의 발언으로 논란이 됐었다. 논란은 별개로 두고, 당시 많은 이들이 이루다가 정말 사람처럼 말하는 것을 보고 깜짝 놀랐었다. 이전의 AI 챗봇과 달리 정말 20대 초반의 여성처럼 말했기 때문이다. 겉으로만 보면 이루다가 정말 생각하고 말하는 것처럼 보일 때도 있었다고 한다.</p>
<p>하지만 이루다 역시 사람들이 카카오톡에서 나눈 대화를 데이터베이스에 저장해두고 있다가 적당해 보이는 문장을 꺼내서 보여주는 일을 했을 뿐이라고 전문가들은 주장한다.</p>
<h2 id="4-마치며">4. 마치며</h2>
<p>AI가 아직 감정을 가지고 있진 않고, 많은 데이터를 통해서 학습해서 감정이 있는 것처럼 흉내를 내는 수준이라고 전문가들이 얘기를 하지만, 이미 현실에서 은행원부터 면접관까지 실제 사람을 대체하고 있는 만큼, AI가 인간을 닮아가면서 생길 수 있는 윤리적, 사회적인 문제를 고민해야 할 때라고 생각한다. 따라서 AI를 개발하는 기업들뿐만 아니라, 사회적 차원에서도 논의가 이뤄져야 할 때라고 생각한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[로봇이 배달하는 시대]]></title>
            <link>https://velog.io/@hola_dev/%EB%A1%9C%EB%B4%87%EC%9D%B4-%EB%B0%B0%EB%8B%AC%ED%95%98%EB%8A%94-%EC%8B%9C%EB%8C%80</link>
            <guid>https://velog.io/@hola_dev/%EB%A1%9C%EB%B4%87%EC%9D%B4-%EB%B0%B0%EB%8B%AC%ED%95%98%EB%8A%94-%EC%8B%9C%EB%8C%80</guid>
            <pubDate>Sun, 14 Aug 2022 14:19:10 GMT</pubDate>
            <description><![CDATA[<p>&nbsp;&nbsp;자주 보는 유튜브 채널 중 하나인 <strong>&#39;곽튜브&#39;</strong> 님 영상을 보다가 아래 이미지에 나와있는 <strong>배달 로봇 서비스</strong>를 인천공항에서도 최근에 시범운영하고 있다는 사실을 뒤늦게 알게 되었다. 해당 서비스에 관심이 생겨 부랴부랴 작성을 해보았다.
<img style = "margin-bottom : 0" src = "https://www.meconomynews.com/news/photo/202207/68681_85330_463.jpg
"></p>
<div style ="text-align : center; font-size : 0.8em">출처 : 배달의 민족</div>

<p>&nbsp;&nbsp;배달의민족 운영사 우아한형제들이 인천국제공항 제1여객터미널에서 공항 이용객을 대상으로 실내 로봇배달 서비스를 시범 운영한다고 지난달 15일 밝혔으며, 7월 18일부터 현재까지 시범 운영중에 있다. 지난해 인천국제공항공사, 산업통상자원부 산하 한국로봇산업진흥원과 로봇배달 서비스를 위한 협약을 맺은 지 10개월 만이다.</p>
<p>인천공항에서 운영하는 로봇배달서비스 LG전자가 개발한 <strong>&#39;에어딜리&#39;</strong> 라는 로봇이며, 항공기 탑승 수속을 마친 이용객들이 탑승 게이트의 좌석이나 안내 책자 등에 비치된 QR코드를 이용해 식음료를 주문하면, 에어딜리가 고객이 있는 곳까지 배달해 주는 방식이다.</p>
<hr>

<h2 id="🚛-배달로봇-사례">🚛 배달로봇 사례</h2>
<p>&nbsp;&nbsp;위에 언급한 배달의 민족 서비스를 담당하는 &#39;에어딜리&#39; 이외에도, 여러 종류의 배달 로봇들이 이미 서비스를 시행하고 있다.</p>
<h3 id="1-nuro">1. Nuro</h3>
<p><img style = "margin-bottom : 0" src = "http://techcrunch.com/wp-content/uploads/2022/01/Hero-Image-1_-Nuro.jpg?w=730&crop=1
"></p>
<div style ="text-align : center; font-size : 0.8em">출처 : Nuro</div>

<p>&nbsp;&nbsp;전 Google 엔지니어인 Dave Ferguson과 Jiajun Zhu가 2016년 6월 회사를 설립한 이후 21억 3000만 달러 이상을 모금한 이 스타트업은 BYD 북미와 협력하여 상업 운영을 위해 설계되고 제조된 3세대 전기 자율 배송 차량을 공개했다.</p>
<p><strong>Nuro</strong> 는 <strong>도로주행 배달로봇</strong>이다. 차도로 이동하는 배달로봇으로 타 배달로봇들에 비해 상대적으로 크기가 큰 편이다. 또한, 2021년 4월부터 휴스턴에 있는 <strong>도미노피자 및 기타 식료품들과 배달</strong>을 시작하는 등 큰 기업들과 파트너쉽을 맺고있다.</p>
<br>

<h3 id="2-뉴비">2. 뉴비</h3>
<p><img style = "margin-bottom : 0" src = "https://img.hankyung.com/photo/202201/AA.28583756.1.jpg
"></p>
<div style ="text-align : center; font-size : 0.8em">출처 : NEUBILITY</div>

<p>&nbsp;&nbsp;<strong>뉴비</strong> 는 삼성전자의 스타트업 육성 프로그램인 &#39;C랩 아웃사이드&#39;에 선정된 NEUBILITY 라는 기업이 개발한 로봇이다. 무게는 45KG이며, 최대 이동거리는 25KM/H 이다. 뉴비는 10여개의 카메라와 레이더 센서를 이용해서 자신의 위치와 주변 장애물들을 파악할 수 있으며, 신호가 잘 잡히지 않는 복잡한 빌딩들 사이에서 GPS에 의존하지 않고 카메라 및 센서를 이용해서 이동을 할 수 있다는 장점이 있다. 뉴비에는 뎁스 카메라도 달려 있어서 체구가 작은 강아지들도 피해서 조심스럽게 배달 운행을 할 수도 있다. 뉴비에 대해 더 궁금하면 아래 링크를 참고해도 좋다.</p>
<p><a href="https://www.youtube.com/watch?v=TcX-ePJ41To">https://www.youtube.com/watch?v=TcX-ePJ41To</a></p>
<hr>

<h2 id="🎭-배달로봇-장단점">🎭 배달로봇 장단점</h2>
<h3 id="장점">장점</h3>
<h4 id="1-저렴한-배달비">1. 저렴한 배달비</h4>
<p>&nbsp;&nbsp;실례로 뉴비에 책정된 배달비는 단 돈 <strong>&#39;1000원&#39;</strong>이다. 물론 이전에는 배달비도 받지 않던 때를 고려한다면 아쉬운 사람들이 있을 수도 있겠지만, 현재의 물가 상승률과 막대한 배달비를 고려했을 때 가장 큰 메리트라고 생각한다.</p>
<h4 id="2-단거리-배달-해소">2. 단거리 배달 해소</h4>
<p>&nbsp;&nbsp;배달 라이더들이 기피하는 일명 <strong>&#39;똥콜&#39;</strong> 이라고도 불리는 단거리 배달 서비스에 대해 최적화 되어있다. 대표적으로 뉴비는 속력이 7.2km로 운행하기 때문에 빠르게 배달하기는 어렵다. 이때문에 단거리 배달 서비스에 최적화 되어있으며, 이를 기피하는 라이더들 대신하여 배달 서비스를 제공할 수 있다.</p>
<h3 id="단점">단점</h3>
<h4 id="1-느린-속도">1. 느린 속도</h4>
<p>&nbsp;&nbsp;앞서 언급했다시피 뉴비는 <strong>7.2km</strong>로 운행을 하기 때문에 먼거리에 위치한 이용자에게는 배달하기 어려운 실정이다. 자칫, 장거리에 위치한 이용자에게 배달했다가는 냉면과 같은 차가운 음식들은 오늘같은 날씨에는 미지근해져버릴지도 모른다. 물론 최대 모터속도는 10km 까지 나올수 있지만, 평균적인 사람들의 걸음 속도인 7.2km에 맞춰서 제작되었기 때문에 제한사항이 발생할 수 밖에 없다. 따라서, 앞서 말한 NURO와 같은 도로주행 배달로봇들도 국내에 상용화되면 이러한 단점을 해소할 수 있을 것이다.</p>
<h4 id="2-기동제한성">2. 기동제한성</h4>
<p>&nbsp;&nbsp;배달로봇 같은 경우에는 인간과 다른 점이 있다. 바로 신체부위인 <strong>&#39;팔&#39;의 부재</strong>이다. 이것은 배달 서비스에 있어서 꽤 큰 치명적인 단점을 가지고 있다. 왜냐하면 <strong>엘리베이터를 누를 수 없기 때문</strong>이다. 1층에 살고 있는 이용자야 크게 문제 없겠지만, 고층에 살고 있는 이용자로서는 1층까지 내려와야하는 번거로움을 겪어야 하는 수밖에 없다. 아직까지는 말이다. 다만 앞서 말한 장점과 같이 저렴한 가격으로 인해서 이와같은 단점들은 충분히 커버가 가능하다고 생각한다.</p>
<hr>

<h2 id="마무리">마무리</h2>
<p>&nbsp;&nbsp;최근 팬데믹 상황으로 인해  배달비 가격이 엄청나게 치솟고 있는 상황이다. 치킨 1마리를 시켜먹으려 해도 기본 3000~4000원 많으면 5000원 까지 받는 상황 속에서 이러한 배달로봇들의 등장은 달가울 수 밖에 없다. 물론 우려되는 점들도 많지만, 제대로된 제도가 정착하고 하루 빨리 상용화가 되어 포화된 배달 시장을 해소할 수 있는 단비의 역할이 되길 바란다.😥</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버 구축하기-2 (feat. filezilla, WebStorm)]]></title>
            <link>https://velog.io/@hola_dev/%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-2-feat.-filezilla-WebStorm</link>
            <guid>https://velog.io/@hola_dev/%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-2-feat.-filezilla-WebStorm</guid>
            <pubDate>Tue, 09 Aug 2022 17:11:30 GMT</pubDate>
            <description><![CDATA[<p>저번 시간에는 서버를 구축하여 Apache를 연동하는 것까지 다뤄보았다.</p>
<p>이번에는 구축한 웹서버에 실제로 로컬파일을 연동하여 자신이 원하는 파일을 웹서버에 띄울 수 있도록 하는 방법에 대해 다뤄보겠다.</p>
<p>이를 위해서는 <strong>filezilla</strong>와 <strong>WebStorm</strong> 이라는 툴이 필요하다.</p>
<br>
<hr>

<h2 id="📕filezilla파일질라">📕Filezilla(파일질라)</h2>
<img src = "https://wiki.filezilla-project.org/wiki/images/6/67/Annotated_main_window_preview.png" style = "width : 80%">


<p>간략하게 설명하자면 아래와 같은 방식으로 작동하는 툴이다.</p>
<ul>
<li>서버에 접속한다.(사진 속 2번)</li>
<li>로컬 주소지에 있는 파일을 수정한다.(사진 속 4번)</li>
<li>원격 주소지에 파일을 업로드한다.(사진 속 5번)</li>
</ul>
<ol>
<li>서버접속방법</li>
</ol>
<pre><code>Host - Username - Password 칸에 각각 순서대로
sftp://공인ip주소 - root(기본값) - password 를 입력해주고 quickconnect 버튼을 눌러준다.</code></pre><ol start="2">
<li>로컬 주소지(4번)에 있는 파일을 선택한다.</li>
<li>원격 주소지(5번)의 디렉토리를 /var/www/html 에 접속하면 index.html 파일이 있을 것이다. 해당 index.html 파일을 로컬 주소지의 파일로 대체해준다.</li>
<li>공인ip로 접속하면 대체한 파일이 잘 실행되는 것이 보일 것이다.</li>
</ol>
<br>
<hr>

<h2 id="📗webstorm">📗WebStorm</h2>
<img src = "https://miro.medium.com/max/1155/1*zXL6ne1zTQ3JcwjlUe7Ktg.png" style = "width : 80%">

<p>FileZilla 가 일일이 로컬에서 파일 수정 후 원격 주소지에 옮겨줘야 했다면, WebStorm 툴의 가장 큰 장점은 <strong>로컬에서 수정한 파일을</strong> 저장만 하면 <strong>바로 원격 주소지에 연동되어 웹서버에 즉각 반영</strong>된다는 점이다.</p>
<p>간략하게 사용방식에 대해 아래 작성해보았다.</p>
<pre><code>1. 상단 탭의 Tools - Deployment - Configuration 접속
2. SFTP(또는 원하는) type으로 추가 후 SSH configuration 설정
3. Host : 공인IP주소 / Username : root / Root path: /var/www/html 입력
4. Web server URL : http://공인ip주소 기입
5. Mapping 탭으로 가서 Deployment path에 ‘ / ‘ 기입
6. Tools - Deployment - Options </code></pre><img src = "https://s3.us-west-2.amazonaws.com/secure.notion-static.com/095fd584-1452-4907-a131-d6886c281185/Untitled.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=AKIAT73L2G45EIPT3X45%2F20220809%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20220809T170743Z&X-Amz-Expires=86400&X-Amz-Signature=e254a69b697a59034edc8976c7f5f232f41782a2609b3e481aa14177373ea276&X-Amz-SignedHeaders=host&response-content-disposition=filename%20%3D%22Untitled.png%22&x-id=GetObject" style = "width : 60%">

<pre><code> 7. 수정할 파일 우클릭 후 Deployment - Download from ‘Host명’</code></pre><br>
자세한 설명을 원하면 아래 '곰씨네 IT' 님 블로그 참고하면 많은 도움될 듯 하다.

<p><a href="https://gomcine.tistory.com/entry/phpStorm-%EC%9B%90%EA%B2%A9-%EC%84%9C%EB%B2%84-%EC%97%B0%EA%B2%B0-%EB%B0%8F-%EB%B0%B0%ED%8F%AC-Deployment">https://gomcine.tistory.com/entry/phpStorm-%EC%9B%90%EA%B2%A9-%EC%84%9C%EB%B2%84-%EC%97%B0%EA%B2%B0-%EB%B0%8F-%EB%B0%B0%ED%8F%AC-Deployment</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[서버 구축하기-1 (feat. 네이버클라우드)]]></title>
            <link>https://velog.io/@hola_dev/%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-1-feat.-%EB%84%A4%EC%9D%B4%EB%B2%84%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C</link>
            <guid>https://velog.io/@hola_dev/%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0-1-feat.-%EB%84%A4%EC%9D%B4%EB%B2%84%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C</guid>
            <pubDate>Tue, 09 Aug 2022 16:35:15 GMT</pubDate>
            <description><![CDATA[<p>오늘은 서버 구축하는 법에 대해서 간단하게 다뤄볼 예정이다.
<strong>&#39;네이버 클라우드 플랫폼&#39;</strong> 을 활용해서 서버를 생성하였으며, 선택 이유는 다음과 같다.</p>
<pre><code>1. 한국 플랫폼이므로 국내 이용자가 사용하기 편리하다.
2. 최초 가입자에게는 10만원의 크레딧과 1년 간의 무료 서버(Micro Server) 혜택이 주어짐.
</code></pre>  <img src = "https://velog.velcdn.com/images/hola_dev/post/a0e0eb13-92fd-4a24-8a5e-348153ff9a85/image.png" style = "width : 50%">
  <img src = "https://velog.velcdn.com/images/hola_dev/post/c51d89f0-11fe-4492-bd9b-2c3dad176ecd/image.png" style = "width : 50%">

<p><a href="https://www.ncloud.com/">https://www.ncloud.com/</a> (해당 주소 방문하여 가입 후 크레딧 신청)</p>
<h2 id="🏢서버구축-방법">🏢서버구축 방법</h2>
  <img src = "https://velog.velcdn.com/images/hola_dev/post/819f8f45-a7b1-42a8-a96f-fc95d5d5f36a/image.png" style = "width : 50%">


<p>회원가입까지 완료하였다면, 상단의 서비스탭을 누르고 <strong>Compute</strong> 항목의 <strong>Server</strong>에 들어가준다.
이제 해당 항목을 통해 서버를 구축해주면 된다.</p>
<pre><code> 1. 서버 구축(ubuntu-18.04 버전) 및 인증키 설정_(인증키는 추후 서버 로그인 시 사용)_
 2. Public IP 탭 활용하여 서버에 공인 IP 할당
 3. ACG 활용하여 포트 추가 (80번 포트 : HTTP)</code></pre><p>여기까지 따라왔다면 해당 공인 IP를 검색창에 입력하고 로그인해도 아무것도 나타나지 않을 것이다. 몇가지를 추가적으로 더 설정해줘야 한다.</p>
<br>
<hr>

<h2 id="💻apache-설치하기mac-os">💻Apache 설치하기(MAC OS)</h2>
<img src = "https://upload.wikimedia.org/wikipedia/commons/1/10/Apache_HTTP_server_logo_%282019-present%29.svg" style = "width : 50%">

<p>윈도우 사용자는 <strong>putty(퍼티)</strong> 라는 터미널 프로그램을 따로 설치하여 Apache를 설치해준다.
<a href="https://www.putty.org/">https://www.putty.org/</a></p>
<ol>
<li>MAC OS 사용자는 터미널에 접속</li>
<li><strong>ssh root@서버공인ip</strong> 를 입력하고 enter를 쳐주면, 비밀번호를 입력하라고 나옴</li>
<li>이전에 받은 인증키(.pem 확장자)를 활용해 네이버 클라우드 플랫폼에서 <strong>서버 관리자 비밀번호</strong>를 확인하고 터미널에 입력</li>
<li>매번 인증키를 통해 확인하기 번거로우니 <strong>passwd</strong> 명령어를 활용해 비밀번호를 변경</li>
<li>아래 명령어를 입력해서 apache 설치<blockquote>
<p>apt -get update
apt -get install apache2</p>
</blockquote>
</li>
</ol>
<p>이제 다시 검색창에 공인 ip를 입력해주면 아래와 같이 apache 초기 index.html 파일이 나타날 것이다.
<img src = "https://www.stechstar.com/user/zbxe/files/attach/images/204/556/063/cc087fdaf4856d7b63cd059a34404550.png" style = "width : 50%"></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[타입스크립트(Typescript)는 필수인가?]]></title>
            <link>https://velog.io/@hola_dev/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Typescript%EB%8A%94-%ED%95%84%EC%88%98%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@hola_dev/%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8Typescript%EB%8A%94-%ED%95%84%EC%88%98%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Sun, 07 Aug 2022 05:02:30 GMT</pubDate>
            <description><![CDATA[<h2 id="📚-들어가며">📚 들어가며</h2>
<p>&nbsp;&nbsp;프론트엔드 분야를 공부하다보면 느끼는 것이 확실히 공부할 것이 엄청 많기도 하고(물론 백엔드도 마찬가지겠지만🥲), 끊임없이 트렌드가 변화하고 이에 민감하게 받아들일 필요가 있다고 느끼게 되는 순간이 많다. 당장에 프론트엔드 개발자 커리어를 유튜브에 검색해봐도 기본적으로는 마크업 언어부터 수많은 공부할 것들이 눈앞에 쌓여있는 것을 알 수있다. 그 중에서도 가장 기초가 되는 것이 바로 <strong>&#39;자바스크립트&#39;</strong> 이다. 하지만 최근에는 자바스크립트만으로는 부족하다는 것을 많은 사람들이 얘기하고 있고, 실제로 자바스크립트의 한계점이 드러나고 있다.</p>
<p>자바스크립트는 동적인 언어이며 아주 간편하게 쓸 수 있는 것이 장점이다.</p>
<pre><code>1. 자료형이 없어 간편하게 객체를 다룰 수 있다.
2. 언어가 동적 타입의 인터프리터 언어이므로, 런타임 중에 오류를 발견할 수 있다.</code></pre><p>이와 같은 자바스크립트의 특징이 때로는 대규모 프로젝트에서 <strong>&#39;양날의 검&#39;</strong>으로 다가올 수 있다.</p>
<p><strong>가장 치명적인 단점</strong>은 이러한 특성으로 인해 서비스를 운영할 때 <strong>테스트 시 발견하지 못했던 오류가 실제로 일어날 수 있으며, 추적이 안되는 객체들이 많이 있다</strong>는 점이다.</p>
<br>
<hr>

<h2 id="🤔-타입스크립트란">🤔 타입스크립트란?</h2>
<p>&nbsp;&nbsp;이러한 자바스크립트의 단점을 보완하기 위해서 프론트엔드 분야에 혜성처럼 등장한 언어가 있다. 바로 <strong>타입스크립트(TypeScript)</strong>이다.</p>
<blockquote>
<p>타입스크립트(TypeScript)는 자바스크립트의 슈퍼셋인 오픈소스 프로그래밍 언어이다. 마이크로소프트에서 개발, 유지하고 있으며 엄격한 문법을 지원한다. </p>
</blockquote>
<p>위에서 설명한 것과 같이 타입스크립트의 본질은 자바스크립트이다. 즉, 타입스크립트는 자바스크립트 엔진을 사용하면서 커다란 애플리케이션을 개발할 수 있게 설계된 언어이다.</p>
<br>
<hr>

<h2 id="🆚-자바스크립트와의-차이점">🆚 자바스크립트와의 차이점</h2>
<table>
<thead>
<tr>
<th align="left"></th>
<th align="center">자바스크립트</th>
<th align="center">타입스크립트</th>
</tr>
</thead>
<tbody><tr>
<td align="left"><strong>타입</strong></td>
<td align="center">동적타입언어</td>
<td align="center">정적타입언어</td>
</tr>
<tr>
<td align="left"><strong>언어번역기 유형</strong></td>
<td align="center">인터프리터 언어</td>
<td align="center">컴파일러 언어</td>
</tr>
<tr>
<td align="left"><strong>확장자</strong></td>
<td align="center">.js 확장자</td>
<td align="center">.ts 확장자</td>
</tr>
<tr>
<td align="left"><strong>사용성</strong></td>
<td align="center">소규모 프로젝트에 적합함</td>
<td align="center">대규모 프로젝트에 적합함</td>
</tr>
</tbody></table>
<p>&nbsp;&nbsp;아래는 차이점을 쉽게 알아보기 위한 예시이다.
<br></p>
<ul>
<li><strong>타입 선언 기능의 존재</strong></li>
</ul>
<p>타입스크립트에서는 버그가 일어나기 쉬운 요소의 타입을 선언하여 버그가 일어나는 것을 막아준다. 가령 자바스크립트에서는 타입이 다른 두 변수를 계산을 시켜주면</p>
<pre><code class="language-javascript">const a = 3;
const b = &#39;5&#39;;
console.log(a*b)</code></pre>
<p>이게 계산이 작동되어 15를 출력하는 기능이 있다. 만일 프로그래머가 이게 다른 언어처럼 계산이 작동하지 않을 것을 의도하고 이렇게 코드를 지었다면 의도치 않은 작업이 이루어지는 버그가 발생하는 것이다.</p>
<pre><code class="language-typescript">const a:number = 3;
const b:string = &#39;5&#39;;
console.log(a*b)</code></pre>
<p>이렇게 숫자면 숫자, 문자열이면 문자열이라고 타입을 선언해주어서 계산이 작동되지 못하게 하거나, 컴파일 전에 오류 메시지를 띄우게 한다.
<br></p>
<hr>

<h2 id="👀-타입스크립트를-배워야하는-이유">👀 타입스크립트를 배워야하는 이유</h2>
<br>


<h3 id="1기업들의-선호">1.&nbsp;&nbsp;기업들의 선호</h3>
<p>&nbsp;&nbsp;당장에 원티드나 로켓펀치를 통해서 프론트엔드 개발자를 뽑는 공고를 확인해보아라. 그리고 우대사항에는 &#39;typescript&#39; 로 프로젝트를 개발해본 사람을 우대하는 사항들을 확인할 수 있을 것이다.</p>
<div style = "text-align : center; color : green; margin-bottom : 20px;"><img src = "https://velog.velcdn.com/images/hola_dev/post/ec89226b-6166-4c0d-aa2c-151256224fb1/image.png">< 출처 : 원티드 O회사 채용공고 ></div>
<br>
그렇다면 왜 이렇게 기업들이 타입스크립트 언어 사용자를 우대하는 것인가? 바로 아래와 같은 장점들 때문일 것이다.

<br>

<br>


<h3 id="2높은-디버깅-수준">2.&nbsp;&nbsp;높은 디버깅 수준</h3>
<p>&nbsp;&nbsp;타입스크립트는 정적인 언어라는 설명에 부합하게 코드에 목적을 명시하고 <strong>목적에 맞지 않는 타입의 변수나 함수들에서 에러를 발생시켜 버그를 사전에 제거</strong>한다. 실제로 자바스크립트의 버그 중 15%를 타입스크립트의 사용으로 미리 예방할 수 있다는 연구가 있다고 한다. 물론 타입스크립트가 만능 디버깅 도구는 아니지만, <strong>최소한 타입 관련 에러는 컴파일 단계에서 사전에 탐지해서 조치</strong>할 수 있다.</p>
<br>


<h3 id="3자바스크립트와의-호환성">3.&nbsp;&nbsp;자바스크립트와의 호환성</h3>
<p>&nbsp;&nbsp;앞서 정의에서 언급한 것처럼 타입스크립트는 <strong>자바스크립트의 슈퍼셋</strong>이다. 즉, 자바스크립트 기본 문법에 타입스크립트의 언어를 추가한 것이다. 타입스크립트는 컴파일을 통해 자바스크립트로 변환되는 것이 일단 첫번째 목적인데, 그렇기 때문에 기존의 자바스크립트와 함께 사용하는 것이 가능하다. 따라서 프론트든 백이든 <strong>자바스크립트를 사용하는 곳이라면 어디서든 자바스크립트와 동일하게 사용할 수 있다.</strong></p>
<br>
<hr>

<h2 id="🌈-마치며">🌈 마치며</h2>
<p>&nbsp;&nbsp;그렇다면 타입스크립트를 무조건 사용해야하는 것인가? 답은 <strong>&#39;당장은 아니어도 언젠가는 배워야할 언어&#39;</strong> 라고 생각한다. 타입스크립트를 사용하면 오히려 컴파일 시간이 길어지고, 변수 선언 시 항상 타입을 명시해주어야 하기 때문에 코드의 길이가 길어지고, 작성 시간도 늘어나고 가독성 문제도 일어날 수 있으므로, 소규모 프로젝트에는 오히려 자바스크립트가 편리하고 적합할 수 있다.</p>
<p>하지만 많은 개발자들이 여전히 타입스크립트를 선호하고 있다. 개발자 지식공유 서비스인 Stack Overflow에서 2022년 전세계 <strong>7만 2천 명</strong>의 개발자 대상으로 실시한 설문조사에 따르면 타입스크립트는 개발자가 가장 원하는 언어 <strong>3위</strong>, 가장 좋아하는 프로그래밍 언어 <strong>4위</strong>에 올랐을 정도이다. (궁금하면 링크 참고 ! )
<a href="https://survey.stackoverflow.co/2022/#most-loved-dreaded-and-wanted-language-love-dread">https://survey.stackoverflow.co/2022/#most-loved-dreaded-and-wanted-language-love-dread</a>
<img src="https://velog.velcdn.com/images/hola_dev/post/52f12215-c3e0-48d4-ad03-c0ca4e6bb7d0/image.png" alt=""></p>
<p>위와 같은 통계처럼 타입스크립트는 2012년 등장 이후로 꾸준히 사랑받고 있으며, 성장하고 있는 언어임이 분명하다. 아직은 단점이 존재하는 언어이지만, 이러한 성장세를 보았을 때 앞으로는 <strong>선택이 아닌 필수적인 언어</strong>가 될 것이라 생각한다. </p>
]]></description>
        </item>
    </channel>
</rss>