일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- spring security
- go
- 스프링
- springboot
- H2 설치
- Codeup
- golang
- 기초100제
- java
- Git
- 클린 코드
- 코드업
- Python
- 오블완
- JPA
- 클린코드
- MySQL
- Spring Boot
- mariadb
- 파이썬
- 알고리즘
- 티스토리챌린지
- Spring
- Postman
- Vue.js
- Gradle
- 롬복
- GitHub
- thymeleaf
- 객사오
- Today
- Total
nyximos.log
[Spring] @Configuration, @Bean, 스프링 컨테이너 본문
@Configuration
설정을 구성한다는 뜻
스프링 설정 클래스를 선언한다.
IoC Container에게 해당 클래스를 Bean 구성 Class 임을 알려준다.
@Bean
스프링 컨테이너에 스프링 빈으로 등록
@Configuration을 안 붙여도 빈으로 등록이 가능하지만 싱글톤을 보장받지 못한다.
스프링 컨테이너
ApplicationContext를 스프링 컨테이너라 한다.
XML이나 애노테이션 기반의 자바 설정 클래스로도 만들 수 있다.
객체 생성과 DI를 스프링 컨테이너를 통해 한다.
@Configuration이 붙은 애를 설정(구성)정보로 사용한다.
@Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다. → 스프링 빈
이전에는 개발자가 필요한 객체를 직접 조회했지만,
이제부터는 스프링 컨테이너를 통해서 applicationContext.getBean() 메서드를 사용하여 필요한 스프링 빈(객체)을 찾을 수 있다.
🧙♂️ 스프링 컨테이너 생성
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
ApplicationContext는 인터페이스이다.
자바 설정 클래스를 기반으로 스프링 컨테이너를 만들었다.
스프링 컨테이너 생성과정
1. 스프링 컨테이너 생성
: 생성할 때 구성정보를 지정해줘야 됨
2. 스프링 빈 등록
: 파라미터로 넘어온 설정 클래스 정보(스프링 컨테이너 생성시 지정한 구성 정보)를 사용해 @Bean 붙은 애들을 스프링 빈을 등록한다.
빈 이름은 보통 메서드 이름을 사용하지만 직접 부여할 수도 있다. 그러나 빈 이름이 같으면 오류가 발생하니 주의하자
3. 스프링 빈 의존관계 설정
스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입한다.
BeanFactory와 ApplicationContext
둘다 스프링 컨테이너
[그림 첨부]
BeanFactory
스프링 컨테이너의 최상위 인터페이스
스프링 빈을 관리하고 조회
getBean() 제공
ApplicationContext
BeanFactory를 상속받아 스프링 빈을 관리하는 기능도 제공하며
MessageSource : 메시지소스를 활용한 국제화 기능
EnvironmentCapable : 환경변수
ApplicationEventPublisher : 애플리케이션 이벤트
ResourceLoader : 편리한 리소스 조회
등 부가기능도 제공해서 BeanFactory보다 많이 사용한다.
스프링 컨테이너는 다양한 형식의 설정 정보를 받아들일 수 있도록 유연하게 설계되어있는데
BeanDefinition이라는 빈 설정 메타 정보 때문이다.
1. 어쩌구ApplicationContext 는어쩌구BeanDefinitionReader를 사용해 설정정보를 읽고
2. 빈 설정 메타정보인 BeanDefinition을 생성한다.
(어쩌구에 Annotated, Xml 등등이 들어가게 된다.)
그 후에 스프링 빈은 BeanDefinition만 알면 메타 정보를 기반으로 스프링 빈을 생성해준다.
BeanDefinition에는 어떤 정보들이 있을까?
- BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
- factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름
- factoryMethodName: 빈을 생성할 팩토리 메서드 지정
- Scope: 싱글톤(기본값)
- lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연처리 하는지 여부
- InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
- DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
- Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
참조
@Configuration - https://galid1.tistory.com/494
김영한, 스프링 핵심 원리 - 기본편 https://inf.run/ryWP
'Programming > Spring' 카테고리의 다른 글
[Spring] 싱글톤 컨테이너란? (1) | 2022.01.13 |
---|---|
[Spring] 컴포넌트 스캔과 @Autowired (2) | 2022.01.12 |
[Spring] IoC, DI, 컨테이너에 대해 알아보자 (0) | 2022.01.11 |
[Spring] 좋은 객체 지향 설계의 5가지 원칙 SOLID (0) | 2022.01.09 |
[Spring] 좋은 객체 지향 프로그래밍이란? (0) | 2022.01.09 |