뭐? 요청을 보냈는데 기다리라고?? 킹받네;

EntryDSM·2022년 6월 9일
25
post-thumbnail

안녕하세요, 대덕소프트웨어마이스터고등학교 입학 전형시스템 EntryDSM 6.0의 어드민 서비스 웹 클라이언트를 개발한 전규현입니다.
저는 1학년 때 HTML과 CSS를 접한 뒤 점점 재미를 붙여 프론트엔드를 더욱 깊게 공부하고 있습니다. 프론트엔드 개발과 관련하여 궁금한 점이 있다면 언제든지 연락해주세요. 친절하게 답변해 드리겠습니다.

📩 페이스북

동기? 비동기?

우리는 모두 데이터를 처리하기 위해 동기 방식과 비동기 방식을 사용합니다. 그런데 정확히 동기는 무엇이고 비동기는 무엇일까요?

이번 파트에서는 동기(Sync)비동기(Async) 방식, 블록(Blocking)논블록(Non-Blocking)에 대해 설명하도록 하겠습니다.

동기

동기란 말 그대로 동시에 일어난다는 뜻입니다. 요청(Request)을 보내면 그에 해당하는 결과(Response)가 동시에 일어난다는 약속이죠. 때문에, 시간이 얼마나 걸리던 요청한 자리에서 결과가 주어져야 합니다.

비동기

비동기란 동시에 일어나지 않는다는 의미입니다. ‘요청한 결과는 동시에 일어나지 않을거라는 약속’이죠.

동기와 비동기는 왜 쓸까? 🔎

그렇다면 이러한 동기와 비동기는 왜 쓰는 것일까요?
동기와 비동기는 상황에 따라 각각 장단점이 존재합니다.

동기방식은 설계가 매우 간단하고 직관적이지만 결과가 주어질 때까지는 아무 작업을 못하고 대기해야만 하는 단점이 있습니다.

비동기 방식은 동기보단 구조가 복잡하지만 결과가 주어지는데 많은 시간이 걸리더라도 그 시간 동안 다른 작업을 병행 할 수 있으므로 효율적으로 사용할 수 있는 장점이 있습니다.

예시로 보는 동기와 비동기 ⏳

동기 ⏸

현재 제가 A에게 돈을 송금하려고 합니다.

저는 A의 계좌번호를 확인한 후 6700원을 송금합니다.

A는 계좌에 돈이 송금되었다는 것을 확인한 후 돈을 받았다고 답장합니다.

순서를 보면, 저와 A는 송금(요청)과 응답을 확인하며 같은 일을 동시에 진행하였습니다.
계좌이체같은 작업은 위와 같은 동기방식으로 처리해야 A에게 돈을 보냈는데 받지 못하는 상황이 없을 것입니다.

비동기 ▶

A는 동아리 시간이 기다려집니다. 회식이 기다리고 있기 때문입니다.
배달을 담당하기로 한 A는 배달앱에서 피자를 시킵니다.

주문 요청을 받은 피자가게는 즉시 피자를 굽습니다.

피자를 맛있게 굽고 배달 준비를 모두 마친 피자가게는 배달을 출발합니다.
... (20분 후) 피자가 도착했습니다! 맛있게 먹기만 하면 되겠네요.

A와 피자가게는 "피자"라는 link가 있지만 피자에 행하는 목적은 서로 다릅니다. A는 피자를 배달시키는 역할을 하고, 피자가게는 피자를 굽고 배달을하는 역할을 합니다. 서로의 목적은 다르기에 둘의 작업 처리기간은 일치하지 않으며, 일치하지 않아도 됩니다.

블록, 논블록은 뭐지? 🧐

앞서 소개한 동기/비동기는 요청받은 함수가 작업을 완료했는지를 누가 체크하느냐의 차이였다면, 블록/논블록은 요청받은 함수가 제어권(함수실행권)을 언제 넘겨 주느냐의 차이입니다.

블록

블록은 요청받는 함수가 작업을 모두 마치고 나서야 요청자에게 제어권을 넘기는 현상입니다. (그동안 요청자는 아무것도 하지않고 기다림)

작업이 완료된 후 새로운 작업을 수행할 수 있습니다.

논블록

논블록은 요청받은 함수가 요청자에게 제어권을 바로 넘겨주는 현상입니다. (그동안 요청자는 다른 일을 할 수 있음)

작업의 완료여부와 관계없이 새로운 작업을 수행할 수 있습니다.

예시로 보는 블록과 논블록 🔃

블록 + 동기

호출된 함수의 작업이 끝나야 제어권을 돌려받고, 호출 함수는 결과가 나올 때까지 계속 확인한다.

  • A : 혹시 이 부분좀 해줄 수 있어?
  • B : 가능하지! 옆에서 조금만 기다려봐
  • A : (B 옆에서 아무것도 안 하며 기다린다. 언제 끝나는지 궁금함.)
  • B : (열심히 하는 중..)
  • A : (지켜봄)
  • A : 오 끝났네! 고마워 ㅎㅎ

블록 + 비동기

호출된 함수의 작업이 끝나야 제어권을 돌려받고, 결과는 호출된 함수가 알려준다.

  • A : 혹시 이 부분좀 해줄 수 있어?
  • B : 가능하지! 옆에서 조금만 기다려봐
  • A : (B 옆에서 아무것도 안 하며 기다린다. 언제 끝나는지 관심 없음)
  • B : (열심히 하는 중..)
  • B : 끝났다! 자 여기

논블록 + 동기

제어권은 바로 돌려주고, 호출 함수는 결과가 나올때까지 계속 확인한다.

  • A : 혹시 이 부분좀 해줄 수 있어?
  • B : 가능하지!
  • A : (자기 할거 하다가) 다했어?
  • B : 잠시만
  • A : (자기 할거 하다가) 다했어?
  • B : 끝났어, 여기

논블록 + 비동기

제어권은 바로 돌려주고, 결과는 호출된 함수가 알아서 알려준다.

  • A : 혹시 이 부분좀 해줄 수 있어?
  • B : 가능하지! 다하고 말해줄게
  • A : (자기 할거 하는 중)
  • B : 끝났어! 여기

정리하며 📝

이번 글에서는 sync/async & blocking/non-blocking 대한 개념을 짚어보았습니다. 동기와 비동기같은 경우는 시점과 같은 개념이기 때문에 실제 코드에서는 애매할 것 같기도 합니다. 때문에 글에서는 동기와 블록킹, 비동기와 논블록킹의 개념을 섞어 작성하여 어느정도 구분이 지어진 것 같습니다. 정말 중요한 부분이니 꼭 직접 공부해보시길 추천드립니다 😉

참고

profile
대덕소프트웨어마이스터고등학교의 입학전형시스템을 개발하고 있는 팀 EntryDSM입니다. https://velog.io/@entrydsm 에 이어 전공 지식을 공유하기 위해 블로그를 개설하게 되었습니다.

2개의 댓글

comment-user-thumbnail
2022년 6월 18일

글 정말 재미있게 잘 쓰시네요 ㅋㅋㅋ

답글 달기
comment-user-thumbnail
2024년 1월 23일

In the realm of board games, where strategy and luck often collide, A Small World Cup stands out as a unique and exciting creation that brings the thrill of football to the tabletop

답글 달기