seungwonB / wanted-pre-onboarding-challenge-BE-task-December

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

1-1) 사전과제 진행 가이드

  • 아래 총 5 문제에 대한 해설을 작성한 뒤 Pull Request를 날려주세요.
  • 문제 해설에 대한 정해진 양식은 없으며, 최대한 자세히 해설해주시면 좋습니다.
  • 문제 유형은 해당 코스에서 다룰 주제들을 포함하고 있으니 완벽히 이해하시면 코스를 수강하는데 큰 도움이 될 것입니다.

*문의 사항은 사전 과제 Repository의 Issue로 등록해 주세요.

1-2) 사전 과제

(1) 동기와 비동기 프로그래밍에 대한 차이점을 설명해주세요.

  1. 동기 (Synchronous) : 요청이 들어오면 결과가 한 자리에서 나오는 것
    • 예) 짜장면을 배달해주고, 그 자리에서 다 먹고, 짜장면 그릇을 가져간다.
    • 코드가 작성된 순서대로 실행된다.
    • 요청된 일을 끝날 때까지 아무 일도 할 수 없다.
    • 시스템 전체적인 효율이 저하될 수 있다.
    • 직관적이라는 장점이 있다.
    function asynchronous() {
      console.log("1");
      console.log("2");
      console.log("3");
    }
  2. 비동기 (Asynchronous) : 요청이 들어오고 결과가 동시에 일어나지 않는 것
    • 예) 짜장면을 배달해주고, 다 먹을 동안 다른 곳에 가 있고, 다 먹으면 짜장면 그릇을 가져간다.
    • 코드가 작성된 순서대로 실행되는 것은 아니다.
    • 요청된 일을 시켜놓고 다른 일을 할 수 있다. 즉, 쓰레드나 프로세스가 여럿 돈다는 말도 된다.
    • setTimeout이라는 함수로 비동기로 주어진 일을 마친다면 setTimeout에 있는 함수를 실행하도록 업무를 맡겨 놓을 수 있다. 이것을 콜백함수라 한다.
    • Javascript가 도는 환경에는 Web API라는 것도 함께 동작한다. 여기에서는 timer, Ajax로 http 요청 보내기, 파일에서 데이터를 읽어오는 등 시간을 소요하는 작업을 한다.
    • timeout에서 시간이 지나면 테스크 큐에 콜백을 보낸다. 콜백함수들이 자바스크립트에서 실행되도록 하는 이벤트루프라는 장치가 콜백함수를 실행한다.
    • 아래 함수 결과는 1, 3, 2이다.
    function asynchronous() {
      console.log("1");
      setTimeout(() => {
        console.log("2");
      }, 1000);
      console.log("3");
    }
    • 이처럼 동기 작업보다 설계가 복잡하다. 이 문제를 해결하기 위해 Javascript는 ES6부터 Promise라는 것을 도입했다.
    • 비동기 작업을 마치면 then 하며 콜백을 수행하라는 약속을 한다.
    • Async라는 곳에 비동기 작업을 동기 작업처럼 작성을 할 수도 있다.

(2) 블로킹과 논블로킹의 차이점을 설명해주세요.

  1. 블로킹 : 동기에서 만들어진 개념으로 요청이 들어왔을 때 다음 요청이 대기하는 상태를 블록 상태라 한다.

  2. 논블로킹 : 비동기에서 만들어진 개념으로 요청이 들어왔을 때 다른 요청들을 자유롭게 사용할 수 있는 상황을 논블록 상태라 한다.

(3) 본인이 주로 사용하는 언어에서 비동기 프로그래밍을 사용하는 방법을 설명해주세요.

def 키워드로 선언하는 모든 함수는 파이썬에서 기본적으로 동기 방식으로 작동한다.
def 키워드 앞에 async 키워드를 붙이면 비동기 처리가되며 파이썬에서는 코루틴(cooperative routine)이라고 한다.

async def solution():
    pass

이러한 비동기 선언 함수내에서 await 키워드를 붙여 호출해야 한다.

async def solution():
    await print()

async 선언되지 않은 동기 함수 내에서 비동기 함수를 호출하려면 asyncio 라이브러리의 이벤트 루프를 이용하면 된다.

asyncio.run(main_async())

uvloopasyncio의 이벤트 루프 대체제이다. asyncio를 더 빠르게 만들어준다.

(4) 메세지 큐를 쓰는 이유에 대하여 2가지 예시를 서술해주세요.

메세지 큐란 프로세스 또는 프로그램 간에 데이터를 교환할 때 사용하는 통신 방법 중 하나로, 메세지 지향 미들웨어(MOM)를 구현한 시스템을 의미한다.
메세지 지향 미들웨어란 비동기 메세지를 사용하는 응용 프로그램들 사이에서 데이터를 송수신하는 것을 의미한다. 여기서 메세지란 요청, 응답, 오류 메세지 혹은 단순한 정보 등의 작은 데이터가 될 수 있다.

(1) 이메일 전송

  • 비밀번호를 잊어버려 임시 비밀번호를 받거나, 회원가입 인증 코드를 받는 경우, 어느 정도 응답 지연이 허용되며 어플리케이션의 핵심 기능으 아닌 경우이므로 메세지 큐가 도움이 돌 수 있다.
    image
  • 위의 경우의 임시 비밀번호, 인증 코드 등은 메세지를 큐에 넣을 수 있다.
  • 이메일 전송 전용 서비스는 이메일이 어느 서비스로부터 생산되었는지와는 관계없이, 메세지 큐의 메세지를 하나씩 소비하고, 그저 이메일이 전송 되어야할 곳으로 이메일을 전송한다.
  • 이와 같은 접근 방식은 메세지 큐에 들어오는 메세지 수가 너무 많아지는 경우 이메일 전송 전용 서비스 인스턴스를 더 둠으로써 확장할 수 있으므로 확장성이 뛰어나다.<br

(2) 서버 부하가 많은 작업

  • 이미지 처리, 비디오 인코딩, 빅데이터 등 대용량 데이터 처리와 같은 작업은 메모리, CPU를 많이 사용한다. 이러한 작업은 동시에 처리할 수 있는 양이 한정적이어서 무작정 요청을 보내 처리를 할 수 없다. 이럴경우 메세지 큐를 사용하면 서버가 처리할 수 있는 양을 메세지 큐에서 가져와 처리하면 된다.

(5) 본인이 작성한 서버 코드가 있는 github repo 주소를 제출해주세요. (CRUD 기능을 모두 포함하여야 하며, 서버에 대한 설명을 README에 작성해주시면 더욱 좋습니다.)

  1. 공직선거법 무죄 필터링 서비스
  1. 인스타그램

(6 - Optional) 해당 수업을 통해 꼭 배우고 싶은 주제 또는 지식이 있다면 자유롭게 서술해주세요.

  1. AWS EC2와 Machine Learning을 사용해보았지만 인프라는 설계해보지 않았다. 때문에 현업에서 쓰이는 인프라 구조가 무엇인지 알고 싶다.
  2. Lamda를 이용하여 서버 배포를 많이 한다고는 알고 있지만 Lamda를 살짝 접해보았을 때 어렵다고 느껴져 포기한 경험이 있다. 이 챌린지를 다시 Lamda로 서버 배포를 해보고 싶다.

About