스프링 핵심 원리 - 기본편1
아래 글은 김영한님의 인프런 강의를 참고해서 만들었습니다.
1. 생성자 주입
- 생성자를 통해 외부객체를 주입(연결)하는 방법. -> 책임을 나눠 갖는다.
- 객체를 생성하고 연결하는 역할과 실행하는 역할이 명확히 분리시킬수 있다(DIP가 성립)
2. 의존관계 주입 (DI : Dependency Injection)
- 애플리케이션 실행 시점에 외부에서 생성된 실제 구현 객체를, 클라이언트와 서버의 실제 의존관계가 연결 되는 것을 의미
- 하나의 객체가 다른 객체의 의존성을 제공
- 정적인 클래스 의존관계의 변경 없이, 동적인 객체 인스턴스 의존관계를 변경 가능
2.1 정적인 의존관계
- 애플리케이션을 실행하지 않아도 의존관계를 쉽게 판단 가능
- ex) 클래스 다이어그램
2.2 동적인 의존관계
- 애플리케이션 실행 시점에 실제 생성된 객체 인스턴스의 참조가 연결된 의존 관계
- ex) 객체 다이어그램
3. 제어의 역전 (IoC : Inversion of Control)
- 원래는 구현 객체가 프로그램의 제어 흐름을 조종 -> 개발자 입장에서는 자연스러운 흐름(but OCP, DIP 위반)
- 프로그램의 제어 흐름을 외부에서 관리하는 것(IoC)
4. IoC컨테이너 DI컨테이너
- 의존관계를 역전 시켜주는 컨테이너를 IoC 컨테이너, DI 컨테이너라고 한다.
4.1 컨테이너
- 사전적으로 그릇과 같은 무언가를 담는 용기를 말하는데, 스프링에서는 객체관리를 주로 수행하는 도구라고 생각하면 된다.
5. 스프링 컨테이너
- 스프링 빈을 생성하고 관리하는 컨테이너(
@Configuration
을 설정 정보로 사용) ApplicationContext
를 스프링 컨테이너이자 인터페이스이다.- ※
BeanFactory
도 스프링 컨테이너이지만 직접 사용하지 않는다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
로 스프링 컨테이너 생성- 단,
AppConfig.class
는 설정 정보를 가지고 있는 클래스로 이것을 참고하여 의존관계 주입(DI)를 한다. Appconfig.class
에서는 설정을 구성한다는 뜻의@Configuration
어노테이션을 붙여주고, 각 메서드에@Bean
을 붙여주어야 스프링 빈으로 등록된다.
- 단,
5.0 BeanFactory
vs ApplicationContext
BeanFactory
- 스프링 컨테이너의 최고 인터페이스이고, 스프링 빈을 관리하고 조회하는 역할을 한다.
getBean()
메서드를 제공
ApplicationContext
BeanFactory
의 기능을 모두 상속받아서 제공하고 더 많은 기능들을 가지고 있다.
5.1 스프링 빈
@Bean
이 붙은 메서드, 메서드 명을 스프링 빈의 이름으로 사용(@Bean(name = "이름")
으로 설정할 수 도 있다.)- ※ 빈 이름은 항상 다른 이름으로 부여해야 오류가 발생하지 않는다.
applicationContext.getBean("이름", 반환타입.class);
으로 스프링 빈을 찾을 수 있음
5.2 스프링 컨테이너의 생성 과정
- 스프링 컨테이너 생성
- 스프링 빈 등록
- 스프링 빈 의존관계 설정 - 준비
- 스프링 빈 의존관계 설정 - 완료
5.3 컨테이너에 등록된 빈 조회
- 모든 빈 조회
ac.getBeanDefinitionNames()
: 스프링에 등록된 모든 빈 이름들을 조회ac.getBean()
: 빈 이름으로 빈 객체(인스턴스)를 조회ac.getBean(빈이름, 타입)
,ac.getBean(타입)
으로 사용. 조회하는 빈이 없으면 예외(NoSuchBeanDefinitionException
)발생ac.getBean(타입)
으로 조회할 때 같은 타입의 스프링 빈이 2개 이상이면 예외(NoUniqueBeanDefinitionException
)가 발생 → 빈 이름을 지정ac.getBeansOfType(타입)
: 특정 타입 모두 찾기
- 애플리케이션 빈 출력하기
beanDefinition.getRole()
을 사용하여 구별BeanDefinition.ROLE_APPLICATION
: 일반적으로 사용자가 정의한 빈BeanDefinition.ROLE_INFRASTRUCTURE
: 스프링이 내부에서 사용하는 빈
- 상속관계
- 부모 타입으로 조회하면, 자식 타입도 함께 조회된다.
- 즉,
Object
타입으로 조회하면, 모든 스프링 빈으로 조회할 수 있다.
- 즉,
'FRAMEWORK > [SPRING]' 카테고리의 다른 글
[Spring] HttpMessageConverter (0) | 2022.06.06 |
---|---|
[Spring] Spring MVC 구조 (0) | 2022.06.05 |
[Spring] CGI vs Servlet (0) | 2022.06.03 |
[Spring] Web Server vs WAS (0) | 2022.06.02 |
스프링 핵심 원리 - 기본편2 (0) | 2021.08.23 |