TuBrief
구독 채널
비디오
커뮤니티

스타트업에서 혼자 일하는 주니어 개발자가 야근 없이 스프린트 마치는 기준

TuBrief 편집팀
2026년 8월 22일
0
정신 건강

원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.

한국어العربيةPortuguêsEnglishहिन्दीРусскийEspañolDeutschBahasa Indonesia中文Français日本語

관련 영상

완벽해지려는 노력을 멈추세요43:49

완벽해지려는 노력을 멈추세요

Dr. Arthur Brooks

커뮤니티의 다른 글

영업 미팅에서 고객이 동의한다고 말할 때 진짜 속마음 읽어내는 법

2026년 8월 24일

재택 디자이너가 외출할 때 사람 목소리와 인파에 급격히 지치는 이유

2026년 8월 24일

4 Ways to Get Better at Friendship

2026년 8월 23일

영업 미팅에서 고객 방어벽을 뚫는 대화법

2026년 8월 23일

출입증 뒤의 메모 한 줄이 첫 미팅의 침묵을 깬다

2026년 8월 23일

휴가 때 슬랙 지우고 온콜 넘기기 위한 백엔드 인수인계 절차

2026년 8월 22일

댓글 (0)

Log in to leave a comment

아직 작성된 글이 없습니다

© 2026 . All rights reserved.

TuBrief
구독 채널
비디오
커뮤니티
로그인

스타트업에서 혼자 일하는 주니어 개발자가 야근 없이 스프린트 마치는 기준

사수 없이 혼자 프론트엔드를 개발하다 보면 기술적 불안감에 쫓깁니다. 클린 코드 책을 옆에 두고 완벽한 추상화를 고민하다가 결국 스프린트 마감 직전에 번아웃을 겪는 패턴이 반복됩니다. 필요한 것은 무결한 아키텍처가 아니라 제시간에 동작하는 제품을 내보내는 현실적인 기준입니다.

잘못된 추상화가 코드 중복보다 비싸다

소프트웨어 설계 전문가 샌디 메츠는 잘못된 추상화를 걷어내는 비용이 중복 코드를 유지하는 비용보다 훨씬 크다고 지적합니다. 실제로 댄 아브라모프도 무리한 중복 제거가 컴포넌트의 유연성을 망친다고 경고했습니다.

단순한 코드 복사로 생긴 문제는 해당 파일 안에서 50분 내외로 고칠 수 있습니다. 반면 성급하게 만든 공통 훅이나 상속 구조는 요구사항이 조금만 바뀌어도 수많은 if-else 분기를 만들어냅니다. 결국 버그를 찾는 데만 2주 이상 걸립니다.

리팩토링 여부는 마틴 파울러의 기술 부채 사분면과 아담 돈힐의 핫스팟 분석을 기준으로 결정합니다.

영역 기준 (복잡도와 변경 빈도) 대응 방식
즉시 수정 비즈니스 영향 높음 × 변경 빈도 높음 기능 구현 직후 테스트 작성과 인터페이스 정리 후 배포
선택적 수정 비즈니스 영향 높음 × 변경 빈도 낮음 백로그에 부채 티켓으로 등록
일단 배포 비즈니스 영향 낮음 × 변경 빈도 높음 최소 동작만 검증하고 배포, 추상화 금지
작업 보류 비즈니스 영향 낮음 × 변경 빈도 낮음 코드가 지저분해도 수정 생략

코드 분류 작업 순서

  1. 지금 작업하는 컴포넌트가 결제나 인증 같은 핵심 로직(핫스팟)인지 단순 프로모션 뷰인지 확인합니다.
  2. 프로모션 뷰라면 공통 커스텀 훅을 설계하지 않고 컴포넌트 내부에 인라인으로 작성합니다.
  3. 동일한 UI 동작이 3회 이상 반복되기 전까지는 코드를 복사해서 붙여넣습니다.

이 기준을 적용하면 불필요한 공통화 작업에 쏟는 시간을 줄여 전체 개발 속도를 끌어올릴 수 있습니다.

코드 리뷰 지적을 줄이는 정적 검사 설정

변수명, 줄 바꿈, 린트 규칙 위반 같은 스타일 지적은 도구로 걸러내야 합니다.

스마트베어가 시스코 시스템즈의 코드 리뷰 2,500건을 분석한 연구에 따르면, 한 번에 검토하는 코드 분량이 200줄 미만일 때 결함의 70%에서 90%가 발견됩니다. 작성자가 PR에 변경 이유를 직접 코멘트로 남기면 결함 밀도가 평균 30% 줄어듭니다.

정적 분석과 셀프 검수 순서

  1. ESLint 9 Flat Config에 React와 TypeScript 규칙을 등록합니다.
  2. Husky와 lint-staged를 연동해 커밋 시점에 포맷팅 검사를 강제합니다.
  3. PR을 올리기 전 순수 로직 기준 300줄 이내인지 확인하고, 복잡한 분기문에 셀프 리뷰 코멘트를 남깁니다.
// eslint.config.js
import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import pluginReact from "eslint-plugin-react";
import pluginReactHooks from "eslint-plugin-react-hooks";
import eslintConfigPrettier from "eslint-config-prettier/flat";

export default tseslint.config(
  { ignores: ["dist/", "node_modules/", "build/"] },
  js.configs.recommended,
  ...tseslint.configs.recommended,
  pluginReact.configs.flat.recommended,
  eslintConfigPrettier,
  {
    files: ["**/*.{js,jsx,ts,tsx}"],
    languageOptions: {
      ecmaVersion: "latest",
      sourceType: "module",
      globals: globals.browser,
    },
    plugins: {
      "react-hooks": pluginReactHooks,
    },
    rules: {
      "react/react-in-jsx-scope": "off",
      "react/prop-types": "off",
      "react-hooks/rules-of-hooks": "error",
      "react-hooks/exhaustive-deps": "warn",
      "@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
      "@typescript-eslint/no-explicit-any": "warn",
    },
    settings: {
      react: { version: "detect" },
    },
  }
);

이 설정을 저장소에 적용하면 스타일 관련 리뷰 피드백을 줄이고 실제 로직 검증에 집중할 수 있습니다.

구현과 정리를 분리하는 타임박싱

기능을 개발하면서 동시에 구조를 뜯어고치면 작업 맥락이 흐트러집니다. 구글의 엔지니어링 연구에 따르면 PR 단위를 작게 쪼개고 작업 의도를 명시했을 때 코드 리뷰 대기 시간이 48시간에서 4시간으로 줄어듭니다.

하루 작업 시간을 세션으로 나눠 통제합니다.

  • 일과의 70%는 기능 구현에 씁니다. 화면 요구사항과 데이터 흐름이 정상 작동하는 데 집중하며 중복 코드를 허용합니다.
  • 일과의 20%는 코드를 정리합니다. 스코프 내 변수명 수정, 안 쓰는 import 정리, 타입 보완만 처리하며 큰 구조 개편은 건드리지 않습니다.
  • 주간 업무 시간의 10%는 금요일 오후에 부채 정산 세션으로 배정합니다. 배포를 마친 뒤 백로그에 등록한 핫스팟 모듈의 구조를 개선합니다.

결함 허용 범위를 명시하는 PR 템플릿

  1. PR 본문에 허용된 기술 부채 항목을 작성합니다.
  2. 기능 동작에 이상이 없으나 리팩토링을 미룬 영역을 체크리스트로 남깁니다.
  3. 해당 항목을 금요일 정산 세션 티켓으로 등록한 뒤 PR을 제출합니다.
## 개요
- 작업 내용: 유저 프로필 수정 및 API 연동
- 관련 이슈: #104

## 결함 허용 및 등록된 부채
- [x] 허용된 부채: 프로필 컴포넌트 내 스타일 로직 중복 (3회 미만 중복)
- [x] 허용된 부채: 에러 응답 시 alert 처리 (Toast 컴포넌트 연동 미룸)
- [ ] 필수 리뷰 대상: 런타임 오류 및 비즈니스 데이터 처리 로직

리뷰어가 부차적인 스타일 대신 핵심 로직에만 피드백을 집중하도록 유도해 승인 시간을 단축합니다.

사이드 이펙트를 줄이는 점진적 배포

기존 코드를 통째로 다시 작성하면 운영 환경에서 장애가 발생할 위험이 커집니다. 마이클 페더스는 레거시 코드를 수정할 때 전체 구조를 바꾸기보다 현재 입출력 동작을 고정하는 특성화 테스트를 먼저 작성해야 한다고 조언합니다.

런타임 오류가 발생했을 때 화면 전체가 하얗게 멈추는 현상을 막기 위해 에러 경계(ErrorBoundary)를 설정합니다.

// components/ErrorBoundary.tsx
import React, { Component, ErrorInfo, ReactNode } from "react";
import * as Sentry from "@sentry/react";

interface Props {
  children: ReactNode;
  fallbackUI?: ReactNode;
}

interface State {
  hasError: boolean;
}

export class GlobalErrorBoundary extends Component<Props, State> {
  public state: State = { hasError: false };

  public static getDerivedStateFromError(_: Error): State {
    return { hasError: true };
  }

  public componentDidCatch(error: Error, errorInfo: ErrorInfo) {
    Sentry.captureException(error, { extra: { componentStack: errorInfo.componentStack } });
  }

  public render() {
    if (this.state.hasError) {
      return (
        this.props.fallbackUI || (
          <div className="p-4 border border-red-200 rounded-md bg-red-50 text-red-700">
            <h3 className="font-bold">UI 로딩 중 오류가 발생했습니다.</h3>
            <p className="text-sm">새로고침을 하거나 잠시 후 다시 시도해 주세요.</p>
          </div>
        )
      );
    }
    return this.props.children;
  }
}

점진적 배포 절차

  1. 레거시 로직을 손대기 전에 현재 반환값을 검증하는 테스트를 붙이고 파사드 계층으로 인터페이스를 감쌉니다.
  2. 프리뷰 배포 환경에서 API 통신 상태를 확인하고, 신규 기능은 기능 플래그(Feature Flag)로 소수 사용자에게 먼저 엽니다.
  3. 배포 후 Sentry 모니터링에서 오류율이 5%를 넘기면 즉시 롤백 명령어를 실행합니다.
git revert HEAD --no-edit
git push origin main

작업 단위를 작게 나누고 실패 시 돌아갈 수 있는 환경을 만들면 코드 수정에 대한 불안감을 통제할 수 있습니다. 완벽한 구조 대신 동작하는 시스템을 제시간에 전달하는 것이 실무 엔지니어링의 기본입니다.