๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’Š Java & Kotlin & Spring/- spring framework +

[Spring & Springboot-JPA] JPA๋ฅผ ์ด์šฉํ•œ CRUD ๋ฉ”์„œ๋“œ ์ž‘์„ฑํ•˜๊ธฐ - 1 (Entity ์„ค์ • ๋ฐ Repository ์„ค์ •)

by Wonit 2020. 1. 27.

ํ•ด๋‹น ๊ธ€์€ 1ํ™” 2ํ™”(https://wonit.tistory.com/128?category=738059)๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ํ•™์Šต์„ ์œ„ํ•ด ๋ชจ๋‘ ์ฝ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ ค์š” :)


CRUD๋ž€?

CRUD๋Š” ์กด์žฌํ•˜๋Š” ๊ฑฐ์˜ ๋Œ€๋ถ€๋ถ„์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธฐ๋ณธ์  ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์„ ๋œปํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ๋งŒ ์„ค๋ช…ํ•˜๋ฉด ๋ง์ด ๋„ˆ๋ฌด ์–ด๋ ค์šฐ๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋ง ํ•ด์„œ ๋กœ๊ทธ์ธํ•˜๊ณ , ๊ธ€์„ ์˜ฌ๋ฆฌ๊ณ , ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ฉฐ, ๋‚ด๊ฐ€ ์ฐœํ•œ ๋ชฉ๋ก์„ ์‚ญ์ œํ•˜๋Š” ๋“ฑ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์ฒ˜๋ฆฌ์˜ ๊ฐ€์žฅ ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ์ดˆ์„์„ ๋œปํ•œ๋‹ค.

C
  • Create
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ ๋˜๋Š” ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
  • SQL์˜ insert์— ํ•ด๋‹นํ•œ๋‹ค.
R
  • Read
  • ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
  • SQL์˜ select์— ํ•ด๋‹นํ•œ๋‹ค.
U
  • Update
  • ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ์ƒˆ๋กญ๊ฒŒ ๊ฐฑ์‹ ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
  • SQL์˜ update์— ํ•ด๋‹นํ•œ๋‹ค.
D
  • Delete
  • ์ž์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.
  • SQL์˜ delete์— ํ•ด๋‹นํ•œ๋‹ค.

 

MVC์˜ Model๊ณผ Entity

JPA๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Data๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด, Model๊ณผ Entity์™€ JpaRepository์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

Model of MVC

MVC ๋””์ž์ธ ํŒจํ„ด์—์„œ ๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ ์„œ๋น„์Šค์˜ ์ •๋ณด, ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ ์ •๋ณด์˜ ๊ฐ€๊ณต์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋œ๋‹ค.

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

Entity of JPA

JPA๋Š” ์ด Entity๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น Entity๋ฅผ ํ† ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ฒ˜๋ฆฌ ๋ฐ ๊ฐ€๊ณตํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋ง ํ•ด์„œ Entity๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Table ๋ช…์„ ๋œปํ•œ๋‹ค.

 

์—”ํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ Entity๋ผ๋Š” ๊ฒƒ์ž„์„ Spring์—๊ฒŒ ์•Œ๋ ค์ค˜์•ผ ํ•˜๋Š”๋ฐ ๊ทธ ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ @Entity์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ชจ๋ธ ํด๋ž˜์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž. ํ•ด๋‹น ๋ชจ๋ธ ํด๋ž˜์Šค์—๋Š” ์‚ฌ์šฉ์ž์—๋Œ€ํ•œ ๊ธฐ๋ณธ์  ์ •๋ณด๊ฐ€ ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค.
public class User {
    private Long id;
    private String account;
    private String password;
    private String name;
}

 

๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋Ÿฌํ•œ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, ์ด ํด๋ž˜์Šค์˜ ์ •๋ณด๋Š” Mysql์—๋„ ๋˜‘๊ฐ™์ด ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค.

 

 

๊ทธ๋Ÿผ ์ด์ œ Entity๋กœ ๋“ฑ๋ก์„ ํ•ด๋ณด์ž.

 

ํด๋ž˜์Šค๋ฅผ ์—”ํ‹ฐํ‹ฐ๋กœ ๋“ฑ๋ก์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ธ ๊ฐ€์ง€๋งŒ ํ™•์ธํ•ด๋ณด์ž.

 

  1. DB ํ…Œ์ด๋ธ” ์ด๋ฆ„๊ณผ Entity ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ๊ฐ™์€๊ฐ€?

๊ผญ ๊ฐ™์•„์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ฐ™๋‹ค๋ฉด @Entity(name="user")์—์„œ name ๋ถ€๋ถ„์„ ๋นผ๊ณ  ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. @Entity

  1. Primary Key๊ฐ€ ์กด์žฌํ•˜๋Š”๊ฐ€?

primary key๊ฐ€ ์žˆ๋‹ค๋ฉด (์•„๋งˆ๋„ id ๊ฐ’์ผํ…๋ฐ), ํ•ด๋‹น ํ•„๋“œ์— @Id ์–ด๋…ธํ…Œ์ด์…˜๊ณผ @GeneratedValue(strategy = GenerationType.IDENTITY) ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์„œ Mysql ์ „๋žต์„ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์•Œ๋ ค์ฃผ์ž.

  1. DB ํ…Œ์ด๋ธ”์˜ ํ•„๋“œ ๋ช…๊ณผ Entity ํด๋ž˜์Šค์˜ ํ•„๋“œ ๋ช…์ด ๊ฐ™์€๊ฐ€?

๋งŒ์•ฝ ๋‹ค๋ฅด๋‹ค๋ฉด @Column(name = DB์— ์žˆ๋Š” ํ•„๋“œ ์ด๋ฆ„) ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งž์ถฐ์ฃผ๊ณ  ์—†์œผ๋ฉด ์ƒ๋žตํ•˜์ž.

์ด์ œ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋๋Š”๋ฐ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋”ฑ ํ•˜๋‚˜. getter/setter์„ ์œ„ํ•ด์„œ ๋กฌ๋ณต์„ ์‚ฌ์šฉํ•˜์ž. (@Data์–ด๋…ธํ…Œ์ด์…˜๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.
@Entity
@Data
public class User {
    private Long id;
    private String account;
    private String password;
    private String name;
}

CRUD๋ฅผ ์œ„ํ•œ ์ค€๋น„๋ฅผ ๋งˆ์ณ๋ณด์ž.

์•„๊นŒ ๋‚ด๊ฐ€ JPA๋ฅผ ์œ„ํ•ด์„œ ์„ธ ๊ฐ€์ง€๋ฅผ ์•Œ์•„์•ผ ํ•œ๋‹ค ํ–ˆ๋‹ค.

  1. Model
  2. Entity
  3. JpaRepository

1๋ฒˆ๊ณผ 2๋ฒˆ์€ ํ–ˆ๊ณ  ๋งˆ์ง€๋ง‰ Repository์— ๋Œ€ํ•ด์„œ๋งŒ ์•Œ๋ฉด ์ง„์งœ Jpa๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์กฐ๊ธˆ๋งŒ ์ฐธ์•„๋ณด์ž..

 

Repository์˜ ์ •ํ™•ํ•œ ์‚ฌ์šฉ์€ DAO๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ธ๋ฐ JpaRepository๋Š” JPA์˜ ๊ตฌํ˜„์ฒด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?

 

๋ฐ”๋กœ ๋ฐ์ดํ„ฐ์˜ ํšจ์œจ์ ์ธ ์ €์žฅ๊ณผ ์ฒ˜๋ฆฌ ๋ฐ ๊ฐ€๊ณต์ด๋ผ๊ณ  ์•„๊นŒ ์ด์•ผ๊ธฐ ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋ฐ์ดํ„ฐ์˜ ํšจ์œจ์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ Jpa๋Š” ๊ธฐ๋ณธ์ ์ธ CRUD๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š” JpaRepository๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๊ณ  ์‚ฌ์šฉ์ž๋“ค์€ ๊ทธ ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์†ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์ •๋ง ๋ณ„๊ฒŒ ์—†๋‹ค.

 

๋ฃจํŠธ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ repository ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์‚ฌ์šฉํ•  Repository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๋ช…์‹ฌํ•˜์ž! ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

 

  1. UserRepository๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ Repository์ž„์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด์„œ @Repository ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

  1. ์ƒ์†์„ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ, Generic ํƒ€์ž…์œผ๋กœ๋Š” ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ์™€ ์—”ํ‹ฐํ‹ฐ์˜ PK์˜ ์ž๋ฃŒํ˜•์„ ์ ์–ด์ค€๋‹ค.

 

 

์ด์ œ ์ค€๋น„๊ฐ€ ๋๋‚ฌ๋‹ค. ๋‹ค์Œ ํŽธ์—์„œ๋Š” ์ด๋ฒˆ์— ํ–ˆ๋˜ ๊ฒƒ๋“ค์„ ์ด์šฉํ•ด์„œ ์‹ค์ œ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ ์˜ˆ์ •์ด๋‹ค.

๋Œ“๊ธ€