Method | 의미 | CRUD | 멱등성 | 안전성 | Path Variable | Query Parameter | DataBody |
GET | 리소스 취득 | R (Read) | O | O | O | O | X |
POST | 리소스 생성, 추가 | C (Create) | X | X | O | △ | O |
POST 메서드
POST 메서드는 리소스를 생성하거나 추가하는 역할을 합니다. 이는 CRUD에서 Create를 담당합니다.
특징
- Path Variable: 가질 수 있습니다.
- Query Parameter: 사용할 수 있지만, 주로 사용하지 않습니다.
- DataBody: 가질 수 있습니다.
Query Parameter 사용의 문제점
Query Parameter는 웹 애플리케이션에서 특정 데이터나 리소스를 필터링하거나 검색하는 데 사용됩니다. 하지만 다음과 같은 문제점이 있습니다:
- 주소 노출: Query Parameter는 URL에 포함되므로 외부로 쉽게 노출됩니다.
- 로그 기록: 인터넷을 거쳐 서버로 가는 동안 여러 장비의 로그에 남게 됩니다.
따라서, 중요한 정보를 Query Parameter에 포함하는 것은 보안상의 문제가 있습니다. 주로 GET 방식에서 사용되며, POST 방식에서는 보안적인 이유로 권장되지 않습니다.
POST 메서드에서의 데이터 전송
POST를 사용할 때는 보안적으로 민감한 데이터나 암호화가 필요한 데이터를 전송하기 위해 HTTP Body에 저장하여 보냅니다.
- HTTP Body: HTTP Body는 다양한 형태의 메시지를 포함할 수 있습니다. 단순한 텍스트, HTML, JSON 등이 될 수 있습니다.
즉, 문자로 이루어진 데이터를 전송합니다 - 보안 주의사항: HTTP Body에 데이터를 넣는다고 해서 무조건 안전하지 않습니다. 여러 가지 방법으로 Body의 데이터를 확인할 수 있기 때문에, 개인정보나 신용카드 정보 등 중요한 정보는 반드시 암호화하여 전송해야 합니다.
주로 POST로 데이터를 전송할 때는 JSON 방식을 사용합니다.
서버에서 POST 메서드 Body 데이터 받기
GET 방식에서는 객체가 필요할 때 만들어 사용하지만, POST 방식에서는 객체 생성이 필수입니다.
예를 들어, 학생 이름, 학번, 나이를 포함한 객체를 만들어 봅시다.
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class StudentModel {
private String name;
private String no;
private int age;
}
서버에 POST 메서드를 받는 형식
import org.example.restapi.model.StudentModel;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api")
public class PostApiController {
@PostMapping("/post")
public StudentModel post(
@RequestBody StudentModel studentModel
) {
return studentModel;
}
}
여기서 GET 방식과 다른 점은 두 가지가 있습니다:
- @PostMapping을 사용했습니다.
- 인자에 있는 어노테이션이 @RequestBody입니다.
해당 어노테이션은 클라이언트가 보낸 HTTP Body에 있는 값을 StudentModel 객체에 매핑해주는 역할입니다.
JSON 형식이 기본으로 매핑됩니다.
POST 메서드 테스트
POST 메서드가 제대로 실행되는지 확인하기 위해서는 Postman이나 Talend API Tester-Free Edition과 같은 API 테스트 도구를 사용합니다.
SpringBoot에서의 응답 타입
SpringBoot에서는 반환하는 타입에 따라 반환하는 형식이 달라집니다.
- 객체로 반환: JSON Content-Type
- String으로 반환: text/plain
객체로 반환
String으로 반환
snake_case를 서버에서 camelCase로 받는 방법
body로 보내는 데이터는 주로 JSON 형식으로 보낼 때가 많습니다. 객체끼리 매핑할 때는 이름이 같아야 매핑이 가능한데, snake_case로 보낸다면 Spring에서 camelCase로 멤버명을 지정했을 때 매핑이 되지 않습니다.
매핑하지 않았을 때 예시
@RestController
@RequestMapping("/api/v1")
public class ResponseApiController {
@PostMapping("/post")
public UserRequest user(
@RequestBody UserRequest userRequest
) {
return userRequest;
}
}
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRequest {
private String userName;
private String email;
private int userAge;
}
Json 형식인 snake_case 형식을 매핑하는 방식
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
private String userName;
private String email;
private int userAge;
}
주의해야 할 점
PropertyNamingStrategies와 PropertyNamingStrategy 두 가지가 있습니다.
PropertyNamingStrategy는 구버전의 어노테이션으로 현재는 @Deprecated되어 있어 SnakeCase를 매핑할 수 없습니다.
반드시 PropertyNamingStrategies를 사용해야 합니다.
정리
- POST 메서드는 Query Parameter를 사용할 수 있지만, Query Param의 용도와 맞지 않기에 HTTP Body를 이용해서 데이터를 전송합니다.
- PostMapping을 사용하여 POST 요청을 받습니다.
- Spring Boot는 반환 타입에 따라 같은 데이터라도 Content-Type이 다릅니다.
- Body의 데이터와 객체 간의 매핑을 하기 위해서는 @RequestBody 어노테이션을 사용합니다.
- POST 메서드는 모델 객체 생성이 필수입니다.
- JSON은 보통 형식이 snake_case이기 때문에 스프링에서 매핑하기 위해서는 JsonNaming을 사용해야합니다
'Spring Boot' 카테고리의 다른 글
[Spring Boot] Web에서 응답 만드는 방법 - Response Entity (0) | 2024.07.02 |
---|---|
[Spring Boot] Rest API Put 메서드 + boolean is 변수명의 문제점 (0) | 2024.07.01 |
[Spring Boot] Rest API GET 메소드(2) (0) | 2024.06.29 |
[Spring Boot] Rest API GET 메소드(1) (0) | 2024.06.28 |
자바 백엔드 개발자가 알아야 할 지식 (0) | 2024.06.25 |