Get
Get은 보통 리소스를 조회할 때 사용하며, 서버에 전달하고 싶은 데이터는 query를 통해서 전달한다. 메시지 바디를 사용해서 데이터를 전달할 수 있지만, 지원하지 않는 곳이 많아서 권장하지 않는다.
Get메서드의 속성
•
계속해서 호출해도 리소스를 변경하지 않는다.
•
메소드를 계속 호출해도 결과가 똑같다.
•
캐싱을 해서 데이터를 효율적으로 가져올 수 있다.
Get 메서드 구현
@PathVariable
중괄호 안에 전달할 값을 받습니다.
예시)
http://localhost:8080/api/v1/get-api/variable2/값
@GetMapping("/variable2/{variable}")
public String getVariable2(@PathVariable String variable) {
return variable;
}
Java
복사
@RequestParam
?뒤로 전달할 값을 id=value 형태로 받습니다.
예시)
http://localhost:8080/api/v1/get-api/variable2?name=junha&email=okokok@mail&organization=멋사
@GetMapping("/request1")
public String getVariable3(@RequestParam String name,
@RequestParam String email,
@RequestParam String organization) {
return String.format("%s %s %s", name, email, organization);
}
Java
복사
@PathVariable VS @RequestParam
@PathVariable은 RESTful 방식이며 Rest 통신할 때 쓰입니다.
RESTful 방식에 맞게 좀 더 직관적입니다.
@RequestParam은 쿼리 스트링이라 부르며 Get방식의 통신을 할 때 주로 쓰입니다.
null값이 허용되며, 키:밸류 값으로 보낼 수 있습니다.
상황에 맞게 사용하면 됩니다.
DTO 객체를 활용한 Get 메서드 구현
DTO란?
Data Transfer Object의 약자로, 다른 레이어 간의 데이터 교환에 활용됩니다. 각 클래스 및 인터페이스를 호출하면서 전달하는 매개변수로 사용되는 데이터 객체입니다.
public class MemberDto {
private String name;
private String email;
private String organization;
...
//생성자, getter 생략
...
@Override
public String toString(){
return String.format("%s %s %s", this.name, this.email, this.organization);
}
}
Java
복사
@GetMapping("/request2")
public String getVariable4(@RequestParam
Map<String, String> param) {
param.entrySet().forEach(
(map) -> {
System.out.printf("key:%s value:%s\n", map.getKey(), map.getValue());
}
);
return "호출완료";
}
Java
복사
Post
POST 메소드는 주로 새로운 리소스를 생성(create)할 때 사용
Post API
웹 애플리케이션을 통해 데이터베이스 등의 저장소에서 리소스를 저장할 때 사용되는 API
@RequestBody
HttpRequest의 RequestBody 내용을 자바 객체로 매핑하는 역할
@RequestBody를 활용한 POST 메서드 구현 (Map)
Map 객체는 요청을 통해 어떤 값이 들어오게 될지 특정하기 어려울 때 사용
import org.springframework.web.bind.annotation.*;
import java.util.Map;
@RestController
@RequestMapping("/api/v1/post-api") // 공통 부분 분리
public class PostController {
@PostMapping("/member")
public String postMember(@RequestBody Map<String, Object> postData) {
// Http body의 내용을 Map 객체에 매핑
StringBuilder sb = new StringBuilder();
postData.entrySet().forEach(map -> {
sb.append(map.getKey() + " : " + sb.append(map.getValue()) + "\n");
});
return sb.toString();
}
Java
복사
Talend API Tester를 이용한 테스트
@RequestBody를 활용한 POST 메서드 구현 (DTO)
import com.springboot.hello.domain.dto.MemberDto;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
@PostMapping("/member2")
public String postMemberDto(@RequestBody MemberDto memberDto) {
// Http body의 내용을 MemberDto 객체에 매핑
return memberDto.toString();
}
}
Java
복사
Talend API Tester를 이용한 테스트 ( 정상 )
Talend API Tester를 이용한 테스트 ( MemberDto에 없는 값을 넣는다면
)
참고) @RestController 대신 @Controller를 사용하면 안되나 
@RestController는 @Controller에 @ResponseBody가 결합된 어노테이션
따라서 @Controller를 사용하려면 아래와 같이 @ResponseBody를 붙여줘야한다.
import com.springboot.hello.domain.dto.MemberDto;
import org.springframework.web.bind.annotation.*;
@Controller
@RequestMapping("/api/v1/post-api")
public class PostController {
@PostMapping("/member2")
public @ResponseBody String postMemberDto(@RequestBody MemberDto memberDto) {
// Http body의 내용을 MemberDto 객체에 매핑
return memberDto.toString();
}
}
Java
복사
Get vs Post
•
사용목적 : GET은 서버의 리소스에서 데이터를 요청할 때, POST는 서버의 리소스를 새로 생성하거나 업데이트할 때 사용한다.
•
DB로 따지면 GET은 SELECT 에 가깝고, POST는 Create 에 가깝다고 보면 된다.
•
요청에 body 유무 : GET 은 URL 파라미터에 요청하는 데이터를 담아 보내기 때문에 HTTP 메시지에 body가 없다. POST 는 body 에 데이터를 담아 보내기 때문에 당연히 HTTP 메시지에 body가 존재한다.
•
멱등성 (idempotent) : GET 요청은 멱등이며, POST는 멱등이 아니다.
•
GET은 idempotent하기 때문에 캐시가 되고 POST는 idempotent하지 않기 때문에 캐시가 되지 않는다.