REST(Represetational State Transfer)
기술이 아닌 약속이다.
요청에 대한 JSON 또는 XML형식으로 자원의 상태 응답
자원(데이터)의 상태를 주고 받는 것
특징
Client, Server 구조 / 클라이언트는 요청하고, 서버는 응답하는 구조
Stateless / 서버에서는 클라이언트의 상태 값을 저장하지 않는다. (인증, 인가에 JWT 사용)
HTTP 프로토콜을 이용해서 JSON 데이터를 응답으로 주기 때문에 어플리케이션의 통합과 분리가 용이하다.
규약
자원의 식별 - URL로 자원을 구분, 식별
메세지를 통한 리소스 조작 - HTTP header에 자원의 타입을 명시, 데이터 일부를 메세지로 전달
자기 서술적 메세지 - 요청하는 데이터가 HTTP methods 중 무엇인지, 필요한 정보를 포함하여 전달
어플리케이션 - 데이터뿐만 아니라 추가 정보도 제공
URI 설계 패턴
URI - 특정 자원에 대한 URI주소로 접근. 변경될 수 있다.
URL - 특정 자원에 대한 위치. 변경될 수 없다.
슬래시로 계층을 구분
하이픈을 사용한다.
소문자가 적합
컬렉션은 복수형을 사용
CRUD 명시 하지 않는다.
파일형식, 경로를 명시하지 않는다.
HTTP Methods
클라이언트가 요청을하고 서버의 응답을 기다린다.
GET
자원의 취득
데이터 기준: 안정성 o, 멱등성 o (데이터가 변하지 않는다.)
body를 사용하지 않는다.
POST
자원의 생성
데이터 기준: 안전성 x, 멱등성 x (매번 데이터가 생성)
body를 사용한다.
PUT
자원의 수정
데이터 기준: 안전성 x, 멱등성 o (한번 수정되고 같은 결과)
body를 사용한다.
DELETE
자원의 삭제
데이터 기준: 안전성 x, 멱등성 o (한번 삭제되고 같은 결과)
body를 사용하지 않는다.
HTTP Status Code
100 - 처리가 계속 되고 있는 상태
200 - 성공
300 - 리다이렉션
400 - 클라이언트 에러
500 - 서버 에러
Java -- Json
object-> String(json형태)
ObjectMapper writeValueAsString()
String(json형태) -> object
ObjectMapper readValue()
String(json형태) -> json
ObjectMapper readTree()
JsonNode 값을 변경할 수 없다.ObjectNode 값을 변경할 수 있다.
Jackson
package com.example.jacksontest.dto;
import lombok.*;
import java.util.List;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class User {
private int id;
private String name;
private List<Item> items;
@Getter
@Setter
@NoArgsConstructor
@ToString
@AllArgsConstructor
public static class Item{
private String itemName;
private int count;
}
}
{
"id" : 1,
"name" : "cha",
"items" : [
{
"itemName" : "coin",
"count" : 3
},{
"itemName" : "Phone",
"count" : 1
},{
"itemName" : "cigarette",
"count" : 5
}
]
}
ObjectMapper objectMapper = new ObjectMapper();
// 읽기
User user = objectMapper.readValue(new File("src/main/resources/data.json"), User.class);
System.out.println(user);
// 쓰기
File f = new File("src/main/resources/data1.json");
objectMapper.writeValue(f, user);
// Json -> String 으로 변환
String s = objectMapper.writeValueAsString(user);
// String -> ObjectNode 로 변환
ObjectNode objectNode = (ObjectNode) objectMapper.readTree(s);
System.out.println(objectNode.toPrettyString());
// Json -> Java Pojo
JsonNode list = objectNode.get("items");
User user1 = objectMapper.readValue(s, new TypeReference<User>() {});
System.out.println(user1);
// key 를 이용해 하나씩 접근
System.out.println("key 로 접근: " + objectNode.get("name"));
System.out.println("Array 일 경우: " + objectNode.get("items"));
'프로그래밍 > Spring' 카테고리의 다른 글
[Spring] interceptor (0) | 2022.08.15 |
---|---|
[Spring] 스프링 Resources 파일 읽기, 복사 (0) | 2022.08.12 |
[Spring] server to server, REST API 서버 요청 (0) | 2022.08.11 |
스프링 프레임워크 DI, AOP, 환경설정(intellij, gradle, tomcat) (0) | 2022.07.23 |
[Spring] Bean을 싱글톤으로 사용해도 되는 이유 (0) | 2022.07.18 |