https://jootang2.tistory.com/149
이전 포스팅에서 @ComponentScan과 @Autowired 가 어떤 역할들을 하는 지 알아봤다.
이제 의존관계 자동 주입에 대해서 알아보자.
크게 4가지 방법이 있는데 이번 포스팅에서는 그 중 대표적인 생성자 주입 방법에 대해서 알아보자.
생성자 주입
- 생성자를 통해서 의존 관계를 주입 받는 방법
- 생성자 호출 시점에 1번만 호출되는 것이 보장된다.
- 불변, 필수 의존관계에 사용
@Component
public class TestService {
private final TestRepository testRepository;
private final TestPolicy testPolicy;
@Autowired
public TestService(TestRepository testRepository, TestPolicy testPolicy) {
this.testRepository = testRepository;
this.testPolicy = testPolicy;
}
}
앞 포스팅에서 본 것과 같이 @Component 어노테이션이 붙은 클래스들을 자동으로 Bean에 등록하고,
@Autowired 어노테이션이 붙은 애들을 자동으로 주입해준다.
만약 생성자가 1개인 경우, @Autowired를 생략이 가능하다.
최근 대부분의 DI 프레임워크들은 다음과 같은 이유들로 생성자 주입을 권장한다.
- 불변
- 대부분의 의존과계는 종료할 때 까지 변경할 일이 없다.
- 수정자 주입을 사용하면, setXxx 메소드를 public으로 열어줘야 한다. -> 누군가가 실수로 변경할 수도 있고, 변경하지 않을 메소드를 열어두는 것은 지양해야 좋다.
- 생성 시점에 1번만 호출되므로 불변하게 설계할 수 있다.
- 누락
- 프레임워크 안에서 테스트를 수행할 때, 의존관계가 없으면 오류가 발생해서 알 수 있다. 그러나 순수한 자바 코드로만 단위 테스트를 한다면 NPE(Null Point Exception)이 발생할 수 있다. (주입을 하지 않은 경우)
- 생성자 주입을 사용하면 final 키워드를 통해서 컴파일 오류를 발생시킨다. -> 오류를 미연에 방지할 수 있다.
위 코드처럼 작성을 하면 반복되는 작업이 많아지고 코드량이 길어진다.
이럴 때 Lombok 라이브러리를 통해서 이쁜 코드를 만들 수 있다.
@Component
@RequiredArgsConstructor
public class TestService {
private final TestRepository testRepository;
private final TestPolicy testPolicy;
}
@RequiredArgsConstructor 어노테이션은 final이 붙은 필드를 모아서 생성자를 자동을 만들어준다.
위 코드와 아래 코드는 동일한 코드다!
롬복이 컴파일 시점에 자동으로 생성자 코드를 생성해준다. 실제 class를 열어보면 첫번째 코드와 동일한 코드가 있는 것을 확인해볼 수 있다.
이처럼 의존관계를 설정할 때는, 생성자 주입 관계를 사용하는 것이 좋다. 만약, 필수 값이 아닌 경우에는 수정자 주입 방식으로 해주면 된다.
정리하자면, 생성자 주입방법을 기본으로 사용하되 옵션이 있는 경우에 수정자 주입방법을 옵션으로 사용하면 된다.
어떤 상황에서 자동 등록을 해야할 지, 수동 등록을 해야할 지 판단이 안될 수 있다.
그럴 때는, 도메인 지식이 확실한 시니어 개발자에게 물어보거나 본인이 비즈니스 로직, 도메인을 공부해야 한다.
판단이 어려운 경우에는 항상 질문, 또 질문이 답이다.
본인이 토이프로젝트를 하는 데 뭘 써야할 지 모른다구? 그러면 그냥 생성자 주입방법을 쓰자. 그리고 필요에 의해서 다른 방법들을 쓰면 된다.
주니어 개발자 모두 화이팅
제주도 아주 재미있었다! 평상시에 공부를 열심히 해서 밍지박사랑 많이 많이 놀러다녀야겠다!
밍지박사 아주 최고!!
'Spring' 카테고리의 다른 글
스프링 DB : JDBC는 뭐에요? (2) | 2023.04.24 |
---|---|
@ComponentScan은 무슨 역할인가요? @Autowired는 뭐 하는 아이인가요? (1) | 2023.03.16 |
Bean이 뭐에요? 그렇다면 객체는 뭔가요? 설명해주세요. (2) | 2023.03.09 |
Spring bean 조회 시 같은 타입이 두 개 이상인 경우는 어떻게 해요~? (2) | 2023.03.06 |
Spring에 등록된 Bean들을 조회해보자~ (2) | 2023.02.21 |