본문 바로가기

Study Information Technology

사용자 친화적인 웹 앱으로 자동화 작업 예약하기

728x90
반응형

사용자 친화적인 웹 앱으로 자동화 작업 예약하기

Overview

웹 앱을 개발하여 사용자가 자신의 로컬 머신에서 자동화된 작업을 예약할 수 있도록 하는 것은 매우 유용한 프로젝트입니다. 이를 통해 사용자는 반복적인 작업을 간편하게 관리할 수 있으며, 효율성을 높일 수 있습니다. 이번 글에서는 이 웹 앱의 구조, 기술 스택, 코드 예시, 발생할 수 있는 에러와 해결 방법에 대해 자세히 설명하겠습니다.

1. 프로젝트 개요

웹 앱의 기본 아이디어는 사용자가 웹 인터페이스를 통해 자동화할 작업을 선택하고, 해당 작업을 예약할 수 있도록 하는 것입니다. 사용자는 작업의 이름, 실행 주기, 시작 시간 등을 입력할 수 있습니다. 예약된 작업은 로컬 머신에서 자동으로 실행됩니다.

1.1 주요 기능

  • 작업 생성: 사용자가 자동화할 작업을 정의하고 예약할 수 있는 기능.
  • 작업 목록: 사용자가 생성한 모든 작업을 확인하고 수정할 수 있는 기능.
  • 작업 삭제: 필요 없는 작업을 삭제할 수 있는 기능.

2. 기술 스택

웹 앱을 개발하기 위해 다양한 기술을 사용할 수 있습니다. 여기서는 주로 사용되는 기술 스택을 소개합니다.

2.1 프론트엔드

  • HTML/CSS: 기본적인 웹 페이지 구조와 스타일링을 위해 사용.
  • JavaScript: 사용자 인터페이스의 동작을 제어하기 위해 사용.
  • React: 컴포넌트 기반의 UI를 구축하기 위해 사용. 사용자 경험을 개선할 수 있습니다.

2.2 백엔드

  • Node.js: JavaScript를 서버에서도 사용할 수 있게 해주는 환경.
  • Express.js: RESTful API를 쉽게 구축할 수 있도록 도와주는 프레임워크.
  • MongoDB: 작업 데이터를 저장할 수 있는 NoSQL 데이터베이스.

2.3 로컬 작업 실행

  • cron: UNIX 기반 시스템에서 정기적으로 작업을 실행할 수 있는 도구.
  • Windows Task Scheduler: Windows에서 작업 예약을 위한 도구.

3. 아키텍처

웹 앱의 아키텍처는 프론트엔드, 백엔드, 그리고 로컬 시스템 간의 상호작용으로 구성됩니다. 사용자가 프론트엔드에서 작업을 입력하면, 이 정보가 백엔드로 전송되고, 백엔드는 이를 로컬 시스템의 작업 예약 도구에 전달하는 구조입니다.

3.1 데이터 흐름

  1. 사용자가 프론트엔드에서 작업을 입력하고 제출.
  2. 프론트엔드는 API 요청을 통해 데이터를 백엔드로 전송.
  3. 백엔드는 데이터베이스에 작업을 저장하고, 로컬 시스템의 예약 도구에 작업 예약 요청을 전달.
  4. 로컬 시스템은 지정된 시간에 작업을 실행.

4. 코드 예시

아래는 간단한 작업 예약을 위한 백엔드 코드 예시입니다. 이 예시는 Express.js와 MongoDB를 사용하여 작업을 저장하고, cron을 사용하여 작업을 예약합니다.

4.1 백엔드 코드

const express = require('express');
const mongoose = require('mongoose');
const cron = require('node-cron');

const app = express();
app.use(express.json());

// MongoDB 연결
mongoose.connect('mongodb://localhost:27017/scheduler', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// 작업 스키마 정의
const taskSchema = new mongoose.Schema({
  name: String,
  cronTime: String,
  command: String,
});

const Task = mongoose.model('Task', taskSchema);

// 작업 생성 API
app.post('/tasks', async (req, res) => {
  const { name, cronTime, command } = req.body;

  const task = new Task({ name, cronTime, command });
  await task.save();

  // cron 작업 예약
  cron.schedule(cronTime, () => {
    console.log(`Executing task: ${name}`);
    // 로컬에서 명령어 실행
    require('child_process').exec(command, (error, stdout, stderr) => {
      if (error) {
        console.error(`Error executing command: ${error.message}`);
        return;
      }
      console.log(`stdout: ${stdout}`);
      console.error(`stderr: ${stderr}`);
    });
  });

  res.status(201).send(task);
});

// 서버 시작
app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

4.2 에러 발생 및 해결 방법

위 코드에서 사용자가 입력한 cronTime이 유효하지 않은 경우 에러가 발생할 수 있습니다. 예를 들어, 사용자가 "every day at 10 am"과 같은 잘못된 형식을 입력할 경우 다음과 같은 에러가 발생할 수 있습니다.

Error: Invalid cron expression: every day at 10 am

이런 경우, 유효한 cron 표현식을 입력하도록 안내하는 메시지를 사용자에게 제공해야 합니다. 예를 들어, 사용자가 입력한 cronTime을 검사하고, 잘못된 경우 적절한 형식의 예시를 제공할 수 있습니다.

5. 프론트엔드 구현

프론트엔드에서는 사용자가 작업을 입력할 수 있는 간단한 폼을 구성합니다. React를 사용하면 다음과 같은 컴포넌트를 만들 수 있습니다.

5.1 React 컴포넌트 예시

import React, { useState } from 'react';
import axios from 'axios';

const TaskScheduler = () => {
  const [name, setName] = useState('');
  const [cronTime, setCronTime] = useState('');
  const [command, setCommand] = useState('');

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      const response = await axios.post('/tasks', { name, cronTime, command });
      console.log('Task created:', response.data);
    } catch (error) {
      console.error('Error creating task:', error);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
    <input type="text" placeholder="Task Name" value={name} onChange={(e) => setName(e.target.value)} required />
      <input type="text" placeholder="Cron Time" value={cronTime} onChange={(e) => setCronTime(e.target.value)} required />
        <input type="text" placeholder="Command" value={command} onChange={(e) => setCommand(e.target.value)} required />
          <button type="submit">Schedule Task</button>
</form>
);
};

export default TaskScheduler;

6. 보안 및 권한

로컬 머신에서 작업을 실행할 때는 보안에 주의해야 합니다. 사용자가 임의의 명령어를 입력할 수 있기 때문에, 실행 가능한 명령어를 제한하는 것이 좋습니다. 이를 위해 화이트리스트를 만들어 특정 명령어만 허용하거나, 입력된 명령어를 철저히 검증하는 방법이 있습니다.

7. 배포

웹 앱을 배포할 때는 클라우드 서비스(예: AWS, Heroku 등)를 이용할 수 있습니다. 하지만 로컬에서 자동화된 작업을 실행하려면 사용자가 로컬 머신에 서버를 배포해야 합니다. Docker를 사용하면 다양한 환경에서 쉽게 배포할 수 있습니다.

참고문서

이러한 내용을 바탕으로 웹 앱을 개발하면 사용자가 자신의 로컬 머신에서 효율적으로 작업을 자동화할 수 있게 됩니다. 이를 통해 많은 시간과 노력을 절약할 수 있으며, 사용자 경험도 향상될 것입니다.

728x90
반응형