DI, IOC 컨테이너

박근수·2024년 2월 24일
0

Spring

목록 보기
2/11

DI (Dependency Injection) - 의존성 주입

  • 스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입기능
  • 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입 시켜주는 방식

    DI를 통해서 모듈 간의 결합도가 낮아지고, 유연성이 높아진다.

DI 설정의 역사

XML을 통한 빈 등록

  • 토비의 스프링, 스프링 3/4 시절까지 많이 사용
  • 설정이 외부로 명확히 분리된 것을 알 수 있음
  • 자동완성이나 컴파일 등으로 오타를 잡기 어렵고 타이핑 양이 많아짐
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans ">
    <bean id = "conveniencePayService" class="com.zerobase.convpay.service.ConveniencePayService">
        <constructor-arg name="paymentInterfaceSet">
            <set>
                <ref bean="moneyAdapter"/>
                <ref bean="cardAdapter"/>
            </set>
        </constructor-arg>
        <constructor-arg name="discountInterface" ref="discountByConvenience"/>
    </bean>
    <bean id="cardAdapter" class="com.zerobase.convpay.service.CardAdapter"/>
    <bean id="moneyAdapter" class="com.zerobase.convpay.service.MoneyAdapter"/>
    <bean id="discountByConvenience" class="com.zerobase.convpay.service.DiscountByConvenience" />
    <bean id="discountByPayMethod" class="com.zerobase.convpay.service.DiscountByPayMethod" />
</beans>

XML ComponenScan을 통한 빈 등록

  • 기본 빈 등록 방식은 클래스가 많을 경우 너무 번거로움
  • @Controller, @RestController, @Service, @Component, @Repository 등의 지정된 어노테이션이 붙은 클래스를 모두 빈으로 등록
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans">
    <context:component-scan base-package="com.zerobase.convpay"/>
</beans>

JavaConfig를 통한 빈 등록

  • 스프링4 때부터 XML이 아닌 JavaConfig가 많이 활용되기 시작함
  • XML 설정파일이 자바 코드화 된 것
  • 자동완성, 컴파일 시 정적 분석으로 오류를 잡아줌
@Configuration
public class ApplicationConfig {

    @Bean
    public ConveniencePayService conveniencePayService(){
        return new ConveniencePayService(
                new HashSet<>(Arrays.asList(moneyAdapter(), cardAdapter())),
                discountByConvenience()
        );
    }
    @Bean
    public CardAdapter cardAdapter() {
        return new CardAdapter();
    }
    @Bean
    public MoneyAdapter moneyAdapter() {
        return new MoneyAdapter();
    }
    @Bean
    public DiscountByConvenience discountByConvenience() {
        return new DiscountByConvenience();
    }
}

JavaConfig ComponenceScan을 통한 빈 등록

  • XML의 설정 방법
  • JavaConfig에서의 설정 방법
@Configuration
@ComponentScan(basePackages = "com.zerobase.convpay")
public class ApplicationConfig {

}

빈 관련 설정 방법

1. 빈의 구현체가 여러개인 경우 주입 받는 방법

  1. @Primary : 해당 빈을 최우선으로 주입
  2. @Qualifier("beanName") : beanName으로 지정된 빈을 주입
  3. Set 또는 List로 모두 받기
  4. 프로퍼티 이름을 빈과 동일하게 하기(가장 흔하게 사용)

2. 빈의 스코프(Scope)

  • 싱글톤 : 일반적 방법, 하나만 만들어서 계속 재활용
  • Prototype : 매 번 새로 만드는 방법(데이터를 클렌징 해야할 때)
    • Request : 요청에 따라 계속 새로 만듦
    • Session : 세션 마다 계속 새로 만듦
    • WebSocket

3. 스프링의 환경 설정 : 프로파일(Profile)

  • 현업에서는 환경을 다양하게 하여 해당 환경에만 동작하는 Bean을 만드는 경우가 있음
  • 클래스 단위에 작용하거나 메서드 단위에 적용 가능
    • 클래스 단위
      • @Configuration @Profile("test")
      • @Component @Profile("test")
    • 메서드 단위
      • @Bean @Profile("test")
  • -Dspring.profiles.active=sandbox, beta, production
  • 프로파일 표현식
    • @Profile("!production")
    • !not, &and, |or

IOC (Inversion Of Control) - 제어의 역전

  • 사용자가 직접 클래스를 생성 (new Class()) 하지 않고 프레임워크(스프링)가 제어 하도록 함
  • 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유현한 코드를 작성할 수 있게 하여 가독성 및 코드 중복, 유지 보수를 편하게 할 수 있음
profile
개발블로그

0개의 댓글