이것저것 개발기록

"객체 지향의 꽃" 의존성 주입(DI) 이해하기 본문

IT 이야기

"객체 지향의 꽃" 의존성 주입(DI) 이해하기

Garam Kim 2026. 1. 2. 12:00

"DI, IoC... 용어는 들어봤는데 왜 써야 하는지 모르겠다면?"
결합도를 낮추고 유연한 코드를 만드는 핵심 개념, 의존성 주입(Dependency Injection)을 아주 쉽게 풀어봅니다.

1. 의존성이란 무엇인가?

A라는 클래스가 기능을 수행하기 위해 B라는 클래스를 가져다 쓰는 것을 "A가 B에 의존한다"고 합니다. 만약 A 내부에서 new B()를 직접 호출한다면, B를 C로 바꾸고 싶을 때 A의 코드까지 전부 고쳐야 합니다. 이것을 강한 결합이라고 부릅니다.

2. 주입(Injection)이 가져오는 변화

의존성 주입은 내가 직접 객체를 만들지 않고, 외부(주로 프레임워크)에서 만들어진 객체를 전달받는 것입니다. 마치 배달 음식을 시키는 것과 같죠. 나는 음식이 어떻게 만들어지는지 몰라도 메뉴판(인터페이스)만 알면 맛있게 먹을 수 있습니다.

  • 유연성: 코드 수정 없이 구현체를 갈아끼울 수 있습니다.
  • 테스트 용이성: 가짜 객체(Mock)를 주입해 단위 테스트를 하기 쉬워집니다.
  • 코드 재사용성: 역할과 구현이 분리되어 코드가 깔끔해집니다.

💡 실무 노트

스프링(Spring)을 사용하다 보면 필드 주입(@Autowired)을 많이 쓰게 되는데, 최근 실무 컨벤션은 생성자 주입(Constructor Injection)을 권장합니다.

팁: 생성자 주입을 쓰면 객체가 생성될 때 모든 의존성이 채워지는 것을 보장할 수 있고, final 키워드를 사용할 수 있어 객체의 불변성(Immutability)을 유지할 수 있습니다. "왜 생성자 주입인가?"에 대해 고민해 보는 것만으로도 객체 지향에 대한 깊이가 달라질 거예요.

"의존성을 직접 관리하지 마세요. 맡기면 코드가 자유로워집니다."