SEB_BE 36일차 - DI

subimm_·2022년 10월 14일
0

코드스테이츠

목록 보기
36/83

Daily coding

if (str.length() == 0) return true;

        str = str.toUpperCase();
				// str을 char형 배열로 만들어줌.
        char[] arr = str.toCharArray();
				// 향상된 for문
        for (char ch : arr) {
            if (str.indexOf(ch) != str.lastIndexOf(ch)) {
                return false;
            }
        }
        return true;

💡 오늘의 학습목표

  • DI 실습

스프링 컨테이너(Spring Container)

  • 스프링 컨테이너는 내부에 존재하는 애플리케이션 빈의 생명주기 관리(빈 생성, 관리, 제거 등 담당)
  • ApplicationContext (인터페이스로 구현되어져있음)

📖 스프링 컨테이너 생성 과정

  • Java 기반의 애너테이션 기반 설정
  • XML 방식
    1. 스프링 컨테이너는 Configuration Metadata를 사용
    2. 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈 등록
    3. new AnnotationConfigApplicationContext(구성정보.class)로 스프링에 있는 @Bean의 메서드 등록
    4. 애너테이션 기반 컨테이너 구성 / XML기반
      //Spring Container 생성
      ApplicationContext applicationContext = new AnnotationConfigApplicationContext(DependencyConfig.class);

📖 스프링 컨테이너의 종류

  • 파라미터로 넘어온 설정 클래스 정보를 참고하여 빈의 생성, 관계 설정 등의 제어작업을 총괄하는 컨테이너
    • BeanFactory
      스프링 컨테이너의 최상위 인터페이스
      빈을 등록하고 생성 조회 등 관리 역할
      getBean() 메서드를 통해 빈을 인스턴스화 할 수 있다.
      @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용해 빈 등록을 함.
    • ApplicationContext
      BeanFactory의 기능을 상속받아 제공
      빈을 관리하고 검색하는 기능을 BeanFactory가 제공하고 그 외 부가기능 제공
      • 부가기능
        MessageSource : 메세지 다국화를 위한 인터페이스
        EnvironmentCapable : 개발, 운영 등 환경변수 등으로 나눠 처리하고 애플리케이션 구동 시 필요한 정보들을 관리
        ApplicationEvenPublisher : 이벤트 관련 기능을 제공하는 인터페이스
        ResourceLoader : 파일, 클래스패스, 외부 등 리소스를 편리하게 조회

📔 빈(Bean)

  • 스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컨테이너
  • Spring 컨테이너가 관리하는 자바 객체를 의미
  • 인스턴스화된 객체를 의미
  • @Bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록
  • 빈은 클래스의 등록 정보, getter/setter 메서드를 포함
  • 빈은 컨테이너에 사용되는 설정 메타데이터로 생성
    • bean 접근 방법
      ApplicationContext 사용해서 bean 정의를 읽고 액세스 할 수 있다.
    // create and configure beans
    ApplicationContext context= new ClassPathXmlApplicationContext("service.xml", "daos.xml");
    
    //retrive configured instance
    PetStoreService service = context.getBean("memberRepository", memberRepository.class);
    
    //use configured instance
    List<String> userList = service.getUsernameList();

    실제로는 getBean()메서드로 호출하여 사용 x

📖 컨테이너의 의미

  • 내부에 또 다른 컴포넌트를 가지고 있는 어떤 컴포넌트
  • 먼저 객체를 생성하고 객체를 서로 연결
  • 객체를 설정하는 단계를 지나 마지막으로 생명주기 전반을 관리
  • 객체의 의존성을 확인해 생성한 뒤 적절한 객체에 의존성 주입
  • 스프링은 스프링컨테이너를 통해 객체를 관리
  • 스프링 컨테이너에서 관리되는 객체를 빈이라고 한다.

📖 BeanDefinition

  • 스프링은 다양한 설정 형식을 BeanDefinition이라는 추상화 덕분에 지원 가능
  • 빈 설정 메타정보

📔 빈 스코프 (Bean Scope)

  • bean definition을 만들 때 정의된 클래스의 실제 인스턴스를 만들기 위한 레시피
    • 빈이 존재할 수 있는 범위를 의미

📖 싱글톤(singleton) 스코프

  • 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴

  • 단일 인스턴스는 싱글톤 빈의 캐시에 저장

  • 이름이 정해진 빈에 대한 모든 요청과 참조는 캐시된 개체 반환

  • 싱글톤 패턴의 문제를 싱글톤 컨테이너가 해결

    • 스프링 컨테이너는 싱글톤 컨테이너 역할
    • 싱글톤 객체로 생성하고 관리하는 기능을 싱글톤 레지스트리


📔 Java 기반 컨테이너 설정

  • @Configuration
  • @Bean
  // DependencyConfig 클래스
  컨텍스트를 인스턴스화 할 때
  @Configuration
  public class DependencyConfig {
  
  	@Bean
  public MyService myService() {
  	return new MyServiceImpl();
  }
}

AnnotationConfigApplicationContext 를 사용하여 스프링 컨테이너를 인스턴스화

  • @Configuration 클래스가 입력으로 제공되면 클래스 자체가 Bean 정의로 등록되고 클래스 내에서 선언된 모든 @Bean 메서드도 Bean 정의로 등록

@Bean 애너테이션을 사용

  • 메서드-레벨 애너테이션, <bean /> 에서 제공하는 일부 속성 지원
  • 메서드에 추가해서 Bean으로 정의(선언) 할 수 있다.
  • 애너테이션이 추가된 메서드는 빈을 구축하는데 필요한 의존성을 나타내는데 매개 변수 사용 가능

@Configuration 애너테이션을 사용

  • 해당 객체가 bean definitions의 소스임을 나타내는 애너테이션

  • 빈 사이에 의존성 주입

    @Configuration
    public class DependencyConfig {
    
      @Bean
      public BeanOne beanOne() {
          return new BeanOne(beanTwo());
      }
    
      @Bean
      public BeanTwo beanTwo() {
          return new BeanTwo();
      }
    }

java 코드에서 애너테이션을 사용하여 Spring 컨테이너를 구성

  • @Import 애너테이션
    • 구성을 모듈화 하는데 사용
    • 다른 구성 클래스에서 @Bean definition을 가져올 수 있다.
  • 빈 객체에 이름은 메서드 이름을 사용
    • 직접 부여도 가능 ex)@Bean(name="MemberRepository")
profile
코린이의 공부 일지

0개의 댓글