Files
weeklyreport/claude_temp/06_구글그룹_연동_작업계획서.md

22 KiB

구글 그룹 연동 작업계획서

작성일: 2026-01-10 예상 기간: 1~2주 우선순위: 6 선행 작업: 4번 (Gmail OAuth 로그인)


1. 기능 개요

1.1 핵심 컨셉

  • 사용자가 Google OAuth로 로그인한 상태에서
  • 본인이 속한 Google 그룹의 게시물 조회 (가져오기)
  • 본인 주간보고를 Google 그룹에 게시 (등록)
  • 모두 그룹 멤버 권한으로 동작 (관리자 권한 불필요)

1.2 권한 구조

┌─────────────────────────────────────────────────────────────────┐
│ Google 그룹: developers@company.com                             │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│  멤버들:                                                        │
│  ├─ hyosung@company.com  (시스템 관리자이기도 함)              │
│  ├─ hyewon@company.com                                         │
│  ├─ gildong@company.com                                        │
│  └─ ...                                                         │
│                                                                 │
│  멤버라면 누구나:                                               │
│  ✅ 그룹 게시물 읽기                                            │
│  ✅ 그룹에 글 게시                                              │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

※ 시스템 관리자 ≠ 그룹 관리자
※ 시스템 관리자도 그냥 그룹 멤버로서 읽기/쓰기

1.3 기능 요약

기능 누가 설명
가져오기 그룹 멤버 그룹 게시물 목록/내용 조회
등록 그룹 멤버 본인 주간보고 → 그룹에 게시

1.4 결정 사항

# 항목 결정
1 권한 그룹 멤버 권한만 사용
2 가져오기 본인이 속한 그룹 게시물 조회
3 등록 Gmail API로 그룹 이메일에 발송
4 OAuth 연계 4번 작업(Gmail OAuth) 토큰 활용

2. 기능 상세

2.1 가져오기 (그룹 게시물 조회)

[주간보고시스템]

┌─────────────────────────────────────────────────────────────────┐
│ 📬 Google 그룹 게시물                              [새로고침]   │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 그룹 선택: [developers@company.com ▼]                          │
│           ─────────────────────────                             │
│           developers@company.com                                │
│           team-leads@company.com                                │
│           all@company.com                                       │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 📧 [주간보고] 2026년 2주차 - 서혜원                             │
│    hyewon@company.com · 2026-01-10 09:30                       │
│                                                                 │
│ 📧 [공지] 이번 주 회의 일정 변경                                │
│    gildong@company.com · 2026-01-09 14:00                      │
│                                                                 │
│ 📧 [주간보고] 2026년 2주차 - 홍길동                             │
│    gildong@company.com · 2026-01-09 10:00                      │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

사용 API: Gmail API (그룹 이메일 검색)

GET /gmail/v1/users/me/messages?q=list:developers@company.com

2.2 등록 (주간보고 → 그룹 게시)

[주간보고 상세]

┌─────────────────────────────────────────────────────────────────┐
│ 2026년 2주차 주간보고 - 조효성                    [수정] [삭제] │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 금주 업무:                                                      │
│ - 로그인 기능 개발 완료                                         │
│ - 사용자 관리 페이지 수정                                       │
│ ...                                                             │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 🔗 Google 그룹 공유                                             │
│ ─────────────────────────────────────────────────────────────── │
│                                                                 │
│ 공유할 그룹: [developers@company.com ▼]                        │
│                                                                 │
│              [📤 그룹에 공유하기]                               │
│                                                                 │
│ ─────────────────────────────────────────────────────────────── │
│ 공유 이력:                                                      │
│ ✅ developers@company.com · 2026-01-10 09:30                   │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

발송되는 이메일 형식:

From: hyosung@company.com (본인)
To: developers@company.com (그룹)
Subject: [주간보고] 2026년 2주차 - 조효성

────────────────────────────────────────
2026년 2주차 주간보고
작성자: 조효성
소속: 개발팀
────────────────────────────────────────

[금주 업무]
- 로그인 기능 개발 완료
- 사용자 관리 페이지 수정
...

[차주 계획]
...

────────────────────────────────────────
※ 주간보고시스템에서 발송됨

사용 API: Gmail API (메일 발송)

POST /gmail/v1/users/me/messages/send

3. 데이터 모델

3.1 그룹 공유 이력 테이블

CREATE TABLE wr_report_group_share (
    share_id SERIAL PRIMARY KEY,
    report_id INTEGER NOT NULL REFERENCES wr_weekly_report(report_id),
    employee_id INTEGER NOT NULL REFERENCES wr_employee_info(employee_id),
    group_email VARCHAR(200) NOT NULL,           -- developers@company.com
    gmail_message_id VARCHAR(100),               -- Gmail 메시지 ID
    shared_at TIMESTAMP DEFAULT NOW(),
    share_status VARCHAR(20) DEFAULT 'SENT',     -- SENT, FAILED
    error_message TEXT
);

CREATE INDEX idx_report_share_report ON wr_report_group_share(report_id);
CREATE INDEX idx_report_share_employee ON wr_report_group_share(employee_id);

3.2 사용자 테이블 - OAuth 토큰 저장 (4번 작업 확장)

-- 4번 작업에서 추가 필요
ALTER TABLE wr_employee_info 
ADD COLUMN google_access_token TEXT,
ADD COLUMN google_refresh_token TEXT,
ADD COLUMN google_token_expires_at TIMESTAMP;

4. API 설계

4.1 그룹 관련 API

Method Endpoint 설명
GET /api/google-group/my-groups 내가 속한 그룹 목록
GET /api/google-group/[groupEmail]/messages 그룹 게시물 목록
GET /api/google-group/message/[messageId] 게시물 상세
POST /api/google-group/share 주간보고 그룹에 공유
GET /api/report/[id]/share-history 공유 이력 조회

4.2 API 상세

GET /api/google-group/my-groups

// Response
{
  "groups": [
    { "email": "developers@company.com", "name": "개발팀" },
    { "email": "all@company.com", "name": "전체" }
  ]
}

POST /api/google-group/share

// Request
{
  "reportId": 123,
  "groupEmail": "developers@company.com"
}

// Response
{
  "success": true,
  "messageId": "18d1234567890abc",
  "sharedAt": "2026-01-10T09:30:00Z"
}

5. OAuth Scope 설정

5.1 필요한 Scope (4번 작업 확장)

Scope 용도
openid 기본 인증
email 이메일 주소
profile 프로필 정보
https://www.googleapis.com/auth/gmail.readonly 그룹 게시물 조회
https://www.googleapis.com/auth/gmail.send 그룹에 메일 발송
https://www.googleapis.com/auth/gmail.labels 라벨 조회 (선택)

5.2 Google Cloud Console 설정 변경

  1. OAuth 동의 화면 > 범위 추가
  2. Gmail API 관련 scope 추가
  3. 민감한 범위로 분류되어 Google 검토 필요할 수 있음
⚠️ 주의: Gmail API scope는 "민감한 범위"로 분류됨
- 앱 인증 필요할 수 있음 (내부용은 대체로 OK)
- Google Workspace 도메인 내 사용 시 관리자 승인으로 해결

6. 화면 설계

6.1 메뉴 추가

사이드바 메뉴:
├─ 📊 대시보드
├─ 📝 주간보고
│   ├─ 작성
│   ├─ 목록
│   └─ 통계
├─ 📬 Google 그룹          ← 신규
│   └─ 게시물 조회
├─ 👥 사용자 관리
└─ ⚙️ 설정

6.2 그룹 게시물 조회 (/google-group)

┌─────────────────────────────────────────────────────────────────┐
│ 📬 Google 그룹 게시물                                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 그룹: [developers@company.com ▼]           [새로고침]          │
│                                                                 │
│ ───────────────────────────────────────────────────────────────│
│ □  제목                              보낸 사람       날짜       │
│ ───────────────────────────────────────────────────────────────│
│ ☐  [주간보고] 2026년 2주차 - 서혜원   서혜원    01-10 09:30   │
│ ☐  [공지] 회의 일정 변경               홍길동    01-09 14:00   │
│ ☐  [주간보고] 2026년 2주차 - 홍길동   홍길동    01-09 10:00   │
│ ☐  [주간보고] 2026년 1주차 - 서혜원   서혜원    01-03 09:00   │
│ ...                                                             │
│                                                                 │
│                     [1] [2] [3] ... [10]                       │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

※ Google OAuth 미연결 시:
┌─────────────────────────────────────────────────────────────────┐
│                                                                 │
│   Google 계정 연결이 필요합니다.                                │
│                                                                 │
│              [Google 계정 연결하기]                             │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

6.3 주간보고 상세 - 그룹 공유 섹션

┌─────────────────────────────────────────────────────────────────┐
│ 2026년 2주차 주간보고                             [수정] [삭제] │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ (주간보고 내용...)                                              │
│                                                                 │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│ 📤 Google 그룹 공유                                             │
│ ─────────────────────────────────────────────────────────────── │
│                                                                 │
│ 그룹 선택: [developers@company.com ▼]   [공유하기]             │
│                                                                 │
│ 공유 이력:                                                      │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ ✅ developers@company.com    2026-01-10 09:30               │ │
│ │ ✅ team-leads@company.com    2026-01-10 09:35               │ │
│ └─────────────────────────────────────────────────────────────┘ │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

7. 구현 상세

7.1 그룹 목록 조회

Gmail API로는 직접 그룹 목록 조회가 어려움. 대안:

  1. 사용자가 직접 입력 (간단)
  2. 시스템 설정에서 그룹 목록 관리 (권장)
  3. Directory API 사용 (Google Workspace 필요)
-- 시스템 설정 테이블에 그룹 목록 저장
CREATE TABLE wr_google_group (
    group_id SERIAL PRIMARY KEY,
    group_email VARCHAR(200) NOT NULL UNIQUE,
    group_name VARCHAR(100),
    is_active BOOLEAN DEFAULT true,
    created_at TIMESTAMP DEFAULT NOW()
);

INSERT INTO wr_google_group (group_email, group_name) VALUES
('developers@company.com', '개발팀'),
('team-leads@company.com', '팀장단'),
('all@company.com', '전체');

7.2 그룹 게시물 조회 로직

// Gmail API로 특정 그룹 메일 검색
async function getGroupMessages(accessToken: string, groupEmail: string) {
  const response = await fetch(
    `https://gmail.googleapis.com/gmail/v1/users/me/messages?q=list:${groupEmail}`,
    {
      headers: { Authorization: `Bearer ${accessToken}` }
    }
  );
  
  const data = await response.json();
  return data.messages; // [{id, threadId}, ...]
}

// 메시지 상세 조회
async function getMessage(accessToken: string, messageId: string) {
  const response = await fetch(
    `https://gmail.googleapis.com/gmail/v1/users/me/messages/${messageId}`,
    {
      headers: { Authorization: `Bearer ${accessToken}` }
    }
  );
  
  return response.json();
}

7.3 그룹에 메일 발송 로직

async function sendToGroup(accessToken: string, to: string, subject: string, body: string) {
  const email = [
    `To: ${to}`,
    `Subject: =?UTF-8?B?${Buffer.from(subject).toString('base64')}?=`,
    'Content-Type: text/plain; charset=UTF-8',
    '',
    body
  ].join('\r\n');
  
  const encodedEmail = Buffer.from(email)
    .toString('base64')
    .replace(/\+/g, '-')
    .replace(/\//g, '_')
    .replace(/=+$/, '');
  
  const response = await fetch(
    'https://gmail.googleapis.com/gmail/v1/users/me/messages/send',
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${accessToken}`,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ raw: encodedEmail })
    }
  );
  
  return response.json();
}

8. 작업 일정

Phase 1: OAuth Scope 확장 + 토큰 저장 (2일)

  • 시작:
  • 완료:
  • 소요시간:

작업 내용:

  • Google Cloud Console OAuth scope 추가
  • wr_employee_info에 토큰 저장 컬럼 추가
  • OAuth 콜백에서 access/refresh 토큰 저장
  • 토큰 갱신 로직

Phase 2: 그룹 게시물 조회 (3일)

  • 시작:
  • 완료:
  • 소요시간:

작업 내용:

  • wr_google_group 테이블 생성
  • 그룹 목록 API
  • 그룹 게시물 목록 API (Gmail API 연동)
  • 게시물 상세 API
  • 그룹 게시물 조회 페이지

Phase 3: 주간보고 그룹 공유 (3일)

  • 시작:
  • 완료:
  • 소요시간:

작업 내용:

  • wr_report_group_share 테이블 생성
  • 그룹 공유 API (Gmail 발송)
  • 공유 이력 API
  • 주간보고 상세에 공유 UI 추가
  • 이메일 본문 템플릿

Phase 4: 테스트 + 마무리 (2일)

  • 시작:
  • 완료:
  • 소요시간:

작업 내용:

  • 전체 플로우 테스트
  • 토큰 만료 시 갱신 테스트
  • 오류 처리 (권한 없음, 그룹 미가입 등)
  • 관리자 - 그룹 목록 관리 페이지

작업 완료 결과

Phase별 작업 시간

Phase 작업 내용 시작 완료 소요시간
1 OAuth Scope 확장 + 토큰 저장 - - -
2 그룹 게시물 조회 - - -
3 주간보고 그룹 공유 - - -
4 테스트 + 마무리 - - -
총 소요시간 -

생성/수정된 파일

구분 파일 작업
DB wr_employee_info 수정 (토큰 컬럼 추가)
DB wr_google_group 신규 테이블
DB wr_report_group_share 신규 테이블
API backend/api/google-group/my-groups.get.ts 신규
API backend/api/google-group/[groupEmail]/messages.get.ts 신규
API backend/api/google-group/message/[id].get.ts 신규
API backend/api/google-group/share.post.ts 신규
API backend/api/report/[id]/share-history.get.ts 신규
Frontend frontend/pages/google-group/index.vue 신규
Frontend frontend/pages/report/[id].vue 수정 (공유 UI)
Utils backend/utils/gmail-api.ts 신규
Utils backend/utils/google-token.ts 신규

9. 기술 스택

  • Backend: Nitro (H3) + PostgreSQL
  • Frontend: Nuxt3 + Vue3 + Bootstrap 5
  • 외부 API: Gmail API v1
  • 인증: OAuth 2.0 (4번 작업 확장)

10. 주의사항

10.1 Gmail API 제한

  • 일일 할당량: 사용자당 250개 할당량 단위/일
  • 메일 발송: 건당 100 할당량 단위
  • 대량 발송 시 제한 주의

10.2 민감한 Scope

  • Gmail readonly/send는 "민감한 범위"
  • Google Workspace 내부 앱은 관리자 승인으로 해결

10.3 토큰 보안

  • access_token, refresh_token 암호화 저장 권장
  • HTTPS 필수

11. 향후 확장 고려

  1. 게시물 시스템 연동: 그룹 게시물 → 회의록/공지사항으로 저장
  2. 자동 공유: 주간보고 확정 시 자동으로 그룹 공유
  3. 그룹별 자동 선택: 프로젝트 → 그룹 매핑으로 자동 선택
  4. 공유 알림: 그룹 공유 시 시스템 알림