Spring Bean이란 무엇일까?

2025. 6. 13. 12:03·탐구하기

Spring Bean은 Spring Framework가 관리하는 객체를 의미합니다. 다시 말해, Spring 컨테이너가 생성하고 생명주기를 관리하는 객체를 Spring Bean이라고 합니다.


📌 1. Spring Bean이란?

  • Spring은 객체를 생성하고 의존성을 주입하여 애플리케이션을 구성합니다.
  • Spring 컨테이너는 설정 파일 또는 애노테이션을 통해 Bean 정의를 읽고, 애플리케이션 실행 시 객체를 생성하고 관리합니다.
  • 이때 컨테이너가 생성하고 관리하는 객체를 Spring Bean이라고 합니다.

즉, 일반적인 Java 객체지만, Spring에 의해 등록되고 관리되면 그것을 “Spring Bean”이라고 부릅니다.

스프링 빈의 특징:

  • 컨테이너에 의해 관리: 스프링 컨테이너(ApplicationContext)가 빈의 생명주기(생성, 초기화, 소멸)를 전적으로 관리합니다. 개발자는 객체 생성 및 관리에 대한 부담을 덜 수 있습니다.
  • 의존성 주입: 스프링 컨테이너는 빈들 간의 의존성을 자동으로 해결하고 주입합니다. 이를 통해 느슨한 결합(Loose Coupling)을 촉진하고, 테스트 용이성을 높입니다.
  • 싱글톤(기본): 특별히 지정하지 않는 한, 스프링 빈은 기본적으로 싱글톤 스코프를 가집니다. 즉, 컨테이너 내에서 해당 빈의 인스턴스는 하나만 존재합니다.
  • POJO(Plain Old Java Object): 스프링 빈은 특별한 인터페이스를 구현하거나 특정 클래스를 상속할 필요가 없는 일반적인 자바 객체입니다. 스프링은 POJO를 컨테이너에 등록하여 빈으로 활용할 수 있게 합니다.

📌 2. Spring Bean을 정의하는 방법

Spring Bean은 Spring Framework가 관리하는 객체를 의미합니다. 다시 말해, Spring 컨테이너가 생성하고 생명주기를 관리하는 객체를 Spring Bean이라고 합니다.

Spring Bean을 정의하는 방법은 크게 3가지가 있습니다:

✅ 1. XML 기반 설정

이 방식은 스프링 초기부터 사용되던 전통적인 방법입니다. applicationContext.xml과 같은 XML 파일에 <bean> 태그를 사용하여 빈을 정의합니다.

<?xml version="1.0" encoding="UTF-8"?>
<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.MyService">
        <property name="myRepository" ref="myRepository"/>
    </bean>

    <bean id="myRepository" class="com.example.MyRepository"/>

</beans>
  • 장점:
    • 설정 내용을 한눈에 파악하기 용이합니다.
    단점:
    • XML 파일이 커지면 관리하기 어렵습니다.
    • 컴파일 시점에 오류를 발견하기 어렵습니다 (런타임 오류).
    • 최근 스프링 개발에서는 잘 사용되지 않습니다.

✅ 2. 애노테이션 기반 설정 ( @Component, @Service, @Repository, @Controller )

가장 보편적이고 편리한 빈 정의 방식입니다. 스프링은 특정 패키지(또는 패키지들)를 스캔하여 @Component 또는 @Component를 포함하는 스테레오타입 애노테이션(@Service, @Repository, @Controller, @RestController)이 붙은 클래스를 자동으로 스프링 빈으로 등록합니다.

// com.example.MyService.java
package com.example;

import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service // 이 클래스를 스프링 빈으로 등록
public class MyService {

    private final MyRepository myRepository;

    @Autowired // MyRepository 빈을 주입
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    public void doSomething() {
        myRepository.save();
        System.out.println("MyService: Doing something...");
    }
}

// com.example.MyRepository.java
package com.example;

import org.springframework.stereotype.Repository;

@Repository // 이 클래스를 스프링 빈으로 등록
public class MyRepository {

    public void save() {
        System.out.println("MyRepository: Saving data...");
    }
}

그리고 @ComponentScan으로 해당 클래스를 스캔하여 Bean으로 등록할 수 있게 합니다:

// com.example.AppConfig.java (컴포넌트 스캔 설정)
package com.example;

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

@Configuration
@ComponentScan(basePackages = "com.example") // "com.example" 패키지 이하를 스캔하여 빈을 찾음
public class AppConfig {
    // 여기에 @Bean 메소드를 추가할 수도 있음
}

또는 스프링 부트 애플리케이션의 경우 @SpringBootApplication 애노테이션이 @ComponentScan을 포함하고 있으므로 별도 설정 없이 자동으로 스캔됩니다.

 

장점:

  • 가장 간편하고 생산성이 높습니다.
  • 클래스 레벨에서 애노테이션만 붙이면 되므로 설정이 분리되지 않고 해당 클래스에 명시됩니다.
  • 대부분의 스프링 애플리케이션에서 사용되는 방식입니다.

단점:

  • 스캔 대상 패키지가 너무 넓으면 불필요한 스캔이 발생할 수 있습니다.
  • 일부 복잡한 설정(예: 특정 조건에 따라 빈을 다르게 생성)에는 부적합할 수 있습니다 (이 경우 @Configuration, @Bean과 함께 사용).

✅ 3. Java Config 기반 설정 (@Bean)

스프링 3.0부터 도입된 방식으로, 자바 클래스에 @Configuration 애노테이션을 붙이고, 해당 클래스 내부에 @Bean 애노테이션이 붙은 메소드를 사용하여 빈을 정의합니다.

// com.example.AppConfig.java
package com.example;

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

@Configuration // 이 클래스가 스프링 설정 클래스임을 명시
public class AppConfig {

    @Bean // 이 메소드가 반환하는 객체를 스프링 빈으로 등록
    public MyService myService() {
        // MyService 빈이 MyRepository 빈에 의존한다고 가정
        return new MyService(myRepository());
    }

    @Bean
    public MyRepository myRepository() {
        return new MyRepository();
    }
}

장점:

  • 타입 기반의 설정을 할 수 있어 안전합니다.
  • 컴파일 시점에 오류를 발견하기 쉽습니다.
  • 리팩토링이 용이합니다.
  • 최근 스프링 부트 프로젝트에서 많이 사용됩니다.

단점:

  • 설정 클래스가 많아지면 관리하기 어려울 수 있습니다 (단, 컴포넌트 스캔과 함께 사용하면 보완됨).

📌 3. 정리

구분 방식 장점 단점

XML 설정 <bean> 태그 사용 설정이 명확함 장황하고 유지보수 어려움
애노테이션 기반 @Component, @Service 등 간단하고 직관적 자동 등록으로 명시성 떨어질 수 있음
Java Config @Bean 사용 자바 코드로 유연하게 설정 가능 코드가 길어질 수 있음

 

'탐구하기' 카테고리의 다른 글

SpringBoot와 Spring, 이 둘의 차이점은 무엇일까?  (1) 2025.06.16
Spring Bean의 생명주기는 어떻게 될까?  (0) 2025.06.13
AWS EC2 서버 구성 및 배포, AMI 생성 및 복제  (0) 2025.06.10
RestAPI란 무엇일까??  (1) 2025.06.02
빌더패턴은 무엇일까?  (0) 2025.06.02
'탐구하기' 카테고리의 다른 글
  • SpringBoot와 Spring, 이 둘의 차이점은 무엇일까?
  • Spring Bean의 생명주기는 어떻게 될까?
  • AWS EC2 서버 구성 및 배포, AMI 생성 및 복제
  • RestAPI란 무엇일까??
ayinyun
ayinyun
ayinyun 님의 블로그 입니다.
  • ayinyun
    ayinyun 님의 블로그
    ayinyun
  • 전체
    오늘
    어제
    • 분류 전체보기 (75)
      • SQL 개발 공부 (8)
      • JAVA 개발 공부 (4)
      • JavaScript(JS) (1)
      • React (1)
      • 탐구하기 (38)
      • KPT회고록 (14)
      • SpringBoot (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
ayinyun
Spring Bean이란 무엇일까?
상단으로

티스토리툴바