REST API

dongdong·2022년 12월 23일
0

api

목록 보기
3/3

REST (Representational State Transfer : 자원의 상태 전달)

1.Clint, Server : 클라이언트와 서버가 서로 독립적으로 분리 되어 있어야 한다.

2.Stateless : 요청에 대해서 클라이언트의 상태를 서버에 저장 하지 않는다.

3.Cache :클라이언트는 서버의 응답을 Cache(임시저장)할 수 있어야 한다.

4.계층화 : 서버와 클라이언트 사이에, 방화벽, 게이트웨이, Proxy등 다양한 계층 형태로 구성이 가능해야 하며, 이를 확장 할 수 있어야 한다.

5.인터페이스 일관성 : 인터페이스는 일관성을 지키고, 아키텍처를 단순화시켜 작은 단위로 분리하여, 클라이언트, 서버가 독립적으로 개선 될 수 있어야 한다.


URI vs URL

URI, URL 자세히
요약하면
1.URI
인터넷에서 특정 자원을 나타내는 주소값
ex) http://localhost:8080/resource/sample/1
2.URL
인터넷 상에서의 자원, 특정 파일이 어디에 위치하는지 식별하는 위치
ex) http://localhost:8080/car.jpg

URI 설계 원칙


HTTP요청을 특정하는 Method

멱등성안정성PathVariableQuery ParameterRequestBody
GETOOOOX
POSTXXOO
PUTOXOO
DELETEOXOOX

? Post 와 Put 차이점

만약 Post으로 주문을 생성하는 요청을 서버에 보낸다면, 보낼때 마다 주문이 생성된다. 하지만 요청을 put 바꿔 보낸다면, 처음 주문이 없을경우 생성 하고 그 뒤로 요청을 보내도 생성 되지 않고 갱신만 된다.

HTTP응답을 나타내는 코드

의미안정성
1xx처리중처리가 계속 되고 있는 상태
2xx성공요청이 성공
3xx재요청다른 리소스로 리다이렉트, Response의 새로운 주소로 다시 요청함
4xx클라이언트 에러클라이언트의 요청에 에러가 있는 상태 재전송해도 해결되지 않는다.
5xx서버에러서버에서 에러 발생 재전송시 해결될 수도 있다.

API - GET

1.@PathVariable

변하는 부분을 {}로 감싸 준다.
{}감싼 부분과 받을 변수명이 같아야하지만, 아래처럼 name속성을 맞춰주면 변수명은 다르게 해도 상관 없다.

2.queryParam

key value 쌍으로 들어있다.

처음엔 ?key=value
여러 파라미터일경우 ?key=value&key=value
query-parameter?name=steave&email=steave@gmail.com

2-1 controller 에서 받는 방법 (4가지)

  1. 변수명사용 (@RequestParam 어노테이션 생략 가능)
    ✅아래와 같이 변수명(email)과 queryParm의 key값이 같다면 @RequestParm을 안붙여도 값이 들어 간다.

  2. Map사용
    @RequestParam 어노테이션을 Map에 붙이면 key : value 형식으로 Map에 담긴다. (어노테이션을 붙이지 않으면 값이 들어가지 않는다.)

  3. Dto사용 (@RequestParam 어노테이션 생략 가능)
    사용되는 DTO역시 변수명과 QueryParam의 key값이 일치해야하고, DTO에 getter와 setter가 필요하다는 것을 알 수 있다.

4.List사용
@RequestParam의 name속성을 query의 키 값으로 반드시 지정해 주어야 한다.


API - POST

0. @PathVariable - get방식과 똑같이 받을 수 있다.

1.Map으로 받기

요청을 보낼때 requestBody에 data를 실어서 보낸다. 컨트롤러에서는 데이터를 파싱할때 @RequestBody어노테이션을 붙여줘야한다.

요청 전송
요청 전송

결과가 잘 나온다.
결과

2.DTO로 받기

DTO로 받을때 json으로 보낸값이 자바 변수명이랑 다를 수 있다.

json은 스네이크케이스 자바에선 카멜케이스를 사용하는경우
@JsonProperty로 json에서 사용하는 이름과 같이 맞춰 주면 된다.

만약 클래스 전역에 적용시키고 싶다면
@JsonNaming어노테이션 사용

API - ObjectMapper

Post 전송을할때 json의 데이터를 어떻게 서버에서 파싱 할 수 있었는지 알고 있었는가? 서버에서는 우리가 모르는 사이 뒤에서 ObjectMapper를 활용하고 있었다.
그러면 ObjectMapper에대해 알아보자.

readTree(), readValue()

두가지모두 json 문자열을 문자열로 변환해준다. 차이점은 readValue는 필요한 객체로 변환까지 가능함

각각 잘 출력된다.

JsonNode

Json의 각 필드에 접근 하고 싶을때 사용하는 클래스 (수정이나 추가 불가능)
sample.json파일


각 필드에 접근할때 .get("필드명")을 사용한다.
List에 접근할때도 List 필드명을 먼저 한번 가져온다음 ObjectMapper의 convertValue()를 사용 하면된다.

ObjectNode


ObjectNode로 형변환해서 put()메서드를 사용하여 값을 추가 or 수정 해줄 수 있다.

profile
공부하고 기록하기~

0개의 댓글