GET API는 웹 어플리케이션 서버에서 값을 가져올 때 사용하는 APi이다.
실무에서는 HTTP 메서드에 따라 컨트롤러 클래스 구분 X
Controoller 패키지와 GetController 클래스를 생성한다.
GetController에 @RestController와 @RequestMapping를 붙여 내부에 선언되는 메소드에서 사용할 공통 URL을 설정한다.
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
}
클래스 수준에서 @RequestMapping 을 설정하면 내부에 선언한 메소드의 URL 리소스 앞에 @RequestMapping의 값이 공통 값으로 추가된다.
@RequestMapping 어노테이션을 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다.
GET 형식의 요청만 받기 위해서는 어노테이션이 별도로 필요하다. @RequestMapping 어노테이션의 method 요소의 값을 RequestMethod.GET 으로 설정하면 요청 형식을 GET으로만 설정할 수 있다.
// http://localhost:8090/api/v1/get-api/hello
@RequestMapping(value = "hello", method = RequestMethod.GET)
public String getHello() {
System.out.println("GetController.getHello");
return "HELLO SPRING!";
}
스프링 4.3 버전 이후로는 새로 나온 어노테이션을 사용하기에 @RequestMapping 어노테이션은 더 이상 사용되지 않는다.
별도의 매개변수 없이 GET API를 구현하는 경우는 다음과 같다
// http://localhost:8090/api/v1/get-api/name
@GetMapping(value = "/name")
public String getName() {
System.out.println("GetController.getName");
return "Flature";
}
매개변수가 없는 요청은 스프링부트 어플리케이션이 정해진 응답을 변환한다.
매개변수를 받을 때 자주 쓰이는 URL 자체에 값을 담아 요청하는 것이다.
// http://localhost:8090/api/v1/get-api/variable1/String 값
@GetMapping(value = "/variable1/{variable}")
public String getVariable(@PathVariable String variable) {
System.out.println("GetController.getVariable");
return variable;
}
@Getmapping
의 어노테이션 값으로 URL을 입력할 때 중괄호를 통해 어느 위치에 값을 받을지 지정해야 한다.
@Getmapping
의 어노테이션과 @PathVariable
에 지정된 변수 이름 동일해야 한다.
// http://localhost:8090/api/v1/get-api/variable2/test
@GetMapping(value = "/variable2/{variable}")
public String getVarable2(@PathVariable("variable") String var) {
System.out.println("GetController.getVarable2");
return var;
}
변수 variable과
매개변수 var
가 서로 일치하지 않아도 두 값을 mapping할 수 있다.
@PathVariable
에서는 변수의 이름을 특정 할 수 있는 value
요소가 존재하며, 이 위치에 변수 이름을 정의하면 매개변수와 mapping할 수 있다.
GET 요청을 구현할 때 URL 경로에 값을 담아 보내는 요청 외에도 쿼리 형식으로도 값을 전달 할 수 있다.
즉 URL에서 '?'를 기준으로 '키=값' 형태로 구성된 요청을 전송하는 방법이다.
// http://localhost:8090/api/v1/get-api/request1?name=testname&email=testemail&organization=testorga
@GetMapping(value = "/request1")
public String getrequestParam1(@RequestParam String name, @RequestParam String email, @RequestParam String organization) {
System.out.println("GetController.getrequestParam1");
return name + "" + email + "" + organization;
}
?키=값&키=값&키=값 형태로 요청
Map을 활용할 수 있다.
// http://localhost:8090/api/v1/get-api/request2?name=test&value=12312
// 쿼리스트링에 어떤 값이 모를 때 사용,
@GetMapping(value = "/request2")
public String getRequestParam2(@RequestParam Map<String, String> param) {
System.out.println("GetController.getRequestParam2");
StringBuilder sb = new StringBuilder();
param.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
회원 가입 API에서 ID같은 필수 항목이 아닌 취미 선택 항목에 대해서는 값을 기입하지 않는 경우가 많은데, 이때 Map 객체로 받는 것이 효율적이다.
URI와 URL의 차이
url은 리소스가 어디있는지 알려 주는 경로,uri는 특정 리소스를 식별할 수 있는 식별자
DTO와 VO
다른 레이어 간의 데이터 교환
에 활용됨.
각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수
로 사용되는 데이터 객체.
데이터 그 자체로 의미가 있는 객체
를 의미한다.
특징은 읽기전용(Read-Only
)로 설계한다는 것.
값을 변경할 수 없게 만들어서 데이터의 신뢰성을 유지
해야 한다.
package com.springboot.api.dto;
import lombok.Data;
@Data //@Getter / @Setter, @ToString, @EqualsAndHashCode와 @RequiredArgsConstructor 를 합쳐놓은 종합 선물 세트
public class MemberDto {
//
private String name;
private String email;
private String organization;
}
dto 클래스에 선언된 변수는 컨트롤러 메서드에서 쿼리 파라미터의 키와 매칭 된다.
받아야 할 파라미터가 많은 경우 코드의 가독성을 높이기 위해 사용한다.
// http://localhost:8090/api/v1/get-api/request3?name=test&email=testmail&organization=testorg
@GetMapping(value = "/request3")
public String getRequestParam3(MemberDto memberDto) {
System.out.println("GetController.getRequestParam3");
// return memberDto.getName() + "" + memberDto.getEmail() + "" + memberDto.getOrganization(); 이렇게 작성하지 않아도 됨
return memberDto.toString();
}