Dev-기타/BackEnd

스프링 프레임워크의 빈(Bean)이란

lafortune 2025. 5. 22. 12:24
반응형

"빈"이란?

스프링 컨테이너가 직접 생성하고, 관리하는 자바 객체

(즉, 그냥 자바 객체지만, "스프링이 관리하는" 객체라는 점이 다릅니다.)

스프링에서는 이런 빈(Bean)들이 서로 연결되고, 필요한 곳에 주입되어(Dependency Injection) 애플리케이션 전체를 구성하게 됩니다.


빈의 역할과 필요성

스프링 없이 우리가 평소에 자바 애플리케이션을 만든다고 가정해볼까요?
A라는 클래스가 B라는 객체를 써야 하면, A 안에서 B를 직접 new B()로 생성합니다.

public class A {
    private B b = new B(); // 직접 생성!
}

 

이 방식은 단순하긴 한데,

  • 테스트하기 어렵고
  • 결합도가 높아지고
  • 다른 객체로 대체하거나 설정을 바꿀 때 코드 수정이 필요

이런 문제들이 생깁니다.

여기서 스프링의 "빈" 개념이 등장합니다!

  • 스프링 컨테이너가 모든 객체를 생성해서 관리합니다.
  • 내가 직접 new로 만들지 않고, 필요한 객체(빈)는 스프링이 "알아서" 만들어 줍니다.
  • 이 덕분에 코드가 유연해지고, 테스트하기 쉬워지며, 구성(설정)만 바꿔도 원하는 객체로 대체할 수 있게 됩니다.

빈은 어떻게 등록하고 사용하는가?

스프링에서 빈을 등록하는 방법은 여러 가지가 있지만, 이번 글에서는 XML 기반 설정 방식으로 설명하겠습니다.

1) XML로 빈 등록

아래처럼 spring-servlet.xml 같은 설정 파일에 <bean> 태그로 클래스를 등록합니다.

 
<bean id="homeController" class="com.controller.HomeController"/>
 
  • id : 빈의 이름(식별자)입니다.
  • class : 빈으로 만들 실제 자바 클래스의 경로를 적습니다.

2) 어노테이션으로 빈 등록

실무에서는 보통 자바 코드에 @Component, @Controller, @Service, @Repository 같은 어노테이션을 붙여 빈으로 등록합니다.

 

https://lafortune.tistory.com/73

 

Maven과 XML로 시작하는 Spring 4.3.x 웹 애플리케이션

해당 블로그글은 레거시 스프링 프레임워크를 파악하고 학습하고자 작성한 블로그 글입니다.프로젝트 소스코드 및 필요한 파일들은 하단에 작성했습니다. (참고로, 스프링 프레임워크 4.3.16은 2

lafortune.tistory.com

포스팅에서 보면 spring-servlet.xml에서 '<context:component-.../>' 이 부분입니다.

 

@Controller
public class HomeController {
    ...
}
 

이렇게 어노테이션을 붙이면, 스프링이 자동으로 해당 클래스를 빈으로 등록해서 관리합니다.


빈은 어떻게 주입(사용)되는가?

스프링은 필요한 객체(빈)를 자동으로 찾아서 넣어줍니다. 예를 들어,

@Controller
public class HomeController {
    @Autowired
    private UserService userService; // UserService도 빈!
}
 
 

여기서 @Autowired는 스프링에게 UserService라는 타입의 빈을 찾아서 넣어달라는 표시입니다.
덕분에 직접 new로 생성하지 않아도 스프링이 알아서 주입해줍니다.

 

실무에서 자주 쓰는 스프링 빈 관련 어노테이션 정리

스프링에서는 빈의 등록과 주입, 그리고 특별한 용도의 빈을 만들 때 여러 가지 어노테이션을 제공합니다. 대표적인 어노테이션들을 정리해볼게요.

1. @Component

  • 모든 스프링 빈의 "기본형".
  • 이 어노테이션이 붙은 클래스는 컴포넌트 스캔 대상으로 인식되어 빈으로 자동 등록됩니다.

2. @Controller

  • 웹 요청을 처리하는 컨트롤러 빈을 만들 때 사용합니다.
  • 내부적으로는 @Component의 특수한 형태입니다.

3. @Service

  • 비즈니스 로직을 담당하는 서비스 계층 빈을 만들 때 사용합니다.
  • 역시 @Component의 하위 어노테이션이며, 특별한 기능이 붙는 것은 아니지만 계층 구분과 가독성을 위해 구분해서 사용합니다.

4. @Repository

  • 데이터베이스 접근 계층(DAO)에 붙입니다.
  • @Component의 하위 개념이지만, 스프링이 JDBC 예외를 자동으로 변환해주는 AOP 기능이 추가로 적용됩니다.

5. @Autowired

  • 의존성 주입(Dependency Injection) 시 사용.
  • 타입을 기준으로 컨테이너에 있는 빈을 찾아서 주입해줍니다.
  • 필드, 생성자, setter 등에 붙일 수 있습니다.

6. @Qualifier

  • @Autowired와 함께 쓰며, 같은 타입의 빈이 여러 개일 때 구체적으로 어떤 빈을 주입할지 지정할 수 있습니다.
@Autowired
@Qualifier("mainUserService")
private UserService userService;

7. @Value

  • 프로퍼티 파일 등의 값을 빈에 주입할 때 사용합니다.
@Value("${spring.datasource.url}")
private String dbUrl;

8. @Bean (Java Config에서만 사용)

  • 자바 설정 파일(@Configuration이 붙은 클래스)에서 직접 빈을 등록할 때 사용합니다.
  • XML 대신 자바 코드로 빈을 생성하고자 할 때 사용합니다.

요약하면,

  • **빈(Bean)**은 "스프링이 생성하고 관리하는 자바 객체"다.
  • 직접 new로 객체를 만들지 않고, 설정이나 어노테이션으로 빈을 등록하면 스프링이 알아서 필요한 곳에 넣어준다.
  • 빈을 사용하면 코드가 더 유연하고, 테스트하기 좋고, 변경에 강한 애플리케이션을 만들 수 있다.
반응형