프레임워크와 라이브러리의 차이점

urur-27·2025년 3월 14일

잡다한

목록 보기
5/17

프레임워크(Framework)라이브러리(Library)의 차이는 무엇일까?
둘을 구분하는 가장 큰 포인트는 "제어 흐름(Control Flow)"를 누가 주도하느냐"입니다. 일반적으로 라이브러리는 사용자가 필요한 시점에 호출(invoke)하여 사용하는 반면, 프레임워크는 이미 틀이 갖추어져 있어 사용자가 작성한 코드를 프레임워크가 알아서 호출(call)해 주는 형태를 띱니다.


1. 라이브러리(Library)

  • 정의: 특정 기능을 쉽게 구현할 수 있도록 미리 작성된 재사용 가능한 코드 집합.
  • 사용 방식: 라이브러리는 개발자가 직접 호출하여 사용합니다(“사용자가 라이브러리를 부른다.”).
    예를 들어, StringUtils, CollectionUtils 등의 유틸리티 라이브러리를 이용할 때, 개발자가 직접 StringUtils.capitalize("abc")처럼 메서드를 호출합니다.
  • 제어 흐름: 개발자가 제어권(흐름)을 쥐고 필요할 때 라이브러리를 불러 씁니다.
  • 예시:
    • Java 표준 라이브러리(java.util, java.io 등)
    • Apache Commons, Google Guava와 같은 유틸리티 라이브러리
    • JDBC API(JDBC 자체는 프레임워크적 성격이 일부 있긴 하지만, 일반적으로는 라이브러리처럼 호출하여 사용한다고 볼 수 있음)

2. 프레임워크(Framework)

  • 정의: 애플리케이션의 구조나 흐름을 미리 갖추고 있으며, 개발자가 그 안에 필요한 코드를 “끼워 넣는(Plug-in)” 형태로 사용하는 도구.

  • 사용 방식: 프레임워크가 전체적인 흐름을 관리하며, 개발자는 특정 지점에서 필요한 로직을 작성(예: 특정 인터페이스/메서드를 구현)해 두면, 프레임워크가 적절한 타이밍에 이를 실행합니다.

    • Hollywood Principle: “Don’t call us, we’ll call you.”라는 문구로 대표되는 원칙이 프레임워크의 동작 방식을 잘 보여줍니다.
  • 제어 흐름: 프레임워크가 제어권(흐름)을 갖고, 적절한 시점에 개발자 코드를 호출해 줍니다(Inversion of Control, IoC).

  • 예시:

    • Spring Framework:
      • 예) Spring MVC에서 @Controller를 작성해 두면, HTTP 요청이 들어왔을 때 프레임워크가 해당 컨트롤러의 메서드를 자동으로 호출합니다.
      • 개발자는 스프링이 제공하는 다양한 라이프사이클과 IoC/DI를 활용해 비즈니스 로직에 집중할 수 있습니다.
    • Java EE의 Servlet 컨테이너, JPA 등

3. Spring Framework와 일반 Java 라이브러리로 보는 차이점

1. 제어 흐름 주체

  • Spring:
    • 애플리케이션이 실행되면, 스프링 컨테이너가 애플리케이션의 구동 흐름을 제어합니다.
    • 의존성 주입(Dependency Injection), 라이프사이클 관리 등을 모두 Spring이 수행하며, 개발자는 필요한 메서드나 빈(Bean)만 정의해 두면 됩니다.
  • 일반 Java 라이브러리(예: Apache Commons Collections):
    • 개발자가 원하는 시점에 메서드를 명시적으로 호출합니다.
    • 예) CollectionUtils.isEmpty(someList), StringUtils.isNotBlank(someString)

2. 코드 작성 및 호출 방식

  • Spring:
    • 컨트롤러, 서비스, DAO 등에 어노테이션(@Controller, @Service, @Repository)을 달아두면, 스프링이 이를 스캔해서 관리합니다.
    • 이후 Spring MVC가 HTTP 요청을 수신하면, 내부 로직에 따라 적절한 컨트롤러를 찾아 메서드를 실행합니다(“Don’t call us, we’ll call you.”).
  • 일반 Java 라이브러리:
    • 별도의 초기화 과정이나 IoC 컨테이너가 없으며, 개발자가 필요할 때 해당 라이브러리 메서드를 직접 호출합니다.

3. 개발 방식에 미치는 영향

  • Spring:

    • 전반적인 애플리케이션 구조와 동작 방식을 프레임워크가 결정하고, 개발자는 그 구조 안에서 필요한 로직만 구현하기 때문에 아키텍처적인 일관성을 유지하기 쉽습니다.
    • 반면, 프레임워크 학습 비용이 있고, 프레임워크가 제공하는 구조(생명주기, 의존성 주입, 설정 방식 등)에 맞추어야 한다는 제약이 있습니다.
  • 일반 Java 라이브러리:

    • 단순히 특정 기능(예: 문자열 처리, 데이터 변환 등)을 사용하기 위한 코드 덩어리이므로, 원하는 시간에 원하는 곳에서 언제든지 호출해서 사용하면 됩니다.
    • 제약이 거의 없지만, 라이브러리끼리의 충돌이나 버전 관리 등은 개발자가 직접 책임져야 합니다.

4. 정리

  • 라이브러리는 사용자가 필요한 기능을 직접 호출해 쓰는 도구이고,
  • 프레임워크는 애플리케이션 실행 흐름을 프레임워크가 주도하며, 개발자가 작성한 코드를 적절한 타이밍에 호출합니다.

이러한 제어 흐름의 차이는 "제어의 역전(Inversion of Control, IoC)라는 개념으로 설명됩니다.
Spring Framework는 IoC, DI, AOP 등을 활용하여 애플리케이션 전체 흐름을 제공하며, 개발자가 해당 흐름 안에 코드를 작성하는 방식을 따르게 합니다. 반면, 일반 Java 라이브러리는 이러한 흐름 제어가 존재하지 않고, 필요 시점마다 수동으로 라이브러리를 호출하는 구조를 가지고 있습니다.

비교 항목라이브러리프레임워크
제어 흐름사용자가 직접 호출 (개발자가 흐름 제어)프레임워크가 흐름을 제어 (IoC)
설계 방식개발자가 원하는 방식으로 조합 가능정해진 구조와 규칙을 따라야 함
유연성자유롭게 사용 가능, 특정 패턴 강제 없음프레임워크에 종속되므로 제한적일 수 있음
초기 학습 비용낮음 (필요한 부분만 익히면 됨)높음 (프레임워크의 전체적인 구조와 개념을 익혀야 함)
개발 생산성작은 프로젝트에서 빠르게 개발 가능일정 규모 이상의 프로젝트에서 생산성이 높아짐
유지보수성프로젝트가 커질수록 복잡해질 가능성 있음일관된 구조를 유지할 수 있어 협업과 유지보수에 유리
성능가볍고 빠름기능이 많아 상대적으로 무거울 수 있음
테스트 및 확장성특정 기능 단위로 테스트 가능프레임워크의 다양한 지원으로 쉽게 테스트 및 확장 가능
profile
끄아악

0개의 댓글