| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 |
- 알고리즘
- 프로토콜
- 개발공부
- 네트워크
- 코딩테스트
- IP
- 네트워크모델
- 클라이언트
- SSAFY
- BAEKJOON
- 다이내믹프로그래밍
- 정렬
- Spring
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
- cs공부
- 알고리즘공부
- 백준
- 싸피
- 개발자
- DP
- Java
- 자바
- 서버
- 스프링
- 코딩공부
- 전송계층
- 구현
- Dynamic Programming
- Lan
- TCP
- Today
- Total
오늘 하루, develop
#2. 컴포넌트 스캔(@ComponentScan)과 의존관계 자동 주입(@Autowired) 본문
- 소개
- 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다.
- 그러나 필요한 메서드에 모두 @Bean을 붙이는 것은 귀찮고, 누락할 위험도 있다.
- 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공한다. 또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다.
- 컴포넌트 스캔과 의존관계 자동 주입에 대해 알아보자.
💡컴포넌트 스캔
스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan이라는 기능을 제공한다.
또 의존관계도 자동으로 주입하는 @Autowired 라는 기능도 제공한다.
컴포넌트 스캔을 사용하려면 먼저 @ComponentScan을 설정 정보에 붙여주면 된다.
기존의 AppConfig와는 다르게 @Bean으로 등록한 클래스가 하나도 없다!
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class AutoAppConfig {
}
컴포넌트 스캔은 이름 그대로 @Component 애노테이션이 붙은 클래스를 스캔해서 스프링 빈으로 등록한다.
각 클래스가 컴포넌트 스캔의 대상이 되도록 @Component 애노테이션을 붙여주자.
@Component
public class MemoryMemberRepository implements MemberRepository {}
참고)
별도 설정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
스프링 부트를 사용하면 스프링 부트의 대표 시작 정보인 @SpringBootApplication를 이 프로젝트 시작 루트 위치에 두는 것이 관례이다. (그리고 이 애노테이션 안에 @ComponentScan 이 들어있다! @Configuration도 들어있다!)
또한 스프링 부트는 @SpringBootApplication 어노테이션을 통해 내부적으로 자동으로 ApplicationContext를 생성하고 초기화하기 때문에 아래와 같이 ApplicationContext를 초기화하는 코드를 작성할 필요가 없다.
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
참고) 컴포넌트 스캔은 @Component 뿐만 아니라 다음 내용도 추가로 대상에 포함한다.
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
💡자동 의존 관계 주입
이전에 AppConfig에서는 @Bean 으로 직접 설정 정보를 작성했고, 의존관계도 직접 명시했다.
이제는 이런 설정 정보 자체가 없기 때문에, 의존관계 주입도 이 클래스 안에서 해결해야 한다.
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
- @Autowired는 의존관계를 자동으로 주입해준다.
- 그래서 @ComponentScan을 쓰면 @Autowired를 쓰게 된다.
- @Autowired를 생성자에 붙여줘야 한다.
- 스프링 컨테이너가 자동으로 해당 스프링 빈을 찾아서 생성자에 주입해 준다.
참고)
- 생성자가 딱 1개만 있으면 @Autowired를 생략해도 자동 주입 된다. 물론 스프링 빈에만 해당한다.
- 롬복 라이브러리가 제공하는 @RequiredArgsConstructor 기능을 사용하면 final이 붙은 필드를 모아서 생성자를 자동으로 만들어준다. (다음 코드에는 보이지 않지만 실제 호출 가능하다.)
- 최종 결과는 다음과 같다!
@Component
@RequiredArgsConstructor
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
}
+ 의존관계 주입에는 여러 가지가 있으나..
항상 생성자 주입을 선택해라! 그리고 가끔 옵션이 필요하면 수정자 주입을 선택해라. 필드 주입은 사용하지 않는 게 좋다.
참고)
스프링 컨테이너는 애플리케이션이 시작될 때 생성된다. 스프링 부트를 사용하는 경우, 애플리케이션이 실행될 때 SpringApplication.run(Application.class, args) 메서드 호출에 의해 스프링 컨테이너가 생성된다.
스프링 컨테이너가 실행되면 컴포넌트 스캔을 수행하여 애플리케이션 컨텍스트에 미리 빈을 등록한다.
따라서 빈은 해당 클래스가 처음 호출될 때 등록되는 것이 아니라, 스프링 컨테이너가 초기화될 때 등록한다.
💡스프링 애플리케이션이 서버에서 실행될 때의 과정
1. 톰캣 서버가 시작됨
- 애플리케이션이 배포된 상태에서 톰캣 서버가 시작된다.
- 서버가 실행되면서 서블릿 컨테이너가 초기화되고, 스프링 기반 애플리케이션이 준비된다.
2. 스프링 컨텍스트(Application Context) 초기화
- 톰캣이 스프링 애플리케이션의 진입점(DispatcherServlet)을 초기화할 때, 스프링 컨텍스트가 생성된다.
- 스프링은 @Configuration 또는 XML 설정 파일을 통해 애플리케이션의 설정 정보를 로드한다.
3. 컴포넌트 스캔 및 빈 생성
- 설정 파일이나 클래스에 지정된 @ComponentScan 설정에 따라 컴포넌트 스캔이 이루어진다.
- 지정된 패키지에서 @Component, @Service, @Repository, @Controller 등이 붙은 클래스들이 검색된다.
- 발견된 클래스들은 빈으로 등록된다. 이 단계에서 각 클래스의 인스턴스가 생성되고, 스프링 컨테이너에 의해 관리된다.
4. 의존성 주입 (@Autowired)
- 스프링은 생성된 빈에서 @Autowired가 붙은 필드나 생성자, 메서드를 찾아서 의존성 주입을 수행한다.
- 빈이 생성되고 나면 스프링 컨테이너는 등록된 다른 빈 중에서 주입 가능한 객체를 찾아 의존성 주입을 마친다.
- 이 작업은 빈 초기화 과정에서 자동으로 이루어지며, 이후 빈은 스프링 컨테이너에 의해 관리된다.
- 참고) @Autowired 는 타입(Type)으로 조회한다. 타입으로 조회하면 선택된 빈이 2개 이상일 때 문제가 발생한다. 이럴 때 @Qualifier, @Primary를 사용한다.
5. 애플리케이션 준비 완료
- 빈 생성 및 의존성 주입이 완료되면, 스프링 컨텍스트가 초기화를 마치고 애플리케이션이 준비 상태가 된다.
- 이후 애플리케이션이 HTTP 요청을 받아 처리할 준비가 완료된다.
위 글은 아래 강의를 수강하며 정리한 내용입니다.
스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런
김영한 | 스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보
www.inflearn.com
'Spring' 카테고리의 다른 글
| #1. 스프링 컨테이너(feat.싱글톤) (0) | 2024.07.21 |
|---|---|
| #0. 스프링(Spring)의 등장배경 및 개념 (0) | 2024.07.20 |