본문 바로가기
Back/Spring

[Spring] Bean

by 오엥?은 2023. 7. 19.
반응형

📌 Spring Bean

객체를 다루는 일반적인 방법은 프로그래머가 프로그램 로직 상 필요한 객체를 그 때 그 때 생성하고 필요한 메서드를 호출하는 것이다. 만약 다루는 언어가 자바라면 new 키워드를 통해 필요한 곳에 인스턴스를 생성하는 로직을 넣을 것이다.
 
하지만 스프링에서는 클래스들의 인스턴스(객체)를 일일이 프로그래머가 다루는 것이 아니고 스프링에게 관리를 맡기게 된다. 이것이 스프링의 주요 특징 중 하나인 IoC(Inversion of Control)이다.

IoC(Inversion of Control) : 제어의 역전, 객체를 개발자가 아닌 외부(스프링 컨테이너)에서 생성, 관리 

이 때, 스프링이 객체들을 미리 생성해 관리하는 공간을 스프링 컨테이너라고 하며, 이렇게 스프링에 의해 생성되고 관리되는 자바 객체를 스프링에서는 빈(Bean)이라고 한다.
 

스프링 컨테이너(Spring Container):  스프링에서 자바 객체들을 관리하는 공간
스프링 빈(Spring Bean) : 스프링에 의해 생성되고 관리되는 객체

 

반응형

 
생성자에 @Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것이 DI(Dependency Injection)다. 
 
스프링 컨테이너에 빈을 등록하는 이유는 스프링이 각 객체간 의존관계를 관리하도록 하는데 큰 목적이 있다. 객체가 의존관계를 등록할 때는 스프링 컨테이너에서 해당하는 빈을 찾고, 그 빈과 의존성을 만든다.
 
 

📌 Spring에서 Bean 객체를 생성하는 이유

1) 객체의 생성과 관리: Spring은 애플리케이션에서 필요로 하는 객체를 생성하고 관리한다. 객체의 생명주기를 Spring 컨테이너에 위임하여 개발자는 객체 생성과 소멸에 대한 로직을 직접 구현하지 않아도 된다.
 
2) 의존성 관리: Spring은 의존성 주입(Dependency Injection)을 통해 객체 간의 의존성을 관리한다. Bean을 사용하여 객체를 생성하고 의존성을 주입함으로써, 객체 간의 결합도를 낮출 수 있다. 이는 코드의 유연성과 재사용성을 높이고, 테스트와 유지보수를 용이하게 만든다.
 
3) 라이프사이클(생명주기) 관리: Spring은 빈의 라이프사이클을 관리한다. 빈의 생성, 초기화, 소멸과 같은 라이프사이클 이벤트를 처리할 수 있으며, 필요에 따라 커스텀 라이프사이클 콜백을 정의할 수도 있다. 이를 통해 애플리케이션의 초기화나 종료 시점에 필요한 작업을 수행할 수 있다.
 

✔️ 라이프사이클을 관리해야 하는 이유
- 객체 초기화: 객체를 생성한 후에 초기화 작업을 수행해야 할 때가 있다. 예를 들어, 데이터베이스 연결, 파일 로딩, 외부 리소스 초기화 등의 작업을 객체 생성 후에 수행해야 한다. 생명주기 관리를 통해 객체가 생성될 때 자동으로 초기화 작업을 수행할 수 있다.
- 자원 관리: 객체가 사용하는 자원들을 효율적으로 관리해야 한다. 예를 들어, 데이터베이스 연결, 파일 핸들, 네트워크 연결 등의 자원을 사용하는 객체가 종료되기 전에 자원을 해제해야 한다. 생명주기 관리를 통해 객체가 소멸될 때 자원을 안전하게 해제할 수 있다.
- 외부 연동: 객체가 외부 시스템과 상호 작용해야 할 때 생명주기 관리가 필요하다. 예를 들어, 웹 애플리케이션에서 HTTP 요청을 처리하는 객체가 있을 때, 요청을 받으면 객체가 생성되고 처리를 완료한 후에 객체를 소멸시켜야 한다. 이를 통해 메모리를 효율적으로 사용하고, 객체 간의 충돌이나 데이터 누수 등을 방지할 수 있다.
- 이벤트 처리: 객체의 생명주기 이벤트를 처리해야 할 때가 있다. 예를 들어, 객체 생성 후 초기화 작업, 객체 소멸 전 정리 작업 등을 수행해야 할 때 생명주기 관리를 통해 이벤트를 감지하고 처리할 수 있다.
- 커스텀 동작: 객체의 생명주기에 따라 커스텀 동작을 수행해야 할 때 생명주기 관리가 필요하다. 예를 들어, 객체 생성 후에 특정 작업을 수행하거나, 객체 소멸 전에 정리 작업을 수행해야 할 때 생명주기 관리를 통해 커스텀 동작을 정의하고 수행할 수 있다.
 

 
4) 스코프 관리: Spring은 빈의 스코프를 관리할 수 있다. 싱글톤(Singleton), 프로토타입(Prototype), 요청(Request), 세션(Session) 등 다양한 스코프를 지원하여 객체의 생명주기와 범위를 제어할 수 있다. 이는 메모리 사용과 성능을 최적화하고, 애플리케이션의 요구사항에 맞게 객체를 관리할 수 있게 한다.
 

✔️ 스코프란?
스코프는 객체의 생성과 소멸에 대한 범위를 정의하는 개념이다. 스코프는 객체가 어느 범위에서 유효한지를 결정하며, Spring 프레임워크에서는 다양한 스코프를 지원한다.
- 싱글톤(Singleton) 스코프: 싱글톤 스코프는 하나의 빈 객체가 애플리케이션 전체에서 공유되는 스코프다. 즉, Spring 컨테이너 내에서 해당 빈은 오직 하나의 인스턴스만 생성되고, 모든 요청에 대해 동일한 인스턴스가 반환된다. 이는 기본적인 스코프이며, 대부분의 빈이 싱글톤으로 설정된다.
- 프로토타입(Prototype) 스코프: 프로토타입 스코프는 요청할 때마다 매번 새로운 인스턴스를 생성하는 스코프다. 즉, Spring 컨테이너는 요청마다 해당 빈의 새로운 인스턴스를 생성하여 반환한다. 프로토타입 스코프는 각 요청에 대해 독립적인 객체를 필요로 할 때 유용하다.
- 요청(Request) 스코프: 요청 스코프는 웹 애플리케이션에서 HTTP 요청마다 새로운 인스턴스를 생성하는 스코프다. 즉, 각각의 HTTP 요청이 발생할 때마다 해당 빈의 인스턴스를 생성하여 사용하며, 요청이 완료되면 해당 인스턴스는 소멸됩니다. 주로 웹 애플리케이션에서 각각의 요청에 대해 독립적인 객체를 사용해야 할 때 사용된다.
- 세션(Session) 스코프: 세션 스코프는 사용자 세션 단위로 객체의 인스턴스를 생성하는 스코프다. 즉, 한 세션에서 해당 빈을 요청할 때마다 인스턴스를 생성하여 사용하며, 세션이 종료되면 해당 인스턴스는 소멸된다. 세션 스코프는 웹 애플리케이션에서 세션 단위로 상태를 유지해야 할 때 유용하다.
 
스코프를 통해 객체의 범위를 정의함으로써 메모리 사용을 최적화하고, 객체의 생명주기를 관리할 수 있다.
 

5) 설정 관리: Spring은 XML, Java Config, Annotation 등을 통해 빈의 설정을 관리한다. 이를 통해 애플리케이션의 구성을 외부 설정 파일로 분리하고, 동적으로 빈을 생성하거나 구성을 변경할 수 있다. 이는 애플리케이션의 환경에 따라 다른 설정을 사용하거나, 확장성과 유지보수성을 높일 수 있다.
 
6) AOP(Aspect-Oriented Programming) 지원: Spring은 AOP를 지원하여 핵심 비즈니스 로직과 관련 없는 부가적인 기능(로깅, 트랜잭션 관리 등)을 분리할 수 있다. Bean을 사용하여 관점 지향 프로그래밍을 구현할 수 있으며, 코드의 모듈성과 재사용성을 높일 수 있다.
 
 
이러한 이유들로 인해 Spring에서는 bean 객체를 생성하여 객체의 의존성을 관리하고, 라이프사이클과 스코프를 관리하며, 애플리케이션의 설정과 AOP를 지원한다. 이를 통해 개발자는 객체를 보다 효과적으로 관리하고 애플리케이션의 유연성과 모듈성을 향상시킬 수 있다.
 
 
 
 
 

참고 - https://bnzn2426.tistory.com/124

반응형