[강동7기 전Z전능 AI PM] 코멘토 청년취업사관학교 DAY 17
DAY 17 | 앱스크립트로 PM 면접 질문 데일리 메일 서비스 만들기
오늘은 실습 위주였다. 엑셀 사진 자동 삽입, 피피티 명찰 자동 생성을 먼저 훑고, 이어서 앱스크립트(Apps Script) 파트로 넘어가 사내 연락처 조회 사이트, FAQ 서비스, 구글 뉴스 웹크롤링 서비스를 차례로 실습했다. 그리고 마무리로 “나만의 앱스크립트 서비스 만들기”라는 자유 과제가 주어졌다.
왜 이 주제였나
어떤 프로젝트를 만들어볼까 고민하다가, 프론트엔드 개발자로 일할 때 사용했던 메일매일이라는 서비스가 종료되어서 아쉬웠던 차에 PM 버전으로 만들어보면 어떨까 싶어서 주제로 선정했다. 매일 아침 정해진 콘텐츠를 메일로 받아보는 컨셉을 PM/기획자 취업 준비생 관점으로 바꿔서, 면접 질문을 하루 하나씩 받아보고 그 자리에서 AI에게 답변 피드백까지 받을 수 있는 서비스를 만들어봤다.
뭘 만들었나
구글 스프레드시트를 DB 삼아 세 가지를 하나로 묶었다. 매일 아침 정해진 시간에 면접 질문을 메일로 보내주는 발송 시스템, 지금까지의 질문을 검색하고 카테고리별로 필터링해서 볼 수 있는 웹앱 아카이브, 그리고 각 질문에 대해 직접 답변을 써보면 Gemini API가 코칭 피드백을 주는 모의 면접 기능이다. 앱스크립트는 예전에 다국어 관리 시스템을 만들 때 써본 적이 있는데, 그때는 시트 데이터를 가공하는 용도였지 이렇게 웹앱까지 붙여본 적은 없었다. 시트 + 트리거 + Gmail + 웹앱 + 외부 API를 엮어서 하나의 서비스 형태로 만들 수 있다는 걸 이번에 처음 알았다.
AI에게 요청하고, PM 관점에서 리뷰하기
이번엔 코드를 직접 짜지 않고, 요구사항을 던지고 AI가 짜준 결과물을 검토하는 방식으로 진행했다. 그래서 오늘 정리하고 싶은 건 “이 코드가 어떻게 동작하는가”보다 “내가 뭘 요구했고, 나온 결과물에서 뭘 체크했는가” 쪽이다.
발송 로직 “매일 아침 면접 질문을 하나씩 이메일로 보내주는 기능”이라는 요구사항에, 구독자마다 진도가 달라야 한다는 조건을 추가로 얹었다. AI는 구독자 시트에 “마지막 발송 번호” 컬럼을 두고, 매번 그 번호보다 큰 다음 질문을 찾아 보내는 방식으로 풀어줬다. 리뷰하면서 확인한 포인트는 두 가지였다. 신규 구독자가 중간에 들어와도 1번 질문부터 순서대로 받는지, 그리고 한 명 발송이 실패했을 때 나머지 구독자 발송까지 같이 멈추지 않는지다. 코드를 보니 구독자별로 try/catch가 걸려 있어서 이 부분은 의도대로 동작한다고 판단했다. 또 “매일”이 아니라 “평일만” 보내달라는 조건도 넣었는데, 면접 준비는 습관을 만드는 게 목적이라 주말까지 알림이 오면 오히려 부담스러워서 포기하기 쉽다고 생각했기 때문이다. (추후에는 주말도 받고 싶은지 설정하는 로직도 추가하면 좋을 것 같다)
운영 데이터를 건드리지 않고 이메일 디자인만 확인해보고 싶어서 테스트용 발송 함수도 따로 요청했다. 실제 발송 함수를 그대로 돌리면 구독자 시트의 진도 번호가 올라가 데이터가 오염되기 때문에, 하드코딩된 샘플 질문으로 내 계정에만 보내는 함수를 분리해달라고 했다. 그리고 트리거 등록 함수를 실행할 때마다 트리거가 중복으로 쌓이지 않는지도 체크 리스트에 넣었는데, 새 트리거를 만들기 전에 기존 트리거를 지우도록 짜여 있어 이 부분도 안전하다고 확인했다.
아카이브 웹앱 메일은 하루 한 문제씩만 오니까, 만들면서 이전에 받았던 질문도 나중에 다시 찾아볼 수 있으면 좋겠다는 생각이 들었다. 혼자 만드는 프로젝트라 요청도 검토도 다 내 몫이었는데, 검색창, 카테고리 필터, 클릭하면 펼쳐지는 아코디언 카드 형태로 만들어달라고 AI에게 요청했고, 결과물을 볼 때는 검색어와 필터를 동시에 걸었을 때 결과가 올바르게 좁혀지는지, 결과가 없을 때 빈 화면 대신 안내 문구가 뜨는지를 중점적으로 확인했다.
AI 모의 면접 코칭 가장 신경 써서 요구사항을 정리한 부분이다. 단순히 “AI가 피드백을 준다”가 아니라, 점수·총평·잘한 점·개선할 점·코칭 한마디·개선된 답변 예시까지 구조화된 항목으로 나눠서 응답받고 싶다고 요구했다. 그래서 Gemini에게 반드시 정해진 JSON 형식으로만 답하도록 프롬프트에 명시했는데, 실제로 테스트해보니 AI가 가끔 마크다운 코드블록으로 감싸서 응답을 주는 경우가 있어 정규식으로 JSON 부분만 뽑아내는 예외 처리가 필요했다. API 키가 없을 때, API 호출 자체가 실패했을 때, 응답 파싱이 안 될 때를 각각 구분해서 에러 메시지를 다르게 보여달라는 것도 리뷰 과정에서 추가로 요청한 조건이다. 사용자 입장에서 “뭐가 잘못됐는지” 모른 채 그냥 실패 화면만 보는 걸 막고 싶었다.
화면 흐름도 답변 입력(Step1) → AI 분석 중 로딩(Step2) → 점수와 피드백(Step3) 세 단계로 나눠달라고 요구했다. 요청을 보내고 결과를 기다리는 동안 화면이 멈춘 것처럼 보이지 않게 로딩 단계를 반드시 넣어달라고 했고, 점수가 나오는 순간의 만족감을 위해 원형 그래프에 애니메이션을 넣는 것도 함께 요청했다.
오늘 느낀 것
코드를 직접 짜지 않아도, 요구사항을 얼마나 구체적으로 쪼개서 던지느냐에 따라 결과물의 완성도가 달라진다는 걸 체감했다.
취업 부트캠프 청년취업사관학교 새싹 aipm dx교육 ai교육 실무프로젝트 실무경험 취업포트폴리오 포트폴리오 전z전능 코멘토 모비니티