스프링 입문

스프링 입문 4.2 GET API

코딩펭귄 2024. 1. 3. 03:09
import com.example.hello.dto.UserRequest;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api/get/")
public class GetApiController {

    //1. 명확하게 경로를 지정해주는 방법 : path = "/hello" (현재 사용 중인 방법)
    @GetMapping(path = "/hello") // http://localhost:9090/api/get/hello
    public String getHello(){
        return "get Hello";
    }

    //2. 예전에 쓰던 방법 리퀘스트매핑방법
//  @RequestMapping("hi") // -> get/post/put/delete 등 모든 메소드가 매핑됨
    @RequestMapping(path = "/hi", method = RequestMethod.GET) // -> get만 지정됨 http://localhost:9090/api/get/hi
    public String hi(){
        return "hi";
    }

 

 

 

path variable 받는 방법 

//    http://localhost:9090/api/get/path-variable{name}
    @GetMapping("/path-variable/{name}")
    public String pathVariable(@PathVariable String name){
        System.out.println("PathVariable : " + name);
        return name;
    }

빨간밑줄 친 3개 위치의 단어가 동일해야함

// name이 또 들어가야 되는 경우 즉, path variable의 주소에 name 지정했지만, 
// 변수에는 이름을 다르게 설정해야 하는 경우
    @GetMapping("/path-variable/{name}")
    public String pathVariable(@PathVariable(name = "name") String pathname, String name){
        System.out.println("PathVariable : " + pathname);
        return pathname;
    }

 

 

 

Query Parameter 받는 방법

- Query Parameter 은 어떻게 받아야 하는가? : 검색을할때 여러가지 매개변수 인자를 이야기 함
형태 : ?key=value&key2=value2

 

방법1

- 무한정, 뭐가 들어올지 몰라 : Map

// http:locolhost:9090/api/get/query-param?user=steve&email=steve@gmail.com&age=30
    @GetMapping(path = "query-param")
    // query param을 받을수 있는 방법 1 : Map : 무한정, 뭐가 들어올지 몰라
    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();
    }

 

방법 2

- 명시적 annotation, 쿼리 파라미터로 몇가지 값이 안들어올경우(적게 들어올경우)

  // query param을 받을수 있는 방법 2 (명시적 annotation, 지정) : query parameter로 몇가지 안들어올 경우

    @GetMapping("query-param02")
    public String queryParam02(
        @RequestParam String name,
        @RequestParam String email,
        @RequestParam int age  //문자열들어가면 400에러 남
    ){
        System.out.println(name);
        System.out.println(email);
        System.out.println(age);

        return name + " " + email + " " + age;
    }

 

 

방법3

- 현업에서 젤 많이 사용

- 미리 query parameter 에 대해 정의 해 놨을 경우, 객체(UserRequest)만들어서 받는 형태를 활용 (객체를 만들어서 쿼리 파라미터가 바로 맵핑이 되도록 하는 형태) - dto 구조 사용

- 패키지에다가 미리 정의  :  dto > UserRequest 에 미리 변수를 선언

package com.example.hello.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();
    }