본문 바로가기
  • optimuslee
Nestjs

[Nestjs] 4-2. DI(Dependency Injection)?? 의존성 주입??

by OptimusLee 2022. 4. 21.
728x90
반응형

오늘은 의존성 주입에 대해 한번 자세히 알아보도록 하겠습니다. 간단히 언급을 하며 넘어간 적은 있었지만 구체적으로 설명한 적은 없었습니다. (이번에 설명하려고 그랬어요 ㅎ...)

 

 

의존성이라는 단어도 알고 주입이라는 단어도 알고 있지만 두 단어를 합쳐놓이니 무슨 말인지 모르겠습니다 ㅎ.

📢의존성 주입이란 하나의 객체가 다른 객체의 의존성을 제공하는 기술을 일컫는 말입니다. 더 쉽게 말하면 미리 만들어 놓은 객체를 불러와서 사용하는 것입니다. 아래 코드를 예시로 설명하겠습니다. 

 

 

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에 충분히 접근할 수 있습니다.

 

 

728x90
반응형