🍳

초보 개발자의 일상

Java/SpringBoot

Spring Bean (스프링 빈)

dev.jelee 2024. 10. 23. 20:39

# 수익을 위해 작성한 글이 아닙니다.

# 수업을 받고 내용을 정리하기 위해 작성한 글입니다.


 

생각

@Autowired를 이해하려고 하다보니 의존성 주입이라는 단어가 보였다. 이미 등록된 빈을 찾아서 해당 필드에 주입해주는 역할을 한다고 해서 이때 빈이란 무엇인지 궁금해졌다.

 

 

Spring Bean의 정의

  • Spirng Framework에 관리되는 객체이며, Java 클래스로 정의된다.
  • IoC(제어의 역전) 컨테이너에 의해 생성, 초기화, 소멸되는 모든 객체를 포함한다.

 

 

Spring Bean 특징

  1. IoC(제어의 역전)
    • Spring Bean은 Spring IoC 컨테이너에 의해 생성되고 관리되는 객체로, 개발자가 직접 인스턴스를 생성하지 않고 컨테이너가 이를 자동으로 처리한다.
    • IoC(Inversion of Control, 제어의 역전)는 객체의 생성과 관리를 프레임워크가 맡게 하는 개념이다. 즉, 개발자가 직접 객체를 생성하고 관리하는 대신 프레임워크가 필요한 객체를 자동으로 만들어 주고 주입해준다는 말이다.
  2. DI(의존성 주입)
    • Bean 간의 의존성을 Spring이 자동으로 주입한다. 이를 통해 객체 간의 결합도를 낮추고 코드의 유연성과 재사용성을 높인다.
    • 의존성 주입 방식에는 생성자 주입, 세터 주입, 필드 주입등이 있다.
  3. 생명주기 관리
    • Spring 컨테이너가 Bean의 생성, 초기화, 소멸을 관리한다.
    • Bean의 생명주기는 인스턴스화, 의존성 주입, 초기화, 소멸로 나뉜다.
      • 인스턴스화: Spring 컨테이너가 Bean의 인스턴스를 생성한다.
      • 의존성 주입: 다른 Bean이나 값을 자동으로 주입하여 초기화합니다.
      • 초기화: 필요한 초기화 작업을 수행합니다. @PostConstruct 어노테이션을 사용할 수 있습니다.
      • 소멸: 컨테이너가 종료될 때 Bean을 정리합니다. @PreDestroy 어노테이션을 사용할 수 있습니다.
  4. 다양한 스코프 설정
    • Spring Bean은 여러가지 스코프를 가질 수 있다.
    • 기본적으로 싱글톤(Singletone; 하나의 인스턴스)으로 설정된다. 컨테이너당 하나의 인스턴스만 생성.
    • 필요에 따라 prototype(매번 새로운 인스턴스), request(HTTP 요청당 하나), session(HTTP 세션당 하나), application(웹 어플리케이션 당 하나) 등을 설정할 수 있다.
      • prototype: 요청 시마다 새로운 인스턴스 생성.
      • request: 웹 애플리케이션에서 HTTP 요청당 하나의 인스턴스 생성.
      • session: HTTP 세션당 하나의 인스턴스 생성.
      • application: ServletContext당 하나의 인스턴스 생성.
  5. AOP(관점 지향 프로그래밍) 지원
    • Spring Bean은 AOP(관점 지향 프로그래밍)와 통합되어 있어 로깅, 트랜잭션 관리, 보안 등을 Bean에 등록한다. 이를 통해 Bean을 효과적으로 관리하고 의존성을 간편하게 처리할 수 있다. 그리고 코드의 중복을 줄이고, 유지보수를 용이하게 한다.
  6. Bean 등록
    • 어노테이션 기반의 구성 
    • Spring 컨테이너에 @Component, @Service, @Repository, @Controller 등의 어노테이션을 사용하여 Bean을 등록할 수 있다.
  7. 유연한 구성(프로파일링 및 조건부 등록)
    • @Profile 어노테이션을 사용하여 특정 환경에서만 Bean을 등록하거나 @Contidional 어노테이션을 통해 조건에 따라 Bean의 등록을 제어할 수 있다.

 

 

Spring Bean 등록 방법

  1. XML 설정 파일을 통해 Bean을 등록.
    • 예: <bean id = "myBean" class = "com.example.MyClass" />
  2. 다양한 어노테이션을 사용하여 Bean을 자동으로 등록.
    • @Component : 일반적인 Bean으로 등록.
    • @Controller : 웹 MVC 컨트롤러로 등록.
    • @Service : 서비스 레이어 Bean으로 등록.
    • @Mapper : MyBatis와 같은 ORM 프레임 워크에서 사용.
    • @Repository : 데이터 접근 객체(DAO)로 등록.
  3. Java 기반 설정을 통해 Bean을 등록.
    • @Configuration : Java 기반 설정 클래스를 정의. 이 클래스 내에서 Bean을 등록 가능.
    • @Bean : 메서드를 통해 Bean을 생성하고 등록. 이 메서드는 Spring 컨테이너에 의해 관리되는 객체를 반환한다.
    • @Scope : Bean의 스코프를 설정. 예를 들어, singleton(기본값) 또는 prototype(매번 새로운 인스턴스 생성) 등을 지정할 수 있다.
    • @Lazy : Bean의 초기화를 지연시킨다. 필요할 때까지 Bean이 생성되지 않도록 설정할 수 있다.
@Configuration
public class AppConfig {

    @Bean
    @Scope("prototype")  // 매번 새로운 인스턴스 생성
    public MyClass myPrototypeBean() {
        return new MyClass();
    }

    @Bean
    @Lazy  // 실제 사용될 때까지 초기화 지연
    public MyClass myLazyBean() {
        return new MyClass();
    }
}

 

 

'Java > SpringBoot' 카테고리의 다른 글

[MyBatis] useGeneratedKeys, keyProperty  (1) 2024.10.28
@Autowired  (0) 2024.10.23
@Controller, @RestController 차이  (0) 2024.10.23
SpringBoot(스프링부트) 수업 2일차  (0) 2024.09.24
SpringBoot(스프링부트) 수업 1일차  (1) 2024.09.23