콘텐츠로 이동

티맥스클라우드

  • 기간: 2021.10 - 2024.11

코드 생성 플랫폼의 배포 전 API 테스트 기능

코드 생성 플랫폼에서 생성된 API를 배포 전에 호출하고 실제 DB 반영까지 확인하는 기능을 설계·구현했습니다. React 테스트 화면과 Java REST API, DB 스키마를 만들었습니다.

도식을 좌우로 스크롤해 전체 구성을 확인할 수 있습니다.

서비스 선택, JSON 요청 편집, API 응답과 DB 반영 확인 영역을 보여주는 배포 전 API 테스트 화면 개념도.

문제와 진단: UI의 엔티티·서비스 정의로 Java API·SQL과 JAR를 생성하는 플랫폼에서, 실제 API 동작은 배포·컨테이너 기동 뒤에야 확인할 수 있었습니다. 서비스와 API 200~300개를 검증하던 당시 한 차례 빌드·배포·확인에 약 20분이 걸려, 정의나 요청·응답 형식 오류를 찾을 때마다 대기가 반복됐습니다.

제약과 선택: mock 응답으로는 실제 DB 쓰기·읽기 오류를 확인할 수 없어, 기존 생성·실행 경로로 API를 호출하는 테스트 기능을 배포 앞단에 두었습니다.

구현: React 화면에서 Monaco Editor로 JSON 요청을 편집하고 WebSocket으로 전송·응답 처리하도록 구현했습니다. 테스트 대상 조회와 실제 데이터 저장·조회를 위한 Java REST API와 DB 스키마도 설계·구현했습니다.

검증과 결과: 생성 API의 요청·응답과 실제 DB 쓰기·읽기를 배포 전에 확인할 수 있게 했습니다. 잘못된 서비스 정의, 연결 누락, 요청·응답 형식 문제도 별도 빌드·배포 전에 확인할 수 있게 했습니다.

데이터 변경 이력 저장과 과거 시점 조회

생성된 등록·수정·삭제 서비스의 이력 저장 SQL과, 지정한 날짜의 행 값·마지막 변경자를 조회하는 SQL을 구현했습니다.

도식을 좌우로 스크롤해 전체 구성을 확인할 수 있습니다.

현재 테이블과 변경 이력을 조합해 지정한 과거 날짜의 행 값과 마지막 변경자를 조회하는 개념 데이터 예시.

문제와 진단: 생성된 CRUD 앱에는 현재값만 남아, 수정·삭제 전 값과 당시 수정자를 보려면 변경 전 행·수정자·유효 기간을 함께 저장해야 했습니다.

제약과 선택: Tibero DB 트리거·프로시저를 쓰면 사용자 정보 전달 규약이 추가로 필요했습니다. 이를 피하려고 사용자 정보를 가진 CRUD 코드에 이력 저장 SQL을 생성하고, 저장·조회가 같은 엔티티 열·기본 키 정의를 따르게 했습니다.

구현: 원본·이력 테이블 DDL과 등록·수정·삭제 서비스 호출 시 영향받는 행의 이력 데이터를 저장하는 SQL을 생성하는 FreeMarker 템플릿을 구현했습니다. 수정·삭제 전 행 값과 변경자·삭제 여부를 이력에 남기도록 했습니다. 원본·이력을 조합해 지정 날짜의 기본 키별 유효 행과 마지막 변경자를 반환하는 조회 SQL을 작성했습니다.

예시: 개념도는 같은 행의 값이 A에서 B, C로 바뀔 때, 1월 10일에 과거 값 B와 마지막 변경자 B를 고르고 현재 원본 값 C는 유지하는 조회 방식을 보여줍니다.

추가 작업

서비스 코드 생성

화면에서 정의한 서비스의 Java 코드 생성 작업에서 Update·Delete 서비스의 템플릿 입력 생성 로직과 FreeMarker 템플릿을 작성했습니다. 실행 결과를 다음 단계의 입력으로 전달하는 매핑, SQL 결과 타입을 Java 타입으로 변환하는 공통 매크로, 여러 테이블을 갱신할 때 단계별 엔티티를 연결하는 구조도 구현했습니다.

엔티티 내보내기·가져오기와 선택 속성 동기화

플랫폼 UI에서 엔티티를 내보내 다른 앱으로 가져오고, 가져온 엔티티를 서비스 정의에 사용합니다. 선택한 속성의 데이터를 복사한 뒤, 연결된 서비스에서 발생한 변경분을 메시지 브로커로 동기화하는 기능입니다.

여러 엔티티를 한 번에 선택할 수 있는 내보내기 화면을 구현했습니다. 선택 속성 메타데이터와 기존 CQRS 미들웨어의 메시지 브로커를 거치는 엔티티 연결 구조를 설계했습니다. 선택한 속성 목록은 엔티티 정보와 함께 저장하고, 발행·구독 연결은 엔티티별로 구성하도록 했습니다. 내보낸 엔티티와 가져온 엔티티 정보를 저장하는 DB 스키마와 API 개발에 참여했습니다.

화면·API·코드 생성·앱 배포가 맞물리는 작업이었습니다. 처음 제시된 개발 일정은 2주였지만, 배포 화면과 개발 화면을 나란히 보여 주며 진행 상태와 기간 안에 구현하기 어려운 이유를 설명했고, 일정은 4주로 조정됐습니다.

SQL Generator 로직·테스트 구현

JSON 입력에서 DDL을 생성하는 SQL Generator 로직을 직접 구현했습니다. 백엔드가 SQL 생성 로직을 라이브러리로 직접 불러 사용하도록 바꾸는 작업에는 참여했습니다. JUnit으로 JSON 입력 기반 SQL 생성 테스트를 작성하고 JaCoCo 커버리지 설정을 추가해 생성 로직을 독립적으로 검증할 수 있게 했습니다.

예외 로그 출력 형식 통일

예외 메시지, 오류 코드, SQL 상태 코드와 스택 트레이스를 한 형식으로 출력하고, 터미널에서 오류 로그를 일반 로그와 시각적으로 구분하도록 구현했습니다.