인터페이스 기반 프로그래밍

인터페이스 기반 프로그래밍(Interface-based programming) 또는 인터페이스 기반 아키텍처는 모듈 시스템이 없는 객체 지향 프로그래밍 언어에서 컴포넌트 수준의 모듈형 프로그래밍을 구현하기 위한 아키텍처 패턴이다. 이러한 언어의 예로 자바 9에서 도입된 컴포넌트 수준의 모듈 시스템인 자바 플랫폼 모듈 시스템(Java Platform Module System)이 없었던 자바 9 이전의 자바를 들 수 있다. 자바 8까지의 자바는 단순히 패키지 시스템만을 가지고 있었으나, 자바 소프트웨어 컴포넌트는 일반적으로 여러 개의 자바 패키지로 구성되며, 컴포넌트가 단일 자바 패키지로만 구성된 경우라도 인터페이스 프로그래밍은 단순히 자바 패키지를 사용하는 것보다 더 많은 장점을 제공할 수 있다.

인터페이스 기반 프로그래밍은 애플리케이션을 컴포넌트의 집합으로 정의하며, 컴포넌트 간의 애플리케이션 프로그래밍 인터페이스(API) 호출은 구체적인 클래스가 아닌 추상 인터페이스를 통해서만 이루어져야 한다. 클래스의 인스턴스는 일반적으로 팩토리 패턴과 같은 기술을 사용하여 다른 인터페이스를 통해 얻게 된다.

이 방식은 애플리케이션의 모듈성을 높여 유지 보수성을 향상시킨다고 주장된다. 그러나 주의가 필요하다 단순히 애플리케이션을 인터페이스로 통신하는 임의의 컴포넌트로 나누는 것만으로는 유지 보수성의 핵심 속성으로 여겨지는 낮은 결합도나 높은 응집도를 보장하지 않기 때문이다.

인터페이스 기반 아키텍처는 제3자 혹은 동일 조직 내의 서로 다른 팀이 기존 시스템을 위한 추가 컴포넌트나 플러그인을 개발할 때 사용될 수 있다. 이클립스 IDE의 코드베이스가 인터페이스 기반 프로그래밍의 대표적인 예이다. 이클립스 플러그인 공급업체는 모 애플리케이션 공급업체인 이클립스 재단이 지정한 인터페이스를 충족하는 컴포넌트만 개발하면 된다. 실제로 이클립스에서는 자바 개발 도구(JDT)와 같은 원래의 컴포넌트들조차 그 자체로 플러그인이다. 이는 휴대 전화 제조업체가 휴대폰 충전기 인터페이스(핀 배열, 예상 직류 전압 등)를 규정하고, 제조업체와 제3자 모두가 이 표준 인터페이스 사양을 준수하는 자체 휴대폰 충전기를 만드는 것과 비슷하다.

 인터페이스 기반 프로그래밍에서의 소프트웨어 진화 
서로 다른 팀이 협업할 수 있도록 인터페이스를 사용하는 것은, 인터페이스 기반 프로그래밍에서 인터페이스 변경이 어떻게 일어나는지에 대한 문제를 제기한다. 문제는 새로운 메서드를 추가하는 등 인터페이스가 변경되면, 해당 인터페이스를 구현하도록 작성된 기존 코드가 더 이상 컴파일되지 않는다는 점이다 또한 동적으로 로드되거나 링크되는 플러그인의 경우, 로드 또는 링크에 실패하거나 런타임에 충돌이 발생할 수 있다. 이 문제를 해결하기 위한 두 가지 기본 접근 방식이 있다:

 기존 인터페이스에서 상속받을 수 있는 추가 기능을 가진 새로운 인터페이스를 개발한다.
 유의적 버전 2.0과 같은 소프트웨어 버전 관리 정책을 인터페이스 구현자에게 전달하여, 플랫폼의 향후 "주요(major)" 버전에서 전방 불일치 또는 후방 불일치 변경을 허용한다.

두 가지 접근 방식 모두 자바 플랫폼에서 사용되어 왔다.

 계약에 의한 설계 
인터페이스 발행자는 일반적으로 소프트웨어의 새로운 "부정(minor)" 버전에서 인터페이스를 변경하지 않겠다고 약속하며, 구현자는 인터페이스를 구현함으로써 인터페이스의 필수적인 부분을 일탈 없이 구현했음을 암시한다. 따라서 인터페이스는 제공자와 소비자 사이의 "계약적 합의"로 볼 수 있다. 이 계약이 소프트웨어 사양으로서 보다 공식적으로 문서화된다면, 이는 계약에 의한 설계의 한 예가 된다. 그러나 계약에 의한 설계 그 자체가 모든 컴포넌트에 대해 인터페이스 사용을 의무화하는 것은 아니다.

 같이 보기 
 마이크로서비스
 행위자 모델
 CORBA: 여러 이유로 현재는 거의 사용되지 않는 오래된 객체 지향 소프트웨어용 컴포넌트 기반 시스템
 자바 플랫폼 모듈 시스템: 자바 9와 함께 도입된 자바 프로그래밍 언어의 컴포넌트 수준 모듈 시스템

 각주 
 C# Interface Based Development, c-sharpcorner.com
 Interface Based Development – The Unified Modeling Language (UML), devmentor.org
 Architecting a large application with interface-based architecture, rhyous.com, 18 October 2011
 Understanding Interface-based Programming, Microsoft Developers Network, accessed 16 September 2016

분류:아키텍처 패턴