구현 클래스가 하나뿐인데 인터페이스를 사용해야 하는가?

김민규·2023년 6월 28일
0

java

목록 보기
7/7

인터페이스를 사용하는 일반적인 이유는 인터페이스가

  • 프로세스 외부 의존성을 추상화해 느슨한 결합을 달성하고,
  • 기존 코드를 변경하지 않고 새로운 기능을 추가해 공개 폐쇄 원칙(OCP, Open-Closed principle)을 지키기 때문이다.

이 두 가지 이유 모두 오해다.

단일 구현을 위한 인터페이스는 추상화가 아니며 🙅, 해당 인터페이스를 구현하는 구체 클래스보다 결합도가 낮지 않다.
진정한 추상화는 발견하는 것이지, 발명하는 것이 아니다.
의미상 추상화가 이미 존재하지만 코드에서 아직 명확하게 정의되지 않았을 때 그 이후에 발견되는 것이다.
따라서 인터페이스가 진정으로 추상화되려면 구현이 적어도 두 가지는 있어야 한다.

두 번째 이유는 더 기본적인 원칙인 YAGNI(You aren't gonna need it)를 위반하기 때문에 잘못된 생각이다.
YAGNI는 현재 필요하지 않은 기능에 시간을 들이지 말라는 것이다. ⏳
이러한 향후 기능이 어떤지 설명하려고 기능을 개발해서도, 기존 코드를 수정해서도 안 된다.
크게 두 가지 이유가 있다.

  • 기회 비용: 현재 비즈니스 담당자들에게 필요하지 않은 기능에 시간을 허비하는 것이다.
  • 프로젝트 코드가 적을수록 좋다. 요구 사항이 바로 있는 경우가 아닌데도 만일을 위해 코드를 작성하면 코드베이스의 소유 비용이 불필요하게 증가한다. 🆙

코드를 작성하는 것은 문제를 해결하는 값비싼 방법이다. 해결책에 필요한 코드가 적고 간단할수록 더 좋다.

프로세스 외부 의존성에 인터페이스를 사용하는 이유는 무엇인가?

  • 각 인터페이스에 구현이 하나만 있다고 가정할 때 프로세스 외부 의존성에 인터페이스를 사용하는 이유는 무엇일까?
    • 목을 사용하기 위함이다.
  • 인터페이스가 없으면 테스트 대역을 만들 수 없으므로 테스트 대상 시스템과 프로세스 외부 의존성 간의 상호 작용을 확인할 수 없다.
  • 따라서 이러한 의존성을 목으로 처리할 필요가 없는 한, 프로세스 외부 의존성에 대한 인터페이스를 두지 말라.
  • 비관리 의존성(ex: SMTP 서버, 메시지 버스)만 목으로 처리하므로, 결국 비관리 의존성에 대해서만 인터페이스를 쓰라는 지침이 된다.

참조

profile
Backend Engineer, Vim User

0개의 댓글