의존성 주입
현재 클래스가 의존하는 다른 클래스들을 외부에서 주입시킨다.
- 의존성 주입 방법 3가지
- 생성자 주입
- Setter 주입
- 필드 주입
스프링은 의존성 주입 컨테이너로서의 기능을 한다. 스프링은 베이스 패키지와 그 하위 패키지에서 자바 빈을 찾아 스프링의 의존성 주입 컨테이너 오브젝트, 즉 ApplicationContext에 등록한다. 애플리케이션 실행 중 어떤 오브젝트가 필요한 경우 의존하는 다른 오브젝트를 찾아 연결해 준다. (@Autowired)
- @Component
@Component는 스프링에게 이 클래스를 자바 빈으로 등록시키라고 알려준다.
(@Service 도 이 어노테이션을 달고 있음.)
@Component를 클래스에 달기만 하면 무조건 스프링이 검색해서 등록을 해주는 것이 아니라 @ComponentScan 어노테이션이 어떤 클래스에 있어야만 컴포넌트 스캐닝을할 수 있다.
@ComponentScan은 @SpringBootApplication에 포함하고 있다.
디스패처 서블릿
http 요청이 서버로 전달되면 웹 서버는 받은 요청을 해석하여 서블릿 컨테이너가 해당되는 서블릿 클래스를 실행한다.
스프링 부트는 어노테이션과 서브 클래스를 적절히 이용해 개발자들이 반복 작업과 코드를 최소화할 수 있도록 도와준다. 스프링 부트는 DispatcherServlet이라는 서블릿 서브 클래스를 이미 구현하고 있어 개발자가 서블릿 클래스를 작성하지 않아도 된다.
즉,
1. HttpServlet을 상속받을 필요 x
2. doGet을 오버라이드할 필요 x
3. HttpServletRequest를 직접 파싱할 필요 x
4. HttpServletResponse를 직접 작성할 필요 x
스프링 부트 애플리케이션 실행 과정
- 스프링 부트 애플리케이션 시작
- @ComponentScan 어노테이션이 있는 경우 베이스 패키지와 그 하위 패키지에서 @Component가 달린 클래스를 찾음
- 필요한 경우 @Component가 달린 클래스의 오브젝트 생성. 이때 다른 오브젝트에 의존한다면 멤버 변수로 다른 클래스를 갖고 있다면 그 멤버 변수 오브젝트를 찾아 넣어줘야한다. (@Autowired)
a) 이때 @Autowired에 연결된 변수의 클래스가 @Component가 달린 클래스인 경우 스프링이 오브젝트를 생성해 넘겨준다.
b) 만약 @Bean 어노테이션으로 생성하는 오브젝트인 경우 @Bean이 달린 메서드를 불러 생성해 넘겨준다.