[260729 22일차] 프로젝트 #3

2026. 7. 30. 09:09AI 기반 프론트엔드 웹개발자 양성과정

# 포트폴리오 학습일지

[프로젝트 3일차] 컨벤션 병합 · 레포 설정
+ 기획서·WBS·요구사항·ERD 작성

2026.07.29 · 오전 팀 회의(협업 규칙 확정) + 개인 산출물(기획 문서 4종)

📋 오늘 다룬 것들

오늘 오전엔 협업 규칙을 실제로 확정했다. 1차로 병합한 CLAUDE.md를 함께 검토해 코드 컨벤션을 정하고, GitHub 레포를 백엔드/프론트로 분리하기로 했다. 오후엔 개인적으로 팀 기획서 마무리 + WBS + 요구사항 명세서 + 데이터 ERD까지 프로젝트의 뼈대 문서 4종을 작성했다. 회의로 "규칙"을 맞추고, 문서로 "설계"를 잡은 하루였다.

주간 미션
회의록 시스템기획서 제출
CLAUDE.md
1차 병합컨벤션 합의
코드 규칙
eslint-plugin-importTailwindCSS
레포 설정
BE/FE 분리
기획서
노션 템플릿공동 편집
내 산출물
WBS요구사항ERD

🗣 오전 회의 — 협업 규칙 확정

참석자 전원. 안건은 주간 미션 공유 · CLAUDE.md 병합 협의 · GitHub 레포 기본 설정 · 프로젝트 기획서 네 가지였다.

주간 미션 공유

회의록 시스템 관련 사항을 공유하고, 플러그인 개발과 기획서 제출을 완료했다.

CLAUDE.md 병합 협의

각자 만든 규칙을 1차로 병합한 CLAUDE.md를 함께 확인하고, 아래를 확정했다.

항목결정
import 정렬 도구eslint-plugin-import 사용
CSS 방법론TailwindCSS 사용 (shadcn/ui 같은 라이브러리는 미사용)
백엔드 호스팅Render vs AWS 프리티어 트레이드오프 확인 후 백엔드 담당이 결정

GitHub 레포 기본 설정

1진행 시점CLAUDE.md 업데이트 이후 레포 기본 설정 진행 (팀장 담당)
2레포 분리백엔드 레포 · 프론트엔드 레포를 분리
3CLAUDE.md 분리CLAUDE.md도 BE/FE로 나눠 각 레포에 설정

프로젝트 기획서

월 단위 기획서 제출 기한은 ~7/31. 정해진 서식이 없어, 내가 만든 노션 템플릿을 팀 공통 서식으로 쓰기로 했고, 팀원 전원이 그 페이지에서 공동 편집으로 작성하기로 했다.

📌 결정 사항 · 액션 아이템

결정 사항
import 정렬 도구 = eslint-plugin-import
CSS = TailwindCSS (shadcn/ui 등 미사용)
백엔드 호스팅 = 담당자가 트레이드오프 확인 후 결정
월 단위 기획서 = 내가 만든 노션 템플릿 사용
기획서 = 전원 노션 공동 편집으로 작성
팀원 A(BE)백엔드 호스팅(Render vs AWS) 트레이드오프 확인 후 결정
전원GitHub 레포 기본 설정(BE/FE 레포 및 CLAUDE.md 분리)
전원월 단위 기획서 노션 템플릿으로 공동 작성·제출 — 기한 2026-07-31

📝 내가 한 일 — 기획 문서 4종

오늘은 팀의 설계 뼈대를 세우는 문서들을 집중적으로 작성했다.

1기획서 마무리우리 팀 프로젝트 기획서를 마무리 (팀 공통 노션 템플릿 기반)
2WBS작업 분해 구조(Work Breakdown Structure) 문서 준비 — 할 일을 단위로 쪼개 일정·담당 정리
3요구사항 명세서기능/비기능 요구사항 정리
4ERD데이터 모델링 — 엔티티·관계 설계(ERD) 문서 작성
느낀 점 — 코드보다 문서를 더 많이 쓴 날이었지만, WBS로 "무엇을 언제 누가"를, 요구사항 명세로 "무엇을 만들지"를, ERD로 "데이터를 어떻게 담을지"를 먼저 정리해두니 앞으로의 구현이 훨씬 또렷해졌다. 특히 백엔드를 Claude로 구현할 계획이라, 이 문서들이 자세할수록 결과물 품질이 올라간다는 걸 체감했다.

🧑‍💻 오늘의 코드 리뷰 — 폼 값은 name 이 있어야 전송된다 (HTML 2일차)

2일차 코드 리뷰 주제는 "제출되는 건 name이 붙은 컨트롤의 값뿐". 로그인 폼에서 아이디·비밀번호를 다 채우고 눌러도 서버엔 빈 값이 도착하는 게 문제였다. 화면상 제출(새로고침)은 멀쩡히 일어나서 더 헷갈린다.

❌ 문제 코드 (전체)

<!DOCTYPE html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>로그인</title>
</head>
<body>
  <h1>로그인</h1>

  <form>
    <label for="userId">아이디</label>
    <input type="text" id="userId">   <!-- ❌ name 없음 → 전송 안 됨 -->

    <label for="userPw">비밀번호</label>
    <input type="password" id="userPw">  <!-- ❌ 여기도 name 없음 -->

    <button type="submit">로그인</button>
  </form>
</body>
</html>

✅ 정답 (수정 부분)

<!-- 전송이 필요한 입력마다 name 추가 → 서버가 읽는 키가 곧 이 name -->
<input type="text" id="userId" name="userId">
<input type="password" id="userPw" name="userPw">
왜 그런가 — 브라우저는 폼을 제출할 때 name 속성이 있는 컨트롤만 직렬화한다. id만 있고 name이 없으면 그 값은 제출 데이터에 안 담긴다. idlabel 연결(for)·CSS·JS 선택자용일 뿐 전송과는 무관. 그래서 "입력은 했는데 서버엔 안 온다"가 된다.

확인 방법

방법문제(name 없음)정답(name 있음)
채우고 로그인 → 주소창(URL)...? 쿼리 비어 있음...?userId=...&userPw=...
Console [...new FormData(document.querySelector('form'))][] (빈 배열)[['userId','...'],['userPw','...']]
DevTools Elementsinput에 idname="userId"·name="userPw"
FormDataname이 있는 컨트롤만 담으므로, 값이 안 실리는 직접 증거가 된다. (file://로 열면 쿼리가 안 보일 수 있어 Live Server 권장 — 콘솔 확인은 어느 쪽에서도 확실)
실무에선 이렇게 터진다 — 백엔드에서 req.query.userId/req.body.userId가 계속 undefined. 프론트는 "분명히 입력했는데" 서버는 빈 값이라 원인을 한참 못 찾는다. name 오타(user_iduserId)는 더 악질 — 렌더·제출은 되는데 서버가 기대하는 키와만 안 맞아 조용히, 에러 없이 실패한다.
같이 자주 틀리는 것 — ① id로 값이 전송된다고 착각(전송은 오직 name), ② name을 서버 기대 키와 다르게(오타·대소문자·스네이크/카멜 혼용), ③ 로그인 폼을 GET(기본값) 그대로 두기 → 비밀번호가 URL·기록에 남으므로 실무는 method="post", ④ checkbox·radio는 name이 없으면 값은커녕 그룹조차 안 묶인다.

✍️ 마치며

오늘은 "손으로 코드를 짜는" 날이 아니라 "프로젝트의 뼈대를 세우는" 날이었다. 컨벤션(eslint·Tailwind)과 레포 구조(BE/FE 분리)를 팀이 합의하고, 나는 기획서·WBS·요구사항·ERD로 설계의 밑그림을 그렸다. 규칙과 설계를 먼저 맞춰두면 나중에 각자 병렬로 달릴 때 충돌이 줄어든다는 걸 다시 느꼈다. 내일부터는 이 문서들을 기준으로 실제 구현에 들어간다.

🏷️ 포트폴리오  |  팀 프로젝트  |  CLAUDE.md  |  WBS  |  요구사항 명세  |  ERD