본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
DI 프레임워크
DI(Dependency Injection)
- 의존성 주입
- 한 객체가 다른 객체를 사용할 때 의존성이 있다고 함
- 런타임 시 의존 관계를 맺는 대상을 외부에서 결정하고 주입해 주는 것
- 스프링 프레임워크는 DI 기능을 지원해주는 프레임워크
의존성 주입의 장점
- 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
- 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다
- 유지보수가 쉬우며 테스트가 용이해진다
- 확장성을 가진다
의존성 주입의 단점
- 책임이 분리되어 있기 때문에 클래스 수를 늘림으로써 복잡성이 증가한다.
- 주입된 객체들에 관한 코드 추적이 어렵다.
- 초기 개발 노력이 필요하다.
- 의존성 주입 프레임워크를 사용하면 빌드 시간이 늘어날 수 있으며, 프레임워크에 대한 의존도를 높인다.
스프링의 DI 방식
- 빈을 저장하기 위한 컨텍스트를 생성한다. 컨텍스트에서 맵으로 빈을 관리한다.
- @ComponentScan이 선언된 자바 파일 경로를 포함한 하위 패키지를 모두 탐색하면서 @Component가 선언된 클래스를 찾는다.
- @Component가 선언된 클래스는 해당 클래스 타입으로 첫 글자를 소문자로 한 이름을 키로 갖는 인스턴스를 컨텍스트에 등록한다.
- @Configuration이 선언된 클래스는 해당 클래스도 빈으로 등록하고 @Bean이 선언된 메서드들도 빈으로 등록한다. 이때 메서드 이름이 키, 해당 메서드가 리턴하는 인스턴스를 값이 되어 컨텍스트에 등록한다.
- 이렇게 빈을 모두 등록하면 @Autowired가 선언된 생성자, 세터 메서드, 필드를 탐색한다.
- 생성자 주입: 생성자 파라미터의 타입으로 컨텍스트에 등록된 빈을 조회하여 같은 타입을 찾아 주입한다.
- 세터 주입: 메서드 파라미터의 타입으로 컨텍스트에 등록된 빈을 조회하여 같은 타입을 찾아 주입한다.
- 필드 주입: 해당 멤버 변수의 타입으로 컨텍스트에 등록된 빈을 조회하여 같은 타입을 찾아 주입한다.
- 등록된 빈들은 모두 싱글턴으로 관리한다.
생성자 주입(Constructor Injection)
- 생성자 주입(Constructor Injection)은 생성자를 통해 의존 관계를 주입하는 방법이다.
@Service
public class UserService {
private UserRepository userRepository;
private MemberService memberService;
@Autowired
public UserService(UserRepository userRepository, MemberService memberService) {
this.userRepository = userRepository;
this.memberService = memberService;
}
}
- 생성자 주입은 생성자의 호출 시점에 1회 호출 되는 것이 보장된다. 그렇기 때문에 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해 사용할 수 있다. 또한 Spring 프레임워크에서는 생성자 주입을 적극 지원하고 있기 때문에, 생성자가 1개만 있을 경우에 @Autowired를 생략해도 주입이 가능하도록 편의성을 제공하고 있다. 그렇기 때문에 위의 코드는 아래와 동일한 코드가 된다.
@Service
public class UserService {
private UserRepository userRepository;
private MemberService memberService;
public UserService(UserRepository userRepository, MemberService memberService) {
this.userRepository = userRepository;
this.memberService = memberService;
}
}
생성자 주입을 사용해야 하는 이유
- 객체의 불변성 확보
- 테스트 코드의 작성
- final 키워드 작성 및 Lombok과의 결합
- 스프링에 비침투적인 코드 작성
- 순환 참조 에러 방지
'패스트캠퍼스 강의' 카테고리의 다른 글
[12일차] 50일 포트폴리오 챌린지 (0) | 2023.08.19 |
---|---|
[11일차] 50일 포트폴리오 챌린지 (0) | 2023.08.18 |
[9일차] 50일 포트폴리오 챌린지 (0) | 2023.08.16 |
[8일차] 50일 포트폴리오 챌린지 (0) | 2023.08.15 |
[7일차] 50일 포트폴리오 챌린지 (0) | 2023.08.14 |