http://localhost:8080/lang/variable/exam4/test1.html
서버에 요청하는 순간 URL 주소가 바뀐다.
생략가능함
<form action="http://localhost:8080/lang/variable/exam4/test1">
http://localhost:8080
생략 가능함
<form action="lang/variable/exam4/test1">
lang 앞에 /
빼면 상대 경로가 되어 버린다. 현재 경로를 기준으로 한다.
서버에서 받아 온 최초 소스를 보고 싶으면 "페이지 소스 보기"
현재 웹 페이지 태그 상태를 보고 싶으면 "개발자 도구 - Elements 탭"
html의 위치는 exam4 방에 들어있다. 현재 위치는 exam4
↑ 현재 위치를 기준으로 되어 버림
<form action="/lang/variable/exam4/test1">
lang 앞에 /
붙이기
절대 경로
서버 루트 = http://localhost:8080
서버에서 바뀐 걸 다시 받아오려면 새로고침
1) 서버 렌더링 : 서버에서 HTML을 만들어 웹 브라우저에게 보내주는 것
스프링 부트가 Exam4 호출
Exam4 test1() 작업을 수행한 다음 웹 브라우저가 출력할 HTML을 생성
HTML을 리턴
스프링 부트가 HTML을 웹 브라우저에게 응답
⑥ 웹 브라우저는 서버가 보내준 HTML을 출력
현업에 가면 서버 렌더링 방식이 90%
// 변수 활용
package com.eomcs.study.lang.variable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController("lang.variable.exam4") // 클래스 이름이 같은 경우 충돌 방지
@RequestMapping("/lang/variable/exam4")
public class Exam4 {
@GetMapping("/test1")
public String test1(int v1, int v2, String op) {
int result = 0;
switch (op) {
case "+": result = v1 + v2; break;
case "-": result = v1 - v2; break;
case "*": result = v1 * v2; break;
case "/": result = v1 / v2; break;
case "%": result = v1 % v2; break;
default: return "해당 연산을 수행할 수 없습니다.";
}
// 이렇게 서버에서 웹 브라우저가 출력할 화면을
// HTML로 만들어 클라이언트로 보내는 것을
// "서버측 렌더링(server-side rendering)"이라 부른다.
String html = "<!DOCTYPE html>"
+ "<html>"
+ "<head>"
+ "<meta charset=\"UTF-8\">"
+ "<title>변수 활용</title>"
+ "</head>"
+ "<body>"
+ "<h1>계산 결과</h1>"
+ "<p>" + v1 + " " + op + " " + v2 + " = " + result + "</p>"
+ "</body>"
+ "</html>";
return html;
}
}
너무 불편한데요...
UI 템플릿
뷰 템블릿
Thymeleaf, JSP
2) 클라이언트 측 렌더링
① 웹 브라우저에서 test2 요청
② Spring Boot에서 test2() 호출
③ 작업 수행
④ 결과값을 리턴
⑤ 결과값 응답
⑥ 서버가 보낸 결과값을 가지고 HTML을 생성/변경/삭제해서 화면 출력
클라이언트측 렌더링
wrapper class
하나의 function으로 묶는다.
다시 이 function을 class로 묶는다.
다시 이 class를 package에 둔다.
⟹ 코드 관리가 쉽도록 코드를 묶고 분류한다.
자바에서는 method라고 부른다.
java.lang.Integer.
java 라는 패키지 밑에 lang이라는 패키지 밑에 Integer
int 값을 주면 String
toString = 기능명 = function = method
기능을 수행하는 데 필요한 값을 받을 변수 = 파라미터(parameter)
넘겨주는 값 = argument
기능을 수행한 후 리턴하는 값의 타입 = 리턴 타입
UML 표기법에
UML(Unified Modeling Language) : 통합된 표기법
분석/설계에 대한 내용을 글과 그림으로 표현한 것
// 자바 코드
String toString(int i) {...}
리턴 타입 파라미터
// UML 표기법
toString(i : int) : String
// 이클립스 : UML에 흡사하게 표현. 완벽한 UML 아님.
toString(int i) : String
파라미터 리턴 타입
변수
int i
→ i: int
(UML 표기법)
java.lang 패키지에 소속된 클래스를 사용할 때는 패키지명 생략 가능
java.lang 패키지 한정!!!
원래는 다 적어야 됨. 다른 건 안 됨!!!
http://localhost:8080/lang/variable/exam4/test2.html
↓ 서버에서 보낸 건 300이라는 문자열 밖에 없음
웹 브라우저가 최소 기본 틀을 만들어서 출력
웹 브라우저가 알아서 html 최소 세팅을 한 거
클라이언트 측 렌더링은 서버가 보낸 결과값을 가지고 HTML을 생성, 변경, 삭제해서 화면 출력! 자바스크립트가 동원되어야 함.
test2.html
웹 브라우저 할 일이 아니다. 별도로 자바스크립트로 제어할 거다.
test2.html에서는 script 태그 필요함
<script>
// 버튼을 클릭하면 웹 브라우저에서 별도의 요청을 수행한다.
// 1) 버튼을 클릭했을 때 수행할 작업을 등록한다.
var xBtn = document.querySelector("#x-btn");
버튼.onclick = function() {
};
</script>
자바는 이름 지을 때 firstName
자바스크립트에서 id를 지정할 때 단어와 단어 사이를 -
로 연결
자바스크립트도 변수 이름에는 -
못 적음. 자바처럼 firstName
형식으로 함
버튼에 id 주기
id="x=btn"
<button type="button" id="x=btn">=</button>
button의 type이 기본이 submit임
<button type="submit"></button>
버튼을 클릭하면 액션을 수행하게 되어 있음
우리는 지금 액션은 자바스크립트에서 따로 할 거니까
일반 버튼으로 가만히 있어
누르면 함수나 호출해
type을 따로 지정해주지 않으면 submit 버튼이 기본이 됨
submit 버튼을 누르면 form에 등록된 action URL을 요청한다.
action을 지정하지 않았는데요?
action을 지정하지 않으면 서버에 현재 URL을 요청한다.
주소창 보면 주소 바뀌어 있음
test2.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>계산기 : client-side rendering</h1>
<form>
<input type="text" name="v1">
<select name="op">
<option>+</option>
<option>-</option>
<option>*</option>
<option>/</option>
<option>%</option>
</select>
<input type="text" name="v2">
<button type="button" id="x-btn">=</button>
</form>
<script>
// 버튼을 클릭하면 웹 브라우저에서 별도의 요청을 수행한다.
// 1) 버튼을 클릭했을 때 수행할 작업을 등록한다.
var xBtn = document.querySelector("#x-btn");
xBtn.onclick = function() {
console.log("okok!");
};
</script>
</body>
</html>
type="submit"
클릭하면 서버에 요청해서 html을 받아옴
type="button"
의 경우는 서버에 요청하지 않음. 등록된 함수가 호출되고 Console에 결과가 찍힘.
버튼을 누르면 onclick으로 등록된 함수가 호출이 되는 거
호출될 함수를 onclick이라는 이름으로 버튼에 등록하는 거
함수 호출되는 거 확인했음!
XMLHttpRequest
https://developer.mozilla.org/ko/docs/Web/API/XMLHttpRequest
XMLHttpRequest(XHR) 객체는 서버와 상호작용하기 위하여 사용됩니다.
전체 페이지의 새로고침 없이도 URL로부터 데이터를 받아올 수 있습니다.
이는 웹 페이지가 사용자가 하고 있는 것을 방해하지 않으면서 페이지의 일부를 업데이트할 수 있도록 해줍니다. XMLHttpRequest는 AJAX 프로그래밍에 주로 사용됩니다.
서버에 요청할 때 사용할 도구를 준비한다.
// 서버에 요청할 때 사용할 도구를 준비한다.
var xhr = new XMLHttpRequest();
서버에서 응답을 받았을 때(load 이벤트) 호출될 함수를 등록한다.
xhr.addEventListener(이벤트명, 호출될 함수);
xhr.addEventListener("load", function() {});
// 서버에서 응답을 받았을 때(load 이벤트 발생) 호출될 함수를 등록한다.
xhr.addEventListener("load", function() {
console.log("서버에서 응답 받았음!");
});
XMLHttpRequest(XHR) : 서버에 요청할 때 사용할 도구
서버와 연결한다.
XMLHttpRequest.open()
https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/open
// 서버 요청에 필요한 URL 정보를 설정한다.
xhr.open(
"get", // HTTP 요청 방식
"/lang/variable/exam4/test2?v1=100&v2=200&op=-", // 요청 URL
true); // 비동기 여부 지정
비동기 여부
이 값이 false이면 send() 응답을 받을 때까지 메서드가 반환되지 않습니다.
서버에 요청 정보를 보낸다.
// 서버에 요청 정보를 보낸다.
xhr.send();
서버에 요청 정보를 보내고 서버에서 응답이 오면
xhr.addEventListener("load", function() {});
가 호출된다.
@GetMapping("/test2")
public Object test2(int v1, int v2, String op) {
int result = 0;
switch (op) {
case "+": result = v1 + v2; break;
case "-": result = v1 - v2; break;
case "*": result = v1 * v2; break;
case "/": result = v1 / v2; break;
case "%": result = v1 % v2; break;
default: return "해당 연산을 수행할 수 없습니다.";
}
return result;
addEventListener
: 어떤 이벤트가 발생했을 때 호출할 함수를 브라우저에게 등록하는 거
"load" 라는 이벤트는 서버에서 응답이 왔을 때 발생
https://developer.mozilla.org/ko/docs/Web/API/XMLHttpRequest
무조건 주고 받는 건 문자열
// 서버에서 응답을 받았을 때(load 이벤트 발생) 호출될 함수를 등록한다.
xhr.addEventListener("load", function() {
console.log(xhr.responseText);
});
// 입력폼의 각 태그를 찾는다.
var xV1 = document.querySelector("input[name='v1']");
var xV2 = document.querySelector("input[name='v2']");
var xOp = document.querySelector("select[name='op']");
태그를 찾을 때 사용하는 문법 selector 선택자 스타일을 지정할 선택자
<시작 태그>콘텐트<끝 태그>
태그명
속성(attribute)
속성명
속성값
<input readonly>
속성 중에 값을 생략할 수 있는 속성이 있다.
이 경우 속성의 존재 유무에 따라 동작이 제어된다.
값을 설정하더라도 아무런 의미가 없다.
var xV1 = document.querySelector("input[name='v1']");
var xV2 = document.querySelector("input[name='v2']");
var xOp = document.querySelector("select[name='op']");
console.log(xV1);
console.log(xV2);
console.log(xOp);
xhr.open(
"GET", // HTTP 요청 방식
"/lang/variable/exam4/test2?v1=" + xV1.value + "&v2=" + xV2.value + "&op=" + xOp.value, // 요청 URL
true); // 비동기 여부 지정
var xV1 = document.querySelector("input[name='v1']");
xV1.value // name이 'v1'인 input 태그의 입력값을 가져온다.
주의!
// - 웹 브라우저에서 직접 요청할 때는 'URL 인코딩'을 따로 처리하지 않아도 된다.
// 왜? 웹 브라우저가 알아서 URL 인코딩을 해준다.
// - 자바스크립트를 이용해서 요청할 때는 개발자가 직접 'URL 인코딩'을 처리해야 한다.
// 즉 URL 인코딩을 하지 않았을 때 문제가 발생할 문자에 대해 반드시 URL 인코딩을 처리해야 한다.
//
// encodeURIComponent(문자열)
// ==> 한글뿐만 아니라 URL에서 특별한 의미로 사용되는 문자(?, +, # 등)도 인코딩을 처리해야 한다.
URL에서 '+' 문자는 space 1개를 의미
http://localhost:8080/lang/variable/exam4/test1.html
server-side rendering
test1.html을 실행시켜보면 op=%2B
라고 뜨는 걸 볼 수 있다.
RFC 3986
영어, 숫자, 특수문자를 제외한 나머지 문자는 변환한다.
퍼센트 인코딩 (URL 인코딩)
7 bit 네트워크 장비를 거쳐갈 때 데이터가 잘리지 않도록 조치하기 위함
문자 → url 인코딩 → 문자
클라이언트에서 서버로 문자를 보낼 때,
'A'를 보낼 때는 url 인코딩을 하지 않고 그대로 보낸다.
'가'를 보낼 때는 url 인코딩해서 보내고 서버에 도착했을 때는 원래 문자인 '가'로 바뀐다.
'+'를 url 인코딩 하지 않고 보내면 공백문자가 된다.
"%2B"로 인코딩해서 보내야 서버에 '+'로 제대로 도착한다.
@GetMapping("/test2")
public Object test2(int v1, int v2, String op) {
System.out.println(">" + v1 + "<");
System.out.println(">" + v2 + "<");
System.out.println(">" + op + "<");
int result = 0;
switch (op) {
case "+": result = v1 + v2; break;
case "-": result = v1 - v2; break;
case "*": result = v1 * v2; break;
case "/": result = v1 / v2; break;
case "%": result = v1 % v2; break;
default: return "해당 연산을 수행할 수 없습니다.";
}
return result;
}
공백으로 나온다
일부 문자의 경우 따로 URL 인코딩 하지 않으면 다른 의미로 사용된다.
+
: 공백문자
?
: 쿼리 스트링 시작 명령
알파벳, 숫자, 일부 특수 문자는 URL 인코딩 하지 않아도 그대로 전달된다.
한글은 URL 인코딩 필요
자바스크립트에서 요청할 때는 URL 인코딩
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/encodeURI
encodeURIComponent
xhr.open(
"GET", // HTTP 요청 방식
"/lang/variable/exam4/test2?v1=" + xV1.value + "&v2=" + xV2.value + "&op=" + encodeURIComponent(xOp.value), // 요청 URL
true); // 비동기 여부 지정
%2B
로 들어감
자바스크립트로 태그를 바로 찾고 싶을 때 부여
태그를 찾고, 태그의 속성/값을 변경, 태그를 제거 등
document.getElementById(태그아이디)
→ 태그 객체 1개
document.getElementsByTagName(태그명)
→ 여러 개의 태그
document.getElementsByClassName(클래스명)
→ 여러 개의 태그
document.querySelector(CSS-selector)
→ 한 개의 태그 객체
document.querySelectorAll(CSS-selector)
→ 여러 개의 태그 객체
태그 생성
document.createElement(태그명)
→ 태그 객체 1개
document.createTextNode(내용)
→ 여러 개의 태그 객체
자식 태그 추가/삭제
Node.appendChild()
→ 다른 태그 아래에 자식 태그 추가
Node.removeChild()
→ 자식 태그 제거
태그의 콘텐트 설정
Node.textContent
= 내용 → 태그의 콘텐트 설정. 내용 안에 태그가 있다면 무시한다.
Element.innerHTML
= 내용 → 태그의 콘텐트 설정. 내용 안에 태그가 있다면 자식 태그로 처리한다.
폼 입력 태그의 값 설정
HTMLInputElement.value
= input 태그의 입력값
HTMLSelectElement.value
= select 태그의 선택한 옵션 값
태그에 대해 특정 이벤트가 발생 했을 때 호출될 함수를 등록
웹 브라우저가 함수를 호출한다
개발자 → 함수 ← 웹 브라우저
'callback 함수'라고 부른다.
callback 함수 = event listener = event handler
특정 이벤트에 귀기울인다.
이벤트를 다루는 자
태그.onclick = function() {...};
onclick ← 이벤트 핸들러의 이름
이미 태그에 대해 이름이 정해져 있다.
on
으로 시작
function() ← 이벤트가 발생하면 호출된다.
https://developer.mozilla.org/ko/docs/Web/API/GlobalEventHandlers/onclick
태그.addEventListener("click", function() {...});
"click" ←이벤트명
<태그>
onclick ← 이벤트 핸들러
이벤트가 발생하면 설정된 코드가 실행된다.
태그에 자바스크립트 코드 때려 박는 코드는 잘 안 씀
⟹ 별도의 서버 요청 작업을 수행할 때 사용
비동기적인
숟가락은 들고 나서, 밥을 푸는 작업 ⟹ 동기 작업 (synchronous)
어떤 작업이 끝나면 이어서 작업하고
TV 시청 & 치맥을 먹는 작업 ⟹ 비동기 작업 (asynchronous)
얘는 얘대로 진행하고
얘도 얘대로 진행함
같이 병행하는 게 asynchronous
서버에 요청할 때 사용할 도구를 준비한다.
var xhr = new XMLHttpRequest();
xhr.addEventListener("load", function() {...});
"load" ← 서버에서 응답을 받았을 때 응답이 오면 발생하는 이벤트
function() {...} ← 응답이 왔을 때 호출될 함수
⟹ 서버가 보낸 실행결과를 처리!
신규 프로젝트사용
xhr.onreadystatechange = function() {...}
예전 프로젝트에서 사용
xhr.open("GET", URL, 비동기 여부);
← 서버에 연결
xhr.send(쿼리 스트링 or null);
← 서버에 요청
어느 태그에 함수를 등록할 건지 태그를 찾는다.
필요하면 태그를 생성하고
태그 아래에 자식 태그 추가
어떤 이벤트가 발생할 때 작업하도록 이벤트 리스너(콜백 함수)를 등록
사용자가 서버에 요청하는 버튼을 눌
Ajax 객체를 가지고
서버가 응답을 하면 데이터를 어떻게 다룰지는
onclick은 함수 1개
addEventListener는 함수 여러 개 가능
li ← list item
http://localhost:8080/lang/variable/exam4/test3.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
</body>
</html>
버튼을 눌렀을 때 배열 데이터를 가져오는 거
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn" onclick="console.log('눌렀음!')">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn" onclick="console.log('눌렀음!1')">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
<script>
var xBtn = document.getElementById("x-btn");
xBtn.onclick = function() {
console.log('눌렀음!2')
};
</script>
</body>
</html>
뒤에거가 덮어쓰기 돼서 2가 나옴
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
<script>
var xBtns = document.getElementsByTagName("button");
xBtns[0].onclick = function() {
console.log('눌렀음!')
};
</script>
</body>
</html>
getElementsByTagName()
찾은 게 1개여도 무조건 배열로 반환
태그를 가리키는 명령 (≒파일 경로)
<h1 id='x-title' class='t1 t2'> ... </h1>
<h1 id='x-name' class='t1 t3'> ... </h1>
<h1 id='x-tel' class='t2'> ... </h1>
#x-title
← 태그 id
h1
← 태그명
.t2
← class명
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
<script>
var xBtn = document.querySelector("#x-btn");
xBtn.onclick = function() {
console.log('눌렀음!4')
};
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
<script>
var xBtn = document.querySelector("#x-btn");
xBtn.onclick = function() {
console.log('눌렀음!4')
};
xBtn.onclick = function() {
console.log('눌렀음!5')
};
</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
<script>
var xBtn = document.querySelector("#x-btn");
xBtn.addEventListener("click", function() {
console.log('눌렀음!6')
});
xBtn.addEventListener("click" ,function() {
console.log('눌렀음!66')
});
</script>
</body>
</html>
http://localhost:8080/lang/variable/exam4/test3.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul>
<li>홍길동</li>
<li>임꺽정</li>
<li>유관순</li>
</ul>
<script>
var xBtn = document.querySelector("#x-btn");
xBtn.addEventListener("click", function() {
// 서버에 요청할 때 사용할 도구를 준비한다.
var xhr = new XMLHttpRequest();
// 서버에서 응답을 받았을 때(load 이벤트 발생) 호출될 함수를 등록한다.
xhr.onload = function() {
console.log(xhr.responseText);
};
// 서버와 연결한다.
// 서버 요청에 필요한 URL 정보를 설정한다.
xhr.open(
"GET", // HTTP 요청 방식
"/lang/variable/exam4/test3", // 요청 URL
true); // 비동기 여부 지정
// 서버에 요청 정보를 보낸다.
xhr.send();
});
</script>
</body>
</html>
@GetMapping("/test3")
public Object test3() {
String[] names = {"홍길동", "임꺽정", "유관순", "안중근", "윤봉길"};
return names;
}
① 웹 브라우저에서 요청
② test3() 호출
request handler : 요청이 들어왔을 때 호출되는 메서드
요청 처리기
클라이언트 요청을 처리 하는 자
③ 실행
페이지 컨트롤러(Page Controller) : request handler를 갖고 있는 클래스
⟹ 요청을 처리하는 역할을 수행
RestController
request handler를 갖고 있는 클래스
④ 리턴
⑤ 리턴값
⑥ 리턴 값을 가공한다.
Message Converter
- 기본 : Jackson Json Converter
- 응답할 데이터 가공
- 요청으로 받은 데이터 가공
• 문자열, 자바 원시 타입 데이터 → 문자열
• 배열, 객체 → JSON 형식의 문자열
스프링 부트가 Message Converter를 통해서 가공한 값을 받아서 응답
⑦ 가공한 값 리턴
@GetMapping("/test3")
public Object test3() {
String[] names = {"홍길동", "임꺽정", "유관순", "안중근", "윤봉길"};
return names; // 스프링부트는 이 메서드가 리턴한 배열을 JSON 형식의 문자열로 바꿔 응답한다.
}
스프링 부트는 이 메서드가 리턴한 배열을 JSON 형식의 문자열로 바꿔 응답한다.
http://localhost:8080/lang/variable/exam4/test3.html
JSON(JavaScript Object Notation) : App 간에 데이터를 주고 받을 때 사용하는 데이터 형식
JavaScript의 객체 초기화 문법(object initializer)을 모방해서 만든 데이터 형식 (json.org 사이트 참고)
JSON은 Javascript 객체 리터럴 문법을 따르는 문자열입니다.
Object initializer
배열
const arr = [요소, 요소, 요소, ..., 요소]
객체
const object = {
프로퍼티명: '값',
프로퍼티명: '값',
프로퍼티명: '값',
...
}
객체(object) : 데이터 덩어리
객체 = 인스턴스
메소드(method) : 객체를 다루는 함수
클래스 : 객체를 만드는 설계도
메소드를 통해서 그 객체를 다루는 거
이거를 어떻게 꺼내쓸 거냐
자바스크립트 객체를 문자열로 바꾸는 방법 : JSON.stringify()
문자열을 자바스크립트 객체로 바꾸는 방법 : JSON.parse()
JSON.parse()
사용하여 자바스크립트 배열로 바꾼다.
// 서버에서 응답을 받았을 때(load 이벤트 발생) 호출될 함수를 등록한다.
// 서버에서 받은 JSON 형식의 배열을 자바스크립트 배열로 변환한다.
xhr.onload = function() {
var names = JSON.parse(xhr.responseText);
console.log(names);
};
배열로 바꿈
배열로 바꿨으니까 반복문을 쓸 수 있음
xhr.onload = function() {
// 서버에서 받은 JSON 형식의 배열을 자바스크립트 배열로 변환한다.
var names = JSON.parse(xhr.responseText);
for (var name of names) {
console.log(name);
}
};
xhr.onload = function() {
// 서버에서 받은 JSON 형식의 배열을 자바스크립트 배열로 변환한다.
var names = JSON.parse(xhr.responseText);
for (var name of names) {
var li = document.createElement("li"); // <li><li>
li.innerHTML = name; // <li>홍길동<li>
console.log(li);
}
};
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>변수 활용</title>
</head>
<body>
<h1>배열 다루기</h1>
<button type="button" id="x-btn">배열 가져오기</button>
<ul id="x-namelist">
</ul>
<script>
var xNamelist = document.querySelector("#x-namelist");
var xBtn = document.querySelector("#x-btn");
xBtn.addEventListener("click", function() {
// 서버에 요청할 때 사용할 도구를 준비한다.
var xhr = new XMLHttpRequest();
// 서버에서 응답을 받았을 때(load 이벤트 발생) 호출될 함수를 등록한다.
xhr.onload = function() {
// 서버에서 받은 JSON 형식의 배열을 자바스크립트 배열로 변환한다.
var names = JSON.parse(xhr.responseText);
for (var name of names) {
var li = document.createElement("li"); // <li><li>
li.innerHTML = name; // <li>홍길동<li>
xNamelist.appendChild(li);
}
};
// 서버와 연결한다.
// 서버 요청에 필요한 URL 정보를 설정한다.
xhr.open(
"GET", // HTTP 요청 방식
"/lang/variable/exam4/test3", // 요청 URL
true); // 비동기 여부 지정
// 서버에 요청 정보를 보낸다.
xhr.send();
});
</script>
</body>
</html>