컴포넌트 스캔과 자동 의존관계 설정

회원 컨트롤러에 의존관계 추가

controller.MemberController

@Controller
public class MemberController {
    private final MemberService memberService;

    @Autowired  //스프링이 실행될 때 컨테이너 안에 컨트롤러가 생성되고 빈에 등록되어 있는 서비스를 연결해줌. DI.
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }
}

Untitled

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와 동작하는 레포지토리로 변경하면 된다.
    }
}

상황에 따라 구현 클래스를 변경해야 하면 위와 같이 설정을 통해 스프링 빈으로 등록한다.

정형화된 컨트롤러, 서비스, 레포지토리 같은 코드는 컴포넌트 스캔으로 등록.