초고
일주일 전, 팀스파르타 프론트엔드 면접에서 "프레임워크와 라이브러리의 차이점"에 대해 질문받았지만 제대로 답변을 하지 못했다. 그래서 한 번 정리해봤다.
프레임워크와 라이브러리는 소프트웨어 개발에서 중요한 역할을 하는 두 가지 다른 컴퓨팅 개념이다.
프레임워크
- Framework
- 소프트웨어 개발을 위한 구조나 기반을 제공하는 추상적인 개발 환경
- 애플리케이션의 기본 구조와 뼈대를 정의하고 개발자에게 이를 따르도록 강제한다.
- 개발자는 프레임워크에 정의된 규칙과 구조를 따라야 하며, 이로써 코드의 일관성과 유지보수성이 향상된다.
- 예시: Spring(Java), Ruby on Rails(Ruby), Django(Python) 등
목적
애플리케이션의 전체적인 아키텍처와 설계 패턴을 제공하는 것
특징
- 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성되어 있습니다.
- 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법을 정의합니다.
- 컴포넌트들은 재사용이 가능합니다.
- 높은 수준에서 패턴들을 조작화 할 수 있습니다.
장점
- 개발 시간 단축: 프레임워크는 개발자가 처음부터 모든 것을 만들 필요 없이 기존의 구조와도구를 활용할 수 있으므로 개발 시간을 단축시킨다.
- 안정성 및 보안: 프레임워크는 보안 및 안정성을 향상시키는 최선의 모법 사례를 제공한다.
단점
- 낮은 자유도: 프레임워크를 사용하려면 프레임워크가 지원하는 방식대로 코드를 작성해야 한다.
- 높은 학습 곡선: 프레임워크에 대한 초기 학습이 필요하다.
라이브러리
- Library
- 개발자가 필요에 따라 사용할 수 있는 독립된 코드 모듈의 집합
- 특정 기능을 수행하는 함수, 클래스 또는 모듈을 제공하며, 개발자는 필요한 기능을 선택할 수 있다.
- 프로젝트의 구조나 뼈대를 정하지 않으며, 라이브러리를 사용하는 방법은 개발자의 자유에 따라 결정된다.
- 예시: NumPy, React, jQuery 등
목적
특정 기능을 쉽게 구현할 수 있도록 도와주는 것
장점
- 유연성: 라이브러리를 선택적으로 사용할 수 있으므로 프로젝트의 요구 사항에 맞게 조합하여 사용할 수 있다.
- 낮은 학습 곡선: 라이브러리는 프레임워크보다 사용이 간단하며, 러닝 커브가 낮다.
단점
- 일관성 유지 어려움: 라이브러리를 조합하여 사용할 때 일관성을 유지하기 어려울 수 있으며, 개발자의 판단에 따라 다양한 방식으로 사용될 수 있다.
- 의존성 관리: 특정 기능을 구현하기 위해 여러 라이브러리를 조합할 경우 의존성 관리에 주의가 필요하다.
차이
- 프레임워크와 라이브러리의 차이는 "제어 흐름에 대한 주도성이 누구에게/어디에 있는가"에 있다.
- 즉, "어플리케이션의 Flow(흐름)을 누가 쥐고 있느냐"에 달려 있다.
- 프레임워크는 전체적인 흐름을 스스로(프레임워크)가 쥐고 있으며 사용자는 그 안에서 필요한 코드를 짜 넣는다.
- 라이브러리는 사용자가 전체적인 흐름을 만들며 라이브러리를 가져다 쓴다.
프레임워크는 가져다가 사용한다기보다는 거기에 들어가서 사용한다는 느낌/관점으로 접근할 수 있다.
제어의 역전
- IoC(Inversion of Control)
- 어떤 일을 하도록 만들어진 프레임워크에 제어의 권한을 넘김으로써 클라이언트 코드가 신경써야 할 것을 줄이는 디자인 원칙이다.
- 이것을 "제어가 역전되었다"라고 한다.
- 프레임워크를 규정하는 특성은 "프레임워크의 메서드가 사용자의 코드를 호출한다"는 데 있다.
- 이 원칙은 코드의 결합도를 낮추고 유연성을 향상시키며, 코드의 재사용성과 테스트 용이성을 증가시키는 데 도움을 준다.
어떻게 프레임워크가 나의 메서드를 호출하는가
제어를 역전시키는(프레임워크가 나의 코드를 호출할 수 있게 하는) 방법
- 콜백 메서드 (Callback Methods): 프레임워크는 특정 이벤트 또는 라이프사이클 단계가 발생할 때 정의한 콜백 메서드를 호출한다. 개발자는 이벤트 핸들러 또는 콜백 메서드를 구현하여 프레임워크가 해당 이벤트에 대응하는 메서드를 호출하도록 한다. 예를 들어, 웹 프레임워크에서 HTTP 요청이 발생하면 요청을 처리하는 메서드가 호출된다.
- 프레임워크 제공 기반 클래스 확장 (Framework Provided Base Class Extension): 프레임워크는 개발자가 확장할 수 있는 기반 클래스를 제공하며, 이 클래스에서 정의된 메서드를 오버라이드하여 나만의 로직을 추가한다. 프레임워크는 이런 확장된 클래스의 인스턴스를 생성하고 내부적으로 메서드를 호출한다. 예를 들어, Android 앱 개발에서는 Activity나 Fragment 클래스를 확장하여 메서드를 재정의하여 액티비티 또는 프래그먼트 수명 주기 동안 특정 작업을 수행한다.
- 의존성 주입 (Dependency Injection): 프레임워크는 의존성 주입을 통해 개발자가 작성한 클래스의 인스턴스에 필요한 객체를 주입한다. 이러한 주입된 객체를 사용하여 개발자가 작성한 메서드를 호출한다. 주로 Spring 프레임워크에서 사용되며, 개발자가 서비스나 빈을 정의하고 프레임워크가 해당 객체를 생성 및 관리한다.
참고
'IT > CS' 카테고리의 다른 글
[네트워크] CDN과 CloudFront (0) | 2023.07.22 |
---|---|
[네트워크] VPC (0) | 2023.07.22 |
[네트워크] Load Balancer와 ELB (0) | 2023.07.22 |
[네트워크] 웹소켓(WebSocket) (0) | 2023.07.07 |
백엔드 Node.js를 쓰는 이점 (0) | 2023.07.05 |