[Spring] Jackson, Object Mapper

yoon·2024년 1월 10일

spring-boot

목록 보기
5/41
post-thumbnail

✅ Jackson

Jackson은 JSON 데이터 구조를 처리해주는 라이브러리로 기본적으로 포함되어 있음
Object를 JSON 타입으로, JSON 타입을 Object로 변환해주는 역할을 함

✅ Object Mapper

✔ 직렬화?

자바 객체를 client에 데이터를 전송하기 위해 JSON, XML 등의 포맷으로 변환하는 것
→ 주로 자바객체(ResponseDto) > JSON

✔ 역직렬화?

직렬화의 반대로 client에서 받은 데이터를 sever에서 사용하는 포맷으로 변환하는 것
→ 주로 JSON > 자바객체(RequestDto)

✔ Object Mapper

직렬화 (object > json) : writeValueAsString

  • @ResponseBody @RestController ResponseEntity등을 사용하는 경우 처리된다.
  • getter를 참고하여 직렬화를 진행한다.
  • 만약 모델안에 getter가 없다면 직렬화를 진행할 수 없다.
  • getter는 있지만 직렬화를 진행하고 싶지 않다면 @JsonIgnore을 사용하자
@SpringBootTest
class RestApiApplicationTests {
	@Autowired
	private ObjectMapper objectMapper;

	@Test
	void contextLoads() throws JsonProcessingException {
		var user = new UserRequest();
		user.setUserName("hong");
		user.setUserAge(10);
		user.setUserEmail("jj@jj.com");
		user.setIsKorean(true);
        
		// String 형식의 json형태 반환
		var json = objectMapper.writeValueAsString(user);
		System.out.println(json);

	}

}

역직렬화 (json > object) : readValue

  • @RequestBody로 json 문자열을 객체로 받아올 때 역직렬화가 처리된다.
  • 기본 생성자로 객체 생성 후 필드값을 찾아서 값 바인딩한다.
  • 필드값은 setter를 참조하지만, setter가 없다면 getter를 참조한다.
  • 객체 생성을 위한 기본 생성자가 필요하다.

		var dto = objectMapper.readValue(json,UserRequest.class);
		System.out.println(dto);

+ UserDto code

DTO를 만들때는 위의 주의 사항을 지키기 위해 아래의 어노테이션을 사용하는 것을 추천한다.

@Data : getter, setter 생성

@AllArgsConstructor : 모든 변수를 담고 있는 생성자

@NoArgsConstructor : 기본 생성자

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)//snake case > camel case
public class UserRequest {
    private String userName;
    private Integer userAge; // body로 사용할때는 object 타입인걸로 > 데이터가 없다면 null일 수 있게
    private String userEmail;
    private Boolean isKorean; //boolean은 default 값이 false이기 때문에 Boolean
    //lombok에서 is가 앞에 붙으면 boolean으로 해석, setKorean으로 함수가 만들어지면서 Korean이 됨
    // isKorean != is_korean >> Boolean으로 type변경하면 문제 없음

    @Override
    public String toString() {
        return "UserRequest{" +
                "userName='" + userName + '\'' +
                ", userAge=" + userAge +
                ", userEmail='" + userEmail + '\'' +
                ", isKorean=" + isKorean +
                '}';
    }
}
profile
하루하루 차근차근🌱

0개의 댓글