๐ Java 25 & STS 5.1.0 ์ ๊ทธ๋ ์ด๋: ์ฐจ์ธ๋ ์คํ๋ง ๋ถํธ ํ๊ฒฝ ๊ตฌ์ถ๊ธฐ
Last Updated: 2026๋ 03์ 17์ผ
๊ธฐ์กด sts-4.27.0์์ ์ต์ sts-5.1.0์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ฉฐ, Java 25(Early Access/Modern JDK) ๊ธฐ๋ฐ์ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ธํ ํ ๊ณผ์ ์ ๊ธฐ๋กํฉ๋๋ค. ๋ค๋ฅธ ์ถ๊ฐ์ฌํญ์ ์๊ฐ๋๋ฉด…
0. ์์คํ ํ๊ฒฝ ๋ณ์ ์ ๊ฒ
๊ฐ์ฅ ๋จผ์ OS ๋ ๋ฒจ์ ํ๊ฒฝ ๋ณ์๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋์ด ์๋์ง ํ์ธํฉ๋๋ค. (Java 25 ์ฌ์ฉ์ ์ํด JAVA_HOME ๊ฒฝ๋ก๋ ์ํฉ์ ๋ฐ๋ผ ์
๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค.)
- JAVA_HOME:
D:\Java\jdk-21.0.6(์ถํ 25 ์ ์ ์ ์ฉ ์ ๋ณ๊ฒฝ) - GRADLE_HOME:
D:\Java\gradle_home - MYSQL_HOME:
D:\Java\MariaDB 11.7 - Path:
%JAVA_HOME%\bin,%GRADLE_HOME%\bin,%NODE_HOME%๋ฑ
1. ๊ธฐ์กด ๊ฐ๋ฐ ํ๊ฒฝ ๊ธฐ๋ก (Pre-check)
์
๊ทธ๋ ์ด๋ ์ , ๊ธฐ์กด IDE(Preferences)์ ์ฃผ์ ์ค์ ๊ฐ์ ๋ฉ๋ชจํด๋ก๋๋ค.
- Gradle: Local Installation (
D:\Java\gradle_home) - Java: Compiler compliance level (
21) - JREs: Installed JREs ํ์ธ
2. ์ ๋ฒ์ ๋ค์ด๋ก๋ ๋ฐ ์ค์น
Spring ๊ณต์ ์ฌ์ดํธ์์ ์ต์ ๋ฒ์ ์ ๋ค์ด๋ก๋ํฉ๋๋ค.
- ๋ค์ด๋ก๋: spring.io/tools#eclipse
- ๋ณ๊ฒฝ ์ฌํญ:
sts-4.27.0.RELEASEโsts-5.1.0.RELEASE
3. ์ํฌ์คํ์ด์ค(Workspace) ์ด๊ธฐํ
๊ธฐ์กด ์ํฌ์คํ์ด์ค์์ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด ํด๋๋ช ์ ๋ณ๊ฒฝํ๊ณ ์๋ก ์์ฑํฉ๋๋ค.
- ๊ธฐ์กด:
workspaceโworkspace_260317(๋ฐฑ์ ) - ์ ๊ท:
workspaceํด๋ ์์ฑ - ์ฐธ๊ณ : ๊ธฐ์กด workspace ํด๋๋ ๊ทธ๋๋ก ๋๊ณ workspace_sts-5.1.0 ์ผ๋ก ํด๋ ๋จ.
4. ์ ๊ท ํ๋ก์ ํธ ์์ฑ (New Spring Starter Project)
STS 5.1.0์ ์คํํ๊ณ Java 25 ๊ธฐ๋ฐ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
- Type: Gradle – Groovy
- Java Version: 25 (Project Loom ๊ฐ์ ์ค๋ ๋ ํ์ฉ ๊ฐ๋ฅ)
- Artifact/Group:
demo/kr.narrator - Dependencies: Web, JPA, MariaDB, Lombok, Validation, Thymeleaf ๋ฑ
5. IDE ๊ฐ์ธ ์ค์ (UI/UX)
๊ฐ์ฅ ๋จผ์ ๋์ ํธ์ํจ์ ์ํด ํฐํธ๋ฅผ ์ค์ ํฉ๋๋ค.
General>Appearance>Colors and Fonts>Basic>Text Font
6. ํ๋ก์ ํธ ์ค์ ์ต์ ํ (ํต์ฌ ํฌ์ธํธ!)
์ต์ ๋ฒ์ ๊ณผ Java 25์ ์ต์ ํ๋ ์ค์ ์์ ์ ์งํํฉ๋๋ค.
๐ .env ํ์ผ ์์ฑ
๋ณด์ ๋ฐ ํ๊ฒฝ ๊ด๋ฆฌ๋ฅผ ์ํด ํ๋ก์ ํธ ์ต์์ ๋ฃจํธ์ .env ํ์ผ์ ์์ฑํ๊ณ DB ์ ๋ณด ๋ฑ์ ๋ด์ต๋๋ค.
๐ application.yml ์์ฑ
application.properties๋ฅผ YAML๋ก ๋ณํ ํ, ๊ฐ์ ์ค๋ ๋(Virtual Threads) ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
spring:
application:
name: demo
profiles:
active: local # ์ด์ ์ 'prod'๋ก ๋ณ๊ฒฝ
include:
- datasource
config:
import: optional:file:.env[.properties] # .env import
# Java 21 ์ด์(Java 25 ํฌํจ) ํต์ฌ ์ค์ : ๊ฐ์ ์ค๋ ๋ ํ์ฑํ
threads:
virtual:
enabled: true
#############################################
# Server
server:
port: ${SERVER_PORT:9090}
shutdown: graceful # ์ข
๋ฃ ์ ์งํ ์ค์ธ ์์ฒญ์ ์์ ํ๊ฒ ์ฒ๋ฆฌ (Java 25 ๊ฐ์ ์ค๋ ๋ ์ ๋ฆฌ ํฌํจ)
tomcat:
max-connections: 2000 # ์ค๋ ๋ ๊ฐ์๊ฐ ์๋ ์ต๋ ๋์ ์ฐ๊ฒฐ ์ ์ ์ด
๐ application-datasource.yml ์์ฑ
๊ฐ์ ์ค๋ ๋ ํ๊ฒฝ์์๋ ๊ธฐ์กด์ max-threads ์ค์ ๋์ ํจ์จ์ ์ธ ์ปค๋ฅ์
ํ ๊ด๋ฆฌ๊ฐ ์ค์ํฉ๋๋ค. (์์ฑ๋ช
๊ฒฝ๊ณ ๋ฐฉ์ง๋ฅผ ์ํด ํ์ดํ ๋ฐฉ์ ๊ถ์ฅ)
spring:
config:
activate:
on-profile: "datasource"
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://${DB_HOST}:${DB_PORT}/${DB_NAME}?serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true
username: ${DB_USER}
password: ${DB_PASSWORD}
hikari:
pool-name: NarratorHikariCP
maximum-pool-size: 10
minimum-idle: 5
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 20000
jpa:
hibernate:
ddl-auto: update # ๋๋ validate, none, create ๋ฑ
show-sql: false
properties:
hibernate:
format-sql: false
use-sql-comments: false
highlight-sql: true
open-in-view: false
7. ํ ์คํธ ์ฝ๋ ์์ฑ
๐ข IndexController.java
package kr.narrator.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootVersion;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class IndexController {
@Value("${spring.application.name}")
private String appName;
@GetMapping("/") // "/" ๊ฒฝ๋ก๋ก ์ ์ํ๋ฉด index.html์ ๋ณด์ฌ์ค๋๋ค.
public String index(Model model) {
model.addAttribute("appName", appName);
model.addAttribute("javaVersion", System.getProperty("java.version"));
model.addAttribute("springBootVersion", SpringBootVersion.getVersion());
return "index"; // templates/index.html ํ์ผ์ ์ฐพ์ต๋๋ค.
}
}
๐ต index.html (Thymeleaf)
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Java 25 + Spring Boot 3.4 ๋ฐ๋ชจ</title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f4f7f6;
}
.container {
text-align: center;
background: white;
padding: 2rem 3rem;
border-radius: 10px;
box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}
h1 {
color: #2c3e50;
}
p {
color: #7f8c8d;
font-size: 1.1rem;
}
.highlight {
color: #27ae60;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<h1>์๋ฒ ์คํ ์ฑ๊ณต! ๐</h1>
<p>ํ๋ก์ ํธ ์ด๋ฆ: <span class="highlight" th:text="${appName}">demo</span></p>
<p>Java ๋ฒ์ : <span class="highlight" th:text="${javaVersion}">25</span></p>
<p>Spring Boot ๋ฒ์ : <span class="highlight" th:text="${springBootVersion}">3.4.1</span></p>
<p>๊ฐ์ ์ค๋ ๋(Loom): <span class="highlight">ํ์ฑํ๋จ โ
</span></p>
</div>
</body>
</html>
8. ์ต์ข ๊ฒฐ๊ณผ ํ์ธ
์๋ฒ๋ฅผ ๊ธฐ๋ํ๊ณ ๋ธ๋ผ์ฐ์ ์์ ์ ์ํฉ๋๋ค.
URL:
http://localhost:9090/
์ฑ๊ณต! ์ด์ Java 25์ ๊ฐ๋ ฅํ ์ฑ๋ฅ๊ณผ STS 5.1.0์ ์พ์ ํ ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ์์ํ ์ ์์ต๋๋ค. ๐
๐ก ๊ฟํ: STS 5.x ๋ฒ์ ๋ถํฐ๋ YAML ์๋ํฐ์ ๊ฒ์ฌ๊ฐ ์๊ฒฉํด์ก์ต๋๋ค. [format_sql] ์ฒ๋ผ ๋๊ดํธ๋ฅผ ์ฐ๊ฑฐ๋ format-sql์ฒ๋ผ ํ์ดํ ํ์์ ์ฌ์ฉํ๋ฉด ๊ฒฝ๊ณ ๋ฅผ ์ง์ธ ์ ์์ต๋๋ค!
[2026.03.17] lombok ๋ฌธ์ ํด๊ฒฐ
- sts ์ค์น ํด๋์ lombok.jar ํ์ผ์ ๋ณต์ฌํ๋ค.
- SpringToolsForEclipse.ini ํ๋จ์ -javaagent:D:\path\to\lombok.jar ๋ฅผ ์ถ๊ฐํ๋ค.
- sts ๋ฅผ ์คํ ํ Project > Clean ์ ํด๋ฆญํ๋ค.
Java 25 ๋ฒ์ ์์ ayout:decorate ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋๋ฐ, build.gradle ์์ ๋ฒ์ ์ ์ฌ๋ ค์ค๋ค.
implementation ‘nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect:4.0.0’ // ์์ ํ ๋ถ๋ถ