wowwow19
25
2021-07-21 08:10:34
26
1345

자바스크립트는 기본적으로 동기로 동작하지 않나요?


전에 한 회사 면접보면서 대답하던 중에

‘자바스크립트는 기본적으로 동기로 동작하는데…’

라고 말하자 마자 말 끊고 면접관이던 대표분이

‘아뇨, 자바스크립트는 비동기로 동작하고요.’라고 지적하던데 엥?? 스럽더라구요

비동기적 처리에 많이 이용되는거지 기본적으로 비동기인게 말이 되는건가요? 

제가 틀린 말 한건지 당시나 지금이나 벙찌네요

1
  • 댓글 26

  • 동글동글이
    3k
    2021-07-21 08:13:55 작성 2021-07-21 08:14:46 수정됨

    제가 잘못알고 있었나보네요 ㅎㅎ

    동기로 작동하는게 맞나봐요 

  • 방관
    346
    2021-07-21 08:16:27

    면접관님이 동기, 비동기랑 블럭킹, 논 블럭킹을 헷갈리신게 아닐까 싶긴한데여..

    그조차도 node랑 관련이 있지 js는 아닌거 같은데.. 아랫분이 잘 설명해주실거같아용

  • 콘푸로스트
    2k
    2021-07-21 08:20:29 작성 2021-07-21 08:22:52 수정됨
    기본적으로 비동기인 언어가 있나요
    비동기는 다중작업이나 외부 통신할때가 그렇죠


  • 하마
    7k
    2021-07-21 08:27:34

    애초에 님이 잘못 말했고, 면접관은 착각 ^^

  • 방관
    346
    2021-07-21 08:31:54

    하마 

    와주셨군요 선생님!

    혹시 실례가 안된다면 이분이 어떤 점을 잘못 얘기하신건지 말씀해주실 수 있을까요?

    저도 좀 갸웃해서, 공부할 수 있는 기회를 주셨으면 좋겠습니다. 

  • rezigrene
    1k
    2021-07-21 08:35:22 작성 2021-07-21 08:35:40 수정됨

    기본적으로 비동기로 동작하는 언어를 예로 들어설명했으면 양쪽에 오해가 없었을듯

  • wowwow19
    25
    2021-07-21 08:35:24

    @하마

    제가 어떤걸 잘못말했는지 알 수 있을까요?

  • daywalker
    1k
    2021-07-21 08:43:43

    동기 비동기는 어떤 작업이 다 완료된 후 다음 작업을 진행할 것이냐 아니냐 이런 의미인거구요.

    작성자님이 설명할려던 부분은 아마도 인터프리터 언어 vs 컴파일 언어인거 같네요.


  • charlatan
    4k
    2021-07-21 08:58:05

    Ajax를 예로 들면 "Asynchronous"인데... 면접관 말대로라면 Ajax가 필요 없이, 그러니까 브라우저의 XMLHttpRequest 객체 같은 것이 필요없이 언어레벨에서 비동기적인 통신이 가능했을 것 같습니다?

  • 하마
    7k
    2021-07-21 08:58:57 작성 2021-07-21 09:17:34 수정됨

    밀가루는 만두 혹은 찌기라고 하셔서

    면접관분은 빵 혹은 굽기라 하셨네요

    밀가루는 밀가루죠. 뭘 어떻게 만들건 ^^


    타언어에 비해 비동기 스타일로 개발하는게 디폴트분위기여서 

    면접관이 착각 한거 같습니다.

    Ajax와 node같은 기술이 대세가 되면서 비동기 표현력 문제를 향상 하고자 나온  Rx스타일도 자바스크립트 진영의 적극적 기술적 선도(최초는 닷넷)로 타 언어에서 유산을 물려받았고요.


  • 힘내라마소
    1k
    2021-07-21 09:04:02 작성 2021-07-21 09:07:46 수정됨
    오해가 있었나 싶었는데 다시 생각해보니 대표 말이 이상한데요??
  • LazyBoy
    239
    2021-07-21 09:08:33
    비동기 메소드를 쓰지 않는 이상 기본적으로 동기입니다
  • 엡실론
    2k
    2021-07-21 09:16:11

    어떤 질문이길래 그런건지 궁금하네요.

    틀린 말은 아닙니다만, 굳이 따지자면 기본적으로 동기라는 말도 어색하네요. 애초에 쪼개고 쪼개면 작은 단위들은 동기적으로 실행될 수 밖에 없고, 그런 의미에서 모든 언어는 동기적으로 동작하겠죠. 큰 틀에서 보자면 javascript의 일반적인 작업들, setTimeout(), XMLHttpRequest 등은 모두 비동기로 작동합니다. 그런면에서 일반적인 자바스크립트 프로그램은 비동기적으로 동작한다고 할수 있겠죠.

    비유가 썩 좋진 않지만, 자바는 객체지향언어지만, 결국 함수의 구현, 한줄한줄 문장들은 절차적으로 실행됩니다. 기본적으로 자바 프로그램은 절차적으로 동작한다라고 한다면 맞는 말이지만, 조금 어색할겁니다.

    글쓴분이 뭘 크게 잘못 했다는 건 아니지만, 굳이 말하자면 하나마나한 말은 빼고 그냥 직접적으로 결론을 먼저 얘기하는게 더 좋습니다. 뭐 면접관도 저 한마디 듣고 말자르는건 좋진 않죠.

  • 메이플비
    452
    2021-07-21 09:23:15 작성 2021-07-21 09:24:41 수정됨

    그냥 서로 '기본적으로'에 대해서 다른 맥락으로 받아들여서 발생한 일 같네요.

    하지만 그걸 떠나서 면접관이 저렇게 말 자른게 저에게는 좋은 인상을 주진 않네요.

    글쓴분이 '기본적으로'를 어떻게 해석해서 풀어나가냐에 따라 내용이 완전히 달라질 수 있었을텐데 말이죠.


    하지만 그래서 더더욱 기술면접자리에선 명확한 표현을 쓰는게 중요한것 같습니다.

    왠만하면 중의적으로 해석되거나, 아니면 받아들이는 방식에 따라 내용이 완전히 달라질 수 있는 표현들은 피해야겠죠.

  • 극한초보
    525
    2021-07-21 09:55:52 작성 2021-07-21 09:56:17 수정됨

    자바스크립트는 싱글쓰레드 기반 언어이고 동기처리보다는 콜스택으로 올라온 실행문을 바로바로 처리한다는 개념일듯 합니다.

    그리고 시간이 오래걸리는 코드들은 이벤트 루프를 통해서 스택이 여유로울때 비동기처럼 처리하게 되겠죠.

  • 돈까스
    6k
    2021-07-21 10:14:22 작성 2021-07-21 10:20:02 수정됨

    제가 면접관이라면 '기본적으로 동기'라는 표현의 의미가 무엇인지 물어봤을 것 같습니다.

    그 다음에는 기본적으로 비동기인 언어가 있냐고 물어볼 것 같네요.  (콘푸로스트 님 댓글처럼요.)


    동기/비동기 라는 표현을 쓰려면 무엇과 무엇이 동기화되는건지에 대한 내용이 필요한데요,

    그런 내용없이 동기로 동작한다고 표현해버리면 이상하죠.


    저는 이 댓글을 동기로 작성했습니다.

    밥을 먹을 때 저는 비동기 방식으로 밥을 먹습니다.

    라고 하면 뭔 소리를 하는 거지 라는 생각이 들 수 밖에 없을 것 같습니다.


    면접관이 그렇게 말을 했을 때 하신 말씀을 다시 잘 정리해서 말씀하셨나요?

    그렇지 않다고 하면 좋은 인상을 받기는 어려울 것 같습니다.


    일을 하다보면 의사소통을 이상하게 하는 분들이 있거든요.

    중요하지 않은 것을 중요한 것처럼 표현하고, 중요한 내용은 생략해버리고...

    그런 분들이랑 일하면 조금 힘듭니다.

    간단한 내용도 정확히 전달하기 위해서 굉장히 많은 노력을 들여야 하거든요.


    엡실론 님 말씀처럼 하나마나한 말은 안하는 게 낫죠

    면접관도 말을 잘라버리는 것은 좋지 않습니다만,

    글쓴분도 면접관의 반응을 보고 어디서 커뮤니케이션 문제가 있었는지 찾아서 보충설명을 하셨어야 할 것 같습니다.

  • 장독깨기
    3k
    2021-07-21 11:05:18

    틀린 말은 아니지만 하나마나 한 말은 맞습니다.

    대부분의 언어들이 비동기로 처리할 수 있도록 기능을 제공하니까요.

    근데, 보통 사람들은 말 하는데 핵심만 말하기 힘들죠. 

    면접 자리이니 긴장도 될테구요.

    하나마나 한 말을 할수도 중언부언 할수도 있습니다. ㅎ

    근데, 대표라는 사람이 면접자리에서 기다리지 못하고 지적 하는 걸 보면 많이 경솔해보입니다. 

    그 대표도 착각이든 뭐든 정확하게 말한것도 아니니 본인도 모른다는 얘기거든요.ㅋ


  • ISA
    5k
    2021-07-21 11:19:09

    비동기 코드 보고 동기로 작동한다고 한거 아닌가요

    아니면 대표가 이상한듯

  • 개발즐거워요
    137
    2021-07-21 12:25:04

    질문에 대한 답변의 내용을 떠나서 면접관 분의 태도에는 문제가 있다고 생각해요
    맞거나 틀리거나와 관계 없이 대답하고 있는데 아니오 라고 말 하는 건 좀..

    거의 대부분의 언어는 별도의 라이브러리나 모듈을 끼워 넣지 않는 이상 단일 스레드에서 blocking synchronous하게 움직이므로 순수한 언어 스펙으로는 비동기 처리가 불가능하죠. JS도 마찬가지구요

    JS로 비동기 처리가 가능한 건 런타임 환경에서 제공하는 비동기 API를 사용하기 때문이지 JS가 비동기가 가능해서는 아닙니다.

  • 개발 까마귀
    243
    2021-07-21 13:03:17
    이벤트 루프에 대해서 대표님이 잘 모르시거나 질문 자체를 잘 못이해하시는거같네요.
  • vollfeed
    2k
    2021-07-21 13:16:35

    평소엔 전혀 신경도 안쓰는 주제인데, 

    곰곰히 생각해보니,


    기본적으로는 비동기가 맞네요.


    아주 간단한 예를 하나보죠.

    동기 비동기가 구분되는 작업은 모두 시간이 걸리며, 외부 요소가 처리해주는 작업입니다. 

    내부적인 사칙연산은 이러한 구분에 해당이 없고,

    네트워크, 파일, OS 기능 들이 해당사항이 있습니다.

    브라우저의 경우 웹 서버에 대한 요청이 실질적으로 전부라고 할 수 있겠네요.


    그런데,

    js에서 동기적으로 웹 서버에 요청하는 방법 자체가 없습니다.

    비동기만 제공됩니다. 


    노드라면 fs.existsSync, fs.exists 2가지 선택지가 있습니다만,

    js는 이런 선택지 자체가 없네요.


    js는 기본적으로 비동기입니다.


    이때 모든 프로그램이 내부적 연산으로 처리하는 사칙연산, 함수 호출, 메모리 할당 등은 

    문자그대로 모든 언어는 그것을 동기-블럭으로 처리합니다.

    외부 요소가 존재하지 않는 이 부분들은 동기 / 비동기를 결정하는데 영향력이 없습니다.

    때문에 지금까지 언급된 내용 중 소수의 요소만 동기/비동기 이슈에 영향력을 가집니다.


  • 돈까스
    6k
    2021-07-21 14:32:11 작성 2021-07-21 14:32:37 수정됨

    기본적으로 라는 표현을 쓰려면 사전에 기본적인 것이 무엇인지에 대한 합의가 필요합니다.


    js는 기본적으로 동기

    js는 기본적으로 비동기


    어디까지가 기본적이고 어디서부터가 기본적이지 않은지?

    언어의 기본적인 명령어까지가 기본적인 범위에 들어가는 건지 라이브러리도 그 안에 포함되는건지...

    라이브러리도 포함되다고 하면 어디까지가 기본적인 라이브러리인지 어디서부터 기본적이지 않은 라이브러리인지...

    그런 내용을 정하지 않고 단정지어서 표현해버리면 논란거리가 될 수 밖에 없죠.


    이와 비슷하게 마찬가지로 '상식적으로 ~' 라는 표현이 있죠.

    내가 아는 상식과 당신이 아는 상식이 차이가 있거든요.

  • llllllllll
    12
    2021-07-21 19:07:11

    자바스크립트 엔진은 단 하나의 실행 컨텍스트 스택을 갖으며 한 번에 하나의 태스크만 실행할 수 있는 싱글 스레드 방식으로 동작한다. 싱글 스레드 방식은 한 번에 하나의 태스크만 실행할 수 있기 때문에 처리에 시간이 걸리는 태스크를 실행하는 경우 블로킹(작업 중단)이 발생한다. 이처럼 현재 실행 중인 태스크가 종료할 때까지 실행될 태스크가 대기하는 방식을 동기(synchronous)처리 라고 한다. 


    자바스크립트 동기적 언어이다. 


    그러면 왜 타이머 함수인 setTimeout과 setInterval, HTTP 요청, 이벤트 핸들러는 비동기 처리 방식으로 동작하는 건가요? 

    -> 그 이유는 싱글 스레드 방식으로 동작하는 것은 브라우저가 아니라 브라우저에 내장된 자바스크립트 엔진 이기 때문이다. 즉, 자바스크립트 엔진은 싱글 스레드로 동작하지만 브라우저는 멀티 스레드로 동작한다. 브라우저는 자바스크립트 엔진 외에도 Web API를 제공한다. Web API는 ECMAScript 사양에 정의된 함수가 아니라 브라우저에서 제공하는 API이며, DOM API와 타이머 함수, HTTP 요청(Ajax)과 같은 비동기 처리를 포함한다. 

  • rezigrene
    1k
    2021-07-21 19:39:20

    비동기적인 언어가 무엇인지 언어레벨에서 비동기를 지원하는 언어는 어떤 것이 있는지에 대해서 설명하지 못하는한,


    자바스크립트는 동기적언어이다라는 말은 매우 안좋은 표현입니다.

  • 장독깨기
    3k
    2021-07-21 23:58:32

    http 요청을 동기로 할 수 있습니다.

    XMLHttpRequest 옵션을 보면 지원한다는걸 알 수 있습니다.

    물론 좋은 방식은 아닙니다만, 필요 시 동기로 요청할 방법은 있다는거죠.


    함수 호출 시 반환 값을 받을때까지 기다리면 동기,

    나중에 받을 수 있으면 비동기죠.

    콜백함수를 등록해두면 나중에 받을 수 있으니,

    콜백함수를 등록할 수 있도록 지원하면

    그 언어는 비동기로 프로그래밍을 할 수 있도록 지원한다 할 수 있습니다.

    모든 언어는 동기로 동작하고, 대부분의 언어는 비동기를 지원합니다.


    그러니, 글쓴님이 한말은 틀린말은 아니지만, 역시 하나마나 한 말이긴 합니다. :)

    반면에 그 대표란 사람은 면접자리에서 그걸 못 기다리고 지적질을 하니,

    성급하기도 하고, 경솔하기 짝이 없는 사람인것도 맞아 보입니다. ㅋ


  • illuza
    1k
    2021-07-22 13:59:47 작성 2021-07-22 14:01:38 수정됨

    참고로 말씀드립니다.

    하드웨어 클럭 위에서 동작하는 모든 소프트웨어는 이론적으로 동기입니다.

    하드웨어적 비동기는 CPU라는 메인 클럭을 따라가지 않고 자기만의 클럭이 있다는 말이고 필요시 interrupt 방식으로 CPU에게 알려준다는 의미입니다. 그러니 결국 이것도 클럭 위에서 동작하니 이론적으로 동기입니다. (interrupt 체크도 초당 몇 번 이렇게 클럭으로 동작합니다)

    디지털은 노이즈와 정상 데이터를 구분해내기 위해서라도 동기가 필요합니다.


  • 로그인을 하시면 댓글을 등록할 수 있습니다.