스프링 입문
스프링 입문 5.2 IOC, DI (1)
코딩펭귄
2024. 1. 6. 00:35
IOC Inversion of Control
- 스프링에서는 일반적인 자바 객체를 new 로 생성하여 개발자가 관리하는것이아닌, 'Spring Container'에 모두 맡김 (싱글톤의 형태로 관리됨)
- 개발자에서 -> 프레임워크로 제어의 객체관리의 권한이 넘어갔음 : "제어의 역전"
-> 객체를 사용하기위해서는? : 주입을 받는다! (DI)
DI Dependency Injection (장점)
- 의존성으로부터 격리시켜 -> 코드테스트에 용이함
- 외부로부터 내가 사용할 객체에 주입을 받음
- DI 통해 불가능한 상황을 안정적으로 테스트 가능(ex. Mock과 같은 기술)
- 코드를 확장하거나 변경할 때 영향을 최소화(추상화)
- 순환참조를 막을 수 있음
DI 활용 예시
public class Encoder {
private IEncoder iEncoder;
public Encoder(IEncoder iEncoder){ // 이부분을 변경해주면 됨 (di활용예시)
this.iEncoder = iEncoder;
}
public String encode(String message){
return iEncoder.encode(message);
}
}
public interface IEncoder {
String encode(String message); // encode메소드 하나 정의
}
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;
}
}
}
import java.util.Base64;
public class Base64Encoder implements IEncoder{
public String encode(String message){
return Base64.getEncoder().encodeToString(message.getBytes());
}
}
public class Main {
public static void main(String[] args) {
//인코딩 할 url
String url = "www.naver.com/books/it?page=10&size=20&name=spring-boot";
// 인코더를 변경하고싶은 경우 : Encoder은 손대지 않고, new뒤의 넘겨주는 di주입객체만 바꿈 : di=외부에서 주입을 받는다!
Encoder encoder = new Encoder(new Base64Encoder()); //Base64Encoder
// Encoder encoder = new Encoder(new UrlEncoder()); //UrlEncoder
String result = encoder.encode(url);
System.out.println(result);
}
}
** 만약 여기에 base32 인코더를 만들고싶다면 : Encoder 자체는 건들일 필요 없음
-> 1. base32 인코더 파일을 만들어서
2. iEncoder 인터페이스 상속받아서
3. 여기에 주입만 시켜주면 됨!