IT 웹개발/스프링(Spring)

[SPRING] 스프링 버전 업그레이드 (3.0.x -> 3.2.x)

펌킨고구마 2023. 1. 27. 15:50
728x90
반응형

프로젝트 이관관련해서 일이 하나 내려졌는데,

새로운 서버에 기존 프로젝트를 옮기는 일이었다. 하지만 이왕지사 jdk 버전과 tomcat 버전을 업그레이드해 달라고 요청이 왔다. 

크게 오류 날 것은 없다고 생각하여, 로컬에서 테스트 해보고, 잘 되어 큰 걱정 없이 운영서버에 포팅하는 중에 오류가 났다. 

 

며칠 이러쿵 저러쿵 방법을 강구하다가 결론은 소스 내에 혼재되어 있는 스프링버전을 통일시키기로 했다.

 

현재 3버전과 4 버전 일부가 합쳐져 있었는데

이왕이면 높은 버전으로 바꾸고 싶었으나, 내가 결정할 부분은 아니었다 보니.....

최대한 버전은 건드리지 말자 하셨기에 그렇게 하기로 했다. 


그래서 수정방향은 아래와 같다. 

jdk는 1.7 ->1.8

tomcat 7 -> 9

springFramework 3.0.5 -> 3.2.2 -> 3.2.9

 

처음에 3.2.2로 정했던 이유는 

여기 프로젝트 내에 스프링 4.x의 일부가 들어있던 원인과 같았다.

뭐 여기는 pom.xml에서 관리하는 게 아닌 lib를 추가하여 관리하다보니 약간의 혼재도 가능했는듯 ? 

 

이 프로젝트는 pom.xml에 maven으로 관리하는게 아니라 lib파일을 삭제 추가 하는 식으로 진행하였다 

[진행순서]

1. lib 폴더 내에 있는 spring-*-4.x.jar파일들을 전부 삭제

2. 3.0.x jar만 있는 상태에서 오류가 나거나 하는 부분을 새로운 버전(3.2.x)으로 덮어쓰기 하면서 소스 수정

3. 오류가 다 잡히면, org.springframework-*-3.0.x.RELEASE.jar파일들도 삭제하는 식으로 진행하였다.

 

 

여기서 초반에 3.2.2 로 결정한 부분이 나온다. 

 3.2.2로 정한 이유는 3.0.5로 두었을 때 여기 logback이 설정되어 있는데, 아래 부분에서 오류가 나기 때문이었다.

 

심각: Context initialized 이벤트를 [ch.qos.logback.ext.spring.web.LogbackConfigListener] 클래스의 인스턴스인 리스너에 전송하는 동안 예외 발생
java.lang.NoClassDefFoundError: org/springframework/web/util/ServletContextPropertyUtils
at ch.qos.logback.ext.spring.web.WebLogbackConfigurer.initLogging(Unknown Source)
at ch.qos.logback.ext.spring.web.LogbackConfigListener.contextInitialized(Unknown Source)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4716)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5172)

 

 

해당 클래스가 정의되어있지 않다고 하는데 이, org/springframework/web/util/ServletContextPropertyUtils 이 클래스는 

아래 사이트에 가 보면 since 3.2.2라고 되어있음.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/util/ServletContextPropertyUtils.html

 

ServletContextPropertyUtils (Spring Framework 6.0.4 API)

resolvePlaceholders Resolve ${...} placeholders in the given text, replacing them with corresponding servlet context init parameter or system property values. Unresolvable placeholders with no default value are ignored and passed through unchanged if the f

docs.spring.io

아, 3.0.5에는 없어서 오류가 나는것 같다. 

그렇다면 3.2.2 버전으로 결정 땅땅!

 

하지만 

 

이렇게 결정하고 진행하는데 갑자기 또 복병이 생겼다.

여기서 3.2.9의 버전으로 결정한 이유가 나온다.

 

아래와 같은 오류가 계속 나온것.

org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet

 

이 오류는 이래저래 검색해보니, 

 

스프링 환경에서 자바 7이하에서 자바 8로 업그레이드 할 때 많이 보인다고 하는데 

이 오류는  Spring 3.2.8 이하에서 생길수 있는 오류라고 한다. 

1. java 7 로 컴파일

2. Spring 버전을 4이상으로 업그레이드

3. Spring Framework 버전 3.2.9 이상으로 업그레이드 

위의 방법으로 해결할 수 있다고 한다. 

 

휴 다행

Spring 3.2.9 에서도 위의 오류가 해결되었다고 하니 그렇다면 버전은 다시 3.2.9로 변경!

 

 

lib폴더 내에 jar 파일로 넣다보니 jar파일을 구해야 하는데 이건 아래 사이트에서 쉽게 구할 수 있다.

사이트 주소 : https://mvnrepository.com/

 

여기 사이트에서 원하는 라이브러리를 검색해서 원하는 버전으로 다운받으면 된다. 

 

 

이렇게 하나하나 지우고 넣고 실행을 반복하고 있는데 갑자기 또 오류가 난다.

 

java.lang.IncompatibleClassChangeError: class org.springframework.core.type.classreading.ClassMetadataReadingVisitor has interface org.springframework.asm.ClassVisitor as super class

 

 

뭔 오류인가 이건 또 하고 찾아보니,

3.2버전 이후 부터는 spring-asm 라이브러리가 spring-core에 기본 포함되어 있어서 기존 라이브러리를 삭제 하라는 내용이라고 한다.

 

그렇군!

 

아직 3.0.5버전의 srping-asm을 삭제하지 않아 생긴 오류.

위 사이트에서 spring asm을 검색해보니  3.1.4버전이 마지막으로 더이상 스프링버전도 없더라

 

 

이렇게 해서 대강 스프링 3.0.5 에서 3.2.9로 버전 업그레이드는 완료했다.

다음주에 서버에 다시 포팅할 예정. 

로컬에서는 잘 되니 서버에도 잘 되었으면 좋겠다. 

 

 

 

 

728x90
반응형
LIST