[SpringBoot] ์คํ๋ง๋ถํธ +Thymeleaf + H2 Database + JPA - ํ๋ก์ ํธ ํ๊ฒฝ์ค์ ๋ฐ H2 DB ์ฐ๊ฒฐ ํ ์คํธ
ํ๊ฒฝ
- IDE : VScode
- Java : 17
- SpringBoot : v3.4.0
- Gradle : v8.11.1
- DB : H2
1.
Spring Initializr ์ด์ฉํด์ ํ๋ก์ ํธ ์์ฑ
- Packaging : Jar
- Java version : 17 (์์ ์ด ์ฌ์ฉํ๊ณ ์๋ ๋ฒ์ . ํฐ๋ฏธ๋์์ java -version ๋ช ๋ น์ด๋ก ํ์ธ)
- Dependencies : Spring Web, Spring Data JPA, H2 Database, Lombok
- VScode Extensions : Spring Boot Extensions Pack, Java Extension Pack
2.
application.properties (application.yml) ์ค์
๋๋ yml์ ์ฌ์ฉํ๋ค.
- application.properties : key-value ํ์, ์ค์ ์ด ๋จ์ํ ๊ฒฝ์ฐ, ์ค์ ์ด ๋ง์์ง ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ ๋จ์ด์ง
- application.yml : YAML ํ์, ์ค์ฒฉ ๊ตฌ์กฐ์ ๊ณ์ธต์ ์ธ ์ค์ ์ง์, ๊ฐ๋ ์ฑ ์ข์
spring:
datasource:
url: jdbc:h2:mem:testdb # H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋(mem)๋ก ์ฌ์ฉํ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ์ 'testdb'๋ก ์ง์
driver-class-name: org.h2.Driver # H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ์ฌ์ฉ๋๋ JDBC ๋๋ผ์ด๋ฒ ํด๋์ค ์ด๋ฆ
username: sa # ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ์ ์ด๋ฆ (๊ธฐ๋ณธ๊ฐ: sa)
password: # ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋น๋ฐ๋ฒํธ (๊ธฐ๋ณธ๊ฐ์ ๋น ๊ฐ)
jpa:
hibernate:
ddl-auto: update # JPA๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ ์คํค๋ง๋ฅผ ์๋ ์์ฑ/์์
# - update: ๊ธฐ์กด ํ
์ด๋ธ ์ ์ง ๋ฐ ๋ณ๊ฒฝ ์ฌํญ ์
๋ฐ์ดํธ
# - create: ๊ธฐ์กด ํ
์ด๋ธ ์ญ์ ํ ์๋ก ์์ฑ
# - create-drop: ์ ํ๋ฆฌ์ผ์ด์
์ข
๋ฃ ์ ํ
์ด๋ธ ์ญ์
# - none: ํ
์ด๋ธ ์์ฑ/์์ ์์
์ ์ํํ์ง ์์
show-sql: true # ์คํ๋๋ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
๋ก๊ทธ์ ์ถ๋ ฅ (๋๋ฒ๊น
๋ชฉ์ ์ผ๋ก ์ฌ์ฉ)
h2:
console:
enabled: true # H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฝ์ ์ ์ ํ์ฑํ
# - H2 Console URL: http://localhost:8080/h2-console
3.
build.gradle ์์กด์ฑ ์ถ๊ฐ
์๋ง ๋๋ถ๋ถ ์๋์ผ๋ก ์ถ๊ฐ๋์ ๊ฒ์ด๋ค.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.h2database:h2'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
4.
H2 Console ์ ์ ๋ฐ ํ ์คํธํ๊ธฐ
ํฐ๋ฏธ๋์ ./gradlew bootRun ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ
http://localhost:8080/h2-console
์์ url๋ก ์ ์์ ํ๋ฉด H2 ์ฝ์์ ์ ์ํ ์ ์๋ค. (ํฌํธ๋ ์์ ์ด ์ค์ ํ ํฌํธ)
5.
JPA ์ํฐํฐ ํด๋์ค ์ ์
main ์๋์ domain์ด๋ผ๋ ํด๋๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ Post.java๋ฅผ ๋ง๋ค์๋ค.
JPA ์ํฐํฐ ํด๋์ค๋ฅผ ์์ฑํ๋ค.
package com.crud.demo.domain;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
@Entity
@Table(name = "post")
public class Post {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) //์๋ ์ฆ๊ฐ
private Long id;
private String title;
private String content;
private String author;
//Getter Setter
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return this.content;
}
public void setContent(String content) {
this.content = content;
}
public String getAuthor() {
return this.author;
}
public void setAuthor(String author) {
this.author = author;
}
//๊ธฐ๋ณธ ์์ฑ์
public Post(){}
public Post(String title, String content, String author){
this.title = title;
this.content = content;
this.author = author;
}
}
์์ ์ฝ๋์์ getter setter๋ฅผ ์ฝ๊ฒ ์์ฑํ๋ ์ต์คํ ์ ์ด๋ค. ์ค์นํ๊ธฐ.
getter setter๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ ํ๋๋ฅผ ๋๋๊ทธํ ๋ค ctrl + shift + p๋ฅผ ๋๋ฅด๊ณ get์ ๊ฒ์
์๋์ Generate get and set methods ์ ํ
6.
ํ ์ด๋ธ ์์ฑ ํ์ธ
show TABLES; ๋ช ๋ น์ด๋ก ์์์ ์์ฑํ post ํ ์ด๋ธ์ด ์ ๋๋ก ์์ฑ๋์๋์ง ํ์ธํ๋ค.
ํ ์ด๋ธ์ด ์๋ค!
์๋๋ฉด... yml์์ ์ค์ ํ url๊ณผ ์ผ์นํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
JDBC URL์ ์ ํ์ธํ์.
์์ ๋ค ํ ์ด๋ธ์ด ์ ๋๋ก ์กฐํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ฌ๊ธฐ์ jdbc:h2:mem:testdb์ jdbc:h2:~/test์ ์ฐจ์ด์
- In-Memory Database
- ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๋ ๋์๋ง ๋ฐ์ดํฐ๊ฐ ์ ์ง๋จ
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๊ฑฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด ๋ซํ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง
- ํ ์คํธ ๋จ๊ณ์์ ์ฃผ๋ก ์ฌ์ฉ
- ์๋ ๋น ๋ฆ
- File-Based Database
- ~๋ ์ฌ์ฉ์ ํ ๋๋ ํ ๋ฆฌ ์๋ฏธ
- ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์ ์ฅ๋จ
- ํ์ผ ํ์์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ
- ์๋ ๋๋ฆผ
๋ฐ์ดํฐ๊ฐ ์๊ตฌ์ ์ผ๋ก ๋จ๊ธธ ์ํ๋ฉด jdbc:h2:~/test๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์๋๋ jdbc:h2:~/testdb ๋ก ์์ ํ๋ ๊ณผ์ ์ด๋ค.
test.mv.db ์ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๋ค. ๋ณดํต C๋๋ผ์ด๋ธ ์๋ ์ ์ ๊ฒฝ๋ก์ ์์นํ๋ค.
๊ฒฝ๋ก์ ๋ง์ถฐ์ yml๊ณผ JDBC URL์ ์์ ํ๋ค.
7.
ํ ์คํธ ๋ฐ์ดํฐ ์ฝ์