24.08.14 Day28

최지원·2024년 8월 14일

node.js

  • 설치 후 확인
  • 현재 폴더 확인
  • cls : 터미널 기록 내용 지우기

코드

// 첫번째 노드 프로그램 실행하기
function hello(name){
    console.log(`${name}님 환영합니다.`);
}
hello('홍길동');
  • 실행

npm

1) npm초기화

  • npm init
  • OK가 나올때 까지 계속 엔터
  • package.json 파일 생김 - 사용하는 모듈이나 패키지 및 버전 등의 정보가 담겨있다.

2) ansi-color 모듈 설치

npm i ansi-colors

3) 설치한 모듈(패키지) 사용해보기

const c = require("ansi-colors");
function hello(name){
    console.log(c.green(name)+" 님 환영합니다.");
}
hello('홍길동');

4) 설치한 모듈 삭제하기

npm uninstall ansi-colors

함수형 변수(함수 표현식)

let hi = function(){
    return '안녕하세요.';
}
console.log(hi());

일반함수의 매개변수로 전달

function sayHi(method){
    console.log(method());
}
sayHi(hi);

화살표 함수로 변환

let hi2 = () => {
    return '안녕하세요?';
};
sayHi(hi2);

let sum = (a,b) => {
    return a + b;
}
console.log(sum(10,20));
  • 화살표함수의 수형문(본문)이 한줄이면, 중괄호 생략가능
let sub = (a,b) => a - b;
console.log(sub(10,20));

let double = a => a * 2; // 매개변수가 하나이면 소괄호 생략
console.log(double(10));

비동기 처리

  • 코드 선언 시점과 코드 실행 시점이 다른 것
  • UI(사용자의 액션-버튼, 스크롤)처리, HTTP - 요청과 응답은 비동기이다.
  • 동기 처리 : 실행시 응답을 기다리면서 Blocking현상이 발생한다

1) 콜백함수

  • 함수안에서 다른 함수를 매개변수로 넘기고 실행되어지는 순서 제어
  • 복잡하고 가독성이 떨어짐
const order = (coffee, callback) => {
    console.log(`${coffee} 주문 접수`);
    setTimeout(()=>{
        callback(coffee);
    },3000);
};

const display = (result) => {
    console.log((`${result} 완료!`));
};
order('아메리카노',display);

2) Promise

  • ES6(2015) 프라미스 객체와 콜백함수 사용
  • 비동기처리에 성공했을 때와 성공하지 못했을 때의 반환 결과를 미리 약속해둔 것
  • 처리에 성공했는지 실패했는지 판단하고 실행할 명령어는 개발자가 직접 코딩
  • 실행할 명령어는 개발자가 직접 코딩
// promise 객체를 이용하여 피자 주문하기
let likePizza = true;
const pizza = new Promise((resolve, reject) => {
    if(likePizza){
        resolve('피자를 주문합니다.');
    }else{
        reject('피자를 주문하지 않습니다.');
    }
});
pizza
    .then((result) => console.log(result)) // 성공했을 때
    .catch((err) => console.log(err)); // 성공했을 때

3) async/await

  • ES2017 - asynsc와 await 예약어를 통해서 구현

변수

const user = "홍길동";
module.exports = user; //user 변수를 내보내기

함수

const hello = (name) => {
    console.log(`${name}님, 안녕하세요?`);
};
module.exports = hello; // hello함수 내보내기

두 파일 부르기

const user = require("./07-1-user.js");
const hello = require("./07-2-hello.js");

hello(user);

export depart

const goodbye = (name) => {
    console.log(`${name}님, 안녕히가세요.`);
};

// export default - 일반적으로 해당 모듈에 하나의 개체만 존재할 때 주로 사용
// 내보내기 할 객체 - 변수, 클래스, 함수 등

export default goodbye;

export const goodbye = (name) => {
    console.log(`${name}님, 안녕하세요?`);
};

greeting.mjs

const hi = (name) => {
    console.log(`${name}님, 안녕하세요?`);
};

const goodbye = (name) => {
    console.log(`${name}님, 안녕하세요?`);
};

// 여러개 내보내기
export {hi, goodbye};

app.mjs

// 객체 구조분해할당(비구조화 할당)
// as로 할당받은 객체의 이름을 변경할 수 있다.
import {hi, goodbye as bye} from "./08-4-greeting.mjs";

hi("변사또");
// goodbye("김삿갓");
bye('김진사');
//----------------------------------------------------------
import * as say from "./08-4-greeting.mjs";

say.hi("hong");
say.goodbye("kim");

통신 프로토콜

  • HTTP/HTTPS
  • TCP/IP - Socket통신 - 메신저, 게임
  • UDP/IP - Broadcast통신
  • 이메일(POP, SMTP)
  • 원격접속(Telnet)
  • 파일전송(FTP)

글로벌 모듈

// 글로벌 모듈
// require 함수 없이 그대로 사용할 수 있는 모듈

// console모듈
global.console.log("콘솔입니다.");
console.log("콘솔입니다.2");

// 글로벌 모듈에 있는 여러 변수 중에서 자주 사용하는
// __dirname와 __filename 변수

console.log(`현재 모듈이 있는 폴더:${__dirname}`);
console.log(`현재 모듈이 있는 폴더:${__filename}`);

path 모듈

// path 모듈 사용하기
const { log } = require('console');
const path = require('path');

// path모듈 : Window/Mac(Linux)
// 파일경로 : C:\users\me
//            /user/me
// OS 특성을 고려하여 파일경로에 대한 기능 제공

// 경로 연결하기
const fullPath = path.join('some', 'work', 'test.txt');
console.log(fullPath); //some\work\test.txt

// 절대 경로 : C:/users/me/test.txt /users/me/test.txt
// 상대 경로 : .\test.txt   ./test.txt
// . : 현재 경로(디렉토리, 폴더)
// .. : 현재 경로의 한단계 상위폴더 me폴더의 ..폴더는 users폴더이다.

// 절대경로
console.log(`파일 절대 경로 : ${__filename}`);

// 폴더이름만 가져오기
const dir = path.dirname(__filename);
console.log(dir);

// 파일이름만 가져오기
const filename = path.basename(__filename);
console.log(filename);

// 확장자 제외
const pureFilename = path.basename(__filename, '.js');
console.log(pureFilename);

// 확장자만 가져오기
const ext = path.extname(__filename);
console.log(ext);

pureFilename2 = path.basename(__filename, ext);
console.log(pureFilename2);

// 경로 분해하기
const parsedPath = path.parse(__filename);
console.log(parsedPath);
console.log(parsedPath.name);

fs 모듈

const fs = require('fs');

// fs 모듈 : File System 제어에 관한 기능 제공. 파일(폴더) 목록, 파일/읽기/쓰기 기능
// 현재 디렉토리(경로, 폴더)읽기
// 1. readdirSync(동기) : 다 읽을 때까지 Blocking(기다림)한다.
// 2. readdir(비동기) : 다 읽을 때까지 Non-Blocking(기다리지 않음)한다.

let files = fs.readdirSync("./");
console.log(files);
console.log("나는 다른 일 할래.");

fs.readdir("./",(err, files) => {
    if(err){
        console.log(err);
        return;
    }
    console.log(files);
});
console.log("나는 다른 일을 한다.");

fs-read

const fs = require('fs');

// 파일 읽기
// 1. readFileSync(동기)
// 2. readFile(비동기)

const data = fs.readFileSync("./01-hello.js", "utf-8");
console.log(data);

fs.readFile("./01-hello.js","utf-8",(err)=>{
    if(err){
        console.log(err);
        return;
    }
    console.log(data);
});

fs-write

const fs = require("fs");

// 파일쓰기
// 1. writeFileSync(동기)
// 1. writeFile(비동기)

let data = "This is test file";
fs.writeFileSync("test-1.txt",data);

fs.writeFile("test-2.txt",data, (err) => {
    if(err){
        console.log(err);
    }
    console.log("파일 쓰기 성공!");
});

fs-append

const fs = require("fs");

const appendData = "추가되는 내용입니다.";

if(fs.existsSync("./test-1.txt")){
    console.log("파일이 존재함.");

    fs.writeFileSync("./test-1.txt",appendData,{flag:"a"});
};

fs.appendFile("./test-2.txt","\n\n새로운 내용추가", (err) => {
    if(err){
        console.log(err);
    }
    console.log("파일 내용 추가 완료!");
});

http모듈 - 서버

// http모듈을 이용한 간단한 서버 작성하기

const http = require("http");

// createServer : 서버를 생성하면서, 요청이 오면 콜백함수를 호출
const server = http.createServer((req,res)=>{
    console.log("HTTP 요청 발생!");
    console.log(req.method);

    res.setHeader("Content-Type","text/plain");
    res.write("Hello Node.js");
    res.end();
});

// 3000번 포트에서 HTTP 요청을 기다린다.
server.listen(3000, () => {
    console.log("3000번 포트에서 서버 실행 중...");
});

// ---------------------------------------------------------------

const http = require("http");

const server = http.createServer((req,res)=> {
    console.log("HTTP 요청 발생!");
    const {method,url} = req;

    res.setHeader("Content-Type","text/plain");
    // URL에 따른 다른 응답을 구현 : 라우팅
    // === 내용과 타입을 함께 비교
    if(method==="GET" && url === "/home"){
        res.statusCode == 200;
        res.end("HOME");
    }
    else if(method === "GET" && url === "/about"){
        res.statusCode == 200;
        res.end("ABOUT");
    }
    else{
        res.statusCode == 404;
        res.end("알 수 없는 요청입니다(경로나 자원이 없음.)");
    }
});

server.listen(3000, ()=>{
    console.log("3000번 포트에서 서버 실행 중...");
})

0개의 댓글