JPA Enum Type 적용기~ 글에서도 이야기 했듯이 기존 레거시에서는 공통 코드를 그룹 테이블과 코드 테이블로 구성하여 사용하고 있었다.
이번 개선 프로젝트를 통해서 기존 테이블을 사용했던 방식대신 Enum
를 사용하기로 결정되었다. 이러한 결정으로 JPA
에 Converter
를 생성하여 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
의 속성은 간단하게 Code
와 Value
로 구성하였다. 실제 프로젝트에서는 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;
}
}
TypeScript
의 Enum
이 구성은 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
생성을 위해 내가 개발하였던 내용에 대한 설명을 이야기 하려고 한다.