생각기록

2022_11_19_프로미스 본문

SeSAC 풀스택/Nodejs

2022_11_19_프로미스

끼록관 2022. 11. 19. 18:18

동기와 비동기

동기는 순차적이라면,

비동기는 병렬적

서버와 웹브라우저의 통신은 예측하기 힘들다.

 

프로미스(Promise)

는 비동기를 간편히 처리할 수 있도록 돕는 오브젝트

  • 콜벡으로 인한 복잡도 증가와 예외처리 어려움을 해결하기 위해 만들어짐
  • 비동기 작업에서 성공과 실패를 분리해 메소드를 수행
  • resolve(value):일이 성공적으로 끝난 경우 -> 프로미스를 실행한 곳의 then으로 들어간다.
  • reject(error):일이 성공적이지 않은 경우. 에러 발생 시 ,> 프로미스를 실행한 곳의 catch로 들어간다.

// new Promise ( function ( resolve, reject ){ });
//함수의 return은 값을 받을 수 있다.
function func1( ){
    return new Promise (function(resolve, reject){
        resolve('성&&공');
    });
}
function func2(){
    return new Promise (function(resolve, reject){
        setTimeout(function(){
            resolve('성_공');}, 1000);
    });
}

func1().then(function(result){
    console.log('result1 : ', result);
});
func2()
.then(function(result){
    console.log('result2 : ', result);
    return 'a'; 
}).then(function(abc){
    console.log('abc : ', abc);
}); 
//함수1을 리턴하면 .then이라는 친구로 값을 받겠다.
//then은 promise를 벗기고 팬딩 벗기고 resolve에 들어온 내용이 온다.
//func2 팬딩을 then이 기다렷다가 그 resolve 내용을 첫번째 인자로 받아옴 - 1초 성공을 가져온다.
//then 안에 return 시키면, 다음 then이 받는다. = 체이닝

1. state (상태)

pending > fulfilled(성공) or rejected(실패)

pending : promise가 만들어져서 지정한 명령어를 실행(opaeration)할때

pending이 실행완료 하면 > fulfilled(성공) or rejected(실패)

pending : promise를 수행중인 상태 / 성공과 실패가 결론이 나지 않고 돌고 있는 상태

fulfilled : resolve된 상태

rejected : 지켜지지 못한 상태

settled : fulfiied 혹은 rejected로 결론이 난 상태

 

프로미스는 비동기

동기처럼 사용하는 방법 체이닝

 

 

Producer  vs  Consumer

1. Producer

  • 새로운 프로미스가 만들어질때는, 함수가 바로 실행 된다. (염두!!!)
  • 우리가 원하는 기능을 비동기적으로 실행하는 promise
  • promise는 class기 때문에 new라는 키워드를 통해 오브젝트 생성 가능
  • 콜벡함수 2개 받음 > 기능을 성공적으로 수행했을 때 resolve(value), 실패 했을 때 reject(error)
  • 파일을 읽거나 network 서버 관련일은 비동기적으로 하는게 좋다.

2. Consumers : then, catch, finally

then은 앞의 함수의 팬딩을 기다렸다가 resolve 값을 뒤의 인자로 받는다.(return과 비슷하다)

then에서 return 은 다음 .then에게 그 값을 반환한다.  =  체이닝

 

 

 

 

 

 

 


fs 모듈 

콜벡함수 방식으로 처리했었으나, 업그레이드로 프로미스 방식을 사용할 수 있게 되었다.

 

 

 

프로미스

 


실습

 

 

 


http 통신

클라이언트 -> 서버로 요청(request)

서버의 응답(response)  > 클라이언트 

 

nodejs를 통해 서버 구축 방법

http와 express 두개

 

 express 를 쓸것임


http 모듈로 서버 만들어보기!

 

http 모듈

는 내장모듈이고, 오래전부터 있어서 요즘은 거희 사용하지 않음

 

 

1. const http = require('http');

http모듈을 불러와서 객체에 넣는다.

내장 모듈은 require로 불러서 객체에 넣는다.

 

 

2.const fs = require('fs').Promise;   //파일을 읽기위해 fs모듈 불러오기

const server = http.createServer( function (req, res ){   // server라는 객체에 서버 생성 객체 함수 createServer

fs.readFile('./2022_10_27_Cafe drink documentation.html')  // fs모듈 파일 읽어오는 명령어
        .then(function(data){                                                 // than > 위의 명령어 실행 후 대기했다가 뒤의 명령어를 실행                                                                                                              res.end(data.toString()); 해라
            res.end(data.toString());                                         // res 서버의 응답. end 마침표로 (해당 파일을 보낸다.)

};

 

 

createServer는

  • 서버를 만드는 객체
  • req(클라이언트의 서버요청)
  • res(서버의 그에 대한 응답)

 

 

 res.end 를 해주지 않으면,

서버는 응답에 대한 마무리를 설정하지 않아서 무한 로딩에 빠짐

 

 

sever.listen( port, callback)은

서버를 첫번째 매개변수 포트로 실행

listen은 서버를 실행시키고, 클라이언트를 기다린다. 

sever.listen(8080, function(){

   console.log('8080번 포트로 실행');

}); 

 

=> fs. ~ . then은

앞의것을 실행 완료 후, 뒤의 것을 실행한다.

 

=> 밑의 콜벡은

8080포트를 실행시키고, '8080번 포트로 실행'이란 console.log가 실행 된다.


서버 주의 할 점

홈페이지 접속 방법 : 브라우저 키고 > localhost:8080 

접속은 파일이 실행중인 상태에서 서버에 접속해야 한다 ( node js파일 터미널로 실행 )


파일을 수정 : 현재 로딩중이면 x, 터미널에서 실행 취소 : ctrl + c 해주고, 파일 수정 한 것을 저장해야 된다.

서버 코드 수정시 서버를 끄고 >  저장  > 다시 실행 >   접속

우리는 접속시 listen(8080, ~)이란 얘는 접속시 8080포트를 열겠다는 의미이다.

 

const http = require('http');
const server = http.createServer( function (req, res ){ //createServer는 req(클라이언트의 서버요청) res(서버의 그에 대한 응답)
        res.write('<h1>HELLO</h1>');   //클라이언트가 8080으로 접속하면 실행될 함수
        res.end('<hr>');   //res.end를 해주지 않으면, 마침표가 없어서 끝나지 않음 = 더이상 응답을 보내지 않겟다. (서버의 응답)
});

//서버라는 객체 
//createServer로 만들어진 객체는 .on이라는 얘를 쓸수있고, 얘는 이벤트를 등록하는 함수임
//server.on(); // 이벤트 등록

server.listen(8080, function(){         //서버실행 하고, 클라이언트를 기다림 
    console.log('8080번 포트로 실행'); 
});
 

 

 

response 객체

서버가 클라이언트한테 응답할 때 필요한 것들이 들어간다.

  • writeHead ( = 응답헤더를 여기서 작성 )
  • write 응답 본문 작성
  • end 응답 본문 작성 후 응답 종료 ( 질문 마무리 )

검사 > 네트워크 > 새로고침 (서버에 접속하게 됨) > 네트워크란에 어찌 통신했는지 쓰임 

 

 

 

localhost

  • 내 컴퓨터
  • ( localhost:8080 > 내 컴퓨터의 8080포트 열어라)

port

  • 서버 내에서 데이터를 주고받는 프로세스를 구분하기 위한 번호
  • 기본적으로 http 서버는 80번 포트 사용 ( 생략 가능, https는 443 )

 

씨컬라이즈 배울떄 에이싱크웨이즈? 배울것

 

http 응답

상태코드란? 응답을 할 때 상태를 알려주는 것

이것은 정해져있다

 

100번대는 처리중인 상태

 

200번대는 성공

 

300번대는 리다이렉트 다른페이지로 이동할때

 

400번대: 요청 오류

400:잘못된 요청, 401:권한 없음, 403: 금지됨

404: 찾을 수 없음(page not found)

 

500 : 서버 오류

정해진 형식을 따라서 해줘야 한다.

 

http는 우리가 잘 사용하지 않을것이라, 깊게 공부 ㄴㄴ


실습 로컬, 서버에 파일 적용

 

http 모듈

1.로컬 8080 포트로 접속하면 애벌레 html이 뜨도록 시키기

2.파일질라에서 서버 접속 후 애벌레 html업로드 후 putty에서 실행

 

내컴퓨터에서 서버파일 적용 시키고 >  해당 파일(서버js + 관련된 파일)을 서버에 업로드(파일질라로)

> 푸티로 실행햇을떄 > 내 서버(공인아이피 : 8080)로 애벌레 html파이 뜨게 하도록

1. 로컬 작업

1. 로컬 서버 만들고 html파일 적용

const http = require('http');
const fs = require('fs').promises;

const server = http.createServer( function (req, res){
    fs.readFile('./애벌레.html')
    
    .then(function(data){
        res.end(data.toString());
    });
    console.log('데이터 전송됬나?');
});

server.listen(8080, function(){
    console.log('8080번 포트로 실행');
});

2. localhost:8080 으로 적용 확인

 

 

2. 서버 작업

파일질라에서

 

1.서버js 파일과 그곳에 쓰인 소스 파일들 같이 서버에 업로드

 

 

2. ncp(네이버 클라우드 플랫폼)에서 8080포트를 열어줘야 한다.

 

3. 그 다음 putty로 접속

로그인 후

vscode랑 사용법은 같다

cd명령어로 해당 서버 폴더에서 노드 파일 열기!

cd /var/www/html/sever2 node '파일명.js'

 

서버 적용 확인법은

웹브라우저에서

공인 아이피 : 포트넘버

여기서 나는 8080포트를 사용했으니 > 공인 아이피: 8080

 

 

'SeSAC 풀스택 > Nodejs' 카테고리의 다른 글

2022-11-24 동적 form 전송  (0) 2022.11.24
2022-11-22 Express, ejs 수업  (0) 2022.11.23
callback  (0) 2022.11.17
2022-11-17 node.js 모듈, 구조 분해 할당, callback  (0) 2022.11.17
노드.js  (0) 2022.11.15