Spring Initializr로 프로젝트를 만들고, 강의에서 사용할 의존성과 뷰·데이터베이스 환경을 설정한다. 이 장을 마치면 hello.html이 브라우저에 뜨고, MySQL 데이터베이스에 연결된 실행 가능한 스프링 부트 애플리케이션이 완성된다.
이 강의의 기술 스택
Spring Boot 3.5.x (4.x 미사용)
Java 21 (LTS. Spring Boot 3.x는 Java 17 이상 필수)
MySQL 8.x + Spring Data JPA(Hibernate 6)
Gradle, Thymeleaf, Lombok
1. Spring Boot 프로젝트 생성
Spring Initializr (start.spring.io) 에서 프로젝트를 생성한다.
항목 | 권장 설정 |
|---|---|
Project | Gradle - Groovy |
Language | Java |
Spring Boot | 3.5.x (정식 릴리스. SNAPSHOT·M·RC 및 4.x 제외) |
Packaging | Jar |
Java | 21 (LTS) |
IDE 내장 기능 사용
IntelliJ IDEA Ultimate나 STS(Spring Tool Suite)에서는 New Project → Spring Initializr 메뉴로 같은 작업을 IDE 안에서 할 수 있다.
2. Dependencies 추가
생성 시 다음 의존성을 선택한다.
Spring Web — 스프링 MVC, 내장 Tomcat
Spring Boot DevTools — 코드 변경 시 자동 재시작·라이브 리로드
Thymeleaf — 서버 사이드 템플릿 엔진
Spring Data JPA — JPA 기반 데이터 접근
MySQL Driver — MySQL 연결 드라이버
Lombok — getter/setter, 생성자,
@Slf4j등 자동 생성
Lombok 사용 시 주의
IDE에 Lombok 플러그인 설치와 Annotation Processing 활성화가 필요하다. (IntelliJ: Settings → Build, Execution, Deployment → Compiler → Annotation Processors → Enable annotation processing)
build.gradle 예시 (Spring Boot 3.5 + MySQL):
plugins {
id 'java'
id 'org.springframework.boot' version '3.5.0'
id 'io.spring.dependency-management' version '1.1.6'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
// MySQL 드라이버 (버전은 스프링 부트가 관리)
runtimeOnly 'com.mysql:mysql-connector-j'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}3. View 설정 (Thymeleaf)
Thymeleaf 템플릿은 src/main/resources/templates/ 아래에 둔다. 컨트롤러가 반환한 문자열이 이 폴더의 HTML 파일 이름과 매핑된다.
컨트롤러 작성
@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello");
return "hello"; // templates/hello.html 을 렌더링
}
}templates/hello.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}">안녕하세요. 손님</p>
</body>
</html>http://localhost:8080/hello 로 접속하면 다음과 같이 출력된다.
안녕하세요. hello
네추럴 템플릿
th:text가 적용되기 전 화면(안녕하세요. 손님)은 HTML 파일을 그냥 브라우저로 열었을 때 보이는 내용이다. 서버를 거치면 th:text 값으로 대체된다. 이렇게 순수 HTML로도 열어볼 수 있는 특징을 네추럴 템플릿이라고 한다.
4. MySQL 데이터베이스 준비
dev.mysql.com 에서 MySQL 8.x(또는 MySQL Community Server)를 설치한다. macOS는 Homebrew(brew install mysql), Windows는 MySQL Installer를 사용하면 편하다.
설치 후 강의에서 사용할 데이터베이스와 계정을 만든다. MySQL에 접속해 아래 SQL을 실행한다.
-- 한글 깨짐 방지를 위해 utf8mb4 사용
CREATE DATABASE springboot
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
-- 애플리케이션 전용 계정 생성
CREATE USER 'springboot'@'%' IDENTIFIED BY 'springboot1234';
GRANT ALL PRIVILEGES ON springboot.* TO 'springboot'@'%';
FLUSH PRIVILEGES;접속 확인
mysql -u springboot -p springboot위 명령으로 접속되면 준비 완료다. (-p 입력 후 비밀번호 springboot1234)
5. application.yml 설정 { #5-applicationyml }
src/main/resources/application.yml 에 데이터소스와 JPA를 설정한다. (application.properties를 삭제하고 .yml로 작성)
spring:
datasource:
url: jdbc:mysql://localhost:3306/springboot?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
username: springboot
password: springboot1234
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
# Hibernate 6은 방언을 자동 감지하므로 dialect는 보통 생략 가능
# dialect: org.hibernate.dialect.MySQLDialect
logging:
level:
org.hibernate.SQL: debug # 실행되는 SQL 출력
org.hibernate.orm.jdbc.bind: trace # 바인딩되는 파라미터 값 출력 (Hibernate 6 로거)설정 | 의미 |
|---|---|
| 엔티티 변경분만 반영(테이블/컬럼 추가). 데이터는 유지되어 학습용으로 적합. |
| 실행 SQL을 콘솔에 출력 |
| SQL을 보기 좋게 줄바꿈 |
| 실행 SQL을 로그로 출력 |
| SQL |
Hibernate 6의 파라미터 로그 변경
Spring Boot 2.x(Hibernate 5)에서는 파라미터 값을 보려면 logging.level.org.hibernate.type=trace를 썼다. Hibernate 6(Boot 3.x)부터는 이 로거가 동작하지 않으며, 대신 위와 같이 org.hibernate.orm.jdbc.bind: trace 를 사용해야 한다.
운영 환경에서는 ddl-auto 주의
create/create-drop은 실행할 때마다 테이블을 지우고 다시 만든다. 운영 환경에서는 절대 사용하지 말고 validate 또는 none을 사용한다. 학습용으로도 데이터를 매번 비우고 싶을 때만 create를 쓴다.
6. 프로파일과 설정 외부화
위 application.yml에는 DB 비밀번호가 평문으로 들어 있다. 학습용으로는 괜찮지만, 실제로는 환경(로컬·운영)마다 설정이 다르고 비밀번호를 코드 저장소에 올려서는 안 된다. 스프링은 이를 위해 프로파일과 설정 외부화를 제공한다.
프로파일로 환경 분리
하나의 application.yml 안에서 --- 로 문서를 나눠 환경별 설정을 둘 수 있다.
# 공통 설정
spring:
jpa:
show-sql: true
---
# 로컬 개발용 (spring.profiles.active=local 일 때)
spring:
config:
activate:
on-profile: local
datasource:
url: jdbc:mysql://localhost:3306/springboot
username: springboot
password: springboot1234
jpa:
hibernate:
ddl-auto: update
---
# 운영용 (spring.profiles.active=prod 일 때)
spring:
config:
activate:
on-profile: prod
datasource:
url: ${DB_URL} # 환경변수에서 주입
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: validate # 운영에서는 스키마 검증만활성 프로파일은 실행 시 지정한다.
# 실행 시 옵션으로 지정
java -jar app.jar --spring.profiles.active=prod
# 또는 환경변수로 지정
SPRING_PROFILES_ACTIVE=prod java -jar app.jar환경변수로 민감 정보 주입
${DB_PASSWORD} 처럼 쓰면 같은 이름의 환경변수나 시스템 프로퍼티 값으로 치환된다.
spring:
datasource:
password: ${DB_PASSWORD} # 환경변수가 없으면 기동 실패
# password: ${DB_PASSWORD:defaultPw} # : 뒤는 환경변수가 없을 때의 기본값비밀번호·키를 저장소에 올리지 않는다
DB 비밀번호, API 키 같은 민감 정보는 application.yml에 직접 쓰지 말고 환경변수나 별도 비밀 관리 도구로 주입한다. 한 번 커밋된 비밀번호는 깃 이력에도 남으니 주의한다. 비밀 값만 application-local.yml로 분리한 뒤 .gitignore에 추가하는 방법도 있다.
application-{프로파일}.yml 파일 분리
한 파일에서 ---로 나누는 대신, application-local.yml / application-prod.yml 처럼 파일을 나눠 둘 수도 있다. spring.profiles.active에 해당하는 파일이 공통 application.yml 위에 덧입혀진다.
7. p6spy 라이브러리 추가 (선택)
show-sql은 바인딩 파라미터를 ?로만 보여준다. p6spy를 추가하면 실제 값이 채워진 완성된 SQL을 로그로 볼 수 있어 디버깅이 편하다.
// build.gradle — Spring Boot 3.x 대응 버전
implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.1'p6spy는 편리하지만 성능 오버헤드가 있으므로 개발 환경에서만 사용하는 것을 권장한다.
8. 빌드와 실행
Gradle 래퍼로 빌드하면 WAS가 포함된 실행 가능한 jar가 만들어진다.
# macOS / Linux
./gradlew build
cd build/libs
java -jar 파일명.jar# Windows (PowerShell)
.\gradlew build
cd build\libs
java -jar 파일명.jar실행 후 콘솔에 다음과 같은 로그가 보이면 성공이다.
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ HikariPool-1 - Start completed. Tomcat started on port(s): 8080 (http) Started Application in 2.134 seconds
브라우저에서 http://localhost:8080/hello 로 접속해 동작을 확인한다.
DB 연결 실패 시 체크리스트
MySQL 서버가 실행 중인가? (
mysql.server start또는 서비스 확인)application.yml의 포트(3306)·계정·비밀번호가 맞는가?springboot데이터베이스와 계정 권한이 생성되어 있는가?
정리
Spring Boot 3.5 + Java 21 기준으로, Gradle + Jar 프로젝트를 만들고 Web·DevTools·Thymeleaf·JPA·MySQL Driver·Lombok을 추가한다.
뷰 템플릿은
templates/, 정적 리소스는static/에 둔다.MySQL에
springboot데이터베이스·계정을 만들고application.yml에서 데이터소스·JPA·로깅을 설정한다. 학습용ddl-auto는update.파라미터 로그는 Hibernate 6 기준
org.hibernate.orm.jdbc.bind: trace를 사용한다.환경별 설정은 프로파일(
spring.profiles.active)로 나누고, 비밀번호 등 민감 정보는 환경변수(${DB_PASSWORD})로 주입한다../gradlew build후java -jar로 실행하면 내장 Tomcat이 8080 포트에서 뜬다.