74일차
전체 페이지를 로딩하는 것이 아니라 필요한 부분만 데이터를 주고받을 수 있다.
XMLHttpRequest객체 사용햇기때문에 xhr
fetch API, XHR직접사용, JQUERY라이브러리로 쉽게 사용하는 방법 등등이 잇다.
@ResponseBody로 데이터만 주기
$.ajax()
클라이언트와 서버가 페이지 로딩없이 주고받기
44. ajax 요청
크게 두가지 파라미터 url과 settings를 받는다.
또다른 방법은 파라미터를 settings만 넣는 것도있다.
settings를 잘 세팅하면 get방식 post방식 묶어보내기 등등이 가능하다.
두번째 버튼을 클릭하면 method2가 일할 수 있도록하기
<div>
<button id="button2">get요청 /link2로</button>
</div>$("#button2").click(function(){
$.ajax("/sub34/link2");
})@GetMapping("link2")
public void method2() {
System.out.println("get 요청 link2");
}44.1 부가적인정보
get방식 요청시 부가적인 정보를 보낼 수 잇엇다.
쿼리스트링으로 붙여서 보내는 것을 활용하는 것이다.
$("#button3").click(function(){
$.ajax("/sub34/link3?name=son");
})@GetMapping("link3")
public void method3(@RequestParam("name") String name) {
System.out.println("link3 메소드가 일함");
System.out.println("name: " + name);
}44.2 requestparam-2
$("#button4").click(function(){
$.ajax("/sub34/link4?address=고양시");
})@GetMapping("link4")
public void method4(String address) {
System.out.println("link4 메소드가 일함");
System.out.println("address: " + address);
}2가지 이상의파라미터를 받아보자
$("#button6").click(function(){
$.ajax("/sub34/link6?food=밥&price=1000");
})@GetMapping("link6")
public void method6(String food, Double price) {
System.out.println("link6 메소드가 일함");
System.out.println("food: " + food);
System.out.println("price: " + price);
}44.3 model attribute
하나씩 받아도되지만 javabean으로 받아도된다.
@Data
class Dto1 {
private String address;
private String name;
private Integer age;
}@GetMapping("link7")
public void method7(@ModelAttribute Dto1 dto) {
System.out.println(dto);
}$("#button7").click(function(){
$.ajax("/sub34/link7?address=seoul&name=park&age=33");
})연습
@Data
class Dto2 {
private Double price;
private String prodcut;
private String category;
}@GetMapping("link8")
public void method8(Dto2 dto) {
System.out.println(dto);
}$("#button8").click(function(){
$.ajax("/sub34/link8?price=10000&prodcut=house&category=5");
})45. post
post로 보내고 싶다면 두번째 파라미터인 settings를 잘 작성하면된다.
settings는 js객체이다.
자바스크립트의 객체는 {키:밸류} 키밸류쌍으로 작성하면된다.
키에는 accepts, type등등이 있다
type의 타입은 String이고 메소드(method)의 별칭이다. 기본값은 GET이고 post put get같은 값을 넣을 수있다.
$("#button1").click(function(){
$.ajax("sub35/link1", {method:"post"});
})@PostMapping("link1")
public void method1() {
System.out.println("포스트 요청 잘 받음");
}45.1 post - 1 연습
@PostMapping("link2")
public void method2() {
System.out.println("메소드2 일함");
}$("#button2").click(function() {
$.ajax("/sub35/link2", { method: "post" });
})45.2 post
get방식은 쿼리스트링으로 요청을 보내는데
post방식도 쿼리 스트링으로 받는 것은 가능하다.
하지만 post방식은 쿼리스트링에 붙여보내는게 아니라 몸통에 붙여보내야한다.
data 키에 담아서 보내면된다. data는 서버로 보내는 데이터이다.
@PostMapping("link3")
public void method3(String name) {
System.out.println("name: " + name);
}$("#button3").click(function() {
$.ajax("/sub35/link3", {
method: "post",
data: "name=손"
});
})45.3 post 연습
link로 address requestparam받기
@PostMapping("link4")
public void method4(String address, Double price) {
System.out.println("address: " + address);
System.out.println("price: " + price);
}$("#button4").click(function() {
$.ajax("/sub35/link4", {
method: "post",
data: "address=고양시&price=99.77"
});
})45.4 dto post
@Data
static class Dto1 {
private String name;
private Double score;
private String email;
}@PostMapping("link5")
public void method5(Dto1 dto) {
System.out.println(dto);
}$("#button5").click(function() {
$.ajax("/sub35/link5", {
method: "post",
data: "name=발&score=7.5&email=val@google.com"
});
})연습
@Data
static class Dto2 {
private String address;
private String product;
private Double price;
}@PostMapping("link6")
public void method6(Dto2 dto) {
System.out.println(dto);
}$("#button6").click(function() {
$.ajax("/sub35/link6", {
method: "post",
data: "address=고양시&product=house&price=10000"
});
})46 ajax - JSON
AJAX의 태생은 XML데이터를 주고 받기 위한 것이었는데 XML을 사용하지 않게되어
JSON데이터를 주고 받는 역할을 하게 되었다.
그럼 JSON형식의 데이터는 무엇인가
https://www.oracle.com/kr/database/what-is-json/
JSON은 JavaScript 객체 리터럴, 배열, 스칼라 데이터를 표현하는 텍스트 기반의 방식이다.
즉 JSON은 텍스트이다.
JSON은 상대적으로 쉽게 읽고 작성할 수 있고, 소프트웨어에서 파싱 및 생성하기도 쉽다.
JSON은 JavaScript Object Notation(JSON) 자바스크립트 객체 형식으로 되어있다.
JSON은 {"프로퍼티": "값"} 으로 이루어진다. 여러 property는 ,로 구분한다.
46.1 JSON - 1
data키를 json형식으로 보내는 것이다.
서버에게 보내는 데이터가 json형식임을 알려줘야한다.
contentType키를 설정하면된다.
request header의 Content-Type을 JSON으로 보냈음을 인식하게 해줘야한다.
@PostMapping("link7")
public void method7() {
System.out.println("메소드7 실행됨");
}$("#button7").click(function() {
$.ajax("/sub35/link7", {
method: "post",
data: '{"name":"son"}',
contentType : "application/json"
});
})46.2 JSON - 2
컨트롤러에서 받는법은 @RequestBody 어노테이션을 붙이면된다.
@RequestBody Map이나 @RequestBody javaBean으로 받는다.
자바 map이 키=밸류이기때문에 map으로 받을 수 있는 것이다.
@PostMapping("link8")
public void method8(@RequestBody Map data) {
System.out.println(data.get("address"));
System.out.println(data.get("name"));
}$("#button8").click(function() {
$.ajax("/sub35/link8", {
method: "post",
contentType: "application/json",
data: '{"address":"고양시", "name":"박지성"}'
});
})연습
@PostMapping("link9")
public void method9(@RequestBody Map data) {
System.out.println(data.get("age"));
System.out.println(data.get("name"));
System.out.println(data.get("married"));
}$("#button9").click(function() {
$.ajax("/sub35/link9", {
method: "post",
contentType: "application/json",
data: '{"age":26, "name":"park", "married": false}'
});
})46.3 JSON - 3
JSON 데이터 유형은 문자열, 숫자, boolean, Null, 객체, 배열이 있다.
객체 "프로퍼티" : {"프로퍼티":"값", "프로퍼티":"값"}
프로퍼티안에 프로퍼티:값들이 들어가게 할 수 있다.
배열 "프로퍼티" : ["값1", "값2"] 여러개의 값을 보낼 수 있다.
스프링이 알아서 값을 변환해서 까지 넣어준다.
// {"age":26, "name":"park", "married": false}
@PostMapping("link9")
public void method9(@RequestBody Map data) {
System.out.println(data.get("age").getClass().getSimpleName()); //Integer
System.out.println(data.get("name").getClass().getSimpleName()); //String
System.out.println(data.get("married").getClass().getSimpleName()); //Booelan
}46.4 JSON - 4
JSON을 굳이 타입을 적어준다면 프로퍼티는 String이고 값은 여러타입이 올 수 있으니
Map<String, Object> map 으로 받아야한다.
null 값의 json 데이터 전송을 해보자.
$("#button10").click(function() {
$.ajax("/sub35/link10", {
method: "post",
contentType: "application/json",
data: '{"address" : null, "age" : 30, "name":"손흥민"}'
});
})@PostMapping("link10")
public void method10(@RequestBody Map<String, Object> map) {
System.out.println(map.get("address")); //null
System.out.println(map.get("name")); //30
System.out.println(map.get("age")); //손흥민
}46.4 JSON - 5
객체를 전달해보자. 프로퍼티의 값에 프로퍼티:값형식인 객체가 들어가는 것이다.
map에 또다른 map이 들어가게 된다.
데이터를 활용하려면 map으로 받아서 사용해야한다.
잘 일어나지 않는다. 결론은 어떤 property의 값이 객체가 될 수 있다는 것만 알아두자.
$("#button11").click(function() {
$.ajax("/sub35/link10", {
method: "post",
contentType: "application/json",
data: '{"book": {"title":"java", "price":300}, "address":"seoul"}'
});
})@PostMapping("link11")
public void method11(@RequestBody Map<String, Object> map) {
System.out.println(map); //{book={title=java, price=300}, address=seoul}
System.out.println(map.get("book").getClass().getSimpleName()); //LinkedHashMap
Map<String, Object> book = (Map<String, Object>) map.get("book");
System.out.println(book.get("title")); //java
System.out.println(book.get("price")); //300
}46.5 JSON - 6
배열의 json을 받아보자.
property의 값이 배열형식으로 들어가게된다.
배열로 오면 List로 받으면된다.
$("#button12").click(function() {
$.ajax("/sub35/link12", {
method: "post",
contentType: "application/json",
data: '{"food" : ["pizza", "coke", "coffee"]}, "store" : "피자스쿨"'
});
})@PostMapping("link12")
public void method12(@RequestBody Map<String, Object> map) {
System.out.println(map);
ArrayList<Object> list = (ArrayList<Object>) map.get("food");
for (Object food : list) {
System.out.println(food);
}
}46.6 JSON-7
["pizza", "coke", "coffee"]의 형태로 값을 보낼수도 있는데 LIST로 받으면된다.
$("#button13").click(function() {
$.ajax("/sub35/link13", {
method: "post",
contentType: "application/json",
data: '["pizza", "coke", "coffee"]'
});
})@PostMapping("link13")
public void method13(@RequestBody List<String> list) {
System.out.println(list);
}46.7 JSON-8
각 배열안에 각 객체가 들어갈 경우
[{"name":"강백호", "pos":"파포"}, {"name":"서태웅", "pos":"스포"}]
List의 아이템이 Map이 되는 것이다.
$("#button14").click(function() {
$.ajax("/sub35/link14", {
method: "post",
contentType: "application/json",
data: '[{"name":"강백호", "pos":"파포"}, {"name":"서태웅", "pos":"스포"}]'
});
})@PostMapping("link14")
public void method14(@RequestBody List<Map<String, Object>> data) {
System.out.println(data);
}47. JSON.stringify()
JSON을 만들때 스트링으로 직접 작성하는 일은 없다.
특정데이터를 JSON으로 변환해서 사용한다.
즉 객체를 미리 만들어두고 JSON으로 변환해서 사용하게 된다.
자바스크립트의 JSON.stringify()메소드로 자바스크립트 값이나 객체를 json문자열로 변환해준다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify
이전에 작성한 것들을 변환해보자.
$("#button7").click(function() {
const obj = {name :"son"};
$.ajax("/sub35/link7", {
method: "post",
data: JSON.stringify(obj),
contentType: "application/json"
});
})$("#button8").click(function() {
const data = {
address: "고양시",
name: "박지성"
};
$.ajax("/sub35/link8", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})$("#button12").click(function() {
const data = {
food: [
"pizza",
"coke",
"coffee"
],
store: "피자스쿨"
}
$.ajax("/sub35/link12", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
//data: '{"food" : ["pizza", "coke", "coffee"]}, "store" : "피자스쿨"'
});
})$("#button13").click(function() {
const data = ["pizza", "coke", "coffee"];
$.ajax("/sub35/link13", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})$("#button14").click(function() {
const data = [
{ "name": "강백호", "pos": "파포" },
{ "name": "서태웅", "pos": "스포" }
]
$.ajax("/sub35/link14", {
method: "post",
contentType: "application/json",
data : JSON.stringify(data)
});
})48. @RequestBody javaBean
스프링이 어노테이션을 보고 json형식의 데이터를 알아서 파싱해서
같은 이름의 property를 찾아서 타입변환까지 해서 javaBean에 넣어준다.
@Data
static class Dto1 {
private String name;
private Integer age;
}@PostMapping("link1")
public void mehtod1(@RequestBody Dto1 dto) {
System.out.println(dto);
}$("#btn1").click(function() {
const obj = {
name: "정대만",
age: 40
}
$.ajax("/sub36/link1", {
method: "post",
contentType: "application/json",
data: JSON.stringify(obj)
});
})48.1 @RequestBody javaBean-2
@Data
static class Dto2 {
private String name;
private String email;
private Double score;
private Boolean married;
}@PostMapping("link2")
public void mehtod2(@RequestBody Dto2 dto) {
System.out.println(dto);
}$("#btn2").click(function() {
const obj = {
name: "park",
email: "park@naver.com",
score: "90.98",
married : false
};
$.ajax("/sub36/link2",{
method : "post",
contentType : "application/json",
data: JSON.stringify(obj)
});
})48.2 @RequestBody javaBean-3
객체와 배열이 있는 json을 javaBean으로 받아보자.
배열은 역시나 List로 받으면된다.
@Data
static class Dto3 {
private String name;
private List<String> hobby;
}@PostMapping("link3")
public void mehtod3(@RequestBody Dto3 dto) {
System.out.println(dto);
}$("#btn3").click(function() {
const data = {
name: "태웅",
hobby: [
"독서",
"농구",
"음악감상"
]
};
$.ajax("/sub36/link3", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})48.3 @RequestBody javaBean-4
컨트롤러를 보고 예측해서 작성하기
@PostMapping("link4")
public void mehtod4(@RequestBody Dto4 dto) {
System.out.println(dto.getPhone.get(2)); //값 출력
}@Data
static class Dto4{
private List<String> phone;
}$("#btn4").click(function(){
const data = {
phone : [
"갤럭시",
"아이폰",
"LG"
]
}
$.ajax("/sub36/link4", {
method :"post",
contentType : "application/json",
data: JSON.stringify(data)
});
})48.4 @RequestBody javaBean-5
JSON의 값이 객체가 될 수 있다.
객체는 두가지 방법 Map이나 javaBean으로 받으면된다.
$("#btn5").click(function(){
const data = {
title : "java",
publisher : "한빛",
writer : {
name: "정대만",
age : 44
}
}
$.ajax("/sub36/link5", {
method :"post",
contentType : "application/json",
data: JSON.stringify(data)
});
})@Data
static class Dto5 {
private String title;
private String publisher;
private Map<String, Object> writer;
//private Writer writer;
}@Data
static class Dto1 {
private String name;
private Integer age;
}@PostMapping("link5")
public void mehtod5(@RequestBody Dto5 dto) {
System.out.println(dto); // 값 출력
}48.5 @RequestBody javaBean-6 연습
컨트롤러를 보고 다른 코드 작성하기
@PostMapping("link6")
public void mehtod6(@RequestBody Dto6 dto) {
System.out.println(dto); // 값 출력
}@Data
static class Dto6 {
private String city;
private Integer price;
private Dto2 etc;
}$("#btn6").click(function() {
const data = {
city: "고양시",
price: 10000,
etc: {
name: "park",
email: "park@gmail.com",
score: 99.9,
married: false
}
}
$.ajax("/sub36/link6", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})48.6 @RequestBody javaBean-7 연습
Dto1타입을 item으로 가지고 있는 List출력하기
객체들의 배열로 보내야한다.
@PostMapping("link7")
public void mehtod7(@RequestBody List<Dto1> dto) {
dto.forEach(System.out::println);
}$("#btn7").click(function() {
const data = [
{
name: "park",
age: 26
},
{
name: "can",
age: 1700
},
{
name: "uni",
age: 4
}
]
$.ajax("/sub36/link7", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})49. input element
객체를 만들때 값을 직접 넣어보았는데 input element로 값을 넣어서 보내보자.
<input type="text" id="inputName" placeholder="이름" />
<br />
<input type="text" id="inputAge" placeholder="나이" />
<br />
<button id="btn8">input 전송</button>$("#btn8").click(function() {
const name = $("#inputName").val();
const age = $("#inputAge").val();
const data = {
name : name,
age : age
};
$.ajax("/sub36/link1", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})49.1 input element- 2
@PostMapping("link2")
public void mehtod2(@RequestBody Dto2 dto) {
System.out.println(dto);
}$("#btn9").click(function() {
const name = $("#inputName").val();
const email = $("#inputEmail").val();
const score = $("#inputScore").val();
const married = $("#inputMarried").val();
const data = {
name : name,
email : email,
score : score,
married : married
}
$.ajax("/sub36/link2", {
method: "post",
contentType: "application/json",
data: JSON.stringify(data)
});
})client -> ajax request(json) ->server
client <- ajax response(json) <-server
2023.05.11
ajax의 값을 받아오는 방법을 배운다.
값을 받아와서 서비스에게 넘겨주고 mapper가 일을 하는 모습은 그려진다.
이것을 다시 response해서 view에 보여주는 방법을 배우면 사용법을 더 잘 이해할 것 같다.
'국비 > Project - 1 게시판' 카테고리의 다른 글
| 2023.05.15 76일차 Project (0) | 2023.05.16 |
|---|---|
| 2023.05.12 75일차 Project (0) | 2023.05.12 |
| 2023.05.10 73일차 Project (0) | 2023.05.11 |
| 2023.05.09 72일차 Project (0) | 2023.05.09 |
| 2023.05.08 71일차 Project (0) | 2023.05.09 |