POSTMAN 설치
HTTP1.1
어떤 데이터를 GET, POST, PUT, DELETE 요청할 것인지는 ? 뒤에 요청하는 데이터를 적어준다.
stateless와 stateful
stateless 방식은 클라이언트와 서버가 통신할 때 요청시 마다 스트림을 연결해서 Data를 응답하고 연결을 끊는 방식으로 서버 입장에서 부하가 굉장히 적어서 http에서 사용하고 있다.
stateful 방식은 요청, 응답 후에도 지속적으로 연결되어서 Data를 주고 받는 채팅과 같은 통신에서 사용한다. 이 방식은 연결이 계속 지속되기 때문에 세션이 만들어진다. 세션이 만들어졌다는 것은 인증이 된 관계로 Data를 응답해줄 준비가 되었다는 뜻이다. 그래서 한 번 연결 후 계속 인증 없이 Data를 주고 받는 것이 가능하다.
http 방식에서는 stateless는 한번 인증 후 연결을 끊기 때문에 서버 입장에서 세션을 유지할 수 있는 방법이 없다. 그래서 문서 전달 목적으로 만들어진 http 방식은 매우 어려운 방식으로 세션을 유지하는데 앞으로 배울 예정이다.
MIME 타입
클라이언트가 서버에 POST 요청을 할 때 데이터를 담아서 보내야 하는데 어디에 담아 보낼까?
헤더에는 Data를 설명해주는 정보를 바디에는 Data를 담아서 보낸다. 헤더에는 설명뿐만 아니라 다른 정보들도 들어갈 수 있다.
서킷 스위칭 / 패킷 스위칭
http 통신을 할 때 서킷 스위칭과 패킷 스위칭 중 패킷 스위칭 방식으로 한다.
서킷 스위칭 방식은 한방에 보내는 방식으로 보낼 때마다 물리적으로 선을 계속 연결해서 통신하는 방식이다. 선이 계속 연결되어 있기 때문에 비용이 많이 발생하는 단점이 있다.
패킷 스위칭 방식은 데이터를 하나하나의 패킷으로 쪼개서 보낸다. 동시에 여러 곳에서 데이터를 보내면 한 선으로 통신하기 때문에 데이터가 섞에서 보내진다. 따라서 B에서는 데이터를 조립하는 과정이 필요하다.
그런데 조립 시 데이터가 순서대로 온다는 보장이 없기 때문에 그냥 받는 순서대로 조립하게 되면 기존 데이터와 다른 데이터가 된다. 따라서 모든 패킷에 헤더라는 것을 통해 데이터의 순서를 표시한다. 또한 데이터를 보낸 발신자의 정보도 함께 표시해줘서 완벽하게 조립할 수 있도록 해준다. (그림상에선 색깔로 표시된 정보)
보낼 수 있는 데이터의 타입의 종류는 매우 많다. (Test, 이미지, avi, 이진테이터, Json 등)
바디에 담아서 보낼 데이터의 헤더에 데이터의 타입을 적을 때 MIME 타입을 알아야 설정해서 보낼 수 있다.
[MIME 타입 정의]
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
올바른 MIME 타입을 전송하도록 서버가 정확히 설정하는 것이 중요하다. MIME 타입의 종류는 굉장히 많다. 이것을 다 외울 필요는 없고 필요할 때 찾아서 형식을 확인하면 된다.
Http 실습
package com.cos.blog.test;
// 사용자가 요청 -> HTML 파일
// @Controller
// 사용자가 요청 -> Data 응답
@RestController
public class HttpControllerTest {
// http://localhost:8080/http/get (select)
@GetMapping("/http/get")
public String getTest() {
return "get 요청";
}
// http://localhost:8080/http/post (insert)
@PostMapping("/http/post")
public String postTest() {
return "post 요청";
}
// http://localhost:8080/http/put (update)
@PutMapping("/http/put")
public String putTest() {
return "put 요청";
}
// http://localhost:8080/http/delete (delete)
@DeleteMapping("/http/delete")
public String deleteTest() {
return "delete 요청";
}
}
웹 브라우저로 실습
- http://localhost:8080/http/get
- http://localhost:8080/http/post
HTTP 405 에러 발생 : 해당 메서드가 허용되지 않는다는 뜻으로 웹 브라우저의 주소창으로는 절대 post 요청이 불가능한다.
인터넷 브라우저 요청은 무조건 get 요청만 가능 !!!
따라서 웹이 아닌 Postman으로 실습을 해야한다.
- post 요청
- get, put, delete도 마찬가지로 잘 된다.
실습
실습을 위한 Member 클래스 생성
package com.cos.blog.test;
public class Member {
private int id;
private String username;
private String password;
private String email;
// 생성자
public Member(int id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
// getter, setter
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
private로 변수를 생성하는 이유는 변수에 바로 접근해서 수정될 수 없도록 막아둔 것이다. 특정 함수로 인해서만 상태가 바뀌도록 하고 싶은 것이다. 이 특정 함수는 public으로 열어둔다! 여기서의 특정 함수는 getter, setter!
객체 지향에서의 변수는 private로 만들고 변수의 상태는 메서드에 의해 변경되도록 설계한다.
Member get 실습
// http://localhost:8080/http/get (select)
@GetMapping("/http/get")
public String getTest(Member m) {
return "get 요청 : " + m.getId() + ", " + m.getUsername();
}
? 뒤로 들어오는 값을 컨트롤러가 Member 오브젝트로 넣어준다!!
get 방식으로 데이터를 요청할 때에는 쿼리 스트링 방법밖에 없다.
Member post 실습
- x-www-form-urlencoded 방식 : html의 <form> 태그로 데이터 요청하는 방식
@PostMapping("/http/post")
public String postTest(Member m) {
return "post 요청 : " + m.getId() + ", "
+ m.getUsername() + ", " + m.getPassword() + ", " + m.getEmail();
}
- application/json 요청 방식
// http://localhost:8080/http/post (insert)
@PostMapping("/http/post")
public String postTest(@RequestBody Member m) {
return "post 요청 : " + m.getId() + ", "
+ m.getUsername() + ", " + m.getPassword() + ", " + m.getEmail();
}
스프링 부트의 MessageConverter가 모든 매핑을 해줘서 이렇게 쉽게 데이터를 보낼 수 있는 것이다.
Member put 실습
@PutMapping("/http/put")
public String putTest(@RequestBody Member m) {
return "put 요청 : " + m.getId() + ", "
+ m.getUsername() + ", " + m.getPassword() + ", " + m.getEmail();
}
출처
https://developer.mozilla.org/ko/docs/Web/HTTP/Basics_of_HTTP/MIME_types
'Spring > Blog 만들기 with SpringBoot' 카테고리의 다른 글
Blog 테이블 생성 - User (0) | 2022.05.01 |
---|---|
yaml 설정 (0) | 2022.04.28 |
Lombok 세팅 (0) | 2022.04.28 |
Maven (0) | 2022.04.27 |
스프링 부트 초기 설정 (0) | 2022.04.04 |