페이지 목차
이 페이지에서 검색
AI 드리븐
이 페이지에 묻기
AI 드리븐 · 현재 차시와 목차 본문에서만 찾아 답합니다. 답을 지어내지 않고 해당하는 대목을 그대로 보여 주며, 여기에 없으면 없다고 알려 드립니다.
생성형 AI가 아니라 이 페이지 본문을 찾아 그대로 보여 주는 방식입니다. 외부로 나가는 요청이 없습니다.
AI · DEVELOPMENT
AI 드리븐
생성 수정
요구사항과 역할 정의부터 구현·검증·배포·운영까지, AI와 함께 개발하며 사람이 판단할 기준을 정리합니다.
26개 문서 · 3일차 · 23 / 26
22차시 · 배포 ② 서비스 완성
지도 위치 : 3일차 · 신뢰와 운영 · 병합에서 운영까지 한 줄로 | 이전: 21차시 배포 ① 서버 공개 | 다음: 23차시 운영과 장애 대응 키워드 : 화면 배포와 연결, 자동 배포 흐름, 끝에서 끝까지 검증
이 차시를 다 읽으면
- 화면이 빌드되면 무엇이 되는지 말하고, CDN 을 유와 종차로 정의할 수 있다.
- 화면과 서버가 각각 정상인데도 연결이 실패하는 원인 을 점검 목록으로 댈 수 있고, CORS 가 무엇이고 무엇이 아닌지 말할 수 있다.
- CD 와 미리보기 배포 를 정의하고, 자동 배포 흐름에서 사람이 손을 대는 자리 와 그 이유를 말할 수 있다.
- E2E 테스트 를 단위 · 통합 테스트와 가르고, 핵심 흐름 몇 개로 제한하는 이유를 설명할 수 있다.
- E2E가 진짜로 사용자의 길을 따라갔는지 코드가 아니라 녹화 영상 으로 확인할 수 있다.
0. 이 차시의 판별 축
| # | 축 | 왼쪽 (0) | 오른쪽 (1) | 이 축으로 갈리는 것 | 큰 축 (README 5장) |
|---|---|---|---|---|---|
| 1 | 사람이 손을 대는가 | 사람이 승인 버튼을 눌러야 진행 (운영 배포) | 자동 진행 (미리보기 · 스테이징 배포, 검증) | 되돌리기 어려운 곳에만 사람을 둔다 | ⭐ 사람이 손을 대는가 (⑦의 파생) |
| 2 | 하나인가 여럿인가 | 한 덩어리로 배포 | 화면 · 서버를 따로 배포 | 따로 나누면 연결 지점 이 생기고, 그곳이 깨진다 | ⑤ 하나 ↔ 여럿 |
| 3 | 부품인가 흐름인가 | 단위 · 통합 테스트 (부품) | E2E 테스트 (사용자의 길 전체) | 사용자가 실제로 겪는 것을 보는가 | 이 차시의 축 (⑧의 파생) |
| 4 | 어느 주소를 보는가 | localhost 주소가 빌드에 남음 | 배포 주소가 환경변수로 들어감 | "내 컴퓨터에선 되는데 배포하면 안 됨" | ④ 로컬 ↔ 원격 |
이 차시가 답하는 질문은 병합 버튼 하나에서 실제 서비스까지를 어떻게 한 줄로 잇는가 , 그리고 그 줄의 어디에 사람을 남겨 두는가 입니다. 앞에서 배운 화면 · 서버 분리 (9, 11차시)가 연결 지점을 만들었고, 앞 차시(21차시)의 스모크 테스트와 20차시의 "자동 + 사람 승인" 칸이 이 차시에서 하나의 흐름이 됩니다.
1. 화면 배포
1.1 정의
정적 파일 — [배포 대상]인데, [ 누가 요청하든 같은 내용을 그대로 내주는 파일(HTML · JS · CSS · 이미지) ]이라는 점에서 요청마다 서버가 계산해 만드는 응답과 구별된다. 화면(프론트엔드)은 빌드하면 대부분 정적 파일이 됩니다.
CDN (Content Delivery Network) — [파일 전달망]인데, [ 같은 파일을 세계 여러 곳의 서버에 복사해 두고 사용자와 가까운 곳에서 내준다 ]는 점에서 한 서버가 모든 요청에 답하는 방식과 구별된다.
1.2 화면을 올리는 곳
| 방식 | 예 | 특징 |
|---|---|---|
| 프론트엔드 호스팅 플랫폼 | Vercel, Netlify, Cloudflare Pages | 저장소를 연결하면 빌드 · CDN · HTTPS · 미리보기 배포 (3절)까지 |
| 클라우드 직접 구성 | S3 + CloudFront, GCS + Cloud CDN | 세밀한 제어, 설정할 것이 많음 |
(서비스별 기능은 바뀌므로 공식 문서 확인.)
1.3 반례
| 대상 | 왜 아닌가 |
|---|---|
| 서버(API)를 CDN에 올린 것 | 서버는 요청마다 계산하므로 정적 파일이 아님. 서버는 21차시의 실행 플랫폼에 |
| 화면 빌드에 서버의 비밀 키를 넣은 것 | 정적 파일은 누구나 받아 볼 수 있음 . 앞에서 배운 대로 (11, 16차시) 화면에는 공개 키만 |
2. ⭐ 연결 점검 — 각각 정상이어도 연결은 깨진다
2.1 왜 연결에서 깨지나
0절 축 2입니다. 화면과 서버를 나눴기 때문에 둘 사이에 약속이 생기고, 그 약속은 배포 환경에서 처음 시험받습니다. 서버의 스모크 테스트(21차시)도 통과, 화면의 빌드도 성공인데 예약 버튼을 누르면 아무 일도 안 일어나는 상황이 이 단계의 전형입니다.
| 항목 | 확인 | 깨지면 |
|---|---|---|
| API 주소 | 화면 빌드 시 환경변수로 스테이징 / 운영 서버 주소가 들어갔는가 | 배포된 화면이 localhost로 요청 → 실패 (축 4) |
| CORS | 서버가 화면 도메인을 허용하는가 (와일드카드 * 아님) | 브라우저가 응답을 막음 (2.2절) |
| HTTPS | 화면과 서버 모두 HTTPS인가 | 섞이면 브라우저가 차단 |
| 인증 | 로그인 상태가 유지되는가 (쿠키 도메인, 토큰 저장 방식) | 새로고침하면 로그아웃 |
| 결제 | PG 결제창의 성공 · 실패 이동 주소가 배포 도메인으로 설정됐는가 | 결제 후 localhost로 돌아감 |
| 공개 키 | 화면에 들어간 것이 공개 키뿐 인가 | 비밀 키 유출 |
2.2 CORS — 무엇이고 무엇이 아닌가
출처 (origin) — 주소의 앞부분 세 가지(https + classon.example + 포트)를 묶은 것입니다. 화면이 https://classon.example이고 서버가 https://api.classon.example이면 출처가 다릅니다.
CORS (교차 출처 리소스 공유) — [브라우저 보안 규칙]인데, [ 화면이 다른 출처의 서버에 요청할 때, 그 서버가 허락한 출처의 화면만 응답을 읽게 한다 ]는 점에서 서버가 "누가 요청했는가"를 확인하는 인증과 구별된다.
| CORS | 인증 (앞에서 배운 로그인 확인, 10차시) | |
|---|---|---|
| 누가 지키나 | 브라우저 | 서버 |
| 무엇을 막나 | 허락 안 된 사이트의 화면 이 응답을 읽는 것 | 허락 안 된 사람 이 기능을 쓰는 것 |
curl로 직접 요청하면 | 막지 않음 | 막음 |
⚠️ 그래서 두 가지 실수가 생깁니다.
- ❌ CORS 에러를
*(모든 출처 허용)로 "해결"한다 → 아무 사이트의 화면이나 우리 서버 응답을 읽을 수 있게 됩니다. 허용 목록에 우리 화면 도메인만 넣습니다. - ❌ CORS를 걸었으니 서버가 보호된다고 생각한다 → CORS는 브라우저 밖의 요청을 막지 않습니다. 보호는 서버의 인증 · 인가가 합니다.
3. ⭐ 자동 배포 흐름 (CD)
3.1 정의
CD (지속적 배포, Continuous Deployment / Delivery) — [자동화 흐름]인데, [ 검사를 통과한 변경을 사람이 손대지 않고 배포 환경까지 내보낸다 ]는 점에서 검사까지만 하는 CI(19차시)와 구별된다.
⚠️ 용어 하나: 운영까지 완전 자동 이면 지속적 배포(Deployment), 운영 직전에 사람 승인 을 두면 지속적 전달(Delivery)이라고 구분해 부르기도 합니다. 이 과정의 흐름은 후자입니다. 둘 다 약자가 CD라 섞여 쓰입니다.
미리보기 배포 (preview deployment) — [배포]인데, [ PR마다 임시 주소로 따로 배포되어, 병합 전에 그 변경이 들어간 실제 화면을 볼 수 있다 ]는 점에서 main이 바뀔 때만 갱신되는 공유 스테이징과 구별된다.
3.2 흐름
19차시의 CI 뒤에 배포 단계를 이어 붙입니다.
PR 생성 ─▶ CI 통과 ─▶ 미리보기 배포 (PR마다 임시 주소) [자동]
│
▼ 리뷰 · 승인 후 병합 [사람 — 20차시]
main ─▶ CI 통과 ─▶ 스테이징 자동 배포 ─▶ 스모크 + E2E 테스트 [자동]
│
통과 ─▶ 운영 배포 [⭐ 사람이 승인 버튼]
실패 ─▶ 중단, 알림 [자동]
🔍 읽는 포인트 : 오른쪽의 [자동] / [사람] 표시만 보면 됩니다. 사람은 두 자리 에만 있습니다 — 병합 승인과 운영 배포 승인.
| 요소 | 의미 |
|---|---|
| 미리보기 배포 | PR마다 임시 주소. 리뷰어(나)가 실제 화면을 보고 판단 |
| 스테이징 자동 배포 | main이 바뀌면 자동으로 |
| 운영 승인 단계 | GitHub Environments의 "필수 검토자" 같은 기능으로 사람이 버튼을 눌러야 진행 (설정은 공식 문서 확인) |
| 배포 후 검증 | 21차시의 스모크 스크립트 + E2E (4절) |
| 자동 롤백 (선택) | 배포 후 검증 실패 시 이전 버전으로 |
3.3 사람은 왜 그 두 자리에만 있나
20차시 3절의 표를 그대로 적용한 결과입니다.
| 단계 | 되돌릴 수 있는가 | 판정 | 사람이 손을 대는가 |
|---|---|---|---|
| 미리보기 배포 | 있음 (임시 주소, 실사용자 없음) | 기계 | 자동 |
| 스테이징 배포 | 있음 (실사용자 · 실결제 없음) | 기계 | 자동 |
| 병합 | 있음, 하지만 무엇을 넣을지는 가치 판단 | 사람 | ⭐ 사람 |
| 운영 배포 | 어려움 (실사용자 · 실결제 · 데이터) | 사람 | ⭐ 사람 |
⚠️ 운영 배포까지 완전 자동으로 만들면, 결제 관련 변경이 사람 확인 없이 실제 고객에게 나갑니다. 팀이 커지고 테스트가 충분히 믿을 만해지면 이 칸을 자동으로 옮기는 조직도 있지만, 그 판단도 사람의 몫입니다.
💡 미리보기 배포는 코드를 읽지 않는 사람을 위한 기능 입니다. 20차시 체크리스트의 마지막 항목 "미리보기 주소에서 직접 눌러 봤다"가 여기서 가능해집니다. 코드 대신 동작을 보고 승인하는 방식 이 이 기능으로 완성됩니다.
4. 끝에서 끝까지(E2E) 검증
4.1 정의와 위치
E2E 테스트 (End-to-End) — [자동 테스트]인데, [ 실제 브라우저를 자동으로 조작해 사용자처럼 처음부터 끝까지 따라간다 ]는 점에서 부품만 확인하는 단위 · 통합 테스트와 구별된다. 앞에서 배운 테스트 층 (17차시)의 꼭대기입니다.
단위 · 통합 테스트는 부품 을 확인합니다. 2절의 연결 문제(API 주소, CORS, 쿠키, 결제 이동 주소)는 부품 테스트로는 원리상 잡을 수 없습니다. 부품을 다 붙이고 실제 주소에서 돌려야만 드러나기 때문입니다. 0절 축 3이 이 경계입니다.
4.2 예시
Playwright가 대표적인 도구입니다.
// e2e/reservation.spec.ts (개념)
test("수강생이 클래스를 찾아 예약하고 결제한다", async ({ page }) => {
await page.goto(STAGING_URL);
await page.getByRole("link", { name: /도자기/ }).click();
await page.getByRole("button", { name: "11월 1일" }).click();
await page.getByRole("button", { name: "예약하기" }).click();
// PG 테스트 결제창에서 테스트 카드로 결제
// ...
await expect(page.getByText("예약이 확정되었어요")).toBeVisible();
await page.goto(`${STAGING_URL}/me/reservations`);
await expect(page.getByText("도자기")).toBeVisible();
});
🔍 읽는 포인트 : test("...") 안의 문장이 지키는 흐름이고, name: "예약하기"처럼 따옴표 안의 글자 가 사용자가 화면에서 누르는 버튼 이름입니다. 마지막 두 줄은 "확정 문구가 보이는가", "내 예약 목록에 나오는가"를 확인합니다.
4.3 몇 개나 두나
E2E는 느리고 깨지기 쉽습니다(화면 문구 하나만 바뀌어도 실패). 그래서 핵심 흐름 몇 개만 둡니다.
| 우선순위 | 흐름 |
|---|---|
| 반드시 | 예약 → 결제 → 내 예약 확인 (서비스의 존재 이유) |
| 가능하면 | 자리 없음 표시, 결제 취소 시 예약 미확정 |
| 두지 않음 | 규칙의 세부 (금액 위조, 동시 예약) → 통합 테스트가 더 빠르고 정확 |
4.4 ⭐ E2E는 영상으로 확인한다
Playwright는 테스트 실행을 녹화(비디오) 하고, 단계별 화면을 기록(trace) 할 수 있습니다(설정 이름은 공식 문서 확인). 그러면 테스트가 실제로 어떤 화면을 거쳐 무엇을 눌렀는지 코드 없이 볼 수 있습니다.
⚠️ 테스트는 "통과"했는데 영상을 보니 엉뚱한 버튼을 누르고 있었다면, 앞에서 배운 형식만 갖춘 테스트 (17차시)입니다. E2E에서는 영상이 17차시의 "망가뜨려 보기"에 해당하는 판별 도구입니다.
에이전트에게 브라우저 도구를 연결해 두면(앞에서 배운 외부 연결, 7차시) E2E 시나리오 작성과 실패 원인 분석을 함께 맡길 수 있습니다.
💡 비유는 마지막에 — 단위 · 통합 테스트는 부품 공장의 검수 , E2E는 완성차 시운전 입니다. 엔진도 바퀴도 검수를 통과했는데 조립하고 나니 핸들과 바퀴가 반대로 연결되어 있을 수 있습니다. 시운전 영상을 보면 바로 압니다.
5. 클래스온에 적용하면
이 차시가 끝나면 다음이 성립해야 합니다.
| # | 성립해야 할 것 | 확인 방법 |
|---|---|---|
| 1 | https://classon.example(예시)에서 클래스 목록이 보인다 | 브라우저로 열기 |
| 2 | 테스트 카드로 예약 → 결제 → 내 예약 확인까지 된다 | 직접 해 보기 + E2E 영상 |
| 3 | PR마다 미리보기 주소가 생긴다 | PR 화면의 배포 링크 |
| 4 | PR을 병합하면 사람 손 없이 스테이징까지 배포되고 E2E가 돈다 | Actions 화면 |
| 5 | 운영 배포는 내가 승인해야 진행된다 | 승인 대기 화면 |
6. 실습 — 맡기고 검수하기
지시
[1단계 — 화면 배포와 연결]
apps/web을 프론트엔드 호스팅에 스테이징으로 배포할 설정을 만들어줘. PR마다 미리보기 배포가 생기게.
- 서버 주소는 빌드 환경변수로 넣고, 코드에 주소를 직접 쓰지 마.
- 서버의 CORS 허용 목록에는 스테이징 화면 도메인과 미리보기 도메인만. * 는 쓰지 마.
- 2절 연결 점검 표의 여섯 항목을 하나씩 확인하고 [항목 | 확인 방법 | 결과 | 근거(화면·출력)] 표로 보고해.
[2단계 — 자동 배포와 E2E]
main 병합 시 스테이징 자동 배포 → 스모크 → E2E가 도는 흐름을 만들어줘.
운영 배포는 GitHub Environments의 필수 검토자 승인을 거쳐야만 진행되게 하고, 검토자는 나로.
E2E는 "예약 → 결제 → 내 예약 확인" 하나만. 실행 시 영상 녹화와 trace를 켜고, 결과 영상 위치를 알려줘.
운영 배포 승인 버튼은 절대 누르지 말고, 운영 환경에는 아무것도 배포하지 마.
🔍 읽는 포인트 : "*는 쓰지 마"(2.2), "E2E는 하나만"(4.3), "운영 배포 승인 버튼은 절대 누르지 마"(3.3)가 이 차시의 세 원칙을 지시로 옮긴 것입니다.
받을 증거
- 연결 점검 표 (여섯 항목, 근거 칸 채움)
- 미리보기 주소 하나, 스테이징 주소
- 병합 후 자동 배포 Actions 실행 화면 주소와 스모크 · E2E 출력 원문
- E2E 녹화 영상 파일 위치
- 운영 배포가 승인 대기 로 멈춰 있는 화면
내가 직접 확인할 것
| 볼 것 | 이걸로 아는 것 / 왜 내가 보는가 |
|---|---|
| ⭐ E2E 녹화 영상 | 테스트가 정말 사용자의 길 (도자기 → 날짜 → 예약하기 → 결제 → 내 예약)을 따라갔는가. 엉뚱한 버튼이면 형식만 갖춘 테스트 |
배포된 화면에서 F12 → Network 탭 → 요청 주소 | localhost가 아닌 스테이징 서버 주소인가 (2.1의 API 주소) |
| 주소창 자물쇠 (화면 · 서버 둘 다) | HTTPS 섞임이 없다 |
| 로그인 후 새로고침 | 로그인 상태가 유지된다 (인증 연결) |
| 테스트 결제 후 돌아오는 주소 | 배포 도메인의 완료 화면으로 돌아온다 (결제 이동 주소) |
| 미리보기 주소에서 직접 예약해 보기 | 20차시 체크리스트 7번. 코드 대신 동작으로 승인 |
| Actions 화면의 운영 배포 단계 | 내 승인 대기 상태로 멈춰 있어야 정상. 그냥 지나갔다면 승인 단계가 안 걸린 것 |
부록 A. 스스로 확인하기
| # | 질문 | 답이 있는 곳 |
|---|---|---|
| 1 | 정적 파일과 CDN을 유와 종차로 정의하면? | 1.1 |
| 2 | 화면 빌드에 비밀 키를 넣으면 안 되는 이유는? | 1.3 |
| 3 | 화면과 서버가 각각 정상인데 연결이 실패하는 원인 세 가지는? | 2.1 |
| 4 | CORS는 누가 지키고, 인증과 무엇이 다른가? * 허용이 왜 문제인가? | 2.2 |
| 5 | CD를 정의하면? 지속적 배포와 지속적 전달은 어떻게 다른가? | 3.1 |
| 6 | 미리보기 배포는 리뷰에 어떤 도움을 주나? | 3.1, 3.3 |
| 7 | 자동 배포 흐름에서 사람이 손을 대는 두 자리와 그 이유는? | 3.2, 3.3 |
| 8 | 연결 문제를 단위 · 통합 테스트로 잡을 수 없는 이유는? | 4.1 |
| 9 | E2E를 핵심 흐름 몇 개로 제한하는 이유는? | 4.3 |
| 10 | E2E가 형식만 갖춘 테스트인지 코드 없이 판별하는 방법은? | 4.4 |
부록 B. 자주 하는 실수
| 실수 | 바로잡기 |
|---|---|
화면 빌드에 로컬 API 주소(localhost:4000)가 그대로 들어간다 | ⭕ 빌드 환경변수로 넣고 Network 탭으로 확인 (2.1) |
CORS 에러를 * 허용으로 "해결"한다 | ❌ 허용 목록에 우리 화면 도메인만 (2.2) |
| CORS를 걸었으니 서버가 보호된다고 생각한다 | ❌ CORS는 브라우저 규칙입니다. 보호는 서버의 인증 · 인가 (2.2) |
| E2E를 수십 개 만들어 매번 30분씩 걸리고 자주 깨진다 | ⚠️ 핵심 흐름 몇 개만. 세부 규칙은 통합 테스트로 (4.3) |
| 운영 배포까지 완전 자동화해 결제 변경이 사람 확인 없이 나간다 | ❌ 되돌리기 어려운 자리에는 사람 (3.3) |
| E2E "통과"만 보고 영상은 열어 보지 않는다 | ⚠️ 엉뚱한 버튼을 누르고 통과했을 수 있습니다 (4.4) |
| 미리보기 주소가 있는데도 코드 요약만 보고 승인한다 | ⭕ 미리보기 주소에서 직접 눌러 보고 승인 (3.3) |
부록 C. NotebookLM 복습 프롬프트
이 22차시 노트만 근거로 5문제를 내줘. 비전공자 기준으로.
"CORS가 무엇이고 무엇이 아닌가", "자동 배포 흐름에서 사람이 남는 두 자리", "E2E를 영상으로 확인하는 이유"는 반드시 포함해줘.
답은 내가 답한 다음에 채점하고, 틀린 이유를 노트의 절 번호를 근거로 설명해줘.
LangTailor