외부 연계

시퀀싱 분석 처리 모듈(CIWER·WaveChecker) 연계 구조 검증 및 LIMS REST API 개발

시퀀싱 분석 처리 모듈(CIWER·WaveChecker)의 반응별 직접 호출 성능을 검증해 상시 기동 REST API로 전환하고, 2026년에는 Well 좌표 충돌 시 표준 HTTP 오류 응답을 반환하도록 후속 안정화했습니다.

기간
2025.05 설계·분석 / 2025.06 — 2025.11 구축·일본 적용 / 2026.04 — 2026.05 안정화
상태
운영 반영
역량
성능 검증 · 프로세스 생명주기
3개LIMS REST API
3개 환경본사·유럽·일본
2025.11.04일본 운영 반영
직접 담당한 범위
AS-IS 분석·연계 성능 검증·LIMS REST API 설계와 개발·법인 환경 적용
판단을 바꾼 증거
3개 DB 접근 방식의 구간별 측정 코드와 반응마다 JVM·Pool이 종료되는 생명주기 분석
전환 결과
본사·유럽·일본 Profile·Mapper 분리 구성, 일본 운영 반영과 2026년 표준 오류 응답 보완

CASE STUDY

한눈에 보는 변화

처음에는 어떤 Connection Pool이 더 적합한지를 고르는 문제처럼 보였습니다. 하지만 Spring Boot·MyBatis Pool·직접 JDBC 비교 구현과 구간별 측정 코드, 호출 생명주기를 함께 분석하자 핵심은 라이브러리가 아니라 반응마다 시작하고 종료되는 JVM 구조에 있었습니다. 이 근거를 바탕으로 연계 구조 자체를 상시 기동 REST API로 전환했습니다.

초기안은 분석 반응마다 Java 모듈을 새로 실행해 LIMS와 연계하는 방식이었습니다. 기존 분석시간에 JVM 기동과 DB 연결 비용이 반복해서 더해지고, 프로세스가 종료될 때마다 Connection Pool 재사용 효과도 사라지는 구조였습니다.

직접 담당한 범위

  • 팀 프로젝트 내 기존 CES 분석·발송 프로세스와 데이터 처리 구조 분석
  • 연계 방식별 성능 검증과 상시 기동 REST API 전환 제안
  • LIMS API 설계·개발, 테스트·문서화와 본사·유럽·일본 환경 적용
프로젝트 변경 전후 비교
구분변경 전변경 후확인된 변화
실행 생명주기분석 반응마다 Java 모듈을 실행하고 처리 후 JVM 종료LIMS 연계 애플리케이션을 상시 기동하고 REST 요청 반복 처리요청마다 반복되던 초기화 경계 제거
Connection 재사용반응 종료와 함께 Pool도 사라져 첫 Connection 생성 비용 반복JVM과 HikariCP를 유지해 후속 요청에서 Connection 재사용Pool이 실제로 효과를 내는 생명주기 확보
연계 계약모듈 실행 인자와 종료 결과에 의존한 데이터 전달샘플 조회·결과 저장·실패 저장의 3개 API로 책임 분리결과·오류·Comment 전달 방식 표준화
법인별 환경본사·유럽·일본의 DBMS와 설정 차이가 호출 구조에 혼재공통 API 계약 아래 Profile과 Oracle·MariaDB Mapper 분리3개 환경에 동일 애플리케이션 구조 적용
업무 실패 응답Well 좌표 충돌 시 HTTP 200과 빈 응답으로 실패 원인 식별 곤란HTTP 500과 표준 errorCode·errorMessage 반환호출 측에서 업무 실패를 명시적으로 판별

EVIDENCE CHAIN

문제를 좁힌 과정

  1. 01 · 초기안 분석

    Query가 아니라 프로세스 시작부터 종료까지를 한 건의 비용으로 봤습니다

    초기 연계안은 반응마다 Java 모듈을 실행해 설정 로드, DB 연결, 데이터 처리 후 종료하는 구조였습니다. 요청마다 반복되는 애플리케이션 초기화와 DB 연결 비용이 전체 처리량을 좌우할 수 있어 Query 외의 구간도 분석 대상으로 잡았습니다.

    판단Query 실행시간만 비교하면 JVM 기동과 DB 연결이라는 반복 비용을 놓치므로 측정 범위를 프로세스 전체로 넓혀야 했습니다.

  2. 02 · 비교 구현

    세 가지 DB 접근 방식을 같은 조건에서 직접 구현했습니다

    Spring Boot·HikariCP, Non-Spring MyBatis Connection Pool, 직접 JDBC 방식을 구현하고 초기화·Connection·Query·Mapping 구간을 나누는 측정 코드를 구성했습니다. 특정 프레임워크에 대한 선호가 아니라 반복 비용의 위치를 비교할 수 있게 조건을 나눴습니다.

    판단라이브러리 선택 전에 각 방식이 같은 생명주기에서 어떤 비용을 반복하는지 증거를 확보했습니다.

  3. 03 · 구간 분석

    초기화·Connection·Query·Mapping을 분리해 병목의 위치를 확인했습니다

    애플리케이션 초기화, Connection 획득, Query 실행, Result Mapping을 분리해 측정하는 소스 코드를 확인했습니다. 실행 결과 로그는 보존되지 않아 구체 시간값을 성과로 채택하지 않았지만, 반응이 끝나면 JVM과 Pool도 함께 종료되는 구조는 확인할 수 있었습니다.

    판단Pool을 적용해도 재사용할 다음 요청이 없으므로 초기화 비용만 더하고 재사용 이점은 얻기 어려운 구조였습니다.

  4. 04 · 문제 재정의

    Connection Pool 비교를 프로세스 생명주기 설계 문제로 바꿨습니다

    HikariCP·MyBatis Pool·직접 JDBC 사이의 차이를 줄이는 것으로는 반응마다 반복되는 상위 비용을 제거할 수 없었습니다. JVM과 Pool을 여러 요청 동안 유지하는 구조가 필요하다는 근거로 연계안 변경을 제안했습니다.

    판단객체 생명주기보다 상위인 프로세스 생명주기가 병목이면 라이브러리 최적화가 아니라 실행 구조를 바꿔야 했습니다.

  5. 05 · 운영 보완

    API 전환 뒤에는 계약과 데이터 일관성 문제를 별도로 안정화했습니다

    3개 API를 본사·유럽·일본 환경에 적용한 뒤 파라미터 누락, Key 채번, Run 시간, 부분완료 주문 처리 조건을 점검하고 보완했습니다. 성능 구조 전환과 업무 데이터 정합성을 별도 검증 항목으로 관리했습니다.

    판단상시 기동 구조가 성능 문제를 해결해도 요청 계약과 트랜잭션 경계는 운영 시나리오로 다시 검증해야 했습니다.

  6. 06 · 2026년 후속 안정화

    빈 성공 응답으로 보이던 Well 좌표 충돌을 명시적 실패 계약으로 바꿨습니다

    Well 좌표 충돌 경로가 HTTP 200과 빈 응답을 반환해 호출 측에서 정상과 실패를 구분하기 어려웠습니다. Service·Mapper 흐름을 추적해 HTTP 500과 표준 errorCode·errorMessage를 반환하도록 수정했습니다.

    판단연계 API는 저장 성공뿐 아니라 업무 조건 불일치를 호출 측이 일관되게 판별할 수 있어야 했습니다.

DECISION LOG

검토한 대안과 선택 근거

제외

반응별 Spring Boot·HikariCP 실행

프로세스 종료 시 Pool도 사라져 Connection 재사용 없이 초기화 비용이 매번 반복되기 때문입니다.

제외

Non-Spring MyBatis Pool로 경량화

초기화 차이는 줄일 수 있어도 반응마다 Pool이 폐기되는 생명주기 문제는 그대로 남기 때문입니다.

보완

직접 JDBC 호출 유지

비교 기준으로는 유효했지만 연결 생성과 프로세스 기동을 반응마다 반복하는 구조적 비용은 제거하지 못했습니다.

선택

상시 기동 LIMS REST API

JVM과 Pool을 유지해 반복 비용을 제거하면서 분석 시스템과 LIMS의 요청·응답 계약도 명시적으로 관리할 수 있었습니다.

IMPLEMENTATION

설계와 구현

API 책임 분리

  • 분석 성공 결과와 관련 데이터를 저장하는 API
  • 분석에 필요한 샘플 정보를 조회하는 API
  • 실패 상태·원인·Comment를 전달하는 API

트랜잭션·데이터

  • 결과·결과 파일·신호·반응 상태·주문 집계를 하나의 업무 처리로 구성
  • Report와 변경 이력까지 같은 트랜잭션 경계에서 반영
  • 기존 데이터 유무에 따라 Insert·Update 책임을 API 내부로 통합

공통 API 기반

  • 토큰 인증과 요청값 검증 적용
  • 표준 예외 응답과 요청·응답 이력 저장
  • 호출 측이 성공·업무 실패·시스템 실패를 구분할 수 있는 전달 구조 구성

다법인 실행 환경

  • 본사·유럽·일본 Profile로 접속정보와 환경 설정 분리
  • Oracle·MariaDB 차이를 MyBatis Mapper 경계에서 수용
  • 공통 API 계약을 유지한 채 법인별 데이터 구조 차이 반영

VERIFICATION

테스트 매트릭스

프로젝트 테스트와 완료 기준
검증 영역검증 방법완료 기준
구조 성능세 구현의 초기화·Connection·Query·Mapping 구간별 비교병목 구간과 프로세스 반복 비용을 분리해 전환 근거 확보
API 계약샘플 조회·성공 결과·실패 결과의 정상·누락·잘못된 요청 실행검증 규칙과 표준 성공·오류 응답 일관성
데이터 일관성기존 데이터 유무별 Insert·Update와 트랜잭션 실패 재현결과·상태·집계·Report·이력이 부분 반영되지 않음
다법인 환경본사·유럽·일본 Profile과 Oracle·MariaDB Mapper별 실행동일 API 계약으로 법인별 조회·저장 흐름 정상 동작
운영 회귀파라미터·Key·Run 시간·부분완료 주문 조건 재검증후속 보완 조건을 포함한 분석·LIMS 상태 정합성 유지
Well 좌표 충돌사용자 검증 2개 고유 시나리오와 Service·Mapper 변경 경로 검증HTTP 500과 표준 errorCode·errorMessage로 실패 원인 전달

OPERATION

운영 반영과 후속 안정화

운영 이슈

필수 파라미터 누락

분리한 원인
분석 시스템과 API 사이 요청 계약에서 필수 값 전달 조건 확인
대응
검증 규칙과 전달 항목을 보완하고 요청·응답 이력으로 재확인
운영 이슈

Key 채번·Run 시간 반영

분리한 원인
신규·기존 데이터 분기와 분석 실행 정보의 저장 시점 점검
대응
Insert·Update 조건과 관련 데이터 반영 순서 보완
운영 이슈

부분완료 주문 상태

분리한 원인
반응 단위 완료와 주문 집계 완료 조건의 경계 분리
대응
부분완료 조건에서도 주문·반응 상태가 일관되도록 집계 로직 보완
운영 이슈

Well 좌표 충돌의 빈 성공 응답

분리한 원인
업무 조건 불일치가 HTTP 200과 빈 응답으로 종료되는 경로 확인
대응
HTTP 500과 표준 오류 코드·메시지로 응답 계약 보완
확인된 결과
  • 측정 코드와 프로세스 생명주기 분석으로 반응별 모듈 기동 방식의 구조적 위험을 식별해 도입 전 제거
  • 분석 시스템과 LIMS 간 결과·오류·Comment의 표준 REST 전달 구조 운영 반영
  • 일본법인 CIWER 운영 반영을 2025.11.04 완료
  • Well 좌표 충돌을 HTTP 500·표준 오류 응답으로 전달하도록 2026.04~05 후속 안정화

TAKEAWAYS

이 사례에서 드러난 역량

  • Connection Pool의 효과는 구현체보다 Pool을 재사용할 수 있는 프로세스 생명주기에 먼저 좌우됩니다.
  • 성능 검증은 Query 한 구간이 아니라 실제 호출 한 건이 부담하는 초기화부터 결과 반환까지 포함해야 합니다.
  • 구조 변경을 제안할 때는 프레임워크 선호보다 비교 구현·측정 코드와 생명주기 분석이 설득 근거가 됩니다.
  • 팀 프로젝트에서는 전체 제품 성과와 직접 담당한 연계 분석·LIMS API 범위를 명확히 구분해야 합니다.
성능 검증프로세스 생명주기REST API다법인 연계

사용 기술

Java 8Spring Boot 2.7.5MyBatisREST APIOracle/MariaDBHikariCPJDBCLog4j2