본문 바로가기

개발 회고

[솔데스크] 풀스택 과정 15주-2 총64회차 ‘회고’ | AJAX(0312)

[서론]

○● 0312 새로웠던 것

1. @controller 어노테이션이 없으면 controller 역할을 하지 못함, 그냥 컨트롤러는 view를 반환함

2. @RestController

 JSON이나 XML 형식의 응답 반환

<< api 연동에 쓰면 됨. 얘가 json 내려주는 거.

3. js파일이나 css파일은 src>main>webapp>resources파일에 넣어둔다.

 

 

[본론]

○● 0312  내용 정리

 

  AJAX  

 

 AJAX란

 

Asynchronous(비동기적으로)

JavaScript

and

XML의 약어발음: 에이잭스

비동기적으로 서버와 통신하여 새로고침 없이 웹 페이지의 일부를 동적으로 업데이트하는 기술.

언어가 아님. js 에서 쓰는거. ( xxx.js 에 코딩해야함 )

최근 XML 대신 JSON을 사용하는 경우가 많아져 "AJAJ" 또는 "AJAX with JSON"이라는 용어도 사용.

todo: 최근에는 XMLHttpRequest보다 더 간편하고 강력한 "Fetch API"나 "Axios"와 같은 라이브러리를 사용하는 것이 더 일반적임

 

Ajax(Asynchronous JavaScript and XML)는 웹 애플리케이션에서 비동기적으로 서버와 통신하기 위한 기술이고, RESTController는 Spring 프레임워크에서 RESTful 웹 서비스를 만들기 위한 방법 중 하나입니다.

여기서 REST는 Representational State Transfer의 약어로, HTTP를 통해 자원을 처리하는 아키텍처 스타일입니다. RESTful 서비스를 구현할 때( Ajax를 사용하여 이러한 RESTful 서비스와 통신할 때 ), 요청 메서드(GET, POST, PUT, DELETE 등)를 사용하여 자원을 생성, 읽기, 갱신, 삭제하는 데 사용됩니다. 이러한 요청을 처리하기 위해 Spring 프레임워크에서는 @RestController 어노테이션을 사용하여 RESTful 서비스를 제공하는 컨트롤러 클래스를 정의할 수 있습니다.

간단한 예를 들어보겠습니다. 다음은 Spring에서 RESTful 서비스를 제공하는 컨트롤러의 예시입니다.

 

● AJAX 특징

 

synchronous(동기적)<--> Asynchronous(비동기적)

  1. 비동기적으로 통신한다.-> 새로고침 없이 동적으로 업데이트(뿅)하는 기술
  2. 언어가 아니다.
  3. 정의에도 나와있듯이 js에서 적용한다.
  4. 최근에는 XMLHttpRequest보다 더 간편하고 강력한 "Fetch API"나 "Axios"와 같은 라이브러리를 사용하는 것이 더 일반적

● 작동법

 

1. 객체 생성

var xhr =new XMLHttpRequest();

2. 요청 보내기

문을 여시오

xhr.open('get','http://example.com/data'); //get/post 방식과 요청 URL 설정하기

xhr.send();

3. 응답 받기

펑션 형식

xhr.onload=function(){

이 안에 실행될 내용 적기

if(xhr.status===200){-> 200이 일반적으로 통신이 성공했다는 숫자

console.log(xhr.responseText);

}

}

참고. POST 요청 보내기

xhr.open('POST', 'http://example.com/data'); // POST 요청 설정

xhr.setRequestHeader('Content-Type', 'application/json'); // 요청 헤더 설정

xhr.send(JSON.stringify({ data: 'example' })); // JSON 데이터 보내기

POST 요청을 보낼 때는

xhr.setRequestHeader() 메서드로 요청 헤더를 설정하고,

xhr.send() 메서드에 데이터를 전달합니다.

 

● 생성 객체

 
open(method, url, async)
서버와의 HTTP 연결을 열고 요청을 설정함.
method는 HTTP 요청 방식(GET, POST, PUT 등)을 지정하고, url은 요청을 보낼 서버의 URL 지정. async는 비동기 여부를 지정.
setRequestHeader(name, value)
HTTP 요청에 헤더 정보를 추가합니다. name은 헤더 이름을, value는 헤더 값(value)을 지정합니다.
send(data)
HTTP 요청을 서버로 보냅니다. data는 HTTP 요청에 함께 보낼 데이터를 지정합니다.
abort()
HTTP 요청을 취소합니다.
getResponseHeader(name)
HTTP 응답에 포함된 헤더 정보를 가져옵니다. name은 가져올 헤더의 이름을 지정합니다.
getAllResponseHeaders()
HTTP 응답에 포함된 모든 헤더 정보를 가져옵니다.
onreadystatechange
HTTP 요청의 상태가 변경될 때 호출될 이벤트 핸들러를 지정합니다. 이벤트 핸들러는 readyState 속성이 변경될 때마다 호출됩니다.
readyState
객체의 상태를 나타내는 속성으로, 0~4의 값을 가집니다. 0은 초기화되지 않은 상태, 1은 서버와의 연결이 설정된 상태, 2는 요청이 받아들여진 상태, 3은 요청 처리 중인 상태, 4는 요청이 완료된 상태를 의미합니다.
status
HTTP 응답의 상태 코드를 나타내는 속성입니다. 예를 들어, 200은 성공적으로 처리되었음을 나타냅니다.

 

AJAX에서의 get방식과 post방식의 차이

 

● 작업 파일

 

 ApiCatController.java

package com.peisia.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.peisia.dto.Cat;

@RequestMapping("/api/*")
@RestController
public class ApiCatController {
	@GetMapping("/catOne")
	public Cat getCatOne() {
		Cat cat = new Cat();
		cat.setName("야옹이");
		cat.setAge(5);

		// 이렇게 객체를 리턴하면 json 이 객체 구조로 해서 자동으로 출력됨.
		// 즉, 이 주소로 api 요청을 하면
		// 고양이 이름, 나이 json을 받아갈 수 있게 되는 것.
		return cat;
	}

	@GetMapping("/catTwo")
	public Cat getCatTwo() {
		Cat cat = new Cat();
		cat.setName("떼껄룩");
		cat.setAge(10);
		return cat;
	}

	@GetMapping("/hamster")
	public Cat getCatThree() {
		Cat cat = new Cat();
		cat.setName("햄쮜");
		cat.setAge(29);
		return cat;
	}
}

 

AjaxController.java

package com.peisia.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/ajax/*")
public class AjaxController {
	@GetMapping("/cat")
	public void cat() {

	}
}

 

testapi.js

window.onload=function(){
	var cat1_area = document.getElementById("cat1_area");
	var cat2_area = document.getElementById("cat2_area");
					
	var xhr = new XMLHttpRequest();				
	var a = document.getElementById("cat1");				
	a.addEventListener("click", function() {				
		xhr.open('GET', '/api/catOne'); // HTTP 메서드와 요청 URL 설정. todo: 현 컨텍스트path에 맞춰 수정할 것			
		xhr.send(); // 요청 보내기			
		xhr.onload = function() {			
			if (xhr.status === 200) { // 응답 상태 확인		
				console.log(xhr.responseText); // 응답 데이터 출력	
				alert(xhr.responseText);
				cat1_area.innerHTML = xhr.responseText;	
			} else {		
				console.error(xhr.statusText); // 오류 메시지 출력	
			}		
		};			
	});				
	var b = document.getElementById("cat2");				
	b.addEventListener("click", function() {				
		xhr.open('GET', '/api/catTwo'); // HTTP 메서드와 요청 URL 설정. todo: 현 컨텍스트path에 맞춰 수정할 것			
		xhr.send(); // 요청 보내기			
		xhr.onload = function() {			
			if (xhr.status === 200) { // 응답 상태 확인		
				var jo = JSON.parse(xhr.responseText);	
				var s = "고양이름:"+jo.name+" 고양이나이:"+jo.age;	
				alert(s);	
				cat2_area.innerHTML = s;
			} else {		
				console.error(xhr.statusText); // 오류 메시지 출력	
			}		
		};			
					
	});
	var c = document.getElementById("cat3");				
	c.addEventListener("click", function() {				
		xhr.open('GET', '/api/hamster'); // HTTP 메서드와 요청 URL 설정. todo: 현 컨텍스트path에 맞춰 수정할 것			
		xhr.send(); // 요청 보내기			
		xhr.onload = function() {			
			if (xhr.status === 200) { // 응답 상태 확인		
				console.log(xhr.responseText); // 응답 데이터 출력	
				alert(xhr.responseText);
				cat3_area.innerHTML = xhr.responseText;	
			} else {		
				console.error(xhr.statusText); // 오류 메시지 출력	
			}		
		};			
	});					
}

 

cat.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 0. 웹 애플리케이션의 루트 경로(컨텍스트 경로) 를 가져와서 링크에 다 연결해줘야 함     -->
<!-- 1. 0을 위한 준비. jstl core 태그 선언     -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 2. 0을 위한 준비. el 태그로 가져올 수 있는데 이걸 더 짧게 찍기위해 변수 대입함.     -->    
<c:set var="cp" value="${pageContext.request.contextPath}" />
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="${cp}/resources/testapi.js"></script>
</head>
<body>
ajax api 테스트
<hr>

<button id="cat1">삵</button>
<div id="cat1_area"></div>

<button id="cat2">칡</button>
<div id="cat2_area"></div>

<button id="cat3">햄스터</button>
<div id="cat3_area"></div>

</body>
</html>

 

home.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<meta charset="UTF-8">
<%-- <%@ page session="false" %> --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="cp" value="${pageContext.request.contextPath}" />
<html>
<head>
<title>Home</title>
<script
	src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="${cp}/resources/testapi"></script>
</head>
<body>
	<h1>Hello world!</h1>

	<P>The time on the server is ${serverTime}.</P>
	<a href="/test/getOnePlusTwo">1+2 결과 보러 가기</a>
	<a href="${cp}/guest/getList">[방명록]</a>
	<a href="${cp}/guest/write">새글 쓰기</a>
	<a href="${cp}/weather/weatherList">우리나라 날씨</a> 어제의 날씨입니다~ 어제
	${location} 의 최저기온은 ${tMin} 도 최고 기온은 ${tMax} 였습니다. 날씨였습니다.

	<button onclick="showCat()">고양이를 보자</button>

	<div>
		<img id="img-cat">
	</div>
	<hr>
	<a href="${cp}/air/atmosphere">대기농도</a>
	<hr>
	<a href="${cp}/guest/seoulPharmacy">한국 약국</a>

	<%-- 	 <a href="${cp}/guest/culture">문화</a> --%>

	<a href="${cp}/animal/animalForest">동숲</a>

	<a href="${cp}/api/catOne">야옹이1</a>
	<a href="${cp}/api/catTwo">야옹이2</a>
	<a href="${cp}/api/hamster">햄쮜</a>
	<a href="${cp}/ajax/cat">야옹이 떼껄룩</a>

	<script>
	
	 function showCat() {
         $.ajax({
             type: "GET",
             url: "https://api.thecatapi.com/v1/images/search",
             data: {},
             success: function (response) {
                 let imgUrl = response[0]['url'];
                 $("#img-cat").attr("src", imgUrl);
             }
         })
     }
	</script>
</body>
</html>

 

● fetch api 사용 예시 

위에가 초간단형 예시 아래는 좀 더 내용이 있는 예시

 

// GET 요청 보내기
fetch('https://api.example.com/data')
  .then(response => {
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json(); // JSON 형식으로 데이터 읽어오기
  })
  .then(data => {
    console.log(data); // 받은 데이터 출력
  })
  .catch(error => {
    console.error('Error fetching data:', error);
  });

// POST 요청 보내기
fetch('https://api.example.com/data', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({ name: 'John', age: 30 }) // JSON 형식의 데이터 전송
})
.then(response => {
  if (!response.ok) {
    throw new Error('Network response was not ok');
  }
  return response.json(); // JSON 형식으로 받은 응답 읽어오기
})
.then(data => {
  console.log(data); // 받은 응답 데이터 출력
})
.catch(error => {
  console.error('Error posting data:', error);
});

 

● axios 사용 예시 

import axios from 'axios';

// GET 요청 보내기
axios.get('https://api.example.com/data')
  .then(response => {
    console.log(response.data); // 서버로부터 받은 데이터 출력
  })
  .catch(error => {
    console.error('Error fetching data:', error);
  });

// POST 요청 보내기
axios.post('https://api.example.com/data', { name: 'John', age: 30 })
  .then(response => {
    console.log(response.data); // 서버로부터 받은 응답 출력
  })
  .catch(error => {
    console.error('Error posting data:', error);
  });

 

 

[결론]

 

* AJAX 기초 강의 수강

 

*작업파일

 

0312

1)   AJAX 기초