///////
Search
📺

get post

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 내용을 자바 객체로 매핑하는 역할
참고) 해당하는 어노테이션이 붙어있는 메서드로 클라이언트의 요청이 들어왔을 때, DispatcherServlet에서는 먼저 해당 HttpRequest의 미디어 타입을 확인하고, 타입에 맞는 MessageConverter를 통해 요청 본문인 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가 결합된 어노테이션
@ResponseBody 자바 객체를 HttpResponse의 responseBody 내용으로 매핑하는 역할을 합니다.
@ResponseBody는 return Type에 맞는 MessageConverter를 통해 return 하는 객체를 해당 타입으로 변환해서 클라이언트로 전달
따라서 @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
복사
https://mangkyu.tistory.com/49 ( @Controller와 @RestController 차이 )
https://wildeveloperetrain.tistory.com/144 ( @RequestBody @ResponseBody )

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하지 않기 때문에 캐시가 되지 않는다.