2026. 7. 31. 08:53ㆍAI 기반 프론트엔드 웹개발자 양성과정

[프로젝트 4일차] 와이어프레임·디자인 시스템
+ Git 머지 정책 · 산출물 범위 확정
2026.07.30 · 개인 작업(디자인) + 오전·오후 팀 회의(산출물 범위·머지 정책)
📋 오늘 다룬 것들
오늘은 개인적으로 와이어프레임·디자인 시스템·컴포넌트 같은 화면 기반을 잡았고, 팀 회의에선 1주차 기획 산출물 범위와 코드 작성 시작일(8/3)을 확정했다. 오후엔 Git 머지 정책(Rebase vs Squash)과 PR 템플릿을 논의했는데, 머지 전략 용어가 헷갈려서 이참에 개념을 정리했다.
🎨 내가 한 일 — 화면 기반 잡기
🗣 오전 회의 — 산출물 범위 & 일정
기획 산출물을 어디까지 이번 주에 낼지 확정했다.
| 구분 | 내용 |
|---|---|
| 1주차 산출물 | 기획서 · 요구사항 명세서 · ERD · API 명세 초안까지 마무리 |
| 2주차로 이월 | 화면 목록 · 와이어프레임 · 디자인 작업 |
| 작업 방식 | 기존과 동일하게 전원 공동 작업(각 문서 꼼꼼히 확인) |
| 실제 코드 시작 | 기획서 기준대로 8/3(월)부터 |
🔀 오후 회의 — Git 머지 정책 & PR 템플릿
브랜치·PR은 정했는데, PR을 대상 브랜치에 어떻게 합칠지(머지 방식)가 남아 논의했다. 팀 안에서 "머지 커밋을 남기자", "요즘은 Squash가 일반적이다" 등 의견이 오갔고, Claude·GPT로 각 방식을 확인했다.
📚 개념 정리 — Merge 방식 3가지 (Merge / Squash / Rebase)
PR을 dev에 합칠 때 이력을 어떻게 남기느냐가 세 방식의 차이다. 결과 코드는 같지만 커밋 기록의 모양이 달라진다.
| 방식 | 대상 브랜치에 남는 이력 | 특징 |
|---|---|---|
| Merge commit (Create a merge commit) | feature 커밋 전부 + 병합 커밋 1개 | 브랜치가 갈라졌다 합쳐진 모양이 그대로 보임. 이력이 풍부하지만 지저분해질 수 있음 |
| Squash and merge | PR의 여러 커밋을 합쳐서 커밋 1개 | 이력이 아주 깔끔(PR=커밋 1개). 대신 개별 커밋과 커밋 컨벤션은 사라짐 |
| Rebase and merge | feature 커밋들을 병합 커밋 없이 하나씩 재배치 | 선형(직선) 이력 + 커밋 개수·메시지 그대로 유지. 커밋 컨벤션이 살아있음 |
# 같은 PR(feature/login: 커밋 3개)을 dev에 합칠 때 # ① Merge commit dev: ...─ Merge pull request #12 # 병합 커밋 + feature 3커밋 다 남음 # ② Squash and merge dev: ...─ feat(auth): 로그인 기능 추가 # 3커밋 → 1커밋으로 합쳐짐 # ③ Rebase and merge dev: ...─ WIP1 ─ WIP2 ─ 수정3 # 병합 커밋 없이 선형으로 그대로 얹힘
feature → dev PR, dev에 PR 없이 반영 금지·CI 필수·리뷰 1명 이상·직접 push 금지)🧾 주간 미니 프로젝트 — 회의록 시스템
🧑💻 오늘의 코드 리뷰 — 접었다 펴는 UI는 div가 아니라 details/summary다 (HTML 3일차)
브라우저에는 이미 "접었다 펴는" 위젯이 들어 있다. div로 흉내 내면 JS를 붙여야 하고, 붙여도 키보드·스크린리더는 그냥 빠진다.
❌ 문제 코드 (전체)
<!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> <p>오늘 수업은 3시에 시작합니다.</p> <!-- ▼ 를 손으로 찍어 놓고 접힘은 아직 안 만든 상태 --> <div>▼ 더보기</div> <p>준비물: 노트북, 충전기. 지각 시 문자 주세요.</p> </body> </html>
Tab 키로 그 자리에 도달하지도 못한다. 여기서 "JS를 아직 안 붙였을 뿐이잖아" 하고 넘어가면 안 된다 — 그 생각 자체가 이 문제의 핵심이다. ▼를 손으로 찍고 접힘을 JS로 채우겠다고 마음먹은 순간, 브라우저가 공짜로 주는 태그를 두고 직접 만들기 시작한 것이다.✅ 정답 (수정 부분)
<!-- 접었다 펴는 건 details/summary 다 --> <details> <summary>더보기</summary> <p>준비물: 노트북, 충전기. 지각 시 문자 주세요.</p> </details>
div는 "그냥 상자"라서 ▼는 글자일 뿐이고 접힘 동작은 어디에도 없다. 반면 details/summary는 브라우저가 세 가지를 공짜로 준다: ① 펼침/접힘 상태(open 속성이 알아서 켜졌다 꺼짐), ② 키보드 포커스(Tab 도달) + Enter/Space로 열고 닫기, ③ 스크린리더가 "접힌 항목"이라고 읽어줌(role). summary는 항상 details의 첫 자식이고 나머지가 접히는 내용이 된다. ▼도 직접 쓰지 않는다 — 브라우저가 삼각형을 그리고 방향까지 뒤집어 준다. 처음부터 펼쳐 두려면 <details open>. JS는 한 줄도 필요 없다.🔍 확인 방법
| 방법 | ❌ 문제(div) | ✅ 정답(details) |
|---|---|---|
눌러보고 Tab으로도 눌러보기 | 클릭해도 안 접힘, Tab 포커스도 안 감, 내용 계속 보임 | 처음엔 접힘 → 클릭/Enter/Space로 열고 닫힘 |
Console: 키보드로 닿는 요소 세기$$('a[href],button,input,summary,[tabindex]').length | 0 (키보드 사용자에겐 조작할 게 없음) | 1 (summary가 잡힘) |
| DevTools → Accessibility → Role | generic (그냥 글자 상자) | summary=DisclosureTriangle, details=group |
div+JS로 만들면 JS가 늦게 뜨거나 에러 나는 순간 아무도 못 연다. 접근성 감사(a11y)에 그대로 걸리고, Ctrl+F로 검색해도 감춰 둔 내용이 안 잡히며, 인쇄하면 통째로 빠진다. details는 이 전부를 브라우저가 처리한다 — Chrome은 Ctrl+F로 접힌 안쪽 글자를 찾으면 알아서 펼쳐 준다.① 여기서 바로
onclick/JS부터 꺼내는 것("라이브러리 아코디언 쓰면 되지"도 같은 함정) — 직접 만들면 tabindex="0"(도달), keydown(Enter·Space 둘 다), aria-expanded 갱신, role 지정 넷을 다 해야 하고, 대개 Space나 aria-expanded에서 조용히 빠진다. details는 이 넷이 전부 기본값. 순서는 네이티브 먼저, 안 되는 것만 JS.②
div에 tabindex="0"만 붙이고 끝 — 포커스는 되지만 Enter/Space 처리·role은 여전히 없다(절반만 고침).③ 기본 삼각형이 디자인과 안 맞는다고 div로 되돌아가는 것 —
summary { list-style: none }으로 지우고 원하는 아이콘을 넣으면 된다.④ 반대로 details를 만능으로 보는 것 — 부드러운 애니메이션, "한 번에 하나만 열리는" 아코디언, 마커 미세 조정이 붙으면 브라우저마다 손이 더 간다. 기본형을 details로 잡아 두고 그때 확장하면 된다.
✍️ 마치며
오늘은 "화면"과 "협업 규칙"을 동시에 다듬은 날이었다. Figma가 아직 손에 안 붙지만, 디자인을 JSON으로 뽑아 Claude로 구현하는 흐름을 알고 나니 툴 익히는 게 덜 막막해졌다. 그리고 머지 정책을 파보면서 "결과 코드는 같아도 이력의 모양이 달라진다"는 걸 처음 제대로 이해했다 — Squash는 깔끔함, Rebase는 커밋 이력 보존. 컨벤션을 정해둔 우리 팀엔 무엇이 맞을지 내일 결론이 난다. 다음 주 8/3부터 본격 구현이라, 지금 뼈대를 잘 잡아두는 게 중요하다.
🏷️ 포트폴리오 | Figma | 디자인 시스템 | Git 머지 전략 | Squash·Rebase | 협업
'AI 기반 프론트엔드 웹개발자 양성과정' 카테고리의 다른 글
| [260803 25일차] 프로젝트 #6 (0) | 2026.08.03 |
|---|---|
| [260731 24일차] 프로젝트 #5 (0) | 2026.08.03 |
| [260729 22일차] 프로젝트 #3 (0) | 2026.07.30 |
| [260728 21일차] 프로젝트 #2 (0) | 2026.07.28 |
| [260727 20일차] 프로젝트 #1 (0) | 2026.07.28 |