Node.js JavaScript Basics


Node.js에서의 JavaScript 기본 (JavaScript Basics in Node.js)

Node.js는 서버 사이드에서 JavaScript를 실행할 수 있는 환경을 제공하며, 클라이언트 사이드와 서버 사이드 모두에서 JavaScript를 사용하는 것이 가능합니다. 이 문서에서는 JavaScript의 기본 문법, 최신 ES6+ 문법, 비동기 프로그래밍, 그리고 객체 지향 프로그래밍 개념을 Node.js 환경에서 어떻게 활용할 수 있는지 자세히 설명합니다.

자바스크립트 문법 복습 (Review of JavaScript Syntax)

JavaScript는 웹 개발에서 널리 사용되는 프로그래밍 언어입니다. Node.js에서는 JavaScript를 사용하여 서버 사이드 애플리케이션을 개발할 수 있으며, JavaScript의 기본 문법은 다음과 같습니다.

변수 선언 (Variable Declaration)

JavaScript에서는 변수를 선언할 때 var, let, const를 사용할 수 있습니다.

  • var: 함수 스코프를 가지며, 변수 재선언과 재할당이 가능합니다.
  • let: 블록 스코프를 가지며, 변수 재할당이 가능하지만 재선언은 불가능합니다.
  • const: 블록 스코프를 가지며, 상수 값을 선언할 때 사용됩니다. 재할당이 불가능하지만 객체의 프로퍼티는 수정할 수 있습니다.
var name = 'John'; // var 사용
let age = 30;      // let 사용
const PI = 3.14;   // const 사용

name = 'Jane'; // 가능
age = 31;      // 가능
PI = 3.1415;   // 오류 발생: Assignment to constant variable
데이터 타입 (Data Types)

JavaScript의 기본 데이터 타입은 다음과 같습니다.

  • 문자열 (String): 텍스트 데이터를 표현합니다.
  let message = 'Hello, World!';
  • 숫자 (Number): 정수와 부동 소수점 숫자를 표현합니다.
  let count = 42;
  let price = 19.99;
  • 불리언 (Boolean): 참(true)과 거짓(false)을 표현합니다.
  let isActive = true;
  • 배열 (Array): 여러 값을 저장할 수 있는 리스트입니다.
  let fruits = ['apple', 'banana', 'cherry'];
  • 객체 (Object): 키-값 쌍으로 데이터를 저장합니다.
  let person = {
    name: 'Alice',
    age: 25
  };
함수 정의와 호출 (Function Definition and Invocation)

함수는 코드의 재사용을 가능하게 하며, JavaScript에서 함수를 정의하고 호출하는 방법은 다음과 같습니다.

// 함수 정의
function greet(name) {
  return `Hello, ${name}!`;
}

// 함수 호출
console.log(greet('John')); // Output: Hello, John!

ES6+ 문법 소개 (Introduction to ES6+ Syntax)

ECMAScript 6(ES6) 이후에는 JavaScript에 많은 기능이 추가되었습니다. ES6+의 주요 기능을 소개합니다.

화살표 함수 (Arrow Functions)

화살표 함수는 간결한 함수 표현식을 제공합니다. function 키워드 대신 =>를 사용합니다.

// 기존 함수 표현식
const add = function(a, b) {
  return a + b;
};

// 화살표 함수
const add = (a, b) => a + b;

console.log(add(2, 3)); // Output: 5
템플릿 리터럴 (Template Literals)

템플릿 리터럴은 문자열을 더 쉽게 작성할 수 있도록 해줍니다. 백틱(``)을 사용하여 문자열을 정의하고,${}`를 사용하여 변수를 삽입할 수 있습니다.

let name = 'John';
let age = 30;

let message = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(message); // Output: Hello, my name is John and I am 30 years old.
비구조화 할당 (Destructuring Assignment)

비구조화 할당을 사용하면 배열이나 객체의 값을 개별 변수로 쉽게 추출할 수 있습니다.

// 배열 비구조화
const numbers = [1, 2, 3];
const [one, two, three] = numbers;
console.log(one, two, three); // Output: 1 2 3

// 객체 비구조화
const person = { name: 'Alice', age: 25 };
const { name, age } = person;
console.log(name, age); // Output: Alice 25

비동기 프로그래밍 이해 (Understanding Asynchronous Programming)

비동기 프로그래밍은 동시 작업을 처리하는 데 중요한 개념입니다. JavaScript에서는 콜백, 프로미스, async/await를 사용하여 비동기 작업을 관리할 수 있습니다.

콜백 함수 (Callback Functions)

콜백 함수는 다른 함수에 인수로 전달되어 작업이 완료된 후 실행되는 함수입니다.

function fetchData(callback) {
  setTimeout(() => {
    callback('Data loaded');
  }, 1000);
}

fetchData((message) => {
  console.log(message); // Output: Data loaded
});
프로미스 (Promises)

프로미스는 비동기 작업의 완료나 실패를 나타내는 객체입니다. thencatch 메서드를 사용하여 결과를 처리할 수 있습니다.

let promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Data loaded');
  }, 1000);
});

promise
  .then((message) => {
    console.log(message); // Output: Data loaded
  })
  .catch((error) => {
    console.log(error);
  });
async/await

asyncawait를 사용하면 비동기 코드를 동기적으로 작성할 수 있어 가독성이 높아집니다. async 함수는 항상 프로미스를 반환하며, await는 프로미스가 해결될 때까지 기다립니다.

function fetchData() {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve('Data loaded');
    }, 1000);
  });
}

async function loadData() {
  try {
    let message = await fetchData();
    console.log(message); // Output: Data loaded
  } catch (error) {
    console.log(error);
  }
}

loadData();

JavaScript의 객체지향 프로그래밍 개념 (Object-Oriented Programming Concepts in JavaScript)

JavaScript는 객체지향 프로그래밍(OOP) 개념을 지원하며, 객체를 사용하여 데이터와 메서드를 묶어 관리할 수 있습니다.

클래스와 객체 (Classes and Objects)

ES6부터 클래스 문법이 도입되었습니다. 클래스는 객체를 생성하는 청사진을 제공하며, 생성자와 메서드를 포함할 수 있습니다.

// 클래스 정의
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }

  greet() {
    return `Hello, my name is ${this.name}`;
  }
}

// 객체 생성
const person = new Person('Alice', 25);
console.log(person.greet()); // Output: Hello, my name is Alice
상속 (Inheritance)

상속을 통해 기존 클래스의 속성과 메서드를 자식 클래스에서 재사용할 수 있습니다.

class Animal {
  constructor(name) {
    this.name = name;
  }

  speak() {
    return `${this.name} makes a noise.`;
  }
}

class Dog extends Animal {
  speak() {
    return `${this.name} barks.`;
  }
}

const dog = new Dog('Rover');
console.log(dog.speak()); // Output: Rover barks.
캡슐화 (Encapsulation)

캡슐화는 객체의 속성을 보호하고, 공개된 메서드를 통해 속성에 접근하는 원칙입니다. ES6에서는 #를 사용하여 private 필드를 정의할 수 있습니다.

class Counter {
  #count = 0;

  increment() {
    this.#count++;
  }

  getCount() {
    return this.#count;
  }
}

const counter = new Counter();
counter.increment();
console.log(counter.getCount()); // Output: 1

이 문서에서는 JavaScript의 기본 문법, ES6+의 새로운 기능, 비동기 프로그래밍, 그리고 객체지향 프로그래밍 개념을 Node.js 환경에서 어떻게 활용할 수 있는지 상세히 설명하였습니다. 이러한 개념들을 이해하고 활용하면, Node.js를 사용하여 강력한 서버 사이드 애플리케이션을 개발하는 데 큰 도움이 될 것입니다.


Leave a Reply

Your email address will not be published. Required fields are marked *