쏭쏭송 2024. 4. 6. 15:00

Ajax( Asynchronous JavaScript and XML )란?

데이터(XML)을 주고 받은 통신

데이터 형식은 XML, Text, HTML, JSON, CSV 등 다양한 형식 사용 가능

=> 멀티쓰레드가 되고 동기식으로만 원래 되던 아이를 비동기로 할수 있도록 만들어 준 것

 

 

동기식 데이터 방식 : 클라이언트가 서버로 데이터를 요청하면 응답이 올 때까지 다른 작업은 대기

client가 무언가를 요청했을 때 WAS 로 가서 WAS가 result로 값을 보낼때까지 시간이 있는데..

=> async: false 라고 하면 화면은 뜨지만 뭘 동작할 수가 없음
                 (한번 누르고 응답이 오기 전까지는 무효 처리 - 클릭 불가)

 

 

비동기 방식 

- async: true 라고 하면 화면에서 뭘 누를 수 있음

   ( 응답 대기하는 중간에도 클릭하면 요청을 계속 보내는 것 -> 처리응답도 여러번 오게 됨 )

 

특징

장점:

- 전체 페이지 갱신하지 않고 일부분 업데이트 가능

- 페이지가 전체가 업데이트 안해서 즉각적으로 반응한다고 느낄 수 있음

- Javascript 방식

 

단점:

- Ajax는 JavaScript라서 브라우저에 따른 크로스 브라우저 처리 필요

  => 브라우저가 얼만큼 지원하냐에 따라 달라짐

- 서버 부하 증가하여 페이지 느려짐(계속 누를수도 있어서)

- 페이지 내 복잡도가 증가하여 에러 발생 시 디버깅이 어려움

   ex. ajax안에 ajax를 또 써서 데이터를 받는 것
         => 최대 2개 사용. 그 이상은 success function이 언제 끝나는지 보이지 않아서 웬만하면 사용 X

 

 

JavaScript 방식 Ajax : 브라우저 내장 객체인 XMLHttpRequest를 이용하여 비동기 방식으로 데이터 송수신

방법

1. 객체 생성 : XMLHttpRequest 객체 생성

2. onreadystatechange 에 callback 함수 지정

    2-1. 응답 상태 확인
            -> field안에 들어오는 값에 따라 응답 상태 확인

    2-2. 응답 완료(서버 응답 데이터 접근)

            -> responseText / responseXML

3.open() 메소드 호출해서 요청방식, 대상(서버), 동기/비동기 방식 지정

2. send(): 메소드 호출해서 대상(서버)에 전송

//1. 객체 생성 : script문에 요청을 위한 XMLHttpRequest객체 생성
var req = new XMLHttpRequest();

//success 에서 받는 값..
req.onreadystatechange = function(){
	console.log("이곳은 서버에서 응답이 들어오면 호출됨. - 여러번 들어옴(readyState 의 변화만큼 들어옴)");
	console.log(req.readyState); //0, 1, 2, 3, 4까지 들어옴 
	//open 전이면 0번이라 console 창에는 표시안됨. open되면 시작해서 1,2,3,4 까지 들어옴
	//controller에서 데이터를 받을 거 다 받으면 4번까지 나옴
	
	if(req.readyState == 4 && req.status == 200) {
		//레식이 형님의 success 단계 - 들고 들어온 데이터가 있을 것임
		
		console.log(req.responseText);
		//success 의 result에 해당				
	} else {
		//error단계
	}
	
};

//3. req 객체에 전송할 준비 =>  open - (요청 방식, 대상(서버), 동기/비동기 지정)
req.open("post", "${pageContext.request.contextPath}/ajax/test", true );


//4. req 객체에 데이터 실어서 보내기
req.send();

 

 

jQuery 방식 ajax : jQuery에 내장되어 있는 Ajax통신을 위한 가장 기본적인 함수 이용

 

$.ajax();
ajax : 메소드 =>  매개인자로 한개만 주면 됨

$ : 객체명
 $ 는 함수, 객체명으로 존재함
* 값 여러개 주고싶으면 {object 형태} 씀

 

주요 속성

속성명 설명
url 요청(request) 데이터 전송할 URL
data 서버로 전송할 요청 (Parameter 설정)
type Http 요쳥 방식 지정(GET/POST)
datatype 서버의 응답(response) 데이터의 형식(xml, text, json, html 등) 지정
미 작성 시 자동으로 판단하여 지정
success(data) ajax 통신 성공 시 호출되는 함수 지정
매개변수로 응답 데이터를 받음 (data)
error ajax 통신 실패 시 호출되는 함수 지정
complete ajax 통신 성공여부와 관계없이 통신완료 후 실행 되는 함수 지정
async 비동기(true)/동기(false) 지정

 

장점:

코드 길이가 감소하여 JavaScript방식보다 구현 방법 간단 직관적

다양한 방법의 코딩 가능 크로스 브라우저 처리를 jQuery가 자동으로 해결

(JavaScript방식 XMLHttpRequest 객체 생성 시 브라우저 검사 생략 가능)


ajax 기본 function

<script>
$(loadedHandler);

function loadedHandler(){
	//event 등록
	$(".btn.checkid").on("click", btnCheckidClickHandler);
}

function btnCheckidClickHandler() {
	/* id에 들어있는 value 꺼내는 방법 */
	var idVal = $("[name=id]").val(); /* val이 읽혀서 나와서 밑에 대입 */

$.ajax( { 

url:"${pageContext.request.contextPath}/join"
   //어디로 갔다가 다시 되돌아오고 싶은데 어디로?
	, method:"post"    => 포스트 방식으로 갔다왔으면 좋겠어
	, data : { id : idVal } 
     //어떤 데이터를 들고 controller한테 줄건데? (데이터 전송)
     //여러개 데이터 넣고 싶으면 object 형태로 , 찍고 나열해서 쓰면 됨
	/* id 는 JoinController 에서 getParameter() 안에 이름이랑 같아야함
                              => 데이터 전송해야되서*/
	, success : function(){}
		//controller에서 전달해준 값 여기서 호출
		//function( ) 안에 매개인자 넣어야함(값을 받아서 호출해야 하니까)
		//controller 에서 보낸 자바 자료형 모양 인지 X
        //바스크립트라서 자바스크립트 자료형 보내야함)
	    // => Map 형태를 GSOn을 활용해서 JSON 형태로 바꿔서 여기에 실어주면 
        //JSON이 object 랑 흡사하게 생겨서 자바스크립트 형태로바뀌게됨 
	, error : function(){
		alert("code: "+request.status + "\n" + "message: " 
		+ request.responseText + "\n"
		+ "error: "+error);
						}
	} );
}
 	//contextpath 를 통해 controller로 가서 controller에서 동작을 다 하면 success/error 로 돌아옴

* Controller는 dispatcher forward/sendRedirect 이 둘 중 하나로 끝나지만

  ajax는 근데 이게 아님
  => 왔던 곳으로 돌아가는 것

  => dispatcher/sendredirect 로 다른 페이지 이동하면 안되고 왔던 곳으로 다시 돌아가야함 
        (success, error 둘 중 하나)
       이때 결과물을 가지고 돌아감(결과물 여러개를 가지고 갈수는 없음)