◇ PART · REST
비동기 통신이 푼 문제
전체 새로고침 vs 부분 통신
학습 목표
- 동기 통신 의 답답함을 직접 본다
- 비동기 통신(Ajax) 가 무엇을 푸는지 안다
- 현대 웹사이트가 왜 이렇게 부드러운지 이해한다
- Part 6 에서 만들 결과물을 미리 그린다
⚠️ v6 게시판의 답답함
댓글 한 번 다는 데 일어나는 일
- 댓글 입력 → 「등록」 클릭
- 화면 전체가 깜빡 (흰 화면 잠깐)
- 모든 이미지·CSS·JS 다시 다운로드
- 스크롤이 맨 위로 — 어디 있었는지 잃어버림
- 다시 댓글 영역까지 스크롤
- 단 한 줄 추가하려고 위 5 단계 모두 발생
댓글 5 개 달면 5 번 새로고침. 100 개 달면 100 번. 사용자 경험이 끔찍합니다.
옛날 웹의 모습
1990 년대~2000 년대 초의 웹사이트는 모두 이런 식이었습니다:
- 버튼 클릭 = 페이지 통째로 새로고침
- 네트워크가 느려서 흰 화면 시간이 길었음
- 「인터넷 익스플로러 5」 시대의 풍경
2005 년 구글 맵스가 등장했을 때 — 지도를 드래그해도 새로고침 없이 부드럽게 이어지는 게 충격적이었습니다. 그게 바로 Ajax 의 첫 대중화 사례.
🛠️ 비동기 통신 (Ajax) 의 발상
동기 통신 (전통)
form 제출
↓
서버: HTML 페이지 통째로
↓
브라우저: 전체 다시 그림 (깜빡)
비동기 통신 (Ajax)
JS: fetch() 호출
↓
서버: JSON 만 작게
↓
JS: 화면의 일부분만 수정
(페이지 그대로 매끄럽게)
비유 — 식당의 두 방식
동기 (옛 방식)
손님: "추가 주문 1개"
↓
종업원: "잠깐만요" → 주방 갔다옴
↓
손님이 자리에서 나가고 다시 들어옴
↓ 손님: 자기 자리·메뉴판 다 다시 받음
↓ 추가 주문 한 그릇 받음
비동기 (현대)
손님: "추가 주문 1개"
↓ 종업원이 알아서 갔다옴
손님은 그대로 앉아서 다른 일
↓
종업원: 추가 주문만 살짝 갖다놓음
손님: 메뉴판·자리·기존 음식 그대로
Ajax 의 어원
Ajax = Asynchronous JavaScript and XML
옛날엔 XML 로 데이터를 주고받았는데, 지금은 거의 모두 JSON 으로. 그래도 「Ajax」 라는 단어는 그대로 사용.
현대에는 「비동기 통신」 이라는 한국어 표현이 더 정확. 또는 「fetch」 라는 API 이름으로 부르기도 함.
현대 웹의 어디서 비동기가 쓰이나
페이스북·인스타그램
→ 스크롤 내리면 새 글 불러옴 (전체 새로고침 없이)
네이버 검색
→ 입력 중에 자동 완성 추천이 떠오름
카카오톡 웹
→ 새 메시지가 화면에 자동 등장
구글 맵스
→ 드래그하면 지도가 부드럽게 이어짐
유튜브
→ 좋아요·구독 클릭 시 페이지 그대로
쇼핑몰 장바구니
→ 「담기」 누르면 작은 알림만 뜸
온라인 게임 / 화상회의
→ 실시간으로 데이터 주고받음 (WebSocket 등)
현대 웹의 사실상 모든 부드러운 인터랙션 = Ajax
두 통신의 4 가지 차이
| 항목 | 동기 (전통) | 비동기 (Ajax) |
| 트리거 | form 제출 / 링크 클릭 | JS 호출 (fetch) |
| 서버 응답 | HTML 페이지 전체 | JSON 데이터만 |
| 화면 처리 | 브라우저가 전체 다시 그림 | JS 가 부분 수정 |
| 네트워크 | HTML+CSS+이미지+JS 모두 (수백 KB) | JSON 만 (수 KB) |
| 사용자 경험 | 깜빡 + 스크롤 잃음 | 매끄러움 + 그대로 |
코드 비교 — 동기 (form 제출)
<form action="/reply/add"
method="post">
<input name="content"/>
<button>등록</button>
</form>
// 서버 (@Controller)
return "redirect:/board/view?num=...";
// → 페이지 전체 다시 받음
👉 등록 후 redirect 가 일어나면 화면을 통째로 다시 그립니다.
코드 비교 — 비동기 (fetch)
<form onsubmit="add(event)">
<input id="content"/>
<button>등록</button>
</form>
async function add(event) {
event.preventDefault();
const res = await fetch(
'/api/replies', {...});
const newR = await res.json();
// DOM 에 추가만
list.appendChild(render(newR));
}
// → 페이지 그대로
👉 같은 화면 안에서 새 댓글만 살짝 붙입니다.
Ajax 의 등장 — 패러다임 전환
2005 년 「Ajax」 라는 용어가 만들어진 이후 웹의 모습이 통째로 바뀌었습니다:
- 「웹사이트」 → 「웹 애플리케이션」
- 매번 페이지 이동 → 한 페이지에서 다양한 기능 (SPA, Single Page App)
- HTML 위주 → JSON API 위주
- 서버 렌더링 위주 → 클라이언트(JS) 렌더링 증가
- React·Vue·Angular 같은 SPA 프레임워크 등장
본 과정에서 만들 비동기 기능
- 댓글 비동기 작성 (v9) — 입력하고 등록 누르면 새로고침 없이 댓글 등장
- 조회수 자동 증가 (v10) — 글 들어가면 +1 즉시 반영
- 사진 첨부 (v10) — ADD COLUMN photo 와 짝
- FormData 업로드 (v10) — multipart/form-data
👉 모두 페이지 그대로 + 부분만 변경. 현대 웹의 표준.
비동기의 두 축 — 서버 + 클라이언트
서버 측 (Spring) — 다음 차시들에서
@RestController
@RequestBody / @ResponseBody
JSON 자동 변환 (Jackson)
HTTP 메서드별 어노테이션 (Get/Post/Put/Delete Mapping)
클라이언트 측 (JavaScript) — 함께 학습
fetch API
async / await
JSON.stringify / JSON.parse
DOM 조작 (appendChild, innerHTML 등)
👉 본 과정은 둘 다 다룹니다. 양쪽이 짝을 이뤄야 비동기가 동작.
fetch — 가장 단순한 형태
// GET — 데이터 받기
const res = await fetch('/api/boards/3');
const board = await res.json();
console.log(board.title); // myboard.num=3 의 제목
// POST — 데이터 보내기
const r2 = await fetch('/api/boards', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
title: '새 글',
content: '안녕하세요'
})
});
const newBoard = await r2.json();
👉 「URL 에 요청 보내고 → 응답 받음」. 이전과 발상은 같지만 — JS 가 직접 통제.
JSON — 비동기의 공용어
// JavaScript 객체
const board = {
num: 3,
title: "첫 글",
writer: "hong"
};
// JSON 문자열로 변환 (서버로 보낼 때)
const text = JSON.stringify(board);
// '{"num":3,"title":"첫 글","writer":"hong"}'
// JSON 문자열을 객체로 (서버에서 받을 때)
const obj = JSON.parse(text);
console.log(obj.title); // "첫 글"
👉 자바와 자바스크립트가 「JSON」 이라는 공용어로 대화. 서로 모르는 언어지만 JSON 으로 변환·해석.
F12 로 직접 보기 — 현대 사이트
- 네이버 또는 인스타그램 접속
- F12 → Network → Fetch/XHR 필터 선택
- 스크롤 내려보기, 좋아요 누르기, 검색하기 등
- 매 액션마다 작은 JSON 요청이 발생함을 봄
스크린샷
F12 Network → Fetch/XHR 탭. 사용자 액션마다 작은 JSON 응답들이 줄지어 보이는 화면
비동기 = 사용자 경험의 혁명
비동기 통신이 가져온 변화 4 가지:
- ① 화면 깜빡 제거 — 사용자 만족도 ↑
- ② 네트워크 절약 — 모바일 환경에서 결정적
- ③ 빠른 반응 — 입력하는 동안 자동 검증·자동 저장
- ④ 풍부한 인터랙션 — 게임·지도·실시간 채팅 가능
현대 웹사이트가 「앱처럼 매끄럽게」 동작하는 이유의 80%.
주의 — 비동기의 함정
조심할 것
- 네트워크 실패 처리 — 동기는 「에러 페이지」 표시, 비동기는 직접 처리해야 함
- 로딩 상태 표시 — 사용자가 「뭔가 진행 중」을 알도록
- 중복 클릭 방지 — 빠르게 두 번 누르면 두 번 요청
- SEO 영향 — JS 로 그린 화면을 검색 엔진이 못 읽을 수 있음
- 브라우저 뒤로가기 — URL 안 바뀌면 뒤로가기 동작 X
본 과정의 학습 순서
- 이번 차시 — 비동기 통신의 「왜?」 를 안다
- JSON 형식 깊이 보기 — 데이터 표기법 이해
- @RestController — 서버 측 도구 등장
- HTTP 메서드 어노테이션 — RESTful URL 디자인
- ★ v8 REST 변환 — v6 게시판을 REST API 로
- ★ v9 비동기 댓글 — fetch 첫 사용
- ★ v10 자잘한 비동기 — 패턴 응용
- ★ v∞ 디버깅 워크숍 — 마무리
🔄 Before / After
Part 5 끝 (v6/v7)
동작하는 게시판이 있다. 매 클릭마다 화면 깜빡.
→
이번 차시 끝
동기와 비동기 차이를 안다. 다음 차시들에서 만들 결과물의 큰 그림이 그려진다.
이번 차시의 데이터 흐름
사용자 액션
→
JS fetch
→
서버 (REST API)
→
JSON 응답
→
JS DOM 수정
● JS 가 흐름의 양쪽 끝(시작·도착)을 통제 — 페이지는 그대로
정리
오늘 들고 가는 것
- 동기 = 전체 새로고침 / 비동기 = 부분 갱신
- Ajax = 비동기 통신의 통칭. 현대는 fetch 와 JSON
- 현대 웹 사이트의 매끄러움 = Ajax 의 결과
- 본 과정에서 v8~v10 으로 단계별 비동기 게시판 구축
- 비동기에는 서버(@RestController) + 클라이언트(fetch) 양축
다음: JSON 형식 깊이 — DTO 가 JSON 으로 변환되는 그 순간.