inblog logo
|
LifeLog, DevLog
    JS

    비동기 처리

    KYJTHEYJ's avatar
    KYJTHEYJ
    Nov 24, 2025
    비동기 처리
    // sync
    // 자바스크립트는 순차적인 언어
    // 위에서 아래로 흐르는 방향으로 코드를 작성 -> 순차적인 언어
    
    // 동기 -> 코드가 위에서 아래로 차례대로 실행, 하나의 작업이 끝나야 다음 작업이 실행, 일반적인 실행 방식
    console.log("start");
    for(let i = 0; i < 100000000; i++) {};
    console.log("end");
    
    // 비동기 -> 코드 실행을 기다리지 않고 다른 작업을 먼저 실행 -> 속도가 훨씬 빠름
    // 코드 실행이 오래걸리는 영역에서 실행
    
    // 프론트, 백엔드 영역에서 데이터 주고 받을시
    // 타이머 세팅
    // 일정 시간이 흐른 후 실행 함수
    
    // JS에서 비동기 문법 ***
    // 콜백 -> setTimeout(실행함수, 시간)
    // 프로미스 -> promise, 비동기 처리 방식으로 데이터가 언제 프론트에서 백으로 전송이 될지, 반대로 전송을 할지 짐작키 힘듬
    //           그래서 나온 개념으로, 무조건 데이터는 전송하는 것을 약속, 도착을 했는지, 안했는지를 구분하는 조건을 지님
    //           도착 성공 (resolve()), 도착 실패 (reject())로 실패 메세지를 남김
    // async, await -> 프로미스의 진화 형태로 async, await 키워드로 데이터가 도착이 성공 했을 때 resolve 역할을 수행
    //                 데이터 도착이 실패 했을 때는 try-catch문으로 표현이 가능하게 함
    
    // call-back
    // 다른 함수의 매개변수로 전달, 나중에 실행되는 함수 -> 비동기적 함수
    function fetchData(callback) {
        setTimeout(() => {
            console.log("Data load Complete!");
            callback();
        }, 1000)
    }
    
    function afterFetch() {
        console.log("Data Show");
    }
    
    //fetchData(afterFetch);
    
    // Promise
    // 나중에 값이 온다 라고 약속하는 객체 ({key : value}가 아니라 특별한 기능을 여러개의 키워드 방식으로 저장)
    // 비동기 과정을 실행하고자함 
    // -> 비동기 과정을 수행한다고 약속함 (Promise 객체 생성) -> resolve() 
    // -> 비동기 과정이 끝나면 결과 값을 전송, 이 때 비동기 과정이 실패한다면 reject() 반환
    function orderService() {
        return new Promise((resolve,reject) => {
            console.log("배달 주문 조리중");
            setTimeout(() => {
                let success = false; // 배달 주문 조리 성공, 실패 여부
                if (success) {
                    resolve("배달 주문 조리 완료");
                } else {
                    reject("배달 주문 조리 실패");
                }
            })
        }, 1000)
    }
    
    // Promise 함수에는 then 키워드 사용 가능 
    //orderService().then(result => console.log(result))
    //.catch(error => console.log(error))
    //.finally(() => console.log("배달 주문 종료"));
    
    // async
    // async 를 사용시 Promise 보다 훨씬 짧은 코드로 작성이 가능함
    async function orderService2() {
        return Promise.resolve("배달 주문 조리 완료!");
    }
    
    //orderService2().then(result => console.log(result));
    
    async function orderService3() {
        try {
            throw new Error("배달 주문 조리 실패!");
        } catch(error) {
            console.log("err:", error.message);
        }
        //== return Promise.reject("배달 주문 조리 실패!");
    }
    
    //orderService3();
    // == orderService3().catch(result => console.log(result));
    
    // await
    // await 키워드는 항상 async와 항상 같이 움직임
    // async가 없으면 await은 없음
    // async -> 동기적을 비동기로
    // await -> 비동기를 동기로
    // async 를 사용하면 빠른 속도로 동시다발적 코드가 비순차적으로 실행
    // await 을 사용하면 특정 await 이 적용된 함수는 비순차적에서 순차적으로 코드가 실행되게끔 설정됨
    async function fetchData2() {
        console.log("데이터 요청 중");
        let response = await fetch("https://[MOCKSERVER].mock.pstmn.io/test/1");
        let data = await response.json();
        // 프론트와 백엔드 데이터 교환 사이에서 사용하는 fetch
        // fetch 자체가 비동기 함수 -> 데이터를 비동기적, 비순차적으로 갖고옴
    
        // 여기서 await을 선언해서 async로 실행된 fetchData2 함수에서 순서를 통제 하는 것임
        // 만약 선언 안하면 async로 선언되어 fetch 가 먼저 실행될지, json 을 당겨올지 뭐가 먼저 될지 몰라 문제가 될 소지가 생김
        console.log(data.test);
    }
    
    fetchData2();
    Share article

    LifeLog, DevLog - https://github.com/KYJTHEYJ

    RSS·Powered by Inblog