[GP] Spring boot์—์„œ DBMS๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ• JPA ๊ณ ๊ธ‰ํŽธ

๋ฐ˜์‘ํ˜•

์ด ๊ธ€์€ N.K Dev Lab์—์„œ ์ž‘์„ฑ๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”. Spring ๊ด€๋ จ ๊ธ€์„ ์ •๋ง ์•ˆ์“ด์ง€๊ฐ€ ๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ๋„ค์š”โ€ฆใ… ใ…  ์š”์ฆ˜ ๋ฐ์ดํ„ฐ ๋ถ„์•ผ์—์„œ ์ผํ•˜๋‹ค๋ณด๋‹ˆ R์„ ๋‹ค๋ฃจ๋ฉด์„œ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•œ ํฌ์ŠคํŒ…์ด ๋งŽ์ด ๋ฐ€๋ ค์žˆ๋„ค์š”.. ์•ž์œผ๋กœ๋Š” Spring์„ ์ด์šฉํ•œ ์˜คํ”ˆ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌ ์ค‘์ด๋‹ˆ ๋‹ค์‹œ ์žฌ๊ฑด์„ ์œ„ํ•ด์„œ๋ผ๋„ ์ฒœ์ฒœํžˆ ํ•˜๋‚˜์”ฉ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๋ฒˆ์—๋Š” ์ง€๋‚œ ๊ธ€์— ์ด์–ด์„œ JPA ๊ณ ๊ธ‰ํŽธ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์›Œ๋‚™ ์˜ค๋ž˜๋์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ณ ๊ธ‰ํŽธ์— ๋ฌด์—‡์„ ์ ์–ด์•ผํ• ์ง€ ๋ช…์‹œ๊ฐ€ ๋˜์–ด ์žˆ๋„ค์š”. ์˜ค๋Š˜์€ ๊ทธ ๋ถ€๋ถ„์„ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

SQL๊ณผ HQL

SQL์€ Structed Query Language์˜ ์•ฝ์ž๋กœ DBMS์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘/์ œ์–ดํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด ์ค‘์— ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. SQL Server์—์„œ๋Š” T-SQL์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ฃ .

HQL์€ ๊ทธ๊ฒƒ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ Hibernate Query Language์˜ ์•ฝ์ž๋กœ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃจ๋„๋กํ•˜๋Š” ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. Spring boot์—์„œ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” hibernate ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฟผ๋ฆฌ๋กœ ์งˆ์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ ๋ฌด์—‡๋ณด๋‹ค ์žฅ์ ์€ SQL์—์„œ๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์„ ์ž‘์—…ํ•  ๋•Œ ๋ช…์‹œ์ ์ธ JOIN ์ฟผ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜์ง€๋งŒ HQL์€ ๊ทธ๋Ÿฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HQL์˜ ์žฅ๋‹จ์ 

๊ทธ๋Ÿผ ๊ฐ„๋‹จํžˆ HQL์ด SQL์— ๋น„ํ•˜์—ฌ ์–ด๋– ํ•œ ์ ์ด ์ข‹๊ณ  ๋‚˜์œ์ง€๋ฅผ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์žฅ์ 
    1. ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ์•ž์„œ ๊ธฐ๋ณธํŽธ์—์„œ JPA๋ฅผ ๋‹ค๋ค˜๋“ฏ์ด ํ…Œ์ด๋ธ” ์ƒ์„ฑ, ๋ณ€๊ฒฝ, ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.
    3. ์ •์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ๊ฐ์ฒด์— ์ง‘์ค‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์ 
    1. ์ผ๋ฐ˜์ ์ธ SQL Query๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ณด๋‹ค ์„ฑ๋Šฅ์ ์ธ ์ด์Šˆ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฐ์ดํ„ฐ ์†์‹ค์— ๋Œ€ํ•ด ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ํŽธํ•œ๋งŒํผ ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ •์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทธ๋งŒํผ ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋Š” ๋ฐ˜๋ฉด ๊ฐœ๋ฐœ์€ ์กฐ๊ธˆ ์–ด๋ ค์›Œ์ง€๊ณ  ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๊ทธ๋งŒํผ ์„ฑ๋Šฅ์˜ ๊ฐ์†Œ๋Š” ์กฐ๊ธˆ์€ ๊ฐ์•ˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HQL์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๊ธฐ๋ณธํŽธ์—์„œ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์œผ๋กœ CRUD๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•˜์—ฌ Create, Read, Update, Delete๋ฅผ ๋ณ„๋„์˜ ์ฟผ๋ฆฌ ์—†์ด ์‰ฝ๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ์š”. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–จ ๋•Œ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ์š”?

์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. (์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Kotlin ์ฝ”๋“œ๋งŒ์„ ๋‹ค๋ฃฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

1
2
3
4
5
6
7
8
9
10
11
12
package xyz.neonkid.jpaexample.Model

import java.io.Serializable
import javax.persistence.*

@Entity
@Table(name = "items")
data class Item(@Column(name = "name", updatable = false, nullable = false) val name: String, @Column(name = "price", updatable = false, nullable = false) val price: Int) : Serializable {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false, nullable = false)
val Id: Long? = null
}
1
2
3
4
5
6
7
package xyz.neonkid.jpaexample.Model

import org.springframework.data.repository.CrudRepository
import org.springframework.stereotype.Repository

@Repository
interface ItemRepository : CrudRepository<Item, Long>

๊ธฐ๋ณธํŽธ์—์„œ ์ด ๋‘๊ฐ€์ง€ ์ฝ”๋“œ๋งŒ์„ ๊ฐ€์ง€๊ณ  REST API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Item ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์—ฌ๊ธฐ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ ๋ง๊ณ  ๋‚˜๋งŒ์˜ ์กฐ๊ฑด์„ ๊ฑธ์–ด์ค˜์„œ ๋‚˜๋งŒ์˜ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋– ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„๊นŒ์š”?

์˜ˆ๋ฅผ ๋“ค์ž๋ฉด, ์ง€๊ธˆ์€ GET ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ Items ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ๋” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŠน์ • ์•„์ดํ…œ ํ•œ ๊ฐ€์ง€๋งŒ์„ ๊ณ ๋ฅด๊ณ  ์‹ถ๋‹ค๋ฉด? ๋ฌผ๋ก  GET ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด์„œ ๋ชจ๋“  ์•„์ดํ…œ ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ํด๋ผ์ด์–ธํŠธ ๋‹จ์—์„œ ์ƒ‰์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ํ…Œ์ด๋ธ” ๋‚ด์— item์ด 10,000๊ฐœ, 100,000๊ฐœ ์žˆ๋Š” ๋ฌด์ˆ˜ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ HQL์„ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์ด์–ด์„œ ์ฝ์œผ์‹œ๋ ค๋ฉด ์•„๋ž˜์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด์ฃผ์„ธ์š”.


... ๊ณ„์† ์ฝ๊ธฐ


๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments