728x90

용어의 개념은 헷갈리지 않도록 다음과 같이 잡고 가겠다.
주체 : main. 다른 주체를 호출하는 함수
다른 주체 : main에서 호출하는 함수.

Blocking vs Non-Blocking

다른 주체가 작업할때 "제어권"이 해당 주체에게 넘어가는지 넘어가지 않는지로 구분.

  • Blocking
    • 다른 주체가 작업할 때 제어권이 주체에서 다른 주체에게 넘어간다.
    • 다른 주체가 작업이 끝날때까지 주체는 모든 작업을 중단하고 결과가 return 될때까지 기다린다.
  • Non-Blocking
    • 다른 주체의 작업완료 여부에 관련 없이 자신의 작업을 이어간다.
    • synchronous 기반 언어에서 다른 주체는 주체에게 요청 받는 즉시 응답을 보내 주체가 계속 제어권을 가질수 있도록 해준다.

Synchronous vs Asynchrnous

다른 주체에서 결과를 돌려주었을 때 어느 주체가 코드의 순서와 해당 결과에 관심이 있는지 아닌지로 구분.

  • Synchronous
    • 주체가 다른주체의 작업 완료 여부에 신경을 쓰게 되어 작업을 동시에 수행하거거나, 동시에 끝내거나, 끝나는 동시에 시작함을 의미
    • 예를 들어 송금 서비스가 있다. A가 B에게 송금 메시지 전송, B가 A에게 수금 성공 메시지 전송, 이후 A와 B는 각각 차액 증액 시행.
      • 요청과 응답이 발생한 후 이 결과를 바탕으로 동시에 같은 작업을 동시에 함.
    • 응답 값이 곧 작업 결과와 일치한다.
  • Asynchronous
    • 주체가 다른주체의 작업 완료 여부에 신경을 쓰지 않아 시작, 종료가 일치하지 않으며, 끝나는 동시에 시작을 하지 않음을 의미
    • 응답 값이 작업 결과가 함께 전송되지 않고 값도 다를 수 있다.
    • js에서 비동기 처리를 할 때, axios의 return 값은 바로 promise를 반환한다.

Blocking - Synchronus

  • 주체는 다른 주체를 호출 하면서 동작하지 않고 기다린다. 이후 다른 주체가 작업 결과를 반환하면 주체는 비로소 그 결과를 바탕으로 작업을 개시한다.
  • Blocking - Synchronous의 예시로는 Java의 scanner 입력요청이 있다. 입력요청을 하는 순간 프로그램은 스탑하며(blocking) 입력결과가 반환된 순간 이 결과를 바탕으로(sync) 이후의 작업이 이어진다.
  • const fs = require('fs');
    const data = fs.readFileSync('/file.md'); // 파일을 읽을 때까지 여기서 블로킹 됩니다.

NonBlocking - Synchronous

  • 주체는 다른주체에 요청을 보낸 후, 다른 주체의 작업 결과를 기다리지 않고 본인의 작업을 계속한다. 이 때 주체는 다른 주체에게 중간중간 해당 작업이 끝났는지 물어본다. 이 결과 다른 주체가 작업 결과를 반납하면 주체는 그 결과를 바탕으로 작업을 개시한다.
  • NonBlocking - Synchronous의 예시로는 정보의 로드율(다운로드. 업로드)이 얼마만큼인지 보여줄 때이다. chrome에서 파일을 받을동안 사용자는 인터넷 서핑을 계속 이어갈 수 있다.(non-blocking) 그리고 다운로드가 진척되는 중간중간 진행정도(%)를 사용자에게 실시간 UI 보여준다.(synchronous)

Blocking - Asynchronous

  • 주체는 다른주체에게 요청을 보낸 후 동작하지 않고 멈춘다. 하지만 주체는 다른 주체의 작업 결과값에 관심이 없다.
  • asynchronous이기 때문에 다른 주체는 바로 결과를 반환하고 이후 작업을 시작한다. 하지만 주체는 작업결과를 기다린다.
    • async 함수가 응답과 작업결과가 다른 함수인데 blocking으로 작업결과가 나오기까지 기다린다라... blocking/sync와 별반 다를바 없어보인다. 이런 상황은 주로 개발자 실수로 만들어진 경우가 대다수다.

NonBlocking - Asynchronous

  • 주체는 다른 주체에게 요청을 보낸후, 다른 주체의 작업 결과를 기다리지 않고 본인의 작업을 계속한다. 다른 주체는 요청받은 작업을 하다가 작업이 끝나면 주체의 callback함수를 실행한다.
  • js의 비동기 처리가 이에 해당한다.(정밀하게는 동기적으로 작동하지만) 주체가 다른 주체를 호출하고 바로 주체 본연의 일을 한다.(비동기 함수는 바로 promise를 반환하기때문에 동기적으로 작동해도 이것이 가능) 이후 다른 주체가 결과를 도출하면 이 결과를 바탕으로 주체에 있던 callback함수를 실행한다. 각자 본인의 일을 하고 잇는 것이다.
  • const fs = require('fs');
    fs.readFile('/file.md', (err, data) => {
      if (err) throw err;
    });

Javascript 에서 의미하는 async/ await 는?

비동기 처리란?

특정 코드의 연산이 끝날 때 까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 자바스크립트의 특성이다. 동기 처리를 사용할 시 비동기 작업 결과값을 마냥 기다릴 수 없기 때문에 기본적으로 비동기 처리를 사용한다.

비동기 처리 방식에는 작업결과를 이용할 수 없다는 문제점이 있다. 이 문제점을 JS에서는 비동기함수(ex. axios)가 callback함수를 넘겨받아 해결하도록 함으로써 해결한다.(callback, promise, await)

async

async function 의 의미는 이 함수가 promise vlaue를 반환할 것이라는 의미이다. 즉, 직역적으로도 비동기 함수라는 뜻이다.
async 함수는 보통 내부에서 await를 사용중일 때 선언하는데 await또한 비동기 함수의 promise.value를 반환받을 때까지 기다리는 기능을 하므로 await를 선언한 함수도 어쩔 수 없이 비동기 함수가 되게된다.

await

await는 얼핏보면 async 함수내에서 await를 호출한 시점부터 이후의 코드의 실행을 멈추는 Blocking 기능을 한다고 볼 수 있다.

하지만 정확히 따져보면 await는 Blocking 기능을 수행하지 않고 있다.
그 이유는 실제 Blocking이 일어나고 있었다면 await하는 동안 해당 프로그램은 이벤트 처리를 할 수 없어야한다. 하지만 await 중에도 이벤트 발생시 이벤트 처리는 이벤트 처리대로 실행할 수 있다.

결론: async 함수는 내부적으로 blocking/sync 로 보일 수 있다. 하지만 현실은 promise.then 기반의 non-blocking/ async 구조이다. 그리고 async함수는 그 자체적으로 promise를 반환하는 async 함수이다.

'기타' 카테고리의 다른 글

MVC 란?  (0) 2021.05.19
library vs framework  (0) 2021.03.07
CI(continuous Integration)/CD(Continuous Delivery/Continous Deployment)  (0) 2021.02.11
728x90

웹사이트를 비롯한 소프트웨어에서 사용하는 구조

Model : 데이터를 저장하는 장소.

View : 눈에 보의는 것. 웹에서는 HTML

Controller : 사용자의 행동에따라 Model과 View를 조작하는 코드 파일. 예를들면 routing 기능이 있겠다.

MVC파일의 구조이다.

사용자가 링크창에 라우팅을 했을때 일어나는 상황은 다음과같다.

  1. 사용자가 Lecture/Watch/lecNo=1 입력
  2. lectureController.cs 에서 watch라는 함수가 강의 목록을 인자로 받아서 Service의 lectureRepository의 GetOne 함수를 호출 (lecRep.GetOne(lecNo))
  3. Service의 lectureRepository에서 강의의 상세정보를 받는다
  4. watch.cshtml에서 해당내용 반환. 결과물 화면이 보여지게된다.
728x90

공통점

  • 둘 다 누군가가 쓴 코드이며 우리의 프로젝트를 위해 가져다 씀

차이점

  • library
  • 내가 필요할 때 해당 코드를 호출하여 마음대로 사용할 수 있다.
  • jquery를 필요할때 사용할 수 있다.
  • framework
  • 누군가가 정해준 규칙을 따라 내 코드를 반영한다
  • Django를 필요할때 부르는 경우는 없다. 내가 Django Documentation을 보고 Django 규칙에 맞게 코드를 짠다.

React는 library인가 framework인가?

라이브러리다

  • 내가 필요할 때 import하여 호출한다는 점에서 react는 library 이다.

요약

  • 라이브러리: 내가 필요로 할 때 도서관에서 자료 찾듯이 마음대로 빌려 쓰는 것
  • 프레임워크: (정해진) 프레임 내에서 작업을 해야 하는 것
  • 하지만 그 둘의 경계가 항상 뚜렷한 것은 아니다...
728x90

CI(Countinuous Integration) - 빌드/테스트 자동화

  • 개발자를 위해 빌드 및 테스트를 자동화 해준다
  • 새로운 소스코드의 빌드, 테스트, 병합
  • CI 절차 예시
    1. 개발자는 자신의 로컬에서 코드를 수정하고 Github에 해당 내용을 Push한다.
    2. CI 도구에서 변경된 코드로 인해 빌드와 테스트를 새로 수행하고 결과를 피드백해준다.
    3. 개발자는 자신이 개발한 소프트웨어의 소스코드를 공통된 버전 관리시스템(github 등)에 저장합니다.
    4. 소스코드상에 변동이 생기면 버전 관리 시스템에서는 CI 툴 (Jenkins)로 소스코드 변경을 알립니다.
    5. CI툴에서는 변경된 소스코드를 대상으로 Build, Test, Merge를 진행합니다. 이 과정들이 완료되면 슬랙, 카카오톡, 메일 등을 통해 통합 결과를 알립니다.

CD(Continuous Delivery/Continous Deployment) - 배포 자동화

  • CI 로 새롭게 빌드된 파일을 서비스 중인 서버에 자동으로 배포한다.

  • 변경사항이 레포지토리를 넘어, 고객의 프로덕션 환경까지 릴리즈

  • 자동화 수준에 따라 아래 2가지로 구별 가능하다

    • Continous Delivery(지속적인 배송) : 프로덕션 환경에 수동 배포

      • - 빌드파일을 배포(서비스)까지는 하지않고 스테이징까지만 한다.
      • - 배포는 운영팀이 직접한다.
    • Continous Deployment(지속적 배포) : 프로덕션환경에 자동 배포

      • 빌드파일을 배포까지 자동으로 한다. 이 경우 배포 중 서비스가 잠시 끊기게된다.

        ※ 스테이징 환경: 운영환경과 거의 동일한 환경을 만들어놓고, 여러가지 비 기능적인 부분을 검증하는 환경

        ※ 프로덕션 환경: 실제 서비스를 위한 운영환경

  • CD 절차 예시

    1. CI가 정상적으로 수행되고 나면 빌드된 파일을 CD에 전달한다.
    2. CD에서는 빌드가 완료된 파일을 받아서 전처리 / 후처리 등을 수행한다. 아
      • 기존에 동작하던 애플리케이션을 종료시키고 업데이트된 빌드 파일로 애플리케이션을 구동
      • 새로 업데이트된 파일을 다른 포트에 풀어놓고 구동이 완료되면 프락시에서 들어오는 요청을 스위칭함. (무중단 배포)
  • CI/CD 합친 예시

    CI/CD pipeline
    1. Github에 소스코드를 푸시하면 Github에서는 Jenkins로 Web Hook을 날립니다.
    2. Jenkins에서 빌드-테스트를 진행하고 검증된 소스코드로 도커 이미지를 만듭니다.
    3. Jenkins 내부에 설정된 스크립트로 만들어진 도커 이미지를 Docker hub로 푸시합니다.
    4. Jenkins에서 프로덕션 서버로 스크립트 실행 명령을 날립니다. 해당 스크립트를 받은 운영서버는 Docker hub에서 이미지를 다운로드한 후 애플리케이션을 배포합니다.****

'기타' 카테고리의 다른 글

Blocking vs Non-Blocking / Synchronous vs Asynchronous  (0) 2021.06.05
MVC 란?  (0) 2021.05.19
library vs framework  (0) 2021.03.07

+ Recent posts