개발새발/Spring

220216_스프링 입문_스프링 부트 시작하기_Object Mapper 및 모범사례_패스트캠퍼스 챌린지 24일차

막동이아빠 2022. 2. 16. 21:20

220216_스프링 입문_스프링 부트 시작하기_Object Mapper 및 모범사례_패스트캠퍼스 챌린지 24일차

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

[스프링 입문_스프링 부트 시작하기_Object Mapper 및 모범사례]

1. 실습

 (1) File > New > Project

   : Language(Java), Type(Gradle), Artifact(object-mapper), Java(11), Packaging(Jar) Next 클릭

   : Web > Spring Web 체크 Finish 클릭

 (2) test 코드가 잘 동작하는지 확인해봅시다

   : src > test > java > com.example.objectmapper > ObjectMapperApplicationTests

package com.example.objectmapper;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class ObjectMapperApplicationTests {

    @Test
    void contextLoads() {
        System.out.println("hello");
    }

}

2022-02-16 20:31:36.430  INFO 8892 --...
hello
BUILD SUCCESSFUL in 8s
4 actionable tasks: 2 executed, 2 up-to-date

 

동작 확인 완료~

 

 (3) Object Mapper

// Object Mapper의 역할
// Text 형태의 Json --> Object 형태
// Object 형태 --> Text 형태의 Json

// controller req json(text) -> object
// response object -> json(text)

 코드를 작성해봅시다~

 

 (4) Object를 먼저 만들어줍니다 main > com.example.objectmapper 에 User 클래스를 추가합니다

package com.example.objectmapper;

public class User {
    private String name;
    private int age;

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

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

 (5) ObjectMapperApplicationTests 를 작성합니다

package com.example.objectmapper;

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) -> object
        // response object -> json(text)

        var objectMapper = new ObjectMapper();

        //object -> text
        var user = new User("steve", 10);

        var text = objectMapper.writeValueAsString(user);
        System.out.println(text);

        //text -> object
    }

}

  : 실행시 오류가 발생합니다.

  이유는? ObjectMapper는 get 메소드를 참조합니다

 (6) User에 getter를 생성합니다

package com.example.objectmapper;

public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

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

 결과:

{"name":"steve","age":10}

 

object가 정상적으로 json 형태로 출력된다!

 

 (7) text --> object 테스트를 해보자

//text -> object
var objectUser = objectMapper.readValue(text, User.class);
System.out.println(objectUser);

 : 오류가 발생한다.. 왜?

   : ObjectMapper가 readValue 동작 하기 위해서는 default 생성자가 필요하다

   User에서 오버로딩 해줬으므로, Default 생성자 또한 추가해준다

public User(){
    this.name = null;
    this.age = 0;
}

 실행 결과 :

{"name":"steve","age":10}
User{name='steve', age=10}

 

Object Mapper는 get 메소드를 활용하므로~ User에서 getter가 아닌 다른 메소드에 get을 붙이면 오류가 발생할 수 있다~ 주의하자~

 

 (8) Camael case <-> Snake case

   : User 에 phoneNumber 변수를 추가하고 json 프로퍼티에서는 phone_number로 동작하게 하자

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

  기본 생성자는

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;
}
@Override
public String toString() {
    return "User{" +
            "name='" + name + '\'' +
            ", age=" + age +
            ", phoneNumber='" + phoneNumber + '\'' +
            '}';
}

 결과:

{"name":"steve","age":10,"phone_number":"010-1111-2222"}
User{name='steve', age=10, phoneNumber='010-1111-2222'}

 

24일차 강의 완료~

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

 

 

https://bit.ly/37BpXiC

 

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

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

fastcampus.co.kr

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