반응형 웹(Responsive Web)과 적응형 웹(Adaptive Web)은 화면 크기나 기기에 따라 웹 페이지가 사용자에게 최적화된 화면을 제공하는 방법입니다. 하지만 이 두 접근 방식은 화면을 최적화하는 방식에서 차이가 있습니다.
반응형 웹은 CSS의 미디어 쿼리(media query)를 사용하여 화면 크기와 관계없이 유동적으로 레이아웃을 변경합니다.
하나의 HTML과 CSS 코드 기반을 사용해 화면 크기에 맞게 요소들이 자동으로 재배치되고 크기가 조정되므로, 사용자가 어떤 기기(모바일, 태블릿, 데스크톱 등)를 사용하든 일관된 경험을 제공할 수 있습니다.
/* 데스크톱 스타일 */
body {
font-size: 16px;
}
@media (max-width: 768px) {
/* 태블릿 스타일 */
body {
font-size: 14px;
}
}
@media (max-width: 480px) {
/* 모바일 스타일 */
body {
font-size: 12px;
}
}
| 특징 | 설명 |
|---|---|
| 유동적인 레이아웃 | 화면 크기에 따라 요소의 크기와 위치가 비율에 맞춰 자동으로 조정 |
| 미디어 쿼리 사용 | CSS에서 화면의 가로 너비를 기준으로 스타일을 조정 |
| 코드의 일관성 | HTML 구조가 하나만 존재하므로, 유지 보수가 용이하고 코드 중복 감소 |
| 처리 주체 | 클라이언트 측에서 화면 상황에 따라 요소들의 배치 변화 처리 |
적응형 웹은 여러 개의 고정된 레이아웃을 만들어 놓고, 사용자가 접속한 화면 크기에 맞는 레이아웃을 선택하여 표시하는 방식입니다.
반응형 웹과 달리 미리 정의된 레이아웃 중에서 선택하기 때문에 특정 화면 크기별로 세부적인 최적화가 가능합니다.
<!-- Desktop layout -->
<div class="desktop">This is for desktop</div>
<!-- Tablet layout -->
<div class="tablet">This is for tablet</div>
<!-- Mobile layout -->
<div class="mobile">This is for mobile</div>
/* 각 레이아웃별로 CSS를 조정 */
.desktop { display: block; }
.tablet, .mobile { display: none; }
@media (max-width: 768px) {
.desktop { display: none; }
.tablet { display: block; }
}
@media (max-width: 480px) {
.tablet { display: none; }
.mobile { display: block; }
}
| 특징 | 설명 |
|---|---|
| 고정된 레이아웃 | 몇 가지 화면 크기(모바일, 태블릿, 데스크톱)에 맞춰 미리 정의된 레이아웃 사용 |
| 서버 기반 선택 가능 | 서버가 사용자의 화면 크기를 감지하고, 해당 크기에 맞는 HTML 제공 가능 |
| 처리 주체 | 클라이언트 측, 서버 측 둘 다 배치 변화 처리 가능 |
| 렌딩(Landing) | 특정 기기에 맞는 레이아웃을 선택하고 로딩하는 과정 |
적응형 웹은 특정 기기에 맞는 레이아웃을 선택하고 로딩하는 렌딩 과정을 거칩니다.
PC 접속 시
└─→ daum.net으로 렌딩
모바일 접속 시
└─→ 서버가 사용자 기기 확인
└─→ 모바일 전용 페이지로 redirect
└─→ m.daum.net으로 렌딩
| 구분 | 반응형 웹 🌊 | 적응형 웹 🎛️ |
|---|---|---|
| 레이아웃 방식 | 유동적 (Fluid) | 고정형 (Fixed) |
| 코드 베이스 | 단일 HTML/CSS | 디바이스별 독립적 템플릿 |
| 처리 위치 | 클라이언트 측 | 클라이언트 측 + 서버 측 |
| 주요 기술 | CSS 미디어 쿼리 | 여러 레이아웃 + 선택 로직 |
| 유지 보수 | ⭐⭐⭐⭐⭐ 용이 | ⭐⭐ 복잡 |
| 기기별 최적화 | ⭐⭐⭐ 보통 | ⭐⭐⭐⭐⭐ 우수 |
| 개발 시간 | 중간 | 김 (여러 버전 제작) |
| 확장성 | ⭐⭐⭐⭐⭐ 우수 | ⭐⭐ 제한적 |
┌─────────────────────────────────┐
│ 하나의 HTML/CSS 코드베이스 │
└─────────────────────────────────┘
↓
┌─────────┴─────────┐
↓ ↓
┌─────────┐ ┌──────────┐
│ 📱 모바일 │ │ 💻 데스크톱 │
│ 자동조정 │ │ 자동조정 │
└─────────┘ └──────────┘
┌───────────────────────────────────┐
│ 여러 개의 독립적인 레이아웃 준비 │
└───────────────────────────────────┘
↓ ↓ ↓
┌────────┐ ┌────────┐ ┌────────┐
│ 📱 모바일│ │ 📱 태블릿│ │💻 PC │
│ 전용 │ │ 전용 │ │ 전용 │
└────────┘ └────────┘ └────────┘
↓ ↓ ↓
선택 및 렌딩 (필요시 redirect)
/* 모바일 우선(Mobile First) 접근 */
/* 기본 스타일 (모바일) */
.container {
width: 100%;
padding: 10px;
}
/* 태블릿 이상 */
@media (min-width: 768px) {
.container {
width: 750px;
margin: 0 auto;
}
}
/* 데스크톱 이상 */
@media (min-width: 1024px) {
.container {
width: 960px;
}
}
// 서버 측 기기 감지 예시 (Node.js)
app.get('/', (req, res) => {
const userAgent = req.headers['user-agent'];
if (/mobile/i.test(userAgent)) {
res.redirect('/mobile');
} else if (/tablet/i.test(userAgent)) {
res.redirect('/tablet');
} else {
res.redirect('/desktop');
}
});
| 디바이스 | 화면 크기 | 미디어 쿼리 |
|---|---|---|
| 📱 스마트폰 | < 576px | @media (max-width: 575px) |
| 📱 큰 스마트폰 | 576px - 767px | @media (min-width: 576px) |
| 📱 태블릿 | 768px - 991px | @media (min-width: 768px) |
| 💻 데스크톱 | 992px - 1199px | @media (min-width: 992px) |
| 🖥️ 대형 화면 | ≥ 1200px | @media (min-width: 1200px) |