Spring) 의존성이란?
의존성이란?
파라미터나 리턴값 또는 지역변수 등으로 다른 객체를 참조하는 것
A가 B를 의존한다 > 의존 대상인 B가 변하면 A에 영향을 미친다
B의 기능이 추가 또는 변경되거나 형식이 바뀌게 되면 A에 영향을 미치게 되는 것을 의존성 전이 라고 한다.
의존성 전이 때문에 의존성은 객체 간의 협력을 위해 필수적이지만 의존성을 최소화 해야 된다.
의존성 종류
의존성 종류 | 컴파일타임 의존성 | 런타임 의존성 |
정의 | 코드를 컴파일하는 시점에 결정 | 코드를 실행하는 시점에 결정 |
의존성을 갖는 요소 | 클래스 사이의 의존성 | 객체 사이의 의존성 |
특징 | 결합도가 높으며 변경에 유연하지 않음 | 결합도가 낮으며 변경에 유연함 |
의존성 주입(Dependency Injection)
Spring Framework의 3가지 핵심 프로그래밍 중 하나로 외부에서 두 객체 간의 관계를 결정해주는 디자인 패턴
인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고
런타임시에 관계를 동적으로 주입하여 유연성을 확보하고 결합도를 낮출 수 있게 해준다
의존성 주입 방법
1. 생성자 주입
- 생성자의 호출 시점에 1회 호출 되는 것이 보장
- 주입받은 객체가 변하지 않거나, 반드시 객체의 주입이 필요한 경우에 강제하기 위해 사용
2. 수정자 주입(Setter주입)
- 필드 값을 변경하는 Setter를 통해서 의존 관계 주입
- 주입받는 객체가 변경될 가능성이 있는 경우
3. 필드 주입
- 필드에 바로 의존 관계 주입
- 외부에서 접근이 불가능하다는 단점
- DI 프레임워크가 존재해야되므로 사용 지양
- 실제 코드와 무관한 테스트 코드나 설정을 위해 불가피 한 경우에만 사용
4. 일반 메서드 주입
- 일반 메서드를 통해 의존 관계를 주입
생성자 주입을 사용해야 하는 이유
1.객체의 불변성
의존 관계의 변경이 필요한 상황은 거의 없기 때문에 수정자 주입이나 일반 메서드 주입 등을 이용하면 불필요하게 수정의 가능성을 열어두기 때문에 유지보수성을 떨어뜨린다.
2. 테스트 코드의 작성
생성자 주입이 아닌 다른 주입으로 작성된 코드는 순수한 자바 코드로 단위 테스트를 작성하기 어려움
생성자 주입 사용시 컴파일 시점에 객체를 주입받아 테스트 코드를 작성, 주입하는 객체의 누락시 컴파일 시점에 오류 발견 가능
3. final 키워드와 Lombok과의 결합
생성자 주입 사용시 필드 객체에 final 키워드를 사용할 수 있기 때문에 컴파일 시점에 누락된 의존성을 확인할 수 있다.
final 키워드 작성시 Lombok과 결합하여 간결한 코드를 작성할 수 있다.
참고 자료
https://mangkyu.tistory.com/125
https://jeongkyun-it.tistory.com/172