스프링 입문

스프링 입문 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. 여기에 주입만 시켜주면 됨!