런타임 환경이란 무엇인가요?
런타임 환경은 프로그램이 실행되는 동안 그 주변에 필요한 소프트웨어입니다. 코드를 실행하는 엔진, 프로그램이 호출하는 표준 라이브러리, 그리고 메모리, 오류, 운영체제 접근을 관리하는 기능으로 이루어져요. JVM, Node.js, CPython이 그 예예요.
업데이트: 2026년 9월 24일
Node.js에서 console.log(typeof process)를 실행하면 object가 출력돼요. 같은 줄을 크롬 콘솔에 붙여 넣으면 undefined가 출력돼요. 두 곳 모두 언어는 같은 자바스크립트지만, 프로그램이 서로 다른 두 런타임 환경 안에서 실행되고 있고, 각 환경이 주는 도구가 달라요.
console.log(typeof process); // "object" in Node.js, "undefined" in a browser
console.log(typeof document); // "undefined" in Node.js, "object" in a browser
런타임 환경이 제공하는 것
여러분의 코드는 무엇을 할지 설명할 뿐이에요. 코드가 실행될 때는 여러분이 한 줄을 쓰기도 전에 설치되어 있던 소프트웨어 계층에 기대요. 이 계층은 보통 다섯 부분으로 이루어져요.
- 실행 엔진. 누군가는 코드를 실행해야 해요. 인터프리터, 가상 머신, JIT 컴파일러가 그 일을 해요. CPython, 자바 가상 머신(JVM), V8이 실행 엔진이에요.
- 표준 라이브러리. 텍스트, 수학, 날짜, 파일, 네트워크를 다루는 미리 만들어진 함수들이에요. 파이썬의
json모듈이나 자바의java.util패키지가 그 예예요. - 메모리 관리. 런타임이 객체에 메모리를 할당하고, 파이썬, 자바, 자바스크립트에서는 아무도 쓰지 않는 메모리를 가비지 컬렉터로 다시 해제해요.
- 오류 처리. 무언가 잘못되면 런타임이 프로그램을 통제된 방식으로 멈추고, 트레이스백이나 스택 트레이스로 어디서 문제가 생겼는지 알려 줘요.
- 운영체제 접근. 파일 읽기, 네트워크 연결 열기, 환경 변수와 명령줄 인수 읽기는 모두 런타임을 거쳐요. 런타임이 프로그램을 대신해 운영체제에 요청해요.
파이썬 런타임에게 자기 자신에 대해 물어볼 수 있어요.
답은 코드가 어디서 실행되느냐에 따라 달라져요. 리눅스 서버에서 platform.system()은 'Linux'를, Mac에서는 'Darwin'을, 윈도우에서는 'Windows'를 돌려줘요. 재귀 한도(CPython의 기본값은 1000)는 파이썬 언어가 아니라 런타임이 정한 규칙이고, 첫 줄이 실행되기 전에 이미 불러와진 수십 개의 모듈은 런타임이 스스로를 준비한 흔적이에요.
자바: JDK, JRE, JVM의 차이
자바는 계층마다 이름이 따로 있어서 계층이 눈에 잘 보여요.
| 이름 | 약자의 뜻 | 들어 있는 것 | 필요한 사람 |
|---|---|---|---|
| JVM | Java Virtual Machine | 바이트코드(.class 파일)를 실행하고 메모리를 관리하는 엔진 | 아래 두 가지 모두에 포함 |
| JRE | Java Runtime Environment | JVM과 표준 클래스 라이브러리 | 자바 프로그램을 실행만 하는 사람 |
| JDK | Java Development Kit | JRE와 개발 도구: javac, jar, javadoc, jdb | 자바 프로그램을 작성하는 사람 |
흐름은 이래요. JDK 도구인 javac Main.java(컴파일러)가 소스 코드를 Main.class로 바꾸고, java Main이 JVM을 시작해요. JVM은 클래스를 불러와 런타임 환경의 라이브러리와 함께 실행해요. .class 파일 하나가 윈도우, macOS, 리눅스에서 모두 실행되는 이유가 JVM이에요. 운영체제마다 자기 JVM이 있고, 모두 같은 바이트코드를 이해하거든요.
자바 11부터 오라클은 JDK만 배포하고 JRE를 따로 내려받을 수 없게 했어요. Eclipse Temurin 같은 일부 배포판은 여전히 JRE 패키지를 내놓아요. 자바를 배우고 있다면 JDK를 설치하세요. JRE가 가진 것을 모두 담고 있어요. 자바 설치 가이드에서 과정을 따라갈 수 있어요.
자바스크립트: 브라우저와 Node.js
자바스크립트는 웹 페이지 안에서 실행되도록 설계되었기 때문에, 첫 런타임 환경은 브라우저였어요. 브라우저 런타임은 코드에 페이지의 document, window, 타이머, 네트워크 요청을 위한 fetch를 주고, 여러분의 파일에 직접 접근하는 것은 일부러 막아요.
Node.js는 구글의 V8 엔진을 브라우저 밖으로 꺼내 다른 런타임으로 감쌌어요. document는 없지만, 파일을 위한 fs, 서버를 위한 http 같은 모듈과, 환경 변수와 인수를 위한 process 객체가 있어요. Deno와 Bun은 같은 언어를 위한 더 새로운 런타임으로, 각자 자기 도구를 갖고 있어요. 모두 같은 핵심 자바스크립트를 실행하고, 다른 것은 그 주변이에요. 더 알아보려면 Node.js 런타임과 이벤트 루프 페이지를 읽어 보세요.
파이썬: CPython과 그 친구들
"파이썬을 설치한다"는 말은 런타임 환경을 설치한다는 뜻이에요. CPython 인터프리터, 표준 라이브러리, 그리고 패키지를 추가하는 pip이에요. 같은 언어를 위한 다른 런타임도 있어요. PyPy는 속도를 위해 JIT 컴파일러를 더했고, MicroPython은 마이크로컨트롤러에서 돌아갈 만큼 작아요.
가상 환경(python3 -m venv .venv)은 새 런타임이 아니에요. 이미 있는 인터프리터를 가리키면서 한 프로젝트에 자기만의 설치 패키지 모음을 줘요. 그래서 두 프로젝트가 같은 라이브러리의 서로 다른 버전을 쓸 수 있어요. 가상 환경을 참고하세요.
컴파일 타임과 런타임
"런타임"은 어떤 순간을 가리키기도 해요. 소스가 번역되는 컴파일 타임과 대비되는, 프로그램이 실행되고 있는 기간이에요. 컴파일러가 거부하는 실수는 컴파일 타임 오류이고, 0으로 나누기처럼 프로그램이 실행되는 동안에만 나타나는 실수는 런타임 오류예요. 런타임 환경은 그 두 번째 기간에 함께 있는 소프트웨어예요.
기계어로 바로 컴파일되는 C에도 작은 런타임이 있어요. C 프로그램은 컴파일러 도구 체인이 제공하는 시작 코드에서 출발하고, printf와 malloc 같은 함수는 C 표준 라이브러리(대부분의 리눅스에서는 glibc, 윈도우에서는 Universal C Runtime)에서 와요. 가상 머신과 가비지 컬렉터가 없을 뿐이에요.
흔한 오해
- "런타임 환경이 곧 운영체제다." 운영체제는 모든 프로그램을 위해 하드웨어를 관리해요. 런타임 환경은 그 위에 놓인 한 프로그램의 계층이에요. JVM 자체도 윈도우, macOS, 리눅스가 실행하는 프로그램이고, 운영체제를 대신하지 않아요.
- "Node.js는 언어나 프레임워크다." Node.js는 자바스크립트를 위한 런타임 환경이에요. Express 같은 프레임워크는 그 안에서 실행되는 라이브러리예요.
- "IDE를 설치하면 런타임도 설치된다." VS Code에는 파이썬도 자바도 들어 있지 않아요. 에디터와 런타임 환경은 따로 설치해요. 다만 IntelliJ IDEA 같은 일부 IDE는 JDK를 대신 내려받아 줄 수 있어요.
- "언어가 같으면 어디서나 똑같이 동작한다." 파일 접근, 기본 한도, 쓸 수 있는 모듈처럼 런타임이 제공하는 기능은 다를 수 있어요. Node.js에서 도는 코드가 브라우저에서 실패하는 이유가 바로 그거예요.
다음으로 읽을 내용
대부분의 런타임 안에 있는 실행 엔진은 인터프리터이고, 그 페이지에서 컴파일러와의 비교도 볼 수 있어요. 모든 런타임의 아래에는 운영체제가 있어요. 아직 써 보지 않은 런타임에서 연습하려면 자바 강의나 자바스크립트 강의를 시작해 보세요.
자주 묻는 질문
런타임 환경의 예를 들어 줄 수 있나요?
Node.js는 런타임 환경인가요?
런타임은 정확히 무슨 뜻인가요?
JRE와 JDK 중 무엇을 설치해야 하나요?
javac와 JRE의 모든 것이 들어 있어요. JRE만으로는 이미 있는 자바 프로그램을 실행할 수만 있어요. 자바 11부터 오라클은 JDK만 배포하므로, 최신 자바 버전이라면 JDK가 보통의 선택이에요.JDK, JRE, JVM은 각각 무엇의 약자인가요?
javac 같은 개발 도구를 더한 것이에요.