๐Ÿš€ ๋ ˆ๊ฑฐ์‹œ Java 8 + Spring Boot 2.1 ํ”„๋กœ์ ํŠธ๋ฅผ Java 17์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ธฐ (๋ชจ๋“  ๊ฒƒ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฉด์„œ)

๋ฐœํ–‰: (2025๋…„ 12์›” 11์ผ ์˜คํ›„ 12:21 GMT+9)
4 min read
์›๋ฌธ: Dev.to

Source: Dev.to

ํ˜œํƒ

  • 2029๋…„๊นŒ์ง€ LTS โ€“ ์žฅ๊ธฐ ์ง€์› ๋ฐ ๋ณด์•ˆ ์—…๋ฐ์ดํŠธ
  • 40โ€“60โ€ฏ% ๋น ๋ฅธ JVM โ€“ ํ–ฅ์ƒ๋œ GC(G1/ZGC), ๋น ๋ฅธ ์‹คํ–‰ ์†๋„
  • ํ˜„๋Œ€์ ์ธ ์–ธ์–ด ๊ธฐ๋Šฅ โ€“ var, ๋ ˆ์ฝ”๋“œ, sealed ํด๋ž˜์Šค, switch ํ‘œํ˜„์‹
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ๊ฐœ์„  โ€“ ํž™ ํ’‹ํ”„๋ฆฐํŠธ ๊ฐ์†Œ
  • ๋ณด์•ˆ ๊ฐ•ํ™” โ€“ ๊ฐ•๋ ฅํ•œ TLS, ์•”ํ˜ธํ™”, JVM ๊ทœ์น™

์—…๊ทธ๋ ˆ์ด๋“œ ๊ฒฝ๋กœ

๋‹จ๊ณ„์ด์ „ โ†’ ์ดํ›„
1Javaโ€ฏ8 โ†’ Javaโ€ฏ11
2Springโ€ฏBootโ€ฏ2.1 โ†’ 2.7
3Javaโ€ฏ11 โ†’ Javaโ€ฏ17
4Springโ€ฏBootโ€ฏ2.7 โ†’ 3.x (Jakarta)

pom.xml ๋ณ€๊ฒฝ ์‚ฌํ•ญ

Java ๋ฒ„์ „์„ 11๋กœ ์„ค์ • (๋‹จ๊ณ„โ€ฏ1)

    11

๋ˆ„๋ฝ๋œ Javaโ€ฏEE ๋ชจ๋“ˆ ์ถ”๊ฐ€ (Javaโ€ฏ11)

    javax.xml.bind
    jaxb-api
    2.3.1

Springโ€ฏBoot ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ (๋‹จ๊ณ„โ€ฏ2)

    org.springframework.boot
    spring-boot-starter-parent
    2.7.18

Java ๋ฒ„์ „์„ 17๋กœ ์„ค์ • (๋‹จ๊ณ„โ€ฏ3)

    17

Springโ€ฏBootโ€ฏ3.x๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ (๋‹จ๊ณ„โ€ฏ4)

    org.springframework.boot
    spring-boot-starter-parent
    3.3.4

Springโ€ฏBootโ€ฏ3 ์ด์ „ ์กฐ์ • ์‚ฌํ•ญ

  • Springfox๋ฅผ springdocโ€‘openapi๋กœ ๊ต์ฒด
  • @ConfigurationProperties์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ƒ์„ฑ์ž ๋ฐ”์ธ๋”ฉ ์Šคํƒ€์ผ ์ ์šฉ
  • ์‚ฌ์šฉ ์ค‘๋‹จ๋œ Spring Security ์„ค์ • ์ •๋ฆฌ
  • (์„ ํƒ) RestTemplate โ†’ WebClient ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ์ž‘

springdocโ€‘openapi ์˜์กด์„ฑ ์ถ”๊ฐ€

    org.springdoc
    springdoc-openapi-starter-webmvc-ui
    2.6.0

์ผ๋ฐ˜์ ์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ๋ฆฌํ”Œ๋ ‰์…˜ ๊ฒฝ๊ณ  โ€“ ์ž„์‹œ๋กœ --add-opens JVM ์˜ต์…˜ ์ถ”๊ฐ€
  • ๋ ˆ๊ฑฐ์‹œ HTTP ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ตœ์‹  ๋Œ€์•ˆ(WebClient ๋“ฑ)์œผ๋กœ ๊ต์ฒด
  • ๋ชจ๋“  ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ Javaโ€ฏ17์„ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธ

ํŒจํ‚ค์ง€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์˜ˆ์‹œ (Jakarta)

// Before (Springโ€ฏBootโ€ฏ2.x)
import javax.servlet.http.HttpServletRequest;

// After (Springโ€ฏBootโ€ฏ3.x)
import jakarta.servlet.http.HttpServletRequest;

๋‚จ์•„ ์žˆ๋Š” javax ์ž„ํฌํŠธ๋ฅผ ์ฐพ์œผ๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰:

grep -R "javax" src/

Spring Security API ๋ณ€๊ฒฝ

// Old (Spring Security 5.x)
http.authorizeRequests().anyRequest().authenticated();

// New (Spring Security 6.x)
http.authorizeHttpRequests(auth -> auth
    .requestMatchers("/api/**").authenticated()
);

JPA ํŒจํ‚ค์ง€ ์ด๋ฆ„ ๋ณ€๊ฒฝ

javax.persistence
jakarta.persistence

CI ์„ค์ • (GitHub Actions)

- name: Setup JDK
  uses: actions/setup-java@v3
  with:
    distribution: 'temurin'
    java-version: '17'

๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•œ ์ผ๋ฐ˜์ ์ธ ์ปดํฌ๋„ŒํŠธ

  • ์ปจํŠธ๋กค๋Ÿฌ
  • WebClient / Feign ํด๋ผ์ด์–ธํŠธ
  • Kafka / RabbitMQ ์—ฐ๋™
  • Flyway / Liquibase ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์›Œํฌํ”Œ๋กœ

ํ”ํžˆ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์˜ค๋ฅ˜ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
ClassNotFoundException: javax.*์ž„ํฌํŠธ๋ฅผ jakarta.*๋กœ ๊ต์ฒด
Spring Security๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ์ƒˆ๋กœ์šด DSL์— ๋งž๊ฒŒ ๋ณด์•ˆ ์„ค์ •์„ ์žฌ์ž‘์„ฑ
Swagger UI ๋กœ๋“œ ์‹คํŒจSpringfox์—์„œ springdocโ€‘openapi๋กœ ์ „ํ™˜
์‹œ์ž‘ ์‹œ ๋ฆฌํ”Œ๋ ‰์…˜ ๊ฒฝ๊ณ --add-opens ํ”Œ๋ž˜๊ทธ ์ถ”๊ฐ€ ๋˜๋Š” ๋ฌธ์ œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—…๊ทธ๋ ˆ์ด๋“œ

์—…๊ทธ๋ ˆ์ด๋“œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • Javaโ€ฏ8 โ†’ 11
  • ์ œ๊ฑฐ๋œ Java EE ๋ชจ๋“ˆ ๋ณต๊ตฌ
  • Javaโ€ฏ11 โ†’ 17
  • CI ํŒŒ์ดํ”„๋ผ์ธ์„ JDKโ€ฏ17 ์‚ฌ์šฉํ•˜๋„๋ก ์—…๋ฐ์ดํŠธ
  • Springโ€ฏBootโ€ฏ2.1 โ†’ 2.7 ์—…๊ทธ๋ ˆ์ด๋“œ
  • ์‚ฌ์šฉ ์ค‘๋‹จ๋œ Spring API ์ œ๊ฑฐ
  • Springโ€ฏBootโ€ฏ2.7 โ†’ 3.x ์—…๊ทธ๋ ˆ์ด๋“œ
  • javax.* ํŒจํ‚ค์ง€๋ฅผ jakarta.*๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • Spring Security ์„ค์ • ์—…๋ฐ์ดํŠธ
  • Springfox๋ฅผ springdocโ€‘openapi๋กœ ๊ต์ฒด
  • Hibernate / JPA ์˜์กด์„ฑ ์—…๋ฐ์ดํŠธ
  • ์ „์ฒด ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์‹คํ–‰

์ด๋Ÿฌํ•œ ๋‹จ๊ณ„์  ์ ‘๊ทผ ๋ฐฉ์‹โ€”๋จผ์ € Javaโ€ฏ8 โ†’ 11๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ , ์‚ฌ์šฉ ์ค‘๋‹จ๋œ API๋ฅผ ์กฐ๊ธฐ์— ์ˆ˜์ •ํ•œ ๋’ค ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธํ•˜๋ฉดโ€”Javaโ€ฏ17 ๋ฐ Springโ€ฏBootโ€ฏ3.x๋กœ์˜ ์ „ํ™˜์„ ์›ํ™œํ•˜๊ณ  ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜๋ฉด์„œ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Back to Blog

๊ด€๋ จ ๊ธ€

๋” ๋ณด๊ธฐ ยป

Spring WebClient vs. RestTemplate: 2025๋…„์— ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

๋งŒ์•ฝ ์—ฌ๋Ÿฌ๋ถ„์ด ๋ช‡ ๋…„ ์ด์ƒ Spring ์ƒํƒœ๊ณ„์— ์žˆ์—ˆ๋˜ ์‚ฌ๋žŒ์ด๋ผ๋ฉด, RestTemplate์€ ์˜ค๋ž˜๋œ ์นœ๊ตฌ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ต์ˆ™ํ•˜๊ณ , ๋™๊ธฐ์‹์ด๋ฉฐ, ์†”์งํžˆ ๋งํ•ด์„œโ€ฆ

๊ณต๊ฐœ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ Maven ์˜์กด์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์†Œ๊ฐœ Apache Maven์€ ๋Œ€๋ถ€๋ถ„์˜ Java ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ์ด๋ฉฐ, GitHub Packages๋Š” Maven ์•„ํ‹ฐํŒฉํŠธ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Even whe...

Spring Boot๋ฅผ ์‚ฌ์šฉํ•œ RESTful Web API ๊ตฌํ˜„

REST API๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ๋ชจ๋“  ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ€์žฅ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Spring Boot๋Š” productionโ€‘ready ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์ด๋ฅผ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

React์™€ Spring Boot๋ฅผ ์‚ฌ์šฉํ•œ ํ’€์Šคํƒ Pokรฉdex ๊ฒ€์ƒ‰ ์—”์ง„ ๊ตฌ์ถ•

์†Œ๊ฐœ ๋‚˜๋Š” ์ตœ๊ทผ์— API ํ†ตํ•ฉ ๋ฐ ํ’€์Šคํƒ ๊ฐœ๋ฐœ์„ ์—ฐ์Šตํ•˜๊ธฐ ์œ„ํ•ด ํ’€์Šคํƒ Pokรฉdex ๊ฒ€์ƒ‰ ์—”์ง„์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค...