스프링의 기본적인 원리에 대해서 공부한지 오래된 것 같아서 다시 복습하기로 했다. 토비의 스프링 3.1을 읽고 공부했는데 만약 이 책을 처음 봤다면 조금 어려웠을 것 같다는 느낌이 있다. 물론 책의 내용은 좋지만 아무래도 혼자서 책을 읽고 실습하는 과정이 없다면 이해하기 쉽지 않았을 것 같다. 나는 영한님의 스프링 핵심원리 강의를 이미 수강을 해서 기초적인 부분에 대해서는 알고 있기 때문에 공부하기 수월했다.
IoC (Inversion of Control)
IoC란 제어의 역전이라는 의미인 Inversion of Control의 약자이다. 만약 우리가 순수한 자바 코드로 로직을 만들고 이를 개발자가 원하는 흐름으로 실행했다면 이는 제어의 흐름이 개발자에게 있다고 말할 수 있다. 그런데 프레임워크를 이용해서 개발자가 작성한 코드를 실행하면 어떻게 될까? 이전에는 main() 메서드의 흐름에 따라 개발자의 코드가 능동적으로 실행되었다면 이제는 프레임워크의 흐름에 따라 개발자의 코드는 수동적으로 작동한다. 프레임워크에서 필요할 때 사용할 수 있고 이를 관리할 수 있는 것이다.
주로 라이브러리와 프레임워크의 차이가 이를 의미하곤 한다. 라이브러리는 단순히 외부의 클래스와 같은 코드들의 모음이기 때문에 일련의 흐름을 개발자가 만들어야 한다. 하지만 프레임워크는 이러한 흐름을 프레임워크에 맡기고 개발자의 코드를 프레임워크의 판단에 따라 사용할지 말지를 정하기 때문에 마치 프레임워크가 제어하는 것 같다고 해서 제어의 역전이라고 하는 것이다.
빈 (Bean)
스프링에 의해서 IoC 방식으로 관리되는 오브젝트를 의미한다.
스프링에서 관리하는 모든 오브젝트가 빈인 것은 아니고, 스프링이 생성, 주입, 관리, 제어 등을 담당하는 오브젝트가 이에 해당한다.
빈 팩토리 (Bean Factory)
스프링의 IoC를 담당하는 컨테이너이다. 빈에 대한 기초적인 등록, 수정, 조회의 역할을 한다.
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String name, boolean allowFactoryBeanInit) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
}
위 인터페이스는 org.springframework.beans.factory의 BeanFactory이다. 스프링에서는 이 자체를 구현해서 사용하지는 않고 어플리케이션 컨텍스트에서 빈팩토리를 상속받아 사용한다.
빈을 생성, 주입 등의 관리를 맡고 있기 때문에 빈 팩토리는 IoC 컨테이너라고 불리기도 한다.
어플리케이션 컨텍스트 (Application Context)


위에서 언급했듯이 BeanFactory를 상속받아 이를 구현한다. 빈과 관련된 기본적인 기능은 물론 여기에 부가적으로 스프링이 제공하는 여러 기능도 추가적으로 제공한다.
빈 팩토리는 보통 빈의 생성과 관리의 차원에서 말하는 것이고,
어플리케이션 컨텍스트는 이에 부가적으로 스프링에서 제공하는 기능들을 포함한 것을 의미한다.


AnnotationConfigApplicationContext으로 인스턴스를 생성하여 getBean()과 같은 메서드를 사용할 수 있다.
'공부 > Spring' 카테고리의 다른 글
| [Spring Web] Spring MVC 컨트롤러 요청/응답 가능한 여러가지 방법 (0) | 2024.03.21 |
|---|---|
| [Spring Web] http body 내용 가져오기 (MapStruct 안 되는 이유) (0) | 2024.03.16 |
| [Spring Web] 컨트롤러에서 String만 리턴해도 되는 이유 (0) | 2024.03.13 |
| [Spring] 트랜잭션(Transaction) 과정 (0) | 2024.01.18 |
| [Spring] DataSource를 이용한 DB 연결 테스트 (0) | 2024.01.01 |