◇ PART · REST

비동기 통신이 푼 문제

전체 새로고침 vs 부분 통신

학습 목표

  • 동기 통신 의 답답함을 직접 본다
  • 비동기 통신(Ajax) 가 무엇을 푸는지 안다
  • 현대 웹사이트가 왜 이렇게 부드러운지 이해한다
  • Part 6 에서 만들 결과물을 미리 그린다

⚠️ v6 게시판의 답답함

댓글 한 번 다는 데 일어나는 일
  1. 댓글 입력 → 「등록」 클릭
  2. 화면 전체가 깜빡 (흰 화면 잠깐)
  3. 모든 이미지·CSS·JS 다시 다운로드
  4. 스크롤이 맨 위로 — 어디 있었는지 잃어버림
  5. 다시 댓글 영역까지 스크롤
  6. 단 한 줄 추가하려고 위 5 단계 모두 발생

댓글 5 개 달면 5 번 새로고침. 100 개 달면 100 번. 사용자 경험이 끔찍합니다.

옛날 웹의 모습

1990 년대~2000 년대 초의 웹사이트는 모두 이런 식이었습니다:

  • 버튼 클릭 = 페이지 통째로 새로고침
  • 네트워크가 느려서 흰 화면 시간이 길었음
  • 「인터넷 익스플로러 5」 시대의 풍경

2005 년 구글 맵스가 등장했을 때 — 지도를 드래그해도 새로고침 없이 부드럽게 이어지는 게 충격적이었습니다. 그게 바로 Ajax 의 첫 대중화 사례.

🛠️ 비동기 통신 (Ajax) 의 발상

「부분만 갱신」

전체 페이지를 다시 받지 말고 — JS 로 백그라운드에서 서버에 요청 → 작은 데이터만 받아 → 화면의 일부분만 직접 수정.

동기 통신 (전통) 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 로 직접 보기 — 현대 사이트

  1. 네이버 또는 인스타그램 접속
  2. F12 → Network → Fetch/XHR 필터 선택
  3. 스크롤 내려보기, 좋아요 누르기, 검색하기 등
  4. 매 액션마다 작은 JSON 요청이 발생함을 봄
스크린샷
F12 Network → Fetch/XHR 탭. 사용자 액션마다 작은 JSON 응답들이 줄지어 보이는 화면

비동기 = 사용자 경험의 혁명

비동기 통신이 가져온 변화 4 가지:

  • ① 화면 깜빡 제거 — 사용자 만족도 ↑
  • ② 네트워크 절약 — 모바일 환경에서 결정적
  • ③ 빠른 반응 — 입력하는 동안 자동 검증·자동 저장
  • ④ 풍부한 인터랙션 — 게임·지도·실시간 채팅 가능

현대 웹사이트가 「앱처럼 매끄럽게」 동작하는 이유의 80%.

주의 — 비동기의 함정

조심할 것
  • 네트워크 실패 처리 — 동기는 「에러 페이지」 표시, 비동기는 직접 처리해야 함
  • 로딩 상태 표시 — 사용자가 「뭔가 진행 중」을 알도록
  • 중복 클릭 방지 — 빠르게 두 번 누르면 두 번 요청
  • SEO 영향 — JS 로 그린 화면을 검색 엔진이 못 읽을 수 있음
  • 브라우저 뒤로가기 — URL 안 바뀌면 뒤로가기 동작 X

본 과정의 학습 순서

  1. 이번 차시 — 비동기 통신의 「왜?」 를 안다
  2. JSON 형식 깊이 보기 — 데이터 표기법 이해
  3. @RestController — 서버 측 도구 등장
  4. HTTP 메서드 어노테이션 — RESTful URL 디자인
  5. ★ v8 REST 변환 — v6 게시판을 REST API 로
  6. ★ v9 비동기 댓글 — fetch 첫 사용
  7. ★ v10 자잘한 비동기 — 패턴 응용
  8. ★ 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 으로 변환되는 그 순간.