배우는거끄적이기

[과제] Express 실행 구조 요약 및 정리

PARKpatchnotes 2025. 9. 25. 15:00

Express 애플리케이션의 실행 구조 보고서

Express의 실행 구조

Express 애플리케이션은 미들웨어(Middleware)의 연속적인 체인으로 구성되며, 클라이언트가 요청을 보냈을 때 요청이 처리되는 방식은 단계별로 명확하게 정의되어 있다. 클라이언트 요청은 app.js 파일에 정의된 미들웨어 스택을 순차적으로 통과하며, 최종적으로 응답을 반환한다.

실행 과정

  1. HTTP 요청 수신 및 미들웨어 스택 시작:

    • 클라이언트의 요청이 Express 애플리케이션으로 전달된다.
  2. 최상단 미들웨어의 순차적 실행:

    • app.use()로 등록된 미들웨어가 순차적으로 실행된다. 이 과정에서 요청의 데이터를 전처리하거나 특정 조건을 확인한다.

    • 주요 미들웨어:

      app.use(logger("dev"));
      // → 요청이 들어올 때마다 로그를 출력
      
      app.use(express.json());
      // → 요청의 body가 JSON이면, req.body에 파싱된 객체로 넣어줌
      
      app.use(express.urlencoded({ extended: false }));
      // → 폼 데이터(body에 key=value&...)를 req.body에 객체로 넣어줌
      
      app.use(cookieParser());
      // → 요청의 쿠키를 쉽게 쓸 수 있도록 req.cookies에 객체로 넣어줌
      
      app.use(express.static(path.join(__dirname, "public")));
      // → public 폴더 안의 파일을 정적 파일(이미지, CSS 등)로 제공
  3. 라우팅 미들웨어 실행:

    • 클라이언트 요청이 정적 파일 요청이 아닌 경우, 라우팅 미들웨어로 전달된다.

    • 라우팅 설정:

      app.use("/", indexRouter);
      // → "/" 경로로 요청하면 indexRouter로 처리
      
      app.use("/users", usersRouter);
      // → "/users" 경로로 요청하면 usersRouter로 처리
      
      app.use("/channels", youtubeRouter);
      // → "/channels" 경로로 요청하면 youtubeRouter로 처리
  4. routes 폴더 내 라우터 핸들러 호출:

    • routes 폴더의 각 파일(index.js, users.js, channels.js)은 특정 경로에 대한 라우팅 규칙을 정의한다.
    • 라우터는 요청 경로와 HTTP 메서드에 따라 적절한 핸들러를 호출하여 비즈니스 로직을 처리한다.
    • 예: routes/users.js에서 GET /users 요청 처리:
      router.get("/", function (req, res, next) {
        res.send("respond with a resource");
      });
  5. 404 에러 처리:

    • 요청 경로와 일치하는 정적 파일이나 라우팅 규칙이 없으면 404 에러를 생성하고 다음 미들웨어로 전달한다.
      app.use(function (req, res, next) {
      next(createError(404));
      });
  6. 최종 에러 핸들러:

    • 모든 에러는 최종 에러 핸들러에서 처리된다. 에러 상태 코드와 메시지를 설정하여 클라이언트에게 응답을 반환한다.

      app.use(function (err, req, res, next) {
      // set locals, only providing error in development
      res.locals.message = err.message;
      res.locals.error = req.app.get("env") === "development" ? err : {};
      
      // render the error page
      res.status(err.status || 500);
      res.render("error");
      });

routes 폴더의 역할

routes 폴더는 특정 경로와 관련된 라우팅 로직을 정의하고 관리하는 역할을 한다. 이는 Express 애플리케이션의 라우팅 로직을 모듈화하여 코드의 가독성과 유지보수성을 높이는 데 기여한다.

주요 파일과 역할 (프로젝트 내에서의 예시)

  1. routes/index.js:
    • / 경로에 대한 요청을 처리한다.
    • 예: 메인 페이지의 데이터 렌더링 또는 간단한 응답 반환.
  2. routes/users.js:
    • /users 경로에 대한 요청을 처리한다.
    • 사용자 관리와 관련된 라우팅 규칙(예: 사용자 조회, 등록, 수정, 삭제)을 정의한다.
  3. routes/channels.js:
    • /channels 경로에 대한 요청을 처리한다.
    • 채널 관리와 관련된 라우팅 규칙(예: 채널 목록 조회, 등록, 수정, 삭제)을 정의한다.

실행 흐름 요약

실행 흐름

  1. app.js에서 미들웨어 실행:
    • 요청 데이터를 처리하거나 전처리하는 미들웨어가 순차적으로 실행된다.
    • 정적 파일 요청(/public)인 경우, 해당 파일을 바로 제공하고 요청-응답 주기를 종료한다.
  2. 라우터 호출:
    • 요청 경로에 따라 적절한 라우터가 호출된다:
      • /routes/index.js
      • /usersroutes/users.js
      • /channelsroutes/channels.js
  3. 라우터 내 핸들러 실행:
    • 라우터는 요청 경로와 HTTP 메서드에 따라 적절한 핸들러를 호출하여 비즈니스 로직을 처리한다.
  4. 404 처리 및 에러 핸들러 실행:
    • 일치하는 경로가 없으면 404 에러를 생성한다.
    • 발생한 에러는 최종 에러 핸들러에서 처리된다.

결론

Express 애플리케이션의 실행 구조는 클라이언트 요청을 처리하는 명확한 흐름을 가진다. app.js는 미들웨어 체인과 라우팅 로직의 진입점 역할을 하며, routes 폴더는 각 경로에 대한 라우팅 규칙을 모듈화하여 코드의 유지보수성을 높인다. 이러한 구조는 Express 애플리케이션의 확장성과 관리 효율성을 극대화하는 데 기여한다.