public class Controller1 {
private final Service1 service1;
public Controller1() {
this.service1 = new Service1();
}
}
public class Service1 {
private final Repository1 repository1;
public Service1() {
this.repository1 = new Repository1();
}
}
public class Repository1 { ... }
public class Repository1 {
public Repository1(String id, String pw) {
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:h2:mem:db", id, pw);
}
}
강한 결합의 문제점
1. Controller 5 개가 각각 Service1 을 생성하여 사용 중
2. Repository1 생성자 변경이 발생 시
⇒ 모든 Contoller 와 모든 Service 의 코드 변경이 필요
그렇다면 강한 결합을 해결할 방법이 없을까?
1. 각 객체에 대한 객체 생성은 딱 1번만!
2. 생성된 객체를 모든 곳에서 재사용!
Repository1 클래스 선언 및 객체 생성 → repository1
Service1 클래스 선언 및 객체 생성 (repostiroy1 사용) → service1
Class Service1 {
private final Repository1 repitory1;
// repository1 객체 사용
public Service1(Repository1 repository1) {
~~this.repository1 = new Repository1();~~
this.repository1 = repository1;
}
}
// 객체 생성
**Service1 service1 = new Service1(repository1);**
Contoller1 선언 ( service1 사용)
Class Controller1 {
private final Service1 service1;
// service1 객체 사용
public Controller1(Service1 service1) {
~~this.service1 = new Service1();~~
this.service1 = service1;
}
}
만약, 다음과 같이 변경된다면,
public class Repository1 {
public Repository1(**String id, String pw**) {
// DB 연결
Connection connection = DriverManager.getConnection("jdbc:h2:mem:db", id, pw);
}
}
// 객체 생성
String id = "sa";
String pw = "";
Repository1 repository1 = new Repository1(**id, pw**);
개선 결과
⇒ Repository1 생성자 변경은 이제 누구에게도 피해(?) 를 주지 않음
⇒ Service1 생성자가 변경되면? 모든 Contoller → Controller 변경 필요 X
- 용도에 맞게 필요한 객체를 그냥 가져다 사용하는 것
이를 DI (Dependency Injection)" 혹은 한국말로 "의존성 주입"이라고 부릅니다.
사용할 객체가 어떻게 만들어졌는지는 알 필요 없음
실생활 예제) 가위의 용도별 사용