KoreaIt Academy/Spring Boot

[Spring Boot] 의존성 주입(DI)

hongeeii 2021. 10. 8.
728x90
반응형

[의존성 주입(DI)을 통한 객체 간의 관계 구성]
의존성(Dependency)이란 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미합니다.
예를 들어 A객체가 B객체 없이 동작이 불가능한 상황을 'A가 B에 의존적이다'라고 표현합니다.

주입(Injection)은 말 그대로 외부에서 밀어 넣는 것을 의미합니다.
예를 들어 어떤 객체가 필요한 객체를 외부에서 밀어 넣는 것을 의미합니다.
주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없고

어떤 객체에 의존하든지 자신의 역할은 변하지 않게 됩니다.

**의존
ⓐ →→→→→→→→→→→ ⓑ
a객체에서 b객체를 직접 생성

**의존성 주입
ⓐ ↔↔↔↔ ? ←←←← ⓑ
a는 b가 필요하다는 신호만 보내고, b객체를 주입하는 것은 외부에서 이루어짐

의존성 주입 방식을 사용하기 위해서는 ?라는 존재가 필요하게 됩니다.
스프링 프레임워크에서는 ApplicationContext가 ?라는 존재이며,
필요한 객체들을 생성하고, 생성한 객체들을 주입해주는 역할을 합니다.
따라서 개발자들은 기존의 프로그래밍과 달리 객체와 객체를 분리해서 생성하고,
이러한 객체들을 엮는(wiring)작업의 형태로 개발하게 됩니다.

ApplicationContext가 관리하는 객체들을 '빈(Bean)'이라 부르고, 빈과 빈 사이의
의존 관계를 처리하는 방식으로 XML설정, 어노테이션 설정, JAVA 설정 방식을 이용할 수 있습니다.

 

의존성 주입 방법

1. 생성자 주입
  순환 참조 시 컴파일러가 인지가능, 오류 발생
  메모리에 할당하면서 초기값으로 주입되므로 final키워드 사용가능, 다른 곳에서 변형 불가능(안전)
  의존성 주입이 되지 않으면 객체가 생성되지 않으므로 NullPointerException(NPE) 방어.
@RequiredArgsConstructor //final 또는 @NonNull이 붙은 필드만 초기화 생성자로 선언

 

private final Computer computer;

 

 

2. 필드 주입
  굉장히 편하게 주입할 수 있으나 순환 참조시 오류가 발생하지 않기 때문에 StackOverFlow 발생.
  final을 붙일 수 없기 때문에 다른 곳에서 변형 가능(심각)
 인터페이스는 반드시 필드 주입을 사용해야 합니다.


 @Autowired //Spring에게 주입 요청

private Computer computer;

 

 

3. settet주입 

 순환 참조 시 오류가 발생하지 않기 때문에 StackOverFlow 발생.
 final을 붙일 수 없기 때문에 다른 곳에서 변형 가능(심각)
 외부에서 직접 주입이 가능합니다.


 @Autowired //Spring에게 주입 요청
 public void setComputer(Computer computer) {
      this.computer = computer;
 }

 

 

728x90
반응형

추천 글