코딩 기록들

스프링 입문 5.2 IOC, DI (1) 본문

스프링 입문

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

'스프링 입문' 카테고리의 다른 글

[스프링 입문] 6.1 Spring Boot Validation  (1) 2024.01.08
스프링 입문 5.3 AOP  (1) 2024.01.08
스프링 입문 5.1 스프링의 핵심  (1) 2024.01.05
스프링 입문 4.4 DELETE API  (0) 2024.01.05
스프링 입문 4.3 PUT API  (1) 2024.01.05