JS가 싱글 스레드인 이유

상태
시작 전
담당자
날짜
TMI

작성 이유

나는 백엔드 개발자가 되는 것이 목표입니다. 그래서 Java를 공부하면서 Java는 멀티 스레드를 채택하고 있다는 것을 알게 됐는데 클라이언트 언어인 JS에 대해서도 공부하는 도중에 JS도 서버 언어로 사용할 수 있다는 걸 알 게 됐습니다. 하지만 JS는 왜 하필 싱글 스레드를 채택하게 됐는지 궁금해졌습니다.

JavaScript는 왜 싱글 스레드인가?

JavaScript는 웹 개발에서 널리 사용되는 프로그래밍 언어로, 싱글 스레드(single-threaded) 모델을 채택하고 있습니다. 이 모델은 코드가 한 줄씩 순차적으로 실행된다는 것을 의미합니다. 이 글에서는 스레드가 무엇인지, JS가 싱글 스레드를 사용하는 이유, 싱글 스레드의 장단점, 예시에 대해 설명하겠습니다.

목차

스레드
JS의 싱글 스레드
JS가 싱글 스레드인 이유
JS 싱글 스레드의 장단점
JS 싱글 스레드의 예시
결론

스레드

스레드란 프로세스 내에서 동작하는 작은 실행 단위를 의미하며, 이는 다중 스레드와 싱글 스레드로 나뉩니다. 여기서 프로세스는 컴퓨터에서 실행되는 프로그램을 의미합니다.

JS의 싱글 스레드

JavaScript는 기본적으로 싱글 스레드로 동작하는 언어입니다. 이는 JavaScript 엔진이 하나의 메인 스레드에서 코드를 실행하며, 이벤트 루프를 통해 비동기 작업을 처리한다는 의미입니다. 이러한 설계는 웹 브라우저와 Node.js 환경에서 모두 적용됩니다.

JS가 싱글스레드인 이유

웹 브라우저 환경에서의 설계
JavaScript는 초기에 웹 브라우저 환경에서 동작하기 위해 개발되었습니다. 웹 브라우저는 주로 단일 스레드로 동작하는데, 이는 여러 스레드가 동시에 접근하면서 발생할 수 있는 복잡성과 동기화 문제를 피하기 위함입니다.
이벤트 기반 동작
JavaScript는 이벤트 기반(event-driven)으로 동작합니다. 이는 웹 페이지에서 발생하는 다양한 이벤트(클릭, 키 입력 등)에 대응하며 비동기적으로 처리할 수 있도록 설계되었습니다. 싱글 스레드 모델은 이를 단순화하고 관리하기 용이하게 만듭니다.
동기화와 관련된 문제 회피
여러 스레드가 동시에 접근할 경우 발생할 수 있는 동기화 문제를 피하려는 목적도 있습니다. 싱글 스레드로 구현하면 이러한 문제들을 고려하지 않아도 되기 때문에 개발과 관리가 간단해집니다.
성능과 예측 가능성
싱글 스레드로 동작함으로써 성능 관리가 용이하고, 자원 관리도 예측 가능해집니다.
표준화와 호환성
JavaScript의 웹 표준화 과정에서 싱글 스레드로서의 특성이 강조되었고, 이에 따라 다양한 브라우저에서의 호환성도 유지되었습니다.

JS 싱글 스레드의 장단점

장점
1.
단순함과 예측 가능성: 싱글 스레드로 인해 동기적인 코드 처리가 간단해집니다. 이는 개발자가 실행 흐름을 더 잘 예측하고 디버깅할 수 있음을 의미합니다.
2.
자원 관리 용이성: 다중 스레드 환경에서 발생할 수 있는 공유 자원에 접근을 동시에 할 때 결과값이 달라질 수 있는 경합 조건(Race Condition)과 공유 자원에 접근할 때 무한 대기에 빠지는 데드락(Deadlock) 같은 복잡한 문제를 피할 수 있습니다.
단점
1.
성능 한계: 싱글 스레드로 인해 병렬 처리가 어렵기 때문에 CPU를 최대한 활용하지 못할 수 있습니다.
2.
긴 실행 시간 요구 작업의 차단: 한 번에 하나의 작업만 처리할 수 있기 때문에 긴 실행 시간이 요구되는 작업이 있으면 전체 애플리케이션의 반응성이 떨어질 수 있습니다.

싱글 스레드의 예시

싱글 스레드의 예시를 말씀드리겠습니다. setTimeout(console.log(”실행”), 1000)은 1초 후 실행을 출력한다는 의미를 가지고 있습니다. 이때 비동기적으로 작동하기 떄문에 setTimeout에 제어권을 넘겨줌과 동시에 제어권을 돌려받아 독립적으로 아래에 있는 코드를 실행할 수 있습니다. 따라서 결과로는 setTimeout에 의해 1초후에 실행하기 때문에 아래에 있는 코드가 먼저 실행됩니다.
// 제어권을 받아 다시 돌려주며, 1초가 지나면 "1초 후 실행"을 출력합니다. setTimeout(() => { console.log('1초 후 실행'); }, 1000); // 위 setTimeout에서 제어권을 받아 "제어권을 넘겨받아 바로 실행"을 출력합니다. console.log('제어권을 넘겨받아 바로 실행');
JavaScript
복사

결론

JavaScript가 싱글 스레드인 이유는 초기 웹 개발 환경에서의 단순성과 효율성 때문입니다. 이로 인해 발생할 수 있는 장단점을 잘 이해하고, 비동기 처리와 이벤트 기반 접근 방식을 통해 JavaScript의 장점을 최대한 활용하는 것이 중요합니다.