티스토리 뷰
참조:https://leveloper.tistory.com/33
IoC(Inversion Of Control)
IoC란 객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성하게 하여 가독성 및 코드의 중복,유지보수를 편하게 할 수 있게 한다.
의존성 주입(Dependency Injection)
DI란 의존성을 주입한다는 말그대로 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주빙을 시켜주는 방식이다.
일반적으로 의존성에 대한 제어권은 객체 자기 자신이 갖는다.간단히 말하자면 new 키워드로 객체를 생성한다.
class Sample{
private Apple apple = new Apple();
}
아래는 SampleTest라는 클래스에서 Apple 객체를 생성한 뒤 Sample 클래스의 생성자로 주입시켜 준다.
여기서는 Sample이 직접 Apple을 생성하는 것이 아니라 생성자로 주입받는다.
class Sample{
private Apple apple;
public Sample(Apple apple){
this.apple = apple; }
}
class SampleTest{
Apple apple = new Apple();
Sample sample = new Sample(apple);
}
이처럼 첫번째 예시에서는 Apple 객체의 제어권이 Sample에게 있었다면,두 번째 예시에서는 Sample에게 있는 것이 아니라 SampleTest에게 있다.이처럼 의존성을 역전시켜 제어권을 직접 갖지 않는 것을 IoC라고 하며,의존성을 외부에서 주입시켜 주는 것을 DI라고 한다.
의미
스프링에서는 Spring 컨테이너,IoC 컨테이너라는 개념을 사용한다.컨테이너는 보통 인스턴스 생명주기를 관리하며
생성된 인스턴스들에게 추가적인 기능을 제공하도록 하는 것이라 할 수 있다.
다시 말해,컨테이너란 개발자가 작성한 코드의 처리과정을 위임받은 독립적인 존재라고 생각하면 된다.
컨테이너는 적절한 설정만 되어 있다면 누구의 도움 없이도 개발자가 작성한 코드를 스스로 참조한 뒤 알아서 객체의 생성과 소멸을 컨트롤 한다.
스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며,종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다.이때 스프링 컨테이너에서 생성되는 객체를 Bean이라고 부른다.
Bean
bean은 Spring Bean Container에 존재하는 객체를 말한다.Bean Container는 의존성 주입을 통해 Bean 객체를 사용할 수 있도록 한다.Bean은 보통 싱글톤으로 존재한다.Beans는 우리가 컨테이너에 공급하는 설정 메타 데이터(XML 파일)에 의해 생성된다.
스프링 컨테이너에서 Bean 생성
Component scan
스프링부트로 애플리케이션을 만들게 되면 가장 상위 클래스에 @SpringBootApplication이 있을 것이다.
@SpringBootApplication public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication을 들여다보면
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* @return the classes to exclude
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
@ComponentScan은 @Component 어노테이션이나 streotype(@Service,@Controller,@Repository 등) 어노테이션이 부여된 클래스를 찾아 자동으로 Bean으로 등록해주는 역할을 한다.
여기서 @ComponentScan을 해주는 범위가 해당 어노테이션이 붙은 위치보다 하위의 클래스들만 스캔해주기 때문에
@SpringBootApplication의 위치가 가장 상위 위치에 있어야 한다.
@Service,@Controller,@Repository 등의 어노테이션들도 들여다보면 @Component가 있는 것을 확인할 수 있다.
추가적으로 Bean으로 등록하고 싶은 클래스가 있다면 @Component 어노테이션을 붙여줘도 상관없다.
@configuration에서 @Bean으로 등록
@Configuration 어노테이션을 사용해서 직접 @Bean을 등록해주는 방법이다.
@Bean 어노테이션을 사용하면 자동으로 빈으로 등록된다.
@Configuration public class HttpConfig {
@Bean public RestTemplate createRestTemplate(){
return new RestTemplate();
}
}
마무리
기존 자바 코드를 작성시에 인스턴스를 생성한다면 항상 new를 붙이고 새로 생성해줬다.
하지만 스프링에서는 스프링 컨테이너가 싱글턴 패턴을 사용해 Bean으로 객체를 관리한다.
Service나 Controller 같은 한번만 호출해도 되는 객체들은 Bean으로 등록하여 관리한다면 결합도가 낮아져 유지보수에
용이할 것이다.
'SpringBoot' 카테고리의 다른 글
| JPA (0) | 2021.08.18 |
|---|---|
| AOP (0) | 2021.08.12 |
| DI (0) | 2021.08.12 |
| REST API (0) | 2021.08.11 |
| [Design Pattern]Strategy Pattern(수정예정) (0) | 2021.08.11 |
