11월 7일

Yullgiii·2023년 11월 7일
0
post-thumbnail

스프링 빈 (Spring Bean)

🌱 스프링 빈이란?

스프링 빈(Spring Bean)은 스프링 컨테이너에 의해 인스턴스화, 관리되고 조립되는 객체를 말한다. 스프링 빈은 스프링의 제어 역전 (IoC, Inversion of Control) 원칙에 의해 관리되며, 이를 통해 개발자는 직접 객체의 생명주기를 관리하는 대신 스프링 프레임워크가 그 역할을 대신 해준다.

🌿 스프링 빈의 생명주기

인스턴스화 (Instantiation): 스프링 컨테이너는 빈 설정에 따라 객체를 생성한다.
초기화 (Initialization): 의존성 주입이 이루어진다.
사용 (Use): 애플리케이션의 실행 동안 빈은 사용된다.
소멸 (Destruction): 애플리케이션 종료 시 빈은 소멸된다.

🌼 빈의 스코프 (Scope)

스프링 빈은 여러 가지 스코프를 가질 수 있다!!!!!!!!!

  • Singleton (기본값): 스프링 컨테이너에 의해 단 하나의 인스턴스만 생성되며, 모든 요청에 대해 동일한 객체가 반환된다.
  • Prototype: 매번 요청할 때마다 새로운 빈 인스턴스를 생성한다.
  • Request: HTTP 요청당 하나의 빈 인스턴스가 생성된다.
  • Session: HTTP 세션당 하나의 빈 인스턴스가 생성된다.
  • Application: 웹 애플리케이션당 하나의 빈 인스턴스가 생성된다.

🍃 의존성 주입 (Dependency Injection)

스프링 빈은 주입될 수 있는 의존성을 가질 수 있다. 이 의존성은 주로 다른 빈이나 값이 될 수 있으며, 스프링 컨테이너는 빈이 생성될 때 이 의존성을 주입한다. 이를 통해 개발자는 객체 간의 관계를 설정하거나 구성 값을 제공할 수 있다.

🍀 빈 설정 방법 및 특징

특징

  • 싱글톤: 기본적으로 스프링은 한 개의 빈 정의당 하나의 객체 인스턴스만을 생성하는 싱글톤 범위를 사용한다.
  • 생성과 소멸의 생명주기 관리: 스프링 컨테이너는 빈의 생성과 소멸 과정에서 특정 로직을 실행할 수 있는 방법을 제공한다.
  • 의존성 주입 지원: 객체가 필요로 하는 다른 객체(의존성)를 자동으로 주입하는 기능을 제공한다.

빈의 정의 방법

  • XML 파일 설정: <bean> 태그를 사용하여 XML 파일 내에서 빈을 정의하고 구성한다. 이 방식은 스프링의 초기 버전에서 널리 사용되었으며, 명시적이고 세밀한 제어를 가능하게 함.
<!-- applicationContext.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="myBean" class="com.example.MyClass">
        <!-- 추가적인 속성 설정 -->
    </bean>

</beans>
  • 어노테이션(Annotation) 기반 설정: @Component, @Service, @Repository, @Controller 등의 어노테이션을 사용하여 클래스를 자동으로 빈으로 등록. @Autowired 어노테이션을 통해 의존성을 주입할 수 있다.
// MyClass.java
package com.example;

import org.springframework.stereotype.Component;

@Component
public class MyClass {
    // 필드, 메소드 및 생성자
}
  • 자바 기반 설정: @Configuration 어노테이션이 달린 클래스 내에서 @Bean 어노테이션을 사용하여 메소드 레벨에서 빈을 정의. 이 메소드는 빈의 인스턴스를 생성하고 초기화하는 작업을 캡슐화한다.
// AppConfig.java
package com.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    
    @Bean
    public MyClass myBean() {
        return new MyClass();
    }
}
  • 자바 시스템 설정: 프로퍼티 파일, 환경 변수 또는 JVM 시스템 설정을 사용하여 빈 설정을 외부화한다. 이 방법은 애플리케이션을 다양한 환경에 쉽게 배포할 수 있게 해 줌.
// DatabaseConfig.java
package com.example;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;

@Configuration
@PropertySource("classpath:/com/example/database.properties")
public class DatabaseConfig {

    @Bean
    public DataSource dataSource(Environment env) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl(env.getProperty("database.url"));
        dataSource.setUsername(env.getProperty("database.username"));
        dataSource.setPassword(env.getProperty("database.password"));
        return dataSource;
    }
}

각 접근 방식은 특정 상황과 요구에 맞게 선택될 수 있으며, 때로는 하나의 애플리케이션 내에서 여러 가지 설정 방식이 혼합되어 사용되기도 한다.

🌸 빈과 관련된 주요 주석 (Annotations)

@Component: 일반적인 컴포넌트와 동일한 역할을 하는 빈으로 선언한다.
@Service: 서비스 계층의 빈을 선언한다.
@Repository: 데이터 액세스 계층의 빈을 선언한다.
@Controller: 프레젠테이션 계층의 빈을 선언한다.
@Autowired: 의존성 주입을 위해 사용한다.
@Qualifier: 여러 빈 중에서 특정 빈을 주입하고자 할 때 사용한다.

🔍 결론

스프링 빈은 스프링 프레임워크의 핵심으로, 객체의 생성과 관리를 통해 애플리케이션의 설정과 구성을 단순화합니다. 이를 통해 개발자는 비즈니스 로직에 더 집중할 수 있으며, 애플리케이션의 유지보수성과 확장성이 향상됩니다. 스프링 빈을 효과적으로 사용함으로써, 애플리케이션 컴포넌트 간의 결합도는 낮추고, 응집력은 높여, 더 견고하고 유연한 애플리케이션을 구축할 수 있다.

profile
개발이란 무엇인가..를 공부하는 거북이의 성장일기 🐢

0개의 댓글