티스토리 뷰

사이드 프로젝트를 Spring boot 3.0으로 migration 하면서 정리한 글. 아주 러프하게 정리했다.

- 다음에 Spring boot migration 3.0 문서를 번역해야겠다는 생각이 ...


 

javax package name 변경

javaxjakarta

  • 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

MySQL5InnoDBDialectMySQL5Dialect 로 변경되었음.

 

 

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 패키지였기에 변경할 사항이 없었음.

 

# 2023-01-15  추가

- Reverse proxy랑 함께 사용할 때, 이슈가 있었음

 

[springdoc-openapi / Swagger] Failed to load remote configuration 이슈 해결

개요 / 문제 기존에 Spring fox를 사용하다가 deprecated 되어 springdoc openapi를 도입하게 되었습니다. Swggger 인터페이스는 두 라이브러리 다 맞추고 있었기에 의존성 교체와 몇가지 수정만으로도 대체

binux.tistory.com

 

- @PathVariable, @RequestParam 사용 시, 변수명을 읽어오지 못하는 이슈가 있었음. 이를 해결하기 위해서는 annotation에 상세한 value (or name)을 설정해야 함.

 

Path variable mapped improperly in swagger-ui · Issue #2028 · springdoc/springdoc-openapi

Describe the bug I have simple controller in Kotlin @Operation(summary = "Get company details", description = "Get company details") fun getCompanyDetails(@PathVariable companyI...

github.com

 

feat: extract docs responsibility to Docs interfaces using springdoc-openapi by KimDoubleB · Pull Request #50 · Team-Archive/A

springdoc-openapi를 이용해 Swagger (API document)를 위한 Controller interface 생성 API Document에 대한 책임 분리 Controller 코드 간결화, 가독성 향상, 하나의 목적 API First design이 가능하지 않으려나

github.com

 

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를 보안 수준에 맞게 수정. 그대로 사용하고 있던 내가 안일했음.

 

 

Spring security 6.0 사용

Spring boot 3.0은 Spring security 6.0을 사용 (의존). 이에 따라 변경이 필요함.

변경사항이 꽤 많겠지만, 일단 사이드 프로젝트에 대한 변경사항만 적어두었음 (1개 밖에 없음 😂).

 

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에 대해서도 마찬가지로 antMatchersrequestMatchers 로 변경되었음.
// before
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return web -> web.ignoring().antMatchers("/h2-console/**");
}

// after
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
    return web -> web.ignoring().requestMatchers("/h2-console/**");
}

 


이상 끝 !

320x100
반응형
댓글
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함