개발자잡 2022. 6. 29. 20:28

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으로 동작하게 되어 있다.

hi

 

hello

 

스프링에서 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 변수가 많아진다면 객체로 만들어 파악하는 것이 효율이 좋다.