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.gradle 의 dependencies 에 아래 코드를 추가합니다.
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 시리즈
- 2021.07.03 - [Java] - [SpringBoot] RestApi 만들기 (1) 프로젝트 생성
- 2021.07.03 - [Java] - [SpringBoot] RestApi 만들기 (2) JSON 형식 리턴
- 2021.07.04 - [Java] - [SpringBoot] RestApi 만들기 (3) Log (slf4j+logback)
- 2021.07.04 - [Java] - [SpringBoot] RestApi 만들기 (4) Service 생성 (의존성 주입)
- 2021.07.04 - [Java] - [SpringBoot] RestApi 만들기 (5.1) MySQL + JDBC Template. 1
- 2021.07.05 - [Java] - [SpringBoot] RestApi 만들기 (5.2) DBCP - HikariCP
- 2021.07.08 - [java] - [SpringBoot] RestApi 만들기 (5.3) jdbcTemplate - Select
- 2021.07.10 - [Java] - [SpringBoot] RestApi 만들기 (5.4) GetMapping, PostMapping
- 2021.07.10 - [Java] - [SpringBoot] RestApi 만들기 (5.5) jdbcTemplate - Insert, Update, Delete
- 2021.07.11 - [Java] - [SpringBoot] RestApi 만들기 (6) File Upload / Download / List
Spring Boot Tutorial 부록
- 2021.07.02 - [Java] - [eclipse] 이클립스 설치, STS(Spring Tools 4) 설치
- 2021.07.04 - [Java] - [SpringBoot] MyBatis 보다 Spring JDBC 를 사용해야 하는 이유
- 2021.06.19 - [Java] - [Spring-boot] 시작하기 전 알아야 할 것들
- 2021.06.19 - [Java] - [Spring-boot] 수동으로 설정 초기화
- 2021.07.04 - [Java] - Eclipse 에 groovy 설치 하기
- 2021.07.02 - [Java] - [eclipse] 이클립스 설치, STS(Spring Tools 4) 설치
- 2021.07.07 - [Java] - [SpringBoot] Controller 에 Route 적용 (RequestMapping)
'Java' 카테고리의 다른 글
[SpringBoot] RestApi 만들기 (3) Log (slf4j+logback) (2) | 2021.07.04 |
---|---|
[SLF4J] slf4j 알고가기 + Logback (0) | 2021.07.03 |
[SpringBoot] RestApi 만들기 (1) 프로젝트 생성 (4) | 2021.07.03 |
[eclipse] 이클립스 설치, STS(Spring Tools 4) 설치 (10) | 2021.07.02 |
[Spring-Boot] Lombok "log" cannot be resolved 해결 (4) | 2021.06.28 |
댓글