디미터의 법칙(Demeter's Law)은 소프트웨어 개발에서 객체 간의 관계를 설계할 때 지켜야 할 원칙 중 하나입니다. 이 법칙은 "Tell, Don't Ask" 원칙과 연관성이 있으며, 객체 간의 의존성을 관리하고 코드의 유지보수성을 높이기 위한 방법을 제시합니다.
이 법칙을 따르면서 객체 간의 의존성을 최소화하고 느슨한 결합을 유지할 수 있습니다. 객체가 다른 객체의 내부 상태에 직접 접근하거나 조작하지 않고, 해당 객체의 메서드를 호출하여 필요한 작업을 수행하는 방식을 권장합니다. 이를 통해 코드의 유연성이 향상되며, 변경이 필요한 경우 해당 객체만 수정하면 되므로 다른 객체에 영향을 덜 미치게 됩니다.
class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class School {
private Teacher teacher;
public School(Teacher teacher) {
this.teacher = teacher;
}
public void notifyTeacher() {
String teacherName = teacher.getName();
System.out.println("Notifying teacher: " + teacherName);
}
public Teacher getTeacher() {
return teacher;
}
}
위의 코드에서 "학교" 객체가 "선생님" 객체를 가져오는 메서드를 제공하면서 "학교" 객체는 "선생님" 객체의 내부 상태에 직접 접근할 수 있게 됩니다. 이는 디미터의 법칙을 어기는 것이며, 객체 간의 결합도가 높아질 수 있습니다.
class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
class School {
private Teacher teacher;
public School(Teacher teacher) {
this.teacher = teacher;
}
public void notifyTeacher() {
String teacherName = teacher.getName();
System.out.println("Notifying teacher: " + teacherName);
}
}
위의 코드에서 "학교(School)" 객체는 "선생님(Teacher)" 객체를 의존합니다. 그러나 "학교" 객체는 "선생님" 객체의 메서드만 호출하여 필요한 작업을 수행합니다. 이로써 "학교" 객체가 "선생님" 객체의 내부 상태에 직접 접근하지 않고 필요한 정보만 사용합니다
디미터의 법칙은 객체 지향 설계 원칙 중 SOLID 원칙 중 하나이며, 코드의 모듈성과 재사용성을 높이는데 도움을 줍니다.
SOLID 원칙 중에서도 "L"에 해당하는 "Liskov Substitution Principle"과 밀접한 관련이 있습니다.
리스코프 치환 원칙 = "하위 클래스는 언제나 기반 클래스로 대체 가능해야 한다"
디미터의 법칙은 이 원칙과 함께 객체 간의 의존성을 관리하고 코드의 유연성을 높이는 데에 중요한 역할을 합니다. 디미터의 법칙을 지키면 객체 간의 관계가 느슨해지므로, 서브타입이 기반 타입을 대체할 때도 예상치 못한 문제가 발생하지 않도록 보장합니다.
두 원칙 모두 객체 지향 설계의 핵심 원칙으로, 코드의 구조를 더 효과적으로 만들어 유지보수성과 확장성을 높이는데 기여합니다.
데이터의 은닉성과 캡슐화
: 데이터베이스나 다른 서비스의 내부 구조를 외부로부터 숨겨야 합니다. 디미터의 법칙을 준수하면서 데이터에 접근하거나 조작할 때는 해당 데이터의 메서드를 통해 필요한 작업을 수행해야 합니다.
외부 시스템과의 상호작용
: 백엔드는 여러 시스템과 상호작용하거나 API를 호출하는 경우가 많습니다. 디미터의 법칙을 준수하여 외부 시스템과의 연결을 중재하는 객체를 통해 필요한 정보만 가져오고, 다른 객체의 내부 상태에 직접 접근하지 않아야 합니다.
모듈 간의 의존성 관리
: 시스템은 다양한 모듈로 구성됩니다. 디미터의 법칙을 준수하여 각 모듈 간의 의존성을 최소화하고, 중재자 역할을 하는 객체를 통해 모듈 간의 상호작용을 조율합니다.
유지보수와 확장성 고려
: 코드는 지속적으로 유지보수되고 확장되어야 합니다. 디미터의 법칙을 준수하여 코드의 결합도를 낮추고, 변경이 필요한 경우 해당 모듈만 수정하여 전체 시스템에 미치는 영향을 최소화합니다.
객체 지향 설계의 원칙 적용
: 개발자는 객체 지향 설계의 원칙을 이해하고 적용해야 합니다. 디미터의 법칙은 SOLID 원칙 중 하나로, 객체 간의 관계 설계에 중요한 지침을 제공합니다.