Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 키클락
- Spring Cloud Netfilx Eureka
- Parallel Old GC
- Serial GC
- 타입스크립트
- zipkin
- 디자인패턴
- 사가 패턴
- Spring Boot Actuator
- 멀티스레드
- spring batch
- saga pattern
- 스레드
- 배치
- 체인 패턴
- JPA
- Resilinece4j
- 디자인 패턴
- java 정렬
- 알고리즘
- Action Pattern
- TypeScript
- 생산자 소비자 패턴
- Transaction Pattern
- The law of Demeter
- MSA
- spring cloud
- 스프링 배치
- Java
- thread
Archives
- Today
- Total
PSD( Private-Self-Development )
생성자 주입을 사용하는 이유 본문
소스 분석 과 인터넷 강의를 듣던 중 @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. 생성자 주입] 과 같은 생성자를 자동으로 생성 해 준다.
참조
'Backend > JAVA' 카테고리의 다른 글
가비지 컬렉션(Garbage Collection) (0) | 2023.07.12 |
---|