brunch

You can make anything
by writing

C.S.Lewis

by 최창규 Jan 28. 2022

boot 1.3을 2.3으로 버전업

spring boot

카카오헤어샵 어드민을 spring-boot 1.3에서 2.3으로 버전 업하면서 겪은 시행착오를 공유할까 합니다.



왜 버전업을 하나요?

스프링의 새로운 모듈을 써야 하는데 1.3은 버전이 너무 낮아서 지원이 안되었어요. 5년 동안 방치하다가 이제야 올리게 되었습니다.


그리고 새로 합류한 개발자들이 모두 boot 2.x 에 익숙한 상황이라서 버전을 올리는 것이 유지보수에 유리할 것이라고 판단했습니다. 



참고 페이지

spring-boot 공식 github에 wiki에 upgrade 시 가이드가 잘 정리되어 있습니다. 버전업 시에 반드시 위키를 살펴보세요.



소스 코드를 보시죠.

그럼 소스 코드를 어떻게 바꿨는지 하나씩 알아보겠습니다.


1. gradle plugin 변경

Before

apply plugin: 'org.springframework.boot'

buildscript {    
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE'
    }
}


After

plugins {
    id 'org.springframework.boot' version '2.3.9.RELEASE'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

ext {
    set('springCloudVersion', "Hoxton.SR10")
}


2. JpaRepository 메쏘드 변경


spring boot 1.x 에 사용하던 메쏘드들이 변경되었습니다. 

findOne 이 삭제되고, findById를 사용해야 합니다. findAllById와 saveAlldeleteAll 등도 추가되었습니다.


Before

Shop shop = shopRepository.findOne(1L);

After

Shop shop = shopRepository.findById(1L).orElseThrow(() -> ShopNotFoundException());

또는
Optional<Shop> shop = shopRepository.findById(1L);

3. namingStrategy 변경 


Before

spring.jpa.hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

After

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl


4. 프로퍼티 kebab-case로 작성해야 한다.  

boot 2.0부터 생긴 제약사항인데 applicaiton.yaml의 프로퍼티는 반드시 kebab-case로 작성되어야 합니다. 

Before

payment:
    checkoutServer: https://xx

After

payment:
    checkout-server: https://xx


5. zuul

boot 2.3 까지는 spring-cloud-starter-netflix-zuul를 통해 zuul을 지원하고, boot 2.4부터는 spring-cloud-starter-gateway를 사용해야 합니다. 그런데 spring cloud gateway는 webflux 기반이라서 webmvc와 한 WAS에 올릴 수가 없습니다.


카카오헤어샵 어드민은 webmvc 기반이라서 부득이하게 boot 2.3을 사용했습니다. 


Gradle 4.0 -> 6.8

boot 버전을 올리면서 자연스럽게 java 버전도 11로 올리게 되었고, 그러다 보니 gradle 도 버전 업을 해야 했습니다. 


1. querydsl apt 

querydsl-apt는 spring-boot의 버전업과 관계없이 gradle 버전이 올라감에 따라 설정하는 방식이 바뀌었습니다. gradle 4.6에서 생긴 annotationProcessor를 이용해서 아래와 같이 1줄만 build.gradle 파일에 추가하면 끝!!

Before

task generateQueryDSL(type: JavaCompile, group: 'build') {
    source = sourceSets.main.java
    classpath = configurations.compile + configurations.querydslapt
    options.compilerArgs = [
            "-proc:only",
            "-processor", "com.querydsl.apt.jpa.JPAAnnotationProcessor"
    ]
    destinationDir = file('./src/main/generated')
}

After

annotationProcessor 'com.querydsl:querydsl-apt:4.4.0:jpa'


2. Ivy Repository

gradle 4.x 에서는 ivy repository 설정이 필요하지 않았는데 6.8 로 버전 업하니 설정이 따로 필요하네요.


After

repositories {
    ivy {
        url "https://사내 Nexus"
        layout "maven"
    }
}



맺음말

5년 동안 업데이트하지 않은 spring-boot의 버전업을 하려 하니 일이 굉장히 커졌습니다. 혹시 아직 boot 1.x를 사용하시는 분이 있다면 참고가 되었으면 좋겠네요. 

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari