안녕하세요. Calvin입니다.
카카오헤어샵 어드민을 spring-boot 1.3에서 2.3으로 버전 업하면서 겪은 시행착오를 공유할까 합니다.
스프링의 새로운 모듈을 써야 하는데 1.3은 버전이 너무 낮아서 지원이 안되었어요. 5년 동안 방치하다가 이제야 올리게 되었습니다.
그리고 새로 합류한 개발자들이 모두 boot 2.x 에 익숙한 상황이라서 버전을 올리는 것이 유지보수에 유리할 것이라고 판단했습니다.
spring-boot 공식 github에 wiki에 upgrade 시 가이드가 잘 정리되어 있습니다. 버전업 시에 반드시 위키를 살펴보세요.
그럼 소스 코드를 어떻게 바꿨는지 하나씩 알아보겠습니다.
apply plugin: 'org.springframework.boot'
buildscript {
dependencies {
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.0.1.RELEASE'
}
}
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")
}
spring boot 1.x 에 사용하던 메쏘드들이 변경되었습니다.
findOne 이 삭제되고, findById를 사용해야 합니다. findAllById와 saveAll, deleteAll 등도 추가되었습니다.
Shop shop = shopRepository.findOne(1L);
Shop shop = shopRepository.findById(1L).orElseThrow(() -> ShopNotFoundException());
또는
Optional<Shop> shop = shopRepository.findById(1L);
spring.jpa.hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
boot 2.0부터 생긴 제약사항인데 applicaiton.yaml의 프로퍼티는 반드시 kebab-case로 작성되어야 합니다.
payment:
checkoutServer: https://xx
payment:
checkout-server: https://xx
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을 사용했습니다.
boot 버전을 올리면서 자연스럽게 java 버전도 11로 올리게 되었고, 그러다 보니 gradle 도 버전 업을 해야 했습니다.
querydsl-apt는 spring-boot의 버전업과 관계없이 gradle 버전이 올라감에 따라 설정하는 방식이 바뀌었습니다. gradle 4.6에서 생긴 annotationProcessor를 이용해서 아래와 같이 1줄만 build.gradle 파일에 추가하면 끝!!
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')
}
annotationProcessor 'com.querydsl:querydsl-apt:4.4.0:jpa'
gradle 4.x 에서는 ivy repository 설정이 필요하지 않았는데 6.8 로 버전 업하니 설정이 따로 필요하네요.
repositories {
ivy {
url "https://사내 Nexus"
layout "maven"
}
}
5년 동안 업데이트하지 않은 spring-boot의 버전업을 하려 하니 일이 굉장히 커졌습니다. 혹시 아직 boot 1.x를 사용하시는 분이 있다면 참고가 되었으면 좋겠네요.