[250909] 아웃소싱 프로젝트 과제

김기수·2025년 9월 9일
0

🗨️프로젝트 소개

이 프로젝트는 업무 등 협업 관계에서 일의 진행도 혹은 통계를 보기 위한 태스크 플로우 웹 애플리케이션입니다.
로그인 한 유저만 사용할 수 있습니다.
사용자는 작업 일정을 생성하거나 진행도를 변경할 수 있으며, 모든 작업에는 댓글을 달 수 있습니다.
통합 검색, 통계(대시보드) 보기를 제공합니다.


✨주요 기능

  • 회원가입 : 새로운 사용자가 회원가입을 진행할 수 있음.
  • JWT 인증 사용 : 로그인/로그아웃 및 로그인 필터 기능 구현.
  • 내 로그인 정보 보기 : 로그인 하고 있는 계정의 정보 확인 가능.
  • Task CRUD 및 상태 수정 : Task의 작성, 내용 수정, 삭제, 조회 및 상태 수정이 가능함.
  • Team CRUD : Team의 생성, 수정, 삭제, 조회 및 추가 가능한 사용자의 조회 가능함.
  • Comment CRUD : 댓글/대댓글의 생성, 수정, 삭제, 조회 가능함.
  • Dashboard : 대시보드 통계, 내 작업 요약, 팀 진행률 및 최근 활동을 조회 가능함.
  • activity : 활동 로그 조회 가능함.
  • search : 쿼리를 기준으로 통합 및 작업 검색이 가능함.

🛠 기술 스택


📖ERD

https://www.erdcloud.com/d/JCo3Jh32iPy9w5Xxf


📄API 명세

공통 응답

HTTP/1.1 {code}
Content-Type: application/json;
{
    "success": true,           
    "message": "성공 메시지",   
    "data": {},               
    "timestamp": "2024-03-21T10:00:00Z"
}
ParameterTypeDescription
successbooleanRequired. 요청 성공 여부
messageStringRequired. 성공/실패 메시지
dataObjectResponse Data (Null 가능)
timestampLocalDateTimeRequired. ISO 8601 형식

User

기능methodDomainEndPoint
현재 사용자 정보 조회GETuser/api/users/me
현재 사용자 정보 조회

Request

GET /api/users/me
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": "true",
  "message": "프로필 조회 성공",
  "data": {
    "name" : "이름",
    "email" : "user@email.com",
    "role" : "USER"
  },
  "timestamp": "2025-09-02"
}

Auth

기능methodDomainEndPoint
로그인POSTauth/api/auth/login
회원 가입POSTauth/api/auth/register
로그아웃POSTauth/api/auth/logout
계정 삭제POSTauth/api/auth/withdraw
로그인

Request

POST /api/auth/login
{
  "nickName": "test1",
  "password": "a12345!A"
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "로그인이 완료되었습니다.",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJqb2huZG9lIiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTYzMjU0MjJ9"
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
회원가입

Request

POST /api/auth/register
{
  "username": "johndoe",
  "email": "john@example.com",
  "password": "Password123!",
  "name": "John Doe"
}

Response

HTTP/1.1 201
Content-Type: application/json;

{
  "success": true,
  "message": "회원가입이 완료되었습니다.",
  "data": {
    "id": 1,
    "username": "johndoe",
    "email": "john@example.com",
    "name": "John Doe",
    "role": "USER",
    "createdAt": "2024-03-21T10:00:00Z"
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
로그아웃

Request

POST /api/auth/logout
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "로그 아웃이 완료되었습니다.",
  "data": null,
  "timestamp": "2024-03-21T10:00:00Z"
}
계정 삭제

Request

POST /api/auth/withdraw
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "password": "current_password"
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "회원탈퇴가 완료되었습니다.",
  "data": null,
  "timestamp": "2024-03-21T10:00:00Z"
}

Task

기능methodDomainEndPoint
task 생성POSTtask/api/tasks
task 목록 조회GETtask/api/tasks
task 상세 조회GETtask/tasks/{taskId}/comments?page=0&size=10
task 수정PUTtask/tasks/{taskId}
task 상태 변경PATCHtask/tasks/{taskId}/status
task 삭제DELETEtask/tasks/{taskId}
task 담당자 조회GETtask/tasks/{taskId}/assignee
task 생성

Request

POST /tasks
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "title": "프로젝트 기획안 작성",
  "description": "2024년 1분기 프로젝트 기획안 작성하기",
  "dueDate": "2024-04-01T23:59:59Z",
  "priority": "HIGH",
  "assigneeId": 1
}

Response

HTTP/1.1 201
Content-Type: application/json;
{
  "success": true,
  "message": "Task가 생성되었습니다.",
  "data": {
    "id": 1,
    "title": "프로젝트 기획안 작성",
    "description": "2024년 1분기 프로젝트 기획안 작성하기",
    "dueDate": "2024-04-01T23:59:59Z",
    "priority": "HIGH",
    "status": "TODO",
    "assigneeId": 1,
    "assignee": {
      "id": 1,
      "username": "johndoe",
      "name": "John Doe",
      "email": "john@example.com"
    },
    "createdAt": "2024-03-21T10:00:00Z",
    "updatedAt": "2024-03-21T10:00:00Z"
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
task 목록 조회

Request

GET /api/tasks?status=TODO&page=0&size=10&search=기획&assigneeId=1
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "Task 목록을 조회했습니다.",
  "data": {
    "content": [
      {
        "id": 1,
        "title": "프로젝트 기획안 작성",
        "description": "2024년 1분기 프로젝트 기획안 작성하기",
        "dueDate": "2024-04-01T23:59:59Z",
        "priority": "HIGH",
        "status": "TODO",
        "assigneeId": 1,
        "assignee": {
          "id": 1,
          "username": "johndoe",
          "name": "John Doe",
          "email": "john@example.com"
        },
        "createdAt": "2024-03-21T10:00:00Z",
        "updatedAt": "2024-03-21T10:00:00Z"
      }
    ],
    "totalElements": 1,
    "totalPages": 1,
    "size": 10,
    "number": 0
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
task 상세 조회

Request

GET /tasks/{taskId}/comments?page=0&size=10
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "Task를 조회했습니다.",
  "data": {
    "id": 1,
    "title": "프로젝트 기획안 작성",
    "description": "2024년 1분기 프로젝트 기획안 작성하기",
    "dueDate": "2024-04-01T23:59:59Z",
    "priority": "HIGH",
    "status": "TODO",
    "assigneeId": 1,
    "assignee": {
      "id": 1,
      "username": "johndoe",
      "name": "John Doe",
      "email": "john@example.com"
    },
    "createdAt": "2024-03-21T10:00:00Z",
    "updatedAt": "2024-03-21T10:00:00Z"
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
task 수정

Request

PUT /api/tasks/{taskId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "title": "프로젝트 기획안 수정",
  "description": "2024년 1분기 프로젝트 기획안 수정하기",
  "dueDate": "2024-04-02T23:59:59Z",
  "priority": "MEDIUM",
  "status": "IN_PROGRESS",
  "assigneeId": 2
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "Task가 수정되었습니다.",
  "data": {
    "id": 1,
    "title": "프로젝트 기획안 수정",
    "description": "2024년 1분기 프로젝트 기획안 수정하기",
    "dueDate": "2024-04-02T23:59:59Z",
    "priority": "MEDIUM",
    "status": "IN_PROGRESS",
    "assigneeId": 2,
    "assignee": {
      "id": 2,
      "username": "janedoe",
      "name": "Jane Doe",
      "email": "jane@example.com"
    },
    "createdAt": "2024-03-21T10:00:00Z",
    "updatedAt": "2024-03-21T10:30:00Z"
  },
  "timestamp": "2024-03-21T10:30:00Z"
}
task 상태 변경

Request

PATCH /api/tasks/{taskId}/status
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "status": "IN_PROGRESS"
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "작업 상태가 업데이트되었습니다.",
  "data": {
    "id": 3,
    "title": "API 문서 작성",
    "description": "RESTful API 문서 작성하기",
    "status": "IN_PROGRESS",
    "priority": "MEDIUM",
    "assigneeId": 1,
    "assignee": {
      "id": 1,
      "username": "janedoe",
      "name": "Jane Doe",
      "email": "jane@example.com"
    },
    "createdAt": "2024-03-21T14:00:00Z",
    "updatedAt": "2024-03-21T14:30:00Z",
    "dueDate": "2024-03-28T14:30:00Z"
  },
  "timestamp": "2024-03-21T14:30:00Z"
}
task 삭제

Request

DELETE /api/tasks/{taskId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "Task가 삭제되었습니다.",
  "data": null,
  "timestamp": "2024-03-21T10:00:00Z"
}
task 담당자 조회(추가적으로 필요한 API)

Request

GET /tasks/{taskId}/assignee
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "태스크 담당자 조회 성공",
  "data": {
    "assignee": {
      "id": 5,
      "name": "홍길동"
    }
  },
  "timestamp": "2025-09-02T14:55:00.123Z"
}

Team

기능methodDomainEndPoint
team 생성POSTteam/api/teams
team 목록 조회GETteam/api/teams
team 정보 수정PUTteam/api/teams/{teamId}
team 삭제DELETEteam/api/teams/{teamId}
team member 추가POSTteam/api/teams/{teamId}/members
team member 삭제POSTteam/api/teams/{teamId}/members/{userId}
추가 가능한 사용자 목록 조회GETteam/api/users/available?teamId={teamId}
특정 팀 조회GETteam/api/teams/{teamId}
팀 멤버 목록 조회GETteam/api/teams/{teamId}/members
team 생성

Request

POST /api/teams
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "name": "팀 이름",
  "description": "팀 설명"
}

Response

HTTP/1.1 201
Content-Type: application/json;
{
  "success": true,
  "message": "팀이 성공적으로 생성되었습니다.",
  "data": {
    "id": 3,
    "name": "디자인팀",
    "description": "UI/UX 디자이너들",
    "createdAt": "2024-03-21T10:00:00Z",
    "members": []
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
team 목록 조회

Request

GET /api/teams
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "팀 목록을 조회했습니다.",
  "data": [
    {
      "id": 1,
      "name": "개발팀",
      "description": "프론트엔드 및 백엔드 개발자들",
      "createdAt": "2024-03-21T10:00:00Z",
      "members": [
        {
          "id": 1,
          "username": "admin",
          "name": "관리자",
          "email": "admin@example.com",
          "role": "ADMIN",
          "createdAt": "2024-03-21T09:00:00Z"
        },
        {
          "id": 2,
          "username": "johndoe",
          "name": "김철수",
          "email": "john@example.com",
          "role": "USER",
          "createdAt": "2024-03-21T09:00:00Z"
        }
      ]
    }
  ],
  "timestamp": "2024-03-21T10:00:00Z"
}
team 정보 수정

Request

PUT /api/teams/{teamId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "name": "프론트엔드팀",
  "description": "프론트엔드 전문 개발팀"
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "팀 정보가 성공적으로 업데이트되었습니다.",
  "data": {
    "id": 1,
    "name": "프론트엔드팀",
    "description": "프론트엔드 전문 개발팀",
    "createdAt": "2024-03-21T10:00:00Z",
    "members": [
      {
        "id": 1,
        "username": "admin",
        "name": "관리자",
        "email": "admin@example.com",
        "role": "ADMIN",
        "createdAt": "2024-03-21T09:00:00Z"
      }
    ]
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
team 삭제

Request

DELETE /api/teams/{teamId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "팀이 성공적으로 삭제되었습니다.",
  "data": {
    "message": "팀이 성공적으로 삭제되었습니다"
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
team member 추가

Request

POST /api/teams/{teamId}/members
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "userId": 3
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "멤버가 성공적으로 추가되었습니다.",
  "data": {
    "id": 1,
    "name": "개발팀",
    "description": "프론트엔드 및 백엔드 개발자들",
    "createdAt": "2024-03-21T10:00:00Z",
    "members": [
      {
        "id": 1,
        "username": "admin",
        "name": "관리자",
        "email": "admin@example.com",
        "role": "ADMIN",
        "createdAt": "2024-03-21T09:00:00Z"
      },
      {
        "id": 3,
        "username": "janedoe",
        "name": "이영희",
        "email": "jane@example.com",
        "role": "USER",
        "createdAt": "2024-03-21T09:00:00Z"
      }
    ]
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
team member 삭제

Request

DELETE /api/teams/{teamId}/members/{userId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "멤버가 성공적으로 제거되었습니다.",
  "data": {
    "id": 1,
    "name": "개발팀",
    "description": "프론트엔드 및 백엔드 개발자들",
    "createdAt": "2024-03-21T10:00:00Z",
    "members": [
      {
        "id": 1,
        "username": "admin",
        "name": "관리자",
        "email": "admin@example.com",
        "role": "ADMIN",
        "createdAt": "2024-03-21T09:00:00Z"
      }
    ]
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
추가 가능한 사용자 목록 조회

Request

GET /api/users/available?teamId={teamId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "사용 가능한 사용자 목록을 조회했습니다.",
  "data": [
    {
      "id": 3,
      "username": "janedoe",
      "name": "이영희",
      "email": "jane@example.com",
      "role": "USER",
      "createdAt": "2024-03-21T09:00:00Z"
    },
    {
      "id": 4,
      "username": "newuser",
      "name": "박민수",
      "email": "newuser@example.com",
      "role": "USER",
      "createdAt": "2024-03-21T09:00:00Z"
    }
  ],
  "timestamp": "2024-03-21T10:00:00Z"
}
특정 팀 조회

Request

GET /api/teams/{teamId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "팀 정보를 조회했습니다.",
  "data": {
    "id": 1,
    "name": "개발팀",
    "description": "프론트엔드 및 백엔드 개발자들",
    "createdAt": "2024-03-21T10:00:00Z",
    "members": [
      {
        "id": 1,
        "username": "admin",
        "name": "관리자",
        "email": "admin@example.com",
        "role": "ADMIN",
        "createdAt": "2024-03-21T09:00:00Z"
      }
    ]
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
팀 멤버 목록 조회

Request

GET /api/teams/{teamId}/members
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "팀 멤버 목록을 조회했습니다.",
  "data": [
    {
      "id": 1,
      "username": "admin",
      "name": "관리자",
      "email": "admin@example.com",
      "role": "ADMIN",
      "createdAt": "2024-03-21T09:00:00Z"
    },
    {
      "id": 2,
      "username": "johndoe",
      "name": "김철수",
      "email": "john@example.com",
      "role": "USER",
      "createdAt": "2024-03-21T09:00:00Z"
    }
  ],
  "timestamp": "2024-03-21T10:00:00Z"
}

Comment

기능methodDomainEndPoint
comment 생성POSTcomment/api/tasks/{taskId}/comments
comment 조회GETcomment/api/tasks/{taskId}/comments?page=0&size=10&sort=newest
comment 수정PUTcomment/api/tasks/{taskId}/comments/{commentId}
comment 삭제DELETEcomment/api/tasks/{taskId}/comments/{commentId}
comment 생성

Request

POST /tasks/{taskId}/comments
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "content": "기획안 초안 검토 완료했습니다.",
  "parentId": 5
}

Response

HTTP/1.1 201
Content-Type: application/json;
{
  "success": true,
  "message": "댓글이 생성되었습니다.",
  "data": {
    "id": 1,
    "content": "기획안 초안 검토 완료했습니다.",
    "taskId": 1,
    "userId": 1,
    "user": {
      "id": 1,
      "username": "johndoe",
      "name": "John Doe",
      "email": "john@example.com",
      "role": "USER"
    },
    "parentId": 5,
    "createdAt": "2024-03-21T10:00:00Z",
    "updatedAt": "2024-03-21T10:00:00Z"
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
comment 조회

Request

GET /api/tasks/{taskId}/comments?page=0&size=10&sort=newest
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "댓글 목록을 조회했습니다.",
  "data": {
    "content": [
      {
        "id": 1,
        "content": "기획안 초안 검토 완료했습니다.",
        "taskId": 1,
        "userId": 1,
        "user": {
          "id": 1,
          "username": "johndoe",
          "name": "John Doe",
          "email": "john@example.com",
          "role": "USER"
        },
        "createdAt": "2024-03-21T10:00:00Z",
        "updatedAt": "2024-03-21T10:00:00Z"
      },
      {
        "id": 2,
        "content": "감사합니다. 수정사항을 반영하겠습니다.",
        "taskId": 1,
        "userId": 2,
        "user": {
          "id": 2,
          "username": "janedoe",
          "name": "Jane Doe",
          "email": "jane@example.com",
          "role": "USER"
        },
        "parentId": 1,
        "createdAt": "2024-03-21T10:15:00Z",
        "updatedAt": "2024-03-21T10:15:00Z"
      }
    ],
    "totalElements": 15,
    "totalPages": 2,
    "size": 10,
    "number": 0
  },
  "timestamp": "2024-03-21T10:00:00Z"
}
comment 수정

Request

PUT /api/tasks/{taskId}/comments/{commentId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{
  "content": "기획안 초안 검토 완료했습니다. 수정사항 반영 필요."
}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "댓글이 수정되었습니다.",
  "data": {
    "id": 1,
    "content": "기획안 초안 검토 완료했습니다. 수정사항 반영 필요.",
    "taskId": 1,
    "userId": 1,
    "user": {
      "id": 1,
      "username": "johndoe",
      "name": "John Doe",
      "email": "john@example.com",
      "role": "USER"
    },
    "parentId": null,
    "createdAt": "2024-03-21T10:00:00Z",
    "updatedAt": "2024-03-21T10:30:00Z"
  },
  "timestamp": "2024-03-21T10:30:00Z"
}
comment 삭제

Request

DELETE /api/tasks/{taskId}/comments/{commentId}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "댓글이 삭제되었습니다.",
  "data": null,
  "timestamp": "2024-03-21T10:00:00Z"
}

Dashboard

기능methodDomainEndPoint
대시보드 통계 조회GETdashboard/api/dashboard/stats
내 작업 요약 조회GETdashboard/api/dashboard/my-tasks
팀 진행률 조회GETdashboard/api/dashboard/team-progress
최근 활동 조회GETdashboard/api/dashboard/activities?page=0&size=10
대시보드 통계 조회

Request

GET /api/dashboard/stats
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "대시보드 통계 조회 완료",
  "data": {
    "totalTasks": 15,
    "completedTasks": 8,
    "inProgressTasks": 4,
    "todoTasks": 3,
    "overdueTasks": 2,
    "teamProgress": 65,
    "myTasksToday": 5,
    "completionRate": 53
  },
  "timestamp": "2024-01-01T10:00:00.000Z"
}
내 작업 요약 조회

Request

GET /api/dashboard/my-tasks
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
"success": true,
"message": "내 작업 요약 조회 완료",
"data": {
"todayTasks": [
{
"id": 1,
"title": "버그 수정",
"status": "IN_PROGRESS",
"dueDate": "2024-01-01T23:59:59.000Z"
}
],
"upcomingTasks": [
{
"id": 2,
"title": "새 기능 개발",
"status": "TODO",
"dueDate": "2024-01-05T23:59:59.000Z"
}
],
"overdueTasks": [
{
"id": 3,
"title": "문서 작성",
"status": "TODO",
"dueDate": "2023-12-30T23:59:59.000Z"
}
]
},
"timestamp": "2024-01-01T10:00:00.000Z"
}
팀 진행률 조회

Request

GET /api/dashboard/team-progress
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "팀 진행률 조회 완료",
  "data": {
    "개발팀": 75,
    "디자인팀": 60,
    "QA팀": 85
  },
  "timestamp": "2024-01-01T10:00:00.000Z"
}
최근 활동 조회

Request

GET /api/dashboard/activities?page=0&size=10
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "활동 내역 조회 완료",
  "data": {
    "content": [
      {
        "id": 1,
        "userId": 2,
        "user": {
          "id": 2,
          "name": "김철수"
        },
        "action": "created_task",
        "targetType": "task",
        "targetId": 5,
        "description": "새 작업을 생성했습니다",
        "createdAt": "2024-01-01T09:30:00.000Z"
      }
    ],
    "totalElements": 25,
    "totalPages": 3,
    "size": 10,
    "number": 0
  },
  "timestamp": "2024-01-01T10:00:00.000Z"
}

activity

기능methodDomainEndPoint
활동 로그 조회GETactivity/api/activities
활동 로그 조회

Request

GET /api/activities
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "활동 로그를 조회했습니다.",
  "data": {
    "content": [
      {
        "id": 1,
        "type": "TASK_CREATED",
        "userId": 1,
        "user": {
          "id": 1,
          "username": "admin",
          "name": "관리자",
          "email": "admin@example.com",
          "role": "ADMIN",
          "createdAt": "2024-03-21T09:00:00Z"
        },
        "taskId": 5,
        "timestamp": "2024-03-21T10:30:00Z",
        "description": "새로운 작업 '로그인 버그 수정'을 생성했습니다."
      },
      {
        "id": 2,
        "type": "TASK_STATUS_CHANGED",
        "userId": 2,
        "user": {
          "id": 2,
          "username": "johndoe",
          "name": "김철수",
          "email": "john@example.com",
          "role": "USER",
          "createdAt": "2024-03-21T09:00:00Z"
        },
        "taskId": 3,
        "timestamp": "2024-03-21T10:15:00Z",
        "description": "작업 상태를 TODO에서 IN_PROGRESS로 변경했습니다."
      },
      {
        "id": 3,
        "type": "COMMENT_CREATED",
        "userId": 3,
        "user": {
          "id": 3,
          "username": "janedoe",
          "name": "이영희",
          "email": "jane@example.com",
          "role": "USER",
          "createdAt": "2024-03-21T09:00:00Z"
        },
        "taskId": 2,
        "timestamp": "2024-03-21T09:45:00Z",
        "description": "작업에 댓글을 작성했습니다."
      },
      {
        "id": 4,
        "type": "TASK_UPDATED",
        "userId": 1,
        "user": {
          "id": 1,
          "username": "admin",
          "name": "관리자",
          "email": "admin@example.com",
          "role": "ADMIN",
          "createdAt": "2024-03-21T09:00:00Z"
        },
        "taskId": 1,
        "timestamp": "2024-03-21T09:30:00Z",
        "description": "작업 정보를 수정했습니다."
      },
      {
        "id": 5,
        "type": "TASK_DELETED",
        "userId": 1,
        "user": {
          "id": 1,
          "username": "admin",
          "name": "관리자",
          "email": "admin@example.com",
          "role": "ADMIN",
          "createdAt": "2024-03-21T09:00:00Z"
        },
        "taskId": 7,
        "timestamp": "2024-03-21T09:00:00Z",
        "description": "작업을 삭제했습니다."
      }
    ],
    "totalElements": 25,
    "totalPages": 5,
    "size": 10,
    "number": 0
  },
  "timestamp": "2024-03-21T10:00:00Z"
}

기능methodDomainEndPoint
통합 검색GETsearch/api/search?q={query}
작업 검색GETsearch/api/tasks/search?q={query}&page=0&size=10
통합 검색

Request

GET /api/search?q={query}
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "검색 완료",
  "data": {
    "tasks": [
      {
        "id": 1,
        "title": "사용자 인증 구현",
        "description": "JWT 인증 시스템 구현",
        "status": "DONE",
        "assignee": {
          "id": 1,
          "name": "관리자"
        }
      }
    ],
    "users": [
      {
        "id": 2,
        "username": "johndoe",
        "name": "김철수",
        "email": "john@example.com"
      }
    ],
    "teams": [
      {
        "id": 1,
        "name": "개발팀",
        "description": "프론트엔드 및 백엔드 개발자들"
      }
    ]
  },
  "timestamp": "2024-01-01T10:00:00.000Z"
}
작업 검색

Request

GET /api/tasks/search?q={query}&page=0&size=10
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
{

}

Response

HTTP/1.1 200
Content-Type: application/json;
{
  "success": true,
  "message": "작업 검색 완료",
  "data": {
    "content": [
      {
        "id": 1,
        "title": "사용자 인증 구현",
        "description": "JWT 인증 시스템 구현",
        "status": "DONE",
        "priority": "HIGH",
        "assigneeId": 1,
        "assignee": {
          "id": 1,
          "name": "관리자"
        },
        "createdAt": "2024-01-01T09:00:00.000Z",
        "updatedAt": "2024-01-01T09:30:00.000Z",
        "dueDate": "2024-01-05T23:59:59.000Z"
      }
    ],
    "totalElements": 5,
    "totalPages": 1,
    "size": 10,
    "number": 0
  },
  "timestamp": "2024-01-01T10:00:00.000Z"
}

테스트 커버리지

Image

👥기여자


profile
백엔드 개발자

0개의 댓글