[Spring] loC(Inversion of Control), DI(Dependency Injection)

고지훈·2021년 8월 21일
1

Spring

목록 보기
1/26
post-thumbnail
post-custom-banner

IoC(Inversion of Control)

  • 스프링에서는 일반적인 Java객체를 new로 생성하여 개발자가 관리하는 것이 아닌, Spring Container에 모두 맡긴다.
  • 개발자 -> 프레임워크로 제어의 객체 관리 권한이 넘어갔기 때문에 이를, "제어의 역전"이라고 한다.

DI(Dependency Injection)

  • DI의 장점
    1. 의존성으로부터 격리시켜 코드테스트에 용이하다.
    2. DI를 통하여, 불가능한 상황을 Mock 기술을 통해 안정적으로 테스트할 수 있다.
    3. 코드를 확장하거나 변경할 때 영향을 최소화 한다.(추상화)
    4. 순환참조를 막을 수 있다.

DI 예제(소스코드)

  • URL을 두 가지 방식으로 Encode할 때, DI를 적용시켜보는 예제이다.
//Main
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);
    }
}
//IEncoder(Interface)
// => Base64Encoder와 URLEncoder는 encode라는 동일한 메서드를 사용하여 Encoding을 수행한다. 
public interface IEncoder {
    String encode(String message);
}
//Base64Encoder
// => IEncoder를 상속받아 encode메소드를 구현한다. 입력받은 message를 Base64로 변환한다.
import java.util.Base64;

public class Base64Encoder implements IEncoder{

    public String encode(String message){
        return Base64.getEncoder().encodeToString(message.getBytes());
    }
}
//UrlEncoder
// => IEncoder를 상속받아 encode메소드를 구현한다. 입력받은 message를 URLEncoder로 변환한다.
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;
        }
    }
}
//Encoder
// => 추상화하기 위해 IEncoder를 Encoder클래스 내부에 선언하고, 생성자를 통해 Base64 또는 URL으로 인코딩 타입을 받는다.
// => encode메소드를 통해 타입별 Encoding결과를 화면에 리턴한다.
public class Encoder {
    private IEncoder iEncoder;

    public Encoder(IEncoder iEncoder){
        this.iEncoder = iEncoder;
    }

    public String encode(String message){
        return iEncoder.encode(message);
    }
}
profile
"계획에 따르기보다 변화에 대응하기를"
post-custom-banner

0개의 댓글