몇 가지 개념 정리

MMM·2024년 3월 22일
0

스프링 컨테이너

  • = spring context = IOC container
  • 스프링 빈과 수명 주기 관리
  • Java classes + Config -> IOC Container에 전달 -> Ready System

1) Bean Factory

  • 기본 Spring 컨테이너

2) Application Context

  • 엔터프라이즈 전용 기능이 있는 고급 Spring container (Advanced Spring Container with enterprise-specific features)
  • 웹 애플리케이션 구축, 국제화 기능이 필요한 경우, 혹은 Spring AOP와 잘 통합되도록 할 때 사용 -> 가장 많이 사용하는 컨테이너. 처음 이 프로젝트 시작할 때도 AnnotationConfig**ApplicationContext**를 사용했음!
  • 웹 어플리케이션, 웹 서비스, REST API, 마이크로서비스 등에 활용하길 추천함

Java Bean vs POJO vs Spring Bean

POJO (Plain Old Java Object)

  • 모든 Java 객체. 아무런 제약 조건 x.

Java Bean

  • EJB(Enterprise Java Bean) : Java Bean이라는 개념 처음 도입
  • Java 빈의 조건
    1) 인수 생성자가 없어야 함. (public no-arg constructor)
    2) Getter, Setter가 있어야 함
    3) Serializable 인터페이스 구현
  • 이 조건들을 만족하면 모두 Java Bean임. 다만 현재는 EJB를 거의 사용하지 않으므로 해당 조건은 유명무실한 상태.

Spring Bean

  • Spring 프레임워크에서 관리하는 것은 모두 Spring Bean이 될 수 있음. IOC 컨테이너가 관리하는 모든 객체는 Spring Bean.

Spring Bean을 나열하는 방법

Arrays.stream(context.getBeanDefinitionNames()).forEach(System.out::println);

//org.springframework.context.annotation.internalConfigurationAnnotationProcessor
//org.springframework.context.annotation.internalAutowiredAnnotationProcessor
//org.springframework.context.annotation.internalCommonAnnotationProcessor
//org.springframework.context.event.internalEventListenerProcessor
//org.springframework.context.event.internalEventListenerFactory
//helloWorldConfiguration
//name
//age
//person
//person2MethodCall
//person3Parameters
//address2
//address3
  • context.getBeanDefinitionNames() : 레지스트리에 정의된 모든 Bean의 이름을 반환
  • context.getBeanDefinitionCount() : 레지스트리에 정의된 Bean의 개수 반환
  • context.getBeanDefinition(String beanName) : beanName을 매개 변수로 받아 해당하는 BeanDefinition 반환

Spring Bean 우선 순위 설정

Spring Bean은 이름으로도 검색 가능하지만, 유형으로도 검색 가능함. ex. context.getBean(Address.class). 그러나 이 때 후보가 여러 개일 때는 예외가 발생함. 따라서 문제를 해결하려면 Bean 사이의 우선 순위를 결정해줘야 함.

@Primary

이 문제를 해결하려면 특정 빈을 primary로 설정해주면 됨.

    @Bean(name = "address2")
    @Primary
    public Address address() {
        return new Address("Baker Street", "London");
    }

    @Bean(name = "address3")
    public Address address3() {
        return new Address("Motinagar", "Hyderabad");
    }

위 상황에서 system.out.println(context.getBean(Address.class))를 실행하면 address2가 출력됨.

@Qualifier

    @Bean
    public Person person5Qualifier(String name, int age,
            @Qualifier("address3Qualifier") Address address) {
        return new Person(name, age, address);
    }

    @Bean(name = "address2")
    @Primary
    public Address address() {
        return new Address("Baker Street", "London");
    }

    @Bean(name = "address3")
    @Qualifier("address3Qualifier")
    public Address address3() {
        return new Address("Motinagar", "Hyderabad");
    }

address3에 @Qualifier를 달아주었고, person5Qualifier에서 Address 앞에 동일한 @Qualifier 한정자를 달아줌으로써 Bean끼리 연결 시킴.

profile
과거의 내가 현재의 나보다 똑똑할 때가 있다.

0개의 댓글