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이 싱글톤이 아니게 할 수도 있지만, 특별한 경우가 아니면 그대로(싱글톤) 사용한다.
'스프링' 카테고리의 다른 글
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 |
댓글