REST API를 만들 때, @GetMapping과 @PostMapping에 따라 어떻게 프런트 화면의 값을 입력받는지 알아보도록 한다.
* Get
1. Map
2. @ReuqestParam
3. Dto 클래스
아래와 같은 URL 주소가 입력된다고 가정하자. user, email, age 등의 정보가 담겨있는 것을 알 수 있다.
http://localhost:9090/api/get/query-param?user=seteve&email=steve@gmail.com&age=30
화면에서 입력된 특수한 값들을 백엔드에 넘기고 싶다면 ? 뒤로부터 그 내용을 전달해주면 된다. 각 내용은 &로 구분한다.
1. Map
@GetMapping("/get")
public String input(@RequestParam Map<String, String> request) {
request.entrySet().forEach( entry -> {
System.out.println(entry.getKey():
System.out.println(entry.getValue():
});
}
user, email, age은 key로, steve, steve@gmail.com, 30은 value로 받을 수 있습니다. 하지만 각각의 key와 value를 조회해서 값을 알아내야 하는 불변함으로 잘 사용되지 않습니다. @RequestParam을 빼먹지 않도록 합니다.
2. @RequestParm
@GetMapping("/get")
public String input(@RequestParam String user,
@RequestParam String name,
@RequestParam int age) {
System.out.println(user);
System.out.println(name);
System.out.println(age);
}
개별적으로 하나씩 값을 호출하는 방식입니다. 꼭 필요한 특정 값을 따로 호출하는 경우도 있지만, 갯수가 많아지면 코드 양이 길어져 잘 사용되지 않습니다.
3. Dto 클래스
@GetMapping("/get")
public String input(RequestDto request) {
System.out.println(requesrt.getUser());
System.out.println(request.getName());
System.out.println(request.getAge());
}
=====================================
@Getter
@Setter
class ReuqestDto {
private String user;
pirvate String name;
private int age;
}
별도의 class를 만들어 객체로 받는 방법입니다. form의 형태로 화면에서 넘겨준다면, set함수를 통해 값을 넣어주며, 백엔드에서 get을 호출해서 어떤 값이 입력되었는지 확인합니다.
* POST
1. Map
2. Dto 클래스
http://localhost:9090/api/get/query-param
GET 방식과 달리 URL에 ? 아무것도 없다. 아무것도 없다고해서 데이터가 없는 것이 아니다. 단지 body에 담아서 보내는 전략을 선택한 것이다.
2. Dto 클래스
@PostMapping("/get")
public String input(@RequestBody PostReuqestDto request) {
System.out.println(request.getAccount());
System.out.println(request.getEmail());
System.out.println(request.getAddress());
System.out.println(request.getPassword());
System.out.println(request.getPhoneNumber());
}
============================================
@Getter
@Setter
class PostReuqestDto {
private String account;
private String email;
private String address;
private String password;
@JsonProperty("phone_number")
private String phoneNumber;
}
post의 경우 body로 전달해서 해결한다. 특징은 @RequstBody를 넣는다는 것이다. body로 내용을 전달하겠다는 의미이다.
주의해야 할 것은 @JsonProperty 부분이다. 보통 body에 요청을 할 때, snake_case를 따른다. snake_case는 단어마다 _로 구분을 하는 것으로 예를 들어 전화번호는 phone_number로 표시한다.
{
phone_number : "010-1234-5678"
}
하지만 자바에서는 camelCase를 사용해 phoneNumber를 사용한다. 따라서 데이터 형식이 맞지 않고 이를 하나로 통일시켜야 한다. 그 때 @JsonPropety를 사용하면 입력된 "phone_number"가 자바 클래스에서 phoneNumber로 인식된다.
이 적용을 각각의 칼럼마다 하는 것은 굉장히 반복적인 일이므로 class위에 정의해서 한번에 등록 할 수 있다.
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
class PostreqeustDto {
...
}
'학습 > Java' 카테고리의 다른 글
HTTP vs. WWW (0) | 2021.08.05 |
---|---|
프록시 패턴 (0) | 2021.08.03 |
REST, RESTful API (0) | 2021.08.01 |
SOLID 원칙 (0) | 2021.08.01 |
POJO / Hibernate (0) | 2021.08.01 |