인프런을 공부하면서 알게 된 것들 정리
스프링 컨테이너
스프링 컨테이너 생성
ApplicationContext는 스프링 컨테이너로, 자바 설정 파일(AppConfig.class)을 사용하여 빈을 등록하고 관리한다. 자바 코드와 XML 설정을 모두 지원한다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
- AppConfig.class는 자바 설정 클래스이다.
- 스프링 컨테이너는 이 클래스를 읽어 빈을 등록한다.
스프링 빈 등록 및 조회
스프링 컨테이너는 빈 이름과 타입을 기준으로 빈을 등록하고 조회한다.
동일한 타입의 빈이 둘 이상 존재하면 이름을 지정해야 하며 부모 타입으로 조회하면 자식 타입까지 포함된다는 특징이 있다.
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
- 여기서 @Bean 어노테이션을 사용하여 빈을 등록한다.
- 빈 이름은 메서드 이름을 따름! 앞에만 소문자
- ApplicationContext를 통해서 등록된 빈을 조회할 수 있다.
↓
MemberService memberService = applicationContext.getBean("memberService", MemberService.class);
스프링 빈 의존 관계 설정
스프링은 빈을 생성하고 의존 관계를 설정한다.
이 과정에서 자바 코드를 호출하는 것과 유사하지만 스프링이 싱글톤 패턴을 사용해서 빈을 관리하므로 동일한 빈을 공유할 수 있게 된다.
AppConfig 클래스의 memberService() 메서드에서 memberRepository()가 호출되어서 MemberServiceImpl 생성자에 MemoryMemberRepository가 주입된다.
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
빈 조회 예시
스프링에서 빈을 조회하는 방법이 더 있다.
빈 이름으로 조회하거나 타입으로 조회할 수도 있다.
MemberService memberService = applicationContext.getBean("memberService", MemberService.class); // 이름으로 조회
MemberService memberServiceByType = applicationContext.getBean(MemberService.class); // 타입으로 조회
BeanFactory와 Application
BeanFactory는 빈을 관리하는 역할을 하며 ApplicationContext는 그 외에 메시지 소스, 이벤트 발행, 리소스 조회 등 다양한 부가 기능을 제공하나 실무에서는 주로 ApplicationContext를 사용한다.
BeanDefinition
스프링의 다양한 설정 형식 지원의 중심에는 BeanDefinition이라는 추상화가 있다.
역할과 구현을 개념적으로 나눈 것이라고 한다.
BeanDefinition을 빈 설정 메타정보라고 한다. ( @Bean, <bean> )
스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.
BeanDefinition 정보
(나도 잘은 모르겠다. 그냥 이런게 있나보다 하면서 적음)
- BeanClassName: 생성할 빈의 클래스 명(자바 설정 처럼 팩토리 역할의 빈을 사용하면 없음)
- factoryBeanName: 팩토리 역할의 빈을 사용할 경우 이름, 예) appConfig
- factoryMethodName: 빈을 생성할 팩토리 메서드 지정, 예) memberService
- Scope: 싱글톤(기본값)
- lazyInit: 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라, 실제 빈을 사용할 때 까지 최대한 생성을 지연 처리 하는지 여부
- InitMethodName: 빈을 생성하고, 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명
- DestroyMethodName: 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명
- Constructor arguments, Properties: 의존관계 주입에서 사용한다. (자바 설정 처럼 팩토리 역할의 빈을 사용 하면 없음) BeanClassName: 생성할 빈의 클래스명
'Backend > Spring Boot' 카테고리의 다른 글
@Controller와 @RestController 차이 (1) | 2025.02.04 |
---|---|
싱글톤 패턴 (0) | 2024.10.14 |
JUnit5를 활용한 스프링 빈 조회 Test (0) | 2024.10.06 |
코드로 알아보는 생성자 주입(DI) feat. 리팩토링 (3) | 2024.10.05 |
[Spring] 스프링 빈(Bean)이란? (0) | 2024.09.10 |