본문 바로가기

Spring/Spring 공부

1. IoC, DI/ DI 관련 코드 실습

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