HTTP & 콜백함수

programming·2023년 2월 5일
0
post-thumbnail

HTTP란?

  • 데이터를 주고 받는 양식을 정의한 "통신 규약"중 하나가 HTTP. (통신 규약: Protocol)
  • 매우 범용적인 양식을 가지고 있어 전 세계에서 제일 널리 쓰이는 통신 규약.
  • 여기서 말하는 통신 규약이란, 컴퓨터끼리 데이터를 주고 받을때 정해둔 약속을 의미.

비유를 하자면,

  • 내가 친구에게 한국어로 말을 걸면 친구가 내 말을 한국어로 이해하듯이, 갑자기 내가 독일어나 불어로 말한다면? -> 알아 듣지 못함.
  • 혹은 내가 같은 한국말로 말하더라도 친구가 잘 알고 있던 표준어가 아닌, 우리가 모르는 아주 작은 어느 지방에서만 사용하는 이해하기 난해한 사투리를 사용한다면? ->알아 듣지 못함.
    이렇듯이 HTTP라는 통신 규약을 이용하여 서버나 클라이언트(브라우저)끼리 의사 소통을 할 수 있게 된다.
  • 현대에 존재하는 대부분의 웹 서버가 HTTP를 기반으로 데이터를 주고 받는다.
    또한 모든 브라우저는 HTTP 프로토콜을 기본으로 지원하기 때문에 매일 HTTP를 이용하는 셈이 된다.

여기서 오해하면 안되는 포인트!

우리가 ""을 통해 의사 표현을 할 수 있듯이 모든 컴퓨터는 “네트워크”를 통해 의사 표현을 할 수 있다.

현실 세계에서 “”은 의사 표현의 수단이며, “언어”(ex. 한국어)는 의사 표현의 방법이다.

그리고 디지털 세상에서는 “네트워크”가 의사 표현의 수단이고, “통신 규약(ex. HTTP)”이 의사 표현의 방법이다.

의사 표현의 수단: (현실 세상) ↔ (디지털 세상) 네트워크
의사 표현의 방법: (현실 세상) 언어 ↔ (디지털 세상) 통신 규약

어떻게 HTTP로 데이터를 주고 받을까?

  • HTTP에서는 언제나 Request, Response라는 개념이 존재한다.
    서버와 브라우저의 관계로 가볍게 말해보면 아래와 같이 동작한다.
    브라우저는 서버에게 자신이 원하는 페이지(URL 등의 정보)를 요구(Request)한다.
    서버는 브라우저가 원하는 페이지가 있는지 확인하고, 있다면 해당 페이지에 대한 데이터를 반환(Response)해준다. 없다면 없는 페이지에 대한 데이터를 반환한다.
    (일반적인 웹 서버 기준)
    브라우저는 서버에게 전달 받은 데이터를 기반으로 브라우저에 그려준다.
    그리고 위와 같은 사례에서 "데이터"는 어떠한 데이터든 주고 받는게 가능하다.

콜백함수

콜백함수는 쉽게 말하자면 다른 함수에 매개변수로 넘겨준 함수를 의미한다.

매개변수로 넘겨받은 함수는 일단 넘겨받고, 때가 되면 나중에 호출(called back)한다는 것이 콜백함수의 개념이다.

function checkGang(count, link, good) {
  count < 3 ? link() : good();
}

function linkGang() {
  console.log('1일 3깡은 기본입니다. 아래 링크를 통해 깡을 시청해주세요');
  console.log('https://youtu.be/xqFvYsy4wE4');
}

function goodGang() {
  console.log('오늘 할당량은 모두 채우셨습니다! :)')
}

checkGang(2, linkGang, goodGang);

위의 함수로 예를 들면,

checkGang, linkGang, goodGang 총 3가지 함수를 선언하고

checkGang 함수를 호출할 때 매개변수로 count에 숫자값을,

그리고 link와 good에 각각 linkGang과 goodGang함수를 전달했다.

여기서 linkGang함수와 goodGang함수가 콜백함수인 것이다.

checkGang함수가 먼저 호출되고, 매개변수로 들어온 count의 값에 따라
linkGang과 goodGang함수 둘 중 한 가지가 나중에 호출된다.

위 코드는 count가 2이기 때문에 linkGang이 실행된다.

콜백지옥이란?

비동기 처리에 콜백 함수를 이용하면, 비동기 처리를 중첩시켜 코드 작성을 하기 때문에, 에러가 나고 예외처리가 어렵고, 중첩이 계속 발생하면 복잡도가 증가한다.

이것을 ‘콜백지옥’이라고 한다.

예를 들어 아래와 같은 코드가 나올 수 있다.

obj.callback(parameter1, () => {
    obj.callback(parameter2, () => {
        obj.callback(parameter3, () => {
            obj.callback(parameter4, () => {
                obj.callback(parameter5, () => {
                    obj.callback(parameter6, () => {
                        console.log('Hello, World!')
                    })
                })
            })
        })
    })
})

이런식으로 계속해서 콜백안에 콜백을 물어서 오른쪽 아래로 코드가 내려가는 형태를 콜백 지옥이라고 한다.

보기에도 어지럽고 읽기도 불편한데다, 코드의 흐름을 추적하기도 쉽지 않고, 만약 수정할 일이 생기면 콜백의 구조 특성상 수정도 쉽지 않다.

물론 간단한 코드는 콜백으로 작성하면 깔끔하게 보여서 나쁘지 않지만 만일 조금이라도 복잡해지기 시작하면 답이 없기 때문에 각 언어에서 제공하는 콜백 지옥을 방지할만한 기능을 알아보고 적극적으로 활용하도록 해야 한다.


이번 주 회고

이번 주차에 알고리즘 주차가 끝이 나고, 금요일부터 주특기 입문 주차가 시작되었다.

코딩 테스트 문제 풀이만 미친듯이 해서 머리가 어지러웠는데, 주특기 입문 주차 들어오자마자 과제 구현을 하라고해서 더 어지럽다.

node.js강의를 제공받아서 실습하는 것을 따라해봤고, 이 강의를 토대로 과제 구현을 해내야 하는데, 너무 막막하다.

강의에서 설명하는 기본적인 CRUD기능을 과제에 구현해야 하는데, 일단 용어 자체도 낯설고, 라우터를 어떻게 설정해야 하며, mongoDB 연결 오류까지..

그리고 강의에서 얼추 이렇게 하면 되겠구나 파악하고, 막상 시작을 하면 다시 또 막막함 그 자체다.

과제 제출 일정이 빡빡해서 혼자 해보고 모르는 부분이 있으면 팀원분들께 도움을 청하면서 해결해나가야겠다.

그래도 다행인건 뭔가 재밌는 느낌이다. 내가 이것을 완벽하게 연마하고 나중에 프로젝트 때 쓰게 되면 기분이 어떨까? 라는 생각이 계속 든다.

빨리 과제하러 가자. 다음주도 파이팅!

다음 주 목표

  • node.js 주특기 입문 주차 과제 구현 완료

  • CS 공부하기 (Chapter1, Cahpter2 (~75p) 1회독 하기)

profile
개발 기록 일지

0개의 댓글