프로젝트 생성 140자의 단문 메시지를 보내고 공유하는 서비스를 따라 해 보자. nodebird라는 프로젝트를 만들자. { "name": "nodebird", "version": "1.0.0", "description": "sns service using express", "main": "index.js", "scripts": { "start": "nodemon app", "test": "echo \"Error: no test specified\" && exit 1" }, "author": "hvvan", "license": "MIT" } npm i sequelize mysql2 sequelize-cli npx sequelize init 그리고 views, route, public, passport 폴더..
노드
쿼리 수행하기 views 폴더 안에 html을 만들어 보자. 사용자 등록 결혼 여부 등록 아이디 이름 나이 결혼여부 {% for user in users %} {{ user.id }} {{ user.name }} {{ user.age }} {{ '기혼' if user.married else '미혼' }} {% endfor %} 댓글 등록 등록 아이디 작성자 댓글 수정 삭제 views/mongoose.html {{ message }} {{ error.status }} {{ error.stack }} views/error.html 이제 js파일을 만들어서 서버를 돌려보자. //사용자 이름을 클릭할 때 댓글 로딩 document.querySelectorAll('#user-list tr').forEach((el..
CRUD CRUD란 Create, Read, Update, Delete의 첫 글자를 딴 두문자어이다. 우선 CRUD를 하려면 테이블이 있어야 하니 테이블을 만들자. Create 데이터를 생성해서 데이터베이스에 넣는 작업이다. users 테이블에 데이터를 몇 개 넣어보자. INSERT INTO users (name, age, married, comment) VALUES ('홍길동', 24, 0, '자기소개1'); INSERT INTO users (name, age, married, comment) VALUES ('김철수', 32, 1, '자기소개2'); comments 테이블에도 넣어보자. 워크벤치를 사용하면 위와 같이 테이블에 직접 적고 하단에 apply를 누르면 insert가 완료된다. Read 조회는..
express server learn-express 프로젝트를 하고 express 모듈을 이용한 server를 만들어보자. npm i express npm i -D nodemon express와 편의를 위해 nodemon을 설치하자. const express = require('express'); const app = express(); app.set('port', process.env.PORT || 3000); app.get('/', (req, res) => { res.send('Hello, Express'); }); app.listen(app.get('port'), () => { console.log(app.get('port'), '번 포트에서 대기중...'); }); express 모듈을 실행해 a..
요청과 응답 클라이언트에서 서버로 요청(request)을 보내고, 서버에서는 요청의 내용을 읽고 처리한 뒤 클라이언트에 응답(respoense)을 보낸다. 따라서 서버에는 요청을 받는 부분과 응답을 보내는 부분이 있어야 한다. 요청과 응답은 이벤트 방식이라 생각하면 된다. 클라이언트로부터 요청이 왔을 때 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해두어야 한다. const http = require('http'); http.createServer( (req, res) => { //응답 내용 }); http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있다. createServer 메서드를 사용하여 콜백 함수에 요청에 대한 응답 내용을 적으면 요청이 들어올 때마다 콜백 함수가 실행된다. createS..
setInterval(() => { console.log('시작'); try{ throw new Error('down server!!'); }catch(err){ console.error(err); } }, 1000); 파일 시스템 접근하기 fs 모듈은 파일 시스템에 접근하는 모듈이다. 즉, 파일을 생성하거나 삭제하고, 읽거나 쓸 수 있다. 폴더도 만들거나 지울 수 있다. const fs = require('fs'); fs.readFile('./read.txt', (err, data) => { if(err){ throw err; } console.log(data); console.log(data.toString()); }); fs는 기본적으로 콜백 형식의 모듈이므로 실무에서 사용하기 불편하다. 따라서 f..
REPL 자바스크립트는 스크립트 언어이므로 미리 컴파일을 하지 않아도 즉석에서 코드를 실행할 수 있다. 코드를 읽고(Read), 해석하고(Eval), 결과물을 반환하고(Print), 종료할 때까지 반복한다(Loop)고 해서 REPL(Read Eval Print Loop)이라고 부른다. 하지만 REPL로 원하는 결과를 만들어내기 쉽지 않을 것이다. 그래서 자바스크립트 파일을 만들어 사용한다. 노드는 코드를 모듈로도 만들 수 있다. 모듈은 자체로도 하나의 프로그램이면서 다른 프로그램의 부품으로도 사용할 수 있다. 간단한 모듈을 하나 만들어보자. const odd = '홀수'; const even = '짝수'; module.exports = { odd, even, }; var.js var.js에 변수 두 개를..
Node란? 노드는 자바스크립트 런타임이다. 런타임은 특정 언어로 만든 프로그램들을 실행할 수 있는 환경을 뜻한다. 따라서 노드는 자바스크립트 프로그램을 컴퓨터에서 실행할 수 있다. 노드는 구글이 출시한 V8 엔진과 더불어 libuv라는 라이브러리를 사용한다. V8과 libuv는 C와 C++로 구현되어 있다. 따라서 자바스크립트 코드를 노드가 알아서 V8과 libuv에 연결해준다. libuv 라이브러리는 노드의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다. 이벤트 기반 이벤트 기반이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식을 의미한다. 이벤트로는 클릭이나 네트워크 요청 등이 있다. 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두어야 한다. 이를..
플루이드 - 워셜 알고리즘(Floyd - Warshall algorithm) 플루이드-워셜 알고리즘은 최단 경로를 구하는 또 하나의 알고리즘이다. 알고리즘을 한 번 실행함으로써 모든 노드 간 최단 경로를 구할 수 있다. 인접 행렬을 이용하여 초기값을 설정한다. 가중치를 포함한 인접 행렬이 다음과 같다고 하자. 이 인접 행렬을 이용해서 다음과 같은 초기값을 만든다. 자신에서부터 자신까지의 거리는 항상 0이며, 직접 연결되어 있지 않은 경우에는 ∞로 초기화 한다. 초기값을 설정한 후에는 n번째 노드부터 중간 노드가 되어, 중간 노드를 거쳐 다른 노드로 갈 수 있는 값들을 업데이트시킨다. n번 반복하면 모든 노드까지의 최단 거리를 알 수 있다. 다음은 Java로 작성한 코드이다. public class Flo..
그래프(Graph)란? 그래프는 노드(node, 혹은 정점(vertex))와 그들을 잇는 간선(edge)으로 구성되어 있다. 경로(path)는 한 노드에서 그래프의 간선을 지나 다른 노드까지 가는 길을 의미한다. 경로의 길이는 경로에 포함된 간서의 개수이다. 예를 들어 1번 노드에서 5번 노드로 가는 길이가 3인 경로( 1 -> 3 -> 4 -> 5)가 나와 있다. 사이클(Cycle)은 처음 노드와 마지막 노드가 같은 경로를 의미한다. 예를 들어 1 -> 3 -> 4 -> 1로 구성된 사이클이 존재한다. 그래프의 모든 노드 간에 경로가 있는 경우를 연결 그래프(connected graph)라고 한다. 연결 그래프 연결 그래프가 아님 그래프의 연결된 부분을 컴포넌트(component)라고 표현한다. 연결 ..