Spring - DI
- Spring은 DI(Dependency Injection) 기능을 제공하는 프레임워크 중 하나이다.
- DI는 의존성 주입이라는 의미로 객체지향 프로그래밍에서 객체 간의 관계를 형성하는데 있어서 중요한 개념이다.
- DI를 통해 객체 간의 결합도를 낮출 수 있고, 코드의 유지보수성과 테스트 용이성을 향상 시킬 수 있다.
- DI는 일종의 제어의 역전(Inversion of Control. IoC) 개념으로, 객체를 직접 생성하고 관리하는 것이 아니라, 외부에서 생성한 객체를 주입받아 사용하는 것을 의미한다.
- 이를 통해 객체간의 의존성을 줄이고 유연성 있는 코드를 작성할 수 있다.
Spring에서 DI를 사용하는 이유
- 코드의 유지 보수성 향상
- DI를 사용하면 의존성이 높은 객체를 직접 생성하거나 호출하지 않고, 외부에서 주입받아 사용한다
- 이를 통해 코드의 변경이 필요한 경우 해당 객체만 수정하면 되므로 코드의 유지보수성을 향상 시킬 수 있다.
- 테스트 용이성 향상
- DI를 사용하면 테스트를 위해 Mock Object를 사용하거나 의존성 있는 객체를 변경하여 테스트 할 수 있다.
- 객체 간의 결합도를 낮춘다.
- 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 |