Welcome! Everything is fine.

Claude Cowork Skill로 주간/월간 취업 리포트 자동화하기 본문

TIL

Claude Cowork Skill로 주간/월간 취업 리포트 자동화하기

개발곰발 2026. 7. 31.
728x90

클로드에서 스킬을 사용하는 모습

반복되는 취업 지원 관리가 번거로웠다

취업 준비를 하면서 지원 현황은 모두 Notion DB에 기록하고 있었다. 지원한 회사, 마감일, 지원일, 진행 상태 등을 한곳에서 관리할 수 있어 기록 자체는 어렵지 않았다.

 

문제는 기록하는 것보다 관리하는 것이었다.

 

지원하는 회사가 하나둘 늘어나자 매번 Notion을 열어 어떤 공고의 마감이 얼마 남았는지, 어떤 회사가 30일 넘게 연락이 없는지 직접 확인해야 했다. 합격·불합격 메일을 받으면 상태도 수동으로 수정해야 했는데, 가끔 이를 놓쳐 실제 진행 상황과 Notion의 내용이 달라지기도 했다.

 

문득 이런 생각이 들었다.

"Claude는 Notion도 읽을 수 있고 Gmail도 읽을 수 있는데, 이걸 내가 직접 관리할 이유가 있을까?"

 

그렇게 반복적인 취업 지원 관리 업무를 Claude Cowork Skill로 자동화하기 시작했다.

Claude Cowork Skill로 자동화 구조 만들기

자동화 흐름은 크게 세 단계로 구성했다.

/weekly-report
     │
     ▼
Notion DB 조회
     │
     ▼
지원 현황 집계 및 분석
     │
     ▼
Gmail 리포트 작성
 

Notion DB에서 지원 현황 데이터를 가져온 뒤, 현재 진행 상황과 확인이 필요한 항목을 정리하고 Gmail 리포트 형태로 발송하는 구조다. 흥미로웠던 점은 Skill 파일 자체도 직접 작성하지 않았다는 것이다. Claude에게 자연어로 원하는 동작을 설명하면, 이를 실행 가능한 SKILL.md 형태로 구조화해준다.

"Notion에서 지난 7일 데이터 가져와서 집계하고, 마감 임박 항목은 리마인드로 강조해서 Gmail로 보내줘."

 

이렇게 요구사항을 전달하면 Claude가 아래와 같은 Skill 명세를 만들어준다.

---
name: weekly-report
description: >
  취업 지원 현황 주간 리포트를 생성하고 Gmail로 발송하는 스킬.
  사용자가 "주간 리포트", "weekly report" 등을 요청하면 실행한다.
---

## 목적
Notion DB에서 지난 7일간의 취업 지원 데이터를 집계하고,
30일 이상 무응답 항목을 정리한 뒤 Gmail로 리포트를 발송한다.


## Notion DB 정보
(...이하 생략)

 

생성된 Skill을 설치하면 이후에는 /weekly-report 명령 한 번으로 Notion 조회부터 리포트 생성, Gmail 발송까지 전체 흐름이 실행된다. Skill을 만들면서 가장 많이 한 일은 코드를 작성하는 것이 아니라 요구사항을 다듬는 것이었다. 처음에는 "주간 리포트를 보내줘" 수준이었지만, 사용하면서 필요한 규칙을 하나씩 추가했다.

  • 마감 7일 이내 항목 리마인드
  • 서류 제출 후 30일 이상 무응답 항목 자동 처리
  • 신규 지원 / 진행 중 / 탈락 상태별 구분
  • 표시할 항목이 없는 섹션은 생략

새로운 요구사항을 설명하면 Claude가 이를 Skill 문서에 반영해 주었고, Skill도 점점 실제 사용에 맞게 발전했다. 처음에는 매주 일요일 아침에 자동으로 리포트를 보내는 스케줄 실행을 고려했다. 하지만 컴퓨터가 꺼져 있으면 실행되지 않는다는 제약이 있어, 필요할 때 /weekly-report, /monthly-report 명령으로 실행하는 온디맨드 방식으로 변경했다. 발송 과정에서는 Gmail MCP의 발송 기능이 제한적이었기 때문에, Claude in Chrome을 활용해 Gmail 작성창을 직접 열고 리포트를 입력하는 방식으로 구현했다.

구현보다 디버깅이 더 오래 걸렸다

구현 과정에서 가장 오래 고민했던 부분은 외부 서비스와의 연동 방식이었다.

1. Notion 조회 방식

처음에는 SQL 쿼리로 Notion DB를 직접 조회하려고 했다. 하지만 해당 기능이 Business 플랜 이상에서만 지원된다는 것을 뒤늦게 알게 됐다. 결국 notion-search로 항목 목록을 조회한 뒤 notion-fetch로 개별 데이터를 가져오는 방식으로 우회했다. 현재는 정상적으로 동작하지만, 데이터가 많아질수록 여러 항목을 개별 조회해야 한다는 한계가 있다.

2. Gmail 본문이 비어 있는 문제

가장 오래 헤맨 부분은 Gmail 자동 작성이었다. 처음에는 Gmail의 접근성용 textarea에 리포트 내용을 입력하면 실제 메일 본문에도 반영될 것이라고 생각했다. 하지만 발송된 메일은 계속 빈 본문으로 도착했다.

 

확인해보니 Gmail은 화면에 표시되는 리치 텍스트 에디터(contenteditable)와 접근성용 textarea를 분리해서 관리하고 있었다. textarea의 값을 변경하는 것은 화면에 보이는 값만 바꾸는 것이었고, Gmail 내부 상태에는 반영되지 않아 실제 발송 시 본문이 비어 있었던 것이다.

 

해결 방법은 값을 직접 주입하는 것이 아니라, 사용자가 직접 붙여넣기한 것처럼 입력 이벤트를 발생시키는 것이었다.

const richEditor = document.querySelector('[contenteditable="true"][aria-multiline="true"]');

if (richEditor) {
  richEditor.focus();
  const dt = new DataTransfer();
  dt.setData('text/plain', reportText);

  richEditor.dispatchEvent(new ClipboardEvent('paste', {
    bubbles: true,
    cancelable: true,
    clipboardData: dt
  }));
}

 

DataTransfer를 이용해 실제 paste 이벤트를 발생시키자 Gmail이 이를 사용자 입력으로 인식했고, 정상적으로 본문이 작성됐다.

이번 경험을 통해 DOM 요소의 값을 변경하는 것과 서비스가 실제 입력으로 인식하는 것은 다를 수 있다는 점을 알게 됐다. 자동화에서는 단순히 값을 넣는 것보다, 대상 서비스가 동작하는 방식을 이해하고 그에 맞는 이벤트를 발생시키는 것이 중요했다.

 

실제로 사용해보니

현재는 실제로 /weekly-report와 /monthly-report를 실행해 취업 지원 현황 리포트를 받아보고 있다.

실제로 클로드가 보낸 이메일

 

리포트에는 신규 지원 현황, 진행 중인 전형, 합격·탈락 여부, 확인이 필요한 일정 등이 정리되어 있다. 실제 사용 중에는 마감이 얼마 남지 않은 지원 건을 리마인드로 확인하거나, 이전에 확인하지 못했던 서류 결과를 리포트를 통해 발견하는 경우도 있었다.

 

가장 크게 달라진 점은 취업 지원 현황을 관리하는 데 드는 신경 쓰는 비용이 줄었다는 것이다.

이전에는 주기적으로 Notion DB를 열어 전체 지원 현황을 직접 확인하고, 오래 대기 중인 항목을 찾아 상태를 수정해야 했다. 이제는 리포트를 통해 현재 상황을 한 번에 확인하고, 30일 이상 무응답인 항목도 자동으로 정리되기 때문에 DB 상태를 항상 최신으로 유지할 수 있게 됐다.

 

취업 준비 과정에서 지원 자체뿐 아니라 지원 현황을 관리하는 일도 생각보다 많은 에너지를 필요로 한다는 것을 느꼈는데, 이 부분을 자동화하면서 관리에 대한 부담이 확실히 줄었다.

마무리

취업 준비 과정에서도 개발자가 문제를 해결하는 방식은 적용할 수 있다고 느꼈다. 반복적으로 발생하는 불편함을 발견하고, 필요한 기능을 정의하고, 이를 자동화된 흐름으로 바꾸는 과정은 개발 과정과 크게 다르지 않았다. 특히 이번 경험에서 중요했던 것은 Claude가 코드를 작성해주는 것이 아니라, 내가 원하는 결과를 구체적인 요구사항으로 정의하는 일이었다. "어떤 데이터를 가져올지", "어떤 상황을 리마인드할지", "예외 상황은 어떻게 처리할지"를 정리하면서 자연스럽게 서비스의 요구사항을 설계하는 경험을 할 수 있었다.