JobDto 라는 이런 형식의 json이 있다.
{
"jobId": 0,
"title": "string",
"detail": "string",
"monthlySalary": 0,
"creditLimit": 0,
"modifyCredit": true,
"withdrawClass": true,
"withdrawStudent": true
}
하지만 이를 한번에 여러개 전달해야하는 경우가 있었고
난 단순하게 List 로 return하였다
List<JobDto> 이런식으로
[
{
"jobId": 1,
"title": "master",
"detail": "",
"monthlySalary": 0,
"creditLimit": 0,
"modifyCredit": false,
"withdrawClass": false,
"withdrawStudent": false
},
{
"jobId": 2,
"title": "무직",
"detail": "직업이 없는 상태",
"monthlySalary": 0,
"creditLimit": 0,
"modifyCredit": false,
"withdrawClass": false,
"withdrawStudent": false
},
...
{
"jobId": 2,
"title": "무직",
"detail": "직업이 없는 상태",
"monthlySalary": 0,
"creditLimit": 0,
"modifyCredit": false,
"withdrawClass": false,
"withdrawStudent": false
}
]
그런데 이를 리스트가 아닌 json으로 감싸져서 받고싶다는 프론트의 요청을 받았는데..
생각해보니 json으로만 받아야하는 것이 맞는 것 같아서 이를 바꿀 고민을 해봤다
방법이 두가지가 있을 것 같은데
1) JSON 을 다루는 라이브러리를 통해 변경하는 것
Controller
@GetMapping("/{class_id}/job/all")
public ResponseEntity<JSONObject> jobListByClass(@PathVariable(value = "class_id")Long classId){
return ResponseEntity.ok(jobService.getJobListByClass(classId));
}
이렇게 리턴 형식을 JSONObject 로 바꿔주고
Service
//jobList -> List<JobDto> 형태이다
Map<String,Object> map = new HashMap<String,Object>();
map.put("jobList", jobLists);
return JSONObject.fromObject(map);
이 라이브러리를 사용해서 변경했다.
import net.sf.json.JSONObject;
//build.gradle
implementation 'net.sf.json-lib:json-lib:2.4:jdk15' //json-lib : list to json
**JSON을 다루는 라이브러리가 너무 많아서 단순히 구글링했을 때는 틀린 라이브러리를 가져와서
함수를 사용할수 없다고 하는 경우가 종종 있다.
build.gradle에 제대로된 친구를 가져와야한다
JSON다루기에 대한 글을 다시 써야겠다.. 국가 API가져와서 파싱하는게 더어려웠던듯
2) 다른 Dto를 만들던 것과 유사하게 해당 List를 담은 Dto를 생성하기
package miraeassetmobile.backend.domain.dto.jobs;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@Builder
public class ClassJobResponseDto {
List<JobDto> jobList;
}
이런식으로 새로운 어찌보면 약간 의미없을 수 있는 DTO를 하나 더 생성해 주고
return ClassJobResponseDto.builder()
.jobList(jobLists)
.build();
그대로 담아서 보내는 것이다
결과는 똑같다
그냥 [ {}, {}, {} ] 였던 것이 { something: [ {},{},{} ]} 이런식으로 something내에 들어간 상태로 반환된다
{
"jobList": [
{
"creditLimit": 0,
"detail": "",
"jobId": 1,
"modifyCredit": false,
"monthlySalary": 0,
"title": "master",
"withdrawClass": false,
"withdrawStudent": false
},
{
"creditLimit": 0,
"detail": "직업이 없는 상태",
"jobId": 2,
"modifyCredit": false,
"monthlySalary": 0,
"title": "무직",
"withdrawClass": false,
"withdrawStudent": false
},
....
{
"creditLimit": 0,
"detail": "직업이 없는 상태",
"jobId": 2,
"modifyCredit": false,
"monthlySalary": 0,
"title": "무직",
"withdrawClass": false,
"withdrawStudent": false
}
]
}
뭐가 더 좋을까.. 개인적으로는 1번으로 쓰면 swagger에 JSONObject라고 뜨고 무슨 내용인지 직관적으로 이름으로 알 수 없어서 별로긴하다
내가 만든 DTO들은 열면 형식을 바로바로 알수 있고 이름으로 대충 파악이 가능한데
JSONObejct는 이렇게 뭉뜽그려 있는 느낌...