안녕하세요. 꼬동입니다.
일을 하다, 모듈 서비스를 Dependency Injection으로 꽂았는데, NullInjectorError가 뜨더라고요 ?
아뿔싸 providers 명시를 안했더라고요 ㅎㅎ
그래서 Service 꽂으려고 하는데
읭 ?
viewProviders와 providers 두 방식으로 꽂을 수 있더라고요
엄..
선택지가 많아지면, 공황이 오는 성격상 둘을 명확하게 알고 가는게 좋을거 같아서 키보드를 잡아봅니다.
사실 간단합니다.
viewProviders로 인해 꽂힌 Service를 자식들이 사용하려고 하면, 사용이 안되며, provider로 꽂힌 Service는 자식들이 사용하려하면, 제공해주는 방식입니다.
위의 그림에서도 이를 설명하고 있는데, SimpleService가 Providers로 NgModule에 꽂혔으며, Parent에도 viewProviders로 꽂힌 상황입니다.
자식에서 Service를 Dependecy Injection으로 꽂았지만, 부모는 이를 내팽겨치고, 더 위의 조상을 참조해라고 합니다. 서운하죠.
근데 부모도 어쩔 수 없는게, 상황상 viewProviders로 꽂혀있는 Service이기 때문에, 주고 싶은 마음이 있지만 그럴 수 없는 환경... 슬픈 환경입니다.
결론을 내려보죠. 3가지 경우로 정리가 가능합니다.
- 전역 Module에서 하나의 서비스 인스턴스를 완전히 공유하고 싶을 땐, NgModule에 providers로 꽂습니다.
- 컴포넌트마다 하나의 인스턴스를 가지고 싶고, 이를 자식 컴포넌트에 공유하고 싶을 땐 providers를 컴포넌트 데코레이터에 꽂으면 됩니다.
- 컴포넌트마다 하나의 인스턴스를 가지고 싶고, content children에게는 공유하고 싶지 않을 때, viewProviders를 컴포넌트 데코레이터에 꽂으면 됩니다.
갑자기 여기서 content children의 개념이 나왔는데, view children의 경우엔 viewProviders의 서비스 인스턴스를 사용할 수 있습니다.
그렇다면 content children과 view children의 차이를 알아야하는데,
이 역시도 사실 간단합니다.
어느 컴포넌트 템플릿에 한 부분이 되면 ViewChild이며, projected(끼워지다라고 표현하겠습니다)이면 ContentChild입니다.
ng-content는 django의 {% block ... %} {% endblock %}의 개념과 비슷하다고 생각하는데, 다른 템플릿에서 정의된 거를 요기에 집어넣는 개념이라고 보면됩니다.
회사 동료분들도 제 블로그를 알아서, 가끔 찾아와서 보신다고 하는데, 너무 기본적인거를 올리는거 같아 좀 창피하군요.
근데, 뭐 기본이 중요한거 아니겠나요 !?
이상 providers와 viewProviders의 차이 / content child와 view child였습니다. ^_^
'Web + APP > Angular' 카테고리의 다른 글
Angular Hydration (0) | 2023.06.10 |
---|---|
Angualr v16 - signal (6) | 2023.06.04 |
HostListener & HostBinding (0) | 2022.04.30 |
NGRX Store - An Architecture Guide (1) (0) | 2022.04.11 |
attr vs attr.name (0) | 2022.03.30 |