Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

유리의 개발새발

[VibeCoding] 05. 에러 빨리 쉽게 해결하기 본문

Experimental

[VibeCoding] 05. 에러 빨리 쉽게 해결하기

yuri_ 2026. 2. 17. 18:25
반응형

자, 오늘은 드디어 DB 세팅을 할 겁니다.

라고 말했지만, 사실 오늘 주제는 그게 아닙니다.

 

요즘 세상에 누가 DB를 직접 세팅함?

제 역할은 "기도", "욕하기" 입니다.

 

프로그래밍하다 보면 그런 순간 있죠. “분명 이렇게 말했는데…” → 전혀 다른 코드가 나와 있음

“아니… 그게 아닌데…” → 근데 또 그럴듯하게 돌아감 -> 여기서 그냥 넘어가면 나중에 더 힘들어져요.

저는 꽤 자주 겪습니다.

 

그래서 저는 “누가 뭘 망치든 내가 복구할 수 있게시스템을 짭니다.

사람도 못 믿고 AI도 못 믿고 과거의 나도 못 믿습니다.


1. DB 세팅할 때 error_log 테이블을 무조건 만들어 둡니다

저희 형들이 틀릴 수 있습니다.

나중에 서버가 터질 때 저희 형들에게 욕 하지말고 로그를 보여줍니다.

CREATE TABLE `error_logs` (
  `idx` int NOT NULL AUTO_INCREMENT,
  `subject` varchar(255) NOT NULL,
  `request_url` varchar(45) NOT NULL,
  `payload` json NOT NULL,
  `message` text NOT NULL,
  `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`idx`)
) ENGINE=InnoDB AUTO_INCREMENT=111 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='에러 로그'

 

서버 쪽 비지니스 로직 catch에서 insert 박아두세요.


2. IDE에서 DB 구조를 직접 읽을 수 있게 만들어 둡니다

DDL 맞나요? 아.무.튼 저희 형들이 읽을 수 있게 합니다.

"scripts": {
        "start": "node ./bin/www",
        "lint": "eslint .",
        "lint:fix": "eslint . --fix",
        "format": "prettier --write \"**/*.{js,json,md}\"",
        "db:schema": "mysqldump -u root -p --no-data {님들 디비명} > schema.sql"
    },

3. 프론트에서 API 호출 로그를 반드시 남깁니다

저는 보통 이런 식으로 합니다.

import axios from 'axios';
import { BASE_URL } from '@env';
import { Platform } from 'react-native';
import { useMember } from '@/stores/member';

const api = axios.create({
  baseURL: BASE_URL,
  timeout: 10000,
  withCredentials: true,
  headers: { 'Content-Type': 'application/json' },
});

api.interceptors.request.use(
  requestConfig => {
    const { member } = useMember.getState();
    if (member?.accessToken) {
      requestConfig.headers.Authorization = `Bearer ${member.accessToken}`;
    }
    requestConfig.withCredentials = true;
    return requestConfig;
  },
  error => Promise.reject(error),
);

api.interceptors.response.use(
  response => {
    if (__DEV__) {
      const method = response.config.method?.toUpperCase() ?? 'METHOD';
      const url = (response.config.baseURL ?? '') + (response.config.url ?? '');
      const icons = ['✨', '🫧', '🌈', '⭐️', '🌹', '🐱'];
      const randomIcon = icons[Math.floor(Math.random() * icons.length)];
      console.log(`[${Platform.OS.toUpperCase()}]`, method, url, randomIcon);
      console.log(response.data);
      console.log('--------------------------------------------------');
    }
    return response;
  },

  err => {
    const error = {
      status: err.response ? err.response.status : null,
      data: err.response ? err.response.data : null,
      message: err.message,
    };
    // 401 에러 시 로그아웃 (단, FCM 토큰 삭제 요청은 제외 - 무한루프 방지)
    const url = err.config?.url ?? '';
    if (error.status === 401 && !url.includes('/fcm/')) {
      const { logoutMember } = useMember.getState();
      logoutMember();
    }
    return Promise.reject(error);
  },
);

export default api;

 

 

이렇게 해두면, 어디서 터졌는지, 어떤 API였는지, 그 시점의 DB 구조가 어땠는지

이 세 가지를 저희 형들한테 바로 던져줄 수 있습니다.

 

그리고 경험상 이게 중요합니다.

“설명”하면 → 해석이 들어갑니다. “로그 + 구조 + 상황”을 주면 → 바로 디버깅 들어갑니다.

저 세 개랑 “내가 뭐 하다가 터졌는지” 이거 하나만 추가해주면 대부분 생각보다 엄청 빨리 해결됩니다.

반응형

'Experimental' 카테고리의 다른 글

[VibeCoding] 04. 웹에서 설정 시  (0) 2026.02.16
[VibeCoding] 03. 기획하기  (0) 2026.02.16
[VibeCoding] 02. 프로젝트 세팅하기  (0) 2026.02.16
[VibeCoding] 01. 바이브 코딩  (0) 2026.02.16