틀 구조, 뼈대, 골격, 구조, 구성
소프트웨어의 특정한 클래스에 대하여 재사용할 수 있는 설계로 구성된 관련된 클래스들의 집합
아키텍처적인 가이드를 제공
모듈화, 재사용성, 확장성
인터페이스 뒤에 감추는 캡슐화로 모듈화(modularity)를 강화
프레임워크가 제공하는 인터페이스는 여러 애플리케이션에서 반복적으로 사용할 수 있는 일반적인 컴포넌트를 제공하며 재사용성(reusability)을 높여준다
다형성(polymorphism)을 통한 애플리케이션의 확장성(extensibility) 증대
공통 라이브러리(common library)와는 다름
라이브러리는 애플리케이션에서 공통적으로 사용할 수 있는 함수들의 집합
하지만 프레임워크의 경우에 제어 흐름의 주도권은 프레임워크에 있다
제어의 역전과 관련해 이해를 돕기 위해 더 언급하자면 Java는 객체 지향 언어이기에 객체를 위주로 프로그램이 전개
이 때, 단순히 개발자가 정의해 사용하는 Class 뿐만 아니라 구조의 뼈대가 되는(ex, controller, service 등)도 Class이기에 객체로 취급되며 사용되는데 제어의 역전이라는 것은 프로그램에 사용되는 일부 객체들의 생명주기를 프레임워크가 전담하다는 의미
만약 제어가 역전되지 않은 경우 controller, service를 포함한 class로 사용되는 모든 객체들을 사용자가 생성~삭제까지 관리해야되는데 소프트웨어가 운영되면서 controller, service와 같은 객체들이 어디서 호출되고 사용되며 언제 끝마치는지 개발자 입장에서 고려하기 쉽지 않음(프로그램 구조상 A부분에서 또는 B부분에서 가리지 않고 해당 service를 호출할 수도 있기에)
이를 프레임워크가 애너테이션을 이용해 대신 객체의 생산~삭제까지 제어하는 것
소프트웨어 시스템에 포함되어 있는 모든 클래스 즉, 구성 요소들의 인스턴스를 관리하고 이들 사이의 의존성을 주입하는 일을 담당하는 소프트웨어 구성요소
소프트웨어의 근본적인 어려움 2가지
마지막에 소프트웨어의 의존성을 낮추기 위해 각 소프트웨어들이 직접 다른 소프트웨어의 객체를 관리하는 것이 아닌 중간에서 객체들을 관리해주는 소프트웨어의 행위를 의미A, B 소프트웨어가 존재할 때 A에서 B객체를 직접적으로 생성해 사용하면 A는 B의 대한 큰 의존성을 가지기에 B의 수정이 A에 영향을 끼친다
이를 극복하는 하나의 방법으로 인터페이스를 이용하는 방법이 있다
인터페이스를 정의하고 B 클래스는 인터페이스를 상속(이 때 인터페이스에 정의되는 메서드는 이 전에 A 객체에서 사용되었던 B객체의 메서드), 이 시점에서 B 클래스를 수정해도 인터페이스로부터 상속 받은 메서드를 수정하지 않는 이상 B 클래스의 수정은 A 클래스의 영향을 끼치지 못한다.
하지만 역시 A 객체에서 B 객체를 선언하고 선언 된 B 객체의 인스턴스로 인터페이스 내부 메서드를 사용하는 것이기에 객체 선언에 대한 의존성은 여전히 존재한다.
여기서 의존성을 더 낮추고자 A 내에서 B 객체를 직접 생성하는 것이 아닌 분리한 인터페이스 객체를 생성하고 해당 인터페이스 객체에 B 객체를 주입한다. 이를 IoC 컨테이너라는 소프트웨어가 대신 하며 결국 A 내에서 인터페이스 객체를 생성하고 생성된 객체에 B를 주입하며 A 내에서 B 객체를 생성한 꼴이 된다. 이를의존성 주입
이라고 한다
// 인터페이스 사용 X
public class A {
private B b = new B();
public A() {
b.remove();
}
}
public class B {
public remove() {
}
}
// 인터페이스 사용
public class A {
private B b = new B();
public A() {
b.remove();
}
}
public class B implements C {
public remove () {}
}
public interface C {
public remove () {
}
}
// 의존성 주입 사용
public class A {
private C c;
public A(C c) {
this.c = c;
}
}
public class B implements C {
}
public interface C {
public remove() {
}
}
소프트웨어 패턴이라는 것은 일종의 가이드라인(guideline)이라고 생각하면 된다
자주 반복되는 상황을 경험을 기준으로 형식화한 것이 패턴(pattern)
템플릿을 작성해 패턴 적용을 자동화하고 이를 다시 컴파일된 형식으로 발전시킨 것이 프레임 워크
복잡성과 변경성
소프트웨어 시스템의 여러 구성 요소가 복잡하게 상호 연결되어 있다는 것과 요구 사항이 변경될 때 프로그램을 수정하기 어렵다는 것
의존성
을 간단하게 얘기하면 A, B라는 소프트웨어가 존재할 때 A 소프트웨어의 변경으로 B 소프트웨어가 영향을 받는다면 이는 B가 A에 대해 의존성을 갖는다 라고 할 수 있다인터페이스
를 이용해 의존성을 낮추는 즉, 소프트웨어의 결합도를 낮추는 방법 존재인터페이스
가 변경하지 않는 선까지 소프트웨어를 변경하면 낮은 의존성이 존재하는 다른 소프트웨어들은 수정하지 않아도 인터페이스
를 계속 사용가능하다POM(Project Object Model)
: 프로젝트 객체 모델 정보를 담고 있는 파일
dependency
를 이용해 프로젝트가 의존하는 다른 프로젝트에 대한 정보 요소 설정groupId
: 의존 프로젝트 그룹 IDartifacId
: 의존 프로젝트 아티팩트 ID일반적으로 메이븐 중앙 레파지토리에서 다운로드 받는다(http://www.repo1.maven.org/maven2)
USER_HOME\m2\repository\groupId\artifactId\version
서브 디렉토리에 저장)