본문 바로가기

Study Information Technology

웹 기반 프로젝트 관리 도구 만들기 자동화된 작업 할당 및 마감 기한 알림 시스템

728x90
반응형

웹 기반 프로젝트 관리 도구 만들기: 자동화된 작업 할당 및 마감 기한 알림 시스템

Overview
웹 기반 프로젝트 관리 도구는 팀원 간의 협업을 촉진하고 프로젝트의 진행 상황을 체계적으로 관리할 수 있는 유용한 애플리케이션입니다. 이 도구는 작업 할당을 자동화하고 마감 기한을 알림으로써 생산성을 높일 수 있습니다. 이번 글에서는 이러한 도구를 구축하는 과정에서 필요한 기술 스택, 기능, 코드 예시, 에러 처리 및 해결 방법에 대해 자세히 설명하겠습니다.

1. 요구사항 분석

1.1. 기본 기능

  • 사용자 관리: 사용자 등록, 로그인, 로그아웃
  • 작업 관리: 작업 생성, 수정, 삭제
  • 작업 할당: 팀원에게 작업 자동 할당
  • 마감 기한 설정: 작업의 마감 기한을 설정하고 알림 기능 구현
  • 대시보드: 프로젝트 상태, 진행 중인 작업, 마감 기한 등의 정보를 한눈에 보여주는 대시보드

1.2. 기술 스택

  • 프론트엔드: React.js
  • 백엔드: Node.js + Express.js
  • 데이터베이스: MongoDB
  • 알림 서비스: Node.js의 node-cron 패키지를 이용한 스케줄러

2. 시스템 아키텍처

아키텍처는 클라이언트-서버 모델을 기반으로 하며, 클라이언트는 React로 구축되고 서버는 Node.js로 구축됩니다. 데이터는 MongoDB에 저장됩니다. 아래는 간단한 아키텍처 다이어그램입니다.

[클라이언트] <--> [서버 (Node.js)] <--> [데이터베이스 (MongoDB)]

2.1. 클라이언트

React.js를 사용하여 SPA(Single Page Application) 형태로 구축합니다. 사용자는 여기에서 작업을 생성하고, 마감 기한을 설정하며, 대시보드를 통해 프로젝트의 전반적인 상태를 확인할 수 있습니다.

2.2. 서버

Express.js를 이용하여 RESTful API를 구축합니다. 이 API는 클라이언트의 요청을 처리하고 MongoDB와의 데이터 통신을 담당합니다.

2.3. 데이터베이스

MongoDB를 사용하여 작업, 사용자, 마감 기한 등의 데이터를 저장합니다. 각 작업은 다음과 같은 구조를 가집니다.

{
  "taskId": "unique-task-id",
  "title": "작업 제목",
  "description": "작업 설명",
  "assignedTo": "user-id",
  "dueDate": "2024-10-30T18:00:00.000Z",
  "status": "pending"
}

3. 기능 구현

3.1. 사용자 관리

사용자 등록과 로그인을 구현합니다. 다음은 기본적인 사용자 등록 API의 예시입니다.

// routes/user.js
const express = require('express');
const User = require('../models/User'); // 사용자 모델
const bcrypt = require('bcrypt');
const router = express.Router();

// 사용자 등록
router.post('/register', async (req, res) => {
  const { username, password } = req.body;

  // 비밀번호 해시화
  const hashedPassword = await bcrypt.hash(password, 10);

  const user = new User({
    username,
    password: hashedPassword,
  });

  try {
    await user.save();
    res.status(201).json({ message: 'User created successfully' });
  } catch (error) {
    res.status(400).json({ error: 'User creation failed' });
  }
});

3.2. 작업 관리

작업을 생성하고 관리하는 API도 필요합니다. 아래는 작업을 생성하는 예시입니다.

// routes/task.js
const express = require('express');
const Task = require('../models/Task'); // 작업 모델
const router = express.Router();

// 작업 생성
router.post('/create', async (req, res) => {
  const { title, description, assignedTo, dueDate } = req.body;

  const task = new Task({
    title,
    description,
    assignedTo,
    dueDate,
    status: 'pending',
  });

  try {
    await task.save();
    res.status(201).json({ message: 'Task created successfully' });
  } catch (error) {
    res.status(400).json({ error: 'Task creation failed' });
  }
});

3.3. 작업 할당 및 마감 기한 알림

작업이 생성될 때, 사용자가 할당되고, 마감 기한이 다가오면 알림을 받을 수 있도록 설정합니다. 이를 위해 node-cron을 사용하여 주기적으로 마감 기한을 체크하고 알림을 발송하는 로직을 작성합니다.

3.3.1. Cron Job 설정

const cron = require('node-cron');
const Task = require('./models/Task'); // 작업 모델
const sendEmail = require('./utils/sendEmail'); // 이메일 발송 유틸리티

// 매일 자정에 마감 기한 체크
cron.schedule('0 0 * * *', async () => {
  const today = new Date();
  const tasks = await Task.find({
    dueDate: { $gte: today, $lt: new Date(today.getTime() + 24 * 60 * 60 * 1000) },
    status: 'pending'
  });

  tasks.forEach(task => {
    // 알림 이메일 발송
    sendEmail(task.assignedTo, task.title);
  });
});

3.4. 이메일 발송 유틸리티

이메일을 발송하기 위해 Nodemailer를 사용할 수 있습니다. 아래는 기본적인 이메일 발송 로직입니다.

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'your-email@gmail.com',
    pass: 'your-email-password',
  },
});

const sendEmail = (to, taskTitle) => {
  const mailOptions = {
    from: 'your-email@gmail.com',
    to,
    subject: '작업 마감 기한 알림',
    text: `작업 "${taskTitle}"의 마감 기한이 다가옵니다.`,
  };

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      console.log('Error sending email:', error);
    } else {
      console.log('Email sent:', info.response);
    }
  });
};

module.exports = sendEmail;

4. 에러 처리 및 해결 방법

개발 중 발생할 수 있는 몇 가지 일반적인 에러와 그 해결 방법을 살펴보겠습니다.

4.1. 데이터베이스 연결 실패

MongoNetworkError: failed to connect to server [localhost:27017] on first connect

이 에러는 MongoDB 서버에 연결할 수 없을 때 발생합니다. 해결 방법은 다음과 같습니다:

  • MongoDB가 실행 중인지 확인합니다.
  • 올바른 URI를 사용하고 있는지 확인합니다.

4.2. 비밀번호 해시화 실패

Error: The salt rounds must be a number

이 에러는 bcrypt의 saltRounds 인자가 숫자가 아닐 때 발생합니다. 이를 해결하기 위해 숫자로 설정해 주세요.

4.3. 이메일 발송 실패

Error: Invalid login: 535-5.7.8 Username and Password not accepted.

Nodemailer를 사용할 때 발생하는 이 에러는 인증 정보가 잘못되었음을 나타냅니다. 올바른 이메일과 비밀번호를 확인하세요. 또한, Gmail 계정을 사용하는 경우 "보안 수준이 낮은 앱 허용" 설정을 활성화해야 합니다.

5. 마무리

웹 기반 프로젝트 관리 도구는 팀의 생산성과 협업 효율을 높일 수 있는 강력한 도구입니다. 자동화된 작업 할당과 마감 기한 알림 기능은 특히 중요합니다. 본 글에서는 기본적인 아키텍처와 기능 구현 방법, 코드 예시, 에러 처리 방법 등을 다루었습니다.

이 프로젝트를 통해 웹 개발의 여러 측면을 경험하고, 실무에서 유용한 도구를 만드는 과정에서 많은 것을 배울 수 있을 것입니다.

참고문서

728x90
반응형