@extends('layouts.app') @section('title', '프론트엔드 개발') @push('styles') @endpush @section('content')
HTML, CSS, JavaScript부터 프레임워크, 성능 최적화까지 — 비개발자도 이해하는 프론트엔드 가이드
프론트엔드(Front-end)란 사용자가 직접 보고, 클릭하고, 입력하는 화면 전체를 말한다. 웹 브라우저에 표시되는 버튼, 메뉴, 입력창, 표, 이미지 등 눈에 보이는 모든 것이 프론트엔드의 영역이다.
비유: 식당의 홀과 주방
프론트엔드는 식당의 홀이다. 손님이 메뉴판을 보고, 주문하고, 음식을 받는 공간이다. 백엔드는 주방이다. 손님은 보지 못하지만, 주문을 받아 요리하고 결과를 내보내는 곳이다. 홀이 예쁘고 편해야 손님이 만족하듯, 프론트엔드가 잘 만들어져야 사용자가 편하게 시스템을 쓸 수 있다.
프론트엔드 (홀)
사용자가 보는 화면
HTML, CSS, JavaScript
버튼, 폼, 메뉴, 테이블
백엔드 (주방)
서버에서 처리하는 로직
PHP, Python, Java
데이터 저장, 인증, 계산
프론트엔드는 세 가지 기술로 구성된다. 이 셋은 항상 함께 작동한다.
HTML (구조)
건물의 뼈대
방, 거실, 주방의 위치를 정한다
CSS (디자인)
인테리어
벽지, 가구 배치, 조명을 결정한다
JavaScript (동작)
전기 배선
스위치를 누르면 조명이 켜진다
SAM 시스템의 프론트엔드: SAM도 프론트엔드와 백엔드로 분리되어 있다. MNG(관리자 웹)는 Blade + HTMX로, React 앱은 Next.js로 화면을 구성하고, API 서버(Laravel)가 데이터를 처리한다.
프론트엔드와 백엔드 — 식당의 홀과 주방
시맨틱(Semantic) 태그는 "의미가 있는" 태그다. <div>만 쓰면 검색엔진이나 스크린리더가 내용을 이해하기 어렵다.
시맨틱 태그를 사용하면 "여기가 메뉴 영역이고, 여기가 본문이고, 여기가 푸터"라고 알려줄 수 있다.
DOM 트리 구조 (문서 객체 모델)
document
└── html
├── head
│ └── title
└── body
├── header
│ └── nav
├── main
│ ├── section
│ └── section
└── footer
브라우저는 HTML을 읽어 위와 같은 트리(나무) 구조로 변환한다. 이를 DOM(Document Object Model)이라 한다.
DOM 트리 — HTML 문서의 구조
비유: 인테리어 디자인
CSS는 인테리어와 같다. HTML이 방의 위치를 정했다면, CSS는 벽지 색, 가구 크기, 조명 밝기를 결정한다. "거실 벽은 흰색, 소파는 가운데 배치" 같은 지시서가 CSS인 셈이다.
CSS(Cascading Style Sheets)는 HTML 요소의 외양을 꾸미는 스타일 언어다. 선택자로 "어떤 요소를" 지정하고, 속성으로 "어떻게" 꾸밀지 정한다.
박스모델: 모든 HTML 요소는 상자(box)로 취급된다. 상자 안쪽부터 바깥쪽 순서로 구성된다.
┌──────────────── margin (바깥 여백) ────────────────┐ │ ┌──────────── border (테두리) ──────────────┐ │ │ │ ┌──────── padding (안쪽 여백) ────────┐ │ │ │ │ │ │ │ │ │ │ │ content (내용물) │ │ │ │ │ │ │ │ │ │ │ └─────────────────────────────────────┘ │ │ │ └───────────────────────────────────────────┘ │ └────────────────────────────────────────────────────┘
CSS 박스모델 — margin, border, padding, content
현대 CSS 레이아웃의 두 기둥이다. 요소를 가로/세로로 배치하는 강력한 도구다.
Flexbox (1차원 배치)
한 줄(가로 또는 세로)로 요소를 나란히 배치할 때 사용한다.
Grid (2차원 배치)
행과 열을 동시에 제어하는 바둑판식 레이아웃에 사용한다.
SAM에서는 Tailwind CSS를 사용한다.
Tailwind는 CSS를 파일에 따로 작성하지 않고, HTML 클래스명으로 직접 스타일을 적용하는 방식이다.
예: class="flex items-center gap-2 bg-white rounded-lg p-4"
비유: 전기 배선
JavaScript는 전기 배선과 같다. HTML이 방을 만들고 CSS가 꾸몄다면, JavaScript는 스위치를 누르면 조명이 켜지고, 리모컨을 누르면 TV가 켜지는 동작을 담당한다.
이벤트 처리
클릭, 입력, 스크롤 등 사용자 행동을 감지하여 반응한다.
JSON (데이터 형식)
서버와 데이터를 주고받을 때 사용하는 텍스트 형식이다.
JavaScript는 DOM(문서 객체)을 조작하여 화면을 동적으로 변경할 수 있다.
또한 fetch()를 사용하면 페이지 새로고침 없이 서버 데이터를 가져올 수 있다.
비동기 통신이란? 서버에 데이터를 요청하면서도 화면이 멈추지 않는 방식이다.
마치 식당에서 주문을 넣고 기다리는 동안 물을 마시거나 대화를 할 수 있는 것과 같다.
fetch(), async/await, Promise가 이 역할을 한다.
JavaScript 이벤트 처리와 DOM 조작 흐름
비유: 반조립 가구 vs 공구 세트
프레임워크는 이케아의 반조립 가구 — 설계도와 부품이 정해져 있어서 순서대로 조립하면 완성된다. 라이브러리는 공구 세트 — 필요할 때 원하는 도구만 꺼내 쓴다. 설계는 내가 한다.
Meta(Facebook) 개발
Evan You 개발
Google 개발
| 기술 | 유형 | 특징 |
|---|---|---|
| Next.js | React 기반 프레임워크 | 서버사이드 렌더링(SSR), 파일 기반 라우팅 |
| HTMX | 경량 라이브러리 | HTML 속성만으로 AJAX 요청 처리 |
| jQuery | 라이브러리 (레거시) | DOM 조작 간소화, 2006년 등장 후 한 시대를 풍미 |
SAM은 이중 프론트엔드 구조를 사용한다.
MNG (관리자 웹)
Laravel Blade + HTMX + Tailwind CSS
서버에서 HTML을 생성하여 전달
React 앱 (모바일/대시보드)
Next.js + React 18
브라우저에서 JavaScript로 화면 구성
React / Vue / Angular 비교와 SAM 아키텍처
비유: 물은 그릇 모양에 따라 변한다
반응형 디자인은 물과 같다. 컵에 담으면 컵 모양, 접시에 부으면 접시 모양이 된다. 화면 크기(모바일, 태블릿, 데스크톱)에 따라 레이아웃이 자동으로 바뀌는 것이 반응형이다.
브레이크포인트(Breakpoint)는 레이아웃이 전환되는 화면 너비 기준점이다.
| 기기 | 너비 | Tailwind 접두사 | 예시 |
|---|---|---|---|
| 모바일 | ~639px | (기본) | 스마트폰 |
| 태블릿 | 640px~ | sm: | 아이패드 |
| 중간 | 768px~ | md: | 태블릿 가로 |
| 데스크톱 | 1024px~ | lg: | 노트북 |
| 대형 | 1280px~ | xl: | 대형 모니터 |
디자인 흐름 (모바일 퍼스트)
viewport 메타 태그:
<meta name="viewport" content="width=device-width, initial-scale=1">
— 이 한 줄이 없으면 모바일에서 데스크톱 크기로 축소되어 보인다. 모든 반응형 페이지의 필수 태그다.
모바일 / 태블릿 / 데스크톱 반응형 레이아웃
비유: 통역사
브라우저는 통역사와 같다. HTML/CSS/JavaScript라는 "외국어"를 읽고, 우리가 볼 수 있는 화면으로 번역해준다. 이 번역 과정을 렌더링(Rendering)이라 한다.
렌더링 과정 (6단계)
개발자 도구 (F12)
브라우저에서 F12 키를 누르면 개발자 도구가 열린다.
주요 브라우저
CORS(Cross-Origin Resource Sharing)는 브라우저의 보안 정책이다. A 도메인의 웹페이지에서 B 도메인의 API를 호출하면, 브라우저가 "이거 허가받은 요청이야?" 하고 확인한다.
서버가 응답 헤더에 Access-Control-Allow-Origin을 포함하지 않으면 브라우저가 요청을 차단한다.
이때 콘솔에 빨간 CORS 에러가 표시된다.
해결법: 서버(백엔드) 쪽에서 CORS 헤더를 설정해야 한다. 프론트엔드만으로는 해결할 수 없다.
HTML 코드가 화면의 픽셀로 변환되는 6단계 과정
비유: 식당의 주문서
API는 주문서와 같다. 프론트엔드(홀)가 백엔드(주방)에 "이 데이터를 주세요"라고 정해진 양식으로 요청하는 것이다. 주문서에는 "무엇을(URL) 어떻게(메서드) 해달라"고 적는다.
| HTTP 메서드 | 비유 | 용도 | 예시 |
|---|---|---|---|
| GET | 메뉴판 보기 | 데이터 조회 | GET /api/orders |
| POST | 새 주문하기 | 데이터 생성 | POST /api/orders |
| PUT | 주문 변경 | 데이터 수정 | PUT /api/orders/1 |
| DELETE | 주문 취소 | 데이터 삭제 | DELETE /api/orders/1 |
JSON 데이터 형식
fetch()로 API 호출
| 상태 코드 | 의미 | 비유 |
|---|---|---|
| 200 | 성공 | 주문한 음식이 나왔다 |
| 400 | 잘못된 요청 | 주문서를 잘못 작성했다 |
| 401 | 인증 실패 | 회원증 없이 회원 전용 식당에 왔다 |
| 404 | 찾을 수 없음 | 해당 메뉴가 없다 |
| 500 | 서버 오류 | 주방에서 화재가 났다 |
SAM의 API 통신:
SAM React 앱은 api.sam-erp.com의 API 서버와 통신한다. MNG에서는 HTMX가 서버에 요청을 보내고 HTML 조각을 받아 화면을 업데이트한다.
프론트엔드와 백엔드 간 API 요청/응답 흐름
VS Code
가장 널리 쓰이는 코드 에디터. 확장 프로그램으로 기능을 무한히 추가할 수 있다. 무료.
npm (Node Package Manager)
JavaScript 패키지(라이브러리)를 설치·관리하는 도구. npm install로 의존성을 설치한다.
Git
코드 버전 관리. 변경 이력 추적, 협업, 되돌리기가 가능하다. (→ 서버지식 참고)
린터 & 포매터
ESLint(코드 오류 검출), Prettier(코드 스타일 자동 정리). PHP에서는 Pint를 사용한다.
Vite (현대적 번들러)
차세대 프론트엔드 빌드 도구. 빠른 개발 서버와 효율적인 번들링을 제공한다.
Webpack (전통적 번들러)
오랫동안 표준이었던 번들러. 복잡하지만 강력한 설정이 가능하다.
개발 워크플로우
코드 작성부터 배포까지 — 개발 워크플로우
Lighthouse는 Google이 제공하는 웹 성능 측정 도구다. Chrome 개발자 도구(F12) → Lighthouse 탭에서 실행할 수 있다.
Performance
로딩 속도
Accessibility
접근성
Best Practices
모범 사례
SEO
검색 최적화
| 지표 | 이름 | 비유 | 좋은 기준 |
|---|---|---|---|
| LCP | Largest Contentful Paint | 큰 간판이 보이는 시간 | 2.5초 이내 |
| FID | First Input Delay | 버튼 눌렀을 때 반응 시간 | 100ms 이내 |
| CLS | Cumulative Layout Shift | 화면 레이아웃이 튀는 정도 | 0.1 이내 |
최적화 방법
성능 저하 원인
1. Chrome에서 SAM 페이지를 연다
2. F12를 눌러 개발자 도구를 연다
3. 상단 탭에서 Lighthouse를 클릭한다
4. "Analyze page load"를 클릭한다
5. 30초~1분 후 결과가 표시된다
각 항목에서 100점에 가까울수록 좋다. 90점 이상이면 녹색, 50~89점은 주황색, 49점 이하는 빨간색이다.
프론트엔드는 "사용자가 보고 만지는 모든 것"이다. HTML로 뼈대를 만들고, CSS로 꾸미고, JavaScript로 동작을 넣는다. React, Vue 같은 프레임워크로 복잡한 화면을 효율적으로 관리하고, 반응형 디자인으로 모든 기기에서 잘 보이게 만든다. API를 통해 백엔드와 데이터를 주고받고, Lighthouse로 성능을 측정하여 최적화한다. SAM은 MNG(Blade+HTMX)와 React(Next.js) 이중 프론트엔드 구조로, 이 모든 기술을 활용하고 있다.