일반적으로 API 어플리케이션(REST API)을 만들 때 가장 먼저 시작하는 작업이
요청과 응답객체를 생성하는 부분입니다.

 

API Endpoint 수에 따라 적게는 수십 개 , 많게는 몇백 개 이상의 요청/응답 객체 - 일반적으로 DTO로 불리는 객체-를
POJO 클래스로 만들어야 하는데요.

 

설계된 문서 또는 JSON - 이제 거의 모든 REST API의 요청/응답유형은 JSON구조를 사용합니다 - 텍스트를 보고
일일이 타이핑으로 수많은 요청/응답객체를 만드다는 게 매우 비효율적인 작업입니다.

 

단순 반복작업인데다가 휴먼 오류(오타)의 가능성도 크기 때문입니다.

 

이런 작업들을 줄일 수 있는 인텔리J의 플러그인을 하나 소개합니다.

 

인텔리 J 마켓플레이스에서 JSON 구조의 텍스트를 POJO로 Generation 해주는 플러그인은 몇 가지가 있는데요,
그중에서 사용법이 가장 단순하면서 오류가 적다고 느꼈던 Tool입니다.

 

RoboPOJOGenerator - Plugins | JetBrains

 

RoboPOJOGenerator - Plugins | JetBrains

Generate Java and Kotlin POJO files from JSON: GSON, FastJSON, AutoValue (GSON), Logan Square, Jackson, Lombok, empty annotations template.

plugins.jetbrains.com

GitHub - robohorse/RoboPOJOGenerator: IntelliJ IDEA/Android studio plugin: Json to Java and Kotlin POJO (GSON, Logan Square, Jackson, FastJSON, AutoValue, Moshi, Lombok)

 

robohorse/RoboPOJOGenerator

IntelliJ IDEA/Android studio plugin: Json to Java and Kotlin POJO (GSON, Logan Square, Jackson, FastJSON, AutoValue, Moshi, Lombok) - robohorse/RoboPOJOGenerator

github.com

 

설치 및 사용방법은 너무 간단합니다.

  1. 프로젝트의 설정화면으로 들어갑니다. ( 단축기: Command + , )
  1. PlugIns 메뉴의 마켓플레이스로 들어가서 JSON to POJO 검색하면 관련 플러그인들이 몇 개 검색됩니다.
  2. 그중에서 RoboPOJO Generator를 선택하고 설치합니다.

 

  1. 설치가 완료되면 메뉴> File > New에 ‘Generatoe POJO from JSON ‘이라는 메뉴가 추가되고, 아래와 같이 오른쪽 마우스 버튼 메뉴에도 추가가 됩니다.
  1. POJO를 만들 패키지(디렉토리)를 선택하고 클릭하면 아래의 Generation 창이 정상적으로 열립니다. 참고로 패키지를 선택하지 않은 상태에서 클릭하면 오류가 발생하니 꼭 생성할 패키지를 지정하고 사용하셔야 합니다.

  1. 기능에 대한 설명을 굳이 따로 설명을 하지 않아도 될 정도로 쉽고, 직관적으로 되어 있습니다.

 

다양한 JSON 관련 라이브러리를 지원하는데,
저는 Springboot기반이라 기본적으로 jackson 라이브러리가 사용되고 있어 none 으로 설정하고 사용합니다.

 

참고로 lombok으로 선택하고 사용하게 되면
클래스레벨에 lombok의 @Data 어노테이션이 붙어서 생성되게 됩니다.

 

실제로 아래의 샘플 JSON으로 POJO를 만들어 보면 중첩 구조라
POJO클래스가 두 개 생성됩니다.

{
    "resultStatus": 1,
    "resultMessage": "성공",
    "siteInfoList": [
        {
            "siteId": 8,
            "siteName": "Test",
            "siteAddress": "Test",
            "siteType": "Test",
            "inScheduleYmd": "Test",
            "installState": "Test",
            "accessIp": "Test2",
            "developerCorp": "Test",
            "builderCorp": "Test",
            "homepageDomain": "Test",
            "etcDesc": "Test",
            "ipUpdateTime": 1608022056000,
            "poscoYn": "N"
        }
    ]
}

 

기본적으로 depth를 가지는 중첩 구조의 JSON 일 경우, 이 플러그인은 각 각의 개별 클래스로 생성시켜 줍니다.

 

메인 POJO 클래스의 이름은 생성할 때 입력한 이름으로 생성되고,
중첩 JSON으로 만들어진 POJO클래스의 이름은 해당 JSON 프로퍼티명 + ‘Item’의 이름으로 생성되게 됩니다.

 

inner class로 생성될 필요가 있을 때는 추가 작업이 필요해서,
이 부분을 옵션으로 지원하지 않는 부분은 살짝 아쉬운 점이라고 생각됩니다.

package com.ht.parasite.core.dto;

import java.util.List;
import lombok.Data;

public @Data class SiteInfoRes{
    private int resultStatus;
    private List<SiteInfoListItem> siteInfoList;
    private String resultMessage;
}
package com.ht.parasite.core.dto;

import lombok.Data;

public @Data class SiteInfoListItem{
    private String accessIp;
    private long ipUpdateTime;
    private String siteName;
    private String siteAddress;
    private String homepageDomain;
    private String inScheduleYmd;
    private String developerCorp;
    private String installState;
    private String poscoYn;
    private int siteId;
    private String builderCorp;
    private String etcDesc;
    private String siteType;
}

생성된 POJO 클래스 코드입니다.
lombok으로 지정하고 생성했기 때문에 @Data 어노테이션이 붙어 있습니다.
즉, getter, setter, contructor 메서드 코드가 필요 없기 때문에 생성되지 않았습니다.

 

POJO를 생성할 때 멤버 변수의 데이터 타입은 json 코드의 value 값으로 판단해서 적용됩니다.

 

참고로 value가 null로 되어 있는 상태에서 생성하게 되면,
어떤 타입인지 판단할 수 없기 때문에 Object 타입으로 생성됩니다.

 

단순한 기능이지만
반복 작업과 휴면 오류를 많이 줄여줄 수 있는 유용한 도구인 것 같아 포스팅해 보았습니다.

 

동일 기능을 제공하는 다른 플러그인도 많이 있으니,
사용해보면서 자기에게 맞는 것을 선택해서 사용하시면 좋을 것 같습니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기