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일차 강의 완료~
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'개발새발 > Spring' 카테고리의 다른 글
220214_스프링입문_스프링 부트 시작하기_DELETE API_패스트캠퍼스 챌린지 22일차 (0) | 2022.02.14 |
---|---|
220213_스프링입문_스프링 부트 시작하기_PUT API_패스트캠퍼스 챌린지 21일차 (0) | 2022.02.13 |
220211_스프링입문_스프링 부트 시작하기_GET API(2)_패스트캠퍼스 챌린지 19일차 (0) | 2022.02.11 |
220210_스프링입문_스프링 부트 시작하기_GET API(1)_패스트캠퍼스 챌린지 18일차 (0) | 2022.02.10 |
220209_스프링입문_스프링 부트 시작하기_Hello World API를 만들어보자_패스트캠퍼스 챌린지 17일차 (0) | 2022.02.09 |