nodejs

이진희·2021년 11월 11일
0

class

ES6+ 에서 추가된 문법. 여전히 프로토타입 기반으로 동작

var Human = function(type){
	this.type =  type || 'human';
};

Human.isHuman = function(human){
	return human instanceof Human;
}

Human.prototype.breathe=function() { alert('h-a-a-am')}

var Zero = function(type, firstName, lastName){
	Human.apply(this, arguments);
	this.firstName = firstName;
	this.lastName = lastName;};

Zero.prototype = Object.create(Human.prototype);
Zero.prototype.constructor = Zero; // 상속하는 부분
Zero.prototype.sayName = function(){alert(this.firstName).,.}

promise

const condition = true;

const promise = new Promise((resolve, reject) => {
  if (condition) resolve("성공");
  else reject("실패");
}); // promise 객체 생성

promise
  .then((message) => console.log(message))  //성공(resolve)한 경우 실행
  .catch((err) => console.error(err))   //실한 경우 실팽
  .finally(() => console.log("무조건"));// 끝나고 무조건 실행

//프로미스 : 실행은 바로 하되 결괏값은 나중에 받는 객체. 결괏값은 실행 완료 후 then이나 catch 메서드를 통해 받음.
// 즉 new Promise라는 것의 실행은 바로 되지만! 결괏값은 Then.을 붙였을 때 받게 됨.
// callback지옥 대신 Then속에서 처리를 하고, 그 결과값을 return하고 그 다음 then을 실행함으로써 callback과 달리 깊이가 달라지지 않음.

4장. http 모듈로 서버 만들기

http모듈의 필요성 → http 서버가 있어야 웹 브라우저의 요청을 처리 가능

http.createServer메서드에 콜백함수를 등록시켜놓으면, 요청이 들어올 때마다 콜백함수가 실행됨.

http.listen ⇒ 8080포트에서 listen. 8080포트로 접속하면 listening이벤트가 발생.

server⇒http.createServer 객체를 저장해놓은 변수

server.on(이벤트명, 이벤트에 따라 ㅎ실행시킬 콜백함수) 로 실행시켜주면 됨.

4.2. REST와 라우팅 사용하기

서버 요청 ⇒ 주소를 통해 요청의 내용 표현

요청의 내용이 주소를 통해 표현되므로 서버가 이해하기 쉬운 주소를 사용하는 것이 좋음.

REST==REpresentational State Transfer. 서버의 자원을 정의하고 자원에 대한 주소를 지정하는 방법을 가르킴. REST API의 규칙

  1. 의미를 명확하게 하기 위해 주소는 '명사'로 표현
  2. http 요청 메서드 → 명사만으로는 어떤 행위를 하려는 건지 구분이 쉽지 않음. 그래서 동작을 뜻하는 http 요청 메서드를 이용.
    • GET : 서버 자원을 가져오고자 할 때 ⇒ 브라우저에서 캐싱할 수 있음.(같은 요청 시 서버에서 들고오는 게 아니라 캐싱된 자원을 반환하므로 성능이 좋아짐)
    • POST : 서버에 자원을 새로 등록하고자 할 때. 요청 본문에 새로 등록할 데이터를 넣어 보냄
    • PUT : 서버의 자원을 요청에 들어 있는 자원으로 바꾸고자 할 때 사용
    • PATCH : 서버 자원의 일부만 수정하ㄱ자 할 때 사용
    • DELETE : 서벚의 자원을 삭제하고자 할 때
    • OPTIONS : 요청을 하기 전 통신 옵션을 설명하기 위해 사용

4.3 쿠키와 세션 이해하기

클라이언트에서 보내는 요청 ⇒ 누가 요청을 보내는지 모름.

로그인을 구현하려면 쿠키와 세션에 대해 알고 있어야 함.

웹 사이트에 방문, 새로고침시 로그아웃이 되지 않는 것= > 클라이언트가 서버에 사용자가 누구인지를 지속적으로 알려주고 있는 중.

쿠키 : 서버는 요청에 대한 응답을 할 때 쿠키를 함께 보냄. 쿠키는 유효 기간 있음. name=zerocho와 같이 단순한 '키-값'의 쌍임. 서버로부터 큌가 오면 웹 브라우저는 쿠키를 저장해두었다가 다음 요청할 때마다 쿠키를 동봉해서 보냄. 즉, 쿠키를 통해 브라우저에서 오는 요청이 누구한테서 오는 건지 구분하는 것임.

쿠키는 요청의 헤더에 담겨 전송됨.

const http=require('http')

http.createServer((req,res)=>{
	console.log(req.url, req.headers.cookie);
	res.writeHead(200,{'Set-Cookie':'mycookie=test'}
	//Set-Cookie헤더를 통해 쿠키를 지정함.
	res.end('Hello Cookie')	
}).listen(8083,()=>{console.log('8083포트에서 서버 대기 중')}

서버에 사용자 정보를 저장하고 클라이언트와는 세션 아이디로만 소통.

그 세션 아이디를 쿠키로 전송하고 주고 받는 게 일반적.

4.4 https와 http2

https : 웹 서버에 SSL 암호화 추가. https는 인증서가 필요하징.

https createserver할때는 도메인 인증서, 상위 인증서가 필요함. 443포트

4.5 cluster

cluster 모듈 : 기본적으로 싱글 프로세스로 동작하는 노드가 CPU코어를 모두 사용할 수 있게 해주는 모듈. 포트를 공유하는 노드 프로세스 여러 개 두는 것도 가능.

멀티 프로세스 == 메모리 공유는 안 됨. 그러므로 메모리에 세션 정보를 저장했을 때 문제가 생길 숭 ㅣㅆ음

6.2 자주 사용하는 미들웨어

💡 자주 사용하는 모듈 1. dotenv : .env파일을 읽어 process.env파일로 만듦. 보안과 설정의 편의성 때문에 사용 2. path : directory path 등을 가져와주기 때문에 필요.
  • 요청과 응다븨 중간에 위치해서 미들웨어라고 부름
  • 요청과 응답을 조작해 기능을 추가하기도, 나쁜 요청을 걸러내기도 함.
  • app.use(middleware)형식로 사용, 특정 요청에만 미들웨어 적용하고 싶으면 맨 앞인자로 path도 함께 넘겨주면 됨.
  • (res,req,next)로 인자 받고 처리 다 되면 next()호출해줘야 다음 미들웨어로 넘어감.
  • 에러(throw new Error같은거)는 에러 처리 미들웨어로 가게 되어있음
  • next(err)를 호출하면 에러 처리 미들웨어로 바로 짬푸.
  • 미들에어 간 데이터 전달 가능. 요청이 끝날 때가지만 데이터를 유지하고 싶으면 req객체에 데이터를 넣어 전달하면 됨. 세션 유지 동안 계속 유지되는 데이터라면 세션에 함께 보관.
  • 미들웨어 내에 미들웨어 넣는 거 SSAP가능(요청 주소에 따라 분기 처리 가능해짐.)

자주 사용하는 미들웨어 종류

  1. morgan

    1. app.use(morgan('dev')).
    2. 모드 : dev, combined, common, short, tiny등. 개발환경에서는 주로 dev, 배포 환경에선 combined많이 사용.
  2. static

    1. express 내장.
    2. 내부적으로 next()를 호출하지 않음(res.sendFile 등 메시지로 응답을 보냄). ⇒ static을 제공하는 경우 express.json, express.urlencoded, cookieParser등은 실행되지 않음. next()를 호출하지 않으니까!. static제공시에는 static만 제공하면 할 일 끝난 거니까 그게 맞기도 함. 미들웨어 호출 순서도 중요함!!
    3. 정적인 파일들을 제공하는 라우터 역할.
    app.use('요청 경로', express.static('실제 경로');
    
    app.use('/', express.static(path.join(__dirname,'public')))
    // /로 자원 요청시 현재 directory의 public에 있는 자원을 static하게 제공.
  3. cookie-parser

    1. 요청에 동봉된 쿠키를 해석해 req.cookies 객체로 만듦.
    2. 유효 기간이 지난 쿠키는 알아서 걸러짐.
    3. 쿠키 생성/제거시에는 res.cookie(키, 값, 옵션), res.clearCookie메서드를 사용해야 함.
      1. 쿠키 생성 옵션 : domain, expires, httpOnly, maxAge, path, secure
      2. clearCookie시에는 expires, maxAge를 제외한 옵션까지도 존재하는 쿠키와 일치해야 없어짐.
    app.use(cookieParser(비밀키));
  4. body-parser : express ≥ 4.16.0 부터 body-parser내장해서 나오기 때문에 따로 import할 필요X

    1. 요청의 본문이 Raw,Text형식일 경우 body-parser따로 설치해줘야 함.(기본 : JSON, url_encoded형식)
    2. 요청의 본문에 있는 데이터를 해석해 req.body객체로 만들어 줌.
    3. 멀티파트 데이터(ex. 이미지, 동영상, 파일)는 처리XXX
    app.use(express.json())
    app.use(express.urlencoded({extended:false}); // url_encoded = 주소 형식으로 데이터를 보내는 방식
    //express body-parser. json, url-encoded형식일 경우.
    
    const bodyParser=reqruire('body-parser');
    app.user(bodyParser.raw());//요청의 본문이 버퍼 데이터일 경우
    app.user(bodyParser.text());//요청의 본문이 텍스트일 경우 
  5. express-session

    1. 세션 관리용 미들웨어.

    6840

    1. 로그인 등의 이유로 세션 구현, 특정 사용자를 위한 데이터를 저장해둘 땨ㅐ 유용
    2. 세션은 사용자별로 req.session 객체 안에 유지됨
    app.use(session({
    
    }));
  6. multer : 파일 업로드 관련. 좀 어려움.

    1. 이미지, 동영상을 비롯한 여러 파일을 멀티파트 형식으로 업로드할 때 사용하는 미들웨어(multipartform-data)

    3EB9BE66-182C-4ED5-BC64-03F48FC43E89.jpeg

8장. mongoDB

8.1 NOSQL vs SQL

  • nosql : not only sql.

8.4 데이터베이스 및 컬렉션 생성

  • use [데이터베이스명] : 데이터베이스가 없으면, 지정한 이름으로 데이터베이스 생성
  • show dbs : 모든 데이터베이스 목록 확인(이 때, 새로 만든 db에 아무런 데이터도 저장되어 있지 않다면 뜨지 않음)
  • db.collection(콜렉션이름) : db안에 row라고 생각하면 됨. 데이터베이스 내에 db 구분자? 같은 거
  • show collections:현재 조회하고 있는 db의 collection을 확인할 수 있음.

8.5 CRUD 작업하기

  1. Create

    1. 자유로운 형태로 데이터를 넣을 수 있음.
    2. js문법을 사용하므로 js에서 제공하는 자료형 사용 가능. 이 외에 objectId, Binary Data,Timestamp도 사용 가능. objectId는 primary key와 비슷.
    db."collectionname".save({data~~~}
  2. Read

    db."collectionname".find({"도큐먼트 내용들~~~"});
    //find({})는 해당 콜렉션 내의 모든 도큐먼트를 조회.
    //특정 필드만 조회하고 싶다면 조회하고 싶은 필드는 "key":1,
    //조회하고 싶지 않은 필드는 "key":0으로
    
    db."collectionname".find({},{_id:0, name:1, married:1 })
    //이러면 모든 도큐먼트에서 name,, married 필드만 가져옴
    
    모든 도큐먼트 조회하고 싶지않다면 맨 앞 파라미터에 조건을 넣어주면 되겠쥬.
  3. Update

db."collectionname".update({업데이트하려는 도큐먼트를 특정할 수 있는 조건},
	 {$set:{comment : "코멘트 필드를 이 멘트로 업데이트합니다."}});
  1. Delete
db."collectionname".remove({name:'nero'})//{}안에 삭제할 도큐먼트 조건을 넣어주면 됨
profile
슬로우 스타터

0개의 댓글