[Spring] 스프링 컨테이너란

mingsso·2023년 10월 23일
0

SpringBoot

목록 보기
2/11

1️⃣ 개념

스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트

스프링 컨테이너는 자바 객체의 생명주기를 관리(객체를 생성/관리/제거)하며, 생성된 자바 객체들에게 추가적인 기능을 제공함
*스프링에서는 자바 객체를 빈(Bean)이라고 함

즉, 개발자가 정의한 빈을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공함


스프링 부트를 사용하기 이전에는 XML을 통해 스프링 컨테이너를 직접 설정해주어야 했지만, 스프링부트가 등장하면서 어노테이션 기반으로 간편하게 설정할 수 있게 됨



2️⃣ 종류

스프링 컨테이너는 BeanfactoryApplicationContext 두 종류의 인터페이스로 구현되어 있음

BeanFactory

  • 스프링 컨테이너의 최상위 인터페이스
  • 빈을 등록, 생성, 조회 등 빈을 관리하는 역할을 함
  • getBean() 메서드를 통해 빈을 인스턴스화 할 수 있음 (글 아래 예시 있음)
  • @Bean 어노테이션이 붙은 메서드의 이름을 스프링 빈의 이름으로 사용하여 빈 등록을 함


ApplicationContext

  • BeanFactory의 기능을 상속받으므로, 빈을 관리하고 검색하는 기능 뿐만 아니라 그 외 부가 기능을 제공함
  • 부가기능
    • MessageSource: 메시지 다국화를 위한 인터페이스
    • EnvironmentCapable: 개발, 운영, 환경변수 등으로 나누어 처리하고, 애플리케이션 구동 시 필요한 정보들을 관리하기 위한 인터페이스
    • ApplicationEventPublisher: 이벤트 관련 기능을 제공하는 인터페이스
    • ResourceLoader: 파일, 클래스 패스, 외부 등 리소스를 편리하게 조회



3️⃣ 사용법

자바 어노테이션 통해 스프링 컨테이너 생성

  1. 컨테이너를 구성하고 스프링 컨테이너에 등록하기
@Configuration
public class AppConfig {

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

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
  • 스프링 컨테이너가 @Configuration이 붙은 클래스를 설정 정보로 사용함
  • 클래스 내부에 @Bean이 적힌 메서드를 모두 호출하여 얻은 객체를 스프링 컨테이너에 등록하게 됨

  1. 위 코드에서 구성한 스프링 컨테이너 생성하기
public class MemberApp {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class)
    }
}
  • ApplicationContext를 스프링 컨테이너라고 하며, 인터페이스로 구현되어 있음
  • 다형성이 적용이 되어 있으며, 다양한 구현체가 존재함
    • AnnotationConfigApplicationContext는 ApplicationContext의 구현체 중 하나
  • 스프링 빈은 applicationContext.getBean(”이름”, 타입) 메서드를 이용하여 얻을 수 있음



XML 통해 스프링 컨테이너 생성

  1. XML 기반 구성 메타데이터
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd">
        
    <bean id="..." class="...">  
        <!-- collaborators and configuration for this bean go here -->
     </bean>
        
     <bean id="..." class="...">
         <!-- collaborators and configuration for this bean go here -->
     </bean>
        
     <!-- more bean definitions go here -->
</beans>
  • <beans> 태그를 통해 필요한 값들을 설정할 수 있음
  • <bean id=”…”> 태그는 빈 정의를 식별하는 데 사용하는 문자열
  • <bean class=”…”> 태그는 Bean의 유형을 정의하고 클래스 이름을 사용한

  1. 위 코드에서 구성한 스프링 컨테이너 생성하기
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");




여기서 궁금했던 점은
🤔 내가 예전에 개발했던 프로젝트에서는 스프링 컨테이너를 생성한 적이 없는데 어떻게 된거지?

ApplicationContext를 굳이 만들지 않아도 main 메서드 내 SpringApplication.run() 메서드 내부에서 컨테이너를 생성한다

@RestController
@SpringBootApplication
public class KarrotApplication {
	public static void main(String[] args) {
		SpringApplication.run(KarrotApplication.class, args);
	}
}

ApplicationContext를 직접 만들어 사용하는 이유는 수동 빈 등록을 위해서라고 한다






참고자료

https://ittrue.tistory.com/220
https://www.inflearn.com/questions/882771/스프링-컨테이너-관련-질문-드립니다
https://www.inflearn.com/questions/320968/스프링-내부의-컨테이너

profile
🐥👩‍💻💰

0개의 댓글