반응형

 

 

"김영한 스프링 핵심 원리 기본편" 내용을 기반으로 작성한 내용입니다.

 

스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런

김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보

www.inflearn.com

 

📝Spring으로 전환하기

@Configuration
public class AppConfig {
  @Bean
  public MemberService memberService() {
    return new MemberServiceImpl(memberRepository());
  }

  @Bean
  public MemberRepository memberRepository() {
    return new MemoryMemberRepository();
  }

}
  • @Configuration
    • 해당 설정을 Spring Container로 사용하겠다는 의미이다.
  • @Bean
    • Spring Container에 등록하겠다는 의미로 해당 정보를 다른 곳에서 꺼내서 쓸 수 있게 도와준다. 기본적으로 메서드의 명을 스프링 빈의 이름으로 사용한다. (물론 변경 가능)
    • 주의점으로 Bean이름이 겹치면 안 된다. (유일해야 함)

 

public class MemberApp {
  public static void main(String[] args) {

    /** AppConfig설정이 들어간 Spring Container를 사용하겠다 **/
    ApplicationContext applicationContext = new
        AnnotationConfigApplicationContext(AppConfig.class);

    /** Spring Container에 등록된 Bean에서 MemberService를 가져오겠다. **/
    MemberService memberService =
        applicationContext.getBean("memberService", MemberService.class);


    /** 회원가입 **/
    Member member = new Member(1L, "memberA", Grade.VIP);
    memberService.join(member);

    /** 회원찾기 **/
    Member findMember = memberService.findMember(1L);

    System.out.println("new member = " + member.getName());
    System.out.println("find Member = " + findMember.getName());
  }
}

 

📝Spring Bean 조회해보기

부모타입으로 조회하면 자식 타입도 함께 조회한다. 그래서 Object 타입으로 조회하면 모든 스프링 빈을 조회하게 된다.

 

public class ApplicationContextInfoTest {

  AnnotationConfigApplicationContext ac = new
      AnnotationConfigApplicationContext(AppConfig.class);

  @Test
  @DisplayName("모든 빈 출력하기")
  void findAllBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
      Object bean = ac.getBean(beanDefinitionName);
      System.out.println("name=" + beanDefinitionName + " object=" +
          bean);
    }
    // name=org.springframework.context.annotation.internalCommonAnnotationProcessor object=org.springframework.context.annotation.CommonAnnotationBeanPostProcessor@602e0143
    // name=org.springframework.context.event.internalEventListenerProcessor object=org.springframework.context.event.EventListenerMethodProcessor@2c07545f
    // name=org.springframework.context.event.internalEventListenerFactory object=org.springframework.context.event.DefaultEventListenerFactory@e57b96d
    // name=appConfig object=com.spring.core.AppConfig$$SpringCGLIB$$0@32c726ee
    // name=memberService object=com.spring.core.member.MemberServiceImpl@22f31dec
    // name=memberRepository object=com.spring.core.member.MemoryMemberRepository@34c01041
  }

  @Test
  @DisplayName("애플리케이션 빈 출력하기")
  void findApplicationBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
      BeanDefinition beanDefinition =
          ac.getBeanDefinition(beanDefinitionName);
      if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION) {
        Object bean = ac.getBean(beanDefinitionName);
        System.out.println("name=" + beanDefinitionName + " object=" +
            bean);
        // name=appConfig object=com.spring.core.AppConfig$$SpringCGLIB$$0@38234a38
        // name=memberService object=com.spring.core.member.MemberServiceImpl@63fbfaeb
        // name=memberRepository object=com.spring.core.member.MemoryMemberRepository@602e0143
      }
    }
  }

  @Test
  @DisplayName("빈 이름으로 조회")
  void findBeanByName() {
    MemberService memberService = ac.getBean("memberService",
        MemberService.class);
    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
  }

  @Test
  @DisplayName("이름 없이 타입만으로 조회")
  void findBeanByType() {
    MemberService memberService = ac.getBean(MemberService.class);
    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
  }

  @Test
  @DisplayName("구체 타입으로 조회")
  void findBeanByName2() {
    MemberServiceImpl memberService = ac.getBean("memberService",
        MemberServiceImpl.class);
    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
  }
  
  @Test
  @DisplayName("특정 타입을 모두 조회하기")
  void findAllBeanByType() {
    Map<String, MemberRepository> beansOfType =
        ac.getBeansOfType(MemberRepository.class);
    for (String key : beansOfType.keySet()) {
      System.out.println("key = " + key + " value = " +
          beansOfType.get(key));
    }
    System.out.println("beansOfType = " + beansOfType);
    assertThat(beansOfType.size()).isEqualTo(2);
  }
  
  @Test
  @DisplayName("부모 타입으로 모두 조회하기 - Object")
  void findAllBeanByObjectType() {
    Map<String, Object> beansOfType = ac.getBeansOfType(Object.class);
    for (String key : beansOfType.keySet()) {
      System.out.println("key = " + key + " value=" +
          beansOfType.get(key));
    }
  }
}

정상 등록되어있는지 코드로 확인할 수 있다.

 

📝Spring Bean 컨테이너 등록 과정

김영한 스프링 핵심 원리 기본편
김영한 스프링 핵심 원리 기본편
김영한 스프링 핵심 원리 기본편
김영한 스프링 핵심 원리 기본편

 

반응형