소프트웨어 프레임워크

소프트웨어 프레임워크(software framework)는 개발자가 완전한 솔루션을 만들기 위해 확장하거나 맞춤화할 수 있는 재사용 가능하고 일반적인 기능을 제공하는 소프트웨어다.  간단히 뼈대, 골조(骨組), 프레임워크(framework)라고도 한다. 이는 저수준 코드와 인프라에 대한 추상화 계층을 제공하여 개발자가 공통 기능을 처음부터 구축하기보다는 비즈니스 로직을 구현하는 데 집중할 수 있도록 한다. 일반적으로 프레임워크는 개발자가 일반적인 기능을 다시 구현하는 대신 비즈니스 요구 사항을 충족하는 데 집중할 수 있게 함으로써 생산성을 높이는 것을 목표로 한다. 프레임워크에는 대규모 소프트웨어 플랫폼이나 환경 내에서 다양한 구성 요소를 통합하는 지원 프로그램, 컴파일러, 소프트웨어 개발 키트, 코드 라이브러리, 도구 모음 및 API가 포함되는 경우가 많다.

사용자 코드가 프로그램의 제어 흐름을 제어하는 라이브러리와 달리, 프레임워크는 전체적인 구조를 지시하고 사전 정의된 확장 지점(예: 템플릿 메소드 패턴 또는 훅)에서 사용자 코드를 호출함으로써 제어 반전을 구현한다. 또한 프레임워크는 즉시 사용 가능한 기본 동작, 구조화된 확장 가능성 메커니즘, 그리고 직접적인 수정 없이 확장(예: 플러그인 또는 하위 클래스)을 수용하는 고정된 핵심 기능을 제공한다.

프레임워크는 확장 프로그램을 통한 웹 브라우저나 모드를 통한 비디오 게임과 같이 확장 가능한 애플리케이션과는 다르다. 프레임워크는 특정 아키텍처 패턴을 따르면서 확장 지점을 통해 완성되도록 설계된, 의도적으로 불완전한 뼈대라는 점이 특징이다. 예를 들어, 웹 프레임워크를 사용하여 은행 웹사이트를 개발하는 팀은 웹 요청 처리나 상태 관리와 같은 저수준 세부 사항을 처리하는 대신 은행 비즈니스 로직을 작성하는 데 집중할 수 있다.

 라이브러리와의 비교 
소프트웨어 프레임워크는 다음과 같은 핵심적인 방식에서 표준 라이브러리와 다르다:

 제어 반전: 라이브러리에서는 사용자 코드가 프로그램의 흐름을 제어하고 필요에 따라 라이브러리 함수를 호출한다. 프레임워크에서는 프레임워크가 흐름을 제어하고 종종 템플릿 메소드 패턴을 통해 특정 지점에서 사용자 코드를 호출한다.
 기본 동작: 프레임워크는 사전 정의된 구조 내에서 그대로 사용하거나 맞춤화할 수 있는 사전 구현된 기능(예: 표준 기능 또는 워크플로)을 제공한다. 반면 라이브러리는 사용자 코드가 기능을 조립하고 구성해야 한다.
 구조화된 확장 가능성: 프레임워크는 훅, 콜백 또는 API와 같은 구조화된 메커니즘을 통해 새로운 기능이나 변경된 동작을 가능하게 한다. 라이브러리도 확장을 허용하지만 사전 정의된 통합 지점이 없으므로 통합을 위해 사용자 코드에 의존한다.
 개방-폐쇄 원칙: 프레임워크의 핵심 로직은 일반적으로 고정되어 있어 확장(예: 플러그인 또는 하위 클래스)은 허용하지만 프레임워크 자체의 수정은 허용하지 않는다.

 패턴 
볼프강 프리(Wolfgang Pree)에 따르면, 소프트웨어 프레임워크는 '프로즌 스폿'(frozen spots)과 '핫 스폿'(hot spots)으로 구성된다. 프로즌 스폿은 소프트웨어 시스템의 전체적인 아키텍처, 즉 기본 구성 요소와 그들 사이의 관계를 정의한다. 이들은 애플리케이션 프레임워크의 모든 인스턴스화에서 변경되지 않은 상태(고정된 상태)로 유지된다. 핫 스폿은 프레임워크를 사용하는 프로그래머가 자신의 프로젝트에 특화된 기능을 추가하기 위해 자체 코드를 추가하는 부분을 나타낸다.

필요한 기능은 템플릿 메소드 패턴을 사용하여 구현할 수 있는데, 여기서 프로즌 스폿은 불변 메서드(invariant methods)로 알려져 있고 핫 스폿은 가변 메서드 또는 훅 메서드(hook methods)로 알려져 있다. 상위 클래스의 불변 메서드는 기본 동작을 제공하는 반면, 각 하위 클래스의 훅 메서드는 맞춤형 동작을 제공한다.

소프트웨어 프레임워크를 사용하여 구체적인 소프트웨어 시스템을 개발할 때, 개발자는 시스템의 특정 니즈와 요구 사항에 따라 핫 스폿을 활용한다. 소프트웨어 프레임워크는 할리우드 원칙(Hollywood Principle)인 "우리에게 전화하지 마세요, 우리가 당신을 부를 것입니다"에 의존한다. 이는 사용자 정의 클래스(예: 새로운 하위 클래스)가 사전 정의된 프레임워크 클래스로부터 메시지를 받는다는 것을 의미한다. 개발자는 일반적으로 추상 메서드를 구현함으로써 이를 처리한다.

 트레이드오프 

프레임워크 사용의 한 가지 잠재적인 단점은 프로그램의 크기가 커진다는 것인데, 이를 코드 비대화라고 한다. 동일한 코드베이스에서 경쟁 관계에 있는 여러 프레임워크를 사용할 경우 이 현상은 더욱 심화될 수 있다.

프레임워크 사용법을 배우는 데 상당한 시간이 걸릴 수 있다. 프레임워크를 사용하여 얻는 의도된 효율성보다 이를 배우는 비용이 더 클 수 있으며, 특히 개발 인력에게 생소한 프레임워크의 경우 더욱 그렇다. 그러나 일단 프레임워크를 익히고 나면 향후 작업에서 개발 팀의 속도가 빨라질 수 있다.

일부에서는 가장 효과적인 프레임워크는 초기 개발 단계에서부터 만들어지기보다는, 일반적인 목적을 위해 제3자가 개발한 범용 프레임워크처럼 기존 솔루션을 리팩터링하는 과정에서 진화한다고 주장한다.

 예시 
프레임워크는 일반적으로 다음과 같은 특정 문제 도메인에 집중한다:

 예술적 드로잉, 음악 작곡 및 기계 CAD
 재무 모델링 애플리케이션
 지구 시스템 모델링 애플리케이션
 의사결정 지원 시스템
 미디어 재생 및 제작
 웹 프레임워크
 미들웨어
 애플리케이션 프레임워크 – 일반 GUI 애플리케이션
 전사적 아키텍처 프레임워크

주목할 만한 프레임워크:
 Cactus Framework – 고성능 과학 컴퓨팅
 Oracle Application Development Framework
 라라벨 (PHP 프레임워크)
 Pipedream
 Php4delphi
 OpenSilver - 마이크로소프트 실버라이트, WPF 및 LightSwitch 기반의 레거시 애플리케이션을 웹어셈블리 애플리케이션으로 포팅할 수 있게 해줌

 같이 보기 

 애플리케이션 프레임워크
 웹 프레임워크
 뼈대 구조
 전자정부 표준프레임워크

 각주 

분류:통합 개발 환경
분류:객체 지향 프로그래밍
분류:소프트웨어 구조
분류:소프트웨어 디자인 패턴