의존
기능구현을 위해 다른 구성요소들을 사용하는 것을 의미한다. (객체와 캡슐화 게시글 참고) 객체생성, 메소드 호출, 데이터를 사용하는것 모두를 의존한다고 표현한다.
의존하고 있다면 의존하는 대상이 변경될 경우, 그 변경이 전파될 가능성이 크다. (ex. 기존에 파라미터 3개 받던 메소드를 호출 -> 파라미터 2개로 변경 -> 호출했던 메소드도 변경)
그래서 순환의존이 위험하다.
- 순환의존: A -> B -> C -> A 서로 꼬리를 맞물며 의존하고 있는 상태.
최대한 순환의존이 발생하지 않도록 해야한다.
🤫 의존대상이 많을 경우에는 ?
- 한 클래스에 기능들이 많을 경우 -> 그 안에 의존하는 것들이 많아진다 -> 그럴수록 변동성이 커지고 순환의존의 가능성이 커진다. -> 기능별로 클래스를 쪼갠다.
- 여러개의 의존 대상을 단일 기능으로 묶어서 대상을 줄인다.
- 의존하는 대상을 객체로 생성한다. -> 의존하는 로직이 변경되면 객체가 변경된다. -> 의미가 없음
의존 대상 객체를 직접 생성하지 않는 방법?
- 팩토리, 빌더
- 의존주입(DI)
- 서비스 로케이터
의존주입(DI)
직접 생성하는게 아니라 생성자나 메소드를 이용해서 주입한다. 초기화되는 코드에서 사용한다.
🧐 왜 굳이 DI를 사용하는가?
- 의존하는 대상만 수정하면 그를 의존하는 메소드들은 변경하지 않아도 된다.
- 대역객체를 사용해서 테스트 가능 -> db가 없더라도 임의로 값을 넣고 그 값에 대해 테스트를 할수있다. (= 임의로 값을 넣어서 테스트할 수 있다.)
출처: 최범균, “객체 지향 프로그래밍 입문”, 인프런