Skip to main content

02C. JPA

About 2 minJavaSpringAWScrashcoursejavajdkjdk8streamspringspringframeworkspringbootawsaws-ec2

02C. JPA ๊ด€๋ จ


2-03. JPA

์ ํ”„ ํˆฌ ์Šคํ”„๋ง๋ถ€ํŠธ - WikiDocs

pahkey/sbb3 - 2-03open in new window

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค SBB๋Š” ์งˆ๋ฌธ ๋‹ต๋ณ€ ๊ฒŒ์‹œํŒ์ด๋‹ค. ์งˆ๋ฌธ์ด๋‚˜ ๋‹ต๋ณ€์„ ์ž‘์„ฑํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์›น ์„œ๋น„์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋Œ€๋ถ€๋ถ„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

SQL์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
SQL์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

๊ทธ๋Ÿฐ๋ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด SQL ์ฟผ๋ฆฌ(query)๋ผ๋Š” ๊ตฌ์กฐํ™”๋œ ์งˆ์˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋“ฑ์˜ ๋ณต์žกํ•œ ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋•Œ ORM(object relational mapping)์„ ์ด์šฉํ•˜๋ฉด ์ž๋ฐ” ๋ฌธ๋ฒ•๋งŒ์œผ๋กœ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ORM์„ ์ด์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ์ฑ…์€ ๋…์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋…์ด๋‚˜ SQL ์ฟผ๋ฆฌ์˜ ๊ธฐ์ดˆ๋Š” ์•ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋…์ž๊ฐ€ ์ด๋Ÿฐ ๊ธฐ์ดˆ์ง€์‹์ด ์—†์–ด๋„ ์ด ์ฑ…์˜ ์‹ค์Šต์„ ๋”ฐ๋ผ ํ•˜๊ณ  ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๋Š”๋ฐ ๋ฌด๋ฆฌ๊ฐ€ ์—†๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. ORM์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์„ ์ž๋ฐ” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ๋กœ ์ดํ•ดํ•ด๋„ ์ข‹๋‹ค.


ORM

SQL ์ฟผ๋ฆฌ์™€ ORM์„ ๋น„๊ตํ•ด ๋ณด์ž. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑ๋œ ์งˆ๋ฌธ ํ…Œ์ด๋ธ”์— ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž.

question ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ ์˜ˆ

idsubjectcontent
1์•ˆ๋…•ํ•˜์„ธ์š”๊ฐ€์ž… ์ธ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ^^
2์งˆ๋ฌธ ์žˆ์Šต๋‹ˆ๋‹คORM์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค
.........

ํ‘œ์—์„œ id๋Š” ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ณ ์œณ๊ฐ’์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์„ค์ •์„ ํ†ตํ•ด ๊ฐ’์ด ์ž๋™์œผ๋กœ ์ฆ๊ฐ€๋˜์–ด ์ €์žฅ๋˜๋„๋ก ํ• ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ๋œ question ํ…Œ์ด๋ธ”์— ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ์ฟผ๋ฆฌ๋Š” ๋ณดํ†ต ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•œ๋‹ค.

INSERT INTO question (subject, content) VALUES ('์•ˆ๋…•ํ•˜์„ธ์š”', '๊ฐ€์ž… ์ธ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ^^');
INSERT INTO question (subject, content) VALUES ('์งˆ๋ฌธ ์žˆ์Šต๋‹ˆ๋‹ค', 'ORM์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค');

ํ•˜์ง€๋งŒ ORM์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ ๋Œ€์‹  ์ž๋ฐ” ์ฝ”๋“œ๋กœ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์ฝ”๋“œ๋Š” ์ž‘์„ฑํ•  ํ•„์š”์—†์ด ๋ˆˆ์œผ๋กœ๋งŒ ํ™•์ธํ•˜์ž.

Question q1 = new Question();
q1.setSubject("์•ˆ๋…•ํ•˜์„ธ์š”");
q1.setContent("๊ฐ€์ž… ์ธ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค ^^");
this.questionRepository.save(q1);

Question q2 = new Question();
q2.setSubject("์งˆ๋ฌธ ์žˆ์Šต๋‹ˆ๋‹ค");
q2.setContent("ORM์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค");
this.questionRepository.save(q2);

์œ„์™€ ๊ฐ™์ด ORM์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž… ์˜ˆ์ œ๋Š” ์ฝ”๋“œ ์ž์ฒด๋งŒ ๋†“๊ณ  ๋ณด๋ฉด ์–‘์ด ๋งŽ์•„ ๋ณด์ด์ง€๋งŒ ๋ณ„๋„์˜ SQL ๋ฌธ๋ฒ•์„ ๋ฐฐ์šฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์ฝ”๋“œ์—์„œ Question์€ ์ž๋ฐ” ํด๋ž˜์Šค์ด๋ฉฐ, ์ด์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ORM ํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ(Entity)๋ผ๊ณ  ํ•œ๋‹ค. ORM์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์—์„œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋ฏ€๋กœ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ฆ‰, ์ž๋ฐ”๋งŒ ์•Œ์•„๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์งˆ์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ORM์˜ ์žฅ์ ์„ ๋” ์•Œ์•„๋ณด์ž

ORM์„ ์ด์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜์— ์ƒ๊ด€ ์—†์ด ์ผ๊ด€๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์ง€ยท๋ณด์ˆ˜ํ•˜๊ธฐ๊ฐ€ ํŽธ๋ฆฌํ•˜๋‹ค. ๋˜ํ•œ ๋‚ด๋ถ€์—์„œ ์•ˆ์ „ํ•œ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹ฌ๋ผ๋„ ํ†ต์ผ๋œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ  ์˜ค๋ฅ˜ ๋ฐœ์ƒ๋ฅ ๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.


JPA ๋ž€?

์Šคํ”„๋ง๋ถ€ํŠธ๋Š” JPA(Java Persistence API)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. JPA๋Š” ์ž๋ฐ” ์ง„์˜์—์„œ ORM(Object-Relational Mapping)์˜ ๊ธฐ์ˆ  ํ‘œ์ค€์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ์ด๋‹ค.

JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์‹ค์ œ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•˜๋‹ค. JPA๋ฅผ ๊ตฌํ˜„ํ•œ ๋Œ€ํ‘œ์ ์ธ ์‹ค์ œ ํด๋ž˜์Šค์—๋Š” ํ•˜์ด๋ฒ„๋„ค์ดํŠธ(Hibernate)๊ฐ€ ์žˆ๋‹ค. SBB๋„ JPA + ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•œ๋‹ค.


H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•ด ๋ณด์ž. ๊ฐœ๋ฐœ์‹œ์—๋Š” Oracle, MSSQL ๋“ฑ์˜ ๊ตต์งํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณด๋‹ค๋Š” ์„ค์น˜๋„ ์‰ฝ๊ณ  ์‚ฌ์šฉ๋„ ํŽธ๋ฆฌํ•œ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ฃผ๋กœ ๊ฐœ๋ฐœ์šฉ์ด๋‚˜ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ๊ฒฝ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด๋‹ค. ๊ฐœ๋ฐœ์‹œ์—๋Š” H2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ์‹ค์ œ ์šด์˜์‹œ์Šคํ…œ์€ ์ข€ ๋” ๊ทœ๋ชจ์žˆ๋Š” DB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ ํŒจํ„ด์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์น˜ํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/build.gradle

// (... ์ƒ๋žต. ...)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
}

// (... ์ƒ๋žต ...)








ย 



๊ทธ๋ฆฌ๊ณ  "Refresh Gradle Project"๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜์ž.

runtimeOnly

build.gradle ํŒŒ์ผ์˜ runtimeOnly๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋Ÿฐํƒ€์ž„(Runtime)์‹œ์—๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค. ์ปดํŒŒ์ผ(Compile)์‹œ์—๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” runtimeOnly ๋Œ€์‹  compileOnly๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์„ค์น˜ํ•œ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ค์ •์„ ํ•ด์•ผ ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด application.properties ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ž.

ํ˜„์žฌ application.properties ํŒŒ์ผ์—๋Š” ์•„๋ฌด๋Ÿฐ ๋‚ด์šฉ์ด ์—†์„ ๊ฒƒ์ด๋‹ค.

ํŒŒ์ผ๋ช…: /sbb/src/main/resources/application.properties

# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

  • spring.h2.console.enabled - H2 ์ฝ˜์†”์˜ ์ ‘์†์„ ํ—ˆ์šฉํ• ์ง€์˜ ์—ฌ๋ถ€์ด๋‹ค. true๋กœ ์„ค์ •ํ•œ๋‹ค.
  • spring.h2.console.path - ์ฝ˜์†” ์ ‘์†์„ ์œ„ํ•œ URL ๊ฒฝ๋กœ์ด๋‹ค.
  • spring.datasource.url - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†์„ ์œ„ํ•œ ๊ฒฝ๋กœ์ด๋‹ค.
  • spring.datasource.driverClassName - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†์‹œ ์‚ฌ์šฉํ•˜๋Š” ๋“œ๋ผ์ด๋ฒ„์ด๋‹ค.
  • spring.datasource.username - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์‚ฌ์šฉ์ž๋ช…์ด๋‹ค. (์‚ฌ์šฉ์ž๋ช…์€ ๊ธฐ๋ณธ ๊ฐ’์ธ sa๋กœ ์„ค์ •ํ•œ๋‹ค.)
  • spring.datasource.password - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํŒจ์Šค์›Œ๋“œ์ด๋‹ค. ๋กœ์ปฌ ๊ฐœ๋ฐœ ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŒจ์Šค์›Œ๋“œ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  spring.datasource.url์— ์„ค์ •ํ•œ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค. ์œ„์—์„œ spring.datasource.url์„ jdbc:h2:~/local ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž์˜ ํ™ˆ๋””๋ ‰ํ„ฐ๋ฆฌ(~ ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒฝ๋กœ) ๋ฐ‘์— local.mv.db ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ jdbc:h2:~/test๋ผ๊ณ  ์„ค์ •ํ–ˆ๋‹ค๋ฉด test.mv.db ๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ์šฉ์ž์˜ ํ™ˆ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ์œˆ๋„์šฐ์˜ ๊ฒฝ์šฐ์—๋Š” C:\Users\(์‚ฌ์šฉ์ž๋ช…) ์ด๊ณ  ๋งฅOS์˜ ๊ฒฝ์šฐ์—๋Š” /Users/(์‚ฌ์šฉ์ž๋ช…) ์ด๋‹ค. ๋ณธ์ธ์ด ์‚ฌ์šฉํ•˜๋Š” OS์— ๋งž๋Š” ํ™ˆ๋””๋ ‰ํ„ฐ๋ฆฌ์— local.mv.db ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์ž. ํŒŒ์ผ์€ ๋‚ด์šฉ ์—†์ด ๋นˆํŒŒ์ผ๋กœ ์ƒ์„ฑํ•œ๋‹ค.

๋งฅ OS์—์„œ local.mv.db ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ

touch local.mv.db

์—ฌ๊ธฐ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ ๋˜์—ˆ์œผ๋ฉด ์ด์ œ H2 ์ฝ˜์†”์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹ค์Œ์˜ URL ์ฃผ์†Œ๋กœ H2 ์ฝ˜์†”์— ์ ‘์†ํ•ด ๋ณด์ž.

  • http://localhost:8080/h2-console
๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ H2 ์ฝ˜์†”ํ™”๋ฉด์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ H2 ์ฝ˜์†”ํ™”๋ฉด์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค.

ํ•œ๊ตญ์–ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์–ด ์„ค์ •์„ "ํ•œ๊ตญ์–ด"๋กœ ์„ค์ •ํ• ์ˆ˜ ์žˆ๋‹ค.

์ฝ˜์†” ํ™”๋ฉด์—์„œ JDBC URL ๊ฒฝ๋กœ๋ฅผ <FontIcon icon="fas fa-file-lines"/> ํŒŒ์ผ์— ์„ค์ •ํ•œ ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  "์—ฐ๊ฒฐ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์ž.
์ฝ˜์†” ํ™”๋ฉด์—์„œ JDBC URL ๊ฒฝ๋กœ๋ฅผ application.properties ํŒŒ์ผ์— ์„ค์ •ํ•œ jdbc:h2:~/local๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  "์—ฐ๊ฒฐ" ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์ž.
๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘์†๋œ ํ™”๋ฉด์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘์†๋œ ํ™”๋ฉด์„ ๋ณผ์ˆ˜ ์žˆ๋‹ค.

JPA ํ™˜๊ฒฝ์„ค์ •

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค. ์ด์ œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์•ผํ•œ๋‹ค. ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐํšŒํ•˜๋ ค๋ฉด JPA๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ค.

JPA๋ฅผ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋Š” ์กฐ๊ธˆ ํ›„์— ์ž์„ธํžˆ ์•Œ์•„๋ณธ๋‹ค.

๋‹ค์Œ์ฒ˜๋Ÿผ build.gradle ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/build.gradle

// (... ์ƒ๋žต ...)

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    runtimeOnly 'com.h2database:h2'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

// (... ์ƒ๋žต ...)









ย 



๊ทธ๋ฆฌ๊ณ  "Refresh Gradle Project"๋กœ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ฉด JPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์„ค์น˜๋œ๋‹ค.

implementation

build.gradle ํŒŒ์ผ์˜ implementation์€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๋ฅผ ์œ„ํ•ด ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์„ค์ •์ด๋‹ค. implementation์€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์—ฐ๊ด€๋œ ๋ชจ๋“  ๋ชจ๋“ˆ๋“ค์„ ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๊ณ  ์ง์ ‘ ๊ด€๋ จ์ด ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค๋งŒ ์ปดํŒŒ์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— rebuild ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

๊ทธ๋ฆฌ๊ณ  JPA ์„ค์ •์„ ์œ„ํ•ด application.properties ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์ž.

ํŒŒ์ผ๋ช…: /sbb/src/main/resources/application.properties

# DATABASE
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:~/local
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

# JPA
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=update








ย 
ย 
ย 

์ถ”๊ฐ€ํ•œ ํ•ญ๋ชฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด์ž.

  • spring.jpa.properties.hibernate.dialect - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—”์ง„ ์ข…๋ฅ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • spring.jpa.hibernate.ddl-auto - ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๋Š” ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค.

spring.jpa.hibernate.ddl-auto

์œ„ ์„ค์ •์—์„œ spring.jpa.hibernate.ddl-auto๋ฅผ update๋กœ ์„ค์ •ํ–ˆ๋‹ค. update์™€ ๊ฐ™์€ ์„ค์ •๊ฐ’์— ๋Œ€ํ•ด์„œ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์ž.

  • none - ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • update - ์—”ํ‹ฐํ‹ฐ์˜ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ ์šฉํ•œ๋‹ค.
  • validate - ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ๋งŒ ํ•œ๋‹ค.
  • create - ์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘๋ ๋•Œ ๋ชจ๋‘ dropํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค.
  • create-drop - create์™€ ๋™์ผํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์ข…๋ฃŒ์‹œ์—๋„ ๋ชจ๋‘ drop ํ•œ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ณดํ†ต update ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์šด์˜ํ™˜๊ฒฝ์—์„œ๋Š” none ๋˜๋Š” validate ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.


์ด์ฐฌํฌ (MarkiiimarK)
Never Stop Learning.