JAVA/SpringBoot

REST API - POST , Json

whyHbr 2024. 4. 10. 19:40
728x90
반응형

POST:

Create, 리소스 추가. 클라이언트가 서버에 데이터를 전송 시 사

요청 할 때마다 데이터가 생성되므로 역등하지 않고, 데이터를 변화시키기 때문에 안정성도 없다.

QueryParameter 는 특정 데이터를 필터링 할 때 사용하기 때문에 적정하지 않다.

Data body를 통해 데이터를 전달하는 것이  POST 방식이다. 

 

DataBody?

http 통신에는 header, body가 존재한다.

클라이언트 서버에 데이터를 전달하는 방식으론 1. 주소에 pass value로 들어가는 방식 2. Query parameter로 필터링을 걸면서 데이터를 전달하는 방식이 있다.

이 방식들은 주소가 외부에 노출, 서버로 가기 위해 중간에 거치는 (라우터 같은) 여러 장비들의 로그에 어떤 데이터들이 전달 됐는지 남아있다

 

Body: http request body 부분에 특정 메시지를 담을 수 있다 (메시지 : 문자로 이루어진 형태)

test, html, json일 수도 있다. 중요한건 결국 문자로 이루어진 데이터가 들어 있다는 것.

 

바디로 전달하게 되면 외부 주소에는 해당 데이터가 노출되지 않기 때문에 GET방식 보다는 조금 더 안전하다.

 

HTTP 요청시 바디 부분에 데이터를 담는 방식을 사용해보자.

 

일단 크롬 스토어 들어가서 확장자 설치하기 ( chrome-extension://aejoelaoggembcahagimdiliamlcdmfm )

@RestController //restapi 방식 지원
@RequestMapping("/api") //어떤 주소를 맵핑할건지
public class PostApiController {
    @PostMapping("/post")
    public String post( @RequestBody BookRequest bookRequest){
        System.out.println(bookRequest);
        return bookRequest.toString(); //문자열로 반환
    }

데이터를 전달 받아야 한다. get방식에선 데이터를 받을 때 특별한 객체 없이도, 쿼리 파라미터를 통해 받을 수 있었다.

POST 방식의 경우는 객체가 디폴트다 - 클래스를 만들어야 한다는 소리

@Data
@AllArgsConstructor //전체 파라미터 생성자
@NoArgsConstructor  //기본 생성자
public class BookRequest {
    private String name;
    private String number;
    private String category;
}

 

@RequestBody : POST, put 방식에서 http body로 들어오는 해당 객체에 데이터 클래스를 매핑해준다는 것. = 들어오는 데이터를 bookrequest에 매치해준다.

 

해당 모델에 맞는 제이슨을 작성해주면 된다. 

{
    "name" : "Spring Boot",
    "number" : 1010212,
        "category" : "JAVA"
        }

 

받는 쪽 컨트롤러에서는 메서드 안에 @RequestBody 라는 어노테이션을 붙여준다. 

이렇게 하면 해당 객체 클래스는 Json으로 전달된 데이터를 해당 변수에 매칭해 내려주게 된다. 

 

@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)//해당 클래스는 스네이크 케이스를 받겠다.

 

해당 모델 클래스에 @jsonNaming 을 붙여주게 되면 해당 클래스의 변수들은 스네이크 케이스로 맵핑하겠다 라는 뜻이 된다.

요청이 스케이크  케이스로 들어오면 , 자동적으로 해당 변수에 맵핑된다 ( + 추가 학습 필요)

 

 

Json이란? :

{ "키" : "값" } 형태로 이루어짐.

문자형과 숫자형 존재 (double, int 다 묶어서)

 

{
  "key": "value",
  "array" : [
    10,
    20,
    30
  ],
  "stirng_array" : [
    "배열",
    "반드시 같은 타입만 올 수 있음",
    "int, String ",
    "오브젝트 타입도 만들 수 있고 ",
    "이 오브젝트는 또 다시 json을 담을 수 있다."
  ],
  "object_array":[
    {"name" :  "오브젝트에 제이슨을 담을 땐"},
    {"name" :  "데이터의 형태는 동일해야함"},
    {"name" :  "name data"}
  ],
  "case_array": [
    {"case" :  "camel, 자바 방식. 클래스는 첫문자를 대문자로, 변수는 소문자"},
    {"case" :  "snake, "}
  ]
}
728x90

'JAVA > SpringBoot' 카테고리의 다른 글

JWT: Json Web Token  (0) 2025.02.13
HTTP 심화  (1) 2024.04.15
REST API , URI 설계  (0) 2024.04.09
Spring Boot - 간단한 Web , HTTP, Get, Post, Put  (0) 2024.04.09
게시판 프로젝트 - 첨부파일 다운로드  (0) 2023.11.16