JSON 이란

 

Java Script Object Notation - 자바 스크립트 객체 표기법

 

{ 속성명1 : 속성값1, 속성명2: 속성값2, ... }

[{ 속성명1 : 속성값1, 속성명2: 속성값2, ... }] : 객체 배열

{ 키1:{속성명1 : 속성값1,...}, 키2:{속성명2: 속성값2, ... }, ...} : Map

 

 

stringify() 와 parse()

 

JS 객체를 서버로 전송하려면, 직렬화(문자열로 변환)가 필요

서버가 보낸 데이터(JSON, 문자열)를 JS 객체로 변환할 때 역직렬화가 필요

 

JSON.stringify() - 객체를 JSON 문자열로 변환(직렬화 JS객체 -> 문자열)

JSON.parse() - JSON 문자열을 JS 객체로 변환(역직렬화 문자열 -> JS객체)

 

Ajax 란

 

Asynchronous javascript and XML - 요즈음은 JSON을 주로 사용

비동기 통신으로 데이터를 주고 받기 위한 기술

웹페이지 전체(data+UI)가 아닌 일부(data)만 업데이트 가능

Ajax 테스트

 

SimpleRestController.java

package com.jcy.usedhunter.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jcy.usedhunter.domain.Person;

@Controller
public class SimpleRestController {
    @GetMapping("/ajax")
    public String ajax() {
        return "ajax";
    }

    @PostMapping("/send")
    @ResponseBody
    public Person test(@RequestBody Person p) {
        System.out.println("p = " + p);
        p.setName("ABC");
        p.setAge(p.getAge() + 10);

        return p;
    }
}

 

ajax.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="https://code.jquery.com/jquery-1.11.3.js"></script>
</head>
<body>
    <h2>{name:"abc", age:10}</h2>
    <button id="sendBtn" type="button">SEND</button>
    <h2>Data From Server :</h2>
    <div id="data"></div>
    <script>
        $(document).ready(function(){
            let person = {name:"abc", age:10};
            let person2 = {};

            $("#sendBtn").click(function(){
                $.ajax({
                    type:'POST',       // 요청 메서드
                    url: '/send',  // 요청 URI
                    headers : { "content-type": "application/json"}, // 요청 헤더
                    dataType : 'text', // 전송받을 데이터의 타입
                    data : JSON.stringify(person),  // 서버로 전송할 데이터. stringify()로 직렬화 필요.
                    success : function(result){
                        person2 = JSON.parse(result);    // 서버로부터 응답이 도착하면 호출될 함수
                        alert("received="+result);       // result는 서버가 전송한 데이터
                        $("#data").html("name="+person2.name+", age="+person2.age);
                    },
                    error   : function(){ alert("error") } // 에러가 발생했을 때, 호출될 함수
                }); // $.ajax()

                alert("the request is sent")
            });
        });
    </script>
</body>
</html>

 

 

pom.xml 에 코드 추가

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

 

 

 

 

Ajax 요청과 응답 과정

 

 

 

@RestContoller

 

@ResponseBody 대신 클래스에 @RestController 사용 가능

 

 

REST 란?

 

Representational State Transfer API - REST 규약을 준수하는 API

 

Roy Fielding 이 제안한 웹 서비스 디자인 아키텍쳐 접근 방식

프로토콜에 독립적이며, 주로 HTTP를 사용해서 구현

리소스 중심의 API 디자인 - HTTP 메서드로 수행할 작업을 정의

 

 

RESTful API 설계

 

기존

작업 URI HTTP 메서드 설명
읽기 /comment/read?cno=번호 GET 지정한 번호의 댓글을 보여준다.
쓰기 /comment/write POST 작성한 게시물을 저장한다.
삭제 /comment/remove POST 댓글을 삭제한다.
수정 /comment/modify POST 수정된 게시물을 저장한다.

 

 

RESTful

 

URI 에 명사만 남기기

작업 URI HTTP 메서드 설명
읽기 /comments GET 모든 댓글을 보여준다.
읽기 /comments/{cno} GET 지정한 번호의 댓글을 보여준다.
쓰기 /comments POST 새로운 댓글을 저장한다.
삭제 /comments/{cno} DELETE 지정한 번호의 댓글을 삭제한다.
삭제 /comments/{cno} PUT / PATCH 수정된 게시물을 저장한다.
복사했습니다!