[전자정부프레임워크] 3.5 → 4.0 마이그레이션 및 호환성 인증

박상준·2024년 3월 5일
1

실무

목록 보기
7/8

개요

  • 회사에서 전자정부 프레임워크관련하여 마이그레이션 및 호환성 점검을 받은 내용을 기록한다.
  • Spring MVC 와 Spring Boot 모두 마이그레이션을 수행하였습니다.
  • 회사마다 소스 형태가 다르기에, 다르다는 점을 일단 알아야함.

부트 이전 상황

  • 부트 소스
    • Spring Boot 2.4.5
    • 전자정부 버전 3.5

버전 업 이후 호환성 인증 관련 수행하는 작업

  1. 라이브러리의 충돌 사항
  2. 정상 실행과 DB 연동 여부
  3. 트랜잭션 고의 예외 발생 이후의 롤백이 되는지
  4. 기존의 전자정부 프레임워크 사이트와 로그인 세션의 공유가 되는지
  5. 레이어 계층이 올바르게 나누어져 있는지

수행

전자정부 버전업 3.5 → 3.10

egovframework:rtemigration3.6 [eGovFrame]

  1. 라이브러리 버전 업 수행

    ext {
        egovRteVersion = '3.10.0'
    }
    
    implementation "egovframework.rte:egovframework.rte.ptl.mvc:${egovRteVersion}"
    implementation "egovframework.rte:egovframework.rte.psl.dataaccess:${egovRteVersion}"
    implementation "egovframework.rte:egovframework.rte.fdl.idgnr:${egovRteVersion}"
    implementation "egovframework.rte:egovframework.rte.fdl.property:${egovRteVersion}"
    implementation "egovframework.rte:egovframework.rte.fdl.security:${egovRteVersion}"
  2. 수행 후 소스 정상 실행 및 CRUD + 트랜잭션 테스트

    • 별도 테스트코드가 소스내에 존재하지 않아서, 직접 CRUD 와 트랜잭션 관련 테스트를 수기로 진행함.
    • 결과
      • 문제가 없었습니다.
  3. 3.10 까지는 크게 변경된 내용이 없었습니다.

    • 단순 라이브러리의 버전만 변경해주고 내부 소스에는 영향점이 거의 없었습니다.

전자정부 버전업 3.10 → 4.0

egovframework:rtemigration4.0 [eGovFrame]

  1. 라이브러리 버전

    1. 일단 라이브러리의 버전을 올린다.
    ext {
        egovRteVersion = '4.0.0'
    }
  2. 4.0 에서는

    • JDK 1.8 즉, Java8 이 최소 버전이며
    • Servlet 3.1 이 필요하였다.
    • 하지만, 이미 Spring Boot 2.4.5 에서는 Getting Started
      • JDK 8 을 최소 버전으로 지정해놓았고, Servlet 의 경우

        Apache Tomcat 8 (8.5.99) - Documentation Index

      • 이미 Spring Boot 2.4.5 에서는 Tomcat 8.5 을 내장하고있기에,

        • 3.1 이상의 버전을 사용하고 있었습니다.
  3. 라이브러리 의존성 변경

    1. 스프링 버전의 변경점

      <spring.maven.artifact.version>4.3.25.RELEASE</spring.maven.artifact.version>

      에서

      <spring.maven.artifact.version>5.3.6</spring.maven.artifact.version>

      로 변경을 해야되었었다.

      • 하지만 요 부분도 Spring Boot 2.4.5 에서
        • 내부적으로 Spring 버전을 5.3.6 을 사용중이였다.
      • 다만
    2. 전자정부 라이브러리관련 변경점

      ext {
          egovRteVersion = '3.5.0'
      }
      
      implementation "egovframework.rte:egovframework.rte.ptl.mvc:${egovRteVersion}"
      implementation "egovframework.rte:egovframework.rte.psl.dataaccess:${egovRteVersion}"
      implementation "egovframework.rte:egovframework.rte.fdl.idgnr:${egovRteVersion}"
      implementation "egovframework.rte:egovframework.rte.fdl.property:${egovRteVersion}"
      implementation "egovframework.rte:egovframework.rte.fdl.security:${egovRteVersion}"
      • 에서
      ext {
          egovRteVersion = '4.0.0'
      }
      
      implementation "org.egovframe.rte:org.egovframe.rte.ptl.mvc:${egovRteVersion}"
      implementation "org.egovframe.rte:org.egovframe.rte.psl.dataaccess:${egovRteVersion}"
      implementation "org.egovframe.rte:org.egovframe.rte.fdl.idgnr:${egovRteVersion}"
      implementation "org.egovframe.rte:org.egovframe.rte.fdl.property:${egovRteVersion}"
      implementation "org.egovframe.rte:org.egovframe.rte.psl.data.jpa:${egovRteVersion}"
      • 자바 파일내 import 수정
        • 변경 전
          import egovframework.rte.psl.dataaccess.EgovAbstractMapper;
        • 변경 후
          import org.egovframe.rte.psl.dataaccess.EgovAbstractMapper;
        • 전체 수행 법
          1. 전체 프로젝트의 검색
            1. IDE 검색 기능으로 전체 프로젝트의 범위에서 변경 전 패키지 명을 검색함
          2. 일괄 수정
            1. 검색 결과를 통해 나타난 모든 import 구문을 새 패키지 명으로 일괄 수정함.
          3. 테스트
            • CRUD 및 트랜잭션 동작 여부 확인
    3. maven repository http → https

    • 에 따른 별도 maven 레포지터리 https 변경
    • 암호화를 위한 설정인 듯 합니다.
    1. message-source 관련 설정 변경

      1. 해당 xml 파일의 경우 Java 파일의 경우
        **ReloadableResourceBundleMessageSource** 로 1대1 매핑됩니다.

      2. ReloadableResourceBundleMessageSource

        ReloadableResourceBundleMessageSource (Spring Framework 5.3.6 API)

        • 스프링 프레임워크의 국제화 기능을 지원하는 클래스이다.
        • 일단 기본적으로 다국어 관련 기능의 경우 아래의 2가지 메서드를 주 기능으로 사용한다.
          • **AbstractResourceBasedMessageSource 의 하위 클래스인 `ReloadableResourceBundleMessageSource`** 는
            • addBasenames
              • 해당 메서드는 특정 리소스 위치의 프로퍼티 파일을 로드하는 역할을 수행한다.
            • setCacheSeconds
              • 해당 매서드는 캐싱 매커니즘 타이밍을 지정하기 위한 메서드이다.
              • 로드된 프로퍼티 파일은 캐시에 저장되고,
                • (60) 으로 설정하는 경우 1분 동안 캐싱되며, 1분 이후에는
                  • 변경감지
                  • 변경되었다면 새로 로드하는 과정을 수행한다.
      3. 일단 잡설이 길었고, 해당 클래스를 사용하여 등록된 프로퍼티에서 라이브러리 관련된 부분이 있다면

        1. classpath:/egovframework/rte/fdl/idgnr/messages/idgnr 에서
        2. classpath:/org/egovframework/rte/fdl/idgnr/messages/idgnr 이런식으로 수정이 필요하다.
    2. jackson 관련 라이브러리 버전의 변경점

      • 하지만 요 부분도 이미 spring boot 2.4.5 버전을 사용중이였기에,

        • 문제가 되지 않았다.
        • jackson 관련 라이브러리는 .. 일단 마이그레이션 가이드 자체가 존재하지 않았고, 변경점에 관련된 내용이 중구난방이라, 일단 올리고 보자 라는 생각부터 들었다.
        • 테스트 코드가 있었다면 라이브러리 영향점을 테스트코드로 확인할 수 있었을 텐데.. 라는 아쉬움이 너무 생겼다 ..

마이그레이션 과정을 통한 깨달음

  • 마이그레이션 과정에서 가장 두드러진 발견은
    • 우리의 솔루션이 전자정부 프레임워크가 직접 지원하는 범위를 이미 상당 부분 넘어섰다는 점이었습니다.
  • 라이브러리 의존성을 점검하면서, 낮은 버전과 높은 버전의 라이브러리가 혼재되어 있는 상황을 목격했습니다.
    • 이러한 충돌에도 불구하고, 라이브러리 버전 관리에 대한 깊은 고민이 부족했던 것으로 보입니다.
      • 이미 퇴사한 시점에 생각해보면, 참으로 중요하고, 시스템에 크리티컬한 영향을 미치는 행위임에도…
    • 이는 우리가 기술 스택에 대해 보다 신중하게 접근해야합니다

점검 관련 기록 사항

  1. 점검은 기본적으로
    1. 레거시( 전자정부 소스 ) ↔ 솔루션 ( 회사 소스 ) 연동으로 수행된다.
    2. 각 소스 기반에 서로의 소스 메인 소스를 주입해보고, 트랜잭션과 CRUD 가 되는지 체크한다.
  2. 점검관련해서도 여럿 방법이 있었는데 회사 내부 소스관련된 부분이라 까다롭다.
  3. 일단 전자정부 측에서 수행한 테스트로는..
    1. 서비스 로직에 1/0 연산을 수행하여
      1. ArithmeticException 을 고의로 발생시킨다.
      2. 해당 에러가 발생하면, 트랜잭션이 제대로 걸려있다면, 롤백이 발생하게 된다.
      3. 콘솔에 해당 에러가 뜨는지 체크
    2. 전자정부 기반 에서 솔루션을 연동하는 경우 ( L ← S ) , 솔루션에서 전자정부 기반을 연동하는 경우 ( S ← L )
      1. 모두 CRUD 정상 테스트를 수기로 테스트함
  • 왜 테스트코드로 점검하지 않는거지? 라고 의문이 든다면..
    • 그냥 테스트 코드가 없이 그냥 돌아가는 회사가 많기 때문이 아닐까…? 싶다.

추가

  • 부트가 아닌 소스로 마이그레이션을 동일하게 수행했습니다.
    • 기존 소스와 사실 non boot 의 경우 xml 로 프로퍼티가 구성되어 있고,
    • boot의 경우 java 로 프로퍼티가 구성되어 있다는 차이점외에는 그렇게 주목할 만한 차이는 없었던 것 같습니다.
profile
이전 블로그 : https://oth3410.tistory.com/

0개의 댓글