Spring Framework 6.2 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

2025. 2. 27. 01:40ยทFramework/spring

Spring Framework 6.2 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ ๋ฐ ๊ด€๋ จ ๊ธฐ์ˆ  ๋™ํ–ฅ ์ข…ํ•ฉ ๋ถ„์„

Spring Framework 6.2๋Š” 2024๋…„ 11์›” 14์ผ ์ •์‹ ์ถœ์‹œ๋œ ์ฃผ์š” ๋ฒ„์ „์œผ๋กœ, ๊ธฐ์กด 6.1 ๋Œ€๋น„ 49๊ฐœ ์ด์ƒ์˜ ๊ฐœ์„ ์‚ฌํ•ญ๊ณผ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ ๋ณด๊ณ ์„œ๋Š” ๊ณต์‹ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์™€ VMware Tanzu์˜ ์ƒ์šฉ ์—…๊ทธ๋ ˆ์ด๋“œ ๊ฐ€์ด๋“œ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ธฐ์ˆ ์  ๋ณ€ํ™”๋ฅผ ์‹ฌ์ธต ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค.


ํ•ต์‹ฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐœ์„  ์‚ฌํ•ญ

1. ์ž๋™ ์ฃผ์ž… ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐœ์„ 

6.2 ๋ฒ„์ „์—์„œ๋Š” @Qualifier ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„ ๋งค์นญ์ด @Priority๋ณด๋‹ค ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ฐ–๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค[1][2]. ์ด๋Š” ํŠน์ • ๋นˆ์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ๋•Œ ๋” ์ง๊ด€์ ์ธ ๋™์ž‘์„ ๋ณด์žฅํ•˜๋ฉฐ, ์ฃผ์ž… ๋Œ€์ƒ ํ›„๋ณด ๊ฐ„ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ž…๋‹ˆ๋‹ค.

@Configuration
public class AppConfig {
    @Bean
    @Qualifier("primaryService")
    MyService primaryService() { ... }

    @Bean
    @Priority(1)
    MyService secondaryService() { ... }
}

์œ„ ๊ตฌ์„ฑ์—์„œ @Qualifier๊ฐ€ ์ง€์ •๋œ ๋นˆ์ด ์šฐ์„  ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณ€๊ฒฝ์€ ํŠนํžˆ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์˜์กด์„ฑ ์ฃผ์ž… ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

2. ํด๋ฐฑ ๋นˆ ์ง€์›

@Fallback ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž ์ •์˜ ๋นˆ์ด ์กด์žฌํ•  ๋•Œ ์ž๋™ ์ „ํ™˜๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•˜๋ฉด์„œ๋„ ์‚ฌ์šฉ์ž ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

@Configuration
class SecurityConfig {
    @Bean
    @Fallback
    fun defaultAuthProvider() = DefaultAuthProvider()
}

์ด ๊ตฌ์„ฑ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ AuthProvider ํƒ€์ž…์˜ ๋นˆ์„ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด defaultAuthProvider๊ฐ€ ์‚ฌ์šฉ๋˜๋ฉฐ, ์ •์˜๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ๋นˆ์ด ์ž๋™ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.


์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง„ํ™”

3. URL ํŒŒ์„œ ๋ณด์•ˆ ๊ฐ•ํ™”

์ตœ๊ทผ ๋ณด์•ˆ ์ทจ์•ฝ์  ๋Œ€์‘์„ ์œ„ํ•ด RFC 3986 ํ‘œ์ค€๊ณผ Living URL ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด URL ํŒŒ์„œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค[2][6]. ๊ฐœ๋ฐœ์ž๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ ์—„๊ฒฉํ•œ ๊ฒ€์ฆ ๋˜๋Š” ์œ ์—ฐํ•œ ์ฒ˜๋ฆฌ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// RFC 3986 ์ค€์ˆ˜ ์—„๊ฒฉ ๋ชจ๋“œ
UriComponents strictUri = UriComponentsBuilder.fromUriString(input, ParserType.RFC).build();

// Living URL ์œ ์—ฐ ๋ชจ๋“œ 
UriComponents lenientUri = UriComponentsBuilder.fromUriString(input, ParserType.WHAT_WG).build();

4. ์ปจํ…์ธ  ํ˜‘์ƒ ๊ธฐ๋ฐ˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

@ExceptionHandler๊ฐ€ ํ”„๋กœ๋“€์Šค ํƒ€์ž…๋ณ„๋กœ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•ด์ ธ ํด๋ผ์ด์–ธํŠธ ์œ ํ˜•์— ๋งž๋Š” ์˜ค๋ฅ˜ ์‘๋‹ต ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค[2][10]. ์ด๋Š” API ํด๋ผ์ด์–ธํŠธ์™€ ๋ธŒ๋ผ์šฐ์ € ์ ‘๊ทผ์„ ๋™์‹œ์— ์ง€์›ํ•˜๋Š” ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์— ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@ExceptionHandler(produces = [MediaType.APPLICATION_JSON_VALUE])
fun handleApiException(ex: IllegalArgumentException) = 
    ResponseEntity.badRequest().body(ApiError(ex.message))

@ExceptionHandler(produces = [MediaType.TEXT_HTML_VALUE])
fun handleWebException(ex: IllegalArgumentException, model: Model): String {
    model.addAttribute("error", ex.message)
    return "errorPage"
}

ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ ํ˜์‹ 

5. AssertJ ํ†ตํ•ฉ ๊ฐ•ํ™”

Hamcrest ๋Œ€์‹  AssertJ๋ฅผ ํ™œ์šฉํ•œ MockMvc ํ…Œ์ŠคํŠธ ์ง€์›์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋ฃจ์–ธํŠธ API๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

val mvc = MvcTester.from(webAppContext)
assertThat(mvc.perform(get("/api/data")))
    .hasStatusOk()
    .body().json()
    .isEqualToIgnoringWhitespace(expectedJson)

6. ๋™์  ์†์„ฑ ๋“ฑ๋ก ๊ฐœ์„ 

ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ DynamicPropertyRegistrar ๋นˆ์„ ํ†ตํ•ด ๋™์  ์†์„ฑ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์™ธ๋ถ€ ์„œ๋น„์Šค(DB, ์บ์‹œ ๋“ฑ)์˜ ๋™์  ๊ตฌ์„ฑ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

@Bean
public DynamicPropertyRegistrar dbProperties() {
    return registry -> {
        registry.add("db.url", () -> testContainer.getJdbcUrl());
        registry.add("db.user", testContainer::getUsername);
    };
}

๋„ค์ดํ‹ฐ๋ธŒ ์ปดํŒŒ์ผ ์ง€์› ๊ฐ•ํ™”

7. ๋ฆฌํ”Œ๋ ‰์…˜ ํžŒํŠธ ์ž๋™ํ™”

@RegisterReflection๊ณผ @ReflectionScan ์–ด๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ์‹œ ํ•„์š”ํ•œ ๋ฆฌํ”Œ๋ ‰์…˜ ์„ค์ •์„ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค[2][10]. ์ด๋Š” ํŠนํžˆ ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

@RegisterReflection(targets = [ThirdPartyDTO::class])
@Configuration
class NativeConfig

ํ˜ธํ™˜์„ฑ ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ ์ „๋žต

8. ์ฃผ์š” API ๋ณ€๊ฒฝ ์‚ฌํ•ญ

  • Base64Utils ํ๊ธฐ: java.util.Base64๋กœ ์ „ํ™˜ ํ•„์š”
  • WebJars ๋ฆฌ์†Œ์Šค ๋ฆฌ์กธ๋ฒ„: webjars-locator-lite๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ถŒ์žฅ
  • HTTP ํ—ค๋” ์ฒ˜๋ฆฌ: HttpHeaders ์ƒ์„ฑ ๋ฐฉ์‹ ๋ณ€๊ฒฝ
// ๋ณ€๊ฒฝ ์ „
HttpHeaders headers = HttpHeaders.writableHttpHeaders(existing);

// ๋ณ€๊ฒฝ ํ›„
HttpHeaders headers = new HttpHeaders(existing);

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

  1. ์˜์กด์„ฑ ๋ฒ„์ „ ๊ฒ€์ฆ: Protobuf 4.x, Jackson 2.18+ ํ•„์ˆ˜
  2. ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€ ๋นŒ๋“œ: Hibernate 6.5 ์ด์ƒ ์‚ฌ์šฉ
  3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ ๊ฒ€: HtmlUnit 4.2๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  4. ๋ณด์•ˆ ์„ค์ • ๊ฒ€ํ† : ์ƒˆ๋กœ์šด URL ํŒŒ์„œ ์ ์šฉ ์—ฌ๋ถ€ ๊ฒฐ์ •

์„ฑ๋Šฅ ์ตœ์ ํ™” ์‚ฌํ•ญ

10. ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋นˆ ์ดˆ๊ธฐํ™”

๊ณ ๋น„์šฉ ๋นˆ ์ดˆ๊ธฐํ™”๋ฅผ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” bootstrap = BACKGROUND ์˜ต์…˜์ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๋Š” ๋ฐ ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

@Bean(bootstrap = BootstrapMode.BACKGROUND)
fun heavyResourceLoader() = HeavyResourceLoader()

11. ์Šค์ผ€์ค„๋ง ์„ฑ๋Šฅ ๊ฐœ์„ 

TaskDecorator๊ฐ€ ์Šค์ผ€์ค„๋ง ์ž‘์—…์—๋„ ์ ์šฉ๋˜์–ด ์Šค๋ ˆ๋“œ ์ปจํ…์ŠคํŠธ ์ „ํŒŒ๊ฐ€ ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ถ„์‚ฐ ํŠธ๋ ˆ์ด์‹ฑ ํ™˜๊ฒฝ์—์„œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@Bean
TaskDecorator mdcTaskDecorator() {
    return runnable -> {
        Map context = MDC.getCopyOfContextMap();
        return () -> {
            MDC.setContextMap(context);
            runnable.run();
        };
    };
}

๋ฏธ๋ž˜ ์ง€ํ–ฅ์  ์•„ํ‚คํ…์ฒ˜ ์ง€์›

12. ๋ชจ๋˜ ์›น ๊ธฐ์ˆ  ํ†ตํ•ฉ

htmx ๋ฐ Hotwired Turbo์™€ ๊ฐ™์€ ์ตœ์‹  ์›น ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ๋ทฐ ํ”„๋ž˜๊ทธ๋จผํŠธ ๋ Œ๋”๋ง์ด ๊ตฌํ˜„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ ์ง„์  ํ–ฅ์ƒ(Progressive Enhancement) ์ „๋žต ๊ตฌํ˜„์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

<!-- htmx ์กฐ๊ฐ ์—…๋ฐ์ดํŠธ ์˜ˆ์‹œ -->
<div hx-get="/partials/header" hx-trigger="load">
  <!-- ๋™์  ์ฝ˜ํ…์ธ  ๋กœ๋“œ -->
</div>

13. ์„œ๋ฒ„๋ฆฌ์Šค ์ค€๋น„๋„ ๊ฐ•ํ™”

์ง€์†์‹œ๊ฐ„ ํฌ๋งท(DurationFormat)์ด ๋‹จ์ˆœํ™”๋˜์–ด @Scheduled์—์„œ "2h30m"๊ณผ ๊ฐ™์€ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋™์  ์Šค์ผ€์ค„๋ง ๊ตฌ์„ฑ์— ์œ ์—ฐ์„ฑ์„ ๋”ํ•ฉ๋‹ˆ๋‹ค.

@Scheduled(fixedDelayString = "2h30m")
fun runBatchJob() { ... }

๋ณด์•ˆ ๊ฐ•ํ™” ์กฐ์น˜

14. ์ฟ ํ‚ค ๋ถ„ํ•  ์ •์ฑ…(CHIPS)

Third-party ์ฟ ํ‚ค ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด Partitioned ์ฟ ํ‚ค ์ง€์›์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํฌ๋กœ์Šค ์‚ฌ์ดํŠธ ํŠธ๋ž˜ํ‚น ๋ฐฉ์ง€ ์ •์ฑ…์— ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜์ž…๋‹ˆ๋‹ค.

ResponseCookie cookie = ResponseCookie.from("sessionId", "1234")
    .partitioned(true)
    .build();

15. ํ—ค๋” ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ

@ModelAttribute๊ฐ€ HTTP ํ—ค๋” ๊ฐ’์„ ์ง์ ‘ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๋ณด์•ˆ ๊ด€๋ จ ํ—ค๋” ์ฒ˜๋ฆฌ ์šฉ์ด์„ฑ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@PostMapping
fun create(@ModelAttribute dto: RequestDto) { ... }

๊ฒฐ๋ก  ๋ฐ ์ „๋žต์  ๊ถŒ๊ณ 

Spring Framework 6.2๋Š” ํ˜„๋Œ€์  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๋‹ค์Œ ์„ธ๋Œ€ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์š” ์—…๊ทธ๋ ˆ์ด๋“œ ์ „๋žต์„ ์ˆ˜๋ฆฝํ•  ๋•Œ ๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  1. ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ณ„ํš: Deprecated API ์‚ฌ์šฉ ํ˜„ํ™ฉ ๋ถ„์„ ํ›„ ๋‹จ๊ณ„์  ๊ต์ฒด
  2. ๋ณด์•ˆ ๊ตฌ์„ฑ ์žฌ๊ฒ€์ฆ: ์ƒˆ๋กœ์šด URL ํŒŒ์„œ ๋ฐ ์ฟ ํ‚ค ์ •์ฑ… ์ ์šฉ ์—ฌ๋ถ€ ๊ฒฐ์ •
  3. ๋ชจ๋‹ˆํ„ฐ๋ง ์ฒด๊ณ„ ๊ฐ•ํ™”: ๊ฐœ์„ ๋œ ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์ง„๋‹จ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
  4. ๋„ค์ดํ‹ฐ๋ธŒ ์ด๋ฏธ์ง€ ํ…Œ์ŠคํŠธ: AOT ์ฒ˜๋ฆฌ ์‹œ ๋ฆฌํ”Œ๋ ‰์…˜ ํžŒํŠธ ๋“ฑ๋ก ํ”„๋กœ์„ธ์Šค ๊ฒ€์ฆ
  5. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ฐœ์„ : AssertJ ๊ธฐ๋ฐ˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋กœ ์ „ํ™˜ ๋ฐ ๋ณ‘๋ ฌ ์‹คํ–‰ ์ตœ์ ํ™”

ํ–ฅํ›„ Spring Framework 6.3์—์„œ๋Š” Project Loom์˜ ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ์™€์˜ ํ†ตํ•ฉ ์‹ฌํ™”, ๋” ๋‚˜์€ ์„œ๋ฒ„๋ฆฌ์Šค ์ง€์›์ด ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•ด ๊ธฐ์ˆ  ๋กœ๋“œ๋งต์„ ์„ ์ œ์ ์œผ๋กœ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'Framework/spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • spring framework 6.2๋Š” spring boot ์–ด๋–ค ๋ฒ„์ „๋ถ€ํ„ฐ ์ ์šฉ๋˜๋Š”๊ฐ€?
  • Spring Boot 3.4 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ
  • Spring One 2023 ์„ธ์…˜ ๋ชจ์Œ
  • [spring boot] ์Šคํ”„๋ง๋ถ€ํŠธ 3.1.0 M2 ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, IT ๋ธ”๋กœ๊ทธ๐Ÿงž
  • ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
    ์š”์ˆ  ๋žจํ”„๐Ÿซ–
    ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (549)
      • Languages (57)
        • JAVA (13)
        • JSP (1)
        • C_C++ (4)
        • Html (3)
        • CSS (1)
        • JavaScript (18)
        • Python (3)
        • Kotlin (13)
        • TypeScript (1)
      • Framework (14)
        • spring (11)
        • jstl (1)
        • angular (2)
      • Tool (28)
        • Eclipse (5)
        • vsCode (3)
        • scrcpy (2)
        • Git (1)
        • IntelliJ (6)
        • Visual-studio (1)
        • UML (1)
        • Gradle (8)
      • DB (6)
        • Oracle (1)
        • MySql (3)
        • Mongo (2)
      • OS (14)
        • Linux (2)
        • Windows (12)
      • Server (8)
        • Tomcat (1)
        • Apache (1)
        • Node.js (6)
      • Programmings (25)
        • Design Pattern (2)
        • Funny (20)
        • Algorithms (3)
      • Cloud (8)
        • Docker (1)
        • Kubernetes (4)
        • Istio (1)
        • ArgoCD (2)
      • IT (5)
        • gRPC (3)
        • RESTful (3)
        • Web UI (5)
        • AI (4)
      • Book (6)
      • TIP (187)
      • Life (53)
      • Game (83)
      • Storage (22)
      • ์‹๋‹น (15)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ์‚ฌ์ดํŠธ๋งต
    • RSS
    • ๊ธฐํƒ€ ์†Œ๋“
  • ๋งํฌ

    • ๊ตฌ๊ธ€
    • ๋„ค์ด๋ฒ„
    • ์ •๋ถ€24
    • Spring Framework ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • Kotlin ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • ์นด์นด์˜ค ์• ๋“œํ•
    • ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋งต
    • ๋ธ”๋กœ๊ทธ RSS
  • ๊ณต์ง€์‚ฌํ•ญ

    • ์•ˆ๋…•ํ•˜์„ธ์š”
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ๋ธŒ๋ฆฌํ•‘
    ๋ฐ์ผ๋ฆฌ ๋‰ด์Šค
    ์˜ค๋Š˜์˜๋‰ด์Šค
    ํƒœ๊ตญ
    ํ•œ๋ˆˆ์— ๋ณด๋Š” ์˜ค๋Š˜์˜ ๋‰ด์Šค
    ํ€˜์ŠคํŠธ
    ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ์™€์ผ์ฆˆ
    ๋‰ด์Šค
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ๋‚˜์šฐ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
Spring Framework 6.2 ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”