개발새발/Spring

220212_스프링입문_스프링 부트 시작하기_POST API_패스트캠퍼스 챌린지 20일차

막동이아빠 2022. 2. 13. 22:50

220212_스프링입문_스프링 부트 시작하기_POST API_패스트캠퍼스 챌린지 20일차

<2022년 02월 12일 _ 패스트캠퍼스 챌린지 20일차>

[스프링입문_스프링 부트 시작하기_POST API]

1. 메소드의 특성

  의미 CRUD 멱등성 안정성 Path Variable Query
Parameter
DataBody
GET 리소스 취득 R O O O O X
POST 리소스 생성,추가 C X X O O
PUT 리소스 갱신, 생성 C / U O X O O
DELETE 리소스 삭제 D O X O O X
HEAD 헤더 데이터 취득 - O O - - -
OPTIONS 지원하는 메소드 취득 - O - - - -
TRACE 요청메시지 반환 - O - - - -
CONNECT 프록시 동작의 터널 접속으로 변경 - X - - - -

2. JSON의 구조

JSON (key : value)

 : string : value

 : number: value

 : boolean: value

 : object: value { }

 : array: value [ ]

{
    "phone_number" : "010-1111-2222" //snake case
  , "phoneNumber" : "value" //camel case
  , "age" : 10
  , "isAgree" : false
  , "account" {
    "email" : "steve@gmail.com"
    ,"password" : "1234"
  }
}

//user 조회 하는 경우
{
  "user_list" : [
    {
      "email" : "aaaa@gmail.com"
      ,"password" : "1234"
    },
    {
    "email" : "bbbb@gmail.com"
    ,"password" : "1111"
    },
    {
    "email" : "cccc@gmail.com"
    ,"password" : "2222"
    }
  ]
}

 

3. 실습

 (1) 다음과 같은 구조의 json 을 서버에서 어떻게 받는지 확인해 보자

{
  "account" : "",
  "email" : "",
  "password" : "",
  "address" : ""
}

 (2) File > New > Project

    : Artifact: post, Java: 11, Language: Java, Type: Gradle, Packaging: Jar

 (3) Web > Spring Web 선택 후 Finish

 (4) com.example.post > New package --> controller 패키지 추가

    : controller 패키지에 PostApiController 클래스 추가

 (5) PostApiController 클래스 작성

package com.example.post.controller;

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

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

    //get 방식과 기본적인 개념 자체는 같다
    @PostMapping("/post")
    //Post일때는 파라미터에 @RequestBody를 붙여줌 get일때는 @RequestParam 이었음!
    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("value : " + value);
        });
    }
}

 (6) 서버실행 및 Talend API 에서 테스트

 METHOD: POST

 http://localhost:8080/api/post

 body 내용:

{
  "account" : "user01",
  "email" : "steve@gmail.com",
  "address" : "패스트 캠퍼스",
  "password" : "1234"
}

 결과:

 (7) 실제 개발을 할 때에는 파라미터가 뭐가 들어왔는지 Map은 알기 어렵기 때문에 DTO를 작성해보자!

   : com.example.post 에 dto 패키지 추가

   : dto 패키지에 PostRequestDto 클래스 추가

  : 코드에 변수 작성 후, 메뉴 상단, Code > Generate > Getters and Setters 선택 > OK

package com.example.post.dto;

public class PostRequestDto {

    private String account;
    private String email;
    private String address;
    private String password;

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getEmail() {
        return email;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "PostRequestDto{" +
                "account='" + account + '\'' +
                ", email='" + email + '\'' +
                ", address='" + address + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

 (8) Dto를 파라미터로 갖는 post()메소드를 오버로딩해 작성했다 (url은 /post-dto 로 매핑)

package com.example.post.controller;

import com.example.post.dto.PostRequestDto;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

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

    //get 방식과 기본적인 개념 자체는 같다
    @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("value : " + value);
        });
    }

    @PostMapping("/post-dto")
    public void post(@RequestBody PostRequestDto postRequestDto){
        System.out.println(postRequestDto);
    }
}

 /post-dto 경로 실행 결과:

 (9) Java에서는 camel case 인데 보내는쪽에서는 snake case로 작성된 변수라면? 테스트 해보자

  : PostRequestDto 에 다음을 추가해준다

private String phoneNumber;//phone_number

public String getPhoneNumber() {
    return phoneNumber;
}

 : Talend API에서는 보낼 때 snake case 로 보내본다

{
  "account" : "user01",
  "email" : "steve@gmail.com",
  "address" : "패스트 캠퍼스",
  "password" : "1234",
  "phone_number" : "010-1111-2222"
}

 결과:

PostRequestDto{account='user01', email='steve@gmail.com', address='패스트 캠퍼스', password='1234', phoneNumber='null'}

 : 매칭이 되지 않았으므로 매칭 해줘야함

 --> @JsonProperty("phone-number") 사용

private String phoneNumber;//phone_number

@JsonProperty("phone_number")
public String getPhoneNumber() {
    return phoneNumber;
}

@JsonProperty("OTP")
private String OTP;

정리:

 @RequestBody 어노테이션을 통해, Json Data를 Parsing 할 수 있고, 이를 위해서 자바에서는 데이터 클래스 (dto) 객체를 정의 해줘야한다. 기본은 camel case를 사용하고, 변수 명이 매칭이 안될 때나 변수명이 Camel case가 아닌 경우(대문자 변수등)는, @JsonProperty("변수명")을 사용하여 매핑해줘야 한다.

 

@RestController Rest API 설정
@RequestMapping 리소스를 설정 (method로 구분 가능)
@PostMapping Post Resource 설정
@RequestBody Request Body 부분 Parsing
@PathVariable URL Path Variable Parsing
@JsonProperty json naming
@JsonNaming class json naming

20일차 강의 완료~

필기 & 내 화면 스크린샷 저장

 

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.