사실 인터페이스와 구현을 분리하는 가장 큰 이유는, 인간의 인지능력 제약 때문입니다.
사람은 한번에 7개 이상의 사실을 동시에 고려하면서 정신적인 일을 할수 없으며, 7개라는 숫자는 인지능력이 매우 좋은 사람의 경우이고 보통의 사람은 3~4개정도만을 고려 할수 있습니다.
그러므로 한번에 신경쓸게 적게 하는 방법을 찾다보면, 결국 한번에 신경쓸것을 줄이자라는 방법을 추구하게 됩니다. (모듈/캡슐화/...)
인터페이스/메소드명만 보고 그게 무슨일을 할지 알 수 있다면, 복잡한 구현을 볼 필요가 없겠지요. (심지어는 구현도차도 동적으로 만들어 낼수도 있으니까요. 대표적인 예라면 Spring Data JPA의 Repository를 한번 찾아보세요)
그럼 메소드명만 좋아도 되지 않느냐라고 생각할수 있지만, 인터페이스는 여기에 관련된 메소드들을 모아두었다라는 문맥을 제공하여 GoodsRepository라는 인터페이스만 봐도 상품과 관련된 조회는 여기서 하면 되겠구나라는, 메소드명을 보지 않아도 되게하여 인지 부하를 낮춰줍니다.
그런데 문제는....
OOP에 익숙하지 않은 개발자가 보기에 이것이 불필요한 작업으로 보이며, 클래스의 숫자가 많아 지기 때문에 더 "복잡"하다고 느낍니다.
이런 편견을 악화 시키는 것이 프로젝트에서 기술적/관례적으로 기계적으로 찍어내는 인터페이스/구현 입니다. 메소드 한두개 만들고 싶은건데 클래스가 두개나 되는건 매우 복잡한 거라고 생각하죠.
모듈화나 OOP를 잘 하다 보면 작은 모듈/클래스가 많아 지는 경향이 있는데, OOP를 잘하는 사람은 "단일 책임"을 가지게 되어서 "쉬워졌다"고 보지만, 아닌 사람은 클래스가 "많아져서" 오히려 "복잡해졌다"라고 보더라고요.
저는 이런 것때문에 디자인 추가는 "필요"할때 하는게 좋다고 적었던 건데요. 생각보다 어려운 주제입니다. 개인적 욕심과 프로젝트 팀원 수준 고려등등...