본문 바로가기
  • optimuslee
Nestjs

[Nestjs] 4-3. 속성 기반 주입(property based injection)

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

우리가 이전에 배웠던 의존성 주입은 생성자 기반의 주입방식입니다. contructor를 통해서 주입을 하기 때문입니다. 하지만 이번 장에서는 속성 기반 주입(property based injection)에 대해 같이 알아보도록 하겠습니다. 

 


//propertyBase.catparentService.ts
export class catParentService{
	
    constructor(private readonly testServiceA: TestServiceA){
    }
    
    testHello(): string{
    	return "hello world"
    }
    
    parentTest(): string{
    	return this.testServiceA.testHello();
    }

}

// propertyBase.catchildService.ts
@Injectable()
export class catChildService extends catParentService{

	constructor(private readonly tsA: TestServiceA){
    	super(tsA)
	}
    
	testHello(): string{
    	return this.parentTest()
    }

}

// propertyBase.testServiceA.ts
@Injectable()
export class TestServiceA{
	testHello(){
    	return "hello Test A";
    }
}

 

@Controller("cat")
export class CatController{
	
    constructor(
        private readonly childService: catChildService
    ){}
    
    @Get("propertyBase")
    propertyBaseTest(): string{
    	return this.childService.testHello()
    }

}

 

우리는 catChildService에서 super()를 사용하여 TestServiceA의 인스턴스를 전달해줄 수 있습니다. 그렇기에 " /cat/propertyBase"로 요청하면 "test hello A"라는 문구를 응답으로 받을 수 있습니다. 

 

하지만 문제는 이런 경우가 발생할 때마다 super를 사용하는 것은 불편하기에 이런 상황에는 속성 기반 주입을 사용할 수 있습니다. 사용 방법은 굉장히 간단합니다. catParentService의 constructor 부분을 @Inject()로 대체하기면 하면 됩니다. 

 

 

//propertyBase.catparentService.ts
export class catParentService{

	@Inject(TestServiceA) private readonly testServiceA: TestServiceA;
    
    testHello(): string {
    	return "hello world"
    }
    
    parentTest(): string {
    	return this.testServiceA.testHello();
    }
    
 }
 
 
 //propertyBase.catchildService.ts
 @Injectable()
 export class catChildService extends catParentService {
 	testHello(): string{
    	return this.parentTest()
    }
 }
 
 //propertyBase.testService.ts
 @Injectable()
 export class TestServiceA {
 	testHello(){
    	return "hello Test A"
    }
 }

 

위와 같이 코드를 살짝만 변경해주시면 됩니다. 방금 전에 요청했던 것처럼 "/cat/propertyBase" 로 Get() 요청을 보내면 "hello Test A" 라는 문구를 응답으로 받을 수 있습니다. constructor를 굳이 사용하지 않아서 편하긴 하네요 ㅎㅎ

 

728x90
반응형