DI 컨테이너와 5가지 규칙

ttaho·2023년 3월 8일
0

Spring 기초

목록 보기
2/11

인스턴스 생성시 new키워드를 사용했지만, 인스턴스 생성을 프레임워크에 맡길 수 있고, 그 역할을 하는 것이 DI 컨테이너다.
스프링 프레임워크는 임의로 구현한 클래스를 인스턴스로 만들어주는 기능을 제공한다.
즉, DI 컨테이너가 그 기능을 가지고 있다.
5가지 규칙

  • 인터페이스를 이용하여 의존성을 만든다.
  • 인스턴스를 명시적으로 생성하지 않는다.
  • 어노테이션을 클래스에 부여한다.
  • 스프링 프레임워크에서 인스턴스를 생성한다.
  • 인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다.

스프링 프레임워크는 인스턴스 생성 어노테이션(여기선 @Component)이 붙어있는 클래스를 추출하고 추출한 클래스의 인스턴스를 생성합니다.
즉, @Component가 붙어있는 클래스의 인스턴스를 생성한다고 이해하면 될 것 같다.
그 후에 스프링 프레임워크에 의해 생성된 인스턴스를 이용하는 클래스에 참조를 받는 필드를 선언하고 필드에 @Autowired 어노테이션을 부여한다.

구현을 해보자.

Greet 인터페이스 생성

구현 클래스 생성

규칙 3,4 구현

규칙 3의 어노테이션을 클래스에 부여한다
규칙 4의 스프링 프레임워크에서 인스턴스를 생성한다를 적용해보자.

@Component 어노테이션을 사용할 구현클래스에 달아준다. 일단 아침인사 클래스에 달아준다.

규칙 1,2,5 구현

규칙 1,2,5인
인터페이스를 이용하여 의존성을 만든다
인스턴스를 명시적으로 생성하지 않는다
인스턴스를 이용하고 싶은 곳에 어노테이션을 부여한다를 적용해보자.

'사용하는 객체' 클래스인 DemoApplication에
스프링 프레임워크에 의해 생성된 인스턴스를 이용하고 싶은 곳에서 참조를 받는 필드(Greet)를 선언하고 필드에 @Autowired 어노테이션을 부여한다.

'사용되는 객체' 인터페이스인 Greet의 greeting 메서드를 생성한다. 메서드 명은 execute로 한다.

main 메서드에 .getBean(DemoApplication.class).execute();를 추가한다.

전체적인 코드는 아래와 같다.

package com.example.demo;

import com.example.demo.used.Greet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 스프링 부트 시작 클래스
 */
@SpringBootApplication
public class DemoApplication {
    /**
     * main 메서드
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args)
                .getBean(DemoApplication.class).execute();
    }

    /**
     * 주입하는 곳(인터페이스)
     */

    @Autowired
    Greet greet;

    /**
     * 실행 메서드
     */
    private void execute() {
        greet.greeting();
    }
}

DemoApplication을 실행시키면 아침인사문구를 확인 할 수 있다.

MorningGreet에 있는 @Component를 주석처리하고, EveningGreet에 넣어주면 저녁인사문구를 확인 할 수 있을것이다.

전체적인 흐름 설명

스프링 프레임워크는 기동 시 컴포넌트 스캔에 의해 MorningGreet 클래스에 @Component 어노테이션이 부여되어 MorningGreet 인스턴스가 생성된다.

@Autowired 어노테이션에 따라 MorningGreet 클래스의 인스턴스가 클래스의 greet 필드에 주입되어 실행되면 MorningGreet 클래스의 greeting 메서드가 실행된다.

결론

이제 스프링 프레임워크의 컴포넌트 스캔기능을 통해 인스턴스를 명시적으로 생성하지 않아도 되고(new 키워드를 사용하지 않음), 생성된 인스턴스를 사용하고 싶은 필드에 @Autowired를 부여하면 스프링 프레임워크가 인스턴스가 필요한것으로 판단하고 인스턴스를 주입한다.
인터페이스를 이용해서 의존성을 만들고 DI를 사용하여 '사용되는 객체' 클래스(Greet) 를 변경하는 경우 '사용하는 객체' 클래스(DemoApplication)의 수정 없이 변경할 수 있다.

profile
백엔드 꿈나무

0개의 댓글