티스토리 뷰

스프링의 핵심 요소 중 가장 많이 꼽히는 요소로 의존성 주입, DI(Dependency Injection)이 있다.



"Engine" 속성을 가진 "Car"라는 클래스를 개발하고 있다고 가정해보고 간단히 이런 코드를 만들었다.

public class Car {
   private Engine engine;

   public Engine getEngine() {
      return engine;
   }

   public void setEngine(Engine engine) {
      this.engine = engine;
   }
}


여기서 "Engine"은 "Car" 클래스에 종속된다. 스프링이 없는 자바에서는 "Car" 클래스 내에 "Engine" 클래스의 인스턴스를 만들어서 사용한다.

public class Car {
   private Engine engine = new Engine();

   public Engine getEngine() {
      return engine;
   }
}


그러나 이런 방법은 몇 가지 문제가 생길 수 있다.
첫째, "Engine" 타입을 변경하거나 다른 구현체로 교체하는 것이 어렵다.
둘째, "Car" 클래스는 항상 "Engine" 인스턴스가 필요해서 "Car" 클래스 만을 단위테스트하기가 어렵다.

이에 비해 Dependency Injection은 "Engine" 인스턴스는 외부에서 생성하고 관리하며 필요할 때 "Car" 클래스로 전달되는 방식이다.

public class Car {
   private Engine engine;

   public Engine getEngine() {
      return engine;
   }

   @Autowired
   public void setEngine(Engine engine) {
      this.engine = engine;
   }
}


위의 예에서 Engine 클래스의 인스턴스를 찾아서 Car 클래스에 주입하는 기능을 사용할거라고 Spring에게 알려주기 위해 @Autowired 애노테이션을 메소드 위에 적어준다.
이렇게 하면 Spring은 Engine 인스턴스를 생성하고 관리하며, 필요할 때마다 Car 클래스에 전달해준다.

이렇게 하면 Engine 클래스의 다양한 구현체를 만들고 필요에 따라 쉽게 전환할 수 있다.
또한 Car 클래스는 내부에서 Engine 클래스 인스턴스를 생성하지 않기 때문에, 작동하는 Engine 인스턴스 없이도 격리하여 단위테스트를 할 수 있다.

여기까지가 Spring에서 사용하는 의존성 주입의 아주 기본적인 컨셉이다.

물론 위의 예시는 이해를 위한 아주 단순한 예시일 뿐, 실제 구현에서는 아래처럼 생성자 주입 방식을 사용하는 것을 추천한다.

public class Car {
   private Engine engine;
   
   // 생성자 주입은 @Autowired를 붙이지 않아도 Spring이 알아챌 수 있다.
   public Car(Engine engine) {
      this.engine = engine;
   }

   public Engine getEngine() {
      return engine;
   }
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함