스프링 부트(Spring Boot)는 자바 기반의 엔터프라이즈 애플리케이션 개발을 위한 프레임워크로, 빠르고 쉽게 웹 애플리케이션을 개발할 수 있도록 돕습니다. 그 중심에는 스프링 컨테이너가 존재하며, 빈(Bean)의 개념은 스프링 애플리케이션의 핵심 요소입니다. 이번 강좌에서는 빈과 스프링 컨테이너에 대해 자세히 살펴보겠습니다.
1. 스프링 프레임워크 개요
스프링 프레임워크는 자바 플랫폼을 위한 애플리케이션 프레임워크로, 개발자들이 빈의 생명주기를 관리하고, 의존성 주입(Dependency Injection)을 통해 컴포넌트를 연결할 수 있게 해줍니다. 이를 통해 소프트웨어의 결합도를 낮추고, 테스트 용이성을 높이며, 유지보수성을 개선합니다.
2. 스프링의 컨테이너
스프링 컨테이너는 애플리케이션의 구성 요소를 관리하는 핵심적인 부분입니다. 객체의 생성, 설정, 그리고 의존성 주입을 담당합니다. 스프링의 두 가지 주요 컨테이너는 다음과 같습니다.
- BeanFactory: 가장 기본적인 컨테이너로, 객체를 지연 로딩(lazy loading) 방식으로 생성합니다.
- ApplicationContext: BeanFactory의 기능을 모두 포함하고 있으며, 더 많은 기능을 제공합니다. 예를 들어, 국제화 지원, 이벤트 전파, 레이어를 통한 다양한 애플리케이션 구성 요소들을 지원합니다.
3. 빈(Bean) 개념
스프링에서 빈은 스프링 컨테이너에 의해 관리되는 객체를 의미합니다. 빈은 일반적으로 애플리케이션의 비즈니스 로직을 수행하는 데 필요합니다. 빈은 XML 파일이나 자바 설정 파일에서 정의할 수 있습니다.
빈을 정의할 때는 아래의 요소들을 고려해야 합니다.
- scope: 빈의 생명주기를 정의합니다. 일반적인 스코프에는 singleton, prototype, request, session, global session이 있습니다.
- qualifier: 여러 개의 빈이 있을 경우, 특정 빈을 선택하기 위한 방법을 제공합니다.
- autowiring: 스프링 컨테이너가 빈의 의존성을 자동으로 주입하는 방법입니다.
4. 빈 생명주기
스프링에서는 빈의 생명주기를 다양한 상태로 관리할 수 있습니다. 빈의 생성부터 소멸까지의 과정을 살펴보겠습니다.
- 빈 인스턴스화(Instantiation): 스프링 컨테이너가 빈 객체를 생성합니다.
- 의존성 주입(Dependency Injection): 필요한 의존성을 주입합니다.
- 초기화(Initialization): 초기화 메소드가 호출됩니다. 이 단계에서 애플리케이션은 빈이 사용될 준비가 되도록 설정됩니다.
- 사용(Usage): 빈을 사용합니다. 요청을 처리하거나 특정 작업을 수행합니다.
- 소멸(Destruction): 애플리케이션의 종료 시 빈이 소멸됩니다. 이 단계에서 필요한 정리 작업이 수행됩니다.
5. 빈 정의
빈을 정의하는 방법에는 여러 가지가 있지만, 주로 XML 설정 파일과 자바 기반 설정 파일을 사용합니다. 각 방법을 살펴보겠습니다.
5.1 XML 설정 파일을 통한 빈 정의
XML 설정 파일에서 빈을 정의하는 방법은 다음과 같습니다.
<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 http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="exampleBean" class="com.example.Example"> <property name="propertyName" value="propertyValue"/> </bean> </beans>
5.2 자바 기반 설정 방법
자바 기반 설정을 통해 빈을 정의할 경우 @Configuration과 @Bean 어노테이션을 사용할 수 있습니다.
@Configuration public class AppConfig { @Bean public Example exampleBean() { return new Example("propertyValue"); } }
6. 의존성 주입
의존성 주입은 객체 사이의 관계를 설정하고 관리하는 방식으로, 주입 방식에는 세 가지가 있습니다.
- 생성자 주입(Constructor Injection): 빈의 생성자를 통해 의존성을 주입합니다.
- 세터 주입(Setter Injection): 세터 메소드를 통해 의존성을 주입합니다.
- 필드 주입(Field Injection): 필드에 직접 주입하는 방식입니다. 그러나 이 방법은 권장되지 않습니다.
6.1 생성자 주입 예제
public class SampleBean { private final DependencyBean dependency; public SampleBean(DependencyBean dependency) { this.dependency = dependency; } }
6.2 세터 주입 예제
public class SampleBean { private DependencyBean dependency; @Autowired public void setDependency(DependencyBean dependency) { this.dependency = dependency; } }
7. 빈의 스코프 정의
스프링에서는 빈의 생명주기를 관리하기 위해 스코프를 설정할 수 있습니다. 각 스코프의 특징을 아래에 정리하였습니다.
- singleton: 기본 스코프이며 애플리케이션당 하나의 인스턴스만 생성됩니다.
- prototype: 요청할 때마다 새로운 인스턴스가 생성됩니다.
- request: 웹 애플리케이션에서 HTTP 요청당 하나의 인스턴스가 생성됩니다.
- session: HTTP 세션당 하나의 인스턴스가 생성됩니다.
- globalSession: 포털 애플리케이션에서 모든 세션에서 공유되는 인스턴스입니다.
8. 스프링 컨테이너 초기화
스프링 애플리케이션을 시작하기 전에 스프링 컨테이너를 초기화해야 합니다. 일반적으로 SpringApplication.run() 메소드를 호출하여 초기화를 수행합니다.
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
9. 빈의 프로파일
스프링에서는 환경을 기준으로 빈을 구성할 수 있도록 프로파일을 지원합니다. 프로파일을 사용하면 개발, 테스트, 프로덕션 환경에 맞는 빈 설정을 유지할 수 있습니다.
@Profile("dev") @Bean public DataSource devDataSource() { return new HikariDataSource(); } @Profile("prod") @Bean public DataSource prodDataSource() { return new HikariDataSource(); }
10. 결론
스프링 부트는 강력한 백엔드 애플리케이션 개발을 지원하는 프레임워크이며, 빈과 스프링 컨테이너는 애플리케이션의 구조와 동작을 이해하는 데 필수적입니다. 이번 강좌에서는 빈의 정의, 생명주기, 의존성 주입, 스코프 및 초기화 방법에 대해 설명했습니다. 앞으로의 강좌에서 더 많은 내용을 배우고 스프링 부트를 사용하여 실제 애플리케이션을 개발해보기를 기대합니다.