멘탈 헬스 파해치기 ver.4

소개

멘탈 헬스 앱을 만들어 보는 시리즈4 를 준비 하면서 어떤 내용을 적을까 생각하다가 2가지 생각이 떠올랐습니다. 제목에 "파해치기" 를 왜 넣었을까? 생각해보니 앱 스크립트 코딩을 파해치게 될것 이라는 예상하고 정한것 같습니다.

두번째 생각은 현재는 AGI 나 에이전트가 되지 않는 상황에서 AI 와 인간지능을 어떻게 활용해서 원하는 서비스를 만들까? 생각해보면 워크 프로우를 작성해서 여러가지 AI를 인간지능으로 보완해 나가는 것입니다. 이렇게 2주동안 파해치기 했던 내용을 중간 정리 해보려고 합니다.

진행 방법

사용한 툴: OpenAI ChatGPT o3 mini-high , Claude 3.7 sonnet, Google Gemini 2.5 , Google Apps Script, Linktree, 미드저니,

진행 방법은 A vs B 로 두개의 AI 모델에서 잘되는 부분을 추가로 진행 하는 방식으로 진행해보았습니다.

워크 플로우 진행 순서

1. 코딩을 잘 하는 AI 는 Sonnet 3.7 로 코딩하기

  1. 긴 코딩을 잘하는 AI 는 Gemini 2.5 로 코딩하기

  2. 코딩한 내용을 Google Apps Script 에서 웹앱 만들기

  3. 내용을 확인하고 수정하기

  4. 진행한 내용을 Linktree 로 연결하기

  5. 결과를 바탕으로 대화할 수 있는 GPTs 만들기


OpenAI 코딩 진행 내용

긴 길이의 코딩을 하기 어렵고 결과를 보면 내용을 줄여서 출력 해주는 경우가 많음

요청 내용 : 나는 Google Apps Script 로 코딩을 하고 있는데 Code.gs index.html 두개 파일로 작성하고 있어 코드를 보고 문제점과 개선점을 찾아서 수정할 부분을 알려줘 --- 현재 작동하면서 문제는 자기평가, 타인평가 저장이 되지 않아서 고민하고 있어 (Code, Index 첨부)

답변: 아래는 코드를 살펴본 후 발견한 몇 가지 문제점과 개선 제안입니다.

1. 전역 변수 사용 및 데이터 관리
문제점:
현재 자기평가 데이터는 selfData에, 타인평가 데이터는 otherData에 저장하는데, 예를 들어 자기평가 선택 시 이름과 관계 정보를 otherData에 저장하고 있습니다. (코드 예: saveSelfSelection 함수 참고 ​
)
또한, 여러 평가(자기/타인) 데이터를 전역 변수에 저장할 경우, 여러 사용자가 동시에 접속하면 데이터 충돌이나 예상치 못한 값 덮어쓰기가 발생할 수 있습니다.

개선점:

사용자별 평가 데이터를 전역 변수 대신 각 세션별(또는 클라이언트별)로 분리하거나, PropertiesService 등을 사용하여 세션 또는 사용자별로 저장하는 방법을 고려해보세요.

자기평가와 타인평가에서 이름/관계와 같은 공통 정보는 별도의 객체(예: userInfo)로 분리해 관리하면 혼동을 줄일 수 있습니다.

2. 함수 네이밍 및 역할 중복
문제점:
저장 관련 함수가 여러 가지(예: saveSelfResultToSheet, saveSelfSimplified, saveDirectToSelfSheet, saveCompletedSelfAssessment 등)로 존재하여 어느 함수가 실제로 호출되어 저장되는지 모호합니다.
또한, 타인평가도 유사하게 여러 함수가 존재합니다.

개선점:

최종 저장 시점에 호출할 단일 “submit” 함수(예: submitAssessment)를 만들어 내부에서 자기평가와 타인평가 모두를 처리하도록 합치는 것이 좋습니다.

중복된 코드(시트 생성, 헤더 설정, 마지막 행 찾기 등)는 공통 유틸리티 함수로 분리하여 코드 중복을 줄이는 방향으로 리팩토링해보세요.

<내용 생략>


5. 로그 및 에러 핸들링
문제점:
여러 저장 함수가 try-catch 문으로 감싸져 있기는 하나, 클라이언트에 반환되는 에러 메시지가 부족하여 디버깅 시 원인을 파악하기 어려울 수 있습니다.

개선점:

에러 발생 시 자세한 정보를 클라이언트로 전달하거나, Logger를 통해 충분한 정보를 남기고 이를 기반으로 UI에 피드백을 주면 문제 해결에 도움이 됩니다.

개발 단계에서는 Logger의 로그를 확인하고, 실제 사용자에게는 간단하고 이해하기 쉬운 에러 메시지를 보여주세요.

요약
데이터 관리: 전역 변수를 세션별 또는 사용자별로 분리하고, 자기평가와 타인평가의 공통 정보를 별도 객체로 관리하는 것을 고려하세요.

함수 구조 개선: 중복된 저장 함수들을 하나의 통합된 함수로 정리하고, 명확한 호출 순서를 정의하세요.

평가 순위 로직 확인: 3순위 자동 계산 로직과 selectedItems가 올바르게 설정되는지 점검하고, 불필요한 매개변수는 제거하세요.

클라이언트와의 연계: index.html의 google.script.run 호출 부분을 확인하여 실제로 올바른 함수가 호출되는지, 그리고 결과를 제대로 처리하는지 확인하세요.

에러 핸들링: 자세한 에러 메시지를 남기고 클라이언트에 반환하여 문제 발생 시 디버깅이 용이하도록 개선하세요.

이러한 개선점을 적용하면 자기평가 및 타인평가 데이터가 제대로 시트에 저장되지 않는 문제를 해결하는 데 도움이 될 것입니다.

요청: 개선 방향으로 수정되는 부분을 코드와 설명으로 알려줘

답변: 다음은 앞서 제시한 개선 방향을 반영하여 평가 저장 부분을 리팩토링한 예시입니다. 이 예제는 자기평가와 타인평가 데이터 저장 시 전역 변수 대신 사용자 정보와 평가 데이터를 별도 객체로 관리하고, 중복된 저장 로직을 하나의 통합 함수와 유틸리티 함수로 정리한 코드입니다.

1. 데이터 구조 개선 및 분리
기존에는 자기평가와 타인평가에 대한 정보가 전역 변수에 섞여 있었는데, 이를 아래와 같이 분리합니다.

// 사용자 정보 (이름, 삶의 가치 등)
let userInfo = {
  name: "",
  lifeValue: ""
};

// 자기평가 데이터
let selfData = {
  selectedItems: [],
  firstRank: [],
  secondRank: [],
  thirdRank: []  // 1순위, 2순위 선택 후 자동 계산된 나머지 항목
};

// 타인평가 데이터 (자기평가와 별개로 평가 항목만 저장)
let otherData = {
  selectedItems: [],
  firstRank: [],
  secondRank: [],
  thirdRank: []
};

2. 시트 생성/가져오기 유틸리티 함수 작성
중복되는 시트 생성 및 헤더 설정 코드를 아래와 같이 유틸리티 함수로 분리합니다.

js
복사
편집
/**
 * 주어진 시트 이름이 존재하면 반환하고, 없으면 생성하여 헤더를 설정한 후 반환합니다.
 * @param {string} sheetName - 시트 이름
 * @param {Array} headers - 헤더 배열 (첫 행에 설정)
 * @return {Sheet} 구글 스프레드시트 시트 객체
 */
function getOrCreateSheet(sheetName, headers) {
  const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
  let sheet = spreadsheet.getSheetByName(sheetName);
  if (!sheet) {
    sheet = spreadsheet.insertSheet(sheetName);
    sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
    sheet.setFrozenRows(1);
  }
  return sheet;
}
설명:

이 함수는 저장 시 매번 시트를 확인하고, 없으면 생성 및 헤더를 설정하므로 중복 코드를 줄입니다.

요청: 설명 해준 내용으로 전체 코드를 작성 할수 있어?

답변: 
1. Code.gs

// 사용자 정보 (이름, 삶의 가치 등)
let userInfo = {
  name: "",
  lifeValue: ""
};

// 자기평가 데이터
let selfData = {
  selectedItems: [],
  firstRank: [],
  secondRank: [],
  thirdRank: []  // 1순위, 2순위 선택 후 자동 계산된 나머지 항목
};

// 타인평가 데이터
let otherData = {
  selectedItems: [],
  firstRank: [],
  secondRank: [],
  thirdRank: []
};

/* ========== 유틸리티 함수 ========== */
/**
 * 지정한 시트 이름이 존재하면 반환하고, 없으면 생성하여 헤더를 설정한 후 반환합니다.
 * @param {string} sheetName - 시트 이름
 * @param {Array} headers - 첫 행에 설정할 헤더 배열
 * @return {Sheet} 구글 스프레드시트 시트 객체
 */
function getOrCreateSheet(sheetName, headers) {
  const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
  let sheet = spreadsheet.getSheetByName(sheetName);
  if (!sheet) {
    sheet = spreadsheet.insertSheet(sheetName);
    sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
    sheet.setFrozenRows(1);
  }
  return sheet;
}

/* ========== 점수 계산 함수 ========== */
function calculateSelfScore(firstRank, secondRank, thirdRank) {
  const weights = getSelfTraitWeights();
  const scoreKeys = ['realist', 'romantic', 'humanist', 'idealist', 'agent'];
  return calculateScore(firstRank, secondRank, thirdRank, weights, scoreKeys);
}

function calculateOtherScore(firstRank, secondRank, thirdRank) {
  const weights = getOtherTraitWeights();
  const scoreKeys = ['relationship', 'trust', 'manual', 'self', 'enjoyment'];
  return calculateScore(firstRank, secondRank, thirdRank, weights, scoreKeys);
}

function calculateScore(firstRank, secondRank, thirdRank, weights, scoreKeys) {
  const scores = {};
  scoreKeys.forEach(key => scores[key] = 0);
  
  // 1순위 항목 (가중치 7)
  firstRank.forEach(idx => {
    const weight = weights[idx];
    if (weight) {
      scoreKeys.forEach(key => {
        scores[key] += (weight[key] || 0) * 7;
      });
    }
  });
  // 2순위 항목 (가중치 5)
  secondRank.forEach(idx => {
    const weight = weights[idx];
    if (weight) {
      scoreKeys.forEach(key => {
        scores[key] += (weight[key] || 0) * 5;
      });
    }
  });
  // 3순위 항목 (가중치 3)
  thirdRank.forEach(idx => {
    const weight = weights[idx];
    if (weight) {
      scoreKeys.forEach(key => {
        scores[key] += (weight[key] || 0) * 3;
      });
    }
  });
  return scores;
}

/**
 * 자기평가 문항별 가중치 배열 예시
 * 실제 문항 수에 맞게 배열 요소를 추가하거나 수정하세요.
 */
function getSelfTraitWeights() {
  return [
    {realist: 2, romantic: 0, humanist: 0, idealist: 0, agent: 0},      
    {realist: 0, romantic: 2.5, humanist: 0, idealist: 0, agent: 0},    
    {realist: 0, romantic: 0, humanist: 2.5, idealist: 0, agent: 0},    
    {realist: 0, romantic: 0, humanist: 0, idealist: 2, agent: 0},
    {realist: 0, romantic: 0, humanist: 0, idealist: 0, agent: 1.5}
    // 추가 문항 및 가중치...
  ];
}

/**
 * 타인평가 문항별 가중치 배열 예시
 * 실제 문항 수에 맞게 배열 요소를 추가하거나 수정하세요.
 */
function getOtherTraitWeights() {
  return [
    {relationship: 2.5, trust: 0, manual: 0, self: 0, enjoyment: 0},
    {relationship: 0, trust: 1, manual: 0, self: 0, enjoyment: 0},
    {relationship: 0, trust: 0, manual: 2, self: 0, enjoyment: 0},
    {relationship: 0, trust: 0, manual: 0, self: 2, enjoyment: 0},
    {relationship: 0, trust: 0, manual: 0, self: 0, enjoyment: 2}
    // 추가 문항 및 가중치...
  ];
}

/* ========== 평가 저장 함수 ========== */
/**
 * 자기평가와 타인평가 데이터를 통합하여 스프레드시트에 저장합니다.
 */
function submitAssessment() {
  try {
    // 평가 데이터 유효성 검사
    if (!selfData.firstRank || selfData.firstRank.length === 0) {
      throw new Error("자기평가 1순위 데이터가 없습니다.");
    }
    if (!otherData.firstRank || otherData.firstRank.length === 0) {
      throw new Error("타인평가 1순위 데이터가 없습니다.");
    }
    
    // 점수 계산
    const selfScores = calculateSelfScore(selfData.firstRank, selfData.secondRank, selfData.thirdRank);
    const otherScores = calculateOtherScore(otherData.firstRank, otherData.secondRank, otherData.thirdRank);
    
    // --- 자기평가 저장 ---
    const selfHeaders = [
      '날짜/시간', '이름', '삶의 가치', '선택한 항목', '1순위', '2순위', '3순위',
      '리얼리스트', '로맨티스트', '휴머니스트', '아이디얼리스트', '에이전트'
    ];
    const selfSheet = getOrCreateSheet("자기평가", selfHeaders);
    let lastRow = selfSheet.getLastRow() + 1;
    selfSheet.getRange(lastRow, 1, 1, selfHeaders.length).setValues([[
      new Date(),
      userInfo.name || "이름 없음",
      userInfo.lifeValue || "삶의 가치 미정",
      selfData.selectedItems.join(', '),
      selfData.firstRank.join(', '),
      selfData.secondRank.join(', '),
      selfData.thirdRank.join(', '),
      selfScores.realist,
      selfScores.romantic,
      selfScores.humanist,
      selfScores.idealist,
      selfScores.agent
    ]]);
    
    // --- 타인평가 저장 ---
    const otherHeaders = [
      '날짜/시간', '이름', '삶의 가치', '선택한 항목', '1순위', '2순위', '3순위',
      '관계', '믿음', '매뉴얼', '셀프', '향유'
    ];
    const otherSheet = getOrCreateSheet("타인평가", otherHeaders);
    lastRow = otherSheet.getLastRow() + 1;
    otherSheet.getRange(lastRow, 1, 1, otherHeaders.length).setValues([[
      new Date(),
      userInfo.name || "이름 없음",
      userInfo.lifeValue || "삶의 가치 미정",
      otherData.selectedItems.join(', '),
      otherData.firstRank.join(', '),
      otherData.secondRank.join(', '),
      otherData.thirdRank.join(', '),
      otherScores.relationship,
      otherScores.trust,
      otherScores.manual,
      otherScores.self,
      otherScores.enjoyment
    ]]);
    
    Logger.log("평가 저장이 성공적으로 완료되었습니다.");
    return { success: true };
  } catch (error) {
    Logger.log("submitAssessment 에러: " + error);
    return { success: false, error: error.toString() };
  }
}

/* ========== 기본 웹 앱 함수 ========== */
function doGet() {
  return HtmlService.createHtmlOutputFromFile('index')
    .setTitle('일상의 성향 체크')
    .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}

2. index.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>일상의 성향 체크</title>
  <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
  <script>
    // 평가 제출 버튼 클릭 시 호출되는 함수
    function submitEvaluation() {
      google.script.run
        .withSuccessHandler(function(response) {
          if(response.success) {
            alert("평가가 성공적으로 저장되었습니다.");
          } else {
            alert("저장 중 오류 발생: " + response.error);
          }
        })
        .submitAssessment();
    }
  </script>
  <style>
    /* 간단한 기본 스타일 (원하는 대로 수정하세요) */
    .container {
      max-width: 800px;
      margin: 0 auto;
      padding: 30px;
      background-color: #fff;
      border-radius: 12px;
      margin-top: 40px;
      text-align: center;
    }
    button {
      padding: 12px 24px;
      font-size: 16px;
      border: none;
      border-radius: 30px;
      background-color: #2196F3;
      color: #fff;
      cursor: pointer;
      transition: background-color 0.3s ease;
    }
    button:hover {
      background-color: #0d8aee;
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>일상의 성향 체크</h1>
    <!-- 평가 폼 및 질문 항목들을 여기에 배치하세요 -->
    <button onclick="submitEvaluation()">평가 제출</button>
  </div>
</body>
</html>

클로드 코딩 내용 부분 수정 수행 과정

요청: 문서는 Google Apps Script 에서 자기평가와 타인평가를 해서 Google Sheet 에 저장 하는 내용으로 진행 하려고 하는데 마지막 결과 페이지에서 에러가 발생 하는데 에러를 수정해줘
(Code, index 첨부) 

답변: Google Apps Script로 작성된 자기평가/타인평가 앱의 최종 결과 페이지에서 발생하는 오류를 해결해드리겠습니다. 코드를 분석한 결과, 문제가 발생할 수 있는 몇 가지 부분을 찾았습니다.
가장 가능성이 높은 오류 원인들은 다음과 같습니다:

displayConfirmationPage 함수에서 변수 참조 문제
HTML 주석 처리가 잘못됨 (/* */ 대신 JSX 스타일 {/* */} 사용)
에러 메시지 처리 부분에 오류
마지막 단계에서 인덱스 관련 문제

아래는 수정된 코드입니다:

코드를 분석해보니 결과 페이지에서 발생하는 오류의 주요 원인들을 찾았습니다. 다음과 같은 문제점들을 수정했습니다:

HTML 주석 문제:

JavaScript에서는 JSX 스타일의 주석 {/* */}가 아닌 HTML 주석 <!-- -->을 사용해야 합니다.
원본 코드의 {/* Optional: <i class="fas fa-check-circle"></i> */} 같은 주석들이 JavaScript에서는 유효하지 않습니다.


에러 메시지 처리 문제:

에러 메시지가 문자열이 아닌 객체로 전달될 경우 안전하게 처리하도록 개선했습니다.
safeErrorMessage 생성 로직을 더 견고하게 수정했습니다.


HTML 구조 문제:

confirmation-summary-container 클래스의 HTML 주석 {/* Flex container */}도 유효하지 않아 제거했습니다.


기타 마크업 문제:

버튼 영역의 주석 {/* 버튼 텍스트 수정 */}도 제거했습니다.



이 수정을 적용하면 결과 페이지가 올바르게 표시되어야 합니다. 함수를 페이지의 스크립트 부분에 교체하여 적용해보세요. 만약 다른 오류가 발생한다면 해당 오류 메시지를 공유해주시면 추가적인 도움을 드릴 수 있습니다.

요청: 수정한 코드를 사용하면 로딩에서 멈춰 있는데

답변: 로딩 화면에서 멈추는 문제가 있다니 추가 분석이 필요합니다. 이번에는 전체적인 흐름 관점에서 문제를 살펴보겠습니다.
로딩 화면에서 멈추는 현상은 주로 다음과 같은 이유로 발생할 수 있습니다:

서버 호출이 완료되지 않음
서버 응답 후 다음 단계로 진행되지 않음
JavaScript 오류가 콘솔에 발생하지만 표시되지 않음

가장 가능성이 높은 부분은 submitFinalData() 함수와 그 콜백인 onFinalSaveSuccess(), onFinalSaveFailure() 함수입니다. 이 전체 흐름을 개선해보겠습니다:수정된 저장 및 결과 흐름 처리 함수코드 // 타인평가 2순위 완료 후 호출될 함수
function submitFinalData() {
    scrollToTop();
    currentStep = 8; // 마지막 단계
    updateProgress(currentStep);

    const container = document.getElementById('mainContainer');
    container.innerHTML = `
        <div class="s로딩 화면에서 멈추는 문제는 서버 통신이나 응답 처리 과정에서 발생하는 오류 때문일 가능성이 높습니다. 위에서 제공한 수정된 코드는 다음과 같은 개선 사항을 포함합니다:
주요 수정 사항:

강화된 오류 처리 및 로깅:

모든 함수에 광범위한 try-catch 블록 추가
상세한 로그 추가로 어떤 단계에서 문제가 발생하는지 추적 가능
각 단계마다 상태 업데이트 메시지 추가


데이터 유효성 검사 강화:

null/undefined 값에 대한 안전한 처리
객체 접근 시 옵셔널 체이닝(?) 사용
타입 검사 및 변환 로직 개선


서버 통신 코드 강화:

google.script.run 호출을 try-catch로 감싸서 예외 처리
콜백 함수를 인라인으로 정의하여 컨텍스트 문제 방지
서버 응답 처리 로직 단순화


UI 렌더링 안정성 개선:

DOM 요소 존재 여부 확인
템플릿 문자열 생성에서 오류가 발생하면 대체 메시지 표시
치명적 오류 발생 시 alert()로 사용자에게 알림



적용 방법:

제공된 코드를 index.html 파일의 script 태그 내에 있는 기존 함수들을 대체하여 사용하세요.
기존 submitFinalData, onFinalSaveSuccess, onFinalSaveFailure, displayConfirmationPage 함수를 모두 새 버전으로 바꿔주세요.

이렇게 수정하면 로딩 화면에서 멈추는 문제가 해결될 가능성이 높습니다. 이 수정을 적용한 후에도 문제가 계속된다면 브라우저 콘솔에서 오류 메시지를 확인하고 공유해주시면 추가적인 도움을 드릴 수 있습니다.

재미니 코딩

요청: 파일이 저장이 안되는 것을 디버깅 해줘 (Code, index 첨부)
답변: Okay, let's debug the saving issue. Based on the code provided (which removes score calculation/display and aims to save only ranks), here's a breakdown of potential problems and how to fix them:

Potential Causes for Saving Failure:

Permissions: The script might lack permission to write to the specified Google Sheet (SPREADSHEET_ID). This is common if the script is new, deployed with insufficient scopes, or if authorization wasn't completed correctly by the user running the web app.

Incorrect SPREADSHEET_ID: The ID 1a3fXkQhsx5-8j9OOBrtYoToL0wR5SsWNGP7gePVWoA0 might be wrong or point to a sheet the script owner/user doesn't have edit access to.

Sheet Name Mismatch: The code looks for a sheet named exactly "종합결과". A typo or different name in the actual spreadsheet will cause getSheetByName to return null, potentially leading to errors if not handled gracefully (though the current code does handle creation).

Server-Side Script Errors: An unexpected error could occur within the saveFinalRankData function before it successfully writes the data (e.g., issues with SpreadsheetApp.openById, accessing ranks from the passed objects if they are malformed).

Data Validation Failure: Although there's validation, malformed data could potentially still be sent from the client if the client-side validation itself has a bug. The server-side validation should catch standard length issues.

Concurrency/Locking (Less Likely): If multiple users submit simultaneously, very rarely, sheet locking issues could occur, but it's less probable for simple row appends.

Client-Side Errors: An error in the JavaScript before google.script.run.saveFinalRankData is called, or within the success/failure handlers, could prevent the save or the confirmation display.

Debugging Steps & Code Corrections:

Let's refine the code, focusing on robustness, clearer logging, and improved error handling, especially around the saving process.

Step 1: Enhance Server-Side Logging and Validation (Code.gs)

Add more detailed logging inside saveFinalRankData to pinpoint where it might fail.

// Code.gs (Modifications within saveFinalRankData)

function saveFinalRankData(name, lifeValue, selfRanks, otherRanks) {
  // Add entry log immediately
  Logger.log(`--- saveFinalRankData START ---`);
  Logger.log(`Received Name: ${name}, Value: ${lifeValue}`);
  // Use JSON.stringify for potentially complex objects in logs
  Logger.log(`Received Self Ranks: ${JSON.stringify(selfRanks)}`);
  Logger.log(`Received Other Ranks: ${JSON.stringify(otherRanks)}`); 
<내용 생략>

Step 2: Enhance Client-Side Logging and Error Handling (index.html)

Add logs and refine the confirmation page to show detailed errors.

<!-- index.html Modifications -->
<script>
    // ... (Keep variables, initialization, UI flow functions) ...

    function processSecondRank() {
        console.log("processSecondRank 함수 호출됨, 현재 mode:", testMode);
        const secondRankArray = (testMode === "self") ? selfSecondRank : otherSecondRank;
        console.log("Second rank array:", secondRankArray);
        console.log("Current step:", currentStep);

        if (secondRankArray.length !== 4) {
            alert("정확히 4개 항목을 선택해주세요.");
            return;
        }
        console.log(`${testMode} assessment rank 2 selected:`, secondRankArray);
<내용 생략>

Google Apps Script 에서 코드를 수정해서 테스트 배포를 해서 수정 내용 확인하기

Code.gs 코딩 내용

코드 편집기의 스크린 샷

index.html 코딩 내용

프로그래밍 언어를 보여주는 웹 페이지의 스크린 샷

OpenAI O3 mini-high 코딩하는 과정에서 출력 코드 길이가 한계가 있고 내용을 생략 하는 경우가 있어서 진행의 어려움이 있습니다.

클로드 3.7 sonnet 코딩을 하면서 처음에 코드 전체를 출력 하는것도 잘되고 부분적으로 수정 하는것도 잘 진행 됩니다. 수정을 여러차례 하다보면 길이가 길어져서 새로운 창으로 코딩을 해야 하는 경우가 있습니다. 부분적으로 수정 하다보면 전체적인 일관성이 안되는 부분이 있습니다.

Gemini 2.5 코딩을 하면서 대화 길이가 길어서 한번에 요청 내용이 반영되어 일관성 있게 코드를 작성해줍니다. 수정이 필요한 부분을 요청해서 바꾸는 경우에는 내용이 길어지면 이해하고 수정의 어려움이 있습니다.

작성된 코드를 Apps Script 에서 확인하고 변경이 필요한 부분을 클로드로 수정하고 확인하고, 수정하고 확인하는 과정을 반복해서 파해치기 과정을 2주 동안 했습니다.

그렇게 만들어본 체크 리스트를 링크트리에 모았습니다.

https://linktr.ee/CloudMind5

클라우드 마인드 - 스크린 샷

현재는 체크한 내용을 보여주고 Google Sheet 에 저장하는 과정까지 진행 되었습니다.

다음에는 결과를 GPTs 로 분석해서 대화 하는 챗봇을 만들어 보려고 합니다.

결과와 배운 점

AI 를 활용해서 코딩 하는 과정에서 가능한 부분과 안되는 부분을 해결 하기 위해서 다른 AI 를 사용해서 진행하는 과정에서 코드의 의미를 알게 되고 이렇게 코딩을 배우게 되었습니다.

코드를 짜는 능력보다 코드를 보는 능력이 중요합니다.

AI 로 코딩을 할때 전체적인 구조를 보고 순서를 바꿔서 코딩하는 것은 AI로 하기 어려운 부분이라 진행하면서 관리가 필요한 부분이 있습니다. 예를 들어서 중간에 저장 해서 에러가 발생하는 코드를 작성했다가 마지막에 저장하도록 수정 하는 경우가 있습니다.

AI로 코딩을 자동으로 한다고 해도 생각을 해서 구조를 바꿔야 경우 문제를 확인하고 전체적은 흐름과 맥락을 알고 있어야 합니다.

AI을 사용해서 코딩을 어떻게 하는지 조금 경험하게 되었습니다.

다음에는 멘탈 케어 내용으로 작성 하려고 합니다.

도움 받은 글

https://www.gpters.org/nocode/post/created-my-own-ai-ZYAKxP1DtzD2zdi

https://www.gpters.org/marketing/post/game-type-psychological-test-QXis1BJK7t8aHAP

3
2개의 답글

👉 이 게시글도 읽어보세요