JAVA/SPRING
[SPRING] 스프링 IoC컨테이너
gracelove91
2019. 8. 7. 13:47
IoC
- DI라고도하며, 어떤 객체가 사용하는 의존객체를 직접 만들어서 사용하는 것이 아닌, 주입받아서 사용하는 것.
스프링 IoC 컨테이너
- 빈 설정소스로부터 빈 정의를 읽어들이고, 빈을 구성하고 제공한다. (여기서 빈이란 스프링 컨테이너가 관리하는 객체를 말한다.)
스프링 IoC 컨테이너의 빈이되면 얻는 장점.
- 의존성관리가 된다.
- 다양한 스코프를 제공한다( 싱글톤, 프로토타입 ... 등)
- 라이프사이클을 이용할 수 있다. ( @PostConstruct ... 등 )
빈 설정소스의 종류.
XML
<bean id="bookService" class="...">
<property name="bookRepository" ref="bookRepository"/>
<!-- name 속성의 값 bookRepository은 BookService 클래스 내에 있는 setBookRepository를 뜻한다. -->
<!-- ref 속성의 값 bookRepository은 밑에있는 bean을 뜻한다. -->
<!-- 한 마디로 BookService 클래스의 setBookRepository 메소드의 인자값으로 컨테이너가 관리하는 bean을 넣어주겠다는 뜻 (setter주입)-->
</bean>
<bean id="bookRepository" class="..." />
XML + 자바설정
<context:component-scan base-package="..."/>
@Service //@Component, @Controller, @Repository ...
public class BookService{ ... }
자바설정
@Configuration
public class ApplicationConfig{
@Bean
public BookRepository bookRepository(){
return new BookRepository();
}
@Bean
public BookService bookService(){
return new BookService(bookRepository()); //생성자주입.
}
}
이렇게 의존관계를 직접 맺어주기 싫다면, 기본 생성자를 통해 빈을 등록시키고, 해당 클래스 내의 의존객체에 @Autowired 해줘도 된다.
(BookService -> BookRepository이기 떄문에, BookService 클래스 내에 있는 BookRepository 타입의 변수에 @Autowired 붙여준다.)
자바설정2
@Configuration
@ComponentScan(basePackages = "...")
public ApplicationConfig{ ... }
@Service //@Component, @Controller, @Repository ...
public class BookService{ ... }
스프링부트에서의 설정.
@SpringBootApplication //@ComponentScan과 @Configuration 을 확장한 어노테이션이다.
public class DemoApplication { ... }