본문 바로가기
Spring/Spring-detail

API를 작성하는 다양한 방법

by YoonJong 2022. 9. 15.
728x90

@RestController

 - @Controller + @ResponseBody 가 결합된 어노테이션

 - 컨트롤러 클래스 하위 메서드에 @ResponseBody 어노테이션을 붙이지 않아도 문자열과 JSON 등을 전송 가능

 - View를 거치치 않고 HTTP ResponseBody에 직접 Return 값을 담아서 보낸다.

 

@RequestMapping

 - MVC의 핸들러 매핑을 위해서 사용한다.

 - 클래스와 메소드의 RequestMapping 을 통해URL을 매핑하여 경로를 설정 및 해당 메서드 처리가능

 

method : GET, POST , DELETE , PUT, PATCH 

스프링 4.3 부터 메소드를 지정하는 방식을 간단하게 사용가능하다.

- @GetMapping

- @PostMapping

- @DeleteMapping

- @PutMapping

- @PatchMapping


Get API

@PathVariable

 - GET 형식의 요청에서 파라미터를 전달하기 위해 URL 에 값을 담아 요청하는 방법

 

@RequestParam

 - GET 형식의 요청에서 쿼리 문자열을 전달하기 위해 사용되는 방법

 - ? 를 기준으로 key - value 형태로 전달되며, 복수 형태로 전달할 경우 & 를 사용

 

 - 어떤 요청이 들어올지 모르는 경우 사용 ( Map 사용 )

 

DTO

 - 데이터 전송을 위해 사용되는 데이터 컨테이너

 

현재는 전부 header 부분은 text/plain 방식이다.


@RestController
@RequestMapping("/api/v1/get-api")
public class GetController {

    // http://localhost:8080/api/v1/get-api/hello
    @GetMapping("/hello")
    public String getHello() {
        return "Hello World";
    }

    // http://localhost:8080/api/v1/get-api/variable1/String값
    @GetMapping("/variable1/{variable}")
    public String getVariable1(@PathVariable("variable") String variable) {
        return variable;
    }

    // http://localhost:8080/api/v1/get-api/variable2/String값
    @GetMapping("/variable2/{variable}")
    public String getVariable2(@PathVariable("variable") String var) {
        return var;
    }

    // http://localhost:8080/api/v1/get-api/request1?name=홍길동&email=test@naver.com&organization=테스트
    @GetMapping("/request1")
    public String getRequestParam1(
            @RequestParam String name,
            @RequestParam String email,
            @RequestParam String organization) {
        return name + " " + email + " " + organization;
    }

    // 파라미터에 어떤 값이 들어올지 모를때 Map 을 사용
    // http://localhost:8080/api/v1/get-api/request2?name=홍길동&email=test@naver.com&organization=테스트
    @GetMapping("/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();
    }

    // http://localhost:8080/api/v1/get-api/request3?name=홍길동&email=test@naver.com&organization=테스트
    @GetMapping("/request3")
    public String getRequestParam3(MemberDto memberDto) {
        return memberDto.toString();
    }
}
package studio.thinkground.testproject.dto;

import lombok.Data;

@Data
public class MemberDto {

    private String name;
    private String email;
    private String organization;
}

 

 


Post API

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

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

 - @ReqeustBody를 이용하여 body에 담겨있는 값을 받아야한다.

   -> 클라이언트의 요청 트래픽에 값이 포함되어있다. 

 



@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {

    // http://localhost:8080/api/v1/post-api/default
    @PostMapping("/default")
    public String postMethod() {
        return "Hello World";
    }

    // http://localhost:8080/api/v1/post-api/member
    @PostMapping("/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:8080/api/v1/post-api/member2
    @PostMapping("/member2")
    public MemberDto PostMemberDto(@RequestBody MemberDto memberDto) {
        return memberDto;
    }
}

 

JSON 형식 테스트


Put API

 - 해당 리소스가 존재하면 갱신하고, 리소스가 없을 경우에는 새로 생성해주는 API

 - 업데이트를 위한 메소드

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

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

    // http://localhost:8080/api/v1/put-api/member1
    @PutMapping("/member1")
    public String postMemberDto1(@RequestBody MemberDto memberDto) {
        return memberDto.toString();
    }

    // http://localhost:8080/api/v1/put-api/member2
    // JSON 형식으로 전달
    @PutMapping("/member2")
    public MemberDto postMemberDto2(@RequestBody MemberDto memberDto) {
        return memberDto;
    }

    // http://localhost:8080/api/v1/put-api/member3
    // JSON 형식으로 전달
    @PutMapping("/member3")
    public ResponseEntity<MemberDto> postMemberDto3(@RequestBody MemberDto memberDto) {
        return ResponseEntity.status(HttpStatus.ACCEPTED).body(memberDto);
//        return new ResponseEntity<>(memberDto, HttpStatus.ACCEPTED);
    }
}

Delete API

 

- 서버를 통해 리소스를 삭제하기 위해 사용되는 API

- 일반적으로 @PathVariable 을 통해 리소스 ID 등을 받아 처리한다.

 

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

    @DeleteMapping("/delete/{variable}")
    public String DeleteVariable(@PathVariable String variable) {
        return variable;
    }
}

 


++ ResponseEntity : status를 디테일하게 수정가능

 - HttpEntity 라는 클래스를 상속받아 사용하는 클래스

 - 사용자의 HttpRequest에 대한 응답 데이터를 포함

 HttpStatus / HttpHeaders / HttpBody

728x90

댓글