Nest.js 의 controller기본 및 장점

보통 express를 사용하게 되면,
// routes/index.js
const express = require('express');
const router = express.Router();
router.get('/in', (req, res) => {
res.send('Hello, World !');
});
module.exports = router;
// routes/user.js
const express = require('express');
const router = express.Router();
router.get('/iam', (req, res) => {
res.send('Hello, User');
});
module.exports = router;
이런식으로 라우터를 직접 지정해줘야 실행이 된다.
하지만, nest.js에서는 이를 controller에서 실행한다.
즉, controller에서 url을 매핑하고, 리퀘스트를 받고, query를 넘기거나 body등을 넘기는 역할을 한다.
app.controller.ts>
@Controller('abc') //공통주소
export class AppController {
constructor(private readonly appService: AppService) {}
@Get('hello') //GET /abc/hello
getHello(): string {
return this.appService.getHello();
}
@Post('hi') //POST /abc/hi
postHello(): string {
return this.appService.postHello();
}
}
이런 방식으로 controller('abc') 이곳에 들어 있는 abc는 공통 주소이며,
Get('hello') 이것은 abc/hello의 주소를 갖게 된다.
다만, module은 직접 구성을 해주어야 한다.
app.module.ts>
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
-> 하나의 모듈로 관리가 됨.
그리고, Service
Service또한 추가해주어야 함.
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
postHello():string{
return 'post succeeded';
}
}
요런 식으로 위에 Controller에서 만든 함수들을 service에 추가해주어야 한다!
service의 역할은?
비즈니스의 로직에 분리한다.
라우터가 해야할 동작은 서비스에, 컨트롤러엔 서비스를 실행한 다음 결과값만 받아 return 해줌
express와 nest.js의 차이
1. Controller와 Service의 분리
왜 Nest.js 에선 컨트롤러와 서비스를 분리하나?
- 서비스는 트랜잭션 단위로 짜는데, 요청과 응답에 대해서는 모른다. (req, res)를 쓰지 않고, 해야하는 동작만, return 해야 할 값만 적어준다.
- controller에서는 req, res에 대해 알아야 한다.
여기서 결과값을 받아서 res에 넘기거나 서비스로 넘기거나 등등
- espress에서는 쓸데 없이 (req, res, next) ->{ }이런 것들을 꼭 mocking을 해줘야 했음.
- 하지만, service는 mocking 할 필요 X 없어져 테스트도 편리, 재사용도 편리
2. 구조의 강제성
function findUser(email){
return User.findOne({ email});
}
async (req, res, next) =>{
const user=await User.findOne({ email: req.body.email);
res.json(user);
}
이런 식으로 express에서도 분리하면 되는거 아닌가요?
- express에서는 분리해도 되고 안해도 되지만, nest.js에서는 서비스가 분리되어 있어 이런 구조도 꼭! 분리해서 써야함.
- 위와 같은 이유로, 구조에 대한 강제성이 부여된다! 그래서 협업 등에 유용함.