본문 바로가기
스프링 공부

스프링 빈 Spring Bean 정리

by 코딩마스터^^ 2024. 8. 7.

빈(Bean)이란?

 

스프링 프레임워크에서 관리하는 객체를 의미합니다. 스프링 컨테이너가 생성, 구성, 그리고 관리하는 자바 객체로, 애플리케이션의 핵심 구성 요소입니다. 빈은 보통 서비스, 데이터 접근 객체(DAO), 컨트롤러 등의 역할을 수행합니다.

 

빈의 특징

  1. POJO (Plain Old Java Object): 스프링 빈은 특별한 규칙을 따르지 않는 순수한 자바 객체입니다. 이는 기존 자바 객체를 스프링 컨테이너가 관리할 수 있다는 것을 의미합니다.
  2. 관리 객체: 빈은 스프링 컨테이너에 의해 생성되고 관리되며, 필요에 따라 컨테이너가 라이프사이클을 제어합니다.
  3. 의존성 주입 (Dependency Injection): 빈의 종속성은 외부에서 주입되며, 이는 객체 간의 결합도를 낮추고 테스트 가능성을 높입니다.

 

빈 정의 방법

스프링에서 빈을 정의하는 방법은 여러 가지가 있습니다. 주로 XML 설정 파일, 자바 설정 파일, 어노테이션을 사용합니다.

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="myService" class="com.example.demo.service.MyService"/>
</beans>

 

XML 설정을 사용하는 애플리케이션 클래스

 

package com.example.demo;

import com.example.demo.service.MyService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyService myService = context.getBean(MyService.class);
        System.out.println(myService.sayHello());
    }
}

 

2. 자바 설정(Config클래스)

자바 설정 클래스를 사용하여 빈을 정의

package com.example.demo.config;

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

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}

 

자바 설정을 사용하는 애플리케이션 클래스

package com.example.demo;

import com.example.demo.service.MyService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyService myService = context.getBean(MyService.class);
        System.out.println(myService.sayHello());
    }
}

 

 

3. 어노테이션 설정

어노테이션을 사용하여 빈을 정의

 
package com.example.demo.service;

import org.springframework.stereotype.Service;

@Service
public class MyService {
    public String sayHello() {
        return "Hello, Spring!";
    }
}

 

어노테이션 설정을 사용하는 애플리케이션 클래스

package com.example.demo;

import com.example.demo.service.MyService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(DemoApplication.class, args);
        MyService myService = context.getBean(MyService.class);
        System.out.println(myService.sayHello());
    }
}

 

 

 

빈의 라이프사이클

빈의 라이프사이클은 다음 단계로 구성됩니다:

  1. 빈 인스턴스화: 스프링 컨테이너가 빈을 생성합니다.
  2. 의존성 주입: 빈의 의존성이 설정됩니다.
  3. 빈 초기화: 초기화 콜백 메서드가 호출되어 초기화 작업이 수행됩니다.
  4. 빈 사용: 애플리케이션에서 빈을 사용합니다.
  5. 빈 소멸: 애플리케이션 종료 시 소멸 콜백 메서드가 호출되어 정리 작업이 수행됩니다.

 

프레임워크를 적용하지 않은, 우리가 그동안 작성해왔던 일반적인 프로그램을 생각해보자. 객체의 생명주기(객체의 생성, 초기화, 소멸, 메서드 호출 등)를 클라이언트 구현 객체가 직접 관리한다. 또한 다른 사람이 작성한 외부 코드(라이브러리)를 호출하더라도 해당 코드의 호출 시점 역시 직접 관리한다. 하지만 이러한 생명주기를 직접 관리하지 않는 경우라면?🤔


스프링과 같은 프레임워크를 사용할 때를 생각해보자. Controller, Service 같은 객체들의 동작을 우리가 직접 구현하기는 하지만, 해당 객체들이 어느 시점에 호출될 지는 신경쓰지 않는다🤷‍♀️. 단지 프레임워크가 요구하는대로 객체를 생성하면, 프레임워크가 해당 객체들을 가져다가 생성하고, 메서드를 호출하고, 소멸시킨다. 프로그램의 제어권이 역전된 것이다.


때문에 프레임워크와 라이브러리는 어떤 차이가 있는지에 대해 IoC를 통해 설명이 가능하다. 라이브러리를 사용하는 어플리케이션은 어플리케이션의 제어 흐름을 라이브러리에 내주지 않는다. 단지 필요한 시점에 라이브러리에 작성된 객체를 적재적소에 가져다 쓸 뿐이다. 하지만 프레임워크를 사용한 어플리케이션의 경우, 어플리케이션 코드에 작성한 객체들을 프레임워크가 필요한 시점에 가져다가 프로그램을 구동하기 때문에 프로그램의 제어권이 프레임워크로 역전된다.

 

https://velog.io/@dabeen-jung/cs-Spring-Bean-Spring-Bean-%EC%83%9D%EC%84%B1-%EA%B3%BC%EC%A0%95

 

[cs] - Spring Bean, Spring Bean 생성 과정

스프링 Ioc 컨테이너가 관리하는 자바 객체를 뜻하며 필요할 때마다 IoC 컨테이너에서 가져와서 사용한다.IoC 컨테이너에 의해 생명주기가 관리되는 객체를 의미한다.사용할 때는 ¹어노테이션인

velog.io

 

 

 

 

요약

  • 빈(Bean): 스프링 컨테이너가 관리하는 자바 객체.
  • 특징: POJO, 관리 객체, 의존성 주입.
  • 빈 정의 방법: XML 설정, 자바 설정, 어노테이션 설정.
  • 빈 라이프사이클: 인스턴스화, 의존성 주입, 초기화, 사용, 소멸.
  • 초기화 및 소멸 메서드: @PostConstruct와 @PreDestroy 어노테이션을 사용하여 정의.

 

 

 

 

댓글