오늘은 의존성 주입에 대해 한번 자세히 알아보도록 하겠습니다. 간단히 언급을 하며 넘어간 적은 있었지만 구체적으로 설명한 적은 없었습니다. (이번에 설명하려고 그랬어요 ㅎ...)
의존성이라는 단어도 알고 주입이라는 단어도 알고 있지만 두 단어를 합쳐놓이니 무슨 말인지 모르겠습니다 ㅎ.
📢의존성 주입이란 하나의 객체가 다른 객체의 의존성을 제공하는 기술을 일컫는 말입니다. 더 쉽게 말하면 미리 만들어 놓은 객체를 불러와서 사용하는 것입니다. 아래 코드를 예시로 설명하겠습니다.
class Animal{
private cat: Cat;
getCrying():string{
this.cat=new Cat()
return this.cat.Meow()
}
}
class Cat{
crying(): string{
return "야옹"
}
}
위의 코드를 보면 Animal 클래스는 Cat 클래스의 crying() 메소드를 사용하여 getCrying() 메소드를 구성하였습니다. 이 때, 우리는 두개의 클래스가 서로 의존 관계에 있다고 표현할 수 있습니다. 하지만 위의 코드는 한 가지 심각한 문제점을 갖고 있습니다. Cat이 아니라 다른 동물의 울음소리도 표현하고 싶으면 어떻게 해야할까요? 계속해서 클래스를 만들고 추가해야합니다. 이런식으로 코드를 계속 늘린다면 나중에 유지/보수에 엄청난 시간과 노력이 필요할 것입니다. 그래서 우리는 확장성이 높은 코드를 만들기 위해서 아래와 같이 코드를 만들 필요가 있습니다.
interface Cry{
crying(): string
}
class Cat implements Cry{
crying(): string{
return "야옹"
}
}
class Dog implements Cry{
crying(): string{
return "멍멍"
}
}
class Animal {
private animal: Animal
getCrying(animal: Animal): string{
this.animal=animal
return this.animal.crying()
}
}
위와 같이 추상화된 객체를 외부에서 받도록 하면 됩니다. 그렇다면 일반적으로 Nestjs에서 어떻게 의존성 주입을 사용하는지 코드를 통해서 알아보도록 하겠습니다.
cat.interface.ts
//cat.interface.ts
export interface Cat{
name: string;
age: string;
}
cat.service.ts
//cat.service.ts
@Injectable
export class CatService{
private readonly cats: Cat[]=[];
createCat(cat: Cat){
this.cats.push(cat);
}
findAll(): Cat[]{
return this.cats;
}
}
위와 같이 service에 대한 내용을 채워넣었습니다. 이번에는 Controller에서 service를 사용할 수 있도록 만들어보겠습니다. (예전에 이미 많이 만들어 본 내용이 어렵지 않을 것입니다 ㅎ)
cat.controller.ts
@Controller("cat")
export class catController{
contructor(private readonly catService: CatService){
}
@Post("makeCat")
makeCat(@Body() cat: Cat){
return this.catService.createCat(cat)
}
@Get("findCat")
findCat(): Cat[]{
return this.catService.findAll()
}
}
위의 코드를 보면 알 수 있듯이, contructor를 사용하여 생성자를 만들고, CatService를 catService라는 객체 멤버 변수에 할당해서 사용합니다. 이렇게 하면 catController에 의존성 주입을 할 수 있게 되는 것입니다. 이제부터 constructor로 의존성을 주입 받으면 controller에서 this를 사용하여 service에 충분히 접근할 수 있습니다.
'Nestjs' 카테고리의 다른 글
[Nestjs] 5. 모듈(Module)에 대하여... (0) | 2022.04.24 |
---|---|
[Nestjs] 4-3. 속성 기반 주입(property based injection) (0) | 2022.04.23 |
[Nestjs] 4-1. 프로바이더와 서비스 (0) | 2022.04.10 |
[Nestjs] 4. 프로바이더 (0) | 2022.04.10 |
[Nestjs] 3-4. payload 다뤄보기 (0) | 2022.04.03 |