생성자에 @Autowired가 있으면 스프링이 연관된 객체를 스프링 컨테이너에서 찾아 넣어줌
이렇게 객체 의존 관계를 외부에서 넣어주는 것을 DI(Dependency injection), 의존성 주입이라고 함
DI에는 필드 주입, setter 주입, 생성자 주입이 있음
@Autowired를 통한 DI는 스프링이 관리하는 객체에서만 동
스프링 빈을 등록하는 방법
1. 컴포넌트 스캔과 자동 의존관계 설정
2. 자바 코드로 직접 스프링 빈 등록
컴포넌트 스캔 원리
@Component 애노테이션이 있으면 스프링 빈으로 자동 등록됨
@Controller 컨트롤러가 스프링 빈으로 자동 등록된 이유도 컴포넌트 스캔 때문
@Component를 포함하는 다음 애노테이션도 스프링 빈으로 자동 등록됨
- @Controller
- @Service
- @Repository
생성자에 @Autowired를 사용하면 객체 생성 시점에 스프링 컨테이너에서 해당 스프링 빈을 찾아서 주입
생성자가 1개만 있으면 @Autowired는 생략 가능
스프링은 스프링 컨테이너에 스프링 빈을 등록할 때, 기본으로 싱글톤으로 등록함
따라서 같은 스프링 빈이면 모두 같은 인스턴스임
추가)
강한 결합: 객체 내부에서 다른 객체를 생성하는 것은 강한 결합도를 가지는 구조
느슨한 결합: 객체를 주입 받는다는 것은 외부에서 생성된 객체를 인터페이스를 통해 넘겨받는 것
결합도를 낮출 수 있고, 런타임시에 의존관계가 결정되므로 유연한 구조를 가짐
<Field Injection>
변수 선언부에 @Autowired Annotaion 붙임
- 의존성 주입 쉬움
- 의존성 숨음
- 필요한 의존성을 가진 클래스를 곧바로 인스턴스화 시킬 수 없음
- 불변성 지킬 수 없음 (final 선언 불가)
- 순환 의존성
<Setter Injection>
set Method를 정의하여 사용
런타임시에 할 수 있도록 낮은 결합도 가짐
<Constructor Injection>
필수적으로 사용해야 하는 의존성 없이는 인스턴스를 만들지 못하도록 강제할 수 있음
단일 생성자에 한해 @Autowired를 붙이지 않아도 됨
Spring 4.3부터 클래스를 완전히 DI Framework로부터 분리 가능
- null을 주입하지 않는 한 NullPointerException은 발생하지 않음
- 의존 관계 주입을 하지 않은 경우에는 Controller 객체를 생성할 수 없음
- final 사용 가능
- 순환 의존성 알 수 있음
- 의존성 주입하기 번거로움
'Old > Spring' 카테고리의 다른 글
Repositiry / Service / Test (0) | 2023.02.01 |
---|---|
API (0) | 2023.01.29 |
Controller와 GetMapping (0) | 2023.01.23 |