[Spring Boot] 빈(Bean)

조애옹·2025년 6월 16일

🔍 빈(Bean)이란?

  • 스프링 컨테이너가 생성하고 관리하는 자바 객체
  • 스프링은 사용자가 직접 객체를 new로 생성하지 않아도, IOC 컨테이너가 객체(빈)를 만들고, 관리하며, 필요한 곳에 주입해주는 구조를 가짐
  • IOC(Inversion of Control, 제어의 역전): 객체의 생성과 의존성 관리를 개발자가 아닌 프레임워크가 대신해주는 개념

✅ 빈 등록 방법

1. 자동 등록

@Component
public class MyComponent {
    ...
}

다음 어노테이션이 붙은 클래스는 자동으로 빈으로 등록됨:

  • @Component
  • @Service: 서비스 계층에서 사용
  • @Repository: 데이터 접근 계층에서 사용
  • @Controller: 웹 컨트롤러 계층에서 사용

내부적으로는 모두 @Component의 변형이지만, 역할을 구분하기 위해 사용함

2. 수동 등록 (@Configuration + @Bean)

@Configuration
public class AppConfig {
    
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

보다 명시적으로 등록하고 싶을 경우 사용함


✅ 빈의 생명주기 (Lifecycle)

생성 → 의존성 주입 → 초기화 → 사용 → 소멸

빈의 특정 시점에 로직을 추가하고 싶을 땐 어노테이션을 사용함

@PostConstruct
public void init() {
    System.out.println("초기화");
}
  • @PostConstruct: 빈 생성 후 초기화 작업
  • @PreDestroy: 컨테이너 종료 시 정리 작업

✅ 빈의 스코프 (Scope)

기본적으로 싱글톤(singleton)으로 관리되지만 스코프를 지정할 수 있음

@Scope("prototype")
@Component
public class MyPrototypeBean { ... }
  • singleton: 기본값. 애플리케이션 전체에서 1개 인스턴스 사용
  • prototype: 요청할 때마다 새로운 인스턴스 생성
  • request: HTTP 요청마다 1개 (웹 환경 전용)
  • session: 세션마다 1개 (웹 환경 전용)

✅ 의존성 주입(DI)

  • 객체가 필요한 의존 객체를 직접 생성하는 것이 아니라, 외부로부터 전달(주입)받는 방식
  • 객체 간 결합도를 낮춰 유지보수와 테스트가 쉬워짐
@RequiredArgsConstructor // 생성자 주입을 자동으로 만들어주는 Lombok 어노테이션
@Component
public class OrderService {
    private final ProductRepository productRepository;
}
주입 방식설명특징
생성자 주입생성자를 통해 주입가장 권장됨, 불변성, 테스트 용이
필드 주입필드에 직접 주입간편하지만 테스트/유지보수에 불리함
Setter 주입Setter 메서드 통해 주입선택적 의존성 처리 가능

@Autowired

  • Spring이 자동으로 해당 타입의 빈을 주입해줌

생성자 주입

@Component
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired 
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}
  • final 키워드 사용 가능 → 불변성 보장
  • 테스트 시 생성자 파라미터로 mock 주입 용이
  • 대부분의 실무에서는 생성자 주입을 표준으로 사용

필드 주입

@Component
public class MemberService {
    @Autowired
    private MemberRepository memberRepository;
}
  • 간단하지만 테스트에서 주입 어려움

Setter 주입

@Component
public class MemberService {

    private MemberRepository memberRepository;

    @Autowired
    public void setMemberRepository(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}
  • 선택적 의존성 또는 순환참조가 필요할 때 사용
  • 필수가 아닌 경우에만 권장
profile
아자잣

0개의 댓글