본문 바로가기

멋쟁이사자처럼_부트캠프/JavaScript

[멋쟁이사자처럼 부트캠프 TIL 회고] 백엔드 부트캠프 13기: Java 24일차 JavaScript, AJAX

JavaScript

웹 개발을 위한 프로그래밍 언어로, 웹 페이지에 동적 기능을 추가하고 사용자와 상호작용할 수 있도록 해줌.

브라우저에서 실행되는 클라이언트 측 스크립트 언어.

 

크롬의 자바스크립트기능을 이용하여 메뉴이름을 변경하는 예시.

JavaScript의 주요 특징

  1. 동적이고 유연한 언어:
    • 데이터 타입을 자동으로 변환하고, 변수에 다양한 타입의 데이터를 할당할 수 있습니다.
    • 런타임 중에 객체를 수정하거나 새로운 속성을 추가할 수 있습니다.
  2. 객체 기반:
    • 모든 것이 객체처럼 동작하며, 프로토타입 상속을 통해 객체를 확장할 수 있습니다.
  3. 웹 브라우저에서 실행:
    • 웹 페이지에서 동적인 콘텐츠를 구현할 수 있습니다(예: 버튼 클릭 이벤트, 폼 검증, 애니메이션 등).
  4. 비동기 처리:
    • 콜백, 프로미스(Promise), async/await을 통해 네트워크 요청 등 시간 지연 작업을 처리할 수 있습니다.
  5. 크로스 플랫폼:
    • 브라우저뿐만 아니라 Node.js 환경에서 서버 측 스크립트를 작성할 수도 있습니다.

JavaScript의 주요 용도

  1. 클라이언트 측 웹 개발:
    • 웹 페이지에서 동적 콘텐츠를 추가.
    • 예: 슬라이더, 모달 창, 드롭다운 메뉴.
  2. 서버 측 개발 (Node.js):
    • 백엔드 애플리케이션 개발.
    • RESTful API 서버 구축, 실시간 채팅 애플리케이션.
  3. 프론트엔드 프레임워크 및 라이브러리:
    • React, Angular, Vue.js와 같은 프레임워크를 사용한 SPA(Single Page Application) 개발.
  4. 모바일 앱 개발:
    • React Native, Ionic 등을 활용하여 모바일 앱 개발.
  5. 게임 개발:
    • WebGL, Three.js 등을 사용한 브라우저 기반 2D/3D 게임 개발.
  6. 데스크톱 애플리케이션 개발:
    • Electron.js를 사용하여 크로스 플랫폼 데스크톱 애플리케이션 제작.

 

JavaScript의 장점

  • 가볍고 빠름: 브라우저에서 바로 실행되어 추가 설치 없이 동작.
  • 풍부한 생태계: 수많은 라이브러리와 프레임워크를 통해 개발 속도 향상.
  • 상호작용: 이벤트 처리로 사용자의 입력에 실시간 반응 가능.
  • 크로스 플랫폼: 브라우저, 서버, 데스크톱, 모바일 등 다양한 환경에서 사용 가능.

JavaScript의 단점

  • 브라우저 의존성: 일부 기능이 브라우저마다 다르게 동작할 수 있음.
  • 동기적 코드의 복잡성: 비동기 작업의 체계적인 처리가 필요.
  • 런타임 에러: 정적 타입 언어가 아니므로 실행 중에 에러를 발견할 가능성이 높음.

 

JavaScript 기본 코드 예제

1. 버튼 클릭 이벤트 처리

<!DOCTYPE html>
<html>
<head>
    <title>JavaScript Example</title>
</head>
<body>
    <button id="myButton">Click Me!</button>
    <p id="message"></p>

    <script>
        const button = document.getElementById('myButton');
        const message = document.getElementById('message');

        button.addEventListener('click', () => {
            message.textContent = 'Button Clicked!';
        });
    </script>
</body>
</html>

script태그 부분.

 

스크립트태그 : 보통은 바디태그 끝나기전에 삽입.

만약 <script> 태그가 <head>나 HTML의 상단부에 위치하면, 스크립트를 다운로드하고 실행하는 동안 HTML 로딩이 차단됨. 이로 인해 페이지 콘텐츠 로딩 지연 문제가 발생할 수 있음.

페이지 콘텐츠를 먼저 표시해야하므로 <script> 태그를 <body> 태그 끝에 배치하면, 브라우저는 HTML 콘텐츠를 먼저 렌더링하고, 마지막에 스크립트를 로드함. 이렇게 하면 사용자는 빠르게 페이지 내용을 볼 수 있어 UX가 향상됨.

 

예외: <head>에 스크립트를 삽입하는 경우

일부 상황에서는 스크립트를 <head>에 배치할 수 있습니다.
그러나 성능 저하를 방지하기 위해 다음 속성을 사용합니다:

  • defer: HTML을 모두 파싱한 뒤 스크립트를 실행.
  • async: 스크립트를 비동기적으로 로드하며, HTML 파싱과 병렬로 진행.
<head>
  <script src="script.js" defer></script>
</head>

 

2. 비동기 데이터 요청 (Fetch API)

fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));

 

 

  • 자바스크립트는 함수를 일급 객체(first-class object)로 취급한다

일급 객체란?

일급 객체는 다음 조건을 만족하는 객체를 말합니다:

  1. 변수에 함수를 할당할 수 있다.
  2. 함수를 다른 함수의 인수로 전달할 수 있다.
  3. 함수를 다른 함수의 결과값으로 반환할 수 있다.
  4. 데이터 구조(객체, 배열)에 저장할 수 있다.
  5. 동적으로 생성하거나 삭제할 수 있다.

자바스크립트에서의 함수 활용

자바스크립트에서 함수는 일급 객체로 취급되므로, 다음과 같은 작업이 가능합니다.

 

1. 함수를 변수에 할당

함수 자체를 값처럼 변수에 할당할 수 있습니다.

const sayHello = function() {
    console.log("Hello!");
};
sayHello(); // "Hello!"

 

2. 함수를 다른 함수의 인수로 전달

함수를 다른 함수의 매개변수로 전달하여 호출할 수 있습니다.

function greet(callback) {
    callback();
}

function sayHello() {
    console.log("Hello!");
}

greet(sayHello); // "Hello!"

 

3. 함수를 다른 함수의 반환값으로 사용

함수를 생성하여 반환할 수 있습니다.

function createMultiplier(multiplier) {
    return function (number) {
        return number * multiplier;
    };
}

const double = createMultiplier(2);
console.log(double(5)); // 10

 

4. 함수를 데이터 구조에 저장

함수를 배열이나 객체 안에 저장하고 사용할 수 있습니다.

const functions = [
    function () { return "A"; },
    function () { return "B"; },
    function () { return "C"; }
];

console.log(functions[1]()); // "B"

const obj = {
    greet: function () { return "Hello!"; }
};
console.log(obj.greet()); // "Hello!"

 

왜 일급 객체가 중요한가?

  1. 유연성:
    • 함수를 값처럼 다룰 수 있기 때문에 프로그램의 구조를 더 유연하게 설계할 수 있습니다.
  2. 콜백 함수:
    • 비동기 프로그래밍(AJAX, 이벤트 처리 등)에서 함수가 인수로 전달되어 호출되는 패턴을 쉽게 구현.
  3. 고차 함수:
    • 함수를 반환하거나 인수로 받는 **고차 함수(higher-order function)**를 구현할 수 있어 함수형 프로그래밍이 가능.
  4. 클로저 활용:
    • 함수를 반환할 때 클로저를 만들어 데이터 캡슐화와 같은 패턴을 구현.

 

일급 객체 예시와 설명

고차 함수 예시

고차 함수는 다른 함수를 인수로 받거나, 함수를 반환하는 함수입니다.

// 고차 함수: 함수를 인수로 받음
function repeat(n, action) {
    for (let i = 0; i < n; i++) {
        action(i);
    }
}

repeat(3, console.log); // 0, 1, 2

클로저 예시

클로저는 반환된 함수가 외부 함수의 변수에 접근할 수 있는 패턴입니다.

function makeCounter() {
    let count = 0;
    return function () {
        count++;
        return count;
    };
}

const counter = makeCounter();
console.log(counter()); // 1
console.log(counter()); // 2
 
요약
  • "자바스크립트는 함수를 일급 객체로 취급한다"는 말은 함수를 값처럼 다룰 수 있다는 의미입니다.
  • 함수는 변수에 할당하거나, 다른 함수의 인수로 전달하거나, 반환값으로 사용할 수 있습니다.
  • 이러한 특성은 고차 함수, 콜백, 클로저 등의 강력한 기능을 가능하게 합니다.

  • 웹 애플리케이션이나 서비스에서 사용자와의 상호작용할때
    • 요청: 회원가입폼 보여줘요, 회원가입 시켜줘요  -> 요청이 2번 이루어짐.
    • 자바스트립트로 처리하면 데이터가 서버로 왔다간게 아니기때문에 데이터가 사용자에 남아있게된다

 

TypeScript : JavaScript에 정적 타입 지정(Static Typing)과 객체 지향 프로그래밍 기능을 추가한 언어. JavaScript의 모든 기능을 포함하면서도 대규모 애플리케이션 개발에 적합한 기능을 제공한다.

 

간단한 TypeScript 코드 예제

// 변수에 타입 지정
let userName: string = "Alice";
let userAge: number = 30;

// 함수에 타입 지정
function greet(name: string): string {
    return `Hello, ${name}`;
}

console.log(greet(userName)); // 출력: Hello, Alice

// 클래스 정의
class Animal {
    name: string;
    constructor(name: string) {
        this.name = name;
    }
    speak(): string {
        return `${this.name} makes a sound.`;
    }
}

const dog = new Animal("Dog");
console.log(dog.speak()); // 출력: Dog makes a sound.

 

 

AJAX (Asynchronous JavaScript and XML)

비동기적 웹 애플리케이션 개발 기법으로, 웹페이지를 새로 고치지 않고 서버와 데이터를 주고받을 수 있도록 해줍니다.

AJAX는 특정 기술이나 프로토콜이 아니라 여러 웹 기술의 조합을 통해 사용자 경험(UX)을 개선하는 방법입니다.

AJAX의 주요 특징

  1. 비동기적 데이터 처리:
    • 전체 페이지를 새로고침하지 않고 서버와 데이터를 주고받을 수 있습니다.
    • 사용자 작업 흐름이 방해받지 않음.
  2. 빠른 응답성:
    • 필요한 데이터만 갱신하므로 속도가 향상되고 대역폭이 절약됩니다.
  3. 데이터 포맷:
    • XML뿐 아니라 JSON, HTML, 텍스트 등 다양한 데이터 포맷을 지원.

AJAX의 구성 요소

AJAX는 다음 기술의 조합으로 동작합니다:

  1. HTML & CSS:
    • 웹페이지의 구조와 디자인을 정의.
  2. JavaScript:
    • AJAX 요청을 생성하고, 서버로부터 받은 데이터를 처리.
  3. XMLHttpRequest 객체:
    • 브라우저에서 서버와 비동기적으로 데이터를 주고받는 데 사용되는 핵심 도구.
  4. 데이터 포맷:
    • 데이터를 교환하기 위해 XML, JSON, HTML, 텍스트 등이 사용됩니다.
  5. 서버측 스크립트:
    • PHP, Node.js, Python 등의 서버 언어를 사용하여 클라이언트 요청을 처리하고 데이터를 반환.

AJAX의 동작 원리

  1. 사용자 작업:
    • 사용자가 버튼 클릭, 스크롤 등 이벤트를 발생시킴.
  2. AJAX 요청 생성:
    • JavaScript의 XMLHttpRequest 객체를 통해 서버에 요청 전송.
  3. 서버 처리:
    • 서버는 요청을 처리하고 필요한 데이터를 준비.
  4. AJAX 응답:
    • 서버가 데이터를 클라이언트로 전송.
  5. 페이지 갱신:
    • JavaScript가 서버 응답 데이터를 받아 필요한 부분만 DOM에 업데이트.

AJAX의 장점

  1. 빠른 사용자 경험:
    • 페이지 전체를 리로드하지 않으므로 로딩 속도가 빨라집니다.
  2. 대역폭 절약:
    • 필요한 데이터만 전송하여 네트워크 사용량이 줄어듭니다.
  3. 유연한 데이터 처리:
    • 다양한 포맷(XML, JSON 등)의 데이터를 처리할 수 있음.

AJAX의 단점

  1. SEO 문제:
    • 비동기로 로드된 데이터는 검색 엔진이 인덱싱하지 못할 수 있음.
  2. 브라우저 호환성:
    • 일부 오래된 브라우저에서 동작하지 않을 수 있음.
  3. 보안 문제:
    • 클라이언트-서버 간 데이터 전송 중 보안 취약점이 생길 수 있음.

AJAX의 코드 예제

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AJAX Example</title>
    <script>
        function loadData() {
            // 1. XMLHttpRequest 객체 생성
            const xhr = new XMLHttpRequest();

            // 2. 요청 초기화
            xhr.open('GET', 'data.txt', true);

            // 3. 서버 응답 처리
            xhr.onload = function () {
                if (xhr.status === 200) {
                    document.getElementById('content').innerText = xhr.responseText;
                }
            };

            // 4. 요청 전송
            xhr.send();
        }
    </script>
</head>
<body>
    <h1>AJAX Example</h1>
    <button onclick="loadData()">Load Data</button>
    <div id="content">Here will be the server data.</div>
</body>
</html>

AJAX와 Fetch API

Fetch API는 최신 브라우저에서 AJAX를 대체하는 기능으로, AJAX보다 사용이 간단하며 Promise 기반으로 작성됩니다.

function fetchData() {
    fetch('data.txt')
        .then(response => response.text())
        .then(data => {
            document.getElementById('content').innerText = data;
        })
        .catch(error => console.error('Error:', error));
}

AJAX가 사용되는 사례

  1. 회원가입, 로그인 폼:
    • 입력한 데이터를 서버에 전송하고 결과를 즉시 표시.
  2. 검색 자동완성:
    • 사용자가 입력할 때마다 관련 데이터를 서버에서 받아와 화면에 표시.
  3. 채팅 애플리케이션:
    • 새 메시지를 실시간으로 받아와 표시.
  4. 무한 스크롤:
    • 사용자가 스크롤할 때 추가 데이터를 서버에서 받아와 표시.
  5. 대시보드 업데이트:
    • 실시간 데이터를 주기적으로 받아와 업데이트.

결론

AJAX는 현대적인 웹 애플리케이션의 핵심 기술로, 비동기적 데이터 처리를 통해 사용자 경험을 크게 향상시킵니다. 최신 기술로는 Fetch APIAxios 라이브러리가 AJAX의 대안으로 널리 사용됩니다.