한달 안에 typescript를 배우고 싶습니다.
혹시 추천 커리큘럼이 있을까요?
웹서버를 하려고 하는데요.
expressjs나 nestjs를 사용하면 좋겠습니다.
C#에서 typescript로 넘어가는게 어느 정도 러닝 커브가 있는지 감이 없네요.
Asp.net Core
와 C#
은 좀 하는 편입니다.
한달 안에 typescript를 배우고 싶습니다.
혹시 추천 커리큘럼이 있을까요?
웹서버를 하려고 하는데요.
expressjs나 nestjs를 사용하면 좋겠습니다.
C#에서 typescript로 넘어가는게 어느 정도 러닝 커브가 있는지 감이 없네요.
Asp.net Core
와 C#
은 좀 하는 편입니다.
퍼플랙시티 연구 결과
입니다.
C# 개발 경험이 풍부한 개발자라면 TypeScript로의 전환은 생각보다 수월할 수 있습니다. 두 언어는 마이크로소프트의 같은 아키텍트가 설계에 참여했고, 정적 타이핑이라는 공통 철학을 공유하기 때문입니다[1]. TypeScript는 JavaScript의 슈퍼셋으로서 C#의 타입 안정성과 JavaScript의 유연성을 결합한 언어로, C# 개발자들에게 매우 친숙한 학습 경험을 제공합니다[2][3].
C# 개발자가 TypeScript를 빠르게 습득할 수 있는 가장 큰 이유는 두 언어 간의 놀라운 유사성에 있습니다. if
, else
, switch
와 같은 제어문이 동일하며, for
, while
, do...while
반복문도 같은 구조를 가집니다[4]. 특히 class
와 interface
키워드가 동일하게 존재하고, public
, private
접근 한정자도 공통으로 사용됩니다[4:1]. 이러한 문법적 친숙함은 C# 개발자가 TypeScript 코드를 읽고 이해하는 데 큰 도움이 됩니다.
람다 식을 나타내는 =>
토큰 역시 두 언어에서 동일하게 사용되며, async
와 await
키워드를 통한 비동기 프로그래밍 패턴도 완전히 같습니다[4:2]. 가비지 수집과 이벤트 모델 역시 유사한 개념을 공유하므로, C# 개발자는 이미 알고 있는 지식을 그대로 활용할 수 있습니다[4:3].
하지만 두 언어 간에는 중요한 차이점도 존재합니다. TypeScript에서는 타입을 "집합"으로 이해하는 것이 핵심입니다[2:1]. C#에서는 런타임 타입과 컴파일 타임 선언 간의 일대일 대응관계가 중요하지만, TypeScript에서는 특정 값이 동시에 여러 집합에 속할 수 있다는 개념을 이해해야 합니다[2:2][3:1]. 이는 유니온 타입과 구조적 타이핑의 기반이 되는 중요한 개념입니다.
TypeScript 학습을 시작할 때는 공식 문서와 함께 기본적인 문법부터 차근차근 배우는 것이 가장 효과적입니다[5]. 초기에는 JavaScript를 사용하듯 접근하되, 점진적으로 변수 선언과 함수 인자에 타입을 추가하는 방식으로 시작하는 것이 좋습니다[6]. 타입 추론, 명시적 타입 지정, 인터페이스와 클래스 활용, 제네릭 사용 순서로 학습 범위를 확장해 나가는 것이 바람직합니다[5:1].
실습 위주의 학습이 이해도를 크게 높일 수 있습니다[5:2]. 단순히 이론을 공부하는 것보다는 실제 코드를 작성하면서 TypeScript의 타입 시스템이 제공하는 자동완성과 오류 검출 기능을 직접 체험하는 것이 중요합니다[6:1]. 특히 .
을 눌렀을 때 제공되는 자동완성의 강력함을 경험하면 TypeScript의 장점을 즉시 이해할 수 있습니다[6:2].
TypeScript 개발을 위해서는 적절한 개발 환경 설정이 필수적입니다. npm install -g typescript
명령으로 TypeScript 컴파일러를 전역 설치하고, ts-node
를 통해 컴파일 없이 바로 실행할 수 있는 환경을 구축하는 것이 좋습니다[7]. tsconfig.json
파일을 통한 컴파일 옵션 설정과 @types/node
패키지 설치를 통해 Node.js 환경에서의 타입 정의를 추가하는 것도 중요합니다[7:1].
Visual Studio Code와 같은 IDE에서 제공하는 TypeScript 지원 기능을 적극 활용해야 합니다. 백그라운드에서의 타입 검사, 실시간 오류 표시, 리팩토링 도구 등은 C# 개발자들이 Visual Studio에서 경험했던 것과 유사한 수준의 개발 생산성을 제공합니다[6:3].
실전 경험을 쌓기 위해서는 기존 JavaScript 프로젝트를 TypeScript로 점진적으로 마이그레이션하는 것부터 시작할 수 있습니다[5:3]. 이 과정에서 TypeScript의 장점을 직접 체감하면서 자연스럽게 문법과 개념을 익힐 수 있습니다. 처음에는 any
타입 사용을 자제하고 정확한 타입 지정에 집중하는 것이 좋습니다[1:1].
새로운 프로젝트를 TypeScript로 시작하는 것도 효과적인 학습 방법입니다. 처음부터 TypeScript의 기능을 적극 활용하며 개발할 수 있고, 타입 안정성의 혜택을 온전히 경험할 수 있습니다[5:4]. 특히 React나 Node.js와 같은 현대적인 프레임워크와 함께 사용하는 방법을 배우는 것이 실무 적용에 도움이 됩니다[5:5].
C# 코드를 TypeScript로 변환하는 과정에서 도움이 되는 다양한 도구들이 있습니다. 자동 변환 도구들이 존재하지만, 완벽하지 않기 때문에 수동 검토가 필요합니다[8]. ChatGPT나 기타 AI 도구를 활용하여 코드 변환 작업을 도울 수 있지만, 매번 검토가 필요하고 대규모 라이브러리에는 적합하지 않을 수 있습니다[8:1].
TypeScript 공식 문서는 가장 정확하고 최신의 정보를 제공하므로 반드시 참고해야 할 자료입니다[5:6]. 특히 “TypeScript for Java/C# Programmers” 섹션은 C# 개발자를 위해 특별히 제작된 자료로, 두 언어 간의 차이점과 유사점을 명확하게 설명합니다[2:3][3:2].
온라인 강의 플랫폼에서 제공하는 TypeScript 강의들도 체계적인 학습에 도움이 됩니다. 유데미의 "【한글자막】 Typescript :기초부터 실전형 프로젝트까지"와 같은 강의는 기초부터 실전까지 포괄적으로 다루며, React와 Node.js 환경에서의 활용법까지 포함합니다[9]. 국내 강의로는 코딩애플의 "빠르게 마스터하는 타입스크립트"가 자주 사용하는 문법과 예제 위주로 구성되어 있어 효율적인 학습이 가능합니다[10].
TypeScript 커뮤니티에 참여하여 다른 개발자들과 지식을 공유하는 것이 학습에 큰 도움이 됩니다[5:7]. Reddit의 C# 커뮤니티나 TypeScript 관련 포럼에서는 실제 프로젝트 경험담과 문제 해결 방법을 배울 수 있습니다. 코드 리뷰나 페어 프로그래밍을 통해 다양한 접근 방법과 문제 해결 전략을 학습하는 것도 추천됩니다[5:8].
오픈 소스 프로젝트에 기여하거나 TypeScript 관련 컨퍼런스에 참여하는 것은 고급 수준의 학습 기회를 제공합니다. 이를 통해 TypeScript 커뮤니티와의 교류를 확대하고 최신 트렌드를 파악할 수 있습니다[5:9].
TypeScript는 지속적으로 발전하고 있으며, 최근에는 성능 개선에 대한 중요한 발표가 있었습니다. 마이크로소프트는 TypeScript의 네이티브 포트 작업을 통해 10배 빠른 성능을 목표로 하고 있으며, 2025년 중반에는 네이티브 구현의 미리보기 버전을 제공할 예정입니다[11]. 이러한 성능 개선은 대규모 코드베이스에서 TypeScript 사용을 더욱 매력적으로 만들 것입니다.
빌드 도구의 발전도 주목할 만합니다. esbuild와 같은 차세대 빌드 도구는 기존 번들 도구보다 100배 빠른 속도를 제공하여, TypeScript의 전통적인 단점이었던 컴파일 속도 문제를 크게 개선했습니다[6:4]. 이로 인해 TypeScript 사용에 따른 성능 오버헤드는 더 이상 큰 고려사항이 아니게 되었습니다.
TypeScript의 고급 주제에는 고급 타입, 제네릭, 조건부 타입, 타입 가드 등이 있습니다[5:10]. 이러한 기능들을 통해 더 안전하고 유연한 코드를 작성할 수 있으며, C# 개발자들이 익숙한 객체 지향 프로그래밍 패턴을 TypeScript에서도 효과적으로 활용할 수 있습니다. 특히 제네릭을 통한 타입 유연성 확보와 타입 가드를 통한 런타임 안전성 보장은 C# 개발자들에게 친숙한 개념입니다[5:11].
C# 마스터가 TypeScript를 빠르게 학습하기 위한 최선의 선택은 두 언어 간의 유사성을 최대한 활용하면서 점진적으로 TypeScript만의 특성을 익혀나가는 것입니다. 공식 문서를 기반으로 한 체계적인 학습, 실습 중심의 접근법, 그리고 현대적인 개발 도구와 커뮤니티의 적극적인 활용이 핵심입니다. 특히 TypeScript의 타입 시스템을 "집합"으로 이해하고, 구조적 타이핑의 개념을 익히는 것이 C# 개발자들이 넘어야 할 주요 장벽입니다. 실전 프로젝트를 통한 경험 축적과 최신 기술 동향 파악을 병행한다면, C# 개발자는 TypeScript를 매우 효율적으로 마스터할 수 있을 것입니다.
클로드 오푸스 4.0 리서치
입니다.
C# ASP.NET Core 10년 경험자가 JavaScript 경험 없이 1개월 내에 NestJS로 실무 개발이 가능한 수준에 도달하는 것은 충분히 가능합니다. TypeScript와 C#은 같은 설계자(Anders Hejlsberg)가 만들었고, NestJS는 ASP.NET Core에서 영감을 받아 만들어져 **구조적 유사성이 85%**에 달합니다. 주말 8일간 총 120시간의 집중 학습과 평일 반복 학습을 통해 목표 달성이 가능합니다.
타입 시스템 비교
특징 | C# | TypeScript | 전환 난이도 |
---|---|---|---|
정적 타이핑 | 필수 | 선택적(점진적) | 쉬움 |
타입 추론 | var 키워드 |
자동 추론 | 매우 쉬움 |
제네릭 | List<T> |
Array<T> |
거의 동일 |
인터페이스 | 명목적 타이핑 | 구조적 타이핑 | 주의 필요 |
null 처리 | string? |
string | null |
유사함 |
주요 차이점 - 구조적 vs 명목적 타이핑
// TypeScript - 구조적 타이핑 (C#과 다름!)
interface Point { x: number; y: number; }
interface Vector { x: number; y: number; }
function usePoint(p: Point) { }
const vector: Vector = { x: 1, y: 2 };
usePoint(vector); // ✅ 가능! 같은 구조 = 호환 가능
데코레이터 vs 어트리뷰트
// C# Attribute
[HttpGet("users/{id}")]
[Authorize(Roles = "Admin")]
public async Task<User> GetUser(int id) { }
// TypeScript Decorator (거의 동일!)
@Get('users/:id')
@Roles('admin')
async getUser(@Param('id') id: number): Promise<User> { }
1. async/await - 완전히 동일한 문법
async function fetchUserData(id: string): Promise<User> {
try {
const response = await fetch(`/api/users/${id}`);
return await response.json();
} catch (error) {
console.error('Error:', error);
throw error;
}
}
2. 클래스와 상속 - 거의 동일
abstract class Animal {
protected name: string;
abstract makeSound(): void;
}
class Dog extends Animal {
makeSound(): void {
console.log("Woof!");
}
}
3. 제네릭 - 더 강력하고 유연함
class Repository<T extends { id: number }> {
async findById(id: number): Promise<T | null> {
// 구현
}
}
ASP.NET Core | NestJS | 유사도 |
---|---|---|
의존성 주입 (DI) | 의존성 주입 (DI) | 95% |
Controller/Service 패턴 | Controller/Service 패턴 | 98% |
어트리뷰트 라우팅 | 데코레이터 라우팅 | 90% |
미들웨어 파이프라인 | 미들웨어 파이프라인 | 85% |
Entity Framework | TypeORM | 80% |
프로젝트/어셈블리 | 모듈 시스템 | 75% |
ASP.NET Core Controller
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
private readonly IUserService _userService;
public UsersController(IUserService userService)
{
_userService = userService;
}
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(int id)
{
return Ok(await _userService.GetUserAsync(id));
}
}
NestJS Controller (거의 동일!)
@Controller('users')
export class UsersController {
constructor(private readonly userService: UserService) {}
@Get(':id')
async getUser(@Param('id') id: number): Promise<User> {
return this.userService.getUser(id);
}
}
1주차 (토/일): TypeScript 마스터
2주차 (토/일): Node.js와 Express 기초
3주차 (토/일): NestJS 심화
4주차 (토/일): 실전 프로젝트
1. 타입이 런타임에 존재한다고 착각
// ❌ 잘못된 생각
if (user instanceof IUser) { } // 인터페이스는 런타임에 없음!
// ✅ 올바른 방법
function isUser(obj: any): obj is User {
return 'name' in obj && 'email' in obj;
}
2. this 바인딩 혼란
class UserService {
name = "UserService";
// ❌ 문제 발생
getName() { return this.name; }
// ✅ 화살표 함수 사용
getName = () => this.name;
}
3. 구조적 타이핑 무시
// C#에서는 다른 타입, TypeScript에서는 호환 가능
interface Dog { name: string; bark(): void; }
interface Cat { name: string; meow(): void; }
const pet: Dog = { name: "Rex", bark: () => {} };
// TypeScript는 구조가 맞으면 OK
4. any 타입 남용
// ❌ 절대 금지
let data: any = fetchData();
// ✅ unknown 사용
let data: unknown = fetchData();
if (typeof data === 'string') {
console.log(data.toUpperCase());
}
5. Promise와 async/await 혼용 실수
// ❌ 불필요한 Promise 래핑
async function bad(): Promise<string> {
return new Promise(resolve => resolve("data"));
}
// ✅ 간단하게
async function good(): Promise<string> {
return "data";
}
1단계: 엔티티 정의
// C# Entity → TypeScript Entity
@Entity()
export class Post {
@PrimaryGeneratedColumn()
id: number;
@Column({ length: 200 })
title: string;
@Column('text')
content: string;
@CreateDateColumn()
createdAt: Date;
@ManyToOne(() => User, user => user.posts)
author: User;
}
2단계: 서비스 레이어
@Injectable()
export class PostService {
constructor(
@InjectRepository(Post)
private postRepository: Repository<Post>,
) {}
async findAll(page: number = 1, limit: number = 10) {
const [posts, total] = await this.postRepository.findAndCount({
skip: (page - 1) * limit,
take: limit,
relations: ['author'],
});
return { posts, total, page, limit };
}
}
3단계: 컨트롤러 구현
@Controller('posts')
@UseGuards(JwtAuthGuard)
export class PostsController {
constructor(private readonly postService: PostService) {}
@Get()
@UseInterceptors(CacheInterceptor)
async findAll(
@Query('page', ParseIntPipe) page: number,
@Query('limit', ParseIntPipe) limit: number,
) {
return this.postService.findAll(page, limit);
}
@Post()
@Roles('author', 'admin')
async create(@Body() createPostDto: CreatePostDto, @User() user) {
return this.postService.create(createPostDto, user);
}
}
.NET | Node.js | 설명 |
---|---|---|
NuGet | npm/yarn | 패키지 관리자 |
.csproj | package.json | 프로젝트 설정 |
멀티스레드 | 단일 스레드 + 이벤트 루프 | 실행 모델 |
IIS/Kestrel | Node.js 런타임 | 웹 서버 |
{
"dependencies": {
"@nestjs/common": "^10.0.0",
"@nestjs/core": "^10.0.0",
"typeorm": "^0.3.0",
"class-validator": "^0.14.0",
"class-transformer": "^0.5.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0",
"@nestjs/cli": "^10.0.0",
"jest": "^29.0.0"
}
}
{
"compilerOptions": {
"target": "ES2021", // 최신 JavaScript 기능
"module": "commonjs", // Node.js 호환
"strict": true, // 모든 엄격 모드 활성화
"experimentalDecorators": true, // 데코레이터 사용
"emitDecoratorMetadata": true, // 메타데이터 생성
"skipLibCheck": true, // 빠른 컴파일
"forceConsistentCasingInFileNames": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"sourceMap": true, // 디버깅용
"outDir": "./dist",
"baseUrl": "./",
"paths": { // 경로 별칭
"@/*": ["src/*"],
"@modules/*": ["src/modules/*"]
}
}
}
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Debug NestJS",
"program": "${workspaceFolder}/node_modules/@nestjs/cli/bin/nest.js",
"args": ["start", "--debug", "--watch"],
"console": "integratedTerminal",
"env": {
"NODE_ENV": "development"
}
}
]
}
이 가이드를 따르면 C# 개발자로서의 강점을 최대한 활용하여 1개월 내에 NestJS 백엔드 개발자로 성공적으로 전환할 수 있습니다. TypeScript와 NestJS의 설계 철학이 C#/.NET과 매우 유사하므로, 기존 지식을 효과적으로 전이시켜 빠른 학습이 가능합니다.
GPT 4o 리서치
입니다.
이 커리큘럼은 ASP.NET Core 10 개발자가 한 달 내에 NestJS(TypeScript 기반)로 생산 수준의 REST API 서버를 구축할 수 있도록 설계되었습니다. 매주 학습 목표, 핵심 개념, 실습 예제와 참고 자료를 제시하며 ASP.NET Core 경험자를 위해 대응 개념을 비교 설명합니다. NestJS의 모듈, 의존성 주입(DI), 컨트롤러, 서비스, 미들웨어, 파이프 등 주요 개념을 포함하고, Google/GitHub OAuth 로그인을 구현합니다. 데이터베이스 ORM으로는 Prisma와 TypeORM을 비교한 후 Prisma 중심으로 진행합니다. 실제 블로그/게시판/API 시나리오를 통해 코드 작성 연습을 집중합니다.
학습 목표: NestJS 프로젝트 구조와 기본 개념 이해, Nest CLI를 통한 시작, 컨트롤러와 서비스 작성법 익히기, 의존성 주입(DI) 이해
핵심 개념:
nest new
명령으로 TypeScript 기반 프로젝트 생성. ASP.NET Core의 솔루션 생성과 유사한 개념입니다.Startup
이나 Area
와 달리 @Module
데코레이터로 기능 단위를 정의하여 관련 컨트롤러와 프로바이더를 묶습니다. 한 모듈 안에서 등록된 프로바이더(서비스)는 싱글톤으로 사용되며, 다른 모듈에서 공유하려면 exports
에 추가해야 합니다.@Controller()
데코레이터로 클래스를 정의하고, @Get()
, @Post()
등으로 라우트를 매핑합니다. NestJS 컨트롤러는 DI로 서비스 클래스를 주입받아 작업을 위임합니다. 예를 들어 AppController
가 AppService
를 주입받아 getHello()
로 결과를 반환하는 구조는 ASP.NET Core의 컨트롤러와 거의 동일한 패턴입니다.@Injectable()
데코레이터를 사용합니다. 프로바이더는 DI 컨테이너에 등록되어, 필요한 곳에 주입할 수 있습니다. ASP.NET Core의 DI 방식과 마찬가지로, 생성자 인자로 의존성 클래스를 받아올 수 있습니다.private readonly
같은 방식으로 주입할 수 있습니다. ASP.NET Core의 AddTransient/AddScoped/AddSingleton
와 유사한 수명 범위를 지정하지 않으면 기본적으로 싱글톤으로 동작합니다.실습 예제:
AppController
와 AppService
를 확인해 봅니다.PostsController
와 PostsService
를 작성해 보세요. @Controller('posts')
아래에 @Get()
, @Post()
등으로 CRUD 엔드포인트를 구현합니다. 이때 서비스는 메모리 배열을 사용해 간단히 데이터 생성/조회 기능을 수행하도록 합니다. ASP.NET Core의 기본 Web API 프로젝트에서 컨트롤러와 DI 패턴을 배웠다면 비슷한 구조임을 확인할 수 있습니다.@Controller()
와 ASP.NET Core의 [ApiController]
를 비교하고, NestJS 생성자 주입과 C# 생성자 주입의 유사점을 확인합니다.추천 자료:
학습 목표: NestJS의 고급 기능(미들웨어, 파이프, 예외 필터 등) 학습, Prisma 혹은 TypeORM을 이용한 데이터베이스 연동, 실무형 도메인 구현 시작
핵심 개념:
@Injectable()
클래스나 함수 형태로 구현하고 app.use()
또는 모듈의 configure()
메서드에서 바인딩합니다. 예를 들어 요청마다 로그를 출력하는 LoggerMiddleware
를 구현할 수 있습니다. ASP.NET Core의 미들웨어 파이프라인과 비슷한 역할을 합니다.PipeTransform
인터페이스를 구현하고 @Injectable()
로 정의합니다. 예를 들어 ParseIntPipe
로 경로 파라미터를 정수로 변환하거나, ValidationPipe
로 DTO 유효성 검사를 수행할 수 있습니다. NestJS에서는 컨트롤러의 핸들러에 파이프를 전역, 라우트 단위 또는 매개변수 단위로 바인딩할 수 있습니다. 이는 ASP.NET Core의 모델 바인딩/검증(Attribute 기반 검증)과 유사한 개념입니다.BadRequestException
등 예외 객체에 매핑되지만, 커스텀 예외 필터로 세밀한 제어가 가능합니다. ASP.NET Core의 ExceptionFilter
와 유사합니다.class-validator
, class-transformer
를 통해 DTO 검증을 지원합니다. @Body()
데코레이터와 함께 ValidationPipe
를 사용하면 요청 바디 객체의 유효성을 자동 검사할 수 있습니다. 이 과정에서 파이프가 실행됩니다.@nestjs/typeorm
패키지로, Prisma는 Prisma Client로 사용합니다. 두 ORMs를 비교하면 Prisma는 스키마 기반 코드 생성 방식으로 타입 안전성이 뛰어나고, 필요 시 원시 SQL($queryRaw
) 사용이 가능합니다. TypeORM은 엔티티 클래스/레포지토리 방식이고 자동 마이그레이션 기능이 있으며, NestJS와 오랜 통합 역사를 갖고 있습니다. 이번 과정에서는 Prisma를 중심으로 진행합니다. NestJS 공식 문서에서도 Prisma 사용 예시가 자세히 나와 있습니다.실습 예제:
ParseIntPipe
로 자동 변환하고, class-validator
로 요청 DTO 검증을 해 봅니다. 예를 들어, @Get(':id') getById(@Param('id', ParseIntPipe) id: number)
처럼 사용합니다.schema.prisma
)에 User
, Post
엔티티를 정의합니다. 예를 들어 사용자 테이블과 게시글 테이블을 만들고 관계를 설정합니다. Prisma 마이그레이션 명령(prisma migrate dev
)으로 SQLite나 PostgreSQL에 반영하세요. NestJS 서비스에서 PrismaService
를 생성하여 Prisma Client를 주입받고, user.findMany()
같은 메서드로 데이터를 조회해 봅니다. (schema.prisma
에 model
정의 후 npx prisma generate
).User
관련 엔드포인트를 추가하고, 서비스를 통해 Prisma로 DB에서 게시글과 사용자 정보를 저장/조회해 보세요. 예를 들어 게시글 생성 시 작성자(User)를 연결하여 저장합니다. 이때 Prisma 클라이언트의 함수 사용법(prisma.post.create
, prisma.user.findUnique
)에 익숙해지세요. Dapper 스타일의 원시 쿼리가 필요하면 prisma.$queryRaw
를 사용해 볼 수 있습니다.추천 자료:
학습 목표: OAuth(Google/GitHub) 기반 소셜 로그인 구현, JWT 인증 토큰 사용법 학습, NestJS 가드(Guards) 및 보안 관련 기능 습득
핵심 개념:
@nestjs/passport
와 Passport 전략(Strategy)을 사용합니다. 예를 들어 Google OAuth2는 passport-google-oauth20
, GitHub OAuth는 passport-github
전략을 사용합니다. Passport 전략은 PassportStrategy
클래스를 상속하여 구현합니다. 이를 통해 외부 OAuth 제공자에 연결하고 인증 콜백을 처리할 수 있습니다.@Injectable() class GoogleStrategy extends PassportStrategy(Strategy, 'google')
형태로 구현하며, 생성자에서 클라이언트 ID/Secret과 콜백 URL 등을 super()
에 설정합니다. 구현된 validate()
메서드에서 사용자 프로필 정보를 받아 추가 처리(JWT 발급, DB 저장 등)를 수행합니다. 이는 ASP.NET Core에서 Google/GitHub 인증 미들웨어를 구성하는 것과 유사한 개념입니다./auth/google
같은 엔드포인트로 리다이렉션되면 NestJS의 가드(예: AuthGuard('google')
)가 Google OAuth 페이지로 이동시키고, 인증 후 콜백 URL로 유저를 돌려보냅니다. 이때 NestJS 컨트롤러의 /auth/callback
핸들러에서 전략의 validate()
가 호출됩니다. 이후 JWT 토큰 생성이나 세션 설정을 통해 로그인 상태를 관리합니다.@nestjs/jwt
를 사용하여 JWT 생성/검증 서비스를 구현하고, JwtAuthGuard
를 통해 보호된 라우트를 설정합니다. ASP.NET Core의 JWT 인증 미들웨어와 유사한 역할입니다.실습 예제:
npm install passport @nestjs/passport passport-github
명령으로 라이브러리를 설치하고, GithubStrategy
클래스를 만들어 위에서 설명한 방식대로 구성합니다. .env
에 GitHub 클라이언트 ID/Secret을 설정하고, AuthModule
에서 전략을 제공하도록 합니다. /auth/github
요청 시 GitHub 로그인 페이지로 리다이렉트되는지 확인하세요. 인증이 성공하면 /auth/callback
으로 리다이렉트되어 사용자를 확보하고(프로필 데이터 받음) JWT를 발급하거나 세션을 설정합니다. 로그레켓 블로그 예제를 참고하면 전략 구현과 설정 과정을 이해할 수 있습니다.passport-google-oauth20
전략으로 구현해 봅니다. GoogleStrategy
를 생성하고, AuthGuard('google')
를 사용해 /auth/google
과 콜백 라우트를 처리합니다. dev.to 글의 예시를 참고하여 기본적인 흐름을 파악하세요.AuthService
에서 JwtService
를 사용해 토큰을 생성하고 반환합니다. 이후 게시글 조회/생성 API 중 특정 라우트에 @UseGuards(JwtAuthGuard)
를 추가하여 JWT 토큰이 있어야 접근 가능하도록 설정해 봅니다. ASP.NET Core에서 [Authorize]
어트리뷰트를 사용하는 것과 비슷합니다.User
테이블에 저장하거나 업데이트하여 관리하도록 합니다.추천 자료:
@nestjs/passport
GitHub 리포지토리(전략 구현 예제).학습 목표: 앞선 내용을 종합하여 실제 업무에 투입 가능한 REST API 프로젝트 완성, 예외 처리/로깅/설정 관리 등 실무적 요소 추가, 학습 정리
핵심 개념:
@ApiTags
, @ApiOperation
어노테이션으로 명세를 작성합니다.app.useGlobalPipes(new ValidationPipe())
처럼 전역 레벨로 파이프를 설정하거나, @UseGuards(RolesGuard)
로 전역 가드를 적용할 수 있습니다. 이를 통해 코드 중복을 줄이고 일관된 설정을 적용합니다. 예외 필터도 전역으로 등록하여 모든 예외를 통일된 형태로 응답하도록 할 수 있습니다.@nestjs/config
모듈을 사용해 환경 변수 관리, 설정 파일 로드를 연습합니다. Docker로 NestJS 앱을 컨테이너화하거나, AWS/GCP/Azure에 배포하는 흐름을 간단히 살펴봅니다. ASP.NET Core의 appsettings.json
설정과 유사하게 .env
파일로 설정을 분리합니다.실습 예제:
@nestjs/swagger
를 이용해 API 문서화 연습을 합니다. 컨트롤러 메서드마다 @ApiResponse
, @ApiBearerAuth
등을 붙여 Swagger UI에서 API를 테스트해 봅니다.추천 자료:
주차 | 학습 목표 | 주요 내용 | 실습 예제 | 추천 자료 및 참고 링크 |
---|---|---|---|---|
1주차 | NestJS 기본 구조 이해 컨트롤러/서비스 작성법 습득 |
Nest CLI, 모듈(Module), 컨트롤러, 서비스, DI | Nest 프로젝트 생성 및 기본 CRUD API 구현 ASP.NET Core와 구조 비교 |
NestJS 공식 문서(Controllers, Providers) LogRocket: NestJS vs ASP.NET |
2주차 | 미들웨어/파이프/검증 등 고급 NestJS 기능 습득 ORM 설정 및 DB 연동 |
Middleware, Pipes/Validation, Prisma/TypeORM 비교 | 로깅/인증 미들웨어 작성 파이프를 이용한 파라미터 검증 Prisma 모델 정의 후 CRUD 구현 |
NestJS 공식 문서(Middleware, Pipes) NestJS Prisma 레시피 Prisma vs TypeORM 비교 (Prisma 공식) |
3주차 | OAuth 인증 구현 및 JWT 처리 학습 | Passport 전략을 이용한 Google/GitHub OAuth, NestJS Guard, JWT 인증 | GitHub OAuth 로그인 구현 (Passport, Strategy 사용) 로그인 후 JWT 발급 및 보호된 API 적용 |
Dev.to: Google OAuth 튜토리얼 LogRocket: GitHub OAuth 구현 예제 NestJS 공식 인증(Passport/JWT) 가이드 |
4주차 | 프로젝트 통합 완성 및 배포 준비 | 전체 API 완성(블로그/게시판), 예외 처리/전역 설정, Swagger 문서, 환경 변수 관리 | 완성된 게시판/블로그 프로젝트 점검 Swagger로 문서화 및 Docker 배포 테스트 |
NestJS 공식 문서(Configuration, Swagger 등) NestJS 예제 GitHub Udemy 강좌 등의 온라인 리소스 |
각 주차별로 위 개념들을 이해하고 직접 코드를 작성해 보는 것이 목표입니다. ASP.NET Core 개발 경험을 바탕으로 NestJS의 구조와 패턴이 매우 유사함을 인지하고, 차이점을 중심으로 학습하면 전환이 용이할 것입니다. NestJS 공식 문서와 다양한 튜토리얼을 병행하여 참조하면 학습 효과가 높아집니다.