Backend/JAVA
생성자 주입을 사용하는 이유
chjysm
2023. 1. 30. 11:17
소스 분석 과 인터넷 강의를 듣던 중 @Autowired 어노테이션 대신,
@RequiredArgsConstructor 를 사용을 지향하여 이유를 찾아보게 되었다.
의존성 주입 ?
Spring 프레임워크는 사용자가 new 키워드를 사용하여 객체를 생성 및 소멸시키는 과정을 대신 해주는데
객체간의 의존성을 주입해주고(DI)
Spring 컨테이너가 Bean들의 생명 주기를 관리한다.(IoC)
이러한 의존성 주입에는 3가지 방식이 있는데, 이 중 생성자 주입을 지향해야 한다.
이유를 알아보자.
의존성 주입의 종류
1. 필드 주입
@Service
public class AService{
@Autowired
pivate ARepository aRepository;
@Autowired
pivate BService bService;
}
장점
- 코드가 간결하다.
단점
- 외부에서 수정이 불가능 하다.
- ex) AService 에서 사용하는 repository를 변경하여 테스트 하고싶은 경우
- Spring DI 가 필수이다.
- 객체가 mutable 하지 못하다.
2. 수정자 주입
@Service
public class AService{
pivate ARepository aRepository;
pivate BService bService;
@Autowired
public void setARepository(ARepository aRepository){
this.aRepository = aRepository;
}
@Autowired
public void setBService(BService bService){
this.bService = bService;
}
}
장점
- 외부에서 수정이 가능하다.
단점
- Setter 가 public 이기 때문에 의존성 주입 객체의 변경 가능성이 열린다.
= 다른 곳에서 임의로 객체를 변경 할 수 있기 때문에 에러 발생 위험이 높아진다.
3. 생성자 주입
@Service
public class AService{
pivate final ARepository aRepository;
pivate fianl BService bService;
@Autowired
public void AService( ARepository aRepository, BService bService ){
this.aRepository = aRepository;
this.bService = bService;
}
}
장점
- 객체의 불변성 확보
- 객체의 생성자는, 객체 생성 시 1회만 호출되기 때문
- 테스트 코드 작성의 편리함
- 테스트 코드 구동 환경은 Spring DI 에 관리 받지 않기 때문에 생성자 주입을 사용할 경우, 생성자를 사용하여 테스트 가능하다.
- 변수의 final 선언으로 의존성 주입을 필수 설정 가능
- 순환 참조 방지
Lombok의 @RequiredArgsConstructor 어노테이션
@Service
@RequiredArgsConstructor
public class AService{
pivate final ARepository aRepository;
pivate fianl BService bService;
}
Lombok의 @RequiredArgsConstructor 어노테이션 사용 시, [3. 생성자 주입] 과 같은 생성자를 자동으로 생성 해 준다.
참조
https://programforlife.tistory.com/111
[Spring] 생성자 주입을 사용해야 하는 이유
인턴을 시작한 초기 단계에, Spring 프로젝트 코드 분석을 하다가 신기한 점을 발견해서 질문을 한 기억이 있습니다. Spring프로젝트에서 Controller를 작성할 때, 저는 항상 @Autowired 어노테이션을 사
programforlife.tistory.com