스프링 빈과 의존관계
스프링 프레임워크는 객체 간의 의존 관계를 효과적으로 관리하기 위해 스프링 빈과 의존관계 주입(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), 정형화되지 않은 객체의 경우 자바 코드로 직접 설정하여 스프링 빈을 등록.
끝.