[์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA] 1. ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •

2022. 9. 21. 17:12ใ†์ธํ”„๋Ÿฐ/์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

728x90

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%8D%B0%EC%9D%B4%ED%84%B0-JPA-%EC%8B%A4%EC%A0%84/dashboard

 

์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” ๊ธฐ์กด์˜ ํ•œ๊ณ„๋ฅผ ๋„˜์–ด ๋งˆ์น˜ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ตฌํ˜„ ํด๋ž˜์Šค ์—†์ด ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์œผ๋กœ ๊ฐœ๋ฐœ์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋ณต ๊ฐœ๋ฐœํ•ด์˜จ ๊ธฐ๋ณธ CRUD ๊ธฐ๋Šฅ๋„ ๋ชจ๋‘ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

www.inflearn.com

์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. 

 

 

0๏ธโƒฃ ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •

https://start.spring.io/

 

์‚ฌ์šฉ ๊ธฐ๋Šฅ: Spring web, Jpa, h2, lombok

implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test' //junit 5 ์˜์กด

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'

-> p6spy๋Š” jpa ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉํ•œ๊ฑธ ๋ณด์—ฌ์ฃผ๋Š” ๋กœ๊ทธ?์ด๋‹ค. 

 

 

1๏ธโƒฃ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ 

./gradlew dependencies --configuration compileClasspath

terminal์— ์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 

์ด๋Ÿฐ์‹์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ intellij์—์„œ ๋” ํŽธํ•˜๊ฒŒ ํ™•์ธ๋„ ๊ฐ€๋Šฅ...

 

- ์Šคํ”„๋ง๋ถ€ํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ดํŽด๋ณด๊ธฐ

spring-boot-starter-web

spring-boot-starter-tomcat: ํ†ฐ์บฃ(์›น์„œ๋ฒ„) 
spring-web-mvc : ์Šคํ”„๋ง ์›น MVC

spring-boot-starter-data-jpa

spring-boot-starter-aop 
spring-boot-starter-jdbc -> HikarCP ์ปค๋„ฅ์…˜ํ’€ (๋ถ€ํŠธ 2.0 ๋ถ€ํ„ฐ ๊ธฐ๋ณธ) 
hibernate + JPA : ํ•˜์ด๋ฒ„๋„ค์ดํŠธ + JPA 
spring-data-jpa: ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA 

spring-boot-starter(๊ณตํ†ต) : ์Šคํ”„๋ง ๋ถ€ํŠธ + ์Šคํ”„๋ง ์ฝ”์–ด + ๋กœ๊น… 

 

spring-boot:

  spring-core 

spring-boot-starter-logging:

   logback, slf4j 

 

 

- ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

spring-boot-starter-test

 junit: ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ, ์Šคํ”„๋ง๋ถ€ํŠธ 2.2๋ถ€ํ„ฐ Junit5์‚ฌ์šฉ  (๊ณผ๊ฑฐ ๋ฒ„์ „์€ vintage)

 mockito: ๋ชฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

 assertj : ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

spring-test: ์Šคํ”„๋ง ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ์ง€์› 

 

 

-ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 

์Šคํ”„๋ง MVC

์Šคํ”„๋ง ORM 

JPA, ํ•˜์ด๋ฒ„๋„ค์ดํŠธ 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

 

-๊ธฐํƒ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ผ์ด์–ธํŠธ

์ปค๋„ฅ์…˜ ํ’€: ๋ถ€ํŠธ ๊ธฐ๋ณธ์€ HikariCP

๋กœ๊น… Slf4j & logback

ํ…Œ์ŠคํŠธ 

 

 

2๏ธโƒฃ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ค์น˜ 

: H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐœ๋ฐœ์ด๋‚˜ ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ ๊ฐ€๋ณ๊ณ  ํŽธ๋ฆฌํ•œ DB, ์›น ํ™”๋ฉด ์ œ๊ณต 

https://www.h2database.com

๊ทธ๋ฆฌ๊ณ  H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์Šคํ”„๋ง๋ถ€ํŠธ์— ์„ค์น˜๋œ H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์„ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

 

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŒŒ์ผ ์ƒ์„ฑ ๋ฐฉ๋ฒ• 

[Server] 

jdbc:h2:~/datajpa (์ตœ์ดˆํ•œ๋ฒˆ) -> ์ด๋Š” ํŒŒ์ผ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์—์„œ ํ•œ๊ณณ์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ embedded ๋ฒ„์ „์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

[Embedded]

jdbc:h2:tcp://localhost/~/datajpa ์ด๋ ‡๊ฒŒ ์ ‘์† 

 

 

3๏ธโƒฃ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์™€ DB ์„ค์ •, ๋™์ž‘ ํ™•์ธ 

application.yml

spring:
  datasource:
    url: jdbc:h2:tcp://localhost/~/datajpa
    username: sa
    password:
    driver-class-name: org.h2.Driver

  jpa:
    hibernate:
      ddl-auto: create
    properties:
      hibernate:
        format_sql: true

logging:
  level:
    org.hibernate.SQL: debug

spring.jpa.hibernate.ddl-auto: create 

-> ์ด ์˜ต์…˜์€ ์• ํ”„๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ํ…Œ์ด๋ธ”์„ drop ํ•˜๊ณ  ๋‹ค์‹œ ์ƒ์„ฑํ•œ๋‹ค. 

 

๋ชจ๋“  ๋กœ๊ทธ ์ถœ๋ ฅ์€ ๊ฐ€๊ธ‰์  ๋กœ๊ฑฐ๋ฅผ ํ†ตํ•ด ๋‚จ๊ฒจ์•ผ ํ•œ๋‹ค. System.out ์ด๋Ÿฐ์‹์œผ๋กœ ํ•ด์„œ ์ฝ˜์†”์— ๋‚จ๊ธฐ๋Š”๊ฑด ์•ˆ์ข‹๋‹ค. 

 

logging.level.org.hibernate.SQL : debug

-> ์ด ์˜ต์…˜์€ logger๋ฅผ ํ†ตํ•ด ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ์‹คํ–‰ SQL์„ ๋‚จ๊ธด๋‹ค. 

 

3๏ธโƒฃ ์‹ค์ œ ๋™์ž‘ ํ™•์ธํ•˜๊ธฐ

Member.class

JPA์—์„œ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ํ•„์ˆ˜๋กœ ์ƒ์„ฑํ•ด์ค˜์•ผํ•œ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด JPA์—์„œ๋„ ํ”„๋ก์‹œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋•Œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  access level์€ protected๊นŒ์ง€๋Š” ์—ด์–ด๋‘ฌ์•ผ ํ•œ๋‹ค๊ณ  ๋ฉ”๋‰ด์–ผ์— ๋‚˜์™€์žˆ๊ธฐ ๋•Œ๋ฌธ์— protected ๋กœ ์„ค์ •ํ–ˆ๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” 

์™ธ๋ถ€์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋‚จ๋ฐœํ• ๊นŒ๋ด ์ด๋ ‡๊ฒŒ ์„ค์ •ํ•ด์ค€๋‹ค~~

 

๊ทธ๋ฆฌ๊ณ  ์ฐธ๊ณ ๋กœ Setter๋Š” ๊ฐ€๊ธ‰์  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹๋‹ค. 

 

 

MemberJpaRepository.class

 

MemberJpaRepositoryTest.class

MemberJpaRepository๋ฅผ Testํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ด์ œ Junit5๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์— ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ๋˜ ์–ด๋…ธํ…Œ์ด์…˜์ธ 

@Runwith(SpringRunner.class)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. 

 

๊ทธ๋ฆฌ๊ณ  @Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค˜์•ผ ๋กค๋ฐฑ๋„ ๋˜๊ณ , JPA์—์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค. 

 

 

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ์‚ฌ์šฉ - MemberRepository.class

์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” MemberRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  JpaRepository๋ฅผ ์ƒ์†๋ฐ›์•„ ๋งŒ๋“ค์–ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋์ด๋‹ค..!!

 

MemberRepositoryTest.class

์œ„์—์„œ JPA Repository Test ์ฝ”๋“œ์™€ ๊ฑฐ์˜ ๋น„์Šทํ•˜๋‹ค. 

๋Œ€์‹  jpaRepository๋Š” findById ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Š” Optional๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธ์—์„œ๋Š” ๊ฐ„๋‹จํžˆ ๊บผ๋‚ด๊ธฐ ์œ„ํ•ด get๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด Member๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ–ˆ๋Š”๋ฐ ์›๋ž˜๋Š” getOrElse ? ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๋กœ ๊บผ๋‚ด์•ผํ•œ๋‹ค..! 

 

@Rollback(False) ์ง€์ •ํ•ด์ฃผ๋ฉด ๋ณดํ†ต ํ…Œ์ŠคํŠธ ๋๋‚˜๊ณ  ๋ชจ๋‘ ๋กค๋ฐฑํ•ด์„œ ์‹ค์ œ ๋””๋น„์—๋Š” ๋ฐ์ดํ„ฐ ์˜ํ–ฅ์„ ์•ˆ์ฃผ๋Š”๋ฐ ์ด๋ฅผ false๋กœ ์ง€์ •ํ•ด๋‘๋ฉด 

์‹ค์ œ ๋””๋น„์— ๊ฐ’์ด ์ง€์›Œ์ง€์ง€ ์•Š๊ณ  ๋‚จ์•„์žˆ๋Š”๋‹ค. 

 

 

โญ๏ธ ์ฐธ๊ณ 

์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ์„ค์ •์ด ๋‹ค ์ž๋™ํ™”๋˜์—ˆ๋‹ค. 

persistence.xml ๋„ ์—†๊ณ , LocalContainerExntityManagerFactoryBean ์ด๋Ÿฐ๊ฒƒ๋„ ์—†๋‹ค.

 

 

๐Ÿ˜Ž ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ ๋กœ๊ทธ ๋‚จ๊ธฐ๊ธฐ 

์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ 

implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.5.7'

์„ build.gradle ์— ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ  ๋ฆฌํ”„๋ ˆ์‰ฌ ํ•ด์ฃผ๋ฉด 

์ด๋Ÿฐ์‹์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉํ•œ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ์ค€๋‹ค.

๊ทผ๋ฐ ์ด๋Š” ํ…Œ์ŠคํŠธ์šฉ์—์„œ๋Š” ์‚ฌ์šฉํ•ด์„œ ๋ฐ”๋กœ ํ™•์ธํ•˜๋Š”๊ฒŒ ์ข‹์€๋ฐ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์ถ”๊ฐ€ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

โ—๏ธ ์ฐธ๊ณ 

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ก๋กœ ๋‚จ๊ธฐ๋Š” ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ๋Š” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, 

์šด์˜ ์‹œ์Šคํ…œ์— ์ ์šฉํ•˜๋ ค๋ฉด ๊ผญ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค~~

 

 

728x90