본문 바로가기
Spring Boot

Spring Boot - DI (Dependency Injection)

by sinabeuro 2021. 9. 2.
728x90

DI (Dependency Injection)

외부에서 객체 주입하면, 스프링이 객체의 생명 주기를 관리합니다.

개발자는 DI(주입)을 통해서 객체를 사용할 수 있습니다.

주입하는 주체는 스프링 컨테이너입니다.

 

 

DI의 장점

의존성으로부터 격리시켜 코드 테스트에 용이합니다.

DI를 통하여, 불가능한 상황을 Mock와 같은 기술을 통하여, 안정적으로 테스트가 가능합니다.

코드를 확장하거나 변경할 때 영향을 최소화한다. (추상화)

순환참조를 막을 수 있다.

// IEncoder.java 
// 인터페이스
public interface IEncoder {
    String encode(String message);
}

 

// Encoder.java
// 사용할 객체
public class Encoder {

    private IEncoder iEncoder;

	// 객체를 파라미터로 받습니다.
    public Encoder(IEncoder iEncoder) {
        this.iEncoder = iEncoder;
    }

    public String encode(String message) {
        return iEncoder.encode(message);
    }
}

직접적으로 사용할 클래스를 선언하고 IEncoder 인터페이스를 파라미터로 받습니다.

Encoder 클래스는 외부에서 주입을 받며 의존을 받는 객체를 주입받는 것이 DI입니다.

이렇게 주입해서 사용하는 것이 스프링의 기본 컨셉입니다.

주입받은 객체에 따라서 개발자가 원하는대로 동작하게 하는 것이죠.

 

// Base64Encoder.java
import java.util.Base64;

public class Base64Encoder implements IEncoder {

    @Override
    public String encode(String message) {
        return Base64.getEncoder().encodeToString(message.getBytes());
    }
}

IEncoder 인터페이스를 상속하여 Base64Encoder 클래스를 선언합니다.

 

// UrlEncoder.java
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class UrlEncoder implements IEncoder {

    @Override
    public String encode(String message) {
        try {
            return URLEncoder.encode(message, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}

IEncoder 인터페이스를 상속하여 UrlEncoder 클래스를 선언합니다.

 

// Main.java
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.encode(url);
        System.out.println(result);

        Encoder encoder2 = new Encoder(new UrlEncoder());
        String result2 = encoder2.encode(url);
        System.out.println(result2);
        
	}
}

Encoder 클래스에 Base64Encoder, UrlEncoder 객체를 주입하여 해당 객체에 맞는 결과값을 출력할 수 있게 됩니다.

이러한 과정이 DI이를 구현한 것입니다.

 

 

 

728x90

'Spring Boot' 카테고리의 다른 글

Spring Boot - Exception 개괄  (0) 2021.09.10
Spring Boot - Validation  (0) 2021.09.09
Spring Boot - Annotation 참고자료  (0) 2021.09.07
Spring Boot - AOP (Aspect Oriented Programming)  (0) 2021.09.03
Spring Boot - IoC (Inversion of Control)  (0) 2021.09.03

댓글