Spring/Spring_CoreTechnologies

IOC 컨테이너_빈(BEAN)_의존성 주입(DI) 개념정리 (Spring)

whyWhale 2020. 11. 13.

참고. docs.spring.io/spring-framework/docs/5.1.x/spring-framework-reference/core.html

 

Core Technologies

In the preceding scenario, using @Autowired works well and provides the desired modularity, but determining exactly where the autowired bean definitions are declared is still somewhat ambiguous. For example, as a developer looking at ServiceConfig, how do

docs.spring.io

 

 

 

# 팩토리 메소드 : 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한 결정은 서브클래스가 내리도록 합니다. (따로 찾아보기를 권장.)

 

 

IOC 컨테이너(Inversion of Control container)

 

프로그래밍을 배우신 분들이라면, main 함수에서 프로그램의 진행 흐름을 사용자 마음대로 컨트롤 할 수 있다는 것을 알것입니다. 

ex)   java)  System.our.println("hi ");

               System.our.println(10+30); 

               System.our.println(10>30); 

                            .

                            .

                            .

                            .

이런 식으로 먼저 hi를 출력하고 10+30 을 하고  10>30 을 출력하는 등 사용자 마음대로 실행 순서를 제어를 하고 할 수 있다는 이야기 입니다.

 

 

처음 스프링 부트를 이용하여 생성하고 바로 src/main 에 있는 함수를 실행하여 잘 작동이되는지 확인 할 것이다.

이것을 바로 실행해 실행여부를 체크해 보실텐데요. 이 함수가 대체 무엇이길래 객체 컨트롤러를 찻아서 연결해주고 객체 생성 해주고 실행시켜주고 등등 이런것을 다 알아서 해주는 것이 컨테이너라고 합니다.

 

유저의 요청 (Requset)가 들어왔을 때, 사용자들의 작성한 코드 실행 , 연결 등등 으로 인하여 만들어지는 응답(Response)를 대신 해 주는 것입니다.

 

만약 이런 컨테이너가 없다면 일일히 연결을 해주고, 요청에 대응하는 응답에도 있는지 체크하고, 만약 다수의 요청이 들어오면 스레드를 여러 개로 만들거나. 비동기 처리 방식으로 진행 하거나 등등 엄청나게 복잡한 일 처리를 하나하나 다 해줘야 하는 상황이 올겁니다!

 

하지만 run이라는 메소드 하나로 모든것을 한방에 끝내는 것이 컨테이너 입니다.!!

 

즉 위에서 언급한 여러가지 일들을 처리할 수 있는 제어 권한을 컨테이너에게 맡기고 저희는 비즈니스 로직이나 매핑 부분에서 더욱이 집중할 수 있도록 해주는 아주 고마운 도구입니다.

 

하지만 따로 회사 입 맛대로 형성 또한 가능한데요!.

개발자가 Configuration을 작성하고 객체의 비즈니스 로직(POJO)을 채우는 작업을 해주면 됩니다. 그리고 어떤 객체가 어느 시점 생성, 사용 할 지는 컨테이너에게 맡깁니다.

 

 

Bean

 

-IOC 컨테이너는 객체의 생명 주기를 관리하지만 Bean은 컨테이너가 관리하는 객체들을 Bean이라고 합니다.

-기본적 값은 싱글턴이라고 불리웁니다.(싱글톤_요청 당 객체 생성 <-> 프로토타입 _매번 새로운 객체 생성.)

 

 

기본적인 어노테이션

@Controller          표현 계층의 Controller 임을 말합니다.

@Service              비즈니스 계층의 말 그대로 서비스 입니다.

@Repository         Persistence 계층의 DAO (DB 이용하여 data 접근.)

@Component        기타 자동 등록하고 싶은 것입니다.

@Bean                 직접 내가 작성한 것이 아닌 외부 라이브러리 객체를 빈으로 사용하고자 할때 사용합니다.

 

 

DI(Dependency Injection) <의존성 주입>

 

-컨테이너가 객체 생성 및 소명 등에 대한 제어를 컨테이너에서 관리하고 , 필요할 때마다 컨테이너가 직접 DI를 해줍니다.

즉 복잡한 과정을 의존성을 주입함으로써 관계를 이어주고 의존함을 명시함으로 SpringFramework가 동작하게 되는 것입니다.

 

ex )  A ,B 각각의 객체가 있다고 가정합시다. A 객체에서 B객체를 어떻게 넘겨줄 것인가?  A <- B

 

여기에 대한 방법은 2가지가 있습니다.

 

Constructor-based DI

Setter

라는 것이 있습니다. ()

 

 

Constructor-based DI

  • 생성자를 통한 방식.
  • 컨테이너가 알아서 생성자에 B를 넣어주면 생성하는 방식
  • 의존 관계 파악에 용이 하며 유닛테스트가 쉽다.
  • Final 사용.

 

 

Setter

  • 컨테이너가 setter method를 불러주면서 주입하는 방식.
  •  

 

 

-두 가지 중 더좋은 것을 꼽자면 문서에 내용을 참조하고 개인 블로그를 참조한 결과 Constructor-based DI 라고 생각.

 

생성자 변조되는 것을 final 로 선언으로 함으로써 방지 하며 의존관계가 성립이 되지 않으면 객체 생성을 할 수 없고 테스트 코드 작성이 쉽다는 이유 때문입니다.

 

XML에 보시면  <bean id="~~~~"  ref="~~~~" >  이렇게 기술되어 있는것 을 볼 수 있습니다.

이것을 바로 Container Configuration 라고 합니다!

 

 

자주 보이는 @Autowired 애노테이션은 어떤 빈을 주입할지 명확하니 컨테이너가 알아서 해결해 다라는 의미입니다.

어디서든 사용이 가능하며 요즘에는 자동으로 @Autowired 가 붙습니다.

어떤 빈을 주입할지 명확치 않으면 사용할 수 없습니다!.

 

 

 

 

 

댓글