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 이렇게 나온다 이 형태가 QueryParameter형태인데, 요청할 때 key=value형태로 요청하는 것 이다.
분리를 해 보면
search?
q = %ED%8B%B0%EC%8A%A4%ED%86%A0%EB%A6%AC
& 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();
}
}
'Programming > Spring' 카테고리의 다른 글
[JPA] 좌석 개수를 구하기 위한 @Formula 사용기 (Feat. @DataJpaTest @Formula 데이터 검증 테스트 실패 분석) (11) | 2024.03.30 |
---|---|
[Spring] DELETE API 사용하기 (0) | 2022.12.06 |
[Spring] PUT API 사용하기 (1) | 2022.12.06 |
[Spring] POST API 사용하기 (0) | 2022.12.06 |