[Book Study] 스프링 부트 핵심 가이드
5. API를 작성하는 다양한 방법
5 - 1 프로젝트 설정
5 - 2 GET API 만들기
1. @RequestMapping으로 구현하기
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/hello
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String getHello() {
return "Hello World";
}
}
@RequestMapping은 스프링 4.3 버전 이후로는 더 이상 사용되지 않는다,
@RequestMappig은 별다른 설정 없이 선언하면 HTTP의 모든 요청을 받는다.
그러므로 요청 형식을 설정하는 method=RequestMethod.GET 도 사용되지 않는다.
2. 매개변수가 없는 GET 메서드 구현
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/name
@GetMapping(value = "/name")
public String getName() {
return "Flature";
}
}
요청할 때 스프링 부트 애플리케이션이 정해진 응답을 반환
3. @PathVariable을 활용한 GET 메서드 구현
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/variable1/{String 값}
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
}
웹 통신의 기본 목적은 데이터를 주고받는 것이기 때문에 대부분 매개변수를 받는 메서드를 작성
매개변수를 받을 때 자주 쓰이는 방법 중 하나는 URL 자체에 값을 담아 요청하는 것
* 규칙
- GetMapping 어노테이션의 값으로 URL을 입력할 때 중괄호를 사용해 어느 위치에서 값을 받을지 지정
- 메서드의 매개변수와 그 값을 연결하기 위해 @PathVariable명시
- @GetMapping 어노테이션과 @PathVariable에 지정된 변수의 이름을 동일하게 맞춤
만약, 맞추기 어렵다면 @PathVariable 뒤에 괄호를 열어 @GetMapping 어노테이션의 변수명을 지정
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/variable2/{String 값}
@GetMapping(value = "/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
return var;
}
}
@PathVariable에는 변수의 이름을 특정할 수 있는 value 요소가 존재
이 위치에 변수 이름을 정의하면 매개변수와 매핑
4. @RequestParam을 활용한 GET 메서드 구현
쿼리형식으로 값을 전달
URI에서 '?'를 기준으로 우측에 '{키}={값}' 형태로 구성된 요청을 전송하는 방법
매개변수 부분에 @RequestParam 어노테이션을 명시해 쿼리 값과 매핑
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/request1?name=value1&email=value2&organization=value3
@GetMapping(value = "/request1")
public String getRequestParam1(
@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return name + " " + email + " " + organization;
}
}
키와 @RequestParam 뒤에 적는 이름을 동일하게 설정하기 어렵다면 @PathVariable 예제에서 사용한 방법처럼 value 요소로 매핑
만약 쿼리스트링에 어떤 값이 들어올지 모른다면 Map 객체를 활용 / 값에 상관없이 요청받기 가능
선택 항목에 대해서는 값을 기입하지 않을 때 Map 객체로 받는 것이 효율적
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/request2?key1=value1&key2=value2
@GetMapping(value = "/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();
}
}
5. DTO 객체를 활용한 GET 메서드 구현
DTO (Data Transfer Object)
- 다른 레이어 간의 데이터 교환
- 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체
- 데이터를 교환하는 용도로만 사용하는 객체이기 때문에 별도의 로직이 포함되지 않음
package com.springboot.api.dto;
public class MemberDto {
private String name;
private String email;
private String organization;
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 getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
@Override
public String toString() {
return "MemberDto{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
", organization='" + organization + '\'' +
'}';
}
}
DTO 클래스에 선언된 필드는 Controller의 메소드에서 쿼리 파라미터의 키와 매핑됨
쿼리스트링의 키가 정해져 있지만 받아야 할 파라미터가 많을 경우에는 DTO객체를 활용해 코드의 가독성을 높일 수 있음
package com.springboot.api.controller;
import com.springboot.api.dto.MemberDto;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {
//http://localhost:8080/api/v1/get-api/request3?name=value1&email=value2&organization=value3
@GetMapping(value = "/request3")
public String getRequestParam3(MemberDto memberDto) {
//return memberDto.getName() + " " + memberDto.getEmail() + " " + memberDto.getOrganization();
return memberDto.toString();
}
}
5 - 3 POST API 만들기
POST API
- 웹 애플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API
GET API : URL의 경로나 파라미텅 변수를 넣어 요청을 보냄
POST API : 저장하고자 하는 리소스 값을 HTTP (바디)에 담아 서버에 전달 (URI가 GET API에 비해 간단)
일반적으로 POST 형식의 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용 -> 클라이언트의 요청 트래픽에 값이 포함되어 있음 -> 리소스를 담기 위해 HTTP Body에 값을 넣어 전송(JSON 형태로 값 입력)
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
//http://localhost:8080/api/v1/post-api/member
@PostMapping(value = "/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();
}
}
@RequestBody : HTTP의 Body 내용을 해당 어노테이션이 지정된 객체에 매핑하는 역할
Map 객체 : 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 떄 주로 사용
5 - 4 PUT API 만들기
PUT API
- 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트 하는 데 사용
- POST API와 컨트롤러 클래스를 구현하는 방법이 거의 동일 (HTTP Body 활용)
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {
//http://localhost:8080/api/v1/put-api/member
@PutMapping(value = "/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();
}
}
만약 서버로 들어오는 요청에 담겨 있는 값이 정해져 있는 경우에는 DTO 객체를 활용해 구현
package com.springboot.api.controller;
import com.springboot.api.dto.MemberDto;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {
//http://localhost:8080/api/v1/put-api/member1
@PutMapping(value = "/member1")
public String postMemberDto1(@RequestBody MemberDto memberDto) {
return memberDto.toString();
}
//http://localhost:8080/api/v1/put-api/member2
@PutMapping(value = "/member2")
public MemberDto postMemberDto2(@RequestBody MemberDto memberDto) {
return memberDto;
}
//http://localhost:8080/api/v1/put-api/member3
@PutMapping(value = "/member3")
public ResponseEntity<MemberDto> postMemberDto3(@RequestBody MemberDto memberDto) {
return ResponseEntity
.status(HttpStatus.ACCEPTED)
.body(memberDto);
}
}
member1 결과
member2 결과
member3 결과
5 - 5 DELETE API 만들기
DELETI API
- 웹 애플리케이션 서버를 거쳐 데이터 베이스 등의 저장소에 있는 리소스를 삭제할 때 사용
- 서버에서는 클라이언트로부터 리소스를 식별 할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할 수행
- URI에 값을 넣어 요펑을 받는 형식으로 구현
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/delete-api")
public class DeleteController {
//http://localhost:8080/api/v1/delete-api/{String 값}
@DeleteMapping(value = "/{variable}")
public String DeleteVariable(@PathVariable String variable) {
return variable;
}
//http://localhost:8080/api/v1/delete-api/request1?email-value
@DeleteMapping(value = "/request1")
public String getRequestParam1(@RequestParam String email) {
return "e-mail : " + email;
}
}
@DeleteMapping 어노테이션에 정의한 value의 이름과 메서드의 매개변수 이름을 동일하게 설정해야 삭제 할 값이 주입됨
@RequestParam 어노테이션을 통해 쿼리스트링 값도 받을 수 있
5 - 6 [한걸음 더] REST API 명세를 문서화하는 방법 - Swagger
명세 : API가 어떤 로직을 수행하는지 설명하고 이로직을 수행하기 위해 어떤 값을 요청하며, 이에 따른 응답값으로는 무엇을 받을 수 있는지를 정리한 자
5 - 7 [한걸음 더] 로깅 라이브러리 - Logback
Logback 설정
Logback 적용하기
'Web Develop > Book Study' 카테고리의 다른 글
[Book Study] 스프링 부트 핵심 가이드 - 8. Spring Data JPA (0) | 2023.09.15 |
---|---|
[Book Study] 스프링 부트 핵심 가이드 - 6. 데이터베이스 연동 (0) | 2023.09.09 |
[Book Study] 스프링 부트 핵심 가이드 - 4. 스프링 부트 애플리케이션 개발하기 (0) | 2023.08.30 |
[Book Study] 스프링 부트 핵심 가이드 - 3. 개발 환경 구성 (0) | 2023.08.22 |
[Book Study] 스프링 부트 핵심 가이드 - 2. 개발에 앞서 알면 좋은 기초 지식 (0) | 2023.08.22 |
댓글