Gradle Custom Plugin Task를 활용한 Java Enum -> TypeScript Enum 생성(1/2)

YouMakeMeSmile·2021년 12월 16일
2

JPA Enum Type 적용기~ 글에서도 이야기 했듯이 기존 레거시에서는 공통 코드를 그룹 테이블과 코드 테이블로 구성하여 사용하고 있었다.

이번 개선 프로젝트를 통해서 기존 테이블을 사용했던 방식대신 Enum를 사용하기로 결정되었다. 이러한 결정으로 JPAConverter를 생성하여 JPA <-> DB간 저장과 조회시 Enum명과 기존 코드값의 변환을 해결하였다. 자세한 내용은 JPA Enum Type 적용기~에 정리해 두었다.

JPA에 Enum를 적용하면서 마지막에 언급하였던 서버 <-> 화면 통신간에는 상수명으로 통신하기로 결정되었다. 기존 레거시에서는 화면에서 로드 시점에 화면에 사용하는 모든 공통코드를 서버에 요청하며 서버에서는 해당 코드를 테이블에서 조회하여 응답하였다.

Enum를 사용하기로 하면서 Java에서는 Enum을 정의한 라이브러리의 의존성을 통해 바로 사용할 수 있었다. 문제가 되는 부분은 화면에서 공통코드를 조회하는 부분이였다.

나의 의견은 코드 서버를 구성하여 정의된 Enum를 모두 읽어 Map으로 구성하여 해당 Map를 Bean으로 등록하여 코드를 조회하는 EndPoint를 통해 공통코드를 조회하는 방식이였다.

이유는 화면에서도 Enum를 구성하여 사용하여 화면마다 서버를 조회 할 필요 없이 직접 Enum 파일을 사용하는 방법도 있겠지만 서버에 정의한 Enum과 화면에 정의한 Enum의 동기화가 어려울 것으로 생각하였고 코드 서버도 기존의 테이블을 조회 하는 것이 아닌 Bean으로 등록된 Map를 조회하는 것으로 서버의 부하 또한 줄어들어 크게 문제가 없다고 생각했다.

나의 의견에 동의하는 개발자분들도 계셨지만 화면에도 Enum를 정의하여 사용하자는 의견 또한 존재하였다. 이러하여 다른 프로젝트에서는 공통코드를 어떻게 해결하였는지 조사를 하던중 쏘카에서 지금 우리 프로젝트와 같이 공통코드의 변화에 대해 공유한 글을 찾을수 있었다.쏘카 백오피스 팀 내 공통 코드(Common Code) 관리 변천사


쏘카의 경우에도 현재 우리의 프로젝트와 동일하게 기존에는 공통코드를 테이블로 관리하였다가 점차 변화를 시도하여 마지막 결과는 서버와 화면 모두 Enum으로 공통코드를 구성하는 대신 서버의 Enum클래스를 기준으로 Gradle Task를 이용하여 화면의 Enum을 생성하는 방식으로 서버와 화면의 동기화 문제도 어느정도 해결 가능한 방식을 선택하였다.

쏘카의 경험을 바탕으로 우리 프로젝트에서도 서버의 Enum을 통해 화면의 Enum를 생성하는 것으로 결정하였다. 그러기 위해서는 Gradle Task를 구현해야 했다.


우선 TypeScript Enum을 생성하기 위한 Java Enum의 속성은 간단하게 CodeValue로 구성하였다. 실제 프로젝트에서는 interface의 구현체으로 Enum를 구성하였으며 속성도 더 많이 존재했다.

public enum City {
    Seoul("S", "서울"),
    Busan("B", "부산");


    City(String code, String value) {
        this.code = code;
        this.value = value;
    }

    private String code;
    private String value;

    public String getCode() {
        return code;
    }
    
    public String getValue() {
        return value;
    }
}

TypeScriptEnum이 구성은 Enum Name(상수명)과 이에 해당 하는 값과 같은 추가적이 정보를 갖는 Map을 구성하기로 결정하였다.

enum City {
	 Seoul = 'Seoul', // code:"S", value:"서울"
	 Busan = 'Busan', // code:"B", value:"부산"
}

const CityLabel = new Map<City, string>([
	[City.Seoul, '서울'],
	[City.Busan, '부산'],
]);

export {
	City,
	CityLabel,
};

여기까지는 현재 프로젝트에서의 공통 코드 결정에 대한 내용을 이야기했다.
다음글에서는 상단의 Java Enum를 통해 TypeScript Enum를 생성하기 위한 Gradel Plugin 프로젝트 구성과 Java -> TypeScript 생성을 위해 내가 개발하였던 내용에 대한 설명을 이야기 하려고 한다.

profile
어느새 7년차 중니어 백엔드 개발자 입니다.

0개의 댓글