728x90
JSON 반환 시 세부 설정
@JsonInclude
JSON 노출 여부에 대한 조건
@JsonInclude(JsonInclude.Include.NON_NULL)
`JsonInclude.Include.NON_NULL` 이 외에 더 많은 옵션들이 존재하지만 실제로 NON_NULL을 제외하곤 다양하게 사용 X
실습: @JsonInclude 를 통해 응답으로 노출될 값들에 대한 세부 조율
서버 내부 데이터 조작을 위한 Entity 클래스와 외부와의 소통을 위한 DTO 클래스 분리
-> stream 활용해서 User 객체를 value로 가진 hashMap을 UserResponseDto 를 요소로 가진 리스트로 변경
@JsonProperty
결과 객체 JSON반환 시 특정 프로퍼티명 변경 반환
@JsonProperty("userId")
private Integer id;
@JsonProperty("username")
private String name;
@JsonNaming
스네이크 케이스 등 반환할 때 JSON 내 Key 네이밍 컨벤션을 한번에 변경 가능
@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
public class Student {
private String myName;
private String myAge;
private String myCountry;
}
@JsonPropertyOrder
JSON 반환 시 보기 편하게 프로퍼티 순서 정렬
JSON내 프로퍼티가 너무 많을 때 유용할 것으로 판단
@JsonPropertyOrder({"userId", "username"})
public class UserResponseDto {
@JsonProperty("userId")
private Integer id;
@JsonProperty("username)
private String name;
}
@JsonIgnore
JSON 반환 시 미노출 프로퍼티
@JsonIgnore
private Integer age;
@JsonFormat: JSON 내 날짜 표기 시 포맷 지정
- @DataTimeFormat: Spring 에서 지원하는 데이터 포맷 어노테이션이기에 JSON외 XML 에도 적용
- JsonFormat: 일반적으로 JSON 을 사용하기에 본 Jackson 어노테이션을 사용하면 된다.
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JacksonAnnotationInside + @interface
커스텀 JSON 변환 어노테이션
`@JacksonAnnotationInside`: Jackson 관련 어노테이션을 상속하여 사용하겠다는 의미.
- 이것을 붙이지 않는다면 인터페이스 자체에 어노테이션이 적용되어 원치않는 결과가 발생
@JacksonAnnotationsInside
@Retention(RetentionPolicy.RUNTIME)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
public @interface DateFormat {
}
@DateFormat
private LocalDateTime createAt;
Enum 직렬화 / 역직렬화
@JsonFormat
Enum 반환시(직렬화) Enum 내 모든 필드 출력
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
@Getter
@AllArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum JobType {
DEVELOPER("Developer", Arrays.asList("Frontend", "Backend")),
ENGINEER("Engineer", Arrays.asList("DevOps", "SRE"));
String name;
List<String> titles;
}
@JsonValue
Enum 반환시(직렬화) Enum 내 특정 필드만 출력
@Getter
@AllArgsConstructor
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
public enum JobType {
DEVELOPER("Developer", Arrays.asList("Frontend", "Backend")),
ENGINEER("Engineer", Arrays.asList("DevOps", "SRE"));
@JsonValue
String name;
List<String> titles;
}
Enum 반환시(직렬화) Enum 내 특정메서드 결과를 출력
@JsonValue
public String serialize() {
return String.format("명칭 : %s | 종류 : %s", this.name, titles.toString());
}
@JsonProperty
Enum 반환시(직렬화) 원하는 형태로 출력
public enum JobType {
@JsonProperty("Developer 개발자")
DEVELOPER("Developer", Arrays.asList("Frontend", "Backend")),
@JsonProperty("Engineer 엔지니어")
ENGINEER("Engineer", Arrays.asList("DevOps", "SRE"));
}
아무것도 설정하지 않으면 기본 Key 값 반환
@JsonCreator
Enum 요청(역직렬화)시 특정 필드로 요청해 Enum 지정시 @JsonCreator
꼭 필드에서 사용하는 이름과 맞춰줘야하는 번거로움이 있음.
-> @JsonCreator(DELEAGTING) 사용
@JsonCreator
public static JobType deserialize(String job) {
for (JobType each : JobType.values()) {
if (each.getName().equals(job)) {
return each;
}
}
throw new RuntimeException("JobType 내 해당하는 Enum 이 존재하지 않습니다. name : " + job);
}
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static JobType deserialize(String name) {
for (JobType each : JobType.values()) {
if (each.getName().equals(name)) {
return each;
}
}
throw new RuntimeException("JobType 내 해당하는 Enum 이 존재하지 않습니다. name : " + name);
}
728x90
'ASAC 웹 풀스택 > Spring Boot' 카테고리의 다른 글
Spring Best Practices(2) - Exception (0) | 2024.10.11 |
---|---|
Spring 구조(2) - 3-Layerd 아키텍쳐 패턴 (0) | 2024.10.08 |
Spring 구조(1) - MVC 아키텍처 패턴, Front Controller (1) | 2024.10.08 |
Spring Boot 특장점 및 동작(1) - Spring과 Spring Boot의 차이점 (0) | 2024.10.08 |
Spring Bean 원리(1) - 싱글톤, IoC, Bean 등록/사용 (3) | 2024.10.08 |