개발놀이터

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

Spring/Spring

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

마늘냄새폴폴 2021. 12. 27. 17:57

이 포스팅은 인프런 김영한 님의 스프링 핵심 원리 기본 편을 보고 각색한 포스팅입니다. 자세한 내용은 강의를 확인해주세요

 

https://coding-review.tistory.com/84

 

싱글톤과 @Configuration

이 포스팅은 인프런 김영한 님의 스프링 핵심 원리 기본 편을 보고 각색한 포스팅입니다. 자세한 내용은 강의를 확인해주세요 싱글톤 패턴이란 무엇일까? 싱글톤 패턴이란 클래스의 인스턴스가

coding-review.tistory.com

앞서 우리는 @Configuration의 비밀과 싱글톤 컨테이너인 스프링 컨테이너에 대해서 자세히 알아봤다. 근데 여기서 한가지 문제가 있다. AppConfig가 지금은 작으니까 상관없는데 애플리케이션이 점점 커지면 스프링 빈으로 등록해야 하는것이 수십개 수백개가 될텐데 일일히 저걸 관리해주는 AppConfig를 만들고있자니 유지보수하기 여간 까다로운게 아니다.

 

그래서 스프링에선 컴포넌트 스캔이라는 기능을 제공한다.

 

코드로 바로 확인해보자

 

@Configuration
@ComponentScan
public class AutoAppConfig {
}

이렇게 AutoAppConfig를 만들어놓고 스프링 빈으로 등록할 것들에 @Component 어노테이션을 붙여주기만 하면 자동으로 스프링 빈으로 등록이 된다. 

 

하지만 여기서 문제가 있다. 기존 AppConfig는 의존관계 주입을 명시적으로 표기함으로써 자바코드만 봐도 누가 어떤 의존관계를 가지고 있는지 한눈에 파악하기 쉬웠다. 하지만 @Component 어노테이션을 붙여주는 클래스에서 누가 어떤 의존관계를 가지고 있는지 확인할 방법이 없다. 어떻게 해결해야할까?

 

자동 의존관계 주입이라고도 불리는 @Autowired 어노테이션을 사용하면 된다.

@Component
public class MemberServiceImpl implements MemberService{

    private MemberRepository memberRepository;

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

    @Override
    public void join(Member member) {
        memberRepository.save(member);
    }

    @Override
    public Member findMember(Long memberId) {
        return memberRepository.findById(memberId);
    }

    public MemberRepository getMemberRepository() {
        return memberRepository;
    }
}

@Autowired의 기본 조회 전략은 타입이 같은 빈을 찾아서 주입한다는 것이다. 우리가 앞서 했던 ac.getBean(MemberRepository.class)와 동일하다고 이해하면 된다. @Autowired에 대해서는 다음 포스팅에서 더 자세히 다루도록 하겠다.

 

이렇게 AutoAppConfig를 통해 컴포넌트 스캔에 대해서 간단히 알아봤는데 우리는 실제로 개발할 때 AutoAppConfig와 같은 클래스를 만들지 않아도 된다. 왜냐하면 기본적으로 스프링부트를 사용하면 만들어지는 메인메소드에 붙어있는 어노테이션인 @SpringBootApplication을 들어가보면 컴포넌트스캔이 붙어있는 것을 확인할 수 있다. 

 

또한 컴포넌트 스캔의 용도 뿐만 아니라 다음 어노테이션이 있으면 스프링은 부가 기능을 수행한다.

-@Controller : 스프링 MVC 컨트롤러로 인식

-@Repository : 스프링 데이터 접근 계층으로 인식하고 데이터 계층의 예외를 스프링 예외로 반환해준다.

-@Configuration : 앞서 보았듯이 스프링 설정 정보로 인식하고, 스프링 빈이 싱글톤을 유지하도록 추가처리를 한다.

-@Service : 사실 @Service는 특별한 처리를 하지 않는다. 대신 개발자들이 핵심 비즈니스 로직이 여기에 있겠구나 하고 비즈니스 계층을 인식하는데 도움이 된다.

 

 

이번 포스팅에서는 컴포넌트스캔과 자동의존관계 주입에 대해서 간단하게 살펴봤다. 다음포스팅에서는 @Autowired에 대해서 깊이있게 파헤쳐볼 것이다. 

'Spring > Spring' 카테고리의 다른 글

MVC 프레임워크 만들기  (0) 2022.01.06
@Autowired  (0) 2021.12.28
싱글톤과 @Configuration  (0) 2021.12.27
스프링을 사용해서 DI 구현하기  (0) 2021.12.26
순수한 자바로 DI 구현하기  (0) 2021.12.21