DataBase๐Ÿ’พ

JPA + H2 DB ์‚ฌ์šฉํ• ๋•Œ ๋”๋ฏธ๋ฐ์ดํ„ฐ ์ž…๋ ฅ ๋ฐฉ๋ฒ•

hae02y 2023. 9. 7. 21:54
๋ฐ˜์‘ํ˜•

 

dummy data

ํ”„๋ก ํŠธ์—”๋“œ์™€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ๋ฐ ์•„์ง ๋ฐฑ์—”๋“œ์—์„œ ๋ฐ์ดํ„ฐ ์ž…๋ ฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด๋‹ค...! ๊ทธ๋ž˜ ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘์ž…๋ ฅํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋ณด์ž. ๋”๋ฏธ๋ฐ์ดํ„ฐ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ผ๊ณ  ํ• ์ˆ˜์žˆ๋‹ค. ๊ฐœ๋ฐœ๊ณผ์ •์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ฑฐ๋‚˜, ์„ฑ๋Šฅ์„ ์ฒดํฌํ• ๋•Œ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋‹ค.

 

๊ฐ€์žฅ๋จผ์ € ddl-auto์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 

ddl-auto

ddl-auto๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ์˜ JPA ์„ค์ •์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์†์„ฑ์ด๋‹ค. ์ด์†์„ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์Šคํ‚ค๋งˆ ์ƒ์„ฑ ์ „๋žต์„ ์„ค์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์˜ต์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

1. none : ๊ธฐ๋ณธ์„ค์ •๊ฐ’, Hibernate๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

2. validate : hibernate๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ• ๋•Œ Entity์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

3. update : ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜๋„๋ก ํ•œ๋‹ค. ๋งŒ์•ฝ Entity์— ์ƒˆ๋กœ์šด ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋ ์‹œ, ๊ทธ์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด column์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์— ์ถ”๊ฐ€๋œ๋‹ค.

4. create : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ข…๋ฃŒ ์‹œ์— ์Šคํ‚ค๋งˆ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

5. create-drop : create์™€ ๋น„์Šทํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ์‹œ์— ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

 

# ์ค‘์š” : ์‹ค์ œ ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” ddl-auto ์„ค์ •์„ none , validate๋กœ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.

 

๊ฐœ๋ฐœ ๋„์ค‘์— ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์™€ ๋”๋ฏธ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ• ์ˆ˜์žˆ๋Š”๋ฐ ์ด๋•Œ hibernate์˜ ddl-auto ์†์„ฑ์ด none / create๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์•ผํ•œ๋‹ค.

 

์„ค์ •ํ•˜๊ธฐ

application.yml ์„ค์ •

spring:
  datasource:
    url: jdbc:h2:mem:testdb
    driverClassName: org.h2.Driver
    username: sa
    password:
  h2:
    console:
      enabled: true
  profiles:
    active: local
  jpa:
     hibernate:
       ddl-auto: create-drop
     defer-datasource-initialization: true
  sql:
     init:
       data-locations: classpath:database/data.sql # ๋”๋ฏธ๋ฐ์ดํ„ฐ ํŒŒ์ผ ์—ฐ๊ฒฐ
       schema-locations: classpath:table.sql       # ์Šคํ‚ค๋งˆ(ํ…Œ์ด๋ธ”) ํŒŒ์ผ ์—ฐ๊ฒฐ
       mode: always
       platform: h2

 

์ถ”๊ฐ€๋œ์‚ฌํ•ญ

  • defer-datasource-initialization : true  - springboot๊ฐ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์ดˆ๊ธฐํ™”๋ฅผ ์ง€์—ฐ์‹œํ‚จ๋‹ค. JPA ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์— ๋งคํ•‘ํ•˜๊ธฐ ์ „์— SQL ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ• ์ˆ˜์žˆ๊ฒŒ ํ•œ๋‹ค 
  • sql.init.data-locations : classpath:database/data.sql - ๋”๋ฏธ๋ฐ์ดํ„ฐ ์‚ฝ์ž…์„ ์œ„ํ•œ SQL์Šคํฌ๋ฆฝํŠธ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ง€์ •ํ•˜์ง€์•Š์„๋ฉด hibernate๊ฐ€ resourceํด๋” ๋‚ด์˜ import.sql์„ ์ฐพ์•„์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค.
  • sql.init.mode : always - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘๋งˆ๋‹ค SQL์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ํ•œ๋‹ค.
  • sql.init.platform : h2 - SQL ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”Œ๋žซํผ์„ ์ง€์ •ํ•œ๋‹ค.

 

์—”ํ‹ฐํ‹ฐ ์„ค์ •

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long memberId;

    @Column(nullable = false, unique = true)
    private String email;

    @Column(nullable = false, unique = true)
    private String nickname; // ๋‹‰๋„ค์ž„

    @Column(nullable = false, unique = true)
    private String phone;

    @Column(nullable = false)
    private String password;
}

 

data.sql ์„ค์ •

resources > database > data.sql ์ƒ์„ฑ

data.sql์— sql์„ ์ž…๋ ฅํ•ด์ฃผ๋ฉด๋œ๋‹ค. ์ด๋•Œ ์ค‘์š”ํ•œ์  2๊ฐ€์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๋ฉด

 

1. table ์ด๋ฆ„์ด ์—”ํ‹ฐํ‹ฐ์—์„œ ์ƒ์„ฑํ•œ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผํ•œ๋‹ค. (DB์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜)

2. ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์„๋•Œ ํฐ๋”ฐ์˜ดํ‘œ(" ")๊ฐ€ ์•„๋‹Œ ์ž‘์€๋”ฐ์˜ดํ‘œ(' ')๋กœ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•