Spring

[SpringBoot] ์Šคํ”„๋ง๋ถ€ํŠธ +Thymeleaf + H2 Database + JPA - ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ • ๋ฐ H2 DB ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ

carsumin 2024. 12. 12. 11:51
ํ™˜๊ฒฝ
  • 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.

ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์‚ฝ์ž