[Spring] Object Mapper

개발log·2024년 3월 17일

Spring

목록 보기
4/16
post-thumbnail

Object Mapper

  • 객체 간 데이터를 변환하는 데 사용되는 도구
  • 주로 객체를 직렬화(serialize)하거나 역직렬화(deserialize)할 때 사용

기본 Object Mapper

@SpringBootTest
class RestApiApplicationTests {

	@Autowired
	private ObjectMapper objectMapper;
	@Test
	void contextLoads() throws JsonProcessingException {
		var user = new UserRequest();
		user.setUserName("홍길동");
		user.setUserAge(10);
		user.setEmail("hyekjung.com");
		user.setIsKorean(true);

		//dto를 json의 형태로 - 직렬화
		var json = objectMapper.writeValueAsString(user);
		System.out.println(json);
        //{"user_name":"홍길동","user_age":10,"email":"hyekjung.com","is_korean":true}

		//json을 dto 형태로 - 역직렬화
		var dto = objectMapper.readValue(json, UserRequest.class);
		System.out.println(dto);
        //UserRequest(userName=홍길동, userAge=10, email=hyekjung.com, isKorean=true)
	}
}

Object Mapper의 동작 방식

write

  • UserRequest @Data를 없애고(getter, setter 없음) 객체 선언 및 toString만 하였음.
  • 결과를 확인해보면 Json은 공란으로 출력되는 것을 확인할 수 있음.
  • Object Mapper는 메서드(변수 x)에 매칭 되기 때문
  • UserRequest에 getter를 추가한다면 다시 Json 형태로 반환되는 것을 볼 수 있음.
  • Object Mapper는 직렬화 시 'get' 이름의 메소드를 참고함.
  • Json으로 사용하지 않을 때는 @JsonIgnore 어노테이션 사용

객체 선언 및 toString만

@AllArgsConstructor
//요청이 snake case로 들어오면 자동적으로 해당 클래스의 변수들을 snake case로 매핑
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
    private String userName;
    private Integer userAge;
    private String email;
    private Boolean isKorean; //boolean의 기본값 false

    @Override
    public String toString() {
        return "UserRequest{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                ", email='" + email + '\'' +
                ", isKorean=" + isKorean +
                '}';
    }
}

객체 선언 및 toString만 - 결과

@SpringBootTest
class RestApiApplicationTests {
	@Autowired
	private ObjectMapper objectMapper;
	@Test
	void contextLoads() throws JsonProcessingException {
		var user = new UserRequest("홍길동", 10, "hyekjung.com", true);
		System.out.println(user);
        //UserRequest{userName='홍길동', userAge=10, email='hyekjung.com', isKorean=true}
		
		var json = objectMapper.writeValueAsString(user);
		System.out.println(json);// {}

getter 추가

@AllArgsConstructor
//요청이 snake case로 들어오면 자동적으로 해당 클래스의 변수들을 snake case로 매핑
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
    private String userName;
    private Integer userAge;
    private String email;
    private Boolean isKorean; //boolean의 기본값 false

    public String getUserName() {
        return userName;
    }

    public Integer getUserAge() {
        return userAge;
    }

    public String getEmail() {
        return email;
    }

    public Boolean getKorean() {
        return isKorean;
    }

    @Override
    public String toString() {
        return "UserRequest{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                ", email='" + email + '\'' +
                ", isKorean=" + isKorean +
                '}';
    }
}

getter 추가 - 결과

{"user_name":"홍길동","user_age":10,"email":"hyekjung.com","korean":true}

그 외

@JsonProperty

  • @JsonProperty("이름") 지정 시 해당 변수는 괄호 안의 이름을 사용하겠다는 뜻
    @JsonProperty("user_email")
    private String email;

@JsonIgnore

  • Json으로 사용하지 않겠다는 뜻
  • 생성한 getter 이외에도 Json으로 인식('get'이 포함되어있기 때문) 될 수 있으니 사용하지 않는다면 JsonIgnore 필수!
    @JsonIgnore
    public String getUser(){
        return userName;
    }
profile
나의 개발 저장소

0개의 댓글