2. What is the CallBack?
• 자바스크립트에서 비동기성을 표현하는 기본 단위다.
• ‘나중’에 실행 될 함수(Function)이다.
• 프로그램의 연속성을 감싼 / 캡슐화한 장치다.
3. 콜백 함수의 예
• 콜백함수의 실행 순서는 A, B, C
순이다.
• A와 B는 프로그램의 ‘지금’에 속하
고 C는 프로그램의 ‘나중’에 속한다.
• ‘지금’의 코드가 실행 된 후 비결정
적 시간 동안 중지되고 그 후 ‘C’의
코드가 실행된다.
4.
5. 비동기 코드가 왜 어렵나?
• 인간의 두뇌는 멀티태스커가 아니라 싱글태스커다.
• 이벤트 루프 큐가 동작하는 것 처럼 굉장히 빠른 컨택스트 교환
기로 기능하고 있어서 동시에 하는 것처럼 보인다.
• 인간은 단계별(Step-by-Step) 로 끊어 생각하는 경향이 있어서
동기 —> 비동기로 전환된 이후론 단계별로 나타내기가 쉽지 않다.
• 사람의 두뇌가 비동기처럼 회전하지 않으니 콜백으로 비동기
JS코드를 작성하고 추론하기가 어렵다.
7. 콜백 지옥
클릭 이벤트 대기 —> 타이머 작동까지 대기 —> AJAX 응답 받을때 까지 대기
.
8. 콜백지옥을 벗어나려면?
• 코드 단계의 해결책은 일단 중첩을
제거하는 것이다.
• 하지만 저자는 이 코드를 추론하려
면 함수에서 다른 함수로, 또 그다
음 함수로 흐름을 따라가기 위해선
소스 코드를 널뛰기 해야한다고 말
한다.
• 이것이 저자가 주장하는 콜백의
첫 번째 단점이다.
9. 제어의 역전
• 콜백 중심적 설계 방식에서 가장 큰 문제점은 제어권 교환이다.
• 콜백을 넘겨주는 ajax()는 개발자가 작성하거나 직접 제어할 수 있
는 함수가 아니라 서드파티가 제공하는 유틸리티인 경우가 많다.
• 문제는 다른 파트에 제어권을 줬을 때 다른 파트를 믿을 수 있는가?
이다.
10.
11. • (추적이 끝나기도 전에) 콜백을 너무 일찍 부른다.
• (아예 호출하지도 않거나) 콜백을 너무 늦게 부른다.
• 콜백을 너무 적게 또는 너무 많이 부른다.
• 필요한 환경/인자를 정상적으로 콜백에 전달하지 못한다.
• 일어날지 모를 에러/예외를 무시한다.
• …
모든 경우별로 방어로직을 구현하는건 어렵다.
15. 디자인 패턴을 적용한 콜백
분할 콜백
이런 API 설계에서 failure 함수는 필수가 아니며,
작성하지 않으면 에러는 조용히 무시된다.
16. 에러 우선 스타일
에러 객체를 첫 번째 인자로 받는다.
성공 시 이 인자는 빈/ falsy 객체지만, 실패 시 truthy 또는 에러 객체로 셋팅된다.
17. • 위의 두 예제로 믿음성 문제가 해결된 것 처럼 보이지만 전혀 그렇
지 않다.
• 원하지 않는 반복적인 호출을 방지하거나, 걸러내는 콜백 기능이 전
혀 없으며, 성공/에러 신호를 동시에 받거나 전혀 못받을 수 있으므
로 상황별로 코딩해야 하는 부담이 생겼다.
• 표준적인 패턴을 띠고 있지만, 재사용이 불가능한 장황한 관용 코드
다.
• 만약 콜백이 한번도 호출되지 않는다면?
18.
19. 결론
• 콜백은 자바스크립트에서 비동기성을 표현하는 기본 단위 였지만,
점점 진화하는 비동기 프로그래밍 환경에서 충분하지 않게 됐다.
• 콜백으로 인한 비선형적, 비순차적으로 나타나는 코드들은 추론하기 어렵
고 악성 버그를 품은 코드로 이어진다.
• 콜백은 프로그램을 진행하기 위해 제어권을 다른파트로 넘겨줘야하는데 제
어권이 넘어가면서 믿음성 문제가 발생한다.
• 이런 믿음성 문제를 해결하고자 임시로직을 짜 넣을 수 있지만 유지보수가
어려운 스파게티 코드가 발생한다.
• 이런 문제들을 해결하기위해 프라미스라는 최신 기술이 등장하게 되었다.