POST API

리소스를 추가하기 위해 사용되는 API

일반적으로 추가하고자 하는 Resource를 http body에 추가하여 서버에 요청

따라서 @RequestBody를 이용하여 body에 담겨있는 값을 받아야 한다.

 

@PostMapping, @RequestBody

@PostMapping(value = "/default")
public String postMethod() {
	return "Hello World";
}

// 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();
}

 

DTO 사용

key와 value가 정해져 있지만, 받아야 할 파라미터가 많을 경우 DTO 객체를 사용

GetMapping에서는 DTO 객체를 사용할 때 @RequestBody를 붙이지 않아도 정상적으로 동작이 되나, POST API에서는 반드시 붙여야 값을 받을 수 있다.

// http://localhost:8080/api/v1/post-api/member2
@PostMapping(value = "/member2")
public String postMemberDto(@RequestBody MemberDTO memberDTO) {
	return memberDTO.toString();
}

 

GET API

@RequestMapping

value와 method로 정의하여 API 개발하는 방식이다. 이제는 고전적인 방법으로 사용하지 않는 추세이다.

@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
	return "Hello World!";
}

 

@GetMapping (without Param)

@GetMapping("hello")
public String hello() {
    return "Hello World!";
}

 

@PathVariable

Get 요청에서 파라미터를 전달하기 위해 URL에 값을 담아 요청하는 방법

아래 방식은 @GetMapping에서 사용된 {변수}의 이름과 메소드의 매개변수와 일치시켜야 함

@GetMapping(value="/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
	return variable;
}

유지 보수의 관점에서 변수의 이름을 일치시키기 힘들때 다음과 같이 작성

@GetMapping(value="/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
	return var;
}

 

@RequestParam

쿼리 문자열을 전달하기 위해 사용되는 방법

http://localhost:8080/api1/v1/get-api/request1?name=square&email=squareyun@gmail.com&organization=itsquare

@GetMapping(value="/request1")
public String getRequestParam1(
	@RequestParam String name,
	@RequestParam String email,
	@RequestParam String organization) {
    return name + "" + email + "" + organization;
}

어떤 요청 값이 들어올지 모를 경우 아래와 같이 Map을 이용하여 사용

@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();
}

key와 value가 정해져 있지만, 받아야 할 파라미터가 많을 경우 DTO 객체를 사용한 방식

@GetMapping(value="/request3")
public String getRequestParam3(MemberDTO memberDTO) {
    //return memberDTO.getName() + memberDTO.getEmail() + memberDTO.getOrganization();
    return memberDTO.toString();
}
public class MemberDTO {
	private String name;
	private String email;
	private String organization;

	...
}

 

PUT API

해당 리소스가 존재하면 갱신하고, 없을 경우에는 새로 생성해주는 API이다. 즉 업데이트를 의미한다.

@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {

    // http://localhost:8080/api/v1/put-api/defalut
    @PutMapping(value = "/defalut")
    public String putMethod() {
        return "Hello World!; ";
    }

    // http://localhost:8080/api/v1/put-api/member
    @PutMapping(value = "/member")
    public String putMember(@RequestBody Map<String, Object> putData) {
        StringBuilder sb = new StringBuilder();

        putData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });

        return sb.toString();
    }

    // http://localhost:8080/api/v1/put-api/member1
    @PutMapping(value = "/member1")
    public String putMemberDto1(@RequestBody MemberDTO memberDTO) {
        return memberDTO.toString();
    }

    // http://localhost:8080/api/v1/put-api/member2
    @PutMapping(value = "/member2")
    public MemberDTO putMemberDto2(@RequestBody MemberDTO memberDTO) {
        return memberDTO; // json의 형태로 반환된다. 이 방식이 더 선호됨
    }

    // http://localhost:8080/api/v1/put-api/member3
    @PutMapping(value = "/member3")
    public ResponseEntity<MemberDTO> putMemberDto3(@RequestBody MemberDTO memberDTO) {
        return ResponseEntity.status(HttpStatus.ACCEPTED).body(memberDTO); // 202 코드로 응답
    }
}

 

ResponseEntity

putMemberDto3 메소드를 보면, ResponseEntity가 사용되었다.

이것은 Spring Framework에서 제공하는 클래스 중 HttpEntity라는 클래스를 상속받아 사용하는 클래스로, 사용자의 HttpRequest에 대항 응답 데이터를 포함한다.

 

포함하는 클래스
- HttpStatus
- HttpHeaders
- HttpBody

 

왜 사용할까?

지금까지 봤던 Http 응답 코드는 400이라는 클라이언트 에러 코드, 200이라는 정상 코드가 있었지만, 이러한 Response 데이터를 디테일하게 설정할 때 사용한다.

 

위의 코드에서 사용한 HttpStatus.ACCEPTED는 202 코드이다. enum으로 구현되어 있는 것을 확인할 수 있다.

 

 

 

DELETE API

리소스를 삭제하기 위해 사용되는 API로, 일반적으로 @PathVariable을 통해 리소스 ID 등을 받아 처리한다.

@RestController
@RequestMapping("/api/v1/delete-api")
public class DeleteController {

    // http://localhost:8080/api/v1/delete-api/delete/{String 값}
    @DeleteMapping(value = "/delete/{variable}")
    public String DeleteVariable(@PathVariable String variable) {
        return variable;
    }
}

 

Reference

어라운드허브 스튜디오 - AroundHub Studio

'Back > spring' 카테고리의 다른 글

스프링부트 프로퍼티 암호화 (with. Jasypt)  (0) 2022.03.01
스프링부트 서비스 구조  (0) 2022.02.28
Swagger 라이브러리  (0) 2022.02.26
스프링 웹 개발 기초  (0) 2021.06.26
squareyun