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

앞에서 만들어본 코드들을 화면에 나타내려고 한다. 그럴려면 컨트롤러와 뷰 템플릿이 필요하다. ex) 회원가입하면 회원가입된 결과를 html로 전송.

Member Controller가 필요하다. MemberService를 통해 회원가입하고, 데이터를 조회할 수 있어야 한다. 이를 서로 의존관계가 있다고 한다. Member Controller가 MemberService에 의존한다.

@Controller 라는 어노테이션이 있으면 스프링이 생성될 때 Controller 객체 또한 생성되어 스프링이 관리한다.

스프링이 관리하게 되면 스프링 컨테이너에 등록하고, 이 컨테이너로부터 받아서 쓰도록 바꿔야한다. 그렇지 않고 new로 생성하면 MemberController 뿐만 아니라 여러 컨트롤러들이 MemberService 객체를 가져다 쓸 수 있다.

이를 방지하기 위해 스프링컨테이너에 등록하고 쓴다. 이렇게 하면 딱 하나만 등록해서 쓸 수 있다.

컨트롤러 생성자에 @AutoWired 가 붙어있으면 스프링이 스프링 컨테이너에 있는 MemberService를 가져다가 연결시켜준다! 하지만 아래처럼만 하면 에러가 난다. MemberService를 보면 이것은 순수한 자바 클래스이기 때문에 스프링은 이 클래스에 대해 알지 못한다. @Controller처럼 어노테이션이 붙어있다면 스프링은 자기가 관리해야하는 것으로 알지만.

 @Autowired
    public MemberController(MemberService memberService){
        this.memberService = memberService;
    }

생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에 찾아서 넣어준다. 이렇게 객체 의존관계를 외부에서 넣어주는 것을 DI(Dependency Injection), 의존성 주입이라고 한다.

@Autowired를 통한 DI는 helloControlleer, MemberService 등과 같이 스프링이 관리하는 객체에서만 동작하낟. 스프링 빈으로 등록하지 않고 내가 직접 생성한 객체에서는 동작하지 않는다.

예를 들어 MemberService를 빈에 등록하지 않고 @Autowired를 하면 에러가 난다.(동작하지 않는다.)

Last updated