컴포넌트 스캔과 의존관계 자동 주입

이연희·2022년 7월 6일
0

Spring

목록 보기
66/105

컴포넌트 스캔과 의존관계 자동 주입

스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 그리고 의존관계를 자동으로 주입하는 @Autowired 기능을 제공한다.
참고) @ComponentScan을 설정 정보에 붙여주면 컴포넌트 스캔을 사용할 수 있다. @Configuration이 붙은 설정 정보도 자동으로 등록되기 때문에 AppConfig, TestConfig 같은 만들어두었던 설정 정보도 함께 등록되고 실행된다. 그래서 excludeFilters를 이용해서 설정정보는 컴포넌트 스캔 대상에서 제외했다.

@Configuration
@ComponentScan(
        excludeFilters = @ComponentScan.Filter(type= FilterType.ANNOTATION,classes = Configuration.class)
)

@Autowired 어노테이션을 붙여서 의존관계 자동 주입을 한다. 스프링 컨테이너에서 MemberRepository 타입의 빈을 찾아서 주입해준다. 자동으로 ac.getBean(MemberRepository.class) 이 코드가 들어간다고 생각하면 된다.

@Component
public class MemberServiceImpl implements MemberService{

    private final MemberRepository memberRepository;

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

@Controller: 스프링 MVC 컨트롤러로 인식한다.
@Repository: 스프링 데이터 접근 계층으로 인식하고, 데이터 계층의 예외를 스프링 예외로 변환해준다.
@Configuration: 설정 정보로 인식하고 스프링 빈이 싱글톤을 유지하도록 추가 처리한다.
@Service: 핵심 비지니스 로직이 여기에 있구나 라고 비지니스 계층을 인식하는데 도움이 된다.

자동 빈 등록 vs 수동 빈 등록

아래의 경우 수동 빈 등록이 우선권을 가진다. 수동 빈이 자동 빈을 오버라이딩 해버린다.

//자동
@Component
     public class MemoryMemberRepository implements MemberRepository {}

//수동
public class AutoAppConfig {
     @Bean(name = "memoryMemberRepository")
     public MemberRepository memberRepository() {
         return new MemoryMemberRepository();
     }
}

수동 빈 등록시 로그

Overriding bean definition for bean 'memoryMemberRepository' with a different
definition: replacing

스프링 부트에서 수동 비 등록과 자동 빈 등록이 충돌할 때 오류가 발생하도록 기본 값을 바꿨다.

수동 빈 등록, 자동 빈 등록 오류시 스프링 부트 에러

Consider renaming one of the beans or enabling overriding by setting
spring.main.allow-bean-definition-overriding=true
profile
공부기록

0개의 댓글