brunch

You can make anything
by writing

C.S.Lewis

boot 1.3을 2.3으로 버전업

안녕하세요. Calvin입니다. 

카카오헤어샵 어드민을 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를 사용해야 합니다. findAllByIdsaveAll, deleteAll 등도 추가되었습니다.


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를 사용하시는 분이 있다면 참고가 되었으면 좋겠네요. 

매거진의 이전글 JPA Dirty Checking사용시 주의점
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari