
AI 요약
레거시 화면을 Spring Boot 3로 옮기며 겉은 비슷해 보여도 조회 결과, 권한·세션 처리, 메뉴 노출 등에서 기존과 다른 동작이 나와 단순 코드 복사가 통하지 않는 문제를 겪었습니다. 그래서 어떤 URL·Controller·세션·SQL·DB가 결합해 결과를 만드는지 기준을 정하고 문서화한 뒤 Controller/Service 분리와 JPA/MyBatis 기준을 적용해 결과를 비교·조정하며 옮겼습니다.
이번 글에서는 레거시 화면을 Spring Boot 3 기반 프로젝트로 옮기면서 겪은 문제를 정리한다.
겉으로는 화면이 비슷하게 보였지만, 실제 결과는 기존 시스템과 다르게 나오는 경우가 있었다.
마이그레이션은 단순히 코드를 새 프로젝트로 복사하는 일이 아니었다.
기존 기능이 어떤 흐름과 조건으로 결과를 만들어내는지 먼저 확인해야 했다.
처음에는 단순하게 생각했다.
기능을 새 프로젝트에 옮기고, 설정 차이만 맞추면 되는 거 아닌가?
하지만 레거시 화면과 신규 화면을 비교하니 차이가 많았다.
조회 결과가 다름
특정 사용자에게만 다른 데이터가 보임
권한에 따라 보여야 할 메뉴가 빠짐
세션 값이 없어 일부 조건이 적용 안됨
문제는 같은 조건에서 기존 시스템과 같은 결과를 만들어내는가가 중요했다.
하나의 화면을 이해하려면 여러 흐름을 같이 봐야 했다.
Controller에는 요청 처리뿐 아니라 분기와 화면 제어 흐름이 섞여 있었다.
Service 계층도 비즈니스 규칙을 표현하기보다 iBatis SQL을 호출하는 역할에 가까웠다.
또 메뉴와 권한은 단순히 URL만 보고 판단할 수 없었다.
세션 값, 메뉴 코드, 사용자 권한, DB 데이터가 함께 맞아야 기존과 같은 결과가 나왔다.
바로 코드를 옮기기보다 먼저 다음과 같은 내용들을 확인했다.
011. 어떤 URL로 접근하는가022. 어떤 Controller를 타는가033. 어떤 메뉴/권한 조건이 필요한가044. 어떤 세션 값을 사용하는가055. 어떤 SQL Map을 호출하는가066. 어떤 DB를 참조하는가077. 레거시 결과와 신규 결과가 같은가이 과정을 거친 뒤에야 신규 프로젝트로 옮기는 것이 안전하다고 판단했다.
흐름을 정리하자면 아래와 같다.
Codex는 코드 이식 속도를 높이는 데 도움이 됐다.
하지만 무엇을 옮겨야 하는지, 어떤 기준을 맞춰야 하는지, 결과가 맞는지는 직접 확인해야 했다.
그래서 Codex를 사용할 때도 먼저 기준을 정했다.
Controller는 요청/응답 처리에 집중한다
비즈니스 흐름은 Service 계층으로 이동한다
단순 변경 중심 로직은 JPA로 옮긴다
복잡한 조회나 기존 SQL 의존도가 높은 부분은 MyBatis로 유지한다
레거시와 신규 결과를 비교한 뒤 차이를 수정한다
이 기준이 없었다면 결과물이 일관되지 않았을 것이다.
마이그레이션 중에 결과가 다르면 처음에는 코드 문제라고 생각하기 쉬웠다.
실제로는 여러 가지 원인 때문이었다.
011. 이식한 코드의 문제022. SQL 변환 과정의 문제033. 세션 값 누락 문제044. 권한 조건 누락 문제055. DB 데이터 문제066. 테스트 기준 자체가 잘못된 문제그래서 결과가 다를 때마다 바로 코드를 고치기보다 먼저 원인을 나눠서 봤다.
예를 들면
이렇게 나누니 불필요하게 코드를 고치는 일을 줄일 수 있었다.
이 작업을 하면서 문서화가 필요하다는 걸 느꼈다.
마이그레이션은 한 번에 끝나는 작업이 아니고 기능마다 확인해야 할 기준이 달랐다.
머릿속으로만 기억하면 나중에 같은 문제를 반복해서 확인하게 된다.
그래서 아래와 같은 문서를 남기기 시작했다.
011. 레거시 URL / Controller / SQL Map 매핑표022. 메뉴 / 권한 매핑표033. 세션 사용 지점 정리044. JPA / MyBatis 분리 기준055. 레거시 결과와 신규 결과 비교 기록066. 배포 전 확인할 체크리스트문서화의 목적은 단순 기록이 아니었다.
내가 어떤 기준으로 마이그레이션하고 있는지 계속 확인하기 위한 장치였다.
또 Codex를 사용할 때도 이 기준이 있어야 더 일관된 결과를 얻을 수 있었다.
마이그레이션은 코드를 옮기는 일이 아니라 기존 기능이 만들어지던 흐름을 새 구조에서 다시 맞춰가는 일이었다.
Spring Boot 3로 바꾸고, eGov를 제거하고, iBatis를 JPA/MyBatis 구조로 나누는 것도 중요하다.
하지만 그보다 먼저 중요한 것은 기존 시스템이 어떤 기준으로 동작하는지 이해하는 것이었다.