BackEnd/Spring

[Spring] DI (Dependency Injection) with XML Configuration

guineaa 2025. 3. 14. 18:16

DI(Dependency Injection)이란 의존 관계 주입 또는 의존성 주입이라고 불린다.

Spring은 3가지 핵심 프로그래밍 모델 (AOP, DI, IOC)를 지원하는데, 그 중 하나가 바로

의존 관계 주입 (Dependency Injection)이다. 그리고 Spring은 객체의 의존 관계 주입을 통해 객체의 의존 관계를 관리한다.

DI는 외부에서 객체 간의 관계를 결정해주는데, 즉 객체를 직접 생성하는 것이 아니라 외부에서 생성 후 주입시켜주는것 이라고 할 수있다.

 

의존성 주입이란 스프링 컨테이너에서 객체 Bean을 먼저 생성해두고, 생성한 객체를 지정한 객체에 주입하는 방법!

✅ 1. Dependency(의존성) 이란?

객체 A가 객체 B를 사용해야 한다면, A는 B에 의존 한다고 말한다.

예를 들어 Customer 클래스가 Address 객체를 사용해야 한다면, Customer는 Address에 의존하는 것이다.

class Customer{
	Address address;
}

이렇게 작성하면 Customer는 Address 객체를 필요로 한다는 뜻 이다.

 

✅ 2. 의존성 설정 방법

객체 A가 객체 B를 사용하는 방법에는 2가지가 있다.

객체 간의 관계 설정은 객체 내부 또는 객체 외부에서 이루어진다.

1) 내부에서 직접 생성 (내부 설정)

class Customer {
	Address address;
    
    public Customer(){
    	address=new Address(); //직접 객체 생성
    }
 }

이 방법은 Customer 클래스 안에서 Address 객체를 직접 생성하는 방법이다.

📍문제점: Customer 클래스가 Address 객체를 스스로 생성하기 때문에, Address가 변경되면 Customer도 수정해야한다.

즉, 유연성이 부족하다는 뜻 이다.

2) 외부에서 주입 (외부 설정)

public static void main(String[] args){
	Customer cst=new Customer(new Address());
    // 생성자로 Address 주입
}

이 방법은 main에서 Address 객체를 생성한 후,

Customer 생성자에 넘겨준다.

이렇게 하면 Customer는 Address가 어떻게 만들어지는지 몰라도 된다.

📌 이것이 바로 "의존성 주입 (DI: Dependency Injection)" 이라는 개념이다.

 

✅ 3. Spring에서 DI(의존성 주입)이란?

Spring에서는 객체 간의 의존성을 직접 코드에서 설정하는 것이 아니라

Spring IoC컨테이너 (ApplicationContext)가 대신 설정해준다.

1) DI 적용 전 (기존 방식)

public class HelloApp{
	public static void main(String[] args){
    	MessageBean bean=new MessageBean(); //직접 객체 생성
        bean.sayHello("Spring");
    }
 }

- HelloApp이 MessageBean을 직접 생성하고 있다.

- MessageBean이 변경되면, HelloApp도 변경해야 한다.

2) DI 적용 후 (Spring의 방식)

public class HelloApp{
	public static void main(String[] args){
    	ApplicationContext ctx=new GenericXmlApplicationContext("applicationContext.xml");
        
        MessageBean bean=(MessageBean) ctx.getBean("messageBean"); //Spring이 객체 생성
        bean.sayHello("Spring");
    }
 }

- applicationContext.xml 설정 파일에서 MessageBean 객체를 생성하고 관리한다.

- HelloApp에서는 ctx.getBean("messageBean")을 호출하여 Spring 컨테이너에서 객체를 받아오기만 하면 된다.

 

✅ 4. Spring의 DI 방식

Spring에서 DI를 구현하는 방법에는 2가지가 있다.

1) 생성자 주입 (Constructor Injection)

<bean id="messageBean" class="sample3.MessageBean">
	<constructor-arg value="Spring" />
</bean>

2) 세터 주입 (Setter Injection)

<bean id="messageBean" class="sample3.MessageBean">
	<property name="greeting" value="Hello, " />
</bean>

 

✅ 5. Spring DI의 장점

1. 코드 수정 없이 객체 변경 가능

- applicationContext.xml만 수정하면 객체 변경 가능!

2. 객체 간 결합도 낮아짐

- HelloApp이 MessageBean 객체를 직접 생성하지 않으므로, 다른 구현체로 쉽게 변경 가능

3. 객체 관리가 편리

- Spring IoC 컨테이너가 객체를 관리하기때문에 getBean()으로 쉽게 가져올 수 있음

 

정리

1. DI (의존성 주입): 객체 간의 의존성을 외부에서 주입

2. Spring IoC 컨테이너: 객체를 생성하고 관리하는 역할을 하는 Spring의 핵심 개념

3. DI 방법: 생성자 주입 (Constructor Injection), 세터 주입 (Setter Injection) + 필드 주입(Field Injection)

4. XML 설정을 사용하면 코드 수정 없이 객체 변경 가능

5. IoC(Inversion Of Control): 객체의 생성과 관리는 스프링프레임워크가 대신해주는것.

스프링 IoC 컨테이너라는 공간에서 객체의 생성과 의존성 관리를 대신해준다.

IoC를 사용하면 객체 간의 의존성 관리가 용이해지며 코드의 유지보수성, 확장성 또한 높아진다.

또한, 객체의 생명주기 관리나 AOP 등의 기능을 사용할 수 있다.

 

참고자료

학교피피티

 

https://velog.io/@think2wice/Spring-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

[Spring] 의존성 주입(Dependency Injection)에 대하여

Spring의 중요한 원리 의존성 주입(DI)이 무엇인지, 어떻게 사용하는지에 대해 알아보자

velog.io

https://innovation123.tistory.com/167

 

[Spring / 스프링 부트 핵심 가이드] 제어의 역전(IoC, DI, AOP)

스프링 프레임워크(Spring Framework) 스프링 프레임워크(이하 스프링)는 Java에서 가장 많이 사용하는 프레임워크다. 스프링은 Java 언어로 엔터프라이즈급 개발을 편리하게 만들어주는 '오픈소스 경

innovation123.tistory.com

https://amy-it.tistory.com/99

 

[Spring] 의존성 주입(Dependency Injection) - (1) XML 기반 설정

목차 의존성 주입(Dependency Injection)이란? 의존성 주입(DI)은 스프링 프레임워크가 지원하는 핵심 기능 중 하나로서, 객체 사이의 의존관계가 객체 자신이 아닌 외부에 의해 결정되는 디자인 패턴

amy-it.tistory.com

 

'BackEnd > Spring' 카테고리의 다른 글

[Spring] Maven, build-tool에 대한 정리  (0) 2025.03.13