DI는 객체가 직접 필요로 하는 의존성을 생성자, Setter 메서드, 필드 주입 등의 방법으로 주입받는 것을 의미
이를 통해 객체 간의 결합도를 낮추고, 코드의 재사용성과 유지보수성을 향상시킬 수 있습니다.
2) 의존성 주입의 세가지 방법
① 생성자 주입 (Constructor Injection )
생성자를 통해 의존성을 주입하는 방법입니다. 클래스의 생성자를 정의하고, 해당 클래스가 필요로 하는 의존성을 생성자의 매개변수로 선언합니다.
<예시> public class Attack { private String name; // Attack 클래스 선언
public Attack(String name) { this.name = name; }
public void perform() { System.out.println(name + " attack performed!"); // Attack 클래스의 perform이라는 메소드 생성 } }
public class Pokemon { private Attack attack; // Attack은 클래스이며,Pokemon 클래스 내에 선언된attack 변수는 Attack 클래스의 객체를 참조함 즉, Pokemon 클래스는 Attack 클래스에 대한 의존성을 가지고 있습니다. Pokemon 클래스는 Attack 객체를 필요로 하며, Attack 객체를 통해 실제 공격을 수행합니다.
public Pokemon(Attack attack) { this.attack = attack; } // Pokemon 클래스 내에 Attack 객체의 매개변수 attack을 받아 들이고, 이를 인스턴스 변수인 this.attack에 할당합니다. Attack 객체를Pokemon 객체에 주입하여 사용할 수 있게 됩니다 → 생성자 주입
클래스의 Setter 메서드를 정의하고, 해당 클래스가 필요로 하는 의존성을 Setter 메서드의 매개변수로 선언합니다.
Spring 컨테이너는 Setter 메서드를 호출하여 의존성을 주입합니다.
<예시> public class Attack { private String name;
public Attack(String name) { this.name = name; }
public void perform() { System.out.println(name + " attack performed!"); // Attack 클래스의 perform이라는 메소드 생성 } }
public class Pokemon { private Attack attack; public void setAttack(Attack attack) { this.attack = attack; } // 위 메소드 public void setAttack(Attack attack)은 Attack 클래스의 객체를 참조하는 역할을 함. Attack 타입의 매개변수 attack을 받아들이고, 이를 Pokemon 클래스의 인스턴스변수 this.attack에 할당 즉, 외부에서 전달된 Attack 객체를 현재 Pokemon 객체의 attack 변수에 저장함.
이렇게 setAttack() 메서드를 통해 외부에서 Attack 객체를 설정할 수 있게 되면, Pokemon 객체는 주입된 Attack 객체를 사용하여 attack() 메서드를 호출할 때 해당 Attack 객체의 perform() 메서드를 실행합니다.
따라서 setAttack() 메서드는 Attack 클래스의 객체를 참조하여 Pokemon 객체에 주입하고, attack() 메서드에서 해당 객체를 사용하는 역할을 합니다. → Setter 주입