javaboiii의 Spring

Spring - 컨테이너

javaboiii 2024. 10. 2. 11:58

Spring

Spring 컨테이너의 개념

Spring 컨테이너는 객체의 생성, 초기화, 소멸 등 생명 주기를 관리하는 핵심 컴포넌트

IoC(제어의 역행) 원칙에 따라 개발자가 아닌 컨테이너가 객체를 관리

Spring 컨테이너의 역할

객체 관리: Spring은 POJO(Plain Old Java Object)를 관리하여 복잡한 객체 생성 및 의존성 문제를 해결

의존성 주입: 필요한 객체를 생성하고 주입하는 과정을 자동화하여 코드의 가독성과 유지보수성을 향상

Spring 컨테이너의 종류

BeanFactory: 기본적인 컨테이너로, 필요한 객체(Bean)를 지연 로딩 방식으로 생성

메모리 사용이 효율적이지만 기능이 제한적

ApplicationContext: BeanFactory의 확장 버전으로, 더 많은 기능을 제공

AOP(Aspect-Oriented Programming) 를 지원

//컨테이너 구동 코드
// 스프링에서 제공하는 컨테이너 객체 == 스프링 자체는 아님
AbstractApplicationContext factory  = new GenericXmlApplicationContext("applicationContext.xml");

Spring 컨테이너의 로딩 방식

즉시 로딩 (Pre-loading): Spring 컨테이너가 시작될 때 모든 객체를 즉시 로드

성능은 좋지만 초기화 시간이 길어질 수 있음

 

지연 로딩 (Lazy-loading): 실제 사용 시점에 객체를 로드하여 메모리 사용을 최적화

이 방식은 필요할 때만 객체를 생성하여 리소스를 절약

<!-- 생성자 메서드에서 멤버변수를 초기화하는 것이 맞지만 -->
<!-- JAVA이전 언어들은 생성자 메서드라는 개념이 없던 언어도 있어 init-method라는 개념이 추가되었다. -->
<!-- <bean class="test.IPhone" id="apple" lazy-init="true" init-method="initMethod" scope="singleton"/>  -->
<!-- scope는 기본이 singleton으로 적용되고 -->
<!-- 만약 여러번 생성하고 싶다면 scope="prototype"  -->

<bean class="test.AppleWatch" id="aw" />
<bean class="test.GalaxyWatch" id="gw"/>

설정 방식

Spring 컨테이너는 설정 파일을 통해 구성됨

  • XML 설정: applicationContext.xml 파일을 통해 객체의 생성 및 설정을 정의
  • Java Configuration: @Configuration 어노테이션을 사용하여 Java 코드 내에서 직접 Bean을 정의할 수 있음
  • @Component 스캔: 특정 패키지를 스캔하여 @Component, @Service, @Repository 등의 어노테이션이 붙은 클래스를 자동으로 Bean으로 등록함

Bean의 생명 주기

  1. 인스턴스 생성: Bean이 생성
  2. 의존성 주입: 필요한 의존성을 주입
  3. 초기화: 초기화 메서드가 호출
  4. 사용: Bean이 실제로 사용
  5. 소멸: 컨테이너가 종료되거나 Bean이 더 이상 필요하지 않을 때 소멸

싱글톤 패턴

Spring 컨테이너는 기본적으로 싱글톤 패턴을 사용하여 Bean을 관리

내가 주입을 몇개 했냐를 가지고도 알맞은 생성자를 주입

하나의 객체만 생성되어 애플리케이션 전체에서 동일한 인스턴스를 사용하도록 보장