1.Clint, Server : 클라이언트와 서버가 서로 독립적으로 분리 되어 있어야 한다.
2.Stateless : 요청에 대해서 클라이언트의 상태를 서버에 저장 하지 않는다.
3.Cache :클라이언트는 서버의 응답을 Cache(임시저장)할 수 있어야 한다.
4.계층화 : 서버와 클라이언트 사이에, 방화벽, 게이트웨이, Proxy등 다양한 계층 형태로 구성이 가능해야 하며, 이를 확장 할 수 있어야 한다.
5.인터페이스 일관성 : 인터페이스는 일관성을 지키고, 아키텍처를 단순화시켜 작은 단위로 분리하여, 클라이언트, 서버가 독립적으로 개선 될 수 있어야 한다.
URI, URL 자세히
요약하면
1.URI
인터넷에서 특정 자원을 나타내는 주소값
ex) http://localhost:8080/resource/sample/1
2.URL
인터넷 상에서의 자원, 특정 파일이 어디에 위치하는지 식별하는 위치
ex) http://localhost:8080/car.jpg
멱등성 | 안정성 | PathVariable | Query Parameter | RequestBody | |
---|---|---|---|---|---|
GET | O | O | O | O | X |
POST | X | X | O | △ | O |
PUT | O | X | O | △ | O |
DELETE | O | X | O | O | X |
만약 Post으로 주문을 생성하는 요청을 서버에 보낸다면, 보낼때 마다 주문이 생성된다. 하지만 요청을 put 바꿔 보낸다면, 처음 주문이 없을경우 생성 하고 그 뒤로 요청을 보내도 생성 되지 않고 갱신만 된다.
의미 | 안정성 | |
---|---|---|
1xx | 처리중 | 처리가 계속 되고 있는 상태 |
2xx | 성공 | 요청이 성공 |
3xx | 재요청 | 다른 리소스로 리다이렉트, Response의 새로운 주소로 다시 요청함 |
4xx | 클라이언트 에러 | 클라이언트의 요청에 에러가 있는 상태 재전송해도 해결되지 않는다. |
5xx | 서버에러 | 서버에서 에러 발생 재전송시 해결될 수도 있다. |
변하는 부분을 {}로 감싸 준다.
{}감싼 부분과 받을 변수명이 같아야하지만, 아래처럼 name속성을 맞춰주면 변수명은 다르게 해도 상관 없다.
key value 쌍으로 들어있다.
처음엔 ?key=value
여러 파라미터일경우 ?key=value&key=value
query-parameter?name=steave&email=steave@gmail.com
2-1 controller 에서 받는 방법 (4가지)
변수명사용 (@RequestParam 어노테이션 생략 가능)
✅아래와 같이 변수명(email)과 queryParm의 key값이 같다면 @RequestParm을 안붙여도 값이 들어 간다.
Map사용
@RequestParam 어노테이션을 Map에 붙이면 key : value 형식으로 Map에 담긴다. (어노테이션을 붙이지 않으면 값이 들어가지 않는다.)
Dto사용 (@RequestParam 어노테이션 생략 가능)
사용되는 DTO역시 변수명과 QueryParam의 key값이 일치해야하고, DTO에 getter와 setter가 필요하다는 것을 알 수 있다.
4.List사용
@RequestParam의 name속성을 query의 키 값으로 반드시 지정해 주어야 한다.
✅0. @PathVariable - get방식과 똑같이 받을 수 있다.
요청을 보낼때 requestBody에 data를 실어서 보낸다. 컨트롤러에서는 데이터를 파싱할때 @RequestBody어노테이션을 붙여줘야한다.
요청 전송
결과가 잘 나온다.
DTO로 받을때 json으로 보낸값이 자바 변수명이랑 다를 수 있다.
json은 스네이크케이스 자바에선 카멜케이스를 사용하는경우
@JsonProperty로 json에서 사용하는 이름과 같이 맞춰 주면 된다.
만약 클래스 전역에 적용시키고 싶다면
@JsonNaming어노테이션 사용
Post 전송을할때 json의 데이터를 어떻게 서버에서 파싱 할 수 있었는지 알고 있었는가? 서버에서는 우리가 모르는 사이 뒤에서 ObjectMapper를 활용하고 있었다.
그러면 ObjectMapper에대해 알아보자.
두가지모두 json 문자열을 문자열로 변환해준다. 차이점은 readValue는 필요한 객체로 변환까지 가능함
각각 잘 출력된다.
Json의 각 필드에 접근 하고 싶을때 사용하는 클래스 (수정이나 추가 불가능)
sample.json파일
각 필드에 접근할때 .get("필드명")을 사용한다.
List에 접근할때도 List 필드명을 먼저 한번 가져온다음 ObjectMapper의 convertValue()
를 사용 하면된다.
ObjectNode로 형변환해서 put()
메서드를 사용하여 값을 추가 or 수정 해줄 수 있다.