
Jackson은 JSON 데이터 구조를 처리해주는 라이브러리로 기본적으로 포함되어 있음
Object를 JSON 타입으로, JSON 타입을 Object로 변환해주는 역할을 함
자바 객체를 client에 데이터를 전송하기 위해 JSON, XML 등의 포맷으로 변환하는 것
→ 주로 자바객체(ResponseDto) > JSON
직렬화의 반대로 client에서 받은 데이터를 sever에서 사용하는 포맷으로 변환하는 것
→ 주로 JSON > 자바객체(RequestDto)
직렬화 (object > json) :
writeValueAsString
@ResponseBody@RestControllerResponseEntity등을 사용하는 경우 처리된다.- 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);
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 +
'}';
}
}