라이브러리 프레임워크 차이 질문
48
작성한 질문수 7
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
큰돌님 안녕하세요!
라이브러리와 프레임워크의 차이가 좀 모호하게 느껴져서 질문 드립니다.
저는 코드의 제어권이 누구에게 있느냐에 따라서 둘중 무엇인지 판단하는 것이라 이해를 했습니다.
예를들어 제어권이 개발자에게 있으며, 중간에 마음대로 넣었다가 뺐거나 다른걸로 교체하는 식으로, 개발자가 짜놓은 코드 안에서 자유롭게 불러오는 거라면 그것은 라이브러리로 생각이 되고,
제어권이 프레임워크에 있어서 개발자 마음대로 넣었다가 뺐다가 하기는 어렵고 주어진 틀 안에서만 작업이 가능하며, 추상적 이지만 프레임워크가 개발자가 작성한 코드를 호출하는 구조로 이해를 했습니다.
그런데 리액트의 경우는 좀 이해가 가지 않아서 질문드립니다.
리액트는 공식문서에서 "자바스크립트 라이브러리"라고 표현을 하는데,
제가 느끼기엔 nestjs, spring같이 정해진 틀 안에서 사용을 하게되는 프레임워크의 성격에 더 가깝다고 느껴집니다. 중간에 다른걸로 교체하는 것도 어렵다고 느껴지구요. 그리고 어디서는 프레임워크라고 말하는 것도 심심치 않게 보이구요..
그래서 어떤 기술을 두고, 누군가가 이것은 라이브러리 입니까, 프레임워크 입니까? 라고 질문을 한다면 정해진게 아니라 관점에 따라서 대답이 달라질 수 있는 부분일까요?
그렇다고 해도 리액트가 프레임워크다 라는 논리는 이해가 가지만, 무려 공식문서에서 라이브러리라고 하는 설명이 납득이 어려워서 질문드립니다!
답변 1
0
안녕하세요 지훈님 ㅎㅎ
정해진게 아니라 관점에 따라서 대답이 달라질 수 있는
-> 아닙니다. 이 경우 공식문서 기반으로 답변하면 됩니다.
제가 느끼기엔 nestjs, spring같이 정해진 틀 안에서 사용을 하게되는 프레임워크의 성격
-> 리액트의 경우 리엑트쿼리나 상태관리 등이 해당 라이브러리 안에 넣어져있지 않습니다. 리액트 생태계 기반으로 import 해서 쓰는 형태기 때문에 라이브러리가 더 맞습니다. 그 기준이 모호하긴하지만요 ㅎㅎ
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
Spring이나 NestJS도 DB 연동(JPA, TypeORM)이나 HTTP 통신 같은 핵심 기능들은 필요할 때 원하는 걸 골라서 가져다 쓰는 구조인데...
제가 잘못 이해한건지 결국 "기본적으로 제공되어 강제하는 정도가 Spring이나 NestJS보다 적어서 리액트를 라이브러리라고 부른다" 라고 답변해 주신걸로 이해가 됐습니다 ㅠ
그렇다면 '어디까지 강제를 해야 프레임워크고, 그 미만은 라이브러리다'라는 절대적인 기준이나 수치가 있는 게 아닌 이상, 두 개념을 칼로 자르듯 규정하는 게 너무 모호한 것 같은데 ㅠㅠ 혹시 좀 더 명확한 기준이 있을까요?
1
안녕하세요 지훈님 ㅎㅎ
더 정확한 기준은 제어 흐름의 소유 범위입니다.
라이브러리: 내가 짠 코드가 main을 가지고 있고, 필요할 때 남의 코드를 호출한다.
프레임워크: 남의 코드가 main을 가지고 있고, 내가 짠 코드를 호출당한다. (IoC, Hollywood Principle - "Don't call us, we'll call you")
그럼 리액트도 컴포넌트를 호출당하지 않나요?
맞습니다. 그래서 헷갈리시는 게 당연합니다. 여기서 한 단계 더 들어가야 합니다.
핵심은 애플리케이션의 진입점(entry point)을 누가 소유하는가입니다.
// 내 코드가 시작점. 내가 리액트를 "불러서" 특정 DOM 노드를 위임함
createRoot(document.getElementById('root')).render(<App />);
// 스프링이 시작점. 내 클래스는 스캔당해서 등록되고 호출당함
SpringApplication.run(MyApp.class, args);
리액트는 제가 만든 진입점에서 "이 div 안쪽 렌더링만 너한테 맡길게"라고 부분 위임을 하는 구조입니다. 그래서 기존 jQuery 페이지의 한 영역에만 리액트를 붙이는 점진적 도입이 가능하죠. 스프링은 앱의 일부에만 얹을 수 없습니다.
관심사의 범위도 같이 보시면 됩니다
JPA나 TypeORM을 골라 쓰는 건 맞지만, 그건 프레임워크가 정한 자리에 무엇을 꽂을지 고르는 겁니다. 스프링은 라우팅(DispatcherServlet), 생명주기, DI 컨테이너, 트랜잭션 경계, 설정 방식, 실행 방식까지 전부 규정해두고 그 안에 슬롯을 열어둔 것이고요.
리액트는 UI 렌더링이라는 관심사 하나만 담당합니다. 라우팅·데이터 페칭·빌드·서버·파일 구조에 대해 아무 규정이 없죠. 그래서 이걸 다 규정한 Next.js는 스스로를 프레임워크라고 부릅니다.
정리하자면, 다음과 같습니다.
제어의 역전 여부로 구분합니다. 라이브러리는 내가 호출하고, 프레임워크는 내 코드가 호출당합니다. 리액트는 컴포넌트를 호출당하긴 하지만 애플리케이션 진입점을 개발자가 소유하고 UI 렌더링만 위임하는 구조라 공식적으로 라이브러리로 분류되며, 여기에 라우팅·빌드·서버 규약까지 얹은 Next.js는 프레임워크입니다.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
제어의 역전(IoC) 여부로 구분한다는 개념은 충분히 납득이 되며, 제가 라이브러리와 프레임워크의 근본적인 차이로 인식하고 있는 관점이기도 합니다!
하지만 그런 관점만으로는 특정 기술을 '이것은 라이브러리, 저것은 프레임워크'라고 명확하게 분류하기에는 아직까지 다소 추상적으로 느껴져서 계속 질문을 드리게 되는 것 같습니다..
말씀하신 내용 중에 '진입점(Entry Point)을 누가 소유하는가'에 대해서, 리액트에서 createRoot()를 사용하는 것 처럼, 사실 NestJS 같은 기술도 결국 개발자가 main.ts에서 bootstrap()을 직접 호출해서 실행하게 되는데, 그 말은 즉슨 nestjs역시 진입점을 개발자가 자유롭게 컨트롤할 수 있는 부분이라는 생각이 듭니다.
그렇게 되면 예를 들어 한 프로젝트 안에서 Express와 NestJS를 둘 다 사용해버릴 수도 있어 보입니다.. nestjs가 내부적으로 express를 사용한다는 얘기와는 별개로, 어떤 API는 Express로 처리하고, 어떤 API는 NestJS로 처리하는 식처럼요 (물론 그럴 일은 없겠지만요!).
그래서 아직까지는 그 경계를 '정확'하게 구분하기에 머릿속에 떠오르는 모순점들이 좀 있는 것 같습니다.. 혹시 제가 잘못 생각하고 있는 부분이 있을지 확인해주시면 너무 감사하겠습니다.
사실 이 개념은 이전에도 '대충 면접장에서 말할 정도로만 알면 되겠지' 하고 넘어갔던 부분인데, 이번 기회에 좀 확실하게 기준을 정립해보고 싶어서 재차 질문을 드리게 되네요ㅜ 항상 구체적이고 친절한 답변 주셔서 정말 감사합니다!!
0
안녕하세요 지훈님 ㅎㅎ
먼저
main.ts에서 개발자가 직접 bootstrap()을 호출하고, 그 안에서 NestFactory.create()를 부르는 건 사실이지만, 이건 초기화(bootstrapping)를 트리거하는 행위일 뿐이지 런타임 제어권을 갖는 것과는 다른 문제 입니다.
기준을 이렇게 바꿔서 설명하면 더 명확해질 것 같습니다:
"누가 최초의 실행 명령을 타이핑하는가"가 아니라, "
app.listen()이후, 내가 작성한 비즈니스 로직 코드를 누가, 언제, 어떻게 호출하는가"
jQuery:
$('#btn').on('click', myHandler)— 개발자가 원하는 시점에 원하는 라이브러리 함수를 직접 호출합니다. 콜백을 넘기더라도, 그 콜백을 "언제 등록할지"는 개발자가 결정하고, 실행 흐름의 주도권은 여전히 개발자 코드에 있어요.NestJS:
@Get('/users')데코레이터가 붙은 컨트롤러 메서드를 개발자가 직접 호출하는 코드는 어디에도 없습니다. HTTP 요청이 들어오면 Nest의 라우터/DI 컨테이너가 리플렉션으로 메타데이터를 읽고, 가드 → 인터셉터 → 파이프 → 컨트롤러 순으로 프레임워크가 개발자 코드를 호출합니다.
즉 bootstrap() 호출은 "무대에 올라가겠습니다"라고 등록하는 행위지, 그 이후 배우(개발자 코드)가 언제 대사를 칠지는 감독(프레임워크)이 정하는 거죠.
React의 createRoot()도 같은 논리
createRoot(container).render(<App/>)도 개발자가 직접 호출하는 진입점이지만, 그 이후 React가 App 컴포넌트 함수를 언제 호출할지, 언제 재실행(리렌더링)할지, useEffect를 언제 실행할지는 전부 React가 스케줄링합니다. 그래서 React를 "라이브러리"라고 부르긴 하지만, UI 렌더링 레이어에 한해서는 상당히 프레임워크적인 성격(제어의 역전)을 갖고 있다고 보는 게 정확해요. 그래서!! 애매하긴합니다. ㅎㅎ
"이 모듈이 사라지면 내 코드의 실행 방식 자체가 바뀌는가?"를 중심으로 보면 좋을거 같아요.
jQuery가 사라지면 → 내가 부르던 함수 호출부만 바뀝니다. 실행 흐름 구조는 그대로.
NestJS가 사라지면 → 애플리케이션의 골격 자체(라우팅, 생명주기, DI)가 무너집니다. 프레임워크는 "내 코드를 담는 그릇"이 아니라 "내 코드가 실행되는 컨텍스트 그 자체"이기 때문이에요.
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
디자인패턴 질문
0
11
1
팩토리 패턴
0
43
2
싱글톤 패턴 구현방법
0
46
2
프로젝트 질문 드립니다!
0
40
2
추상화 질문
0
33
2
직렬화 역직렬화 질문 드립니다!
0
50
2
안녕하세요 큰돌님!
0
71
2
REST API (Self-descriptive messages)
0
64
1
시스템 엔지니어 관련 질문입니다.
0
116
2
오버라이딩 관련하여 질문드립니다.
0
100
2
교착상태의 4가지 필요조건이 필요충분조건이 아닌 이유
0
130
1
렌더 트리, 렌더 레이어와 그래픽 레이어
0
82
2
로컬스토리지, 세션스토리지, 쿠키의 공통점
0
86
1
IPv4가 IPv6보다 빠른 경우
0
169
2
UDP가 전송계층의 역할을 못하는 건 아닌지
0
81
1
Path MTU 발견하였음에도 패킷 분할이 필요한 이유?
0
95
2
교재의 LFU 알고리즘에서 6번이 왜 히트인가요?
0
102
2
페이지 교체 알고리즘? 프레임 교체 알고리즘?
0
112
2
Static 키워드가 메모리에 올라가는 시점
0
102
2
헤더 압축부분 질문드립니다
0
105
2
공유 캐시 관련 질문 드립니다.
0
79
2
컨텍스트는 context와 contextual information으로 나눠진다는게 무슨뜻인가요?
0
260
1
회선과 대역폭의 관계
0
102
2
44강 질문
0
141
2





