GET API 만들기
: 웹 애플리케이션 서버에서 URL을 통해 값을 가져올 때 사용하는 API
1) RequestMapping을 이용한 방법
import java.util.Map;
@RestController
@RequestMapping("/api/v1/get-api") //url 사용 규칙 "_" 대신에 "-"사용하기
public class GetController {
// http://localhost:8090/api/v1/get-api/hello
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String getHello(){
return "Hello World";
}
content-type : text / plain; charset=UTF-8 --> 일반 문자열 형태를 의미
2) 매개변수가 없는 GET 메서드 구현
- 실무에서는 거의 안씀
@GetMapping(value = "/hello")
public String getHello(){
LOGGER.info("getHello 메소드가 호출되었습니다. ");
return "Hello World";
}
3) @PathVariable을 활용한 GET 메서드 구현 (상세글 보기, 수정, 삭제하기 (굳이 파라미터명이 필요 없을 때))
- 실무에서는 매개변수를 받지 않는 메서드가 거의 쓰이지 않음.
// http://localhost:8090/api/v1/get-api/variable/{String 값}
// http://localhost:8090/api/v1/get-api/variable/바보
// {}조건 : 1. 받는 쪽 이름은 블록 처리, 2. 메서드 매개변수 이름과 동일
@GetMapping("/variable/{variable}")
public String getVariable1(@PathVariable String variable){
LOGGER.info("@PathVariable을 통해 들어온 값 : ", variable);
return variable;
}
매핑된 변수명과 @PathVariable의 매개변수이름이 일치하지 않는 상황에서는 @PathVariable에 변수 명을 지정
// http://localhost:8090/api/v1/get-api/variable2/{String 값}
@GetMapping("/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var){
return var;
}
// 여기까지는 파라미터 명 없이 값이 전달하는 방식
// : 상세글 보기, 수정, 삭제하기 (굳이 파라미터명이 필요 없을 때)
4) @RequestParam을 활용한 GET 메서드 구현 (새 글 입력, 값을 수정했을 경우 값이 여러 개 전송 -> 파라미터명 필요)
// http://localhost:8090/api/v1/get-api/request1?name=메롱&email=점심&organization=마라탕
// http://localhost:8090/swagger-ui.html --> ui dependency를 시켜놓아서 보이는 것
@GetMapping(value = "/request1")
public String getRequestParam1(
@RequestParam String name, //받아온 name속성은 이름을 의미하고 이는 비어있으면 안된다.
@RequestParam String email,
@RequestParam String organization){
return name + " " + email + " " + organization;
}
하지만 @RequestParam의 단점이 존재.
넘어오는 파라미터가 많을 경우 하나씩 다 써주기가 힘들다. 이 경우 파라미터의 개수에 따라서 내부 코드를 수정해줘야 하며 메서드를 추가적으로 생성해줘야 한다.
따라서,
=> 넘어오는 파라미터 개수 관계없이 파라미터 명은 키, value 묶어서 처리하면 한 번에 처리 가능
5) Map을 활용한 방법
// http://localhost:8090/api/v1/get-api/request2?key=메롱&key2=점심&organization=마라탕
@GetMapping(value = "/request2")
public String getRequestParam2(@RequestParam Map<String, String> param){
StringBuilder sb = new StringBuilder();
// **** map.emtrySet / foreach 사용하여 map에서 값 꺼내기 ****
// map 이 갖고 있는 키와 값을 entrySet() : 키와 값을 한 쌍으로 추출 forEach를 사용하여 순차적으로 처리
param.entrySet().forEach(map -> { // map에서 꺼낸 값을 저장할 변수
sb.append(map.getKey()+ " : "+ map.getValue() + "\n");
// 키 추출 // 값 추출
});
return sb.toString();
}
// String 타입 사용은 간단한 문자열 처리는 빠르지면 길 수록 처리속도가 느려짐
// 그래서 만들어진 것이 StringBuilder 객체
// append() 있어서 추가가 용이?
문자열을 더하거나 수정하는 작업에서 StringBuilder를 사용하면 좋은점
1. 성능 향상 :
- 문자열을 직접 더하고 수정하는 것 보다 StringBuilder를 사용하면 성능 향상
- StringBuilder는 내부적으로 가변성을 가지며, 문자열을 변경할 때 새로운 객체를 생성하지 않고
기존의 내용을 직접 조작할 수 있어서 메모리와 성능 측면에서 효율적
2. 메모리 사용 감소 :
- String(불변문자열) 객체는 더하거나 수정할 때 새로운 객체를 생성해야힘 > 메모리 낭비
- StringBuilder(가변문자열)는 필요한 문자열을 조작, 새로운 객체 계속 생성하지 않아도 되므로 메모리 사용 줄어듦.
3. 코드 가독성 향상 :
- 문자열을 더하거나 수정하는 코드를 StringBuilder를 사용하면 코드가 간결해짐.
- 복잡한 연산들을 메서드 체인 형태로 사용할 수 있음.
6) DTO 객체를 활용한 GET메서드 구현
- 여러 개의 데이터를 가지고 와야 하는 경우에는 DTO객체를 활용해 코드의 가독성을 높일 수 있다(코드의 양이 줄어듦).
//http://localhost:8090/api/v1/get-api/request3?name=강민희&email=dfs&organization=마라탕
@GetMapping(value = "/request3")
public String getRequestParam3(MemberDto memberDTO){
return memberDTO.toString();
}
POST API 만들기
: 데이터 베이스 등의 저장소에 리소스를 저장할 때 사용되는 API
: GET API에서는 URL의 경로나 파라미터에 변수를 넣어 요청을 보냈지만 POST API에서는 이를 HTTP Body에 담아 서버에 전달한다.
PostController
1) RequestMapping을 이용한 방법
: GET API와 크게 다르지 않음
// Post API : 데이터 베이스 등의 저장소에 리소스를 저장할 때 사용되는 API
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
// 1. RequestMapping을 이용한 방법 , 리소스 없는 상태에서 단순 요청
@RequestMapping(value = "/domain", method = RequestMethod.POST)
public String postExample(){
return "Hello Post API";
}
2) @RequestBody를 이용한 방법
: post 형식의 요청을 클라이언트가 서버에 리소스를 저장하는 데 사용한다.
클라이언트의 요청 트래픽에 값이 포함돼 있다.
즉, POST요청에 리소스를 담기 위해 HTTP Body에 값을 넣어 전송
// 2. @RequestBody를 이용한 방법 , 리소스 전달
// http://localhost:8090/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();
}
// http://localhost:8090/api/v1/post-api/member2
@PostMapping(value = "/member2")
public String postMemberDto(@RequestBody MemberDto memberDto){
return memberDto.toString();
}
PUT API 만들기
PutController
: 애플리케이션 서버를 통해 데이터 베이스 같은 저장소에 존재하는 리소스 값을 업데이트하는 데 사용(POST API와 거의동일)
: 리소스를 서버에 전달하기 위해 HTTP Body를 활용해야 하기 때문이다.
@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {
// http://localhost:8090/api/v1/put-api/default
@PutMapping(value = "/default")
public String putMethod(){
return "Hello World!";
}
1) RequestBody를 활용한 put메서드 구현
@RequestMapping(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();
}
* Map?
파라미터 부분에서 Map을 사용하였는데 어떤 형태의 데이터가 들어올지 모르는 경우 Map 형태로 작성한다.
보통은 기본적인 설계를 잘못했을 경우(= 설계를 잘못해서 데이터를 싣고 다니는 DTO가 불안한 경우)에 Map형태를 사용
설계를 잘하면 Map을 쓸 일이 없다고 한다^^
만약 설계를 잘해두어 DTO, VO가 변수명 형태로 생성되어 있다면 Map이 아닌 VO객체로 받아도 되고 이 방법이 조금 더 좋은 방법이다.
//http://localhost:8090/api/v1/put-api/member1
@PutMapping(value = "/member1")
public String postMemberDto(@RequestBody MemberDto memberDto){
return memberDto.toString();
}
// http://localhost:8090/api/v1/put-api/member2
@PutMapping(value = "/member2")
public MemberDto postMemberDto2(@RequestBody MemberDto memberDto){
return memberDto;
}
① toString() 를 활용하여 반환할 경우
- Content-Type = text/plain -> 결과값이 일반 문자열 형태로 전달
② Dto 객체 반환할 경우
- Content-Type = application/json -> 결과값이 json 형태로 반환됨
@RestController이 지정된 클래스 @ResponseBody 생략 가능
어노테이션을 자동으로 값ㅇ르 json과 같은 형식으로 변환해서 전달하는 역할 수행
2) ResponseEntity를 활용한 PUT메서드 구현
- HttpEntity 클래스 존재
- 이는 Header와 Body로 구성된 HTTP요청과 응답을 구성하는 역할을 수행
- ResponseEntity와 RequestEntity는 HttpEntity를
- ResponseEntity는 서버에서 들어온 요청에 대해 응답 데이터를 구성해서 전달할 수 있음
DELETE API 만들기
- 삭제기능 -> 식별할 수 있는 값을 받아와야 함.
package com.springboot.api.controller;
import org.springframework.web.bind.annotation.*;
// DELETE API : 삭제 -> 식별할 수 있는 값을 받아와야 함.
@RestController
@RequestMapping("/api/v1/delete-api")
public class DeleteController {
// 파라미터명이 없이 하나의 값만 이용해서 삭제할 때는PathVariable
// 파라미터 명을 전달받아 사용할 때는 @RequestParam
// http://localhost:8090/api/v1/delete-api/{variable}
@DeleteMapping(value = "/{variable}")
public String DeleteVariable(@PathVariable String variable){
return variable;
}
// 파라미터명을 전달받아 사용할 때는 @RequestParam
// http://localhost:8090/api/v1/delete-api/request1?email=value
@DeleteMapping(value = "/request1")
public String getRequestParam1 (@RequestParam String email) { // String 부분 : 객체 타입도 가능함.
return "e-mail : " + email;
}
}
'👩💻 BackEnd > 🌿 스프링 [Spring]' 카테고리의 다른 글
[Spring MVC] MVC 패턴 한계 (0) | 2024.01.11 |
---|---|
[Spring MVC] JSP 활용 방법 및 MVC 패턴의 등장 배경 (0) | 2024.01.11 |
[Springboot] DAO 설계 (0) | 2023.09.03 |
[Springboot] 로깅 라이브러리 - Logback (0) | 2023.08.31 |
[Spring] 스프링 MVC 기능 (0) | 2023.08.14 |