본문 바로가기
Java

[SpringBoot] RestApi 만들기 (2) JSON 형식 리턴

by bryan.oh 2021. 7. 3.
반응형

SpringBoot
REST API
JSON

지난 포스트에 이어서 테스트 api 에서 json 으로 리턴하는 방법을 알아보겠습니다.

지난 글 : SpringBoot Project 생성 및 심플한 RestApi 작성 

1. 원시적인 방법 (json 문자열 만들기)

@RestController
public class InfoController {

	@GetMapping("/info")
	public String projectInfo() {
//		return "Project name is preword.";
		return "{\"project name\": \"preword\"," +
				"\"created date\": \"2021-07-03\"}";
	}
}

이렇게 만들면 오타의 위험도 있고, 너무 복잡하고 타이핑도 많죠. 코드도 난잡해보이고.

이렇게는 하지 않습니다.

 

2. Jackson

annotation 을 사용하여 class 변수를 자동으로 json 형태로 변환해 줍니다.

  • Class 에 @RestController 가 있어야함.
  • Class 에 @Controller 가 붙어있다면 Function 에 @ResponseBody 가 있어야함

간단히 예를 들어서, 

우선 model class 를 하나 만듭니다.

package com.bryan.hello.preword.info.model;

import java.util.Date;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Project {
	public String projectName;
	public String author;
	public Date createdDate;
}

(중요) getter, setter 가 있어야함.

그리고 다시 InfoController.java 에서

@RestController
public class InfoController {

	@GetMapping("/info")
	public Object projectInfo() {
		Project project = new Project();
		project.projectName = "preword";
		project.author = "hello-bryan";
		project.createdDate = new Date();
		return project;
	}
}

 return type 을 String 에서 Object 또는 Project 로 변경합니다.

Project 객체를 만들고 값을 입력하고 그냥 리턴만하면 됩니다.

결과

{"projectName":"preword","author":"hello-bryan","createdDate":"2021-07-03T08:55:04.817+00:00"}

<참고> Jackson Property

@JsonIgnore

해당 property 는 return 에 포함되지 않습니다. 결과는

{"projectName":"preword","author":"hello-bryan"}

@JsonInclude

null 이 아닌것만 return 에 포함됩니다. author 에 null 을 입력하면 결과는

{"projectName":"preword"}

 

  • ALWAYS : 속성의 값에 의존하지 말고 항상 포함
  • NOT_EMPTY : null 또는 값이 빈 경우가 아니면 포함
  • NOT_NULL : null 이 아니면 포함
  • NOT_DEFAULT : bean의 기본생성자로 정의된 필드값과 다르게 변경된 필드만 포함

 

@JsonProperty

class의 property name 그대로 보여주지 않고 변경해서 보여줄때.

아래와 같이 설정하면 "author": "hello-bryan" 이 아니고 "project master": "hello-bryan" 으로 리턴함.

결과

{"projectName":"preword","project master":"hello-bryan"}

 

@JsonFormat

날짜, 시간값을 직렬화할 때 형식을 지정

 

결과 : "2021-07-03T08:55:04.817+00:00" 였던 date 값이 "2021-07-03" 으로 나옴.

{"projectName":"preword","createdDate":"2021-07-03","project master":"hello-bryan"}
시분초 참고
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Seoul")

 

3. GSON

class 를 만들지 않고, 직접 json 을 만들어서 보내야 할 때도 있습니다.

여기에서 gson version 을 확인하시고 사용하시려는 버전을 알아둡니다.

사용자가 많은 버전이 2.8.5 네요.

build.gradledependencies 에 아래 코드를 추가합니다.

implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.5'

eclipse를 쓰기 때문에 gradle 을 Refresh 합니다.

 

GSON 사용 예제

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

// ..

	@GetMapping("/info2")
	public String customJson() {
		JsonObject jo = new JsonObject();
		
		jo.addProperty("projectName", "preword");
		jo.addProperty("author", "hello-bryan");
		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 에 뭔가 추가했으면 서버를 재시작 합니다.

그리고 브라우저에서 확인. 

localhost:8000/info2

결과는 

{"projectName":"preword","author":"hello-bryan","createdDate":"Sat Jul 03 21:59:21 KST 2021","follower":[{"prop0":0},{"prop1":1},{"prop2":2},{"prop3":3},{"prop4":4}]}

풀어서 보면,

{
   "projectName":"preword",
   "author":"hello-bryan",
   "createdDate":"Sat Jul 03 21:59:21 KST 2021",
   "follower":[
      {
         "prop0":0
      },
      {
         "prop1":1
      },
      {
         "prop2":2
      },
      {
         "prop3":3
      },
      {
         "prop4":4
      }
   ]
}

이런식으로 리턴이 됩니다.

 

마무으리~

Jackson 의 장점

  • 모든 JAX-RS 및 Spring Framework 에 내장
  • 광범위한 annotation 지원

Gson 의 장점

  • 간단한 경우 사용의 편리함
  • serializing/deserializing 에서 java entity를 통하지 않아도 됨.

 

개인적인 생각

spring boot 에서 jackson 을 선택한 듯하니,

기본으로 jackson 을 사용하고, 

gson 으로 하면 간단한 작업들 (jackson 으로 하면 불편한?) 이 있다면 gson 으로.

 

 

Spring Boot Tutorial 시리즈

Spring Boot Tutorial 부록

 

728x90
반응형

댓글