Skip to content

Callback 지옥.. 과 그 해결

요즘 Node.js 프로그래밍 책을 쓰고 있기도 하고, 사람들이 콜백지옥에 대해서 혼란스러워 하는 초보자들도 있는거 같기도 해서.. 한번 정리를 한다. ( 우선은 간결히 정리하고 나중에 책에는 좀더 자세히 써야… )

구글이나 여러곳에서 검색해보면 많은 사람들이 Node.js에 대해서 고생하고 있는 부분이기도 하다. ( 사실 주로 초보자들이 난해해 하는 부분.. )

1-x4TQU6V71WsylTYap5bXNA

심지어 영어로 검색해도 구글에서 저렇게 뜬다..실제로 익숙해지기 시작하면 그닥 어렵지 않은데.. 어쨌던 기본적으로 많은 책들은 Async 모듈을 이용해서 해결하라고 나와 있고, 그렇게 해결 하는 사람들도 많다.

개인적으로는 Async 모듈을 별로 좋아하지도 않고, 개인적으로는 코드도 좀 지저분해지고, 난해해진다고 생각해서 ( 실제로는 별반 차이없을 수도 있다. )

다른 방법으로 해결하고 있다.

우선 콜백 지옥을 해결하기 전에 왜 이런 일이 발생하는지 부터 알아야 한다.

Node.js 는 비동기 방식의 싱글 스레드를 채용하고 있다.
이게 무슨 말인고 하면, 이벤트 루프가 이벤트들을 기다리고 있고 이벤트가 발생하면 해당 하는 함수들이 실행되는 방식인것이다. ( 비동기 / 동기 , 싱글스레드 / 멀티 스레드는 나중에 다시 한번 언급해야 할듯 )

비동기 방식인지라, 이벤트를 무작정 기다릴 수는 없다. 단순하게 계산을 해야하는 함수라면 그냥 실행하면 되지만, 외부의 이벤트 예를들면 네트워크라던가 혹은 디스크등에 엑세스 하는 작업들의 경우에는 CPU혼자의 일이 아니므로 “이벤트”를 대기 해야 하는 상황이 생기는데 이를 무작정 기다리면서 다른 일을 안하는게 아니라 다른 일을 하다가 상황이 발생하면 다시 돌아오는게 좀 더 효율적이기 때문이다.

우선 비동기 이야기는 이쯤에서 끝내고. callback 문제의 인지와 해결을 해보자.

우선 다음과 같은 코드를 보자.

위와 같은 코드는 그냥 평범한 SQL코드이다.
일반적인 경우라면 순서대로 실행되서 console 에는 2 다음에 1이 찍히겠지만, 위의 경우에 1이 먼저 찍히고 2가 찍히게 된다. 문제는 그게 언저 어느 순간에 일어날지 모른다는거다. 이벤트가 발생해야 알게 되니까..
좀더 심화..다음을 보자.

이경우는? 더더욱 모른다. 그래서 사람들은 이런경우 다음과 같은 방법으로 문제를 해결한다.

2개일 경우는 양호한데..문제는 저게 10개가 되고 20개가 되면? 중간에 분기가 발생하게 되면??
바야흐로 콜백지옥이 시작되게 된다.
그래서 많은 사람들은 Async 와 같은 해결책도 내놓고 다양한 해결책들을 내놓게 된것이다.

나는 약간 다른 방법을 선호하는데, 저 문제의 코드들을 개별적으로 함수화 시켜서 병렬화 한뒤에 순서대로 호출하는걸 선호한다. 이유는 아래에서 다시 설명하고 우선 코드를 보자.

위와 같은 방식으로 하면 갯수가 늘어나는것은 물론 ( 동기적으로 보인다! ) 동시에 여러개의 함수를 실행하거나 혹은 for문을 돌리는것도 가능한데, 분기를 시켜도 상대적으로 간결해 보인다. 물론 코드는 좀 늘어나는데, for 문 돌렸을때의 편의성은 꽤 쓸만하다.

Be First to Comment

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.