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 |
Tags
- Spring기초
- 검사예외
- trend road
- 메모독서법
- 인수공통감염병
- su option
- constructor injection
- 의존성검색
- 독후감
- 직지아모르마네트
- logrotate error
- 불렛저널책
- ControllerAdvice
- text[]
- 라이더캐롤
- array_append
- field injection
- 트랜드로드
- 코로나블루
- array_cat
- 코로나불안증
- 부의인문학
- ANY(
- fire운동
- 파이어운동
- 비검사예외
- tvn shift
- 심리학도서
- Cardinality
- array_prepend
Archives
- Today
- Total
야생토끼 블로그
[스프링기초] IoC(Inversion of Control), DI(Dependency Injection), Constructor Injection 본문
Computer science/Spring
[스프링기초] IoC(Inversion of Control), DI(Dependency Injection), Constructor Injection
lazy. 2020. 4. 28. 01:02IoC란?
제어권 역전 : Inversion of Control
객체 생성과 관리에 대한 제어권이 역전되었음을 의미함. 프레임워크의 일반적인 특징.
IoC에는 DI와 DL가 있다.
DI (Dependency Injection)
-
의존성 주입
-
각 컴포넌트 간의 의존관계를 빈 설정(Bean Definition)정보를 바탕으로 Spring 컨테이너가 런타임에 자동으로 연결해주는 것
-
DI의 방법
Field Injection
@Service
public class TestService {
@Autowired
private TestRepository testRepository;
.......
}
Constructor Injection
@Service
public class TestService {
private TestRepository testRepository;
@Autowired
TestService(TestRepository testRepository){
this.testRepository = testRepository;
}
.......
}
Setter Injection
@Service
public class TestService {
private TestRepository testRepository;
@Autowired
public void setTestRepository(TestRepository testRepository){
this.testRepository = testRepository;
}
.......
}
DL (Dependency Lookup)
-
의존성 검색
-
JNDI 같은 저장소에서 관리되고 있는 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 Lookup하는 것
-
EJB 컨테이너, Spring 컨테이너에서 지원
-
컨테이너 종속성이 증가하게 됨.
Spring Bean Factory
public static void main(String[] args) {
BeanFactory factory = getBeanFactory();
TestService ts = (TestService)factory.getBean("testService");
...
}
필드 주입(Field Injection) 대신 생성자 주입(Constructor Injection)을 권장하는 이유
- 필드주입은 보기에도 좋지만, 의존성을 여러개 주입하기가 쉽다 :
@Autowired 선언으로 여러 개를 추가하기가 쉬우므로, 해당 클래스가 너무 많은 책임을 가진 것은 아닌지 고민하지 못하게 된다. - 의존성이 코드속에 숨는다. (->애매하게 이해됨) :
의존 객체 중 필수는 생성자 주입, 옵션은 Setter 주입으로 명시가 가능하다. - DI컨테이너의 결합성, 테스트 용이성 :
DI 컨테이너 없이도 독립적으로 인스턴스화 가능하고, 테스트 가능하다. - 불변성 :
필드 주입은 final을 선언할 수 없어서 객체가 변할 수 있고, 생성자 주입에서 필드는 final로 선언 가능하다. - 순한 의존성 :
생성자 주입 사용 시 순환 의존성은 BeanCurrentlyCreationExeption 으로 알 수 있다.
Setter Injection이 유용한 경우?
- 선택적인 의존성을 사용할 때 유용하다. 스프링 3.x 문서에서는 Setter Injection을 추천했다. 스프링 4.x 문서에서는 Constructor Injection을 권장한다.
* 참고 : https://zorba91.tistory.com/238
* 참고 : https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/
'Computer science > Spring' 카테고리의 다른 글
spring 구조 (0) | 2022.09.14 |
---|
Comments