스프링 컨테이너 내의 스프링 빈으로 등록하기 위한 방법에는 두 가지가 있습니다.
오늘은 컴포넌트 스캔과 자동 의존관계 설정에 대해 알아보겠습니다.
컴포넌트 스캔은 @Component 어노테이션이 있으면 스프링 빈으로 자동 등록됨을 말합니다.
@Controller, @Service, @Repository 어노테이션 모두 @Component를 포함하고 있기 때문에 이 세 개의 어노테이션도 스프링 빈으로 자동 등록 되게 됩니다.
컴포넌트 스캔과 자동 의존관계 설정
회원 컨트롤러와 회원 서비스, 회원 리포지토리를 사용하여 구현해보겠습니다.
< MemberController >
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
}
컨트롤러에는 @Controller 어노테이션을 등록해줘야 합니다.
그래야 스프링 빈으로 자동 등록이 되어 스프링이 관리하게 됩니다. 즉, 스프링 컨테이너에 MemberController가 생성되는 것입니다.
이때 MemberService와 MemberRepository를 사용하기 위해서는 의존 관계가 필요합니다.
MemberController -> MemberService -> MemberRepository 순으로 의존 관계를 맺습니다.
위의 MemberController 코드를 보면 생성자에 @Autowired 어노테이션이 있는 것을 확인할 수 있는데 이는 스프링이 스프링 컨테이너에 있는 MemberService를 가져와서 MemberController에 연결시킨다는 것을 의미합니다. 이렇게 객체 의존관계를 외부에서 찾아 넣어주는 것을 DI (Dependency Injection), 의존성 주입이라고 합니다.
@Autowired 어노테이션에 의해 스프링이 주입해주게 되는 것이죠.
하지만 위처럼 의존관계를 맺기 위해서는 MemberService 또한 스프링 컨테이너 안의 스프링 빈으로 등록되어 있어야 합니다.
그래야지 스프링이 스프링 컨테이너에서 MemberService를 찾아 MemberController에게 주입시킬 수 있기 때문입니다.
< MemberService >
@Service
public class MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
이처럼 @Service로 MemberService 또한 스프링 빈으로 등록하였습니다. 이제 MemberService는 MemberRepository와 의존관계를 맺어야 합니다. 따라서 생성자에 @Autowired를 사용하여 객체 생성 시점에 스프링 컨테이너에서 MemberRepository 를 찾아 주입하도록 하였습니다.
< MemberRepository >
@Repository
public implement MemberRepository implements MemberRepository {}
참고
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 싱글톤이 기본입니다. (스프링 컨테이너에 하나만 등록하고 공유함을 말합니다.) 따라서 같은 스프링 빈이면 모두 같은 인스턴스 입니다.