01. Spring - DI(Dependency Injection)

Spring - DI

  • Spring은 DI(Dependency Injection) 기능을 제공하는 프레임워크 중 하나이다.
  • DI는 의존성 주입이라는 의미로 객체지향 프로그래밍에서 객체 간의 관계를 형성하는데 있어서 중요한 개념이다.
  • DI를 통해 객체 간의 결합도를 낮출 수 있고, 코드의 유지보수성과 테스트 용이성을 향상 시킬 수 있다.
  • DI는 일종의 제어의 역전(Inversion of Control. IoC) 개념으로, 객체를 직접 생성하고 관리하는 것이 아니라, 외부에서 생성한 객체를 주입받아 사용하는 것을 의미한다.
  • 이를 통해 객체간의 의존성을 줄이고 유연성 있는 코드를 작성할 수 있다.

Spring에서 DI를 사용하는 이유

  1. 코드의 유지 보수성 향상
    1. DI를 사용하면 의존성이 높은 객체를 직접 생성하거나 호출하지 않고, 외부에서 주입받아 사용한다
    2. 이를 통해 코드의 변경이 필요한 경우 해당 객체만 수정하면 되므로 코드의 유지보수성을 향상 시킬 수 있다.
  2. 테스트 용이성 향상
    1. DI를 사용하면 테스트를 위해 Mock Object를 사용하거나 의존성 있는 객체를 변경하여 테스트 할 수 있다.
    2. 객체 간의 결합도를 낮춘다.
  3. DI를 사용하면 객체 간 결합도를 낮추어 유연성 있는 코드 작성이 가능하다.

Spring DI 사용법

1. XML를 활용한 방식

  • XML을 활용한 방식은 DI 설정을 XML 파일에 작성하고, 이를 Spring 컨테이너에 등록하여 사용하는 방식이다.
  • 이 방식은 코드와 설정을 분리할 수 있어 코드의 가독성을 높일 수 있다.
  • XML 파일을 이용하여 다양한 설정을 관리할 수 있어 유연성이 높다. 하지만, XML 파일을 작성하는 과정이 복잡하며, 작성된 XML 파일이 오타 등의 이유로 인해 오류를 발생할 가능성도 존재한다.

아래 코드 설명

  • 코드에서는 MyDependency와 MyClass를 각각 빈으로 등록하고, MyClass에서 MyDependency를 의존성 주입하도록 설정.
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="myDependency" class="com.example.MyDependency" />
    
    <bean id="myClass" class="com.example.MyClass">
        <property name="myDependency" ref="myDependency" />
    </bean>

</beans>
 

2. Annotation을 활용한 방식

  • Annotation을 활용한 방식은 DI 설정을 자바 소스코드에 Annotation을 이용하여 작성하는 방식이다.
  • 이 방식은 코드 작성 시 Annotation을 이용하여 간결하게 DI 설정을 작성할 수 있다.
  • Annotation을 이용하여 다양한 설정을 적용할 수 있어 유연성이 높다.
  • 하지만, 코드와 설정이 섞여 가독성이 낮을 수 있으며, Annotation을 이용한 설정이 많아지면 코드 복잡도가 증가할 수 있다.

코드 설명

  • 코드에서는 MyDependency와 MyClass를 각각 @Component Annotation을 이용하여 빈으로 등록하고, MyClass에서 MyDependency를 @Autowired Annotation을 이용하여 의존성 주입하도록 설정.
  • Annotation을 이용하여 DI 설정을 작성하면 XML을 이용한 방식보다 코드가 간결해지며, 유지보수하기 쉽습니다.
 

 

@Component
public class MyDependency {
    public void doSomething() {
        System.out.println("MyDependency is doing something...");
    }
}

@Component
public class MyClass {
    private MyDependency myDependency;

    @Autowired
    public void setMyDependency(MyDependency myDependency) {
        this.myDependency = myDependency;
    }

    public void doSomething() {
        myDependency.doSomething();
    }
}

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

[스프링 학습] 1. 오브젝트와 IoC  (0) 2023.10.23
Spring Template - RestTemplate  (0) 2023.07.23
Spring Template이란?  (0) 2023.07.23
JWT Token  (0) 2023.07.23
HttpServletRequest와 @RequestBody  (0) 2023.07.23