개발자 미니민의 개발스터디

[AJAX] AJAX 란? (get 방식 / post 방식)

by mini_min

JSP

[AJAX] AJAX 란? (get 방식 / post 방식)

✔️ AJAX 란?

- 비동기 자바스크립트 XML 이다.
- HTML, CSS, 자바스크립트, DOM, XML 등 기존에 사용하던 여러 기술을 함께 사용하는 개발 기법이다.
- 빠르게 동작하는 동적인 웹 페이지 만들 때 사용
- 페이지 일부만 갱신해서 속도도 빠르다.
- JSON, XML, HTML 등 서버를 이용한다.

 

👩‍💻 장점

- 웹 페이지 일부만 갱신 가능하다. (서버에서 일부만 가져올 수 있다.)
- 백그라운드 영역에서 서버로 데이터를 보낼 수 있다.
- 비동기 통신을 사용함으로써 데이터를 보내고 나서도 사용자는 다른 작업이 가능하다.

 

👩‍💻 한계

- 클라이언트가 서버에 데이터를 요청하는 클라이언트 폴링 방식을 사용한다. 서버 푸시 방식의 실시간 서비스는 불가하다.
- 바이너리 데이터를 보내거나 받을 수 없다. (지금은 가능하다고 함)
- Ajax 스크립트가 포함된 서버가 아닌 다른 서버로 Ajax 요청을 보낼 수 없다.

 

클라이언트 폴링 방식 - 사용자가 직접 원하는 정보를 서버에 요청하는 방식
서버 푸시 방식 - 가만히 있는데 서버가 나한테 특정 정보를 제공하는 것을 의미한다.

 

✔️ 동작 원리

사전조건 : 이미 데이터를 불러온 상황
1. 자바스크립트 call 을 통해 서버에 요청 보냄
2. 서버에 요청 받은걸 가져옴
3. 해당 위치에 있는 부분만 갱신 가능
* 요청에 대한 응답이 돌아오지 않아도 대기 시간없이 다음 작업을 진행할 수 있으며, 요청 순서대로 응답되지 않는다. 

 

👩‍💻 핵심 구성요소는

XMLHttpRequest 객체

 

👩‍💻 주요 메소드

open()
send()
setRequestHeader()
등등

 

 

✔️ get 방식일 때

1. XMLHttpRequest 객체를 생성해야 ajax 를 사용 가능하다.

2. query 와 url 을 만들어야한다.

3. ajax 객체를 생성

4. 서버에서 처리하고 결과를 전송할 자바스크립트 함수를 지정한다. (callback 이라는 함수로 지정)

5. open - AJAX 요청의 형식을 설정, 여기서는 get 방식이기 때문에 get 방식을 쓰고 true 로 비동기 설정한다.

6. send 로 호출한 callback 이 받게 함

function createXMLHttpRequest() {
	let req = null;
	
	//아래 객체를 생성해야 ajax 사용 가능!
	try {
		req = new XMLHttpRequest();
	} catch (e) {
	}
	
	return req;
	
}

//전역변수
//전역변수로 잡아야 여러 함수들에서 사용 가능.
var httpReq = null;
//입력한 내용 모두 가져오기
//오퍼레이터는 encode 해줘야한다.
//쿼리 만들어서 url 만들기.
//실행되어도 get 방식인데 ex02_ok.jsp 보이진 않음
function sendOk() {
	let n1 = document.querySelector("#num1").value;
	let o = document.querySelector("#oper").value;
	let n2 = document.querySelector("#num2").value;
	
	let query = "num1="+n1+"&num2="+n2+"&oper="+encodeURIComponent(o);
	let url = "ex02_ok.jsp?"+query;
	
	//AJAX 객체 생성
	httpReq = createXMLHttpRequest();
	
	//서버에서 처리하고 결과를 전송할 자바스크립트 함수 지정
	//onreadystatechange : 처리한 결과를 돌려줄 때, 호출되는 함수가 callback 이다.
	httpReq.onreadystatechange = callback;
	
	//open - AJAX 요청의 형식을 설정
	//true : 비동기.
	httpReq.open("GET", url, true);
	
	//send
	//서버로 ex02 로 가서 연산한 결과를 호출된 callback이 받음 
	httpReq.send(null);
	
}

function callback(){
	if(httpReq.readyState === 4){ //요청상태 - 4:모든응답요청완료
		if(httpReq.status === 200){//서버로부터 전달받은 상태코드 - 200:성공(ok)
			printData();
		}
	}
}

function printData(){
				//서버가 던진 문서를 받아 text 텍스트를 받아 result에 저장
	let result = httpReq.responseText;
	
	document.querySelector("#resultLayout").innerHTML = result;
}


</script>

</head>
<body>

<div>
	<input type="text" id="num1">
	<select id="oper">
		<option value="+">더하기</option>
		<option value="-">빼기</option>
		<option value="*">곱하기</option>
		<option value="/">나누기</option>
		
	</select>
	<input type="text" id="num2">
	<button type="button" onclick="sendOk();"> = </button>
</div>
<hr>

<div id="resultLayout"></div>



</body>
</html>

 

 

✔️ post 방식일 때

post 방식일 때 다른점!

enctype 을 쓴다. 즉, 컨텐츠 타입을 설정해줘야한다.

httpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

 

send() 안에 null 이 아닌 파라미터 정보를 넘긴다 (query)

function createXMLHttpRequest() {
	let req = null;
	
	//아래 객체를 생성해야 ajax 사용 가능!
	try {
		req = new XMLHttpRequest();
	} catch (e) {
	}
	
	return req;
	
}

//전역변수
//전역변수로 잡아야 여러 함수들에서 사용 가능.
var httpReq = null;
//입력한 내용 모두 가져오기
//오퍼레이터는 encode 해줘야한다.
//쿼리 만들어서 url 만들기.
//실행되어도 get 방식인데 ex02_ok.jsp 보이진 않음
function sendOk() {
	let n1 = document.querySelector("#num1").value;
	let o = document.querySelector("#oper").value;
	let n2 = document.querySelector("#num2").value;
	
	let query = "num1="+n1+"&num2="+n2+"&oper="+encodeURIComponent(o);
	let url = "ex03_ok.jsp";
	
	//AJAX 객체 생성
	httpReq = createXMLHttpRequest();
	
	//서버에서 처리하고 결과를 전송할 자바스크립트 함수 지정
	//onreadystatechange : 처리한 결과를 돌려줄 때, 호출되는 함수가 callback 이다.
	httpReq.onreadystatechange = callback;
	
	//open - AJAX 요청의 형식을 설정
	//true : 비동기
	httpReq.open("POST", url, true);
	
	
	//post 방식에서 필수인 endctype 을 쓴다.
	//컨텐츠 타입을 설정해줘야한다.
	httpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	//post 는 send 한테 파라미터 정보를 넘긴다. 
	httpReq.send(query);
	
}

function callback(){
	if(httpReq.readyState === 4){ //요청상태 - 4:모든응답요청완료
		if(httpReq.status === 200){//서버로부터 전달받은 상태코드 - 200:성공(ok)
			printData();
		}
	}
}

function printData(){
				//서버가 던진 문서를 받아 text 텍스트를 받아 result에 저장
	let result = httpReq.responseText;
	
	document.querySelector("#resultLayout").innerHTML = result;
}

</script>

</head>
<body>

<h3> post 방식 </h3>

<div>
	<input type="text" id="num1">
	<select id="oper">
		<option value="+">더하기</option>
		<option value="-">빼기</option>
		<option value="*">곱하기</option>
		<option value="/">나누기</option>
		
	</select>
	<input type="text" id="num2">
	<button type="button" onclick="sendOk();"> = </button>
</div>
<hr>

<div id="resultLayout"></div>



</body>
</html>

 

 

✔️ XML 이용

function createXMLHttpRequest() {
	let req = null;
	
	//아래 객체를 생성해야 ajax 사용 가능!
	try {
		req = new XMLHttpRequest();
	} catch (e) {
	}
	
	return req;
	
}

var httpReq = null;
function sendOk(){
	let name = document.querySelector("#name").value;
	let content = document.querySelector("#content").value;
	
	let query = "name="+name+"&content="+content;
	let url = "ex04_ok.jsp";
	
	//AJAX 객체 생성
	httpReq = createXMLHttpRequest();
	
	//서버에서 처리하고 결과를 전송할 자바스크립트 함수 지정
	//onreadystatechange : 처리한 결과를 돌려줄 때, 호출되는 함수가 callback 이다.
	httpReq.onreadystatechange = callback;
	
	//open - AJAX 요청의 형식을 설정
	//true : 비동기
	httpReq.open("POST", url, true);
	
	
	//post 방식에서 필수인 endctype 을 쓴다.
	//컨텐츠 타입을 설정해줘야한다.
	httpReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	//post 는 send 한테 파라미터 정보를 넘긴다. 
	httpReq.send(query);	
}

function callback(){
	if(httpReq.readyState === 4){ //요청상태 - 4:모든응답요청완료
		if(httpReq.status === 200){//서버로부터 전달받은 상태코드 - 200:성공(ok)
			printData();
		}
	}
}

function printData(){
	//서버가 보낸 xml을 받아오는 것
	let xmlDoc = httpReq.responseXML;
	//console.log(xmlDoc);
	
	let root = xmlDoc.getElementsByTagName("guest")[0];
	let dataCount = xmlDoc.getElementsByTagName("dataCount")[0].firstChild.nodeValue;
	
	let out = "<p>전체데이터개수 : " + dataCount + "</p>";
	
	let records = root.getElementsByTagName("record");
	for(let i=0; i<records.length; i++){
		
		//안에 속성 가져오기 . item 으로
		let item = records[i];
		let num = item.getAttribute("num");
		let name = item.getElementsByTagName("name")[0].firstChild.nodeValue;
		let content = item.getElementsByTagName("content")[0].firstChild.nodeValue;
		
		out += "<p>번호:"+num+"<br>";
		out += "이름:"+name+"<br>";
		out += "내용:"+content+"</p><hr>";
		
		
	}
	
	document.querySelector("#resultLayout").innerHTML = out;

}


</script>

</head>
<body>

<h3> AJAX - POST XML 배우기!!!!! </h3>

<div>
	<p>이름 : <input type="text" id="name"></p>
	<p>내용 : <textarea rows="3" cols="50" id="content"></textarea>
	<p>
		<button type="button" onclick="sendOk();">보내기</button>
	</p>
</div>
<hr>

<div id="resultLayout"></div>



</body>
</html>

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기