오답노트
[Spirng] IoC, DI 본문
DI (Dependenct Injection)
- 장점
- 의존성으로 부터 격리시켜 코드 테스트에 용이하다.
- DI를 통하여, 불가능한 상황을 Mock와 같은 기술을 통해, 안정적으로 테스트가 가능하다.
- 코드를 확장하거나 변경할 떄 영향을 최소화한다. (추상화)
- 순환참조를 막을 수 있다.
public class Main {
public static void main(String[] args) {
String url = "www.naver.com/books/it?page=10&size=20&name=spring-boot";
Encoder encoder = new Encoder(new Base64Encoder());
String result = encoder.Encoder(url);
System.out.println(result);
Encoder urlencoder = new Encoder(new UrlEncoder());
result = urlencoder.Encoder(url);
System.out.println(result);
}
}
위 코드에서 Encoder 생성자의 매개변수만 바꿔줬을뿐인데 서로 다른 역할을 하게 된다.
이 처럼 클래스 자체를 변경하는 것이 아닌, 외부에서 클래스에 주입하는 것을 DI라고 한다.
IoC (Inversion of Control)
스프링에서는 일반적인 Java 객체를 new로 생성하여 개발자가 관리하는 것이 아닌 Spring Container에 모두 맡긴다. 즉, 개발자에서 프레임워크로 제어의 객체 관리의 권한이 넘어 갔으므로 "제어의 역전"이라고 한다.
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
public static ApplicationContext getContext(){
return context;
}
}
Spring에서 관리되는 객체를 받아오기 위해 ApplicationContextAware 인터페이스를 상속 받은 클래스를 정의한다.
setApplicationContext는 Spring에서 호출하기 때문에 Override를 받아 정의하도록 한다.
그리고 해당 클래스 또한 Spring에서 관리되어야 하기 때문에 Component Annotation을 추가한다.
@Component
public class UrlEncoder implements IEncoder {
@Override
public String Encoder(String msg) {
try {
return URLEncoder.encode(msg,"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
스프링에서 인스턴스를 받아오기 위해서는 받아올 인스턴스 객체를 정의해야한다. 이 또한 Spring에 등록해야 하므로 Component Annotation을 추가한다.
결론
Component Annotation을 통해 정의한 클래스를 Spring에게 제어 권한을 넘겨주어 생명 주기를 관리하도록 하여 '제어 역전'이 발생하게 됐고 (IoC) 이를 우리는 주입받아서 (DI) 사용하고 있다.
'Java > Spring' 카테고리의 다른 글
[Spring] Validation (0) | 2023.07.13 |
---|---|
[Spring] AOP (0) | 2023.07.13 |
[Spring Boot] Object Mapper (0) | 2023.07.13 |
[Spring Boot] Response (0) | 2023.07.13 |
[Spring Boot] PUT (0) | 2023.07.12 |