안녕하세요. 개발하는 정주입니다.
오늘은 "프레임워크(Framework)와 라이브러리(Library)"에 대해 알아보겠습니다.
익숙한 개념이라 잘 알고 있다고 생각했는데 착각이었더라고요.
프레임워크와 라이브러리가 무엇인지 정확히 알아봅시다.
마지막에는 프레임워크와 라이브러리의 차이점에 대해서도 알아보겠습니다.
프레임워크(Framework)
프레임워크에 대해 먼저 알아봅시다.
프레임워크 개념
software framework is an abstraction in which software, providing generic functionality, can be selectively changed by additional user-written code, thus providing application-specific software
직역하면 "사용자가 작성한 추가 코드에 의해 선택적으로 변경되어 애플리케이션 고유의 소프트웨어를 제공할 수 있는 추상화"라고 할 수 있습니다.
쉽게 말해 프레임워크란 개발자에게 구조와 형태를 제공하는 뼈대입니다.
개발자는 프레임워크가 제공하는 뼈대 위에 추가 코드를 작성하여 개발할 수 있습니다.
뿐만 아니라 앱의 구동, 메모리 관리도 프레임워크가 담당하죠.
프레임워크 사용 목적
프레임워크를 사용하는 가장 큰 목적은 생산성입니다.
프레임워크에는 많은 구조적인 코드나 라이브러리가 포함되어 있습니다.
개발자는 프레임워크의 기반 코드만큼 코드를 덜 작성할 수 있는 것이죠.
예를 들어, 프레임워크에서 차를 제공하면 사람은 제공 받은 차를 운전하기만 하면 됩니다.
프레임워크가 없다면 차를 직접 생산해서 운전해야 하는데 그건 상상만해도 끔찍하죠?
기반 코드 뿐만 아니라 프레임워크의 다른 면도 생산성 향상에 도움을 줍니다.
프레임워크는 공통의 틀을 제공하여 코드 품질을 높일 수 있습니다.
많은 개발자가 하나의 프로젝트를 진행한다면 통일성이 낮아져서 전체적인 가독성이 떨어집니다.
사람마다 코드 습관이 다르고 선호하는 패턴도 다를테니까요.
프레임워크를 이용하면 어느 정도는 틀이 잡히니 거기에 맞추기만 한다면 이러한 문제를 해결할 수 있습니다.
프레임워크 예시
iOS에서 가장 대표적인 프레임워크는 UIKit입니다.
UIKit은 iOS와 tvOS를 개발하는데 필요한 core 객체를 제공합니다.
인터페이스 구성을 위한 view 아키텍처, Multi-Touch를 포함한 여러 이벤트 핸들링 등 개발자를 위한 기반 코드를 제공합니다.
UIKit에 대한 더 자세한 내용은 공식 문서로 토스~
UIKit에 import 되어 있는 Foundation 프레임워크도 보시면 좋습니다.
라이브러리(Library)
이제 라이브러리에 대해 알아보겠습니다.
라이브러리 개념
라이브러리는 소프트웨어 개발에 필요한 특정 기능을 위해 작성한 코드, 함수들의 집합입니다.
공통으로 사용될 수 있는 기능들을 모듈화한 것으로 완전한 프로그램이 아니라 특정한 부분 기능만을 수행하도록 제작 됩니다.
라이브러리와 API를 혼동할 수 있는데 라이브러리는 구현 로직이 존재하는 컴포넌트 그 자체이고 API는 그것을 활용하는 규약입니다.
실제 구현체와 규약의 차이로 생각하면 됩니다.
라이브러리 사용 목적
라이브러리를 쓰는 목적은 생산성과 편의성입니다.
개념에서 봤듯이 "공통 기능의 모듈화"는 굉장히 강력한 특징입니다.
원하는 구현 사항이 있을 때 다른 사람이 이미 라이브러리로 만들어놨다면 몇 줄만에 구현을 완료할 수 있습니다.
반대로 내가 구현한 기능을 다른 사람에게 제공할 수도 있습니다.
원래의 코드 길이에 상관 없이 기능이 모듈화된 라이브러리를 쓰는 사람은 매우 편하게 개발할 수 있는 것이죠.
예를 들어, 무언가를 자르기 위한 기능을 수행하기 위해 "가위"라는 것을 만들었습니다.
이 가위가 있다면 다른 사람은 굳이 똑같은 가위를 만들지 않아도 되고 편하게 무언가를 자를 수 있을 것입니다.
이건 조사를 하며 발견한 재밌는 짤인데요.
라이브러리를 썼을 때가 안 썼을 때보다 명확하게 편리하다는 것을 알 수 있습니다.
이렇게 라이브러리는 개발의 편의를 좋게 해주지만 라이브러리를 남용하면 기본기가 약해진다는 단점이 있습니다.
따라서 라이브러리를 적절히 사용하는 능력이 필요합니다.
라이브러리 예시
라이브러리는 종류가 매우 다양하고 양도 많습니다.
iOS에서 자주 사용하는 라이브러리는 snapkit, rxswift, alamofire가 있습니다.
프레임워크와 라이브러리 차이
프레임워크와 라이브러리의 가장 큰 차이는 Flow(흐름)의 제어에 대한 주도성입니다.
프레임워크는 전체적인 흐름 제어의 주도권이 스스로에게 있습니다.
이를 제어의 역전(IoC, Inversion of Control)이라고 하는데요.
프레임워크가 개발자의 코드를 호출한다는 의미입니다. (interface 구현, 상속, delegate 등을 통해 개발자의 코드를 호출함)
프레임워크의 개념을 이해했다면 제어의 역전에 대해서도 쉽게 이해가 가능할텐데요.
프레임워크가 뼈대를 제공하고 개발자는 뼈대에 살을 붙입니다.
살은 뼈대를 따라 붙일 수밖에 없으니 주도권이 뼈대에 있다고 말할 수 있는 것이죠.
라이브러리는 주도권이 개발자, 즉 호출하는 쪽에 있습니다.
개발을 하면서 필요한 라이브러리가 있을 때 개발자가 호출을 합니다.
전체 흐름의 주도권이 호출하는 쪽에 있는 것입니다.
사람이 가위나 칼같은 도구를 쓰는거지 도구가 사람을 쓰는 것은 아니잖아요? ㅎㅎ
이런 생각을 할 수 있습니다.
나는 모든 흐름을 내가 제어하고 싶어! 프레임워크 없이 라이브러리로만 개발하면 안 될까?
물론 됩니다. 심지어 라이브러리도 안 써도 됩니다.
하지만 직접 구현할 시간과 노력, 실력이 필요하겠죠.
그러니 적절한 프레임워크와 라이브러리를 선택하는 능력을 길러서 효율적인 개발을 할 생각을 하는 게 좋을 것 같네요.
감사합니다!
참고
https://webclub.tistory.com/458
https://cocoon1787.tistory.com/745
https://developer.apple.com/documentation/foundation
https://developer.apple.com/documentation/uikit
https://zdnet.co.kr/view/?no=00000039160910
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.