Spring Boot - 스프링 컨테이너

진경천·2024년 10월 24일

자바 객체의 생명 주기를 관리하며 추가적인 기능을 제공한다.
즉 빈(Bean)의 인스턴스화, 구성, 전체 생명 주기 및 제거까지 관리한다.
컬렉션 프레임워크와 같이 여러 인터페이스가 계층적으로 존재한다.

Bean이란?

스프링 컨테이너가 관리하는 자바 객체
빈은 스프링 컨테이너에 등록되어 의존성을 주입 받는다.

빈 등록

@Configuration

@Configuration
public class AppConfig{

	@Bean
	public UserRepository userRepository(){
		return new UserRepository();
	}
    
    @Bean
    public UserService userService(){
    	return new UserService(userRepository());
    }
}

위처럼 @Bean 어노테이션을 이용해 메서드가 반환한 객체를 스프링 컨테이너에 bean으로 등록할 수 있다.
기본적으로 메서드명을 빈의 이름으로 등록하지만 @Bean(="[beanName]")로 빈의 이름을 설정할 수 있다.

코드로 직접 빈을 등록하는 방식이다.
⚠️ @Bean을 붙인 메서드는 무조건 객체를 반환해야 한다.

@ComponentScan

@Component 어노테이션을 포함하는 클래스를 찾아 빈으로 등록해준다.
@ComponentScan([pakage] = ["경로"])를 구성 클래스의 최 상단에 붙인다.

@SpringBootApplication 어노테이션 내에 포함되어서 Application을 실행할때 자동으로 ComponentScan을 실행하여 빈을 등록시킨다.

같은 타입의 Bean이 2개라면?

우선 결론적으로 주입이 불가하다. 그렇기 때문에 @Primary @Qualifier 어노테이션을 사용해서 우선 순위를 부여해주어야 한다.

같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어있다면 Qualifier의 우선순위가 더 높다. 하지만 Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야한다.

public interface Car {
	public void run();
}

@Component
@Primary
public class Kia implements Car {
	public void run() {
    	System.out.println("spotage run");
	}
}

@Component
@Qualifier("hyundai")
public class Hyundai implements Car {
	public void run() {
    	System.out.println("avante run");
	}
}

public class CarService {
	@Autowired
    @Qualifier("hyundai")
    private Car car;
}

이렇게 되면 carHyundai 클래스로 주입이 된다.

따라서 같은 타입의 Bean이 여러 개 있을 때는 범용적으로 사용되는 Bean 객체에는 Primary를 설정하고 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용하는 것이 좋다.

빈 스코프

빈 객체가 존재할 수 있는 범위를 나타낸다.

Singleton

빈이 생성될 때 기본적으로 가지는 스코프이다.

Singleton 패턴이란?

  • 인스턴스가 하나만 생성되도록 보장하는 패턴
  • 메모리 효율성이 좋아짐
  • 시간 절약
  • 스프링 컨테이너는 빈을 싱글톤으로 관리한다.

@Scope("prototype")

빈 요청 시마다 새로운 인스턴스 생성

@Scope("session")

HTTP 세션 마다 새로운 빈 인스턴스 생성

@Scope("request")

HTTP 요청 마다 새로운 빈 인스턴스 생성

BeanFactory

스프링 컨테이너의 최상위 인터페이스

getBean(String name)
getBean(Class <T> requiredType)
getBean(String name, Class <T> requiredType)

빈 등록, 생성, 조회 등의 빈 관리 역할을 수행한다.

ApplicationContext

BeanFactory를 상속 받아 부가적인 기능을 추가한 인터페이스

  • 국제화 기능
  • 환경 변수 처리
  • 애플리케이션 이벤트
  • 리소스 조회
profile
어중이떠중이

0개의 댓글