◉ 원시적인 방법 ( JSON 문자열 만들기 )
▪︎ JsonRestController.java
- 오타의 위험도 있고, 복잡한 편이라 실수할 확률이 큼
- Java 17 버전 이후, 템플릿 문자열 기능으로 많이 개선된 편이지만 권장하지 않음
@RestController
// * 어노테이션은 클래스의 메타 데이터로서 내부적으로 클래스에 해당.
// -> 클래스 이름은 어노테이션 이름과 동일하게 작성할 수 없음
// * @RestController : 뷰-템플릿 필요없음 -> 응답 결과 : String (JSON or text)
public class JsonRestController {
@GetMapping("/info")
// * /info 주소 요청 시, projectInfo() 메서드 호출
public String projectInfo() {
// * 이 방법은 권장하지 않음
//return "{ \"project name\" : \"preword\", \"created date\" : \"2023-08-17\" }";
// * Java 17 버전 이후, 템플릿 문자열 기능으로도 많이 개선됨
return """
{
"project name" : "preword",
"created date" : "2023-08-17"
}
""";
}
}
◉ Jackson
★ Spring boot에서는 Jaskson 권장
▪︎ annotation을 사용하여 class 변수를 자동으로 JSON 형태로 변환해줌
① class에 '@RestController'가 있어야 함
② class에 '@Controller'가 있고, 메서드에 '@ResponseBody'가 있어야 함
- '@RestController' = '@Controller' + '@ResponseBody'
▪︎ Project.java
@Getter
@Setter
public class Project {
private String projectName;
private String author;
public Date createdDate;
}
▪︎ JsonRestController.java
@GetMapping("/infoJackson")
public Project projectInfoJackson() {
Project project = new Project();
project.setProjectName("preword");
project.setAuthor("hello-spring");
project.setCreatedDate(new Date());
return project;
}
▪︎ 실행결과
@JsonIgnore()
createdData의 속성을 return에 포함되지 않게 할 경우, 사용
▪︎ 속성
ALWAYS | 속성의 값에 의존하지 말고 항상 포함 |
NOT_EMPTY | null 또는 값이 빈 경우가 아니면 포함 |
NOT_NULL | null이 아니면 포함 |
NOT_DEFAULT | bean의 기본 생성자로 정의된 필드값과 다르게 변경된 필드만 포함 |
▪︎ Project.java
@Getter
@Setter
public class Project {
private String projectName;
private String author;
@JsonIgnore // 해당 속성은 return에 포함되지 않음
public Date createdDate;
}
▪︎ 실행결과
@JsonInclude()
null이 아닌 것만 return에 포함
▪︎ Project.java
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL) // * null이 아닌 것만 return에 포함
public class Project {
private String projectName;
private String author;
@JsonIgnore // 해당 속성은 return에 포함되지 않음
public Date createdDate;
}
▪︎ JsonRestController.java
- author에 null을 입력한 후, 실행해보자.
@GetMapping("/infoJackson")
public Project projectInfoJackson() {
Project project = new Project();
project.setProjectName("preword");
project.setAuthor(null);
project.setCreatedDate(new Date());
return project;
}
▪︎ 실행결과
@JsonProperty
class의 property name은 그대로 보여주지 않고 변경해서 보여줄 때 사용
▪︎ Project.java
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL) // * null이 아닌 것만 return에 포함
public class Project {
private String projectName;
@JsonProperty(value = "project master")
private String author;
@JsonIgnore // 해당 속성은 return에 포함되지 않음
public Date createdDate;
}
▪︎ 실행결과
@JsonFormat
날짜, 시간 값을 직렬화할 때 형식 지정
▪︎ Project.java
@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL) // * null이 아닌 것만 return에 포함
public class Project {
private String projectName;
@JsonProperty(value = "project master")
private String author;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public Date createdDate;
}
▪︎ 변경 전
▪︎ 변경 후
• ( 참고 )
아래와 같이 변경 시, 시 분 초 까지 출력됨
@JsonFormat(shape = JsonFormat.Shape.STRING,
pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")
▪︎ 실행결과
◉ GSON
class를 만들지 않고 직접 json을 만들어서 보내야할 때 사용
• Maven repository에서 gson 검색 → build.gradle의 dependencies에 추가
- 상단 Gradle(Short) 탭의 내용 복사 붙여넣기 → Refresh Gradle 후, External Dependencies에서 라이브러리 다운되었는지 확인
◎ GSON 사용 예제
▪︎ JsonRestController.java
@GetMapping("/infoGson")
public String gsonJson() {
// 1. JsonObject 객체 생성 (import하기)
JsonObject jo = new JsonObject();
// 2. JSON 요소 추가
// : JsonObject.addProperty(String property, String value)
jo.addProperty("projectName", "preword");
jo.addProperty("author", "hello-spring");
jo.addProperty("createdDate", new Date().toString());
JsonArray ja = new JsonArray();
for( int i = 0; i < 5; i++ ) {
JsonObject jObj = new JsonObject();
jObj.addProperty("prop" + i, i);
ja.add(jObj);
}
jo.add("follower", ja);
return jo.toString();
}
▪︎ 실행결과
( 단 Gradle에 새로 추가되었으므로, 서버 종료 후 재실행해주어야 함 )
◎ 마무리
▪︎ Jackson의 장점
- 모든 JAX-RS 및 Spring Framework에 내장
- 광범위한 annotation 지원
▪︎ Gson의 장점
- 간단한 경우, 사용의 편리함 ( 가벼운 JSON 데이터 처리할 때 성능 좋음 )
- 직렬화 / 역직렬화에서 java entity를 통하지 않아도 됨
◎ 용어 정리
▪︎ 직렬화 : Java 객체 → JSON
▪︎ 역직렬화 : JSON → Java 객체
'프론트엔드 > Javascript' 카테고리의 다른 글
JSON (2) (0) | 2023.08.17 |
---|---|
JS - DOM / 노드 선택 및 조작 / 이벤트 다루기 (0) | 2023.08.16 |
JSON (1) (0) | 2023.08.16 |
JS - BOM / window 객체 (0) | 2023.08.16 |
JS - 객체 / 표준 내장 객체 (0) | 2023.08.16 |