[Back-end🦁] #40 Node.js


1. Github
#39は、次いで、修正、stash、cherry−pick、pull要求を整理した.
2. Node.js
1. node??
  • JavaScript実行時:JavaScriptが実行できる環境(アクチュエータ)を指す.本来JavaScriptはブラウザでのみ実行されます.
  • JavaScriptを非ブラウザからサーバに移行し、サーバを作成できます.
  • 特長
  • イベントに基づく:イベントが発生したときに予め指定された操作を実行する.
  • イベントループ:実行するタスクをコールスタックに積み上げ、バックグラウンドで実行する必要があるタスクをバックグラウンドに送信し、バックグラウンドタスクが完了した後、タスクスタック内のタスクをコールスタックに積み上げ、コールスタック内のタスクがすべて完了した後、イベントループはタスクキュー内のタスクをコールスタックに移動して実行する.
  • Non-Blocking I/O
  • <->I/Oをロックするには、サーバの稼働中にクライアントが待機する必要があります.
  • 非同期入出力、キャッシュが処理されていないので、まずコーヒーメーカーに渡します!)
  • 時間の作業はバックグラウンドで行います.クライアントは、タスクの進行中にサーバにリクエストを送信し続けることができます.
  • シングルThread(1キャッシュ)
  • すべてのリクエストは、1つのスレッドによって担当されます.
  • スレッドに問題が発生すると、スレッド全体に問題が発生します.
  • シングル!これにより、メモリまたはリソースを効率的に使用できます.
  • <->マルチスレッド:複数のスレッドスライス処理は、1つのスレッドに問題が発生しても代替できますが、スレッド切り替え時にコストが発生し、スレッドが遊んでいる問題が発生する可能性があります.
  • 長所
  • 単一スレッド、ブロックI/Oなし、処理速度が速い->チャット、I/O密集型サーバーに適しています.
  • コンピュータ資源の消費が少なく、生産効率が高い.
  • 短所
  • 単一スレッドは、リソースを大量に消費するタスクを実行する際に、負荷が大きい.
  • シングルスレッド==1つのCPUコアのみを使用->CPUタスクの多いサーバでは使用できません.
  • 論理が複雑な場合、コルバー地獄に陥る可能性があります.
  • エラーが発生すると、プロセス自体が死亡します.
  • ->論理が簡単で、応答速度が速く、開発速度が速く、非同期で実行する必要があるサービスに適しています.
    ->インストール後に使用し、環境がインストールできない場合はクラウドIDE、AWSなどを使用できます.
    2.ノード環境で実行
    node
    # node 런타임에서 직접 코드 입력해서 실행 가능
    node filename
    # js파일을 실행시켜줌. - 어떤 페이지에 갔을 때 어떤 js파일을 실행할지 같은 것을 node로 제어
    > console.log('hello world'); # node 의 console 은 global.console.
    3.モジュール
    モジュールを作成し、制御モジュールのjsファイルを実行モジュールの構造に配置します.
    // 제어하는 파일.
    // 필요한 js 파일을 가져와서 사용.
    const 개인프로필 = require('./two');
    
    console.log(개인프로필.이름);
    console.log(개인프로필.나이); //100
    개인프로필.한살더먹음();
    개인프로필.한살더먹음();
    console.log(개인프로필.나이); //100 - export 하던 시점의 나이가 찍히는 것.
    console.log(개인프로필.값가져오기()); // 102
    // 모듈
    let 이름 = 'ddosang';
    let 나이 = 100;
    function 한살더먹음() {
        나이 += 1;
    }
    function 값가져오기() {
        return 나이;
    }
    
    module.exports.이름 = 이름;
    module.exports.나이 = 나이;
    module.exports.한살더먹음 = 한살더먹음;
    module.exports.값가져오기 = 값가져오기;
    4.シンプルなサーバを作成!
    // 간단한 서버 만들기!
    const http = require('http');
    const fs = require('fs');
    
    // 실행하면 자동적으로 main, favicon에 대한 request가 2 번 날아감.
    const app = http.createServer(function(request, response) {
        let url = request.url;
        console.log(`request : ${request}`);
        console.log(`request : ${request.url}`);
        if (request.url == '/') {
            // 메인페이지 보여주기
            url = '/index.html';
        } else if (request.url == '/blog') {
            // 블로그페이지 보여주기
            url = '/blog.html';
        } else if (request.url == '/favicon.ico') {
            // favicon 을 못찾으면...
            // 근데 해킹을 대비해서 못찾아도 200을 내보내기도 한다.
            return response.writeHead(404);
        } else {
            response.writeHead(404);
            response.end('Not found');
        }
        response.writeHead(200);
        // 응답이 끝날 때 해당 페이지를 열어줌.
        response.end(fs.readFileSync(__dirname + url));
    
    });
    
    // 3000번 포트에서 동작하게 한다.
    app.listen(3000); 
    5.最新の文法
    npm init --yes 
    # package.json 이 생성됨.
    一般モジュールのインストール後に削除します.package.json, app.jsのみアップロードします.
    npmはアプリショップのようなものと見なすことができます.
    // main
    import * as 개인프로필 from './two.js'; // 전체 다 가져올 때.
    // import {이름, 나이, 한살더먹음, 값가져오기} from './two.js';
    
    console.log(이름);
    console.log(나이); //100
    개인프로필.한살더먹음();
    개인프로필.한살더먹음();
    console.log(나이); //102 - export로 하니까 제대로 출력!!!
    console.log(값가져오기()); // 102
    // module
    export let 이름 = "ddosang";
    export let 나이 = 10;
    export function 한살더먹음() {
        나이 += 1;
    }
    export function 값가져오기() {
        return 나이;
    }
    5.パスモジュール
    // 공식문서 링크  : https://nodejs.org/dist/latest-v14.x/docs/api/path.html
    const path = require('path');
    
    console.log(`구분자 : ${path.sep}`);
    console.log(`디렉토리 : ${path.dirname(__filename)}`);
    console.log(`파일이름 : ${path.basename(__filename)}`);
    console.log(`확장자 : ${path.extname(__filename)}`);
    
    console.log(__filename);
    console.log(__dirname);
    console.table(path.parse(__filename));
    console.log(path.join(__dirname, 'source')); // 경로에 폴더나 파일 추가할때 + 같은거 쓰지 말고 path.join으로 합치자.
    6. file system
    // 공식문서 링크  : https://nodejs.org/dist/latest-v14.x/docs/api/fs.html
    const fs = require('fs');
    
    // rename, readFile, writeFile, appendFile, copyFile, mkdir
    // 1. rename
    let 변수 = 'ddosang' // 사용자 이름
    let 날짜 = new Date()
    fs.rename('./test.txt', `./${변수}${날짜.getMilliseconds()}.txt`, (err) => {
        console.log(err); // 사용자가 올린 이미지를 어떤 이름으로 올릴지에 대한 고려는 미리 해야한다.
    })
    
    // 2. readFile
    fs.readFile('./test.txt', 'utf8', (err, data) => {
        console.log(err);
        console.log(data);
    })
    
    // 3. readDirectory
    fs.readdir('./', (err, data) => {
        console.log(err);
        console.log(data);
    })
    
    // 4. writeFile
    fs.writeFile('./test2.txt', 'hello world 2', (err)=>{
        console.log(err)
    });
    
    // 5. appendFile
    fs.appendFile('./test2.txt', 'hello world 3', (err)=>{
        console.log(err)
    });
    
    // 6. copyFile
    fs.copyFile('./test2.txt', './test3.txt', (err)=>{
        console.log(err)
    });
    
    // 6
    fs.mkdir('./yoyo', (err)=>{
        console.log(err)
    });
    Quiz!!
    Username, Identifier, job
    booker, 129012, programmer
    grey, 072070, coder
    johnson, 814081, data scientist
    jenkins, 469346, front-end developer
    smith, 795079, back-end developer
  • ユーザー固有のフォルダを生成します(ユーザー名を使用してフォルダ名を作成してください).
  • 各フォルダでuserinfoを使用します.txtを生成したら、Username、Identifier、Jobを次の表に保存してください.
    Username : booker
    Identifier : 129012
    Job : promgrammer
    // 내가 짠 코드 - 나는 readFile 안에서 콜백을 써서 그런 문제는 없었지만 readFile은 비동기라서 밖에서 순차적으로 사용하면 파일을 읽지 않았는데 다음것이 실행돼서 오류가 나기도 한다. readFileSync나 Promise를 사용하자.
    const fs = require('fs');
    
    fs.readFile('./username.csv', 'utf8', (err, data) => {
        // \n으로 한번 자르고 그걸 ', '로 한번 잘라서 2차원 array로.
        const dataArr = data.split('\n').map(item => item.split(', '));
        // 사람 수 (arr 행)만큼 돌면서
        for(let i = 1; i < dataArr.length; i++){
            // username 으로 폴더 생성.
            fs.mkdir(`./${dataArr[i][0]}`, (err)=>{
                console.log(err)
            });
            
            // 사람 정보 개수(arr 열)만큼 돌면서
            for (let j = 0; j < dataArr[0].length; j++) {
                // file에 정보 넣기!
                fs.appendFile(`./${dataArr[i][0]}/userinfo.txt`, `${dataArr[0][j]} : ${dataArr[i][j]}\n`, (err)=>{
                    console.log(err)
                });
                // console.log(`${dataArr[0][j]} : ${dataArr[i][j]}`);
            }
        }
    });
    // 다른 분 코드를 보고 보완한 코드!!
    fs.readFile('./username.csv', 'utf8', (err, data) => {
        const splitedData = data.split('\n').map(info => info.split(', '));
        const columnTitle = splitedData[0];
        splitedData.slice(1)
            .forEach((personData) => {
                username = personData[0];
                fs.mkdir(`./${username}`, (err) => {});
                for (i in personData) {
                    console.log(i);
                    fs.appendFile(`./${username}/userinfo.txt` ,`${columnTitle[i]} : ${personData[i]}\n`, (err) => {});
                }
            });
    });
    \n : LineFeed
    \r : Carriage Return
    Linuxでは、rは関係ないので、自分でnに変更します.
    splitでいいのは正規表現ですか?そしてうろうろ...split!!! split!!!!
    7. http
    httpモジュール付きでGET、POST方式でリクエストを出した場合、データがどこに入るかの撮影作業を行いました.今の処理反応はまだ何をしているかのような感じで、完全に理解できません…!
    // 모듈 포함.
    const http = require('http');
    const fs = require('fs');
    const querystring = require('querystring');
    
    
    const server = http.createServer(function(req, res){
        console.log('server가 구동중입니다.');
        // get과 post 둘 다 테스트
        if(req.method == 'GET') {
            fs.readFile('./test.html', 'utf8', (err, data) => {
                console.log(err);
                //writeHead대신 setHeader를 사용하여 type을 보낼 수 있음
                res.writeHead(200, {'Content-Type':'text/html'});
                res.write(data);
                res.end();
            }) 
        } else if(req.method =='POST') {
            req.on('data', function(chunk) { 
                console.log(chunk.toString()); 
                let data = querystring.parse(chunk.toString()); 
                console.log(data);
                res.writeHead(200, {'Content-Type':'text/html'});
                res.write(`id : ${data.id_value}, pw : ${data.pw_value}`);
                res.end(); 
            }); 
        }
    });
    
    server.listen(8080);
    3.小回顧
  • githubコースが終わりました.
  • ちょっと修正してない感じで….せっかく提出したのに誤字があって、再提出が必要な時に使えばいいです.でも他の人と一緒に仕事をするならいらないから...?やっています.自分で使うときはよく使う私はずっとpull requestが何なのか知りたいですが、本当にプロジェクトをしているわけではないので、先に延期して、これを学んで嬉しいです.
  • node.jsの授業を受けました.
  • まずは…!おもしろい!短いコードで実際のサービスのようにurlを通じてページを伝えることができるのは本当に不思議です.
    プロジェクトをしている間に、データフォーマットを調べるために、一旦入ってバックエンドコードを見てみましたが、どう考えてもフロントより短く見えますが、チームメンバーはいつもエラーで大変なので、どのようなエラーが発生するのでしょうか?私はそう思っています.今分かりました.