JAVA를 통해 코드를 짤때 객체를 구현하는 클래스를 EX)AppConfig 따로 분리해서 코드를 짜야한다.
이렇게 하지않으면 DIP(의존관계 역전 원칙)원칙 즉 하나의 클래스가 추상클래스와 구체클래스에 동시에 의존할수 있기때문이다.
또한 AppConfig처럼 객체를 구현하는 클래스를 따로 분리하는순간 OCP원칙(소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.)에 의하여 우리가 소프트웨어 요소를 새롭게 확장해도 사용영역의 변경은 닫혀있으면서 AppConfig (구성영역)의 코드만 수정하면 되기때문에 OCP원칙도 지킬수 있게된다.
마지막으로 AppConfig를 통해 객체를 생성하고 연결하는 역활을 담당하게하고, 클라이언트 객체는 실행에 대한 책임만을 지게 함으로서 SRP(단일 책임 원칙)을 지킬수있다.
위 이유들 때문에 AppConfig처럼 구현객체를 생성하며 연결하는 클래스를 따로 구현한다. AppConfig처럼 객체를 생성하고 관리하면서 의존관계를 연결해 주는 것을 IoC컨테이너 또는 DI컨테이너라 한다.
기존에는 AppConfig를 사용해 직접 객체를 생성 및 의존관계를 주입했지만, 스프링 컨테이너를 사용해 위과정을 할수있다.
Spring Container에서는 @Configuration
이 붙은 AppConfig를 설정(구성)정보로 사용한다. 이때 @Bean
이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. 이렇게 스프링 컨테이너에 등록된 객체를 스프링 빈이라 한다.
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
ApplicationContext
을 통해 AppConfig안에 있는 환경설정 정보를 가지고 스프링 컨테이너를 만들어준다. applicationContext.getBean("memberService", MemberService.class);
을 통해 bean을 가져온다.