Spring API 연습

yuns·2022년 10월 4일
0

Spring

목록 보기
11/13
post-thumbnail

GetMapping

경로

GetMapping에 ctrl+클릭 하면 어떤 것을 사용할 수 있는지 볼 수 있다.

path = "/"
경로 명시적으로 지정하기

    @GetMapping(path = "/hello") // http://localhost:8080/api/get/hello
    public String getHello(){
        return "get HELLO";
    }

경로를 작성할땐 대문자를 사용하지 않음!!
boardPost (x)
board-post (o)


Path Variable

주소 지정을 하면서, 특정 부분이 유동적으로 변할 수 있게 하는 것

  1. 주소에 {바뀔부분} 으로 표시
  2. 매개변수에 @PathVariable 어노테이션을 붙여 사용 (매개변수 이름과 바뀔부분 이름이 같아야함!!)
    @GetMapping("/path-variable/{name}") // http://localhost:8080/api/get/path-variable/{name}
    public String pathVariable(@PathVariable String name){
        System.out.println("PathVariable : " + name);
        return name;
    }

만약 매개변수와 경로 이름을 다르게하고 싶다면?

    @GetMapping("/path-variable/{name}") // http://localhost:8080/api/get/path-variable/{name}
    public String pathVariable(@PathVariable(name = "name") String pathName){
        System.out.println("PathVariable : " + pathName);
        return pathName;
    }

Query Parameter

검색 할 때의 여러가지 매개변수 인자

?key=value
&key=value
&key=value . . .

형식으로 사용된다.

  1. Map으로 사용하는 경우
    // query parameter
    // http://localhost:8080/api/get/query-param?user=yuns@number=1&number=1
    @GetMapping("/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();
    } 
  1. key 값을 지정해줄 경우
    @RequestParam 어노테이션을 각 매개변수에 붙여줌
    // http://localhost:8080/api/get/query-param02?name=yuns&num=1
    @GetMapping("/query-param02")
    public String queryParam02(@RequestParam String name, @RequestParam int num){
        System.out.println(name);
        System.out.println(num);
        return name + ", " + num;
    }

하지만 이 방법도 매개변수의 수가 많아지면 어려워진다.

  1. 바로 dto형태로 매핑하는 방법 (추천)

    • dto패키지에 UserRequestDto.java 생성
    • 필드와 get set 메소드 생성
    • 매개변수로 UserRequestDto를 받아줌 (어노테이션은 붙이지 않음)
    • toString 사용법 : RequestDto.java에 toStr 쓰면 나오는 창에서 generate via wizard - 어떤 필드 넣을지 선택 후 만들기
        @Override
    public String toString() {
        return "UserRequest{" +
                "name='" + name + '\'' +
                ", num=" + num +
                '}';
    }
        // http://localhost:8080/api/get/query-param02?name=yuns&num=1
    @GetMapping("/query-param03")
    public String queryParam03(UserRequest userRequest){
        System.out.println(userRequest.getName());
        System.out.println(userRequest.getNum());
        return userRequest.toString();
    }

POSTMapping

Path Variable은 GET과 사용방식이 동일함.

  1. Map을 이용해 받기
    @RequestBody 어노테이션을 붙여준다

        @PostMapping("/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());
            });
    
            // 더 간결한 코드
    //        requestData.forEach((key, value) -> {
    //            System.out.println("key : " + key);
    //            System.out.println("key : " + value);
    //        });
        }
  2. dto로 매핑하기

    • dto클래스에 필드와 get set 메소드, toString 생성
    • 컨트롤러로 와서, 해당 PostMapping의 매개변수로 dto 받기
    • @RequestBody 어노테이션 붙여줘야함!
        @PostMapping("/post")
    public void post(@RequestBody PostRequestDto postRequestDto) {
        System.out.println(postRequestDto);
    }

변수 이름을 매핑하는 법 : @JsonProperty를 사용한다.

    @JsonProperty("phone_number")
    private String phoneNumber;

PUTMapping

Dto를 List로 필드에 저장하기

private List<Dto이름> 필드이름;

Car.java

package com.example.hello.dto;

public class Car {
    private String name;
    private String carNumber;

    public String getName() {
        return name;
    }

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

    public String getCarNumber() {
        return carNumber;
    }

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

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

PutRequestDto.java

package com.example.hello.dto;

import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import java.util.List;

// JSON을 snake case로 출력하게 해줌
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class PutRequestDto {

    private String name;
    private int age;

    private List<Car> 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<Car> getCarList() {
        return carList;
    }

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

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

PutApiController.java

package com.example.hello.controller;


import com.example.hello.dto.PutRequestDto;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class PutApiController {
    @PutMapping("/put")
    public void put(@RequestBody PutRequestDto putRequestDto){
        System.out.println(putRequestDto);
    }
}

JSON 데이터 넣기

{
  "name" : "user01",
  "age" : 20,
  "car_list" : [
    {
    	"name" : "mycar",
      "car_number" : "1234"
    },
    {
    	"name" : "mycar3",
      "car_number" : "4567"
    }
  ]
}

출력된 값

@RestController
@RequestMapping("/api")
public class PutApiController {
    @PutMapping("/put")
    public PutRequestDto put(@RequestBody PutRequestDto putRequestDto){
        System.out.println(putRequestDto);
        return putRequestDto;
    }
}

Response 내려주기


Controller로 JSON을 내려주려고 할 때,
annotation을 @Controller로 하면 페이지를 내려주겠다는 의미이다.
@Controller에선 RequestBody를 따로 사용 하지 않고, 페이지만 내려주는 용도로 쓴다.

@RestController을 해야 Request Body를 내려줄 수 있다!!

0개의 댓글