본문 바로가기
학습/Java

GET과 Query Parameter, POST와 Databody

코동이 2021. 8. 3.

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