기본 HTTP 서버 구현하기 및 파라미터로 함수 전달하기
기본 HTTP 서버 구현하기
단순히 원하는 기능을 동작하는 코드를 넘어 좀 더 구조화된 코드에 대해 고민해봅시다.
대부분 웹에 있는 가이드들은 모든 로직을 한 곳에 구현하는 법을 알려줍니다. 이는 더 많은 코드가 있을 때는 가독성이 좋지 못할 것입니다. 그렇다면 어떻게 구현해야 좋을까요?
관심사가 다른 코드들을 분리하여 모듈에 넣어 유지하는 것이 상대적으로 쉽습니다.
모듈화를 하면 노드를 실행할 때 사용하는 main 파일을 깔끔하게 유지하고 main 파일과 다른 파일에서 사용하는 모듈들을 깔끔하게 유지할 수 있습니다.
자 그럼 이제부터 우리의 어플리케이션을 위한 main 파일과 HTTP 서버에 관련된 코드를 구현할 모듈 파일을 만들어봅시다. 보통의 main 파일의 이름은 index.js입니다. 서버 모듈은 server.js라는 이름으로 만드는 게 좋을 것 같습니다. server.js 파일을 프로젝트 루트 디렉터리에 만든 후 아래의 코드를 작성해주세요.
잘 동작하는 HTTP 서버를 만들었습니다. 정말 잘 동작하는지 확인하기 위해 실행해봅시다.
$ node 01_server.js
노드로 방금 만든 파일을 실행하고 브라우저를 열어 http://localhost:5000 으로 접속해봅시다.
우리가 입력한 “Hello World!”가 출력됩니다!
구현한 HTTP 서버 분석하기
위에서 구현한 파일을 분석해봅시다.
첫 줄은 기본 내장 모듈인 http 모듈을 불러와 http라는 이름의 변수를 통해 접근할 수 있도록 하였습니다.
그다음에는 http 모듈에서 제공하는 함수인 createServer 함수를 호출합니다. 이 함수는 객체를 리턴하고, 리턴된 객체는 listen이라는 함수를 가지고 있습니다. listen 함수는 HTTP 서버에서 요청 대기할 포트 번호를 나타내는 숫자를 받습니다. (http.createServer 괄호 뒤에 나오는 함수 선언은 잠시 무시합시다.)
아래와 같이 5000 포트를 listen 하는 서버를 만들 수 있습니다.
이 코드는 5000 포트를 listen 하는 HTTP 서버를 시작한 후 어떠한 요청이 들어와도 아무런 처리도 하지 않도록 구현되어 있습니다. 테스트를 위해 실행해보면 웹 브라우저는 대기 상태로 유지됩니다.
createServer() 호출 시 첫 번째 파라미터에 함수가 정의되어있는 부분을 살펴봅시다. 아마 php와 같은 보수적인 언어의 경험이 있으시다면 이게 이상하게 보일 수 있습니다.
자바스크립트에서는 함수도 다른 값과 같이 파라미터로 넘길 수 있습니다.
함수 전달하기
예를 들어 아래와 같이 구현할 수 있습니다.
자세히 보면 say라는 함수를 execute 함수의 첫 번째 파라미터로 넘겼습니다. say 함수의 리턴 값을 넘기는 것이 아닌 say 함수 자체를 넘기는 것입니다. 따라서 say는 execute 함수 내에서 someFunction이라는 변수가 되어 someFunction()이라고 표시하여 호출할 수 있습니다. say는 한 개의 파라미터를 가지므로 execute는 someFunction을 호출하면서 파라미터를 넘길 수 있습니다.
방금과 같은 예제처럼 자바스크립트에서는 함수를 다른 함수의 파라미터로 넘길 수 있습니다.
하지만 이렇게 먼저 정의한 후 그것을 넘기는 간접적인 방법을 사용할 필요가 없습니다.
함수를 정의하는 동시에 다른 함수의 파라미터로 넘길 수 있습니다.
execute의 첫 번째 파라미터 위치에 넘기고자 하는 함수를 정의하였습니다.
이때 우리는 함수 이름을 줄 필요가 없습니다. 이것이 익명함수라고 불리는 이유입니다.
이것으로 제가 고급 자바스크립트라고 부르고 싶은 것에 대해 처음으로 살짝 보았습니다.
앞으로 자바스크립트에서는 함수를 다른 함수의 파라미터로 넘길 수 있다는 것을 기억합시다.
함수를 변수에 할당한 후에 넘길 수도 있고, 정의하는 동시에 넘길 수도 있습니다.
함수 전달을 통해 구현한 HTTP 서버
아까 구현한 HTTP 서버 코드를 다시 한 번 봅시다.
이제는 위의 코드가 어떤 일을 하는지 알 수 있습니다. 익명 함수가 createServer 함수로 전달되었습니다.
위 코드를 리팩토링하면 아래와 같이 만들 수 있습니다.
왜 이런 함수를 넘기는 방식으로 구현하였을지에 대해 궁금하실 겁니다. 이 부분에 대해서는 다음 파트에서 보다 자세히 다루도록 하겠습니다.