본문 바로가기
스프링

컴포넌트 스캔 & DI(Dependency Injection)

by 리포터12 2022. 12. 19.
728x90
import org.springframework.stereotype.Controller;

@Controller
public class MemberController {

}

스프링이 실행되면,

1. 스프링 컨테이너가 생성되고,

2. @ComponentScan 이 실행된다. (이놈이 스캔 범위에 있는 Component 들을 싸그리 스캔한다.)

** 이 때, component 스캔 범위는 @ComponentScan 가 선언된 패키지를 포함 하위 경로들만 스캔한다. (상위 스캔 노노)

** 스캔 범위는 조작 가능한데, 그건 나중에 알아보자.

3. 이 때, @Controller, @Service @Repository 등의 @Component 들이 스캔된다. ( @Component 연관 돼 있으니까)

4. 스캔된 @Component 들은 객체가 생성되어 스프링 컨테이너에 저장되어 스프링에 의해 관리된다.

@Service
public class MemberService {

    private final MemberRepository memberRepository;

    @Autowired
    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }
@Controller
public class MemberController {

    private final MemberService memberService;

    @Autowired // 자동 연결 => 받아라~ 의존 주입!
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
    }
}

위의 예제에서 new MemberRepository(); / new MemberService(); 가 어디에도 보이지 않는다.

@Service / @Controller 애노테이션을 통해 스프링이 실행되면서 객체가 생성되어 이미 스프링 컨테이너에 저장된 상태!

이걸 가져다 쓰기만 하면 된다.

 

컨트롤러에 있는 코드들이 실행되기 위해선 MemberService 의 객체가 필요하다.

즉, 컨트롤러는 서비스에 '의존' 한다. 의존관계에 있는 것이다.

더 나아가, 외부에서 필요한 객체를 넣어주는 것을 '의존 주입' 이라고 한다.

 

스프링 컨테이너에는 스캔 대상들의 객체가 유일한 하나만 생성(싱글톤)되며, 

@Autowired 를 사용하면, 스프링이 각 상황에 맞는 객체의 주소값을 자동으로 할당(주입 = > 의존주입) 해준다.

MemberService  (@Autowired) -> MemberController

이를 통해, 하나의 객체를 다양한 곳에서 사용할 수 있게 된다.

 

 주의!!
@Autowired 를 통한 DI스프링이 관리하는 객체에서만 동작함. 
스프링도 자기한테 일임 안 한 사업장은 알 바 아니라는 것.
참고사항 
스프링에서 관리하는 객체를 빈(Bean) 이라 한다.
Bean 을 스프링 컨테이너에 등록할 때, 기본적으로 싱글톤으로 등록한다.
   싱글톤이란?
   유일한 객체를 만들어 그 객체만 사용하게 만드는 방식 중 하나이다.

설정 변경으로 bean이 싱글톤이 아니게 할 수도 있지만, 특별한 경우가 아니면 그대로(싱글톤) 사용한다.

 

728x90

'스프링' 카테고리의 다른 글

API에 원하는 컬럼만 추려서 반환하는 방법  (0) 2022.12.21
Bean 등록하기  (0) 2022.12.19
@ResponseBody  (0) 2022.12.19
[Spring] JPA Auditing  (0) 2022.12.18
[Spring] 인증과 인가  (0) 2022.12.17

댓글