[개발기초] 비동기 - 4주차 (2)

Hong·2022년 10월 10일
0

💬
동기 비동기 평소에는 잘 쓰지 않는 용어니까
이해를 위해서 예를 들어보자
전화와 문자를 생각해보자
전화는 동기적이라고 할 수 있다 왜냐하면 전화가 오면(요청이 들어오면) 하던 일을 멈추고(blocking) 결과를 실행해야하기 때문이다.
하지만 문자는 비동기적이라고 할 수 있다 왜냐하면 문자가 오더라도 확인 후, 나중에 답장할 수 있기 때문이다(non-blocking) 때문에 요청에 대한 결과가 동시에 일어나지 않는다(비동기)


강의를 들으면서 강사님은 전화보다 문자를 선호한다고 하셨다 왜냐하면 본인이 하던 일을 하는 동시에 상대방과 연락을 할 수 있기 때문이라고 하셨다 그래서인지 평소에도 전화보다 문자를 더 좋아하신다고..


🙂(스킵가능)
잡담이지만 나는 그렇게 생각하지 않는다 우리가 전화를 하는 이유는 언어적인 정보전달 뿐만 아니라 비언어적인 정보(숨소리, 말투, 강약 등등)도 함께 캐치하기 위해서다

누군가와 말 싸움을 할 때 문자로 싸우다 보면 서로 크고 작은 오해가 생겨 더 감정이 상하기 마련이다 문자는 비언어적인 정보전달이 결여되어 있으니 문자를 보내는 사람은 본인의 의도가 텍스트에 정확하게 전달되지 않고 때문에 문자를 받는 사람은 메세지 내용을 왜곡되게 인식한다.

그래서 나는 중요한 얘기를 할 때는 무조건 만나서 얼굴을 보며 말하는 것이 맞다고 생각하고 그 다음은 전화, 정말 불가피 하다면 문자라고 생각한다.

하지만 컴퓨터는 친구도 없고 감정도 없으니 비동기가 효율적이고 최고인 걸로






📂fs.readFile을 이용해

Node.js module 사용하기

const fs = require("fs");

const getDataFromFile = function (filePath, callback) {
  fs.readFile(filePath, (err, data) => {
    if (err) {
      callback(err, null);
    } else {
      callback(null, data.toString());
    }
  });
};

getDataFromFile('README.md', (err, data) => console.log(data));


module.exports = {
  getDataFromFile
};

const { readFile } = require("fs");

const getDataFromFilePromise = filePath => {
   return new Promise((resolve, reject) => {
      readFile(filePath, (err, data) => {
        if (err) reject(err);
        if (!err) resolve(data.toString());
      })
   })
};

getDataFromFilePromise('README.md').then(data => console.log(data.toString()));

module.exports = {
  getDataFromFilePromise
};

const path = require('path');
const { getDataFromFilePromise } = require('./02_promiseConstructor');

const user1Path = path.join(__dirname, 'files/user1.json');
const user2Path = path.join(__dirname, 'files/user2.json');

const readAllUsersChaining = () => {

  return new Promise((resolve, result) => {
    const newArray = [];
    
    getDataFromFilePromise(user1Path)
        .then((value) => {
          newArray.push(JSON.parse(value));
          return getDataFromFilePromise(user2Path);
        })
        .then((value) => {
          newArray.push(JSON.parse(value));
          resolve(newArray);
        })
  })
}

 readAllUsersChaining();

module.exports = {
  readAllUsersChaining
}

const { resolve } = require('path');
const path = require('path');
const { getDataFromFilePromise } = require('./02_promiseConstructor');

const user1Path = path.join(dirname, 'files/user1.json');
const user2Path = path.join(dirname, 'files/user2.json');

const readAllUsers = () => {
  return new Promise((resolve, reject) => {
    Promise.all([getDataFromFilePromise(user1Path), getDataFromFilePromise(user2Path),])
      .then((result) => {
        resolve(result.map(elem => JSON.parse(elem.toString())));
      });
  });
};

console.log(readAllUsers());

module.exports = {
  readAllUsers
};

//await를 이용해 위의 비동기 방법과 비교해서 훨씬 간결하게 코드를 작성할 수 있었다
const path = require('path');
const { getDataFromFilePromise } = require('./02_promiseConstructor');

const user1Path = path.join(dirname, 'files/user1.json');
const user2Path = path.join(dirname, 'files/user2.json');

const readAllUsersAsyncAwait = async () => {
  const user1 = await getDataFromFilePromise(user1Path);
  const user2 = await getDataFromFilePromise(user2Path);

  return [JSON.parse(user1), JSON.parse(user2)];
};

// readAllUsersAsyncAwait();

module.exports = {
  readAllUsersAsyncAwait
};



📡 fetch를 이용한 네트워크 요청

function getNewsAndWeather() {

  return new Promise((resolve, result) => {
    const obj = {};
    
    fetch(newsURL)
        .then((response) => {
          return response.json();
        })
        .then((newsData) => {
          obj["news"] = newsData.data;
          return fetch(weatherURL)
        })
        .then((response) => {
          return response.json();
        })
        .then((data) => {
          obj["weather"] = data;
          resolve(obj);
        })
  })

}

if (typeof window === 'undefined') {
  module.exports = {
    getNewsAndWeather
  }
}
unction getNewsAndWeatherAll() {
  return new Promise((resolve, reject) => {
    
    const obj = {};

    Promise.all([fetch(newsURL), fetch(weatherURL)])
      .then(results => {
        Promise.all([results[0].json(), results[1].json()])
          .then(results => {
            console.log(results[0], results[1]);
            obj.news = results[0].data;
            obj.weather = results[1];
            resolve(obj);
          });
      });
  });
}

if (typeof window === 'undefined') {
  module.exports = {
    getNewsAndWeatherAll
  };
}

//await를 이용해 위의 비동기 방법과 비교해서 훨씬 간결하게 코드를 작성할 수 있었다
async function getNewsAndWeatherAsync() {

  const obj = {};

  const newsResult = await fetch(newsURL).then((response) => {return response.json()});
  const weatherResult = await fetch(weatherURL).then((response) => {return response.json()});

  obj["news"] = newsResult.data;
  obj["weather"] = weatherResult;

  return obj;

}
if (typeof window === 'undefined') {
  module.exports = {
    getNewsAndWeatherAsync
  }
}









🥲
4주차 마지막 포스팅인데
정신적으로나 육체적으로나 힘든 한주였다
미국에서 여유로운 시간을 몇 개월 보내고
유럽여행을 길게 하고 와서 바로 학기와 부트캠프를 시작했다
비전공자인 나에게 부트캠프 자체가 어려운 일인데 학교공부와 같이 할려니 무리가 있었을 것이랴

정말로
목요일 비동기 수업이 끝난 이후에는
번아웃이 와서 아무것도 할 수 없었다
무기력, 끝없는 잠, 약간의 우울과 싸우며 3일을 보낸 것 같다

진로문제, 취업문제로 고민이 많아졌다 그래서 더 힘든 감정들이 날 찾아왔나보다

옳은 선택은 없고, 옳은 선택을 만들어가는 과정만 있을 뿐이다

profile
Notorious

0개의 댓글