Programming/Spring

[Spring] GET API 사용하기 (Annotation 정리)

코끼리 개발자 2022. 12. 6. 12:52
728x90
SMALL

Get API는 CURD중 R(Read)의 역할을 수행하게 된다.

즉 리소스의 취득을 위하여 사용하는 것이다.

동일한 요청을 한 번 보내는 것과 여러 번 연속으로 보내는 것이 같은 효과를 지니고, 서버의 상태도 동일하게 남기때문에 멱등성을 지녔다.

 

 

<각 Annotation의 설명 및 사용법>

 

@RequestMapping("/path")

: url의 뒷 경로 값을 지정함 

ex) http://localhost:port/path

 

@GetMapping(path="/path2")

: RequestMapping에서 지정해준 경로의 뒷 경로값을 지정함

(path = 을 생략하고, @GetMapping("/path2")로 바로 경로를 지정할 수 있음

ex) http://localhost:port/path/path2

 

@RequestMapping(path="/path3", method = RequestMethod.GET)

: url의 뒷 경로 값을 지정함

(path와 method를 생략하고 "/path3"로 바로 경로만 지정할 수 있으며, method를 추가하여 GetMapping으로 사용 가능 method로는 RequestMethod.GET외에도 여러 개의 method를 추가 하여 여러 기능으로 사용 가능하다.

만일 method로 RequestMethod.GET만 준다면 GetMapping과 동일한 기능을 함)

ex) http://localhost:port/path/path3

 

<예시>

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

    @GetMapping(path = "/hello") //http://localhost:port/api/get/hello
    public String getHello(){
        return "get hello";
    }

    @RequestMapping(path = "/hi", method = RequestMethod.GET) //GetMapping, 파라미터,동작을 지정할 수 있음
    public String hi(){
        return "hi";
    }
}

 

 

-PathVariable(변화하는 값을 path로 주기)

@GetMapping("/path/{name}")

@PathVariable

: url의 뒤에 붙는 주소값을 변화하는 값을 주고 싶을 때 {파라미터명}으로 주어 주소를 매핑한다.

기본적으로는 {name}으로 파라미터명을 지정하였다면, 아래 ex1)와 같이실행 할 함수의 파라미터명과 맞추어 주면 되는데,

ex1) @GetMapping("/path/{name}")

         public String a ( String name){ return "";}

파라미터 명을 맞출 수 없는 상황이라면 @PathVariable(name = "name") String pathName 과 같이

@PathVariable annotation을 사용하여 아래 예시와 같이 설정하면 된다.

ex2) 아래 소스코드 참고

 // http://localhost:8090/api/get/path-variable/{변화하는 값}
    @GetMapping("/path-variable/{name}") //괄호 안의 name이 함수의 파라미터 이름과 반드시 동일해야함
    //만일 맞춰줄 수 없다면 @pathVariable에 (name = "name") 파라미터를 생성하여 url로 들어 갈 경로의 이름과 맞춰주어야함
    public String pathVariable(@PathVariable(name = "name") String pathName, String name){
        System.out.println("pathVariable : "+pathName);
        return pathName;
    }

 

 

-QueryParameter

사용자를 위한 파라미터 페이지를 만들 때 식별 된 파라미터 경로를 만들기 위해 사용한다.

@RequestParam

:구글에 티스토리를 검색했을 때,

https://www.google.com/search?q=%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC&rlz=1C5CHFA_enKR985KR985&oq=%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC&aqs=chrome.0.69i59j0i512j0i131i433i512j0i512l7.2203j0j7&sourceid=chrome&ie=UTF-8 이렇게 url이 도출된다.

이 때 https://www.google.com/을 제외하면 

search?q=%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC&rlz=1C5CHFA_enKR985KR985&oq=%ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC&aqs=chrome.0.69i59j0i512j0i131i433i512j0i512l7.2203j0j7&sourceid=chrome&ie=UTF-8 이렇게 나온다 이 형태가 QueryParameter형태인데, 요청할 때 key=value형태로 요청하는 것 이다.

분리를 해 보면

search?

q = %ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC

& rlz = 1C5CHFA_enKR985KR985

& oq = %ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC

..나머지 생략

이런 형태가 된다. 즉 경로다음 '?'가 붙고, 그 이후에 이어지는 값이 key=value형태이며 여러 개의 key=value가 붙는 경우 '&'를 붙여 이어진다.

 

3가지 형식으로 QueryParam을 사용해 보면 다음과 같다.

 

1. 각 key값을 지정하여 받는 경우.

@GetMapping Annotation을 이용하여 경로를 지정하고, 실행시킬 함수의 파라미터로 내가 받고 싶은 key값을 지정하여 주면 된다.

예시의 경우 String 형태의 파라미터를 name, email, addr로 받는 형태로 작성 된 것이다. key로 받을 파라미터를 지정할 땐

@RequestParam Annotation을 사용하여 지정 해 주면 된다.

만일, String값으로 들어와야 하는 value가 int로 들어오는 경우 페이지 실행 시 에러가 발생한다.

또한 파라미터 값이 3개인데 4개의 파라미터를 넣어 요청하는 경우 파라미터가 누락되게된다.

<예시>

@GetMapping(path = "query-param02")
    public String queryParam02(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam String addr
    ){
        System.out.println(name);
        System.out.println(email);
        System.out.println(addr);

        return name+" "+email+" "+addr;
    }

 

2. Map을 이용하여 임의대로 파라미터를 받아 처리하는 경우.

@GetMapping Annotation을 이용하여 경로를 지정하고, @RequestParam Annotaion을 사용하여 들어올 key값을 Map으로 선언하여 준다.

이 경우, 각각 들어온 순서에 맞춰 key값을 지정 해 주려면 queryParam.get()을 이용하여 각각 지정해 주어야 한다.

들어온 파라미터를 확인하기 위해서는 queryParam.entrySet().forEach를 통해 출력 및 대입이 가능하다.

<예시>

@GetMapping(path = "query-param")
    public String queryParam(@RequestParam Map<String, String> queryParam){
        StringBuilder sb = new StringBuilder();

//        queryParam.get("name");
        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();
    }

 

3.Class를 통해 파라미터를 받아 처리하는 경우.

:QueryParam을 위한 클래스를 선언하여 해당 클래스로 데이터를 받아 처리하는 방식이다.

클래스로 받아 처리하는 경우 1,2번의 경우들과는 다르게 @RequestParam Annotation을 사용하지 않아도 된다. 현업에서 가장 많이 사용하는 방법이라고 하니 이 방법을 많이 사용 해 보는 것이 좋을 것 같다.

<UserRequest Class코드>

public class UserRequest {
    private String name; // key값과 매칭이 된다.
    private String email;
    private String addr;

    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 String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    @Override
    public String toString() {
        return "UserRequest{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", addr='" + addr + '\'' +
                '}';
    }
}

<UserRequest Class를 이용한 QueryParam 예시>

@GetMapping(path = "query-param03")
    public String queryParam03(UserRequest userRequest) { //RequestParam annotation을 붙이지 않음
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAddr());

        return userRequest.toString();
    }

 

 

 

 

 

<전체 실습 코드>

package com.example.erpsystem.Controller;

import com.example.erpsystem.dto.UserRequest;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

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

    @GetMapping(path = "/hello") //http://localhost:8080/api/get/hello
    public String getHello(){
        return "get hello";
    }

    @RequestMapping(path = "/hi", method = RequestMethod.GET) //GetMapping, 파라미터,동작을 지정할 수 있음
    public String hi(){
        return "hi";
    }

    // http://localhost:8080/api/get/path-variable/{변화하는 값}
    @GetMapping("/path-variable/{name}") //괄호 안의 name이 함수의 파라미터 이름과 반드시 동일해야함
    //만일 맞춰줄 수 없다면 @pathVariable에 (name = "name") 파라미터를 생성하여 url로 들어 갈 경로의 이름과 맞춰주어야함
    public String pathVariable(@PathVariable(name = "name") String pathName, String name){
        System.out.println("pathVariable : "+pathName);
        return pathName;
    }

    // search? q = intellij
    // &rlz = 1C5CHFA_enKR985KR985
    // &oq = intellij
    // &aqs = chrome..69i57j0i20i263i512j0i512l3j69i60j69i61l2.4545j0j7
    // &sourceid = chrome
    // &ie = UTF-8
    // 주소 뒤에 ?를 붙이고, key=value형태 그 다음 key value를 붙이기 위해서는 &를 붙임.
    // http://localhost:8080/api/get/query-param?name=elephant&email=elephant@gmail.com&addr=seoul
    @GetMapping(path = "query-param")
    public String queryParam(@RequestParam Map<String, String> queryParam){
        StringBuilder sb = new StringBuilder();

//        queryParam.get("name");
        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();
    }

    @GetMapping(path = "query-param02")
    public String queryParam02(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam String addr
    ){
        System.out.println(name);
        System.out.println(email);
        System.out.println(addr);

        return name+" "+email+" "+addr;
    }

    // http://localhost:8080/api/get/query-param?name=elephant&email=elephant0908@gmail.com&addr=seoul
    // 넣지않은 키 값을 파라미터로 넣을 경우 누락되며 파싱되지 않음.
    @GetMapping(path = "query-param03")
    public String queryParam03(UserRequest userRequest) { //RequestParam annotation을 붙이지 않음
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAddr());

        return userRequest.toString();
    }
}

 

 

 

 

728x90
LIST