IoC란?
Inversion of Control
스프링에서는 일반적인 Java 객체를 new로 생성하여 개발자가 관리 하는 것이 아닌 Spring Container에 모두 맡긴다.
즉 개발자에서 프레임워크로 제어의 객체 관리의 권한이 넘어 갔음으로 "제어의 역전" 이라고 합니다.
DI란?
Dipendency Injection
객체를 사용하기 위해 주입을 받는다라는 사전적인 의미. 외부로부터 사용할 객체를 주입 받는다. = DI
주입의 주체는 Spring Container
장점
1. 의존성으로 부터 격리시켜 코드 테스트에 용이하다.
2. DI를 통하여, 불가능한 상황을 Mock와 같은 기술을 통하여, 안정적으로 테스트 가능하다.
3. 코드를 확장하거나 변경 할 때 영향을 최소화 한다.(추상화)
4. 순환 참조를 막을 수 있다.
자기 자신을 참조하거나 중복 참조를 막을 수 있다.
코드로 DI의 예를 보면
public interface IEncoder {
String encode(String message);
}
import java.util.Base64;
public class Base64Encoder implements IEncoder{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class UrlEncoder implements IEncoder {
public String encode(String message){
try {
return URLEncoder.encode(message, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
}
}
}
public class Encoder {
private IEncoder iEncoder;
public Encoder(IEncoder iEncoder){
this.iEncoder = iEncoder;
}
public String encode(String message){
return iEncoder.encode(message);
}
}
먼저 IEncoder 인터페이스를 만들고
Base64 인코더에 대한 객체와
URLEncoder에 대한 객체를 만들었다.
여기에서 다른 객체를 변화시키지 않고
Encoder라는 베이스 클래스를 그대로 두고 주입 객체만 바꿔주면 인코더 형태를 쉽게 바꿀 수 있다.
public class Main {
public static void main(String[] args) {
String url = "www.naver.com/books/it?page=10&size=20&naver=spring-boot";
Encoder encoder = new Encoder(new UrlEncoder());
String result = encoder.encode(url);
System.out.println(result);
}
}
public class Main {
public static void main(String[] args) {
String url = "www.naver.com/books/it?page=10&size=20&naver=spring-boot";
Encoder encoder = new Encoder(new Base64Encoder());
String result = encoder.encode(url);
System.out.println(result);
}
}
주입객체인 UrlEncoder, Base64Encdoer만 주입시키면 Encoder가 거기 맞춰 동작하는 것을 알 수 있다.
코드의 관리와 재사용성이 올라간 것을 알 수 있고 새로운 베이스 인코더를 만들려면 인코더나 다른 객체를 건들 필요 없이 새로운 객체를 만들어 주입시키면 된다.
스프링은 이 방식을 채택하고 있다.
'Spring > Spring 공부' 카테고리의 다른 글
6. Spring Boot Annotations (0) | 2022.07.03 |
---|---|
5. ObjectMapper (0) | 2022.07.02 |
4. AOP 코딩 실습-2 (0) | 2022.07.02 |
3. AOP 코드 실습 (0) | 2022.07.01 |
2. IOC 코드 실습 (0) | 2022.07.01 |