SpringBeansAndDependencyInjection

이 문서는 스프링의 핵심 기능인 스프링 빈 등록과 의존관계 주입(DI)에 대해 정리한 내용입니다. 두 가지 주요 방식, 즉 컴포넌트 스캔과 자동 의존관계 설정자바 코드로 직접 스프링 빈 등록하기를 다룹니다.

목차

컴포넌트 스캔과 자동 의존관계 설정

내용 정리

  • 핵심 개념:

    • 스프링은 @Component 애노테이션을 비롯한 @Controller, @Service, @Repository 등과 같이 특정 애노테이션이 붙은 클래스를 자동으로 스캔하여 스프링 컨테이너에 스프링 빈으로 등록합니다.

    • 이를 통해 개발자가 별도의 설정 없이도 필요한 객체를 DI(의존성 주입) 방식으로 사용할 수 있게 됩니다.

  • 의존관계 주입 (Dependency Injection, DI):

    • 생성자, 필드, setter를 통해 스프링 컨테이너가 자동으로 객체 간의 의존성을 주입합니다.

    • 예를 들어, 회원 컨트롤러는 생성자에 @Autowired를 사용하여 회원 서비스 객체를 주입받습니다.

  • 예시 코드:

    • 회원 컨트롤러의 의존관계 주입

      package hello.hellospring.controller;
      
      import hello.hellospring.service.MemberService;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Controller;
      
      @Controller
      public class MemberController {
          private final MemberService memberService;
      
          @Autowired
          public MemberController(MemberService memberService) {
              this.memberService = memberService;
          }
      }
    • 회원 서비스와 회원 리포지토리 역시 각각 @Service@Repository 애노테이션을 통해 자동 등록됩니다.

      package hello.hellospring.service;
      
      import hello.hellospring.repository.MemberRepository;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      @Service
      public class MemberService {
          private final MemberRepository memberRepository;
      
          @Autowired
          public MemberService(MemberRepository memberRepository) {
              this.memberRepository = memberRepository;
          }
      }
      package hello.hellospring.repository;
      
      import hello.hellospring.domain.Member;
      import org.springframework.stereotype.Repository;
      import java.util.*;
      
      @Repository
      public class MemoryMemberRepository implements MemberRepository {
          // 구현 내용 생략
      }
  • 스프링 빈 등록 특징:

    • 스프링은 기본적으로 빈을 싱글톤으로 관리하여 애플리케이션 전체에서 유일한 인스턴스를 공유합니다.

    • 컴포넌트 스캔은 특정 패키지를 대상으로 하며, 보통 @SpringBootApplication 애노테이션에 의해 설정된 패키지와 그 하위 패키지가 스캔 대상이 됩니다.

핵심 요약

  • 컴포넌트 스캔: @Component, @Controller, @Service, @Repository 등의 애노테이션을 사용하여 스프링 빈을 자동 등록.

  • 자동 DI: @Autowired를 통해 스프링 컨테이너가 의존 객체를 자동 주입.

  • 싱글톤 관리: 등록된 빈은 기본적으로 싱글톤으로 관리되어, 동일한 인스턴스가 공유됨.

자바 코드로 직접 스프링 빈 등록하기

내용 정리

  • 핵심 개념:

    • 컴포넌트 스캔을 사용하지 않고, 자바 코드로 직접 스프링 빈을 설정할 수 있습니다.

    • 이 방식은 XML 설정이 아닌, 자바 기반의 설정 클래스(@Configuration을 사용)를 통해 빈을 등록하는 방법입니다.

    • 이 방법은 특히, 향후 데이터 저장소나 구현 클래스를 쉽게 교체할 수 있도록 유연하게 설정할 수 있는 장점이 있습니다.

  • 설정 방법:

    • @Configuration 애노테이션이 붙은 클래스 내에 @Bean 애노테이션을 이용하여 각 빈을 직접 등록합니다.

    • 예시 코드:

      package hello.hellospring;
      
      import hello.hellospring.repository.MemberRepository;
      import hello.hellospring.repository.MemoryMemberRepository;
      import hello.hellospring.service.MemberService;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      
      @Configuration
      public class SpringConfig {
      
          @Bean
          public MemberService memberService() {
              return new MemberService(memberRepository());
          }
      
          @Bean
          public MemberRepository memberRepository() {
              return new MemoryMemberRepository();
          }
      }
  • 장점 및 활용:

    • 컴포넌트 스캔으로 자동 등록하기 어려운 경우나, 특정 상황에 따라 빈의 구현체를 교체해야 할 때 유용합니다.

    • XML 기반 설정보다 자바 코드 기반 설정이 가독성과 유지보수 측면에서 선호됩니다.

    • DI 방식은 필드, setter, 생성자 주입이 있지만, 일반적으로 생성자 주입을 권장합니다.

핵심 요약

  • 자바 코드 기반 빈 등록: @Configuration@Bean을 사용하여 스프링 빈을 직접 등록.

  • 유연성: 컴포넌트 스캔으로 등록하지 못하는 빈이나, 동적으로 구현 클래스를 변경해야 할 때 활용.

  • 생성자 주입 권장: DI 방식 중 생성자 주입을 통해 의존성 관리를 명시적으로 할 수 있음.


참고:

  • 스프링은 컴포넌트 스캔과 자바 코드 기반 설정 두 가지 방법을 모두 지원하며, 실무에서는 정형화된 컨트롤러, 서비스, 리포지토리 같은 코드는 컴포넌트 스캔 방식을 주로 사용합니다.

  • 상황에 따라 구현 클래스를 유연하게 변경해야 하는 경우에는 자바 코드 기반의 설정을 활용합니다.

Last updated