개발자

node.js에서 API를 만들 때 콜백 함수를 많이 사용하나요?

1월 10일조회 462

안녕하세요 node.js express 강의를 듣고 있는 예비 (FE) 개발자입니다. 현재 back-end 역량을 키우기 위해 인프런의 `따라하며 배우는 노드, 리액트 시리즈 - 기본강의`를 수강중인데요 API를 만들때 콜백 함수를 많이 사용하고 메소드를 만들 때에도 콜백함수를 매개변수로 넣어서 결괏값을 콜백함수에 전달하도록 만들기도 하더라구요. 저는 왠지 이게 불편해서 promise 문법(.then .catch...)으로 바꿔보고 있었는데 문득 콜백을 사용하는 내가 모르는 이유가 있지 않을까? 하는 생각이 들었고, 현재 개발 트렌드도 궁금해졌습니다. 현재 개발 환경에서도 모종의 이유(JS의 태생적 한계?)로 프로미스 문법보다는 콜백을 많이 사용하는지, 아니면 오래된 강의(2020년)라 그런건지, 그냥 사바사인지 궁금합니다!

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

백승훈님의 프로필 사진

각각의 장단점이 있기는 한데 최신 문법으로는 콜백 만으로는 거의 작성하지 않습니다. (쓰는 경우도 있습니다. 해당 강의를 안봐서 자세히는 답변드리기 힘드내요) 구 Express의 경우 제가 알기로 async - await도 조금 늦게 들어온 걸로 알고 있고 흐름을 보여주려고 해당 문법을 사용했을 수도 있다고 생각합니다. 저의 경우 일반적으로 3개 이상의 호출이나 2depth이상 들어가는 promise.then의 경우 async-await로 바꿔서 사용하며 간단한 호출이나 1depth 정도에서는 promise를 종종 사용하는 것 같습니다. 일부 promise all과 race등 특별한 경우 이외에는 async - await로 쓰는 감을 익히시는게 더 도움이 될 수 있습니다. 하지만 3가지 다 써보는 경험을 가지는건 좋다고 생각합니다. 이후 회사의 레거시 코드나 node 버전이 낮은 프로젝트를 관리 혹은 고도화하게 된다면 해당 프로젝트에서는 콜백등으로 활용하여 작성되어 있을 확율이 높습니다. + 혹시 하단 코드와 같이 작성된 부분을 콜백이라 불편하다고 적으신 거라면 express 미들웨어 (라이브러리)의 특성상 콜백 기반이며 다음과 같이 작성하도록 안내되어 있음으로 되도록 따르는 것이 좋습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
const express = require('express');
const app = express();

app.use((req, res, next) => {
  console.log('Request URL:', req.originalUrl);
  next();
});

app.get('/', (req, res) => {
  res.send('Home Page');
});

app.listen(3000);
신기정님의 프로필 사진

신기정

작성자

새싹 개발자1월 11일

친절한 답변과 꿀팁 감사합니다ㅎㅎ 3개 이상의 호출이나 2depth이상 들어가는 경우엔 async-await로, 간단한 호출은 promise.then으로! 클라이언트의 요청을 받는 부분은 살펴보는 과정에서 콜백으로만 동작한다는 것을 깨닫고 그냥 그런거구나 하고 이해한 상태입니다! 다만 아래의 bcrypt를 활용해서 소금을 치고 해싱하는 로직에서 콜백이 두 번씩이나 쓰여서 조금 궁금해져서 질문 드렸었습니다! 저는 아래 코드를 .then을 두 개 사용하는 쪽으로 고쳤는데, async-await로 고쳐봐야겠습니다! 감사합니다ㅎㅎ ```javascript // save 전에 실행 userSchema.pre("save", function (next) { let user = this; // 암호화 로직 if (user.isModified("password")) { bcrypt.genSalt(saltRounds, (err, salt) => { if (err) return next(err); bcrypt.hash(user.password, salt, (err, hash) => { if (err) return next(err); user.password = hash; next(); }); }); } else { next(); } }); ```

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!