1 웹 프레임워크
2 Node.js
3 이벤트 루프
4 패키지 의존성 관리
4.1 package.json
4.2 package-lock.json
4.3 package.json 파일 분석
5 타입스크립트
5.1 변수 선언
5.2 타입스크립트에서 지원하는 타입
5.3 타입 정의하기
5.4 타입 구성하기
6 데커레이터
6.1 데커레이터 합성
6.2 클래스 데커레이터
6.3 메서드 데커레이터
6.4 접근자 데커레이터
6.5 속성 데커레이터
6.6 매개변수 데커레이터
6.7 데커레이터 요약
1 웹 프레임워크
웹 프레임워크는 서버 측 애플리케이션 개발을 도와주는 툴입니다. 개발자들이 표준화된 구조와 도구를 활용하여 빠르고 효율적으로 애플리케이션을 구축할 수 있도록 돕습니다. Express, Koa, NestJS와 같은 JavaScript 기반 웹 프레임워크는 Node.js 환경에서 사용되며, MVC 패턴, 라우팅, 미들웨어 등을 지원하여 복잡한 작업을 단순화합니다.
예시: Express.js를 사용한 기본 서버 설정
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send('Hello, World!');
});
app.listen(3000, () => {
console.log('Server is running on http://localhost:3000');
});
2 Node.js
Node.js는 JavaScript를 서버 측에서 실행할 수 있게 하는 런타임 환경입니다. 비동기 이벤트 기반 모델을 채택하여 고성능 서버를 구축하는 데 적합하며, I/O 집약적인 애플리케이션에 특히 강력한 장점을 제공합니다. npm(Node Package Manager)을 통해 다양한 패키지를 설치하고 관리할 수 있어 생산성을 높입니다.
예시: 비동기 파일 읽기
const fs = require('fs');
fs.readFile('example.txt', 'utf-8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
3 이벤트 루프
Node.js의 이벤트 루프는 비동기 작업을 처리하는 메커니즘입니다. 콜백 함수, 프로미스, async/await 등이 이벤트 루프의 일부로 동작합니다. 작업은 이벤트 큐에서 대기하며, 싱글 스레드에서 실행되므로 성능 효율성이 뛰어납니다. 이는 Node.js가 논블로킹(non-blocking) I/O를 구현할 수 있는 핵심 요소입니다.
예시: 비동기 작업과 이벤트 루프
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
console.log('End');
출력:
Start
End
Timeout
4 패키지 의존성 관리
Node.js 프로젝트에서 패키지 의존성을 관리하는 방법으로 package.json과 package-lock.json 파일이 활용됩니다.
4.1 package.json
프로젝트의 메타데이터와 의존성을 정의한 파일입니다.
버전 정보, 스크립트, 저작자, 라이선스 등이 포함됩니다.
npm init 명령어로 생성됩니다.
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "^4.17.1"
}
}
4.2 package-lock.json
설치된 의존성의 정확한 버전 정보를 기록합니다.
팀 간 동일한 환경을 재현하는 데 유용합니다.
자동으로 생성되며, 수동으로 수정하지 않는 것이 권장됩니다.
4.3 package.json 파일 분석
dependencies: 애플리케이션이 실행되는 데 필요한 패키지.
devDependencies: 개발 시에만 필요한 패키지.
스크립트, 키워드 등 각 섹션의 역할을 세부적으로 이해해야 합니다.
5 타입스크립트
TypeScript는 JavaScript에 정적 타입을 추가한 언어로, 더 안전하고 유지보수 가능한 코드를 작성할 수 있습니다.
5.1 변수 선언
let, const를 사용하며, 변수의 타입을 명시적으로 선언할 수 있습니다.
타입 추론 기능도 제공하여 개발 편의성을 높입니다.
let age: number = 25;
const name: string = 'John';
5.2 타입스크립트에서 지원하는 타입
기본 타입: number, string, boolean 등.
복합 타입: array, tuple, enum, interface 등.
let numbers: number[] = [1, 2, 3];
5.3 타입 정의하기
type과 interface를 사용해 사용자 정의 타입을 작성할 수 있습니다.
재사용 가능한 구조를 정의하여 코드의 가독성과 유지보수성을 향상합니다.
interface User {
name: string;
age: number;
}
const user: User = { name: 'Alice', age: 30 };
5.4 타입 구성하기
유니온 타입(|), 인터섹션 타입(&)을 사용하여 복합적인 타입을 생성합니다.
Partial, Pick과 같은 유틸리티 타입도 제공됩니다.
type Status = 'success' | 'error';
let response: Status = 'success';
6 데커레이터
데커레이터는 클래스와 클래스 멤버에 기능을 추가하는 데 사용되는 특수한 문법입니다. 메타프로그래밍을 지원하며, Angular와 NestJS 같은 프레임워크에서 필수적으로 사용됩니다.
6.1 데커레이터 합성
여러 데커레이터를 결합하여 사용합니다.
위에서 아래로 평가되고, 아래에서 위로 실행됩니다.
function Logger() {
return function (target: any) {
console.log(`Class ${target.name} was created`);
};
}
function Timestamp() {
return function (target: any) {
console.log(`Timestamp: ${Date.now()}`);
};
}
@Logger()
@Timestamp()
class MyClass {}
6.2 클래스 데커레이터
클래스 자체에 적용되는 데커레이터입니다.
예: 로깅, DI(Container) 등록.
function Logger(target: Function) {
console.log(`${target.name} is loaded`);
}
@Logger
class User {}
6.3 메서드 데커레이터
클래스의 메서드에 동작을 추가합니다.
예: 메서드 실행 전후 로깅.
function LogExecutionTime(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function (...args: any[]) {
const start = Date.now();
const result = originalMethod.apply(this, args);
console.log(`${propertyKey} executed in ${Date.now() - start}ms`);
return result;
};
}
class Example {
@LogExecutionTime
calculate() {
// some heavy computation
return 42;
}
}
6.4 접근자 데커레이터
클래스 속성의 getter와 setter에 적용됩니다.
예: 데이터 유효성 검사.
function LogAccessor(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(`Accessor for ${propertyKey} is defined`);
}
class Example {
private _value: number = 0;
@LogAccessor
get value() {
return this._value;
}
set value(newValue: number) {
this._value = newValue;
}
}
6.5 속성 데커레이터
클래스 속성에 메타데이터를 추가합니다.
예: 데이터베이스 필드 매핑.
function Required(target: any, propertyKey: string) {
console.log(`${propertyKey} is marked as required`);
}
class User {
@Required
name: string;
}
6.6 매개변수 데커레이터
메서드의 매개변수에 정보를 추가합니다.
예: HTTP 요청의 특정 값 바인딩.
function ParamLogger(target: any, methodName: string, paramIndex: number) {
console.log(`Parameter at index ${paramIndex} in method ${methodName} is decorated`);
}
class Controller {
getData(@ParamLogger id: number) {
console.log(`Fetching data for ID: ${id}`);
}
}
6.7 데커레이터 요약
데커레이터는 가독성을 높이고, 코드의 중복을 줄이는 데 도움을 줍니다.
올바른 사용법과 예제를 통해 효과적으로 사용할 수 있습니다.
댓글 영역