티스토리 뷰
사이드 프로젝트 Spring boot 3.0 migration
KimDoubleB 2022. 12. 28. 02:15사이드 프로젝트를 Spring boot 3.0으로 migration 하면서 정리한 글. 아주 러프하게 정리했다.
- 다음에 Spring boot migration 3.0 문서를 번역해야겠다는 생각이 ...
javax package name 변경
javax
→ jakarta
- IntelliJ에서
import javax.
을import jakarta.
로 전체 replace하면 편하다. (검토필요)
왜?
- Java EE는 오라클에서 이클립스 재단으로 이관되었었음. 오라클이 JavaEE 프로젝트는 이관했지만, Java 상표권은 여전히 보유하고 있었기에 Java naming의 namespace 사용에는 제약이 있음. 이로 인해 Java EE는 Jakarta EE로, API package명은 javax.에서 jakrata.로 변경되었음.
- Spring boot 3.0은 JakartaEE에 의존함. 이에 따라 변경이 필요.
thymeleaf spring5 package 명 변경
import org.thymeleaf.spring5.SpringTemplateEngine;
→ import org.thymeleaf.spring6.SpringTemplateEngine;
왜?
- Spring boot 3.0은 Spring framework 6를 사용함. 이에 Spring 6에서 변경된 패키지들을 적용해야 함.
@ConstructorBinding 제거
왜?
@ConfigurationProperties
클래스의 type level에서@ConstrutingBinding
은 더 이상 지원되지 않음.- 생성자가 한 개인 경우,
@ConfigurationProperties
만으로도 binding이 가능해짐.
QueryDSL 의존성 수정 필요
Before
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor(
"javax.persistence:javax.persistence-api",
"javax.annotation:javax.annotation-api",
"com.querydsl:querydsl-apt:${queryDslVersion}:jpa")
After
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jakarta"
왜?
- 패키지명이 javax에서 jakarta로 변경되며 queryDSL에도 변경사항이 생김.
@Sql annotation 제거 → runInitScript로 대체
(정확히 어떤 의존성에서 버전 영향으로 기능이 변경된 것인지 확인하지는 못함)
기존에 TestContainer
로 DB Integration test를 구성하였음.
- TestContainer 구성 클래스를 상속받아 Jpa 관련 설정 annotation을 추가하여 JpaTest 추상 클래스를 구성함.
- JpaTest 추상 클래스를 상속받아 Persistent layer에 대해 Jpa integration test를 수행할 수 있었음.
JpaTest 추상 클래스 단에서 @Sql
annotation을 통해 initialize query를 수행하고 있었음.
- Test 과정 중 무조건 1번만 실행하도록 구성. 처음에
@Sql
annotation으로 Init 된 후에는 다시 실행되지 않게 구성.
Spring boot 3.0으로 올리자 DB Integration test가 깨지기 시작.
- 기존 테스트 중 무조건 1번만 실행되던
@Sql
initialize query가 JpaTest 추상 클래스를 상속받은 모든 테스트마다 실행되기 시작했음. - 1번만 실행되어야 할 쿼리가 계속 실행하면서 PK 값이 중복되면서 오류를 반환.
Sql annotation의 구현방식에 대해 변화가 있는 것으로 보이는데, 현재로서 이 부분을 분석하고 변경하기보다 아예 TestContainer 단의 DB initialize query를 사용함으로써 대체함.
- 개인적으로
@Sql
annotation은 initialize 용도/의미로 보이지 않음. 그 의미를 되살리기 위해서는 TestContainer 단에서 처리하는 것이 올바른 것으로 보인다고 생각. - TestContainer에서
ScriptUtils.runInitScript
를 지원하고 있었고, 이를 통해 DB 시작과 동시에 여러 개의 initalize query를 실행시킬 수 있었음. - 관련 Commit Link
jpa database-platform property MySQL 변경
before
spring:
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
after
spring:
jpa:
database-platform: org.hibernate.dialect.MySQL5Dialect
MySQL5InnoDBDialect
가 MySQL5Dialect
로 변경되었음.
spring fox를 springdoc-openapi로 대체
Swagger를 위한 Spring fox boot starter를 springdoc-openapi로 대체하였음.
왜?
- Spring fox boot starter 자체가 관리되지 않는 프로젝트임.
- 2020년 10월 이후로 업데이트 되지 않음.
- 초기 도입 시, 아무런 생각 없이 도입했는데 후회가 됬음 ㅠ.
- 복잡한 설정에 있어서는 부실했음 (자료 부족).
- Jakarta EE를 지원하지 않음
- 즉, Spring boot 3.0에서는 빌드가 불가능함. 아예 지원이 불가함.
- 이에 springdoc-openai로 대체했음.
- 대체하는 과정은 매우 간단했음. 일단, Swagger를 엄청 복잡하게 구성해놓고 사용하지도 않았고, Controller에서 의존하고 있는 것은
io.swagger
패키지였기에 변경할 사항이 없었음.
- 대체하는 과정은 매우 간단했음. 일단, Swagger를 엄청 복잡하게 구성해놓고 사용하지도 않았고, Controller에서 의존하고 있는 것은
# 2023-01-15 추가
- Reverse proxy랑 함께 사용할 때, 이슈가 있었음
- @PathVariable, @RequestParam 사용 시, 변수명을 읽어오지 못하는 이슈가 있었음. 이를 해결하기 위해서는 annotation에 상세한 value (or name)을 설정해야 함.
jjwt를 jjwt-api, jjwt-impl, jjwt-jackson으로 대체
before
implementation 'io.jsonwebtoken:jjwt:0.9.1'
after
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
왜?
- 이전 팀원 분이 추가뒀던 jjwt 의존성을 그대로 사용하고 있었는데, 이것도 마찬가지로 javax에서 jakarta로 넘어가며 사용이 불가능해짐.
- 확인해보니 최근에는 jjwt 패키지가 아닌 3개의(api, impl, jackson) 패키지로 나뉘어 지원되고 있었음 (jjwt README)
- 버전을 올리면서 변경사항이 꽤나 많았음. 이에 따라 변경사항들을 적용.
- 번외로 secretKey도 이전 팀원 분이 설정해주셨던 것을 그대로 사용하고 있었는데, 버전을 업데이트 하니 보안이 약하다고 boot 시작 시 오류 반환 (시작이 안됨 ㅠ).
- 이에 따라 secret key를 보안 수준에 맞게 수정.
그대로 사용하고 있던 내가 안일했음.
- 이에 따라 secret key를 보안 수준에 맞게 수정.
Spring security 6.0 사용
Spring boot 3.0은 Spring security 6.0을 사용 (의존). 이에 따라 변경이 필요함.
변경사항이 꽤 많겠지만, 일단 사이드 프로젝트에 대한 변경사항만 적어두었음 (1개 밖에 없음 😂).
- 모든 변경사항에 대해서는 Spring security migration guide 참조.
authorizeRequests().antMatchers()
변경
- Spring security 6에서는
authorizeHttpRequests
,requestMatchers
를 이용
// before
http.authorizeRequests()
.antMatchers("/actuator/**").permitAll()
.antMatchers(HttpMethod.GET, "/exception/**").permitAll()
.anyRequest().authenticated().and()
// after
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/**").permitAll()
.requestMatchers(HttpMethod.GET, "/exception/**").permitAll()
.anyRequest().authenticated())
- web ignoring에 대해서도 마찬가지로
antMatchers
가requestMatchers
로 변경되었음.
// before
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring().antMatchers("/h2-console/**");
}
// after
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return web -> web.ignoring().requestMatchers("/h2-console/**");
}
이상 끝 !
'Development > Java, Kotlin, Frameworks' 카테고리의 다른 글
Spring boot - API Versioning (0) | 2023.04.16 |
---|---|
[springdoc-openapi / Swagger] Failed to load remote configuration 이슈 해결 (1) | 2023.01.11 |
Spring boot, JPA 환경에서의 더 좋은 쿼리 로깅 하기 (0) | 2022.11.21 |
DAO, DTO, PO, SO, BO, VO (2) | 2022.11.11 |
R2DBC를 사용해보자 (3) - Join (Many-To-One, One-To-One, One-To-Many) (0) | 2022.08.15 |
- Total
- Today
- Yesterday
- 일상
- docker
- Intellij
- WebFlux
- Log
- HTTP
- 쿠버네티스
- Spring
- 알고리즘
- Spring boot
- MySQL
- tag
- gradle
- python
- Clean Architecture
- container
- Algorithm
- jasync
- k8s
- 하루
- boj
- 클린 아키텍처
- Istio
- hexagonal architecture
- c++
- 로그
- 백준
- java
- 비동기
- Kubernetes
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |