본문 바로가기
📌 Front End/└ JavaScript

[JavaScript] 비동기 데이터 통신(AJAX, Fetch) - Fetch 요청 옵션, 응답 속성

by 쫄리_ 2024. 11. 14.
728x90
반응형

📌 AJAX(Asynchronous JavaScript and XML)

JavaScript로 XMLHttpRequest 객체를 사용해 서버와 비동기 통신을 가능하게 해주는 기술

이를 통해 웹 페이지를 새로 고침하지 않고도 필요한 부분만 업데이트할 수 있습니다.

AJAX라는 이름에 XML이 포함되어 있지만, 현재는 JSON 등 다양한 데이터 형식 사용

AJAX는 서버와 데이터를 비동기적으로 주고받아 사용자 경험을 개선하는 중요한 역할

비동기 HTTP 통신이란, request(요청)와 response(응답)를 비동기 방식으로 처리


🔎 HTTP 서버 요청 메서드 종류(CRUD)

HTTP 요청 메서드클라이언트가 서버에 요청의 종류와 목적을 알리는 방식입니다.

AJAXFetch 등의 통신 방식에서 자주 사용하는 CRUD 작업은 다음과 같습니다.

💡 페이로드 : 서버로 전송되는 데이터로, 주로 요청 본문에 포함

HTTP 요청 메서드 종류 목적 페이로드
GET 조회 (Read) URL 쿼리 문자열로 데이터를 요청
POST 생성 (Create) 요청 본문(body)에
데이터를 담아 생성 요청
PUT 전체 교체 (Update) 리소스의 전체 교체
PATCH 부분 수정 리소스의 일부 수정
DELETE 삭제 (Delete) 모든 / 특정 리소스 삭제

 


📌 Fetch 란?

Fetch서버와 데이터를 주고받는 비동기 통신 기술(AJAX 대안 사용)

Promise 기반으로 동작하여 AJAX보다 코드가 간결하고 가독성이 높습니다.

ES6부터 JavaScript에 내장되어 있어 별도의 설치 없이 사용할 수 있습니다.

비동기 작업이 완료되면 결과를 반환하며 .then() .catch() .finally() 메서드로 결과를 처리하거나,

Async / Await 구문을 사용해 더 쉽게 관리할 수 있습니다.

fetch(url)
  .then(response => /* 응답 처리 */ )
  .catch(error => /* 오류 처리 */ )
  .finally(() => /* 작업 완료 */ );

 

Fetch 장점

  • 내장 라이브러리이므로 설치 없이 간편하게 사용 가능
  • 비동기 통신 처리가 쉬워 에러 관리 용이

Fetch 단점

  • 일부 브라우저(IE11)에서 지원되지 않습니다.
  • timeout 설정이 없어 네트워크 에러 발생 시 무한 대기가 발생할 수 있음
  • JSON 데이터를 받으려면 response.json() 호출 필요

주의사항 : JSON 데이터에서 {a: b,}, [1, 2,] 같은 형식의 마지막 쉼표가 오류 발생

 


📌 Fetch 사용법과 옵션 설명

Fetch는 서버와 데이터를 주고받는 비동기 통신 기술

URL과 옵션을 사용해 서버에 요청을 보낼 수 있습니다.

 

📝 Fetch 기본 형태

  • url : 요청할 서버 링크를 문자열로 작성
  • options : 요청에 필요한 추가 정보를 담는 객체(생략 가능)
fetch(url, options);

🔎 Fetch 요청 옵션(options)

  • method
  • headers
  • body
  • mode
  • credentials
  • cache
  • redirect
Fetch 요청 옵션 설명
method HTTP 요청 방식 (기본값 GET)
➡️ GET, POST, PUT, DELETE
headers 요청에 포함할 추가 헤더 정보
➡️ Content-Type, Authorization
body 서버로 전송할 데이터
POST / PUT 요청 시 사용

➡ JSON 데이터는 JSON.stringify()로 변환하여 전달
mode 요청의 모드 설정 (다른 출처 리소스를 허용할지 여부)
➡️ cors, same-origin, no-cors
credentials 쿠키 포함 여부 설정
➡ same-origin, include
cache 동일 URL 요청 시 캐시 사용 여부 설정
➡️ no-cache, reload, no-store
redirect 요청 중 리디렉션을 따를지 여부 설정
➡ follow, manual

📝 method

요청할 HTTP 메서드를 설정합니다.

데이터를 조회할 때는 GET, 데이터를 보낼 때는 POST를 사용합니다.

fetch('https://www.요청URL.com', 
 {   
    method: 'GET'  // 데이터 조회는 'GET', 데이터를 전송할 경우 'POST'
 })

 

📝 headers

요청에 추가 정보를 담고 싶을 때 사용하는 헤더 옵션입니다.

주로 Content-Type과 같은 정보를 포함합니다.

fetch('https://www.요청URL.com', 
 {   
    method: 'POST',
     // JSON 데이터 전송 시 Content-Type 설정
    headers: { 'Content-Type': 'application/json' }
 })

 

📝 body

서버로 데이터를 보낼 때 사용합니다.

JSON 또는 FormData데이터를 보내며, GET 메서드에서는 사용할 수 없습니다.

fetch('https://www.요청URL.com', 
 {   
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    // JSON 데이터를 문자열로 변환하여 전송
    body: JSON.stringify({ 
       name: "Sohyun",
       userId: 1
    })
 })

 

📝 mode

mode 옵션은 다른 도메인에 요청을 보낼 때의 접근 방식을 설정합니다.

  • cors : 다른 도메인의 리소스에 접근 가능
  • same-origin : 같은 도메인에서만 요청 가능
  • no-cors : 제한적으로 요청 가능
fetch('https://example.com/data', {
  mode: 'cors' // 또는 'same-origin', 'no-cors'
})

 

📝 credentials

credentials 옵션은 요청 시 쿠키를 포함할지 여부를 설정합니다.

  • same-origin : 같은 도메인에서만 쿠키 포함
  • include : 다른 도메인에서도 쿠키 포함
fetch('https://example.com/data', {
  credentials: 'include' // 또는 'same-origin'
})

 

📝 cache

cache 옵션은 동일한 URL에 요청할 때 캐시된 데이터를 사용할지 여부를 설정합니다.

  • no-cache : 캐시 사용하지 않음
  • reload : 서버에서 새로 데이터를 받아옴
  • no-store : 캐시에 저장하지 않고 항상 새로 요청
fetch('https://example.com/data', {
  cache: 'no-cache' // 또는 'reload', 'no-store'
})

 

📝 redirect

redirect 옵션은 리디렉션 응답을 따를지 여부를 설정합니다.

  • follow : 리디렉션을 따름
  • manual : 리디렉션을 따르지 않음 (필요에 따라 직접 처리 가능)
fetch('https://example.com/data', {
  redirect: 'follow' // 또는 'manual'
})

 


🔎 Fetch 응답 속성(response)

1️⃣ 응답 정보 확인

  • status
  • statusText
  • ok
  • headers
  • url
  • redirected

2️⃣ 응답 데이터 변환

  • json()
  • text()
  • blob()

1️⃣ 응답 정보 확인

Fetch의 응답을 받은 후 .then( response => ) 응답 객체에서 정보를 확인할 수 있습니다.

response 객체 속성 설명
status HTTP 상태 코드
➡️ 200은 성공, 404는 찾을 수 없음
statusText 상태 코드 설명
➡️ OK, Not Found
ok 상태 코드가 성공(200~299) 사이일 경우 true
그렇지 않으면 false
➡ true, false
headers 서버에서 추가로 보낸 헤더 정보
url Fetch 요청한 경로 URL
redirected 리디렉션이 발생했는지 여부 확인
➡️ true, false
fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => {
    // HTTP 상태 코드 확인
    console.log('Status:', response.status); // 예: 200 (성공), 404 (찾을 수 없음)
    
    // 상태 코드에 대한 설명 확인
    console.log('Status Text:', response.statusText); // 예: OK, Not Found
    
    // 상태 코드가 성공(200~299)인지 확인
    console.log('OK:', response.ok); // 성공이면 true, 실패면 false
    
    // 서버에서 추가로 보내온 헤더 정보 확인
    console.log('Headers:', response.headers.get('Content-Type')); // 예: application/json
    
    // 요청한 경로 URL 확인
    console.log('URL:', response.url);
    
    // 리디렉션 여부 확인
    console.log('Redirected:', response.redirected); // 리디렉션 발생 시 true, 아니면 false

    // JSON 형식으로 응답 데이터 변환 후 출력
    return response.json();
  })
  .then(data => {
    console.log('Response Data:', data); // 변환된 JSON 데이터 출력
  })
  .catch(error => {
    console.error('Fetch Error:', error); // 오류 발생 시 출력
  });

 


2️⃣ 응답 데이터 변환

응답 데이터JSON, 텍스트, 파일 형식으로 변환할 수 있습니다.

.then( response => response.json() ) 형태로 사용합니다.

response 데이터 변환 메서드 설명
json() 데이터를 JSON 형식 변환
text() 데이터를 텍스트 형식 변환
blob() 데이터를 파일 객체(Blob) 형식 변환

 

📝 json()

서버에서 JSON 형식의 데이터를 받아올 때 사용합니다.

response.json()은 응답 데이터를 JSON 형식으로 변환하여 객체 형태로 반환합니다.

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.json()) // JSON 형식으로 변환
  .then(data => console.log('JSON Data:', data))
  .catch(error => console.error('Error:', error));


📝 text()

서버에서 일반 텍스트나 HTML 문자열을 받아올 때 사용합니다.

response.text()는 응답 데이터를 문자열로 변환하여 반환합니다.

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.text()) // 텍스트 형식으로 변환
  .then(data => console.log('Text Data:', data))
  .catch(error => console.error('Error:', error));

 

 

➕ 서버 텍스트 데이터를 JSON으로 변환

fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then(response => response.text()) // 1. 응답을 텍스트 형식으로 변환
  .then(data => JSON.parse(data))    // 2. 텍스트를 JSON 객체로 변환
  .then(data => console.log(data));  // 3. 변환된 JSON 객체를 콘솔에 출력


📝 blob()

이미지나 PDF 같은 파일을 받아올 때 사용합니다.

response.blob()은 응답 데이터를 파일 객체(Blob)로 변환하며,

이미지, PDF 등 파일 데이터를 화면에 표시하거나 다운로드할 때 사용됩니다.

// ▶ 이미지 화면 표시
fetch('https://cdn.pixabay.com/photo/2022/02/13/17/24/rabbit-7011660_1280.jpg')
  .then(response => response.blob()) // 파일 객체(Blob) 형식으로 변환
  .then(blob => {
    // 이미지 URL을 생성하여 화면에 표시
    const imgUrl = URL.createObjectURL(blob);
    const img = document.createElement('img');
    img.src = imgUrl;
    document.body.appendChild(img); // 이미지 화면에 표시
  })
  .catch(error => console.error('Error:', error));

 

 

➕ 영상 다운로드

// ▶ 영상 다운로드
fetch('https://v.redd.it/8d899w7y6n0e1/DASH_480.mp4?source=fallback')
    .then(response => response.blob()) // 파일(blob) 형식으로 변환
    .then(blob => {
        // 파일 다운로드 
        const url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.href = url;
        a.download = 'video.mp4'; // 저장할 파일명 설정
        a.click();
        
        // 메모리 해제
        URL.revokeObjectURL(url);
    })
    .catch(error => console.error('Error:', error));

 

 

➕ 버튼 클릭 시 영상 다운로드

<button id="downloadBtn">영상 다운로드</button>

<script>
document.getElementById('downloadBtn').addEventListener('click', () => {
    fetch('https://v.redd.it/8d899w7y6n0e1/DASH_480.mp4?source=fallback')
        .then(response => response.blob()) // 파일(blob) 형식으로 변환
        .then(blob => {
            // 파일 다운로드
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'video.mp4'; // 저장할 파일명 설정
            a.click();
            
            // 메모리 해제
            URL.revokeObjectURL(url);
        })
        .catch(error => console.error('Error:', error));
});
</script>

 


728x90
반응형