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 { ... }