DataProcessor
구현 클래스 이름 없이 log, warn,
error만 호출한다.
소비 코드는 Logger 메서드만 알고, 실제 기록 방식은
생성자에서 주입되는 구현체가 담당한다.
OCP + DIP
구현 클래스 이름 없이 log, warn,
error만 호출한다.
계약을 채우는 세부 사항이며 런타임 선택으로 갈아 끼울 수 있다.
새 저장소가 필요해도 기존 소비자는 수정 대상이 아니다.
파일이나 콘솔 부작용 없이 호출 기록만 검증한다.
인터페이스가 중간 계약이 되면 고수준 모듈은 추상화에 의존하고, 저수준 구현체는 그 추상화를 만족시키는 방향으로 붙는다.