Spring-Ioc,DI

이호영·2022년 2월 9일
0

Spring

목록 보기
6/18

Ioc(Inversion Of Control)-->제어의 역전
java객채를 개발자가 new로 생성하여 개발자가 관리 하는 것이 아닌 Spring Container에 맡긴다. sington으로 관리됨
즉, 개발자에서 프레임워크로 제어의 객체관리 권한이 넘어갔음

DI(Dependency Injection)
웹으로부터 내가 사용할 객체를 주입받는다.
DI장점
1.의존성으로 부터 격리시켜 코드테스트에 용이
2.DI를 통해서 불가능한 상황을 Mock와 같은 기술을 통해서 안정적으로 테스트 가능
3.코드를 확장하거나 변경 할 대 영향을 최소화 한다(추상화)
4.순환참조를 막을수 있다.

DI 예제코드

package com.company.ioc;

public class Main {
public static void main(String[] args) {
String url="www.naver.conm/books/it?page=10&size=20&name=spring-boot";
Encoder encoder= new Encoder(new Base64Encoder()); 
//위부분만 수정하면 간단하게 테스트 가능
String result=encoder.encode(url);
System.out.println(result);}}
package com.company.ioc;

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

public class UrlEncoder implements IEncoder{
    public String encoder(String message){
        try {
            return URLEncoder.encode(message, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
    @Override
    public String encode(String message) {
        return null;
    }
}
package com.company.ioc;

public class Encoder {
    private IEncoder iEncoder;

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

    public String encode(String message){
        return iEncoder.encode(message);
    }
}
package com.company.ioc;

import java.util.Base64;

public class Base64Encoder implements IEncoder {
    public String encode(String message){
        return Base64.getEncoder().encodeToString(message.getBytes());
    }
}
package com.company.ioc;

public interface IEncoder {
    String encode(String message);
}

Spring에서 관리하는 객체는 bean으로 관리된다.

package com.example.spring_ioc;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Encoder {
    private IEncoder iEncoder;
    public Encoder(@Qualifier("base74Encoder") IEncoder iEncoder){ //실제로 연결될 bean을 지정
        this.iEncoder=iEncoder;
    }
    public void setIEncoder(IEncoder iEncoder){
        this.iEncoder=iEncoder;
    }

    public String encode(String message){
        return iEncoder.encode(message);
    }
}
package com.example.spring_ioc;

import org.springframework.stereotype.Component;

import java.util.Base64;

@Component("base74Encoder") //스프링이 직접관리 즉 IOC
public class Base64Encoder implements IEncoder {
    public String encode(String message){
        return Base64.getEncoder().encodeToString(message.getBytes());
    }
}
package com.example.spring_ioc;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextProvider implements ApplicationContextAware{

    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context=applicationContext;
    }
    public static ApplicationContext getContext(){
        return context;
    }
}
package com.example.spring_ioc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class SpringIocApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringIocApplication.class, args);
        ApplicationContext context = ApplicationContextProvider.getContext();
        Encoder encoder= context.getBean(Encoder.class);
        String url="www.naver.conm/books/it?page=10&size=20&name=spring-boot";

        String result = encoder.encode(url);
        System.out.println(result);
    }
}

DI 코드의 UrlEncoder과 인터페이스 IEncoder은 그대로 가져다 씀
UrlEncoder에 Component만 추가

한개의 클래스에서 여러개의 bean을 등록하는 방법

@Configuration //한개의 클래스에서 여러개의 bean을 등록
class AppConfig {
    @Bean("Base64Encode")
    public Encoder encoder(Base64Encoder base64Encoder) {
        return new Encoder(base64Encoder);
    }

    @Bean("UrlEncode")
    public Encoder encoder(UrlEncoder urlEncoder) {
        return new Encoder(urlEncoder);
    }
}

스프링에서 직접 관리하는 객채 =>bean
bean들이 관리되고 있는 장소 =>spring container
spring container가 권한을 다 가져갔다 =>Ioc

0개의 댓글