SPRING - Ioc & DI

고규빈·2022년 6월 13일
0

DI (의존성 주입)


= > Main 클래스는 PrintA 클래스에 의존적이다.

  • 개발의 생산성을 높이고 유지보수 및 확장성을 키우기 위해서는 코드의 결합력을 낮춰야 한다.

  • 코드의 결합력을 낮추는 방법
    • 함수화
    • 다형성
    • DI (의존성 주입)


IOC

  • IoC란 Inversion of Control의 줄임말이며, 제어의 역전이라고 한다.
  • 스프링 애플리케이션에서는 오브젝트(빈)의 생성과 의존 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당한다.
  • 이를 스프링 컨테이너가 코드 대신 오브젝트에 대한 제어권을 갖고 있다고 해서 IoC라고 부른다.
  • 따라서, 스프링 컨테이너를 IoC 컨테이너라고도 부른다.

IOC & DI 사용

IoC 컨테이너 종류

  • ClassPathXmlApplicationContext
  • FileSystemXmlApplicationContext
  • AnnotationConfigApplicatioinContext
  • XmlWebApplicatioinContext
  • AnnotationConfigXmlApplicationContext

컨테이너 생성

GenericXmlApplicationContext context = new GenericXmlApplicationContext(“config.xml");
Class clazz = (Class)context.getBean(“id”);
// Class clazz = context.getBean(Class.class);

XML을 이용한 DI 방식

1. <bean> 태그 : 생성할 객체 지정
<bean id="객체이름" class="생성할 객체의 패키지.클래스"></bean>

2. <constructor-arg> 태그 : 생성자 방식 설정
<constructor-arg><value>인자값</value></constructor-arg>
<constructor-arg value="인자값" />
<constructor-arg><ref bean="다른 bean 객체 명“/></constructor-arg>

3. <property> 태그 : 프로퍼티 방식 설정(setter 방식)
<property name=“프로퍼티이름”>
<value>프로퍼티값</value>
</property>
<property name="프로퍼티이름" ref="다른 bean 객체 명" />

4. 컬렉션 타입은 <List>, <Map>, <Set> 태그를 사용

자바코드를 이용한 DI 방식

  • @Configuration, @Bean 빈 객체 생성
@Configuration
public class Config

@Bean
public class타입 id값(){    
return new class값;
}
 <bean id="객체이름" class="생성할 객체의 패키지.클래스"></bean>


@Bean
public class타입 id값(){
return new class값(생성자 인자값);
}
 <constructor-arg value="인자값" />


@Bean
public class타입 id값(){
class c = new class; 
c.set프로퍼티이름(인자값);
return c;
}
 <property name="프로퍼티이름" value="인자값" />

XML, 자바코드 같이 사용

  1. XML 파일로 설정
    <context:annotatioin-config/>
    <bean class = “@Configuration 클래스 ”>
  2. 자바클래스로 설정
    @Configurtion
    @ImportResource(“classpath:config.xml”)

DI 자동 주입

@어노테이션을 사용한 의존성 자동 주입

  • 생성자, setter를 통한 주입 방식이 아닌 @어노테이션을 통해 자동주입 가능
  • 전역변수, 함수, 생성자 위에 사용가능
  • @어노테이션을 사용하기 위해 XML에<context:annotation-config/> 설정필요
  1. @Autowired
  • 타입으로 의존성 주입, ( required=false 설정을 통해 빈이 없을 경우 예외 발생을 막음)
  • 변수 명이 클래스 이름과 같은 경우 주입 가능
  1. @Qualifier(“id”)
  • 같은 타입의 Bean이 여러 개 일 때 id값으로 의존성 주입 (@Autowired 와 같이 사용)
  • 같은 타입의 Bean이 여러 개 일 때 id값으로 의존성 주입 (@Autowired 와 같이 사용)
  1. @Resource, @Resource(name=“id”)
  • id값으로 의존성 주입 (id값을 적지않으면 타입으로 의존성 주입)
  • Spring에 의존적이지 않음
  1. @Inject, @Named(“id”)
  • @Autowired, @Qualifier(“id”) 와 동일, required 속성이 없음
  • Spring에 의존적이지 않음
profile
안녕하세요

0개의 댓글