Spring Boot에서 컨트롤러를 개발하는 경우 JSON 포맷으로 값을 받아 POJO(Plain Old Java Object) 객체에 저장하거나 Java 객체에 있는 값을 JSON 포맷으로 변환해서 응답으로 내어주는 경우가 많다. 이 때문에 값을 표현하는 JSON 포맷과 POJO 클래스 사이에 강한 연관성이 생기게 되는데, 필드의 추가, 제거, 변경이 있을 때마다 POJO 객체를 수정해야 한다.
문제는 설계된 JSON 포맷을 보고 POJO 클래스를 손으로 만드는 경우 매우 귀찮다는 것이다. 귀찮고 번거로운 단순반복 작업은 종종 휴먼 에러를 발생시키고, 소프트웨어에 버그를 만들기도 한다. 따라서 이런 작업은 되도록 자동화하는게 좋다.
인텔리제이의 플러그인 중에 RoboPOJOGenerator라는 플러그인은 JSON 포맷의 텍스트를 기반으로 POJO 클래스를 만들어 준다.
RoboPOJOGenerator 플러그인 설치
'RoboPOJOGenerator' 플러그인은 인텔리제이의 Plugins 메뉴의 Marketplace에서 조회 및 설치할 수 있다. 인텔리제이 화면 상단의 IntelliJ IDEA > Settings > Plugins 화면으로 들어가자.
검색 창에 RoboPOJOGenerator를 입력하면 플러그인을 검색할 수 있다. Install 버튼을 눌러서 설치해준다. 설치 이후 별다른 재시작을 요구하지는 않는다.
RoboPOJOGenerator 플러그인 사용법
플러그인을 설치하고 File > New 메뉴를 선택하면 'Generate POJO from JSON' 메뉴가 생긴 것을 볼 수 있다.
'Generate POJO from JSON' 메뉴를 선택해보자.
RoboPOJOGenerator 창이 뜬다. 좌측에는 JSON 텍스트를 입력할 수 있는 창이 뜨고, 우측에는 어떤 JSON 라이브러리를 사용할 것인지를 선택할 수 있는 메뉴들이 있다. RoboPOJOGenerator는 JSON 관련 다양한 라이브러리를 지원한다.
다음 JSON을 POJO로 변환해보자.
{
"Name": "An",
"Languages" : [
{"Language": "Java"},
{"Language": "C"},
{"Language": "Python"},
],
"Color" : "Blue"
}
좌측에 위 JSON을 입력하고, 우측에서 사용할 라이브러리르 선택하자. 시험삼아 Jackson 라이브러리를 선택하자.
Generate 버튼을 누르면 프로젝트에 POJO 클래스가 생성된다.
public class LanguagesItem{
@JsonProperty("Language")
private String language;
public String getLanguage(){
return language;
}
}
public class Response{
@JsonProperty("Color")
private String color;
@JsonProperty("Languages")
private List<LanguagesItem> languages;
@JsonProperty("Name")
private String name;
public String getColor(){
return color;
}
public List<LanguagesItem> getLanguages(){
return languages;
}
public String getName(){
return name;
}
}
RoboPOJOGenerator 플러그인은 중첩 구조의 JSON인 경우 각각을 개별 클래스로 생성해준다. 이 때문에 배열에 있는 Language 값들을 다루기 위해 LanguagesItem 클래스가 생성되었다. 중첩을 위한 클래스는 JSON 프로퍼티 이름 뒤에 Item이라는 이름을 붙여서 클래스로 만들어준다. 다만 이런 경우 InnerClass로 생성하면 더 깔끔한데, 항상 별도의 파일로 만들어주기 때문에 생성 이후 추가 작업이 필요하다.
POJO를 생성할 때 멤버 변수의 타입은 JSON 코드의 Value 값을 기준으로 판단한다. 만약 값이 null이라면 값의 타입을 추론할 수 없기 때문에 Object 타입으로 생성된다.
댓글