의존성 주입 (DI)

suah·2025년 5월 1일

의존성 주입이란?

DI(Dependency Injection)는 클래스 간의 의존 관계를 외부(스프링 컨테이너)에서 주입해주는 방식이다. 즉, 객체 간의 연결 개발자가 직접 하지 않고 스프링이 대신 설정해주는 것이다.

IoC (제어의 역전): 객체의 생성과 제어를 개발자가 아닌 스프링 컨테이너가 담당하는 개념이다.
DI는 IoC의 구현 방식 중 하나이다.

기존 방식 (강한 결합)

  • 직접 new를 통해 객체를 생성하기 때문에, 다른 클래스의 변경이 전파되기 쉽다.
  • 유지보수가 어렵고 유연하지 않다.
public class BoardService {
	private BoardDAO boardDAO = new BoardDAO();
}

DI 방식 (약한 결합)

  • 객체 생성을 외부에서 주입받는다.
  • 클래스 간 의존 관계를 약하게 만들어, 유지보수가 쉬워지고 테스트가 편리해진다.
  • 코드 구조를 단순하게 만들어 재사용성을 향상시킨다.

DI 적용 방법

XML 기반 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();
  • setter 이용한 주입
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();

어노테이션 기반 DI

@Component
public class MemberDAO {
	// DB 연결 로직
}

@Service
public class MemberService {
	@Autowired
    private MemberDAO memberDAO;
}

어노테이션 기반 DI를 사용하려면 컴포넌트를 스캔하는 설정이 필요하다.
XML 또는 Java Config로 설정하는 방법이 있다.

  • XML 파일로 설정
<context:component-scan base-package="com.spring.pro19" />
  • Java Config로 설정
@Configuration
@ComponentScan(basePackages = "com.spring.pro19")
public class AppConfig {
    // 필요 시 @Bean 정의도 가능
}
profile
IT developer

0개의 댓글