SY 개발일지
article thumbnail

요즘 동적 페이지 만드는 법에 대해 공부하고 있는데, 동적인 페이지를 만드는 데에 AJAX가 사용된다.

그래서 AJAX에 대해 공부하는 겸해서 동기와 비동기에 대해 알아보고자 한다. 이 때 동기와 비동기, 그리고 블록과 논블록의 개념이 같거나 비슷하다고 생각하는 사람들이 많아 함께 언급되는 경우가 많다. 따라서 블록과 논블록에 대해서도 함께 정리해보고자 한다.

동기와 비동기

동기와 비동기는 처리해야할 작업들을 어떠한 흐름으로 처리할 것인가에 대한 관점이다. 즉 호출되는 작업 완료 여부를 신경쓰는지에 따라, 함수 실행/리턴이 순차적인 흐름을 따르는지에 대한 여부가 관심사이다.

동기 (Synchronous)

동기란 각 참여자가 즉시(또는 가능한 한 즉시) 메시지를 수신(필요시 처리 및 회신)하는 실시간 통신을 말한다.

예를 들어 전화를 할 때, 전화 통화 중에는 상대방에게 즉시 응답한다.

쉽게 말하자면 동기는 두 개의 프로세스가 데이터를 주고 받을 때 주고 받는 순서(또는 시간)가 일정하다는 것을 뜻한다. 어떤 프로세스가 동기적이라는 것은 어떤 작업을 요청했을 때 그 작업이 종료될 때까지 기다린 후 다음 작업을 수행한다는 것이다. 따라서 동기는 호출하는 함수 A가 호출되는 함수 B의 작업 완료 후 리턴을 기다리거나, 바로 리턴 받더라도 미완료 상태라면 작업 완료 여부를 스스로 계속 확인하면서 신경쓴다.

  • 데이터를 주고받는 순서가 사용된다.
  • 요청한 작업만 처리하면 되기 때문에 전체적인 수행 속도는 빠를 수 있다.(일만 하면 된다.)
  • 한 작업에 대해 시간이 길어질 경우, 전체 응답이 지연될 수 있다.

따라서 논리 주소 공간을 공유하는 협력적 프로세스의 질서있는 실행을 보장하며, 데이터의 일관성을 유지한다.

비동기 (Asynchronous)

비동기란 주로 두 개 이상의 객체나 이벤트가 동시에 존재하지 않거나 발생하지 않는 것을 의미한다.

여러 관련된 작업이 원래의 일이 끝날 때까지 기다리지 않는 것도 포함된다.

따라서 함수 A가 함수 B를 호출할 때 콜백 함수를 함께 전달하여 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다. 즉, 함수 A는 함수 B를 호출한 후로 함수 B의 작업 완료 여부에는 신경쓰지 않는다.

프로그래밍에서 비동기는 다음 두 가지 맥락에서 사용된다.

네트워크와 통신

비동기 통신은 둘 이상의 통신자 사이에서 메시지를 교환하는 방법으로 메시지를 받음과 동시에 처리할 필요 없이, 각자 처리할 수 있는 적절한 때에 메시지를 받고 처리하는 방식이다. 또한, 문제가 발생하더라도 수신자가 따로 수정을 요청하거나 문제를 처리할 것이라는 가정하에 별도의 승인 없이 메시지를 보낼 수 있다.

소프트웨어가 비동기적으로 통신한다면 프로그램은 서버와 같은 다른 프로그램에 정보를 요청하고 응답을 기다리면서 다른 작업을 할 수 있다.

소프트웨어 설계

비동기 소프트웨어 설계는 작업이 완료되는 걸 프로그램이 기다릴 필요 없이 기존의 작업과 함께 처리되도록 요청할 수 있게 코드를 작성하여 그 개념을 확장한다. 보조 작업이 완료되면 기존 작업에 알림을 보내 작업을 완료시키고, 결과가 있는 경우에는 그 결과를 사용할 수 있음으로 알린다.

  • 요청 순서에 상관없이, 동시에 다수의 작업을 처리할 수 있다.
  • 작업이 끝날 때 따로 이벤트를 감지하고 결과를 받아 그에 따른 추가 작업을 해줘야하기 때문에 비교적 느릴 수 있다.
  • I/O 작업이 잦고, 빠른 응답속도를 요구하는 프로그램에 적합하다.

동기와 비동기

블록과 논블록

블록과 논블록은 A함수가 B함수를 호출했을 때 제어권을 어떻게 처리하느냐에 따라 달라진다. 이는 처리되어야 하는 작업이 전체적인 작업 흐름을 막느냐 안막느냐에 대한 관점으로, 제어권이 누구한테 있느냐가 관심사가 된다.

블록 (Blocking)

A 함수가 B 함수를 호출하면, 제어권을 A가 호출한 B에게 넘겨준다.

1. A함수가 B함수를 호출하면 B에게 제어권을 넘긴다.

2. 제어권을 넘겨받은 B는 함수 실행을 한다. 이 때 A는 B에게 제어권을 넘겨주었기 때문에 함수 실행을 잠시 멈춘다.

3. B함수는 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.

논블록 (Non-Blocking)

A 함수가 B함수를 호출해도 A는 제어권을 B에게 넘기지 않고 그대로 자신이 가지고 있는다. 따라서 A 함수는 계속 제어권을 가지고 있기 때문에 B함수를 호출한 이후에도 자신의 코드를 계속 실행한다.

예를 들어 함수 A, B, C가 존재하고, 순서가 A -> B -> C 라고 하자.

1. 메인함수가 함수 A를 호출하면, 호출된 함수 A는 실행하고 바로 리턴하면서 함수 B가 실행된다.

    여기서 리턴이란, 함수 A의 로직이 모두 끝난 후가 아닌, 시작하자마자 리턴한다는 뜻이다.

2. 호출된 함수가 자신이 할 일을 마치지 않았더라도 제어권을 바로 return 하여 호출한 함수가 다른 일을 진행한다.

동기와 비동기 / 블록과 논블록 비교

동기와 비동기, 그리고 블록과 논블록은 서로 다른 곳에 초점을 맞추고 있다.

동기와 비동기가 프로세스의 수행 순서 보장에 대한 매커니즘이라면,
블록과 논블록은 프로세스의 유휴 상태에 대한 개념이다.

동기와 비동기, 블럭과 논블록

위와 같이 동기와 비동기, 블럭과 논블럭은 함께 사용될 수 있다.

Sync - Blocking

동기: 함수 A는 함수 B의 리턴값을 필요로 한다.

블록: 그래서 제어권을 함수 B에게 넘겨주고, 함수 B가 실행을 완료하여 리턴값과 제어권을 돌려줄 때까지 기다린다.

C나 JAVA의 코드 실행 후 커맨드에서 입력 받기
(제어권이 시스템에서 사용자로 넘어가, 리턴값을 필요로하여 사용자가 입력할 때까지 기다림)

Sync - NonBlocking

함수 A는 함수 B를 호출한다.

논블록: 함수 A는 함수 B에게 제어권을 주지 않고, 자신의 코드를 계속 실행한다.

동기: 그런데 함수 A는 함수 B의 리턴값을 필요로 하기 때문에 중간중간 B에게 함수 실행 완료 여부를 물어본다.

게임에서 데이터 로드율을 표시할 때 맵이 이동할 때 맵 데이터를 계속 물어보지만, 제어권은 여전히 나에게 있어 화면에 로드율이 표시된다.

Async - NonBlocking

함수 A는 함수 B를 호출한다.

논블록: 이 때 제어권을 함수 B에게 주지 않고, 자신이 계속 갖고 있는다. 따라서 함수 B를 호출한 이후에도 멈추지 않고 자신의 코드를 계속 실행한다.

비동기: 그리고 함수 B를 호출할 때 콜백함수를 함께 준다.함수 B는 자신의 작업이 끝나면 함수 A가 준 콜백 함수를 실행한다.

AJAX / JS 비동기 콜백
(프론트엔드 단에서 서버로 API 요청을 보내고, 응답을 기다리지 않고 바로 자신의 다음 일을 계속 실행한다.)

Async - Blocking

비동기 + 블록의 경우는 마주하기 쉽지 않다고 한다.

 

비동기: 함수 A는 함수 B의 리턴값에 신경쓰지 않고 콜백 함수를 보낸다.

블록: 그런데 함수 B의 작업에 관심없음에도 불구하고, 함수 A는 함수 B에게 제어권을 넘긴다.

따라서 함수 A는 자신과 관련 없는 함수 B의 작업이 끝날 때까지 기다려야 한다.

 

출처

'CS 정리 > 개발 상식' 카테고리의 다른 글

GoF(Gang of Four) 디자인패턴  (0) 2023.05.06
쓰레드(Thread)란?  (0) 2023.05.02
쿠키(Cookie)와 세션(Session)  (1) 2023.04.20
HTTP Protocol 의 특징  (0) 2023.04.18
GIT과 GITHUB  (0) 2023.04.16
profile

SY 개발일지

@SY 키키

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!