3. GET API
GET은 리소스를 취득하는 API이며 쿼리 파라미터를 가질 수 있다.
@GetMapping에 default로 값을 입력하면 path로 등장한다.
명시적으로 등록하려면 (path = " 값 " 을 넣으면 된다.
@RequestMapping("/hi") // get / post / put / delete
public String hi(){
이런식으로 지정하면 모든 메서드에 동작이 되므로 명시적으로 지정해줘야 한다.
@RequestMapping(path = "/hi", method = RequestMethod.GET) // get http://localhost:9090/api/get/hi
@RequestMapping을 이와같이 사용하는 것은 예전에 활용하던 주소 매핑 방식.
이 방식을 합친 것이 @GetMapping이다.
@GetMapping(path = "/hello") // http://localhost:9090/api/get/hello
public String Hello(){
return "get Hello";
}
메서드 자체가 get으로 동작하게 되어 있다.
스프링에서 path variable 받는 법.
// http://localhost:9090/api/get/path-variable/{name}
// name은 계속 변한다.
@RequestMapping("/pathVariable/{name}")
public String pathVariable(@PathVariable String name) {
System.out.println("PathVariable : "+ name);
return name;
}
계속 변화하며 받을 인자를 @PathVariable로 받는다.
변화하는 인자는 /{이름} 같이 정의한다.
잘 작동한다.
변수 이름만 똑같이 매칭해주고, { } 안에 넣어놓은 이름과 정의한 이름이 같아야 한다.
개발을 하다가 변수와 { } 안에 이름을 다르게 설정해야 할 때에는 아래와 같은 방법을 사용한다.
@RequestMapping("/path-Variable/{name}")
public String pathVariable(@PathVariable(name = "name") String pathname) {
System.out.println("PathVariable : "+ pathname);
return pathname;
QueryParameter
구글에 자바를 검색해보자.
search?q=%EC%9E%90%EB%B0%94
&oq=%EC%9E%90%EB%B0%94
&aqs=chrome..69i57j69i59l2j69i61j69i65l3j69i61.3330j0j4
&sourceid=chrome
&ie=UTF-8
검색을 할 때 사용하는 매개변수 인자를 의미. (주로 검색할 때 많이 사용)
처음에는 ?가 있고 후에는 &로 문단을 나눈다.
?key=value&key2=value2&key3=value3... 방식으로 반복되는 것을 알 수 있다.
http://localhost:9090/api/get/query-param?user=steve&email=steve@gmail.com&age=30
아래는 이런 식의 문단을 받기 위한 코드이다.
@GetMapping(path = "query-param")
public String queryParam(@RequestParam Map<String, String> queryParam){
StringBuilder sb =new StringBuilder();
queryParam.entrySet().forEach( entry -> {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
System.out.println("\n");
sb.append(entry.getKey()+ "="+entry.getValue()+"\n");
});
return sb.toString();
}
}
@RequestParam을 붙여주자.
잘 나온다.
그런데 위와 같이 Map으로 받는 경우는 Key를 알 수가 없다.
명확하게 API를 지정하여 쿼리 파라미터에 넣을 것을 지정할 때는 아래와 같이 코딩한다.
명시적으로 변수로 받기 위해서
@RequestParam
를 붙여준다.
@GetMapping("query-param02")
public String queryParam02(
@RequestParam String name,
@RequestParam String email,
@RequestParam int age
){
System.out.println(name);
System.out.println(email);
System.out.println(age);
return name+" "+email+" "+age;
}
명시적으로 되어있다.
변수가 많아지면 코드가 복잡해진다.
이를 해결하기 위해 DTO 형태로 매핑한다.
현업에서 DTO를 가장 많이 쓴다고 한다.
package com.example.demo.controller.dto;
public class UserRequest {
private String name;
private String email;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "UserRequest{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", age=" + age +
'}';
}
}
@GetMapping("query-param03")
public String queryParam03(UserRequest userRequest){
System.out.println(userRequest.getName());
System.out.println(userRequest.getEmail());
System.out.println(userRequest.getAge());
return userRequest.toString();
}
객체를 만들어 적용한다.
이 때 차이점은 @RequestParam 어노테이션을 붙이지 않는다.
객체가 들어오면 QueryParameter들어있는 주소들, ?뒤에 오는 값들은 SpringBoot에서 판단을 한다.
객체에서 이름 매칭만 시켜준다면 객체를 만들어 변수를 처리할 수 있다.
QueryParameter 변수가 많아진다면 객체로 만들어 파악하는 것이 효율이 좋다.