[Spring] 컴포넌트 스캔(Component Scan)과 자동 의존관계(Auto Dependency Injection)

JE·2023년 7월 27일

SPRING

목록 보기
1/4

컴포넌트 스캔이란?

@Component를 명시하여 빈을 추가하는 방법이다.
(컴포넌트 스캔이외에도 자바 코드로 직접 스프링 빈을 등록하는 방법이 있다.)

컴포넌트 스캔의 대상

@Component 어노테이션이 붙어있는 클래스들은 전부 컴포넌트 스캔의 대상이 된다.

  • @Component: 컴포넌트 스캔에서 사용
  • @Controller: 스프링 MVC 컨트롤러에 사용
  • @Service : 스프링 비즈니스 로직에서 사용
  • @Repository : 스프링 데이터 접근 계층에서 사용
  • @Configuration : 스프링 설정 정보에서 사용

@Configuration, @Service, @Repository, @Controller 등의 어노테이션에도 전부 @Component이 포함되어 있어 자동으로 컴포넌트 스캔의 대상이 된다.

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

생성자에 @Autowired 를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 의존 객체의 타입에 해당하는 bean을 찾아 주입한다. 생성자가 1개만 있으면 @Autowired 는 생략할 수 있다.

@Service
public class MemberService {
	private final MemberRepository memberRepository;

	@Autowired
    public MemberService(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }
} // 회원 컨트롤러가 회원서비스와 회원 리포지토리를 사용할 수 있게 의존관계를 준비했다.

이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라 한다. 여기서는 @Autowired에 의해 스프링이 주입해준다.


참고로 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록한다. 싱글톤은 프로그램에서 해당 빈의 인스턴스를 오직 하나만 생성해서 재사용하는 것을 말한다. 수많은 요청이 발생하는 서비스에서 기존에 요청마다 인스턴스를 생성하지 않기 때문에 효율적인 메모리 사용이 가능하다는 큰 장점을 가진다.

0개의 댓글