스프링 빈을 등록하는 2가지 방법
1. 컨포넌트 스캔과 자동 의존관계의 방식
why ?
@Controller, @Service, @Repository 가 아니라
사실 @Component 에노테이션이다.
각 에노테이션 안에 @Component가 있는 것을 확인할 수 있다.
또한 주석으로
"스프링에서는 이 에노테이션이 @Component의 전문화 역할도 수행하여 클래스 경로 스캔을 통해 구현 클래스를 자동으로 탐지할 수 있습니다."
라고 설명해준다.
그래서 스프링이 올라올 때 @Component와 관련된 에노테이션이 있으면 스프링이 객체를 하나씩 생성해서 스프링 컨테이너에 등록한다.
멤버 컨트롤러가 멤버 서비스를 통해 조회하고, 회원가입을 할 수 있어야 한다. 이런 것을 의존관계가 있다고 표현함
@autowired는 연관관계를 알려주는 느낌! (생성자를 통해 서로 쓸 수 있게)
참고로: 스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본적으로 싱글톤으로 등록한다(유일하게 하나만 등록해서 공유한다) 따라서 같은 스프링 빈이면 모두 같은 인스턴스다. 설정으로 싱글톤이 아니게 등록할 수 있지만, 특별한 경우 빼고 대부분 싱글톤으로 등록함
orderSeriver가 추가로 있을 경우에 같은 memberRepository를 쓴다 (다른 인스턴스를 생성하지 않는다는 게)
싱글톤 패턴! (메모리 절약의 효과도 있음 다른 효과도 알아보자)
Q1) 아무 곳이나 @Component를 써도 되나요 ?
@SpringBootApplication 에노테이션이 붙은 (실행문)의 같거나 하위의 패키지만 스캔을 해준다!
(설정 시 가능하긴 하지만 그렇게 하지 않음)
HelloSpringApplication이 포함된 hello.hellospring 패키지의 같은 패키지나 하위 패키지만 가능
demo패키지는 포함이 안된다!
2. 자바 코드로 직접 스프링 빈 등록하기
1.의 경우 @Controller, @Service, @Repository 등을 통해 @ComponentScan으로 자동으로 등록하고, @Autowired를 통해 자동으로 연결해줬다.
이번에는 하나씩 직접 등록을 해볼 것이다.
@Configuration이 붙어 있으면 스프링 빈에 등록하라고 인식함 (클래스 단위로 Spring의 설정 클래스임을 나타냄)
(@bean 에노테이션이 붙은 대상을)
이러면 memberservice가 스프링 빈에 등록이 된다.
@Bean 어노테이션은 @Configuration 어노테이션이 붙은 클래스에서 메서드에 적용
@Bean이 붙은 메서드는 Spring IoC 컨테이너에 의해 생성된 빈 객체를 반환하는 역할을 수행한다.
memberservice에 memberRepository를 넣어줬다. (둘다 등록이 됨)
스프링 빈에 등록되어 있는 memberRepository를 memberservice에 넣어줌!
그러나
Controller는 어떻게 할 수가 없다. 어차피 스프링이 관리하는 것이기 때문에
에노테이션을 통해 등록해 컨포넌트 스캔을 이용해야 하고
를 통해서 자동으로 연결해줘야 한다!
컨포넌트 스캔과 자동 의존관계의 방식과 자바 코드로 직접 스프링 빈 등록하기의 장단점