Node.js 백엔드 — 프레임워크가 감춘 것 · 요청 하나가 지나가는 길 · 이론
의존성 주입 — 인자로 받는다는 것
한 줄 요약
의존성 주입은 어려운 개념이 아니라 인자로 받는 것이다. 전역을 직접
참조하는 대신 밖에서 넣어 주면, 시험할 때 다른 것을 넣을 수 있다.
왜 필요한가 — 시험을 위해서가 아니다
DI 를 "테스트 때문에 쓰는 것" 으로 배우면 목적이 어긋난다. 진짜 이유는
바꿔 끼울 수 있는 자리를 코드에 표시해 두는 것이다.
저장소를 PostgreSQL 에서 Redis 캐시 앞단으로 옮긴다고 하자. 핸들러가db.query(...) 를 직접 부르고 있으면 핸들러를 전부 고쳐야 한다. 저장소를
인자로 받고 있으면 넣어 주는 쪽만 바뀐다. 시험은 그 성질의 부산물이다.
손으로 만들면 이렇다
export function createApp({ store }) { return async function handle(req) { /* store 를 쓴다 */ };}프레임워크가 하는 일은 이 { store } 를 자동으로 찾아 넣어 주는 것뿐이다.
Nest 의 provider, Spring 의 Bean 이 그 자동화다. 자동화가 감춘 것이 무엇인지
모르면, 주입이 안 될 때 볼 곳도 모른다.
현장에서
면접에서 "DI 를 왜 쓰나요" 라는 질문을 받으면 대개 "테스트하기 쉬워서" 라는
답이 나온다. 틀린 답은 아니지만 절반이다. **의존 방향을 뒤집어 상위 모듈이
하위 모듈의 구현에 묶이지 않게 하는 것**이 목적이고, 시험 용이성은 그 결과다.
그리고 실무에서 DI 가 무너지는 자리는 늘 같다 — 전역 싱글턴 하나를 "편해서"
직접 import 하는 순간이다. 그때부터 그 모듈은 갈아 끼울 수 없다.