1. Java 기반 컨테이너 설정에 대해 익히고, Component Scan에 대해 이해할 수 있다.
2. 다양한 의존관계 주입 방법과 DI를 종합적으로 실습하며 익힐 수 있다.
- DI
✔︎ @Configuration
: 클래스 레벨에 사용
✔︎ @Bean
: 메서드 레벨에 사용
✔︎ 메서드가 Spring 컨테이너에서 관리할 새 객체를 인스턴스화, 구성 및 초기화한다는 것을 나타낼 때 사용
✔︎ 외부 라이브러리에 사용
✔︎ 애너테이션을 이용해 Config 클래스 설정하는 방법
ApplicationContext
구현은 아래와 같은 애너테이션이 달린 클래스로 파라미터를 전달 받음@Configuration
클래스@Component
클래스JSR-330
메타데이터@Bean
메서드도 Bean 정의에 등록@Autowired
또는 @Injection
과 같은 DI 데이터가 사용되는 것으로 가정✔︎ @Import
애너테이션 사용
✔︎ 추가한 @Bean
애너테이션에서 의존성 주입
✔︎ 설정 정보없이 자동으로 스프링 빈을 등록하는 스프링 기능
✔︎ @Component
가 붙은 모든 클래스를 스프링 빈으로 등록해주기 때문에 설정 정보에 붙여주면 됨
✔︎ 의존 관계도 자동으로 주입하는 @Autowired
기능 제공
✔︎ @ComponentScan
: @ComponentScan이 등록된 곳에서 @Component
를 가져오기 위해 사용
✔︎ @Autowired
: 생성자 의존성 주입에 필요한 설정 정보 대신 의존관계 자동 주입
✔︎ 기본 범위 : 동일 및 하위 패키지
✔︎ 탐색할 패키지의 시작 위치를 지정하고, 해당 패키지부터 하위 패키지 모두 탐색
✔︎ @ComponentScan()
의 매개변수로 basePackages=""를 줄 수 있음
✔︎ 지정하지 않으면, @ComponentScan()
이 붙은 설정 정보 클래스의 패키지가 시작 위치가 됨
✔︎ @Component
: 컴포넌트 스캔에 사용
✔︎ @Controller
& @RestController
: 스프링 MVC 및 REST 전용 컨트롤러에서 사용
✔︎ @Service
: 스프링 비즈니스 로직에서 사용
✔︎ @Repository
: 스프링 데이터 접근 계층에서 사용
✔︎ @Configuration
: 스프링 설정 정보에서 사용
✔︎ includeFilter : 컴포넌트 스캔 대상을 추가로 지정
✔︎ excludeFilter : 컴포넌트 스캔에서 제외할 대상을 지정
✔︎ FilterType 옵션
TypeFilter
라는 인터페이스를 구현해서 처리✔︎ 생성자 주입
@Autowired
를 하면 스프링 컨테이너에 @Component
로 등록된 빈에서 생성자에 필요한 빈들을 주입불변과 필수
의존 관계에 사용@Autowired
생략해도 자동 주입NullPointerException
방지final
로 선언 가능@Component
public class CoffeeService {
private final MemberRepository memberRepository;
private final CoffeeRepository coffeeRepository;
@Autowired
public OrderServiceImpl (MemberRepository memberRepository, CoffeeRepository coffeeRepository) {
this.memberRepository = memberRepository;
this.coffeeRepository = coffeeRepository;
}
}
✔︎ 수정자 주입 (setter 주입)
선택과 변경
가능성 있는 의존 관계에 사용@Autowired
를 입력하지 않으면 실행 ❌@Component
가 실행하는 클래스를 스프링 빈으로 등록@Autowired
에 있는 것들을 자동 주입)@Component
public class CoffeeService {
private final MemberRepository memberRepository;
private final CoffeeRepository coffeeRepository;
@Autowired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
@Autowired
public void setCoffeeRepository(CoffeeRepository coffeeRepository) {
this.coffeeRepository = coffeeRepository;
}
}
✔︎ 필드 주입
@Autowired
를 붙여 바로 주입하는 방법@Component
public class CoffeeService {
@Autowired
private MemberRepository memberRepository;
@Autowired
private CoffeeRepository coffeeRepository;
}
✔︎ 일반 메서드 주입
✔︎ 주입할 스프링 빈이 없을 때 동작해야하는 경우
✔︎ @Autowired
만 사용하는 경우 required 옵션 기본 값인 true가 사용되어, 자동 주입 대상이 없으면 오류가 발생할 수 있음
✔︎ 스프링 빈을 옵셔널하게 해둔 상태에서 등록되지 않고, 기본 로직으로 동작하는 경우
✔︎ 자동 주입 대상 옵션 처리 방법
Autowired(required=false)
: 자동 주입할 대상이 없으면, 수정자 메서드 자체가 호출되지 않게 함org.springframework.lang.@Nullable
: 자동 주입할 대상이 없으면, null
이 입력됨Optional<>
: 자동 주입할 대상이 없으면, Optional.empty
이 입력됨✔︎ 불변
✔︎ 누락 방지 (생성자 주입 시 컴파일 오류 발생)
✔︎ final
키워드 사용 가능
✔︎ 순환 참조 방지 (생성자 주입 시 BeanCurrentlyInCreationException 발생)
✔︎ 의존관계 설정이 되지 않으면, 객체 생성 불가
✔︎ 의존성 주입이 필요한 필드를 final
로 선언 가능
✔︎ 순환 참조 감지 기능
✔︎ 테스트 코드 작성 용이
✔︎ 수정자 주입이 필요한 경우도 있으나 옵션이 필요할 때만 선택
☞ 반복해서 읽어도 이해가 어려운 부분들이 많았으나, 직접 인텔리제이를 통해 예시 코드를 작성해가고, 블로깅 회고를 통해 다시 한번 내 손으로 직접 입력해보면서 깨달은 부분들이 많았다. 역시 직접 해봐야 이해가 편하다..!!
Spring은 이번 부트캠프 과정에서 핵심적인 부분이기에 기존 유어클래스 내용들 이외에도 여러 문서나 정보들을 구글링해보며 추가 학습을 하는 것이 중요할 것 같다. 아직 Spring 도입부인데 벌써부터 이렇게 어렵다니 😂 그치만,, 개념적인 이해가 오히려 직접 코드를 짜고 프로젝트를 만드는 것보다 어렵다는 말도 있었다! 쫄지말고 프로젝트 전까지 내가 할 수있는 최선을 다해보자 :)
・ AOP (Aspect Oriented Programming)