[인프런] 스프링 핵심원리 기본편-스프링 컨테이너와 빈

경운·2025년 7월 28일
0

스프링 핵심원리

목록 보기
4/7
post-thumbnail

※ 본 게시글은 인프런 스프링 핵심 원리 - 기본편 강의를 바탕으로 작성하였습니다.
강의 내용을 참고하여 개인적으로 정리한 글입니다.


🐣 스프링 컨테이너 생성

스프링 컨테이너가 무엇인가?

  • ApplicationContext를 스프링 컨테이너라 부른다
  • 스프링 빈의 생성, 관리, 의존 주입의 역할
AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class); //컨테이너 생성

🐣 스프링 빈 등록

  • @Bean이 붙은 메서드의 메서드명이 빈 이름
@Bean
public MemberService memberService() {
     return new MemberServiceImpl(memberRepository());
}  // 빈 이름은 `memberService`
  • @Bean(name = "memberService") 이런식으로 직접 이름 지정도 가능

만약 빈 이름이 중복되면 오류가 발생하거나 기존 빈을 덮어쓸 수 있으니 주의하자


🐣 스프링 빈 조회

1. 모든 빈 조회하기

  • ac.getBeanDefinitionNames() → 스프링에 등록된 모든 빈 이름을 조회
  • ac.getBean() → 빈 이름으로 빈 객체(인스턴스) 조회

2. 애플리케이션 빈 조회하기
사용자가 직접 등록한 빈만 출력해보자

  • 스프링 내부에서 사용하는 빈은 getRole()로 구분이 가능
    • ROLE_APPLICATION → 사용자가 정의한 빈
    • ROLE_INFRASTRUCTURE → 스프링 내부에서 사용하는 빈

3. 빈 이름으로 조회하기

ac.getBean("memberService", MemberService.class); // `ac.getBean`(이름 + 타입)

4. 타입으로만 조회하기

ac.getBean(MemberService.class); // 타입만

5. 구체 타입으로 조회하기

ac.getBean(MemberServiceImpl.class);  // 구체 타입

6. 빈 이름으로 조회하지 못하는 경우

  • 이름이 조회 대상 스프링 빈에 없으면 NoSuchBeanDefinitionException 예외 발생

🐣 스프링 빈 조회 - 동일한 타입이 둘 이상

  • 타입으로 조회시 같은 타입이 둘 이상이라면 중복 오류가 발생함
@Configuration
static class SameBeanConfig {
    @Bean
    public MemberRepository memberRepository1() {
        return new MemoryMemberRepository();
    }

    @Bean
    public MemberRepository memberRepository2() {
        return new MemoryMemberRepository();
    }
}
  • 중복 오류 방지

1. 이름으로 조회하기

ac.getBean("memberRepository1", MemberRepository.class);

2. getBeansOfType()으로 모두 조회하기

 Map<String, MemberRepository> beansOfType = ac.getBeansOfType(MemberRepository.class);

🐣 스프링 빈 조회 - 상속 관계

  • 부모 타입으로 조회하면 자식 클래스도 같이 조회
  • 자바 객체의 최고 부모Object타입으로 조회 → 모든 스프링 빈 조회
  • DiscountPolicy로 조회 → RateDiscountPolicy, FixDiscountPolicy 모두 걸림

이때도 동일한 타입이 둘 이상 있을 때 처럼 빈 이름을 지정해서 조회하거나, getBeansOfType()으로 모두 조회 하면 된다


🐣 BeanFactory vs ApplicationContext

구분BeanFactoryApplicationContext
빈 관리OO
부가 기능XO
  • 실무에선 ApplicationContext를 거의 사용하니 잘 알아두자

이전까지는 내가 직접 new로 객체를 만들고 연결하면 끝이었는데 스프링으로 넘어오면서 객체 생성과 의존 주입을 컨테이너가 대신 알아서 해주니 내가 통제하던 제어권을 프레임워크에 넘긴다는 게 매우 어렵게 느껴졌다 하지만 강의 들으면서 스프링의 구조를 이해하고 나니 스프링을 왜 큰 규모에서 사용하는 것인지 체감이 되는 것 같았다

다음 포스팅은 싱글톤 컨테이너로 넘어오겠댜

0개의 댓글