스프링 프레임워크에서는 객체를 Bean으로 관리한다. 빈은 스프링 컨테이너에 의해 생성, 관리되는 객체이다.
스프링 컨테이너는 애플리케이션의 핵심 구성 요소인 빈의 생성, 관리, 조립, 소멸 등의 라이프사이클을 관리한다.
스프링 컨테이너는 IOC컨테이너로서 개발자는 객체의 생성과 관리에 대한 책임을 스프링 컨테이너에게 위임할 수 있다. 따라서 코드의 유연성과 확장성을 높일 수 있다.
IOC컨테이너 - IOC(제어의 역전)으로 객체의 생성과 관리를 개발자가 아닌 컨테이너가 담당한다.
스프링 컨테이너는 주로 두 가지 방식으로 제공된다.
가장 기본적인 스프링 컨테이너로서, 빈의 인스턴스화와 관리, 의존성 주입 등을 처리한다. 필요한 빈을 요청할 때마다 해당 빈을 생성하고 반환한다.
BeanFactory 인터페이스를 확장한 ApplicationContext 인터페이스는 더 많은 기능을 제공한다.
ApplicationContext의 주요 기능을 간단하게 살펴보겠다.
빈의 관리
빈의 생성과 관리, 의존성 주입 등을 수행한다. 설정파일(Xml 또는 JavaConfig)에서 빈의 정의를 읽어들이고, 해당 빈을 인스턴스화하고 관리한다.
AOP
AOP를 통해 횡단 관심사를 쉽게 분리하여 모듈화할 수 있도록 지원한다. AOP를 사용해 로깅, 보안과 같은 공통된 기능을 한 곳에서 중앙 관리해 코드의 재상용성과 유지보수성을 향상시킬 수 있다.
트랜잭션 관리
트랜잭션 관리자를 설정하고 트랜잭션의 경계를 설정하여 데이터베이스 등의 리소스에 대한 트랜잭션 처리를 지원한다.
AOP - 관점 지향 프로그래밍으로, 애플리케이션과 핵심 로직과 별개로 횡단 관심사를 모듈화하는 프로그래밍 패러다임
횡단 관심사 - 애플리케이션의 핵심 로직과 별개로 여러 부분에 걸쳐 발생하는 공통된 기능
이처럼 스프링 컨테이너는 설정파일에서 빈의 정의를 읽어들여 빈을 생성하고 관리한다. 빈의 정의에는 빈의 이름, 클래스, 의존성 등이 포함된다. 컨테이너는 설정 파일을 기반으로 빈을 인스턴스화하고, 의존성을 주입하여 객체 간의 관계를 구성한다.
또한 빈의 초기화와 소멸에 대한 콜백 메서드를 호출하고, 빈의 인스턴스를 캐싱하여 재사용하는 등 빈의 생명주기를 관리한다. 이를 통해 애플리케이션의 성능을 향상시키고 메모리 관리를 효율적으로 수행할 수 있다.
빈은 일반적으로 싱글톤으로 관리된다. 즉 스프링 컨테이너는 각 빈ㅇ르 단 하나의 인스턴스로 생성하고, 이를 필요로 하는 모든 곳에서 공유해서 사용한다. 이렇게 함으로써 객체 생성에 대한 오버헤드를 중리고, 일관된 상태를 유지할 수 있다.
빈은 다음과 같은 특징을 가지고 있다.
의존성 주입(Dependency Injection)
빈은 스프링 컨테이너가 자동으로 의존성을 주입해준다. 즉, 필요한 의존 객체를 빈이 직접 생성하거나 찾을 필요 없이 컨테이너가 자동으로 주입한다. 이를 통해 빈은 필요로 하는 다른 빈과의 관계를 느슨하게 유지하며, 객체 간의 결합도를 낮출 수 있다.
생명주기 관리
빈은 스프링 컨테이너에 의해 생성되고 초기화, 소멸되는 생명주기를 가진다. 컨테이너는 빈의 초기화와 소멸 시점을 알아서 관리하며 필요한 자업을 수행할 수 있다. 예를 들어, 빈이 생성될 때 초기 설정 자업을 수행하고, 컨테이너가 종료될 때 빈이 사용한 리소스를 정리할 수 있다.
스코프
빈은 스코프라는 개념을 가지고 있다. 스코프는 빈의 인스턴스를 어떻게 관리할지를 정의하는 방법이다. 스프링은 다양한 스코프를 제공하며, 주로 사용되는 스코프는 싱글톤, 프로토타입, 요청, 세션 등이 있다. 각 스코프는 빈의 인스턴스 생성과 관리 방식을 다르게 설정할 수 있다.
이처럼 스프링 빈은 스프링의 핵심 개념으로 애플리케이션의 구성 요소를 담당하며, 의존성 주입과 생명주기 관리를 통해 객체 간의 결합도를 낮추고 유연성을 높인다. 스프링의 다양한 기능과 편의성은 빈을 통해 제공되기 때문에 스프링을 사용한 애플리케이션 개발에 있어서 스프링 빈을 잘 활용하는 것이 매우 중요하다.