프레임워크는 뭐고, 라이브러리는 뭔데?

yeolyeol·2023년 5월 26일
1

til

목록 보기
1/8
post-thumbnail

👨🏻‍💻 : 프레임워크와 라이브러리의 차이에 대해 설명해주세요-
👀 : 프레임워크는 뼈대고 라이브러리는 모듈이라고 들었습니다!
👨🏻‍💻 : 주로 사용하시는 프레임워크나 라이브러리가 있을까요?
👀 : ...아..음..인텔리제이나...이클립스가 있습니다..(헤헤)


학부생 시절 인턴에 들어가기위해 면접을 봤었는데, 그때 받았던 질문 중 하나였다.
지금 생각해보면 인텔리제이, 이클립스를 말했던 내 자신이 부끄러웠다.
당연하게도 인턴에는 떨어졌고, 그냥 쭈글탱쭈글탱 하면서 프로젝트를 했던 기억이 있다.

물론 지금은 Tool을 프레임워크나 라이브러리라고 설명하지 않지만, 이후에 다시 망각하고 같은 실수를 반복할 미래의 나에게, 그리고 혹시 이 글을 보는 누군가를 위해 포스팅하고자 한다.


정의

✔️프레임워크
: 원하는 기능 구현에 집중하여 개발할 수 있도록 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대.

애플리케이션 개발 시 필수적인 코드, 알고리즘, DB 연동과 같은 기능들을 위해 어느 정도 구조(뼈대)를 제공하며, 이러한 뼈대 위에서 사용자는 코드를 작성하여 애플리케이션을 개발한다. 앱/서버 등의 구동, 메모리 관리, 이벤트 루프 등의 공통된 부분은 프레임워크가 관리하며, 사용자는 프레임워크가 정해준 방식대로 클래서, 메서드들을 구현하면 된다.

✏️프레임워크의 특징

  • 특정 개념들의 추상화를 제공하는 여러 클래스나 컴포넌트로 구성
  • 추상적인 개념들이 문제를 해결하기 위해 같이 작업하는 방법 정의
  • 컴포넌트들은 재사용 가능
  • 높은 수준에서 패턴들을 조작화 가능

📃Examlpe

  • Java 서버 개발 : Spring
  • Python 서버 개발 : Django, Flask, FastAPI
  • Web 개발 : Angular, Vue.js
  • Android 개발 : Android
  • IPhone 개발 : Cocoa Touch, Flutter

✔️라이브러리
: 단순 활용가능한 도구들의 집합.
즉, 개발자가 만든 클래스에서 호출하여 사용, 클래스들의 나열로 필요한 클래스를 불러서 사용하는 방식

📃예시

  • Python pip로 설치한 패키지/모듈 (tensorflow, pandas, beautifulsoup 등등)
  • C++의 표준 템플릿 라이브러리 (STL)
  • Node.js에서 npm으로 설치한 모듈
  • HTML의 클라이언트 사이드 조작을 단순화하는 JQuery
  • 웹에서 사용자 인터페이스 개발에 사용되는 React.js

🤷‍♂️그럼, 이 둘의 차이는?

프레임워크와 라이브러리의 차이점은 '"제어 흐름"의 권한이 어디에 있는가' 이다.
여기서 제어 흐름이란, 프로그램에서 실행되는 각 구문, 명령어나 함수가 호출되는 순서를 말한다.

라이브러리를 사용할 때 사용자는 애플리케이션 코드의 흐름을 직접 제어해야 한다.
개발 시 필요한 기능이 있을 경우 능동적으로 라이브러리를 호출하여 사용하거나 기존에 구성된 함수나 코드를 가져다 써야 한다. 즉, 개발자가 원하는 타이밍에 라이브러리를 호출하면서 사용하는 것이다.

반면, 프레임워크는 애플리케이션의 코드가 프레임워크에 의해 사용된다.
애플리케이션 코드는 프레임워크가 짜 놓은 틀에서 수동적으로 동작하기 때문에 제어의 흐름은 프레임워크가 가지고 있고 사용자가 그 안에 필요한 코드를 작성한다. 이렇게 Framework에 제어 권한을 위임하는 것을 제어의 역전이라고 한다.
간단히 말해 프로그램의 제어 흐름 구조가 뒤바뀐 것을 뜻한다.

라이브러리의 경우 애플리케이션의 흐름을 사용자가 직접 제어해야 하지만 프레임워크의 경우 코드를 연결할 수 있는 위치를 제공하고 필요에 따라 사용자가 연결한 코드를 호출하는 제어 흐름 권한을 가지고 있다.

아래는 우리가 작성하는 코드와 프레임워크, 라이브러리에 대한 그림이다.


제어의 역전 코드 예시

Spring Boot에서 나오는 간단한 제어의 역전 예시이다.

  • 컨트롤러
@RestController
@RequiredArgsConstructor
public class MemberController {

    // ...

    private final MemberService memberService;
    
    @GetMapping("/")
    public Long login(){
    	// ...
    }

    // ...
}
  • 서비스
@Service
@RequiredArgsConstructor
public class MemberService {

    private final MemberRepository memberRepository;
    private final RankRepository rankRepository;

    // ...
}

이 코드에서 공통적으로 나오는 코드는 private final ~~ 이런 형태의 코드가 보인다.
그리고 각 클래스 단에서 사용한 @RequiredArgsConstructor 이라는 어노테이션으로 final 된 필드를 의존성주입을 해주었다. 내가 직접 작성한 MemberController 코드에서는 그 어디에도 MemberService 클래스의 인스턴스를 생성하지 않았다. 마찬가지로 MemberService 코드에서 MemberRepositoryRankRepository 클래스의 인스턴스를 생성하지 않았다. 하지만 @RequiredArgsConstructor 라는 어노테이션을 사용하여, 별도의 코드를 작성하지 않고도 인스턴스가 생성되어 주입되었다. 즉, 객체의 생명주기가 프로그래머에서 스프링 프레임워크로 위임된 것 이다.

위와 같이 간단하게 스프링을 사용해보며 IoC 설계 원칙에 대해 맛볼 수 있었다.

profile
한 걸음씩 꾸준히

0개의 댓글