프레임워크는 애플리케이션 개발에 필요한 코드, 알고리즘, DB커넥션 등의 기능들을 위해 구조를 제공한다. 개발자는 이러한 구조 위에서 코드를 작성해 원하는 애플리케이션을 개발할 수 있다.
프레임워크는 소프트웨어의 구체적인 부분에 해당하는 설계와 구현을 재사용이 가능하게끔 상호 협력하는 클래스와 인터페이스의 집합이라고 할 수 있다.
하지만 사용자는 이러한 구조를 수정할 수 없고, 제공하는 틀에 따라 코드를 작성해야 한다. 즉, 통제권은 사용자가 아닌 프레임워크가 가지고 있다.
라이브러리는 개발에 필요한 것들을 미리 구현해놓은 도구라고 할 수 있다. 재사용이 가능한 기능을 미리 구현해놓고 필요한 곳에서 호출하여 사용 가능하도록 만들어진 집합이다.
프레임워크는 틀이고 그 안에서 재사용이 가능하도록 만들어진 도구들을 라이브러리라고 한다.
프레임워크는 라이브러리를 포함한다. 프레임워크 위에 개발자가 작성한 애플리케이션 코드가 올라가고, 이 애플리케이션 코드에서 라이브러리를 호출할 수 있다.
이처럼 둘의 가장 큰 차이는 제어 흐름이 어디에 있는가 이다. 프레임워크는 제어 역전의 개념이 적용되고 있다. 프레임워크에게 제어 역할을 넘겨, 개발자가 코드에서 신경써야 할 부분을 줄이는 의미이다.
프레임워크는 전체적인 흐름을 쥐고 있으며 애플리케이션 코드는 프레임워크에 의해 사용된다. 애플리케이션 코드는 프레임워크가 짜놓은 틀 안에서 수동적으로 동작하기 때문에 제어의 흐름은 프레임워크에게 있다. 즉 프레임워크가 정해둔 코드와 알고리즘 같은 것들을 개발자가 그 규칙에 따라 작성하여 사용하는 것이다.
반면에 라이브러리는 개발자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓰게 된다. 즉, 개발자에게 전적으로 제어 흐름이 있으며 필요할 때마다 능동적으로 라이브러리를 호출하여 사용한다. 라이브러리를 사용하더라도 프레임워크가 정한 방식에 따라야 하지만 어떻게 사용할 지는 개발자가 정할 수 있다.