DI(Dependency Injection)는 클래스 간의 의존 관계를 외부(스프링 컨테이너)에서 주입해주는 방식이다. 즉, 객체 간의 연결 개발자가 직접 하지 않고 스프링이 대신 설정해주는 것이다.
IoC (제어의 역전): 객체의 생성과 제어를 개발자가 아닌 스프링 컨테이너가 담당하는 개념이다.
DI는 IoC의 구현 방식 중 하나이다.
기존 방식 (강한 결합)
new를 통해 객체를 생성하기 때문에, 다른 클래스의 변경이 전파되기 쉽다.public class BoardService {
private BoardDAO boardDAO = new BoardDAO();
}
DI 방식 (약한 결합)
public class PersonService {
private String name;
private int age;
public PersonService(String name, int age) {
this.name = name;
this.age = age;
}
public void sayHello() {
System.out.println("이름: " + name);
System.out.println("나이: " + age);
}
}
<bean id="personService1" class="com.spring.ex02.PersonService">
<constructor-arg value="손흥민" />
<constructor-arg value="23" />
</bean>
ApplicationContext context = new ClassPathXmlApplicationContext("person.xml");
PersonService person1 = context.getBean("personService1", PersonService.class);
person1.sayHello();
public class PersonService {
private String name;
public void setName(String name) {
this.name = name;
}
public void sayHello() {
System.out.println("이름: " + name);
}
}
<bean id="personService2" class="com.spring.ex01.PersonService">
<property name="name" value="홍길동" />
</bean>
ApplicationContext context = new ClassPathXmlApplicationContext("person.xml");
PersonService person2 = context.getBean("personService2", PersonService.class);
person2.sayHello();
@Component
public class MemberDAO {
// DB 연결 로직
}
@Service
public class MemberService {
@Autowired
private MemberDAO memberDAO;
}
어노테이션 기반 DI를 사용하려면 컴포넌트를 스캔하는 설정이 필요하다.
XML 또는 Java Config로 설정하는 방법이 있다.
<context:component-scan base-package="com.spring.pro19" />
@Configuration
@ComponentScan(basePackages = "com.spring.pro19")
public class AppConfig {
// 필요 시 @Bean 정의도 가능
}