node.js 메모 모음
1. package.json 생성하기
npm init 으로 package.json 생성
2. Node.js 실행하기
node 1_test.js
터미널애서 서버종료
ctrl + c
3. fs 모듈
- 파일처리와 관련된 모듈
- node.js에서 가장 중요하고 기초가 되는모듈
메소드
readFile() : 파일을 비동기적으로 읽음
readFileSync() : 파일을 동기적으로 읽음
writeFile() : 파일을 비동기적으로 씀
writeFileSync(): 파일을 동기적으로 씀
4.이벤트 루프
- Node.js는 서버가 실행되면 변수들을 초기화 하고 함수를 선언하고 이벤트가 발생할때까지 기다림
- 이벤트가 감지되었을때 callBack 함수를 호출
5.시스템 이벤트
exit : 프로그램이 종료되거나 종료되는 시점 확인할수 있음.
6.http 모듈
- Node.js에서 가장 기본적이며 중요한 서버모듈
- http 웹서버 생성과 관련된 모든 기능 담당
메소드
createServer() : 서버 생성
writeHead() : 응답 헤더를 구성
end(): 응답 body를 작성
listen(): 서버를 실행하고 클라이언트를 기다림
MIME 타입
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types
text/plain : 일반적인 text
text/html : html 파일
text/css : css 파일
text/xml :
image/jpeg :
image/png :
video/mpeg :
audio/mp3 :
7.express 모듈
- http 모듈만 사용하면 직접 많은 기능을 개발해야함.
- 간단한 코드로 웹 서버 기능의 대부분을 구현할수 있게 해주는 모듈
- 미들웨어와 라우터를 이용하여 편리하게 웹 서버를 구성할 수 있음
package 설치
npm install 모듈명
npm i 모듈명
(npm i express)
-> 설치후 package.json에 dependency 자동 추가, node_modules 폴더,package-lock.json 생성됨.
-> 추후 다른 프로젝트를 진행할 경우
package.json을 프로젝트 폴더에 넣고 터미널에 npm install 치면 dependencies에 등록된 정보에 따라 설치가 됨.
메소드
get() : 사용자 정보를 전달 받음
use(): 미들웨어를 등록
redirect() : 웹페이지의 경로를 강제로 이동
write() : 클라이언트에게 전송할 데이터를 작성
이벤트
request : 클라이언트가 서버에 요청할때 발생하는 이벤트
connection : 클라이언트가 서버에 접속할 때 발생하는 이벤트
close : 서버가 종료될 때 발생하는 이벤트
내장객체
server 객체
createServer() 메소드를 생성하여 생성
request 객체
클라이언트가 서버에게 전달하는 메세지 또는 정보를 받는 객체
response 객체
서버에서 클라이언트로 응답 메세지를 전달하는 객체
query : 클라이언트에서 GET방식으로 전송한 요청 파라미터를 확인
body : 클라이언트에서 POST방식으로 전송한 요청 파라미터를 확인
(단 , post 방식을 통한 요청 파라미터를 확인하려면 body-parser와 같은 모듈을 사용해야 함.)
8.Nodemon :
서버 코드를 변경할 때 마다 서버를 재시작하도록 하는 모듈
npm install -g nodemon
(-g : 글로벌 설치, pc에)
1)이후 package.json => script를 변경
2)예를들어 start로 지정해뒀을경우 npm start하면 value에 있는 스크립트 파일을 실행함
ex ) "start" : "nodemon 13_express2.js"
3)저장시 새로고침도 됨
app.use(bodyParser.urlencoded({ extended: false }));
urlencoded()
- body-parser를 사용하면 자동으로 req에 body 속성이 추가되고 저장됨
- 기본 인코딩 utf-8
{extended:false}
중첩된 객체표현을 허용할지 여부를 체크
URL 파싱 (두가지 방식이 있는데 중복되서 오류가 발생할수 있으므로 extended:false를 줌)
qs
query-string
9.post 보내기 테스트
postman =>
확인할것 : post, url ,body(x-www-form-urlencoded)
REST ?
Representation State Transfer
자원(url)을 이름으로 구분하여 해당자원의 상태를 주고 받는것을 의미
Router 미들웨어
- 사용자의 다양한 요청이 들어왔을때 use() 메소드로 설정한 미들웨어가 항상호출되는 불편한 점을 개선.
라우터 객체 .route('member/login').get() or post()
app.use('/', 라우터 객체)
에러페이지 처리
- Router 적용후에 사용.
app.all('*', (req, res) => {
res.status(404).send('<h2>페이지를 찾을 수 없습니다!</h2>');
});
10.템플릿 엔진 -EJS
- View를 구현하기 위한 템플릿
EJS(Embedded JS) 모듈
- 특정한 형식인 파일로 부터 HTML페이지를 생성하는 모듈
//npm i ejs
EJS 문법
<% ~~code~~ %> : 자바스크립트 코드를 입력하는 영역
<%=변수%> : 데이터 출력
<%-변수%> : ejs파일 전체를 전달
EJS데이터 전달
render() : 메소드의 매개변수에 전달하고자 하는 데이터를 입력
ejs.render(data)
11.템플릿 엔진 - PUG(Jade)
http://jade-lang.com
- install i jade
- jade.compile()
12.Node.js 메일보내기
nodemailer 모듈
gmail 서버 이용, 발신
nodemailer 설정
createTransport({
service : 'Gmail',
auth : {
user : 'gmail계정',
pass : '비밀번호'
},
host : 'smtp.mail.com,
port : '465'
});
const 객체명 = {
from : '이름<메일주소>',
to : '이름<메일주소>',
subject : '제목',
text : '내용'
(html : html코드)
}
보안수준이 낮은앱의 액세스
https://myaccount.google.com/lesssecureapps
계정 액세스 사용을 허용
https://accounts.google.com/DisplayUnlockCaptcha
네이버일경우 smpt 설정
https://velog.io/@jiwon/-Nodemailer%EB%A1%9C-%EC%9D%B8%EC%A6%9D-%EA%B4%80%EB%A0%A8-%EC%9D%B4%EB%A9%94%EC%9D%BC-%EB%B3%B4%EB%82%B4%EA%B8%B0-d4k4pqoot4
13. 사용자 정의 모듈
1)
module.exports = () =>{
modulecodes...
...
...
}
const 객체명 = require('파일명');
2)
모듈코드 작성
...
...
module.export = 변수;
const 객체명 = require('변수명');
14.JSON(JavaScript Object Notation)
데이터를 교환하고 저장하기 위해 만들어진 텍스트 기반의 데이터 교환 표준
{
"userid":"tang",
"userpw":"1234"
"hobby":[
"드라이브",
"쇼핑",
"음악감상"
]
}
JSON 문법 검증사이트
https://jsonlint.com
JSON.parse()
JSON 포맷으로 되어있는 문자열을 JSON 객체로 변환
=> JSON.parse(Stirng 문자열)
JSON.stringify()
JSON 객체를 JSON포맷의 문자열로 변환
=> JSON.stringify(JSON 객체)
15.cookie-parser모듈
npm i cookie-parser
- 쿠키를 쉽게설정고 사용할수 있게 도와주는 모듈
- 익스프레스 객체에 미들웨어로 등록
cookieParser() : 일반쿠키를 사용
cookieParser('암호화 하기위한 문자') : 암호화된 쿠키를 사용
쿠키설정
res.cookie('키','값'){
쿠키생성옵션
}
- 쿠키생성옵션 :
maxAge : 만료시간을 밀리초단위로 설정
expires : 만료시간을 GMT단위로 설정
path : cookie의 경로를 설정. 기본설정은 "/"
- 쿠키조회 :
req.cookies.cookie : 일반쿠키
req.signedCookies.cookie : 암호화된 쿠키
- 쿠키삭제 :
res.clearCookie('키', {path:'경로'}) :
16.express-session 모듈
세션을 관리하기 위한 익스프레스 미들웨어 모듈
inm i express-session
app.user(session({세션모듈의 옵션}));
세션모듈의 옵션
secret : 쿠키를 임의로 변조하는것을 방지하기 위한 값 , 이 값을 통해 세션을 암호화해서 저장
resave : 세션을 언제나 저장할지 지정하는값. 이값을 false로하는것을 권장
saveUninitialized : 세션이 저장되기 전에 saveUninitialized 상태로 미리 만들어서 저장
세션 초기설정
const 세션객체명 = req.session;
객체명. 변수 = 값;
세션 변수 사용
세션객체명.변수;
세션 삭제
req.session.destroy(()=>{
세션 삭제시 처리할 코드...;
});
17. NoSQL
- Not only SQL의 약자
- 기존의 RDBMS의 한계를 극복하기 위해 만들어진 새로운형태의 DB
- 관계형 DB가 아니므로 RDBMS처럼 고정된 스키마 및 JOIN문이 존재하지 않음
- NOSQL은 속도와 확장성을 중요시함 (RDBMS 는 무결성에 중심)
NoSQL을 사용하는 이유
- 성능
- 관계형 데이터베이스는 시스템의 신뢰도를 중요(많은 리소스를 사용, 성능떨어짐)
- 실시간 대용량 트래픽을 감당(NoSQL은 성능을 최우선)
- 메시징 시스템 등에 많이 활용
DB랭킹 참고 사이트
https://db-engines.com/en/rangking
+ 상식 : Redis => {key:value} 형식의 DB
MongoDB
https://www.mongodb.com
MongoDB 환경변수 등록방법 예시
C:\Program Files\MongoDB\Server\5.0\bin
내 컴퓨터 -> 속성 -> 고급시스템설정 -> 환경변수 -> 시스템변수 -> 새로만들기 -> 경로 붙여넣기 -> 확인
MogoDB 특징
- NoSQL이기 때문에 관계형 데이터베이스의 테이블 게임이없음
- 데이터가 모인 하나의 단위를 컬렉션이라 부름
- 데이터를 정해 놓은 컬럼의 형태로 컬렉션에 넣어야 한다는 제약이 ㅇ벗음
- MongoDB의 데이터베이스는 컬렉션의 집합
- 컬렉션은 여러개의 문서 객체를 가질 수 있음
모여서 모여서 데이터 베이스가 됨
document -> collection -> database
document
- RDBMS의 record와 비슷한 개념
- 데이터 구조가 한개 이상의 key-value-pair로 이루어져 있음
- 동적 스키마를 가짐 : 같은 collection 안에 있는 document끼리 다른 스키마를 가질 수 있음.
예) {"nickname":abc, "userid":"apple", "userpw":"1111"}
{"name":"kim", "number":"123"}
collection
- document의 그룹
- collection 내부에 document들이 위치
- table과 비슷한 개념이지만 RDBMS와 달리 스키마를 따로 가지지 않음
MongoDB의 문법 ::
DB의 확인
show dbs;
DB 생성
use 데이터베이스명;
use frontend;
*데이터베이스가 없으면 생성, 있으면 선택
*데이터베이스에 자료가 없을 경우 show dbs에서 나타나지 않음
컬렉션 생성
db.createCollection('컬렉션명');
db.createCollection('testCollection');
컬렉션 확인
show collections;
컬렉션 삭제
db.컬렉션명.drop();
db.testCollection.drop();
document 추가
db.컬렉션명.insert(객체)
db.member.insert({'userid':'apple','userpw':'1234'})
db.member.insert({'userid':'mango','userpw':'2222','name':'망고','gender':'man'})
db.member.insert({'userid':'lemon','userpw':'3333','name':'레몬','gender':'woman'})
document 확인
db.컬렉션명.find();
db.member.find();
++ document 정렬해서 보기
db.컬렉션명.find().pretty();
db.member.find().pretty();
++ document 특정값 선택하기
db.컬렉션명.find().pretty();
db.member.find({"userid":"mango"}).pretty();
* _id는 각 document의 유일한 key로 쓰이는 값.
document의 비교연산
$eq : 주어진 값과 일치하는 값을 찾음.
$gt : 주어진 값보다 큰 값을 찾음
$gte : 주어진 값보다 크거나 같은값을 찾음.
$lt : 주어진값보다 작은값을 찾음.
$lte : 주어진값보다 작거나 같은 값을 찾음.
$ne : 주어진 값과 일치하지 않는 값을 찾음. (not equal)
$in : 주어진 배열안에 속하는 값을 찾음.
$nin : 주어진 배열안에 속하지 않는 값을 찾음. (not in)
ex) db.member.find({"gender":{$eq:"man"}}).pretty();
document의 논리연산
$and : 주어진 모든 조건이 true 일때 true인 결과를 찾음
$or : 주어진 조건 중 하나라도 true 일때 true인 결과를 찾음
$not : 주어진 조건이 false일때 true, true일때 false인 결과를 찾음.
ex) db.member.find({$and:[{"userid":"lemon"},{"userpw":"3333"}]}).pretty();
document의 정렬
db.컬렉션명.find().sort(객체)
*객체
{key:value} -> key는 데이터의 field 이름, value의 값은 1(오름차순)또는 -1(내림차순)
여러 key를 입력할 수 있고, 먼저 입력한 key가 우선권을 갖게 됨.
db.member.find().sort({"_userid":-1}).pretty()
document의 갯수 제한
limit(): 출력할 데이터 개수를 제한할 때 사용.
db.컬렉션명.find().limit(출력할 개수)
db.member.find().limit(3).pretty();
document 데이터 생략후 출력
skip(): 출력할 데이터의 시작부분을 설정할 경우 사용.
db.컬렉션명.find().skip(생략할 개수);
db.컬렉션명.find().skip(2).pretty();
document의 수정
1.특정 field 업데이트
db.컬렉션명.update(객체,{$set:바뀔객체});
db.member.update({"userid":"lemon"},{$set:{name:"오렌지"}});
2. document의 replace
db.컬렉션명.update(변경할 객체, 바뀔 객체);
ex)
db.member.update({"userid":"lemon"},{"name":"레몬","age":30,"point":900});
db.member.update({"name":"레몬"},{'userid':'lemon','userpw':'3333','name':'레몬','gender':'woman'})
3. 특정 field 제거
db.컬렉션명.update(변경할 객체,{$unset:{제거할 객체}})
db.member.update({"name":"레몬"},{$unset:{gender:1}})
*gender :1
1 -> true의 의미
-----------------------------
?이 부분 다시 체크필요?
4. 특정 document가 존재하지 않을 경우 새로 추가하기
db.컬렉션명.update(추가할 객체, 추가할 객체.. ,{upsert:true});
db.member.update({"userid":"lemon"},{"age":30, "kor":100,"eng":100,"math":100},{upsert:true})
5. 여러 document의 특정 field를 수정
db.컬렉션명.update(적용할 객체, $set:{수정할 객체}, {multi:true});
db.member.update({point:{$gte:3333}}, {$set:{"point":500}},{multi:true});
----------------------------------
6.document의 삭제
db.컬렉션명.remove(객체)
db.member.remove({"_id":ObjectId("628cda724a5acf482d5e1fe5")})
18.multer 모듈
npm i multer
파일을 업로드 하기 위한 익스프레스 미들웨어
multer.diskStorage(
desination : 파일을 저장할 디렉토리 설정
//다수의 사용자가 같은이름의 파일을 저장시 절대 중복되지 않도록 filename지정
filename : 파일이름을 설정
)
multer({
storage : diskStorage 설정객체
limits : {
files : 파일전송개수,
fileSize : 파일 전송 용량
}
})
moment.js
https://momentjs.com/
날짜와 시간을 쉽게 다룰 수 있도록 도와주는 js 라이브러리
jquery
https://releases.jquery.com/
serve-static 모듈
특정 폴더를 요청에 의해 직접 파일에 접근할 수 있도록 기능을 제공하는 익스프레스 미들웨어
morgan 모듈
npm i morgan
로그를 관리하기 위한 별도의 라이브러리 모듈
19.mongoose 모듈
- MongoDB의 ODM(Object data mapping) 모듈
- 하나의 컬렉션 안에 똑같은 속성을 가진 문서객체를 반복적으로 넣어두면 데이터를 조회할때도 어떤 속성들이있는지 미리 알고 있는 상태에서 조회할 수 있음 -> 스키마 생성
ODM
데이터베이스와 객체지향 프로그래밍 언어 사이 호환되지 않는 데이터를 변환하는 프로그래밍 기법
mongodb vs mongoose
mongodb : 예) 자바 jdbc 드라이버
mongoose : 예) 자바 Mybatis, Hibernate와 같은 개념
mongoose 객체.connect(uri[, 옵션, 콜백]);
uri : mongodb://ip:port/db명
스키마
- mongoose에서는 데이터 유효성 검증을 위해 스키마를 사용
- 데이터 타입 및 규약 등 설정
- 스키마 type
: String , Number, Date, Boolean, Array
모델
- 데이터베이스에서 데이터를 읽고 생성하고 수정하는 인터페이스를 정의해줌.
mongoose객체.model(컬렉션명, 스키마명)
//컬렉션 이름을 지정하지 않으면 1번째 매개변수에 s를 붙여 복수형으로 사용함
20.passport 모듈
- 세션을 내부적으로 처리해주는 패키지
- 구글, 페이스북, 카카오톡 등 로그인 기능을 구현
- 로컬 로그인과 SNS로그인 모두 개발가능
페이스북 개발자 센터
http://developer.facebook.com
serializeUser()
로그인 한 뒤 세션에 데이터를 저장할때 어떤 정보를 저장할 지를 결정
deserializeUser()
세션에 저장한 데이터로 로그인한 유저정보를 복구하는데 사용