의존성 주입 (DI) 은 객체가 필요로 하는 의존 객체를 외부에서 주입 하는 방식으로 객체 간의 결합도를 낮추는데 도움을 준다.
의존성 주입을 통해 객체는 자신이 사용할 의존 객체를 직접 생성하지 않고 외부에서 생성된 객체를 주입받기 때문에 객체간의 결합도를 낮추는데 도움을 준다.
이로 인해 객체는 자신의 구현에만 집중할 수 있으며, 변경에 유연하게 대응할 수 있다.
- 생성자주입 (주로사용)
- 객체 생성 시점
- 세터주입
- 인터페이스 주입
생성자 주입이 주로 사용되는 이유
- 필드 주입의 단점
- 외부에서 수정 불가능
- 수정자 주입의 단점
- 변경의 가능성을 열어두기 때문에, 다른 곳에서 임의로 객체를 변경할 수 있어 에러가 발생할 위험이 높다.
- 객체의 불변성 확보
- 테스트 코드 작성의 편리함
- 순환 참조 방지
- 개발자의 의존성 주입 실수 방지 (final 키워드)
- final 키워드로 선언된 변수는, 초기에 클래스 생성 시 반드시 초기값이 세팅되어야 하고, 변하지 않는 변수라는 것을 의미한다.
의존성 주입의 장점으로는 코드의 재사용성 증가, 코드의 유지보수성 향상, 객체 간의 결합도 감소, 단위 테스트 용이성 증가 등이 있다. 특히, 스프링 프레임워크에서 제공하는 의존성 주입 기능은 이러한 장점을 극대화 한다.
의존성이 높은 프로그램의 특징에 대해 알아보자
소프트웨어 내부에는 많은 객체가 존재하고 각 객체들은 역할과 책임을 다하며 서로 협력하여 프로그램이 동작한다.
협력을 한다는 것은 협력 대상에 대한 이해가 필요하고 → 대상 객체에 대해 알고 있어야한다. → 즉 의존하게 된다.
의존성이 생기면 곧 변경에 영향을 받는다.
만약 A가 B를 의존하고 B가 변화하면 그에 대한 영향은 A까지 퍼지게된다. 이는 프로그램을 수정하기 어렵게 만들곤 한다. 그래서 개발자는 프로그램의 의존성을 관리하여 유지보수가 쉽고 확장성이 높은 프로그램을 만들어야 할 필요가 있다.
의존성이 높은프로그램의 특징
- Rigidity 경직성 : 코드가 단단하게 묶여있어 변경하기 어려워짐
- Fragility 취약성 : 한 모듈의 수정이 다른 모듈에 영향을 미쳐서 프로그램이 쉽게 깨지는 것
- Immobility 부동성 : 모듈이 쉽게 추출되지 않고 재사용이 어려워지는 것
- Viscosity 점성 : 여러 계층을 거쳐 의존성을 갖는 것
이러한 문제들은 구체적인 클래스 구현체에 의존할 때 그 문제가 가장 심해지며, 인터페이스에 의존하게 된다면 그 문제는 비교적 작아진다.
강한결합 : 구체적인 클래스에 의존하는 관계
약한결합: 추상적인 클래스(인터페이스) 등에 의존하는 관계
어떻게 하는것이 좋은 설계야 ??
시스템을 Modularistic 하게 만들어야한다.
Modularistic 이란 시스템을 여러개의 모듈로 나눠 이들간의 적절한 책임을 부여하는것이다.
각 모듈의 관심사를 분리하고, 모듈간의 인터페이스를 작고 간단하게 정의한다면 프로그램의 의존성을 줄일 수 있다.
소프트웨어 Modularity의 정도는 Coupling과 Cohesion이라는 척도로 측정된다.
Coupling 이란 모듈간의 상호연관관계의 정도를 측정하는 것
Cohesion 이란 한 모듈 내에서 그 요소들이 얼마나 관계성 있게 묶여있는가를 측정하는 지표
의존성 주입을 통해 객체는 자신이 사용할 의존 객체를 직접 생성하지 않고 외부에서 생성된 객체를 주입받기 때문에 객체간의 결합도를 낮추는데 도움을 준다.
이로 인해 객체는 자신의 구현에만 집중할 수 있으며, 변경에 유연하게 대응할 수 있다.
- 생성자주입 (주로사용)
- 객체 생성 시점
- 세터주입
- 인터페이스 주입
생성자 주입이 주로 사용되는 이유
- 필드 주입의 단점
- 외부에서 수정 불가능
- 수정자 주입의 단점
- 변경의 가능성을 열어두기 때문에, 다른 곳에서 임의로 객체를 변경할 수 있어 에러가 발생할 위험이 높다.
- 객체의 불변성 확보
- 테스트 코드 작성의 편리함
- 순환 참조 방지
- 개발자의 의존성 주입 실수 방지 (final 키워드)
- final 키워드로 선언된 변수는, 초기에 클래스 생성 시 반드시 초기값이 세팅되어야 하고, 변하지 않는 변수라는 것을 의미한다.
의존성 주입의 장점으로는 코드의 재사용성 증가, 코드의 유지보수성 향상, 객체 간의 결합도 감소, 단위 테스트 용이성 증가 등이 있다. 특히, 스프링 프레임워크에서 제공하는 의존성 주입 기능은 이러한 장점을 극대화 한다.
의존성이 높은 프로그램의 특징에 대해 알아보자
소프트웨어 내부에는 많은 객체가 존재하고 각 객체들은 역할과 책임을 다하며 서로 협력하여 프로그램이 동작한다.
협력을 한다는 것은 협력 대상에 대한 이해가 필요하고 → 대상 객체에 대해 알고 있어야한다. → 즉 의존하게 된다.
의존성이 생기면 곧 변경에 영향을 받는다.
만약 A가 B를 의존하고 B가 변화하면 그에 대한 영향은 A까지 퍼지게된다. 이는 프로그램을 수정하기 어렵게 만들곤 한다. 그래서 개발자는 프로그램의 의존성을 관리하여 유지보수가 쉽고 확장성이 높은 프로그램을 만들어야 할 필요가 있다.
의존성이 높은프로그램의 특징
- Rigidity 경직성 : 코드가 단단하게 묶여있어 변경하기 어려워짐
- Fragility 취약성 : 한 모듈의 수정이 다른 모듈에 영향을 미쳐서 프로그램이 쉽게 깨지는 것
- Immobility 부동성 : 모듈이 쉽게 추출되지 않고 재사용이 어려워지는 것
- Viscosity 점성 : 여러 계층을 거쳐 의존성을 갖는 것
이러한 문제들은 구체적인 클래스 구현체에 의존할 때 그 문제가 가장 심해지며, 인터페이스에 의존하게 된다면 그 문제는 비교적 작아진다.
강한결합 : 구체적인 클래스에 의존하는 관계
약한결합: 추상적인 클래스(인터페이스) 등에 의존하는 관계
어떻게 하는것이 좋은 설계야 ??
시스템을 Modularistic 하게 만들어야한다.
Modularistic 이란 시스템을 여러개의 모듈로 나눠 이들간의 적절한 책임을 부여하는것이다.
각 모듈의 관심사를 분리하고, 모듈간의 인터페이스를 작고 간단하게 정의한다면 프로그램의 의존성을 줄일 수 있다.
소프트웨어 Modularity의 정도는 Coupling과 Cohesion이라는 척도로 측정된다.
Coupling 이란 모듈간의 상호연관관계의 정도를 측정하는 것
Cohesion 이란 한 모듈 내에서 그 요소들이 얼마나 관계성 있게 묶여있는가를 측정하는 지표
댓글