본문 바로가기
javascript

2024-03-08

by rewind 2024. 3. 8.
<!DOCTYPE html>
<meta charset="UTF-8">
<script>
// 이젠 fetch(Ajax기반 , Promise기반)의 시대
// fetch 기본 사용법

async function fgetList(){
    let response = await fetch("http://localhost:8080/api/friends/");
    // 단점 : response도 Promise라 한번 더 await 해주어야 한다
    // axios는 이부분을 편하게 만들었다
}

/* 자주쓰는 기본 틀
async function fCk(){
    fetch("URL" , {
        method: "get", // *GET, POST, PUT, DELETE 등
        headers: {
            "Content-type" : "application/json",
        },
        body:JSON.stringify(data)
    })
}
*/
</script>​
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
    <button onclick="fCk()">확인</button>
    <script>
        const fCk = function(){
            alert("체크");
            // http://localhost:8080/api/friends 톰캣
            $.ajax({
                method : "get",
                url : "http://localhost:8080/api/friends",
//                data : "", 서버쪽으로 보낼 데이터
                dataType: "json",   // 서버에서 받은 데이터를 JSON.parse를 할건지 안할건지
                success : function(pRslt){
                    console.log("항상 결과를 눈으로 보는 습관 : " , pRslt);
                }
            })
            
        }
    </script>
</body>
</html>

 

실행후 에러 나야 정상(CORS)

 

origin(출처)의 구성요소 세가지 -> protocol + domain(host) + port

 

이 세가지 중 하나라도 일치하지 않으면 cross origin

 

Ajax에서 CORS 제약을 하는 이유?

 

크롬 웹스토어에서 cors 확장프로그램 추가(Allow CORS)

 

Ajax로 우회(해당 url에 원하는 url에 요청을 함), 서버에서 CrossOrigin 사용하는 방법 찾아보기

 

@CrossOrigin 어노테이션 선언후 서버 재기동, 실행해서 테스트

 

프론트

Node -> 엄밀하게 서버가 아니고 자바스크립트 런타임 환경

브라우저에서만 작동하던것을 클라이언트단에서 작동할 수 있게

React Vue Angular

node + javascript + mongoDB : 자바스크립트 한가지로 백+프론트 모두 가능

로드밸런싱, 클라이언트, 서버,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
</head>
<body>
    <input type="text" id="txtName" value=""><br>
    <button onclick="fCkList()">친구리스트</button>
    <button onclick="fCkSch()">친구조회</button>
    <button onclick="fCkCre()">친구생성</button>
    <button onclick="fCkUpd()">친구수정</button>
    <button onclick="fCkDel()">친구삭제</button>
    <script>
        const txtName = document.querySelector("#txtName");
        const fCkSch = function(){
            $.ajax({
                type:"get",
                url:`http://localhost:8080/api/friends/${txtName.value}`,
//              data
                dataType:"json",
                success:function(rslt){
                    console.log("친구 : " , rslt);
                }
            })
        }
        const fCkList = function(){
            alert("체크");
            // http://localhost:8080/api/friends 톰캣 프로토콜 + 도메인명 + 포트번호 -> 오리진 구성요소
            // http://localhost:8272             Apache 
            // Ajax는 기본적으로 same-origin 정책의 제한사항을 받음
            // UI서버 + B/E(Restful방식)으로 분리하여 구현하는 것이 점점 대세!
            $.ajax({
                method : "get",
                url : "http://localhost:8080/api/friends",
//                data : "", 서버쪽으로 보낼 데이터
                dataType: "json",   // 서버에서 받은 데이터를 JSON.parse를 할건지 안할건지
                // ajax로 받으면 결과를 변수에 받기 때문에 , 이후 맘대로 조작이 가능
                // 피싱사이트도 만들수 있다 때문에 same-origin 정책이 디폴트
                success : function(pRslt){
                    console.log("항상 결과를 눈으로 보는 습관 : " , pRslt);
                }
            })
            
        }
    </script>
</body>
</html>

 

url을 통해 데이터를 보내기 때문에 ajax에 data작성하지 않아도 된다

 

리팩토링 생각하지말고 우선은 한눈에 보이게 해야 디버깅도 편하다(정상적으로 작동만 하면 수정은 이후에)

 

<!DOCTYPE html>
<meta charset="UTF-8">
<script>
// ... Spread Operator(전개 연산자)
function fCk(...merong){
    console.log(merong);
}
fCk("사람1","사람2","사람3","사람4");

</script>

 

구조분해

<!DOCTYPE html>
<meta charset="UTF-8">
<script>
// 구조 분해 , 생각보다 반응이 좋고 , 프론트 프레임워크에서 엄청나게 사용한다

// 배열의 구조분해
var aaa = ["aa" , "bb" , "cc" , "dd"];

[name1 ,test , name2 ,] = aaa;

// console.log(name1);
// console.log(name2);
var gusang = {
    name:"규상",
    age:20,
    stageName:"규모가 상급"
}
var {name , stageName} = gusang;    // 이름 속성만 뽑기
console.log("name" , name);
console.log("stageName" , stageName);
</script>

 

axios만들어보기

<!DOCTYPE html>
<meta charset="UTF-8">
<script>
// 보통 비동기의 결과 처리를 콜백함수에 맡기는데,
// 비동기가 많이 사용되면서 , 콜백안에 콜백, 그안에 콜백등으로 코드가 복잡해지는 경우가 많아진다
// Hell of CallBack(콜백지옥)
// 직접 Promise를 만들 일은 거의 없다(일반 웹개발자) 사용만 잘해도 좋음
// 비동기처리(Ajax , Axios , fetch)의 가독성을 위해 출현

var axios = {};
// axios 만들어보기
axios.get = function(url){ // axios에 get메소드 추가
    // resolve는 실행이 성공되었을때 사용(호출)
    // reject는 실행이 잘 안되고 문제가 발생되었을 때(호출)
    return new Promise((res,rej) => { // Ajax를 Promisify(프로미스화)
        let xhr = new XMLHttpRequest();
        xhr.open("get" , "메모.txt" , true);
        xhr.onreadystatechange = function(){
            if(xhr.readyState == 4 && xhr.status == 200){
                res(xhr.responseText);
            }
        }
        xhr.send();
        // res("성공");
        // rej("에러!");
    });
}

axios.get("메모.txt").then((pRslt) => {
    console.log("체크1 "  , pRslt);
}).catch((pError) => {
    console.log("체크2 " , pError);
}).finally(() => {
    console.log("여기는 무조건 실행, 자바의 finally와 같음");
});

</script>

 

then catch 가 반복됨에 따라 async/await 키워드 등장(극찬)

 

기다렸다가 작동하면(내부가) 동기인데? -> 함수 자체가 통째로 비동기 동작