NestJS-Controller와 Service 연결 예시 코드

jaegeunsong97·2023년 11월 14일
0

NestJS

목록 보기
5/37
post-custom-banner

🖊️코드

  • posts/posts.controller.ts
import { Body, Controller, Delete, Get, NotFoundException, Param, Post, Put } from '@nestjs/common';
import { PostsService } from './posts.service';


@Controller('posts')
export class PostsController {
  constructor(private readonly postsService: PostsService) {}

  @Get()
  getPosts() {
    return this.postsService.getAllPosts();
  }

  @Get(':id')
  getPost(@Param('id') id: string) { // url의 id 부분만 가져오고 변수 id에 넣는다.
    return this.postsService.getPostById(+id); // +를 붙이면 string -> number
  }

  @Post()
  postPosts(
    @Body('author') author: string,
    @Body('title') title: string,
    @Body('content') content: string,
  ) {
    return this.postsService.createPost(
      author, title, content
    );
  }

  @Put(':id')
  putPost(
  	// ?가 들어가면 있을수도 있고 없을수도 있다.
    @Param('id') id: string,
    @Body('author') author?: string,
    @Body('title') title?: string,
    @Body('content') content?: string,
  ) {
    return this.postsService.updatePost(+id, author, title, content);
  }

  @Delete(':id')
  deletePost(@Param('id') id: string) {
    return this.postsService.deletePost(+id);
  }
}
  • posts/posts.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';

/**
 * author: string
 * title: string
 * content: string
 * likeCount: number
 * commentCount: number
 */
export interface PostModel {
     id: number;
     author: string;
     title: string;
     content: string;
     likeCount: number;
     commentCount: number;
   }
   
let posts: PostModel[] = [
  {
    id: 1,
    author: 'newjeans_minji',
    title: '뉴진스 민지',
    content: '메이크업 고치고 있는 민지',
    likeCount: 100000,
    commentCount: 999,
  },
  {
    id: 2,
    author: 'newjeans_herin',
    title: '뉴진스 헤린',
    content: '춤추고 있는 헤린',
    likeCount: 100000,
    commentCount: 999,
  },
  {
    id: 3,
    author: 'newjeans_daniel',
    title: '뉴진스 다니엘',
    content: '노래부르는 다니엘',
    likeCount: 100000,
    commentCount: 999,
  },
]

@Injectable()
export class PostsService {

     getAllPosts() {
          return posts;
     }

     getPostById(id: number) {
       	  // posts(배열) find(배열에서 찾기)
       	  // 만족하는 요소가 없으면 undefined
          const post = posts.find((post) => post.id === +id);
          if (!post) throw new NotFoundException();
          return post;
     }

     createPost(author: string, title: string, content: string) {
       	  // 객체 생성
          const post: PostModel = {
               id: posts[posts.length - 1].id + 1,
               author,
               title,
               content,
               likeCount: 0,
               commentCount: 0,
          };
         
       	  // 생성된 객체 뒤에 추가
          posts = [
               ...posts,
               post,
          ]
     
          return post;
     }

     updatePost(postId: number, author: string, title: string, content: string) {
          const post = posts.find((post) => post.id === postId);
          if (!post) throw new NotFoundException();
          if (author) post.author = author;
          if (title) post.title = title;
          if (content) post.content = content;
		  
          // map
          posts = posts.map(prevPost => prevPost.id === +post ? post : prevPost);
          return post;
     }

     deletePost(postId: number) {
          // filter는 post.id와 postId가 일치하지 않는 새로운 배열을 생성
          posts = posts.filter(post => post.id !== postId);
          return postId;
     }
}
  • posts.module.ts
import { TypeOrmModule } from '@nestjs/typeorm';
import { Module } from '@nestjs/common';
import { PostsService } from './posts.service';
import { PostsController } from './posts.controller';
import { PostsModel } from './entities/posts.entity';

@Module({
  controllers: [PostsController],
  providers: [PostsService],
})
export class PostsModule {}

그리고 export 된 PostsModule을 app.module.ts에 등록해야한다. 왜냐하면 등록되지 않으면 AppModule class를 실행할 때 알아차릴 수 없기 때문이다.

  • app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { PostsModule } from './posts/posts.module';

@Module({
  imports: [PostsModule], // imports
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

🖊️app.module.ts 실행원리

main.ts로 가면 AppModule가 있다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule); // 여기
  await app.listen(3000);
}
bootstrap();

실행이 되면 NestFactory는 AppModule로가서 imports된 Module를 찾고 IoC에 넣는다. 그리고 DI를 해주는 방식이다.

profile
블로그 이전 : https://medium.com/@jaegeunsong97
post-custom-banner

0개의 댓글