[Spring] WP 5-2. SpringBoot에서의 Bean 개념 & 등록 방법 정리

소영·2025년 2월 16일

🍀 들어가면서

먼저 읽으면 좋은 글.
이 글에서 언급할 제어의 역전(IoC), 의존성 주입(DI) 등에 대한 설명이 포함되어 있다.

Spring을 쓰는 이유: Spring의 등장 배경과 특징

🔎 주제

Spring Boot에서 어떻게 Bean을 등록하고 사용할까?

✅ Bean의 개념

Bean이란?

  • 스프링 IoC 컨테이너에 의해 관리되는 객체

스프링에서는 개발자가 아닌 IoC 컨테이너에 의해 객체가 생성되고, 의존 관계가 관리되고, 필요 없는 객체가 소멸된다.

Bean의 특징

POJO(Plain Old Java Object)

  • 특별한 규약에 얽매이지 않은 순수 자바 객체.
  • 스프링 Bean은 대개 POJO 형태로 작성하여, 다른 프레임워크에 종속되지 않고 재사용성이 높다.

컨테이너 관리

  • Bean은 IoC 컨테이너에 등록되어 관리된다.
  • 등록된 Bean은 필요 시점에 컨테이너가 자동으로 의존성을 주입하고, 라이프사이클을 제어합니다.

의존성 역전(Inversion of Control)

  • Bean은 자기 스스로가 의존성을 만들거나 관리하지 않고, 오직 자신의 로직에만 집중한다.
  • 필요한 의존성(다른 Bean과의 관계)은 컨테이너가 주입해 준다.

배치(Assembly)와 설정(Configuration)

  • Bean끼리의 관계(어떤 Bean이 어떤 Bean을 참조하는지 등)는 별도의 설정 파일(자바 설정, XML, 어노테이션 스캔 등)을 통해 정의한다.
  • 덕분에 코드와 설정을 분리하여 확장성과 유연성을 극대화할 수 있다.

⚙️ 수동 등록: Configuration & Bean

@Configuration 어노테이션이 붙은 클래스는 스프링 빈을 설정하는 클래스임을 나타낸다.

@Configuration
public class AppConfig {

	// 빈 등록
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

@Bean 어노테이션을 사용해 특정 클래스를 빈으로 등록한다.
이 메소드(myService())가 여러 번 호출되더라도 실제 인스턴스는 단 하나만 생성되도록, 즉 싱글톤이 보장되도록 처리한다.

@Bean은 주로 외부에서 만든(자신이 개발한 코드가 아닌 다른 사람이 개발한 코드) 클래스의 객체를 등록하기 위해 사용되는데,
외부 라이브러리 클래스의 객체 생성 메소드를 만든 후 해당 메소드의 선언하는 방식으로 사용한다.

이처럼 자바 클래스를 이용해 Bean을 정의하고 의존 관계를 설정하는 방법을
Java Config라고 한다.

✅ 장점

  1. 타입 안전성(Type-safety)
    • 기존의 설정 방법 XML은 문자열 기반이라 오타가 발생해도 컴파일 시점에 잡히기 어렵다.
    • 자바 코드로 작성되므로 IDE의 코드 자동 완성, 컴파일 타임 체크, 리팩토링 지원이 용이하다.
  2. 간결성과 가독성
    • 자바 클래스는 필요한 만큼만 선언하고, 로직에 가까운 방식으로 Bean 정의를 표현할 수 있다.
  3. 유연한 구조
    • 설정을 여러 자바 클래스로 모듈화해서 관리하기 쉽다.
    • 조건부 로직(if/else) 등을 자바 코드에서 바로 적용 가능하다. (예: 운영 환경/테스트 환경 분기)
    • 반면 XML 설정에도 외부 설정 관리, 배포 시점에 소스 코드 수정 없이 설정만 바꾸기 등의 장점이 있으므로, 상황에 따라 혼합 사용되기도 한다.

⛔ 단점

📢 자동 등록: Annotation

어노테이션이란?

사전적으로는 '주석'이라는 의미로 소스 코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해 주는 문법 요소이다.

@Component

@Bean과 달리 직접 생성하는 클래스를 스프링 빈으로 등록하기 위해 사용한다.
빈으로 등록하고 싶은 클래스에 @Component 어노테이션을 붙인다.

@Component
public class MyComponent {
    public void sayHello() {
        System.out.println("Hello from MyComponent!");
    }
}

위 예시에서 MyComponent 클래스는 @Component 애노테이션 덕분에 Spring 컨테이너에 Bean으로 등록된다.


@Componet를 기반으로 특수화된 어노테이션들이 있다.
자주 사용하는 대표적인 예시로 @Service, @Controller, @Repository가 있다.

기능적으로는 @Component와 같이 클래스를 빈으로 등록하는 역할을 하지만 이름에서 알 수 있듯이 역할이 명확하게 구분이 되어 있다.
@Component는 일반적으로 모든 유형의 클래스에 사용될 수 있으며, 특정한 역할을 명시하지 않는다.

  • @Service: 주로 비즈니스 로직을 처리하는 서비스 계층의 클래스를 나타낸다.
  • @Controller: HTTP 요청을 처리하고, 응답을 반환하는 웹 계층을 담당하는 클래스를 나타낸다.
  • @Repository: 데이터베이스와 상호작용하는 데이터 액세스 계층의 클래스를 나타낸다.

@Service, @Controller, @Repository는 모두 @Component의 특수화된 애노테이션으로, 기본적으로는 @Component와 같은 역할을 한다.

하지만 각 애노테이션은 특정 계층이나 역할을 명확히 표현하여
개발자에게 각 클래스의 의도를 명확히 알려주는 역할을 한다.

✅ 장점

  1. 자동 등록의 편리함
    • @Configuration 클래스를 따로 만들어 일일이 @Bean 메소드를 정의할 필요 없이 필요한 클래스에 어노테이션을 붙이면 Spring이 자동으로 클래스를 빈으로 등록해준다.
  2. 코드 의도 전달 능력
    • @Service, @Controller, @Repository 등 클래스의 역할을 명확히 구분할 수 있도록 한다.
    • 개발자가 코드의 의도를 쉽게 파악할 수 있게 직관적이다.

⛔ 단점

참고자료

[JAVA] 어노테이션 (Annotation)
@Bean vs @Component

profile
블로그 이전: https://syleeblog.tistory.com/

0개의 댓글