Spring Boot Http Method

minbo2002·2022년 4월 29일
0

스프링부트

목록 보기
1/13
post-thumbnail

REST API 설계를 위한 항목에서 Resource에 대한 행위는 HTTP Method로 표현되어야 한다.
코드를 통해서 각 HTTP Method를 테스트했다.

종류역할
POST (C)Resource 생성. DataBody 포함가능
GET (R)Resource를 조회하고 Document에 대한 정보를 가져온다. DataBody 포함안됨
PUT (U)Resource가 없으면 생성. Resource가 있으면 기존것을 수정. DataBody 포함가능
DELETE (D)Resource 삭제. DataBody 포함안됨

1) GET 방식

@RestController
@RequestMapping("/api/get")
public class GetApiController {

    @GetMapping(path = "get-mapping-path")
    public String getHello() {

        return "GetMapping path";
    }

    @RequestMapping(value = "/get-request-mapping", method = RequestMethod.GET)
    public String hi() {

        return "RequestMapping Get";
    }

    @GetMapping(path = "path-variable/{id}")
    public String pathVariable(@PathVariable(name = "id") String pathName) {

        System.out.println("PathVariable : " + pathName);

        return pathName;
    }

    @GetMapping(path = "query-param")
    public String queryParam(@RequestParam Map<String, String> queryParam) {

        StringBuilder sb = new StringBuilder();

        queryParam.entrySet().forEach( entry -> {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
            System.out.println("\n");

            sb.append(entry.getKey() + " = " + entry.getValue() + "\n");
        });

        return sb.toString();
    }

    @GetMapping(path = "query-param-2")
    public String queryParam2(@RequestParam String name,
                              @RequestParam String email,
                              @RequestParam int age) {

        System.out.println(name);
        System.out.println(email);
        System.out.println(age);

        return name + " " + email + " " + age;
    }

    @GetMapping(path = "query-param-3")
    public String queryParam3(UserRequest userRequest) {

        System.out.println(userRequest.getName());
        System.out.println(userRequest.getEmail());
        System.out.println(userRequest.getAge());

        return userRequest.toString();

    }
}
public class UserRequest {

    private String name;
    private String email;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserRequest{" +
                "name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

<GetMapping 방법>
1. @GetMapping 어노테이션으로 내부에 path를 지정해서 명확하게 경로를 지정
2. @RequestMapping 어노테이션으로 내부에 value로 경로를 지정하고 method로 RequestMethod.GET을 지정해준다.

@PathVariable 어노테이션을 사용할때는 @GetMapping 어노테이션 내부 { }값과 , @PathVariable 어노테이션 내부 " " 값이 같아야한다.

<parameter 받는 방법>
1. @RequestParam 어노테이션 및 Map< > 을 사용해서 한번에 받기
2. @RequestParam 어노테이션만 사용해서 명시적으로 변수들을 각각 받기
3. dto클래스를 만들어서 dto 내의 변수와 mapping하기


2) POST 방식

@RestController
@RequestMapping("/api/post")
public class PostApiController {

    @PostMapping(path = "post")
    public void post(@RequestBody Map<String, Object> requestData) {
                                              
        requestData.entrySet().forEach(stringObjectEntry -> {
    
            System.out.println("key : " + stringObjectEntry.getKey());
            System.out.println("value : " + stringObjectEntry.getValue());
        });
    }

    @PostMapping(path = "post-dto")
    public void post(@RequestBody PostRequestDto postRequestDto) {

        System.out.println(postRequestDto);
    }
}

클라이언트와 서버가 통신할때 본문(body)에 담는 데이터 형식은 JSON 형식이므로
parameter에 @RequestBody 어노테이션을 붙여서 http request의 본문(body)을 그대로 전달한다.


3) PUT 방식

@RestController
@RequestMapping("/api/put")
public class PutApiController {

    @PutMapping(path = "put")
    public PutRequestDto put(@RequestBody PutRequestDto putRequestDto) {

        System.out.println(putRequestDto);

        return putRequestDto;
    }

    @PutMapping(path = "path-variable/{userId}")
    public PutRequestDto pathVariable(@RequestBody PutRequestDto putRequestDto,
                                      @PathVariable(name = "userId") Long id) {
                                      
        System.out.println("id : " + id);

        return putRequestDto;
    }
}
public class PutRequestDto {

    private String name;
    private int age;

    @JsonProperty("car_list")
    private List<CarDto> carList;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<CarDto> getCarList() {
        return carList;
    }

    public void setCarList(List<CarDto> carList) {
        this.carList = carList;
    }

    @Override
    public String toString() {
        return "PutRequestDto{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", carList=" + carList +
                '}';
    }
}
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class CarDto {

    private String carName;

    private String carNumber;

    public String getCarName() {
        return carName;
    }

    public void setCarName(String carName) {
        this.carName = carName;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    @Override
    public String toString() {
        return "CarDto{" +
                "carName='" + carName + '\'' +
                ", carNumber='" + carNumber + '\'' +
                '}';
    }
}

반환타입을 dto클래스로 하고 실제 값을 입력했을때 body에 출력되는 값을 확인.

자바의 클래스나 변수는 기본적으로 카멜케이스(첫단어의 시작 소문자, 이후 단어의 시작 대문자)이다. ex) carList
View단에서 카멜케이스가 아닌 스네이크케이스(언더바 _ 사용)로 표현하려면
1. 한가지 변수에 대해서 @JsonProperty 어노테이션을 사용하여 getter/setter 변수를 멤버변수와 다르게 사용.
2. 클래스 위에 적용하는 @JsonNaming 어노테이션을 사용하여 클래스 내의 모든 변수를 일괄적으로 적용해서 사용.


4) DELETE 방식

@RestController
@RequestMapping("/api/delete")
public class DeleteApiController {

    @DeleteMapping(path = "delete/{userId}")
    public void delete(@PathVariable String userId, @RequestParam String account) {

        System.out.println(userId);
        System.out.println(account);
    }
}

body에는 아무런 정보가 없으므로 @PathVariable 어노테이션만을 사용해서 특정 userId를 삭제했다.

출처

  • 패스트캠퍼스 내의 Spring 웹개발마스터 강의
profile
꾸준하게

0개의 댓글