의존성 주입

MONA·2025년 3월 18일

나혼공

목록 보기
59/92

의존성 주입(Dependency Injection, DI)

객체가 직접 의존하는 객체를 생성하는 것이 아니라 외부에서 주입받는 방식
객체 간의 결합도를 낮추고, 유연한 코드 구조를 만들기 위해 사용하는 설계 패턴

의존성

  • 어떤 객체가 다른 객체를 필요로 하는 관계
  • ex)
    public class Car {
    	private Engine engine = new Engine();
        
        public void start() {
        	engine.run();
        }
    }
  • Car는 Engine 객체를 직접 생성(new Engine()) 하고 있음(직접 의존)
  • 만약 Engine에 변경사항이 생기거나, 다른 Engine을 사용하려면 Car의 코드도 변경되어야 할 수 있음
  • 이런 하드코딩된 의존성은 유지보수가 어려워지는 이유 중 하나

의존성 주입의 원리

  • 외부에서 생성한 객체를 주입받는다

1. 생성자 주입(Constructor Injection)

public class Car {
	private Engine engine;
    
    public Car(Engine engine) {
    	this.engine = engine;
    }
    
    public void start() {
    	engine.run();
    }
}
  • Engine을 외부에서 주입받음
  • Engine이 변경되어도 Car를 수정할 필요 없음

2. 세터 주입(Setter Injection)

public class Car {
	private Engine engine;
    
    public void setEngine(Engine engine) {
    	this.engine = engine;
    }
    
    public void start() {
    	engine.run();
    }
}
  • 필요한 경우에만 Engine 설정 가능
  • 의존성을 변경할 수 있어 유연하지만, null 상태가 될 가능성이 있어서 주의해야 함

3. 필드 주입(Field Injection/ @Autowired)

public class Car {
	@Autowired 
    private Engine engine;
    
    public void start() {
    	engine.run();
    }
}
  • @Autowired 설정으로 Spring이 자동으로 주입
  • 테스트가 어렵고, DI 컨테이너 없이 객체를 생성하기 어려움

+DI 컨테이너(Dependency Injection Container)

  • 객체의 생성과 의존성 주입을 관리하는 프레임워크 또는 시스템
  • 객체를 직접 생성하는 게 아닌, 외부에서 객체를 자동으로 생성하고 주입하는 역할을 함
  • Spring에서는 ApplicationContext가 DI 컨테이너 역할을 한다(@Autowired, @Component 등을 활용

의존성 주입의 장점

  • 코드 결합도 낮추기
  • 유지보수성, 테스트용이성(테스트시 Mock 객체를 주입하여 쉽게 테스트 할 수 있음)
  • 객체 생성을 프레임워크 등에 위임 가능(Spring의 IoC 컨테이너가 객체 생성을 담당(IoC:Inversion of Control)
  • Spring에서는 @Component@Autowired를 활용해서 DI를 쉽게 구현할 수 있다
profile
고민고민고민

0개의 댓글