Study/SpringBoot

스프링 빈과 의존관계

kanado 2024. 11. 23. 18:52

스프링 프레임워크는 객체 간의 의존 관계를 효과적으로 관리하기 위해 스프링 빈의존관계 주입(DI: Dependency Injection) 개념을 제공한다. 이를 설정하는 방법은 크게 두 가지로 나뉜다. 1. 컴포넌트 스캔과 자동 의존관계 설정, 2. 자바 코드로 직접 스프링 빈 등록

 

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

1-1. 의존성 주입 (DI)

스프링은 생성자에 @Autowired 애노테이션이 붙어 있으면, 해당 객체의 의존 관계를 스프링 컨테이너에서 찾아 자동으로 주입합니다. 이처럼 객체 간의 의존 관계를 외부에서 주입하는 방식을 DI(Dependency Injection, 의존성 주입)라고 한다.

@Component
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

 

 

1-2. 컴포넌트 스캔

@Component 애노테이션이 붙은 클래스는 스프링 컨테이너가 자동으로 스프링 빈으로 등록합니다. 스프링의 컴포넌트 스캔 기능은 특정 패키지 내의 모든 @Component 애노테이션을 가진 클래스들을 찾아 자동으로 관리한다.

  • @Controller, @Service, @Repository 애노테이션은 모두 @Component를 포함하고 있어 자동으로 스프링 빈으로 등록된다.
    • @Controller: 웹 계층의 진입점 역할.
    • @Service: 비즈니스 로직을 담당.
    • @Repository: 데이터베이스 접근을 담당.

 

1-3. 예시: memberService와 memberRepository

아래와 같이 MemberService와 MemberRepository가 각각 @Service와 @Repository를 통해 자동으로 스프링 컨테이너에 등록된다.

@Service
public class MemberService {
    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
}

@Repository
public class MemberRepository {
    // 데이터 저장소 로직
}

 

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

컴포넌트 스캔을 사용하지 않고, 자바 코드로 직접 스프링 빈을 등록하는 방식도 가능하다. 이 경우 클래스에 @Service 또는 @Repository 애노테이션을 제거하고 @Configuration과 @Bean을 사용하여 빈을 명시적으로 설정한다.

@Configuration
public class SpringConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}

 

@Configuration는 해당 클래스 내부에 정의된 @Bean 메서드들을 스프링 컨테이너가 실행하여 빈 객체를 생성하고, 이를 관리한다. @Configuration을 사용하면 해당 클래스에서 정의된 @Bean 메서드들이 싱글톤 빈으로 관리되도록 보장한다.

싱글톤은 객체를 하나만 생성하고 재사용하는 디자인 패턴을 말이다. 즉, 애플리케이션이 실행되는 동안 해당 클래스의 인스턴스가 단 하나만 존재하도록 보장하는 방식이다.


3. 실무에서의 활용

  • 컴포넌트 스캔: 정형화된 계층 구조(Controller, Service, Repository)에서 주로 사용.
  • 수동 등록: 상황에 따라 구현 클래스를 변경해야 하거나( ex. new MemoryMemberRepository -> new MemoryRepository), 정형화되지 않은 객체의 경우 자바 코드로 직접 설정하여 스프링 빈을 등록.

 

끝.