컴포넌트 스캔

HUSII·2023년 1월 18일
0

스프링

목록 보기
5/8

이전까지, 스프링 빈을 스프링 컨테이너에 등록할 때는, 자바 코드의 @Bean을 사용해서 직접 등록했다.
의존관계 주입도 자동으로 됐다.

하지만 모든 객체를 @Bean을 이용해서 등록하는 것은 상당히 귀찮다.

이를 위해 스프링에서는 컴포넌트 스캔이라는 기능을 제공한다.

컴포넌트 스캔

설정 정보가 없어도 자동으로 스프링 빈을 등록하는 기능

그리고 자동으로 의존관계를 주입하는 @Autowired라는 기능도 제공한다.


기존의 스프링 컨테이너 코드

@Configuration
public class AppConfig {
	@Bean
	public Test test() {
    	return new Test(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
    	return new MemberRepository1();
    }
}

public class Test {
	MemberRepository memberRepository;
    
    Test(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
    }
}

public interface MemberRepository {
	void save();
}

public class MemberRepository1 implements MemberRepository {
	@Override
    void save();
}

컴포넌트 스캔을 적용한 코드

@Configuration
@ComponentScan
public class AppConfig {
}

@Component
public class Test {
	MemberRepository memberRepository;
    
    @Autowired
    Test(MemberRepository memberRepository){
    	this.memberRepository = memberRepository;
    }
}

public interface MemberRepository {
	void save();
}

@Component
public class MemberRepository1 implements MemberRepository {
	@Override
    void save();
}

컴포넌트 스캔을 사용하여 기존에 AppConfig에 빈을 일일이 등록하지 않고, @Component 어노테이션을 활용하여 자동으로 등록이 되게 하였다.
그리고 @Autowired를 사용하여 자동으로 의존관계가 주입되도록 하였다.


@Component를 사용하여 등록하는 빈의 이름을 설정할때는, @Component(name = "")을 사용하면 된다. 설정해주지 않으면 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다.
(MemberRepository1 -> memberRepository1)


컴포넌트 스캔은 스프링이 알아서 빈들을 컨테이너에 등록해주므로, 시작 위치를 알아야 한다.
기본적으로 설정된 시작 위치는 @ComponentScan 어노테이션이 붙은 클래스의 디렉토리부터 하위 디렉토리까지 모두 탐색하여 스프링 컨테이너에 등록해준다.


컴포넌트 스캔은 @Compnent 뿐만 아니라,
@Controller, @Service, @Repository, @Configuration 어노테이션이 붙은 클래스도 스프링 빈으로 등록해준다.

위의 어노테이션들은 기본적으로 @Component를 포함하고 있다.
-> 어노테이션에도 상속 관계라는 것이 있다.
-> 위의 어노테이션들은 @Component 기능뿐만 아니라 부가 기능이 있다.


스프링 빈을 @Component로 자동 등록하는 경우가 있고, 직접 @Bean으로 수동 등록하는 경우가 있다.
이때 두 빈의 이름이 겹쳐서 충돌한다면, 수동 빈 등록이 우선권을 가진다.
하지만 나중에는 잡기 어려운 버그가 만들어진다.
항상 이름을 겹치지 않게 설정하자.

profile
공부하다가 생긴 궁금한 것들을 정리하는 공간

0개의 댓글