컴포넌트 스캔과 자동 의존관계 설정
회원 컨트롤러에 의존관계 추가
controller.MemberController
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired //스프링이 실행될 때 컨테이너 안에 컨트롤러가 생성되고 빈에 등록되어 있는 서비스를 연결해줌. DI.
public MemberController(MemberService memberService){
this.memberService = memberService;
}
}
@Autowired 가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아서 넣어준다.@Autowired에 의해 스프링이 주입해준다.
Controller → Service → Repository
싱글톤으로 등록. (기본으로 하나만 등록하고 공유해서 사용) 따라서 같은 스프링 빈이면 같은 인스턴스이다. 싱글톤이 아닐 수도 있음.
컴포넌트 스캔 원리
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록된다.
@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문이다.
@Controller , @Service , @Repository 도 @Component 를 포함하고 있어 스프링 빈에 자동으로 등록된다.
자바코드로 직접 스프링 빈 등록하기
@Configuration //코드로 직접 스프링 빈 등록하기. 코드 수정이 유리하다.
public class SpringConfig {
@Bean
public MemberService memberService() {
return new MemberService(memberRepository());
}
@Bean
public MemberRepository memberRepository() {
return new MemberRepository(); //db와 연결할 때 이부분만 db와 동작하는 레포지토리로 변경하면 된다.
}
}
상황에 따라 구현 클래스를 변경해야 하면 위와 같이 설정을 통해 스프링 빈으로 등록한다.
정형화된 컨트롤러, 서비스, 레포지토리 같은 코드는 컴포넌트 스캔으로 등록.