BE Study/Spring

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

subengineer 2024. 6. 21. 15:47
package hello.hello_spring.controller;

import hello.hello_spring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {
    private final MemberService memberService;

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

}

 

기본적으로 @Controller Annotation을 넣어주면 해당 객체를 스프링 컨테이너에 넣어준다. @Autowired를 붙여주면 연관된 객체를 컨테이너에서 찾아 넣어주게 된다. 이러면 스프링이 객체 의존관계를 넣어주기 때문에 외부에서 의존성 주입을 받는다하여 DI(Dependency Injection)이라 한다.

이를 실행하면 스프링 컨테이너 내에 일치하는 빈을 찾지 못한다는 에러를 받는다.

위 그림처럼 현재 memberService를 컨테이너에 넣어주지 않았기 때문에 @Service라는 특수 annotation을 통해 컨테이너에 등록해주고 MemoryMemberRepository도 @Repository를 통해 넣어준다. 

 

스프링은 컨테이너에 빈을 등록할 때 싱글톤으로 등록한다. 이렇게 되면 하나의 빈만 존재하기 때문에 같은 스프링 빈이면 같은 인스턴스를 사용한다. 이를 통해 메모리 측면에서 이점을 얻을 수 있게된다.