프론트엔드/Javascript

스프링 부트로 JSON 다루기 - Jackson / GSON

두개의 문 2023. 8. 17. 14:27

◉ 원시적인 방법 ( 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