우리는 REST API로 요청을 보내고 응답을 받으면 다음과 같은 형태로 데이터를 가져오는 것을 자주 보았을 것이다.
❓ JSON이란?
JavaScript Object Notation의 약자로, Javascript 객제 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다. 웹 애플리케이션에서 데이터를 전송할 때 일반적으로 사용한다. (서버에서 클라이언트로 데이터를 전송하여 표현하려거나 반대의 경우)
MIME 타입은 application/json이다. JSON은 key-value 형태로 되어 있으며, 데이터 계층을 구축할 수 있다.
우리는 때때로 스프링부트로 데이터를 받아오거나 전송할 때 JSON 데이터를 파싱하거나 생성해야할 때가 있다 이를 위해 JSONObject
를 사용한다.
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
Maven을 사용한다면 위 코드를 Maven 파일에 추가한다.
compile group: 'org.json', name: 'json', version: '20160810'
를 build.gradle 파일의 dependencies에 추가한다.
만약 Controller
에서 Request Body로 데이터를 받아온다고 생각해보자. 그런데 만약에 코드가 다음과 같이 작성되어 있으면 어떻게 될까?
@ResponseBody
@PostMapping("")
public BaseResponse<Long> sendEmail(@RequestBody String email) throws BaseException{
if(email == null){
return new BaseResponse<>(BaseResponseStatus.POST_USERS_EMPTY_EMAIL);
}
if(!ValidationRegex.isRegexEmail(email)){
return new BaseResponse<>(BaseResponseStatus.POST_USERS_INVALID_EMAIL);
}
try{
mailService.sendCertificationMail(email);
long verifyCodeId = mailService.sendCertificationMail(email);
return new BaseResponse<Long>(verifyCodeId);
}
catch (BaseException baseException){
return new BaseResponse<>(baseException.getStatus());
}
}
위와 같이 코드가 작성되고, email에 다음과 같이 데이터가 들어온다고 생각해보자.
{
"email" : "so4644009@gmail.com"
}
그러면 위의 Controller의 결과 값은 POST_USERS_INVALID_EMAIL
오류가 나올것이다. 이 오류는 이메일 형식이 알맞지 않을 때 리턴되도록 짠 Error Response인데 왜 이런 오류가 뜰까?
그 이유는 위의 코드는 value
값인 이메일만 인식하는 것이 아니라 위 JSON을 통째로 인식하기 때문이다. 이러한 오류를 해결하려면 JSONObject를 사용하면 된다.
@ResponseBody
@PostMapping("")
public BaseResponse<Long> sendEmail(@RequestBody String data) throws BaseException{
JSONObject parser = new JSONObject(data);
String email = parser.getString("email");
if(email == null){
return new BaseResponse<>(BaseResponseStatus.POST_USERS_EMPTY_EMAIL);
}
if(!ValidationRegex.isRegexEmail(email)){
return new BaseResponse<>(BaseResponseStatus.POST_USERS_INVALID_EMAIL);
}
try{
mailService.sendCertificationMail(email);
long verifyCodeId = mailService.sendCertificationMail(email);
return new BaseResponse<Long>(verifyCodeId);
}
catch (BaseException baseException){
return new BaseResponse<>(baseException.getStatus());
}
}
JSONObject
를 사용하여 입력 받은 String을 JSON으로 인식하게 하고, 해당 JSON에서 key인 email
의 값을 뽑아오도록 짠 코드이다.
그러니까 String 데이터를 JSONObject를 이용하여 JSON으로 만든 후, 거기서 이메일 값을 뽑아오는 코드이다.
이런 방식으로 JSONObject
를 사용한다면 SpringBoot에서 JSON
객체를 만들거나 파싱할 수 있다.