NestJS를 사용하면서 데코레이터를 활용해 코드의 재사용성을 높이고 로직을 깔끔하게 정리할 수 있다. 이번 포스팅에서는 Custom Decorator를 구현하는 방법을 알아본다. 특히, 데코레이터에 path를 추가해 효율적으로 엔드포인트를 관리하는 방법을 중점적으로 다룬다.
먼저, Custom Decorator를 구현하는 기본 예제를 살펴본다. 이 데코레이터는 함수가 호출될 때 인자들을 로그로 출력해주는 역할을 한다.
function log(target, name, descriptor) {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = function(...args) {
console.log(`Arguments for ${name}: ${args}`);
return original.apply(this, args);
}
}
return descriptor;
}
class Person {
@log
say(message) {
console.log(message);
}
}
위 코드를 실행하면 say
메서드가 호출될 때마다 인자들이 로그에 출력된다. 이를 통해 함수 호출을 디버깅하기가 쉬워진다.
Custom Decorator를 활용해 컨트롤러에 path를 추가할 수 있다. 예를 들어, @controller('post')
를 사용하면 엔드포인트를 localhost:4000/post
에 매핑할 수 있다. 하위 @Get
데코레이터에 path를 추가하여 더 세부적인 엔드포인트를 지정할 수 있다.
@controller('post')
class PostController {
@get('detail')
getPostDetail() {
// 엔드포인트: localhost:4000/post/detail
}
}
주의할 점은 @controller('post')
와 @get('post')
를 동시에 사용하면 엔드포인트가 localhost:4000/post/post
와 같이 중첩된다는 것이다. 따라서 접두어가 붙는다는 것을 유의해야 한다.
다음은 역할 기반으로 접근을 제어하는 Custom Decorator의 예제이다. 이 데코레이터는 특정 역할을 가진 사용자만 함수에 접근할 수 있도록 제한한다.
function role(roleName) {
return function(target, name, descriptor) {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = function(...args) {
const userRole = this.user.role;
if (userRole !== roleName) {
throw new Error('Unauthorized');
}
return original.apply(this, args);
}
}
return descriptor;
}
}
class AdminController {
user = { role: 'admin' }; // 예시로 user 객체를 정의
@role('admin')
deletePost() {
console.log('Post deleted');
}
}
이 예제에서는 @role('admin')
데코레이터를 사용해 deletePost
메서드가 관리자 역할을 가진 사용자만 호출할 수 있도록 제한한다. 다른 역할의 사용자가 호출하면 'Unauthorized' 에러가 발생한다.
Custom Decorator를 사용하면 코드의 가독성과 재사용성이 높아진다. 특히, 복잡한 로직을 깔끔하게 정리하고 반복적인 코드를 줄일 수 있어서 매우 유용하다. 이번에 소개한 예제들을 통해 Custom Decorator를 직접 구현해보면서 그 효용성을 체감할 수 있었다.
NestJS에서 Custom Decorator를 구현하는 방법과 그 활용법에 대해 알아보았다. 기본적인 데코레이터 구현부터 Controller에 path를 추가하는 방법, 그리고 역할 기반 접근 제어 예제까지 살펴보았다. Custom Decorator는 코드의 구조를 개선하고 유지보수성을 높이는 강력한 도구이다. 다양한 상황에 맞춰 Custom Decorator를 활용해 보자.