GET API
GET API는 웹 애플리케이션 서버에서 값을 가져올 때 사용하는 API이다.
@RestController @RequestMapping
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
}
@RestController는 @Controller에 @ResponseBody가 결합된 어노테이션이다.
RestController를 붙이면 컨트롤러 클래스 하위 메서드에 @ResponseBody를 붙이지 않아도 문자열과 JSON등을 전송할 수 있다.
클래스 수준에서 @RequestMapping를 설정하면 내부에 선언한 메서드의 URL 리소스 앞에 @RequestMapping의 값이 공통으로 추가된다.(localhost:8080/api/v1/get-api/~)
매개변수가 없는 GET 메서드 구현
@GetMapping("/name")
public String getName() {
return "Flat";
}
localhost:8080/api/v1/get-api/name
매개변수가 없는 요청은 URL을 그대로 입력하고 요청할 때 스프링 부트 애플리케이션이 정해진 응답을 반환한다.
@PathVariable을 활용한 GET 메서드 구현
실무에선 매개변수를 받지 않는 메서드가 거의 쓰이지 않는다. 웹 통신 목적은 데이터를 주고받는 것이기 때문에 대부분 매개변수를 받는 메서드를 사용한다.
매개변수를 받을 때 자주 쓰이는 방법 중 하나는 URL 자체에 값을 담아 요청하는 것이다.
@GetMapping("/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
@GetMapping안에 URL을 보면 {}로 표시된 위치의 값을 받아 요청하는 것이다 실제 요청시 중괄호는 들어가지 않으며 값만 존재한다.
이 방식은 몇가지 규칙이 있는데 @GetMapping으로 URL입력시 중괄호를 사용해 어느 위치에서 값을 받을지 지정해야 하며 메서드의 매개변수와 그 값을 연결하기 위해 @PathVariable을 명시하며 지정된 변수의 이름을 동일하게 맞춰야 한다.
만약 동일하게 맞추기 어렵다면
@GetMapping("/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
return var;
}
@PathVariable뒤에 괄호를 열어 @GetMapping의 변수명을 지정하면 된다.
@RequestParam을 활용한 GET메서드 구현
쿼리 형식으로 값을 전달하는 방식이다 URL에서 ?를 기준으로 우측에 {키}={값} 형태로 구성된 요청을 전송하는 방법이다.
이런 형식을 처리하려면 @RequestParam을 활용하면 된다.
@GetMapping("/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
http://localhost:8080/api/v1/get-api/request1?name=value1&email=value2&organization=value3
만약 쿼리 스트링에 어떤 값이 들어올지 모른다면 Map 객체를 활용하면 된다
@GetMapping("/request2")
public String getRequestParam2(@RequestParam Map<String, String> param) {
StringBuilder sb = new StringBuilder();
param.entrySet().forEach(map ->
sb.append(map.getKey() + " : " + map.getValue() + "\n"));
return sb.toString();
}
이러한 형태로 작성하면 값에 상관없이 요청을 받을 수 있다.
DTO 객체를 활용한 GET 메서드 구현
DTO는 Data Transfer Object의 약자로, 다른 레이어 간의 데이터 교환에 활용된다.
각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체이다.
@Getter @Setter
@ToString
public class MemberDto {
private String name;
private String email;
private String organization;
}
@GetMapping("/request3")
public String getRequestParam3(MemberDto memberDto) {
return memberDto.toString();
}
DTO 클래스에 선언된 필드는 컨트롤러의 메서드에서 쿼리 파라미터의 키와 매핑된다. 즉, 쿼리스트링의 키가 정해져 있지만 받아야 할 파라미터가 많을 경우에 DTO객체를 활용하면 코드의 가독성을 높일 수 있다.
POST API
POST API는 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API입니다.
GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API에서는 저장하고자 하는 리소스나 값을 HTTP 바디에 담아 서버에 전달한다.
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
// 공통 URL 설정
}
일반적으로 POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용한다. 그러므로 클라이언트의 요청 트래픽에 값이 포함돼 있으므로 POST요청에서는 리소스를 담기 위해 HTTP Body에 값을 넣어 전송해야 한다.
Body 영역에 작성되는 값은 일정 형태를 취하며 일반적으로 JSON형식으로 전송된다.
@RequestBody와 Map을 활용한 POST API 구현
@PostMapping("/member")
public String postMember(@RequestBody Map<String, Object> postData) {
StringBuilder sb = new StringBuilder();
postData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
Map 객체는 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 때 주로 사용한다. 값이 정해져 있다면 DTO객체를 매개변수로 삼아 작성할 수 있다
@PostMapping("/member2")
public String postMemberDto(@RequestBody MemberDto memberDto) {
return memberDto.toString();
}
PUT API
PUT API는 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트 하는데 사용한다.
POST API와 비교하면 요청을 받아 실제 데이터베이스에 반영하는 과정에서 차이가 있지만 컨트롤러 클래스를 구현하는 방법은 POST API와 동일하다.
@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {
// 공통 URL 설정
}
@RequestBody와 Map을 활용한 PUT API 구현
@PutMapping ("/member")
public String postMember(@RequestBody Map<String, Object> putData) {
StringBuilder sb = new StringBuilder();
putData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + map.getValue() + "\n");
});
return sb.toString();
}
Map 객체는 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 때 주로 사용한다. 값이 정해져 있다면 DTO객체를 매개변수로 삼아 작성할 수 있다
DELET API
DELETE API는 웹 애플리케이션 서버를 거쳐 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용한다. 서버에서는 클라이언트로 부터 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할을 수행한다. 이때 컨트롤러를 통해 값을 받는 단계에서는 간단한 값을 받기 때문에 GET 메서드와 같이 URI에 값을 넣어 요청을 받는 형식으로 구현된다.
'스프링' 카테고리의 다른 글
JPA N + 1 문제와 해결 방법 (0) | 2023.11.14 |
---|---|
DTO매핑을 해야하는 이유 (0) | 2023.11.13 |
스프링 부트 핵심가이드 9장 (0) | 2023.04.07 |
스프링 부트 핵심 가이드 2장 (0) | 2023.04.04 |
스프링 부트 핵심 가이드 (0) | 2023.04.04 |