inflearn logo
강의

講義

知識共有

「AIポチポチの時代」原理で突破する Node.jsとCS Part 2 - ストリームアーキテクチャとハードウェア制御器

第19講:ストリームエコシステムの完成とエンジニアの道 - Object Mode、Web Streams、そしてネットワークの序幕

강의 목표

解決済みの質問

24

cooltime150086

投稿した質問数 2

0

안녕하세요. AI 딸깍의 시대를 1~4 구매하여 수강 중에 있습니다.

강의를 듣다보니, 의문이 들어서 문의드립니다.

AI로 딸깍하니, 얕은 수준으로 다루게 되니 원리를 이해하자를 이야기하고자 해당 강의가 있는 것 같습니다.

실무에서는 라이브러리나 프레임워크로 개발을 진행하게 되는 것 같습니다.

원리를 이해하면 개발을 조금 더 잘하게 된다? AI에 명령을 내릴 때 조금 더 잘 내릴 수 있다? 아니면 장애가 터졌을 때 이유를 알 수 있다?

그것도 아니라면 개발 시 장애를 미리 예측하여 대응할 수 있다로 봐야할까요?

 

보면서 궁금하여 문의드립니다.

javascript node.js 컴퓨터-구조 frontend backend

回答 1

0

nhcodingstudio

안녕하세요 윤수혁 (나무펜)님, 먼저 강의를 수강해 주시고 이렇게 깊이 있는 질문을 남겨주셔서 진심으로 감사드립니다. 현업에서 AI와 수많은 프레임워크가 고도화되면서, 수많은 주니어 및 미들급 개발자분들이 정확히 똑같은 고민에 직면하고 계십니다. AI가 이렇게 코드를 다 짜주는데 굳이 로우레벨의 원리까지 알아야 할까 하는 의문은, 리드 개발자이자 AI를 실무에 적극적으로 도입하여 팀을 이끌고 있는 제 입장에서도 현재 소프트웨어 생태계의 본질을 꿰뚫는 매우 훌륭한 화두라고 생각합니다. 결론부터 말씀드리면, 원리를 아는 것은 단순히 프롬프트를 잘 쓰거나 장애를 고치기 위함만을 의미하지 않습니다. 궁극적으로는 AI가 만들어낸 거대한 블랙박스 시스템에 대한 완벽한 통제권을 쥐기 위함입니다.

이해를 돕기 위해, 현재 7월 중 출시를 앞둔 AI 딸깍의 시대, 대체 불가능한 최상위 개발자의 무기 유닉스 강의에서 다루게 될 실무 비디오 트랜스코딩 시스템을 구현하는 상황을 한 번 가정해 보겠습니다. 이 시스템은 사용자가 업로드한 대용량 비디오 파일의 해상도를 다양한 기기와 네트워크 환경에 맞게 변환하고 인코딩하여 원활하게 스트리밍할 수 있도록 제공하는 핵심적인 기능을 수행합니다.

자, 그러면 시스템적 배경지식이 전혀 없는 상태에서 우리는 어떤 흐름을 따르게 될까요? 경험이 없거나 프레임워크 사용법만 아는 경우, 그저 AI에게 "Node.js 혹은 현재 사용 중인 프레임워크나 기술로 비디오 해상도를 변환하는 서버 전체 코드를 짜줘"와 같이 단순하게 지시할 것입니다. 예를 들어, "사용자한테 비디오 파일 업로드 받아서 모바일용 해상도로 변환하고 진행률을 반환하는 API 기능 다 만들어줘" 같은 프롬프트를 입력하게 되겠죠. 그러면 AI는 마치 숙련된 사수처럼 Express 프레임워크와 fluent-ffmpeg 같은 라이브러리를 조합하여 파일 업로드부터 인코딩까지 한 번에 처리하는 그럴듯한 전체 코드를 친절하게 던져줍니다.

개발자가 이 코드를 복사해서 로컬 환경에 붙여넣고 실행해 보면, 처음에는 FFmpeg 바이너리가 없다는 에러를 마주하게 될 것입니다. 여기서부터 첫 번째 벽에 부딪힙니다. FFmpeg가 무엇인지조차 모르기 때문에 또다시 AI에게 에러 메시지를 복사해 붙여넣으며 질문을 던집니다. AI가 알려준 공식 사이트나 깃허브에 막상 들어가 보면 온통 C 언어로 짜인 코드뿐이고, 당황한 나머지 "이거 C 언어로 되어있는데, Node.js로 순수하게 짜인 버전은 없어?"라며 엉뚱한 질문을 이어가게 됩니다. 유닉스 기반의 실행 파일과 이를 조작하는 Node.js의 관계를 모르니, 모든 것을 자바스크립트 코드 안에서 해결하려는 좁은 프레임에 갇혀버리는 것입니다.

결국 원리를 모르는 상태로 AI가 시스템에 FFmpeg 설치가 필요하다며 구체적인 운영체제별 설치 명령어까지 떠먹여 주는 대로 의존하게 됩니다. 터미널에 알 수 없는 명령어를 입력해 패키지를 설치한 뒤 다시 서버를 구동하고, 간단한 웹 화면을 통해 비디오 파일을 업로드해 봅니다. 그러자 터미널 창에 10퍼센트, 50퍼센트, 100퍼센트하며 변환 진행률이 아름답게 찍히고, 순식간에 모바일용으로 최적화된 파일이 뚝딱 생성됩니다. 단 10분 만에 거대한 미디어 처리 서버를 완성했다는 짜릿한 성취감과 함께, 자신이 이 복잡한 백엔드 시스템을 완벽히 통제하고 있다는 엄청난 착각에 빠지게 됩니다. 이것이 바로 딸깍이 주는 무서운 유혹입니다.

하지만 진짜 실무의 워크플로우는 코드가 로컬에서 돌아가는 시점부터 거대한 장벽을 마주하게 됩니다. 이 코드를 실제 운영 서버에 배포하고 사용자 트래픽이 몰리기 시작하면 끔찍한 재앙이 시작됩니다. Node.js는 기본적으로 싱글 스레드(Single Threading) 기반의 비동기 이벤트 루프 모델로 동작합니다. 따라서 단 하나의 메인 스레드가 무거운 미디어 인코딩과 같은 CPU 집약적인 연산을 시작하는 순간 이벤트 루프가 꽉 막혀버리는 블로킹 현상이 발생하고, 그동안 대기 중이던 다른 모든 사용자의 접속 요청은 타임아웃으로 그대로 끊어지게 됩니다.

게다가 수 기가바이트에 달하는 영상의 순수 바이너리(Binary) 데이터를 청크 단위로 쪼개지 않고 메모리에 한 번에 올리게 되면 문제는 더욱 심각해집니다. 데이터를 잘게 쪼개어 흐르게 하는 스트림(Stream)과 임시 저장소인 버퍼(Buffer)의 개념 없이 원시 데이터를 통째로 처리하려다 보니, 힙(Heap) 메모리 공간이 순식간에 한계를 초과하며 폭주하게 됩니다. 결국 실무 서버는 트래픽이 조금만 몰려도 CPU 점유율이 100%로 치솟고, 흔히 말하는 OOM, 즉 메모리 부족 현상으로 굉음을 내며 마비되고 맙니다. 사용자들의 화면은 무한 로딩에 빠지고 운영 인프라는 경고 알림으로 도배되는 아찔한 상황이 펼쳐지는 것입니다.

운영체제와 컴퓨터 공학의 원리를 모르는 상태에서는 그저 AI에게 터미널의 시뻘건 에러 로그만 계속 던져주며 해결책을 구걸하게 됩니다. 이때부터 개발자는 알 수 없는 거대한 기술의 폭포수를 맞게 됩니다. AI는 에러를 덮기 위해 도커를 이용해 환경을 컨테이너화해서 리소스를 제한해야 한다거나, 깃허브 액션으로 CI/CD 자동화 배포 파이프라인을 구축해라, 스케일 아웃을 해야 하니 다중 인스턴스 간 상태 공유를 위해 레디스를 붙여야 한다는 등 수많은 낯선 인프라와 아키텍처 개념들을 쏟아내기 시작합니다. 기초 체력이 없는 상태에서 이 거대한 기술의 파도를 맞닥뜨리면, 그저 AI가 하라는 대로 알 수 없는 도커파일과 설정값들을 복사하고 붙여넣으며 끝없는 에러의 미궁, 즉 절대 스스로 뚫고 나갈 수 없는 거대한 통제의 벽에 부딪히게 되는 것입니다.

이제 운영체제의 프로세스와 메모리 관리 등 기반 내용을 완벽히 안다는 가정하에, 어떻게 여러 변수를 다 고려하여 확장성 있고 유지보수 가능한 제대로 된 서비스를 체계적으로 쌓아갈 수 있는지 그 흐름을 살펴보겠습니다. 원리를 아는 개발자는 시작부터 접근과 프롬프트의 수준이 완전히 다릅니다. 이들은 Node.js나 현재 사용 중인 기술이 무거운 연산을 직접 처리하는 엔진이 아니라 가벼운 관제탑 역할임을 인지하고 있기 때문에, 실제 무거운 연산은 C 언어로 컴파일된 강력한 유닉스 기반 바이너리 도구인 FFmpeg가 OS 단에서 직접 처리하도록 설계합니다.

그래서 AI에게 단순히 코드를 짜달라고 하는 대신, Node.js 메인 스레드가 막히지 않도록 외부 유닉스 실행 파일인 FFmpeg를 자식 프로세스(Child Process)로 띄우고, 거대한 바이너리 데이터를 일정한 크기의 버퍼로 쪼개어 처리하는 스트림 방식으로 파이프라인을 연결해 달라고 명확한 아키텍처를 지시하게 됩니다. 이렇게 하면 수 기가바이트의 영상도 단 몇 메가바이트의 메모리만 점유한 채 표준 입출력 스트림(stdio)으로 비동기 통신하며 진행률을 안전하게 반환할 수 있습니다. 이를 통해 메인 서버는 비로소 숨통이 트이고 무거운 작업은 백그라운드로 밀어낸 채 다른 사용자들을 정상적으로 응대할 수 있게 됩니다.

하지만 비싼 16코어 서버를 임대해 두고 단일 프로세스만 쓰는 것은 물리적 스레드와 하드웨어 자원의 막대한 낭비이므로, 운영체제의 가용 자원을 100% 끌어쓰기 위해 멀티 프로세싱 기반의 클러스터링(Clustering) 기법을 도입하게 됩니다. CPU 코어 수만큼 워커 프로세스를 메모리에 섀도우 클론처럼 복제하여 쏟아지는 수많은 트래픽을 병렬로 받아낼 분산 처리의 뼈대를 세우는 것입니다. 이때 16개의 독립된 프로세스가 각자 무분별하게 무거운 연산을 동시에 시작하면 한정된 CPU 점유율과 디스크 I/O를 서로 갉아먹으며 컨텍스트 스위칭 비용 폭발로 인해 다시 시스템이 다운되는 치명적인 딜레마가 생깁니다.

바로 이 지점에서 독립된 프로세스 간의 통신인 IPC(Inter-Process Communication) 원리가 맹활약합니다. 워커들은 트래픽을 받더라도 직접 무거운 인코딩 작업을 수행하지 않고, 메모리 공간을 뛰어넘어 인터폰 역할을 하는 IPC 채널을 통해 단 1개의 프라이머 프로세스에게 직렬화된 데이터로 결재를 올리도록 구조를 짭니다. 프라이머리는 이 요청들을 중앙 대기열에 담아두고 철저하게 순차적으로 하드웨어가 버틸 수 있는 만큼만 작업을 통제하여, 무분별한 자원 포식을 막는 완벽한 동기화와 병목 제어 시스템을 완성하게 되는 것입니다.

이렇게 다중 프로세스 환경이 완벽히 돌아가는 듯해도, 다중 인스턴스 배포 상황이나 클러스터 환경에서는 사용자가 로그인을 시도할 때 알 수 없는 인증 에러가 발생하며 튕겨내는 또 다른 실무적 변수와 직면하게 됩니다. 이는 각 프로세스가 운영체제로부터 고유하게 할당받은 가상 메모리 공간이 철저히 독립되어 있어, 1번 프로세스의 힙 메모리에 저장된 세션 정보를 2번 프로세스가 전혀 읽을 수 없는 메모리 격리 현상 때문입니다. 원리를 모르면 코드가 고장 났다고 당황하며 또 AI에게 에러 로그를 던지겠지만, 컴퓨터 공학의 기반 지식이 있다면 이는 독립된 메모리를 가진 프로세스들의 당연한 현상임을 인지하고 스스로 주도적인 아키텍처 확장을 결정합니다. 바로 이때, AI가 던져주는 낯선 단어로서가 아니라 개발자 본인의 명확한 의도 하에, 모든 워커가 공통으로 바라볼 수 있는 초고속 인메모리 데이터베이스인 Redis를 도입하여 세션과 대기열 상태를 물리적으로 동기화하는 진정한 엔터프라이즈급 아키텍처로 진화시키는 것입니다.

이처럼 우리가 실무에서 당연하게 도입하는 Redis, RabbitMQ, Docker, Kubernetes와 자동화 배포 파이프라인 같은 현대적인 인프라 도구들도 결코 마법이 아닙니다. 이 모든 것들은 결국 유닉스의 파일 시스템, 독립된 프로세스 간 통신, 메모리 관리와 네트워크 소켓이라는 로우레벨의 기반 원리를 바탕으로 동작하고 있습니다. AI는 우리에게 당장 구동되는 형태의 코드를 주는 데는 천재적이지만, 비즈니스의 맥락을 파악하여 거대한 시스템 전체의 구조적 뼈대를 세우고 병목 제어하며 치명적인 보안과 확장성을 챙기는 일은 전혀 책임지지 않습니다.

제 'AI 딸깍의 시대' 시리즈 강의에서는 설명의 편의를 위해 Node.js를 주된 도구로 다루고 있지만, 지금까지 말씀드린 이 본질적인 시스템 설계의 흐름을 잘 기억하신다면 언어나 프레임워크는 더 이상 중요하지 않게 됩니다. 여러분이 현업에서 어떤 도구를 사용하든, 어떤 복잡한 프로젝트를 마주하든 이 기반 원리를 완벽하게 동일하게 적용하실 수 있습니다. 나아가 새로운 기술적 장벽을 마주했을 때 스스로 어떻게 그 이면의 동작 원리를 찾아보고 아키텍처를 설계해야 하는지, 시스템 전체를 조망하는 거대한 관점을 얻으실 수 있을 것입니다.

물론, 최근 등장한 Claude Code나 Codex, GitHub Copilot 등 코드를 자동화하고 설계를 돕는 기술이 패러다임을 뒤바꿀 만큼 엄청나게 발전한 것은 부정할 수 없는 사실입니다. 하지만 아무리 뛰어난 명검이라도 그것을 쥐는 검객의 기초 체력과 검술에 따라 그 위력이 결정되듯, 이 경이로운 도구들 역시 결국 우리가 아는 만큼만, 우리가 통제할 수 있는 시야의 크기만큼만 그 진가를 발휘하게 됩니다.

구조적 맥락 없이 AI가 쏟아내는 수많은 기술적 개념과 코드를 막 가져다 붙이고 에러가 나면 그때그때 눈가림으로 땜질하는 식으로 시스템을 구축하면, 소프트웨어는 어느 순간 그 누구도 배포나 유지보수를 감당할 수 없는 언제 무너질지 모르는 사상누각이자, 걷잡을 수 없이 뒤엉킨 거대한 스파게티 코드의 늪이 되어버리고 맙니다.

누구나 AI의 도움을 받아 쉽게 개발을 시작할 수 있는 시대가 도래하여 진입 장벽은 그 어느 때보다 낮아졌습니다. 하지만 그 쉬운 시작을 바탕으로 여러 장벽과 기술의 폭포수를 뚫고 안정적이고 확장 가능한 상용 서비스로 끝까지 끌고 갈 수 있는 뚝심과 힘은 오직 이러한 로우레벨 기반 지식에서 나옵니다. 결국 AI는 방대한 지식을 바탕으로 코드를 누구보다 빠르게 작성해 주는 아주 똑똑한 보조 개발자일 뿐, 시스템 전체를 책임지는 최종 설계자가 될 수는 없습니다. 수혁님께서 시스템의 원리를 완벽하게 꿰뚫고 이 강력한 도구에게 정확한 설계와 지시를 내리는, 대체 불가능한 리드 아키텍트로 성장하시기를 진심으로 응원합니다.

24. [바이브 코딩 04] 매일 아침 AI 뉴스 수집 봇 만들어보기

0

6

0

수업자료 링크요청

0

29

1

개념과 격벽에 대한 이해를 팀과 공유하고 합의하는 방법

1

49

2

클라우드 프론트 멀티 오리진의 의미가 정확히 무엇인가요?

0

63

2

강의 노트 위주로 학습

0

34

1

접근 가능한 카트 목록을 조회하는 API는 없는걸까요?

1

56

2

33강 14번 질문 있습니다.

0

49

1

쿠키 생성 관련

0

63

3

프로덕션 부분 사용 불가

0

57

2

JWT auth error invalid token

0

57

2

현재 미니케이스 자동완성 검색창 설계1 강의를 보고있습니다.

-1

65

2

경력기술서는 어떤 방향이 좋을까요?

0

51

2

in-app purchasing 버튼의 install 버튼이 비활성화되어있을때 어떻게 해결해야하나요 ?

0

45

2

마감 인 경우.

0

54

1

강의에서 사용하시는 그림판? 이거 이름이뭘까요?

0

59

2

5장부터는 미션 상세 내용이 없는데 어떻게 작성해야되나요?

0

48

1

MSA 와 BFF 아키텍처 설명 부분에 대한 문의

0

48

1

유니티 제외 설치한 프로그램들 및 파일 삭제 방법

0

43

1

깃허브에서 콤피유아이 매니저 설치하는게 안됩니다.

0

58

2

진리표를 회로로 변환할 때 F가 0인 경우 don't care

0

58

2

eslint.config.js 설정 질문입니다.

0

62

2

7강 흐름 제어 아키택쳐 코드 순서

1

52

1

수업자료 어디서 찾아볼 수 있나요?

0

47

2

함수 강의의 정답.. 어떤가요?

0

39

1