컨트롤러

NestJS의 컨트롤러는 MVC패턴에서 사용하는 컨트롤러와 같다. 컨트롤러는 외부에서 들어오는 요청(request)을 처리하는 모듈이다. 클라이언트가 보내는 요청을 처리하고 그 결과를 응답(response)하는 역할을 한다.

라우팅

컨트롤러의 목적은 애플리케이션에 대한 특정 요청을 수신하는 것이다. 라우팅 매커니즘은 어떤 컨트롤러에서 클라이언트의 요청을 처리할지 조정한다. 각기 다른 라우터는 해당 라우터에서 작성한 로직에 따라 다른 행동을 처리한다.

NestJS는 컨트롤러를 생성하기 위해서 클래스와 데코레이터(typescript)를 사용한다. 직접 소스코드를 작성해도 되지만, Nest CLI를 이용하여 쉽게 생성 가능하다.

nest g controller ~~~

생성

test라는 이름의 컨트롤러를 생성했다.

//test.controller.ts

@Controller('test')
export class TestController {
  @Get()
  getHello(): string {
    return "Hellow JoY";
  }
}

기본 컨트롤러에는 @Controller() 데코레이터를 사용해야한다. 여기서 인자로 받은 ‘test’는 경로를 뜻한다. 예를 들어 로컬 80포트라면, [<http://localhost/test>](<http://localhost/test>) 가 경로가 된다.

REST Method

REST Method는 총 5가지가 있다.

  • @GET : 조회
  • @PATCH : 단일 수정
  • @DELETE : 삭제
  • @POST : 생성
  • @PUT : 전체 수정
  • @Head()
  • @Options()
  • @All()

여덟가지 데코레이터는 Nest 프레임워크에서 HTTP 요청의 특정 엔드포인트를 처리한다고 표시하는 것이다.

여러개의 경로가 필요할 경우에는 REST Method 데코레이터에 인자(라우트 패스)를 넘겨주면 된다.

//test.controller.ts

@Controller('test')
export class TestController {
  ...
	@Get('/bye')  //여기에 넣어주면 된다.
	  getBye(): string {
	    return "Bye JoY";
	}

	@Get('/hi')
		  getHi(): string {
		    return "Hi JoY";
	}
}

이때 경로는 각각

가 된다.

와일드 카드

또한 NestJS에서는 와일드카드를 제공한다.

//test.controller.ts

@Controller('test')
export class TestController {
  ...
  @Get("/wild*Card")
  wildCard(): string {
    return "wildCard";
  }
}

Get 데코레이터에 인자로 넘긴 라우트 패스는 wild*Card 다. 여기서 *이 있는 자리, 즉 wild와 Card 사이에 다른 문자를 넣어도 wildCard() 핸들러에 요청을 보내게 된다.

EX)

이 세가지 다 wildCard라는 리턴을 받게 된다.

요청 객체

컨트롤러의 핸들러에서는 리퀘스트의 세부 사항을 확인해야 한다. NestJS에서는 몇 가지 데코레이터를 제공해 리퀘스트 객체에 접근하기 쉽다.

  • @Req()
  • @Next()
  • @Session()
  • @Res()
  • @HostParam()
  • @Param(key?: string)
  • @Body(key?: string)
  • @Query(key?: string)
  • @Headers(name?: string)
  • @Ip()

데이터 전송

또한 클라이언트에서 컨트롤러에 데이터를 전송하는 방법은 3가지 방식이 있다. 이 역시 데코레이터를 사용해야 한다.

  • @Body
  • @Query
  • @Param
//test.controller.ts

@Controller('test')
export class TestController {
	...
	@Get("/getQuery1")
  getQuery1(@Query() data: any): string {
    return "data : " + `${data}`;
  }
  @Get("/getQuery2")
  getQuery2(@Query("id") id: string, @Query("name") name: string): string {
    return "data.id : " + id + "  data.name : " + name;
  }

  @Post("/postParam1/:id/:name")
  postParam1(@Param() data: any): string {
    return "id : " + data.id + "  name : " + data.name;
  }
  @Post("/postParam2/:id/:name")
  postParam2(@Param("id") id: string, @Param("name") name: string): string {
    return "id : " + id + "  name : " + name;
  }

  @Post("/postBody1")
  postBody1(@Body() data: any): string {
    return "id : " + data.id + "  name : " + data.name;
  }
  @Post("/postBody2")
  postBody2(@Body("id") id: string, @Body("name") name: string): string {
    return "id : " + id + "  name : " + name;
  }
}

세 가지 방식 다 인자로 키를 받아서 단일처리하거나, 키 없이 전체 처리가 가능하다.

응답

여러 개의 http 메소드의 응답코드는 POST 방식을 제외하곤 200이다. POST 방식만이 201을 갖는다.

NestJS에서는 이 상태코드를 쉽게 변경해주는 데코레이터를 제공한다. @HttpCode() 에 인자로 숫자를 넘기면 이 핸들러의 응답 상태코드는 @HttpCode() 에 넘겨준 인자가 된다.

//test.controller.ts

@Controller('test')
export class TestController {
	...  
	@HttpCode(281)
  @Get("/setStatusCode")
  setStatusCode(): string {
    return "set status code finish";
  }
}

이미지를 보면 상태코드가 281이다. (281은 아무렇게나 적은 의미 없는 숫자다)

헤더

NestJS 는 응답헤더를 자동으로 설정해준다. 커스텀 헤더를 추가하고 싶을 때는 @Header 데코레이터를 사용하면 된다. 물론 res.header() 메소드를 사용해도 된다.

//test.controller.ts

@Controller('test')
export class TestController {
	...
	@Header("JoY1", "hi1")
  @Header("JoY2", "hi2")
  @Get("/setHeader")
  setHeader(): string {
    return "set header finish";
  }
}

여러 개의 커스텀헤더를 추가하고 싶으면 @Header 데코레이터를 여러 번 사용하면 된다.

리디렉션

서버에서 request를 처리한 후에 클라이언트를 다른 페이지로 이동시키고 싶은 경우에는 @Redirect 데코레이터를 사용하면 된다. @Redirect 는 두 가지 인자를 받는다. 첫 번째 인자는 리디렉션 시킬 URL주소이고 두 번째는 상태코드이다. 리디렉션 상태코드는 301, 307, 308 세 가지가 있다. 다른 상태코드를 넣어도 되지만, 브라우저가 제대로 반응하지 못하는 경우도 발생한다.

//test.controller.ts

@Controller('test')
export class TestController {
	...
	@Redirect("<https://doppelgoer.tistory.com/>", 301)
  @Get("/goToRedirection")
  goToRedirection(): void {
    console.log("redirect handler");
    return;
  }
}

 

개인 기록용입니다. 만약 잘못된 부분이 있다면 댓글로 알려주신다면 감사하겠습니다!

'프레임워크\라이브러리 > Nest.js' 카테고리의 다른 글

[NestJS] 파이프  (1) 2024.02.18
[NestJS] 환경 변수  (0) 2024.02.16
[NestJS] DTO  (1) 2024.02.12
[NestJS] 설치  (1) 2024.02.06
[NestJS] 소개  (1) 2024.02.05