[Spring] Response 내려주기 및 Object Mapper

WOOK JONG KIM·2022년 10월 21일
0

패캠_java&Spring

목록 보기
37/103
post-thumbnail

Response 내려주기

Resources/static에 있는 html파일

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
main Html String Boot
</body>
</html>

dto/user

package com.example.response.dto;

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

// 스네이크 케이스 변수마다 처리하는 것이 아닌 한번에 처리할 때 JsonNaming 사용
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)

// 제이슨 규격 정함, NULL 값은 리스폰스가 내려가지 않게 설정하는 어노테이션
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User {
    private String name;
    // 값이 없을 때 0이 아닌 null을 띄우고자 할 때 Integer
    private Integer age;
    private String phoneNumber;
    private String address;

    public String getName() {
        return name;
    }

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

    //Object Mapper는 get 메서드 참조함
    public Integer getAge() {
        return age;
    }

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

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getAddress() {
        return address;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
package com.example.response.controller;

import com.example.response.dto.User;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

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

    // GetMapping으로 넘어온 쿼리 파라미터에 특정한 값을 리턴 시켜 주기 , TEXT내려 주는 경우
    @GetMapping("/text")
    public String text(@RequestParam String account){
        return account;
    }

    //JSON, 에코 형태
    // request오면 -> object Mapper에 의해 -> Object -> method -> object Mapper -> JSON -> response
    @PostMapping("/json")
    public User json(@RequestBody User user){
        return user; // 200 OK
    }
    // POST는 기존에 없는 것을 생성했을때 201을 Response
    // Response를 내려줄때 http status 를 정해주려면 reponse entity 객체를 통해 내려줘야함
    // Response 커스터마이징시 주로 사용
    @PutMapping("/put")
    public ResponseEntity<User> put(@RequestBody User user){
        return ResponseEntity.status(HttpStatus.CREATED).body(user);
    }
}
package com.example.response.controller;

import com.example.response.dto.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

// html 리턴시 사용, 리소스를 찾게됨
@Controller
public class PageController {
    // Controller라는 어노테이션은 스트링을 리턴하면 리소스를 찾게됨
    @RequestMapping("/main")
    public String main(){
        return "main.html";
    }

    // 1. Response Entity 사용

    // 2. ResponseBody 사용
    // 이 어노테이션 붙이면 객체 자체를 리턴했을 때 리소스 찾는것이 아닌 바디를 구현해서 내리겠다!
    // 거의 사용 X
    @ResponseBody
    @GetMapping("/user")
    public User user(){
        var user = new User(); // 타입 추론
        user.setName("steve");
        user.setAddress("패스트캠퍼스");
        return user;
    }
}

Object Mapper

직렬화 역직렬화 예시

JSON :

속성-값 쌍(attribute–value pairs), 배열 자료형(array data types) 또는 기타 모든 시리얼화 가능한 값(serializable value) 또는 "키-값 쌍"으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷

package com.example.objectmapper;

import com.fasterxml.jackson.annotation.JsonProperty;

public class User {
    private String name;
    private int age;
    @JsonProperty("phone_number")
    private String phoneNumber;
	
    // 역직렬화 시 이 Default Constructor 참조 -> 없으면 error
    public User(){
        this.name = null;
        this.age = 0;
        this.phoneNumber = null;
    }

    public User(String name, int age, String phoneNumber){
        this.name = name;
        this.age = age;
        this.phoneNumber = phoneNumber;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", phoneNumber='" + phoneNumber + '\'' +
                '}';
    }
}
package com.example.objectmapper;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ObjectMapperApplicationTests {

    @Test
    void contextLoads() throws JsonProcessingException {
        System.out.println("~~~~~");

        // Object Mapper 역할
        // Text JSON -> Object, Object -> Text JSON

        //controller req Json(text):input -> Object
        //response object return -> json(text)

        var objectMapper = new ObjectMapper();

        // object -> text, ObjectMapper는 get 메서드를 활용!!!!!! set 은 굳이 X
        // 클래스 안 다른 메서드를 만들더라도 get을 이름에 붙이면 오류 발생
        var user = new User("Steve", 10, "010-1111-2222");
        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);

        // text -> object(역직렬화 겠지?)
        // objectMapper는 default 생성자가 있어야 함(오버로딩 하엿을 시)
        var objectUser = objectMapper.readValue(text, User.class);
        System.out.println(objectUser);
    }

}
profile
Journey for Backend Developer

0개의 댓글