์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์„ฑํ™” ํ•ด์ฃผ์„ธ์š”

JPA ์ •๋ฆฌ

 ·  โ˜• 4 min read · ๐Ÿ‘€... ์กฐํšŒ์ˆ˜

JPA๋ž€??

Java ์–ธ์–ด๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ™์€ ์˜์† ๊ณ„์ธต์„ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์ŠคํŽ™

ORM๊ณผ JPA

ORM

  • ๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ๊ด€๋ จ์ด ์žˆ์Œ
  • ‘๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ณด์กดํ•˜๋Š” ๊ธฐ์ˆ ’
  • ‘๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๊ด€๊ณ„ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์œผ๋กœ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ฐœ๋…’
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ํ‹€์„ ๋งŒ๋“ ๋‹ค๋Š” ์˜๋ฏธ์—์„œ ํด๋ž˜์Šค์™€ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•จ
    1
    2
    3
    4
    5
    
      public class Member{
          private String id;
          private String pw;
          private String name;
      }
    
    1
    2
    3
    4
    
      Member
      id -> varchar2(50)
      pw -> varchar2(50)
      name -> varchar2(100)
    
  • ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์ด ์œ ์‚ฌํ•˜๋“ฏ์ด ‘์ธ์Šคํ„ด์Šค’์™€ ‘Row’๋„ ์ƒ๋‹นํžˆ ์œ ์‚ฌํ•จ
    • ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ํด๋ž˜์Šค์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ธ์Šคํ„ด์Šค์— ๋ณด๊ด€
    • ํ…Œ์ด๋ธ”์—์„œ๋Š” ํ•˜๋‚˜์˜ ‘Row’์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ
  • ๊ด€๊ณ„์™€ ์ฐธ์กฐ๋ผ๋Š” ์˜๋ฏธ๋„ ๋งค์šฐ ์œ ์‚ฌํ•จ
    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ํ†ตํ•˜์—ฌ ๊ตฌ์กฐ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œํ˜„
    • ๊ฐ์ฒด์ง€ํ–ฅ์—์„œ๋Š” ์ฐธ์กฐ๋ฅผ ํ†ตํ•˜์—ฌ ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค๊ณผ ์–ด๋–ค ๊ด€๊ณ„๋ฅผ ๋งบ๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ‘œํ˜„

JPA

  • ‘Java Persistence API"์˜ ์•ฝ์–ด
  • ORM์„ Java์–ธ์–ด์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ์ŠคํŽ™
  • ORM์ด ๋” ์ƒ์œ„์˜ ๊ฐœ๋…์ด๋‹ค.
  • JPA๋Š” ๋‹จ์ˆœํ•œ ์ŠคํŽ™์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ŠคํŽ™์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋งˆ๋‹ค ํšŒ์‚ฌ์˜ ์ด๋ฆ„์ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ด๋ฆ„์ด ๋‹ค๋ฅด๊ฒŒ ๋œ๋‹ค.
  • ๊ทธ์ค‘์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๊ฒƒ์ด Hibernate

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์™€ JpaRepository

Spring Data JPA๊ฐ€ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๊ฒƒ์€ ๋‹จ์ง€ ๋‘ ์ข…๋ฅ˜์˜ ์ฝ”๋“œ์ด๋‹ค.

  • JPA๋ฅผ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜๋Š” ๊ฐ์ฒด(์ดํ•˜ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด)๋ฅผ ์œ„ํ•œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค
  • ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋“ค์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ Repository
    • repository๋Š” Spring Data JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์„ค๊ณ„ํ•˜๋Š”๋ฐ ์Šคํ”„๋ง ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.

์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
    @Entity
    @Table(name = "tbl_memo")
    @ToString
    @Getter
    @Builder
    @AllArgsConstructor
    @NoArgsConstructor
    public class Memo{
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long mno;

        @Coulmn(length = 200, nullable = false)
        private String memoText;
    }
  • @Entity

    • ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ @Entity๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•ด์•ผํ•œ๋‹ค.
    • ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ
    • ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด JPA๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธ
  • @Table

    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ƒ์—์„œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ์–ด๋– ํ•œ ํ…Œ์ด๋ธ”๋กœ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
    • @Table(name = “") ์ด๋Ÿฐ ํ˜•์‹์œผ๋กœ ์ด๋ฆ„๋„ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋‹จ์ˆœํžˆ ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธ๋ฑ์Šค ๋“ฑ์„ ์ƒ์„ฑํ•˜๋Š” ์„ค์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • @Id, @GeneratedValue

    • @Entity๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” PK์— ํ•ด๋‹นํ•˜๋Š” ํŠน์ • ํ•„๋“œ๋ฅผ @Id๋กœ ์ง€์ •ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.
    • @Id๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•˜๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด @GeneratedValue๋ผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • (strategy = GenerationType.IDENTITY) ํ‚ค ์ƒ์„ฑ ์ „๋žต์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.
      • AUTO - JPA ๊ตฌํ˜„์ฒด๊ฐ€ ์ƒ์„ฑ ๋ฐฉ์‹์„ ๊ฒจ๋ ‚
      • IDENTITY - ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ‚ค ์ƒ์„ฑ์„ ๊ฒฐ์ •
      • SEQUENCE - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ sequence๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‚ค๋ฅผ ์ƒ์„ฑ, @SequenceGenerator์™€ ๊ฐ™์ด ์‚ฌ์šฉ
      • TABLE - ํ‚ค ์ƒ์„ฑ ์ „์šฉ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์„œ ํ‚ค ์ƒ์„ฑ, @TableGenerator์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ
  • @Coulmn

    • ์ถ”๊ฐ€์ ์ธ ํ•„๋“œ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ™œ์šฉํ•œ๋‹ค.
    • nullable, name, length ๋“ฑ์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์นผ๋Ÿผ์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณต
    • columnDefinition์„ ์ด์šฉํ•˜์—ฌ ๊ธฐ๋ณธ๊ฐ’๋„ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • @Builder

    • ๊ฐ์ฒด ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
    • @AllArgsConstructor์™€ @NoArgsConstructor๋ฅผ ๊ฐ™์ด ์‚ฌ์šฉํ•ด์•ผ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Œ

JpaRepository ์ธํ„ฐํŽ˜์ด์Šค

Sprin Date JPA์—๋Š” ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด์„œ JPA ๊ด€๋ จ ์ž‘์—…์„ ๋ณ„๋„์˜ ์ฝ”๋“œ ์—†์ด ์ฒ˜๋ฆฌํ• ์ˆ˜ ์žˆ๊ฒŒ ์ง€์›ํ•œ๋‹ค. ๊ทธ ์ค‘์˜ ํ•˜๋‚˜๊ฐ€ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.
์ผ๋ฐ˜์ ์ธ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” CrudRepository๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด JpaRepository๋ฅผ ์ด์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” JpaRepository๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

1
2
3
    public interface SampleRepository extends JpaRepository<Memo,Long> {

    }
  • JpaRepository๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ํƒ€์ž…์ •๋ณด(Memo ํด๋ž˜์Šค ํƒ€์ž…)์™€ @Id์˜ ํƒ€์ž…์„ ์ง€์ •ํ•œ๋‹ค.
  • ์œ„ ์ฒ˜๋Ÿผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ์„ ์–ธ๋งŒ์œผ๋กœ๋„ ์ž๋™์œผ๋กœ ์Šคํ”„๋ง์˜ bean์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.
  • CRUD
    • insert ์ž‘์—… : save(์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด)
    • select ์ž‘์—… : findById(ํ‚ค ํƒ€์ž…), getOne(ํ‚ค ํƒ€์ž…)
    • update ์ž‘์—… : save(์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด)
    • delete ์ž‘์—… : deleteById(ํ‚ค ํƒ€์ž…), delete(์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด)
    • save -> JPA์˜ ๊ตฌํ˜„์ฒด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์ƒ์—์„œ ๊ฐ์ฒด๋ฅผ ๋น„๊ตํ•˜๊ณ  ์—†๋‹ค๋ฉด insert, ์กด์žฌํ•œ๋‹ค๋ฉด update๋ฅผ ๋™์ž‘์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฉ์–ธ(dialect)

  • JPA๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†์ ์ด์ง€ ์•Š์€ ๊ธฐ์ˆ 
  • ๊ฐ๊ฐ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” SQL ๋ฌธ๋ฒ•๊ณผ ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๋””
    • ๊ฐ€๋ณ€ ๋ฌธ์ž : MySQL์€ VARCHAR, ORACLE์€ VARCHAR2
    • ๋ฌธ์ž์—ด์„ ์ž๋ฅด๋Š” ํ•จ์ˆ˜ : SQLํ‘œ์ค€์€ SUBSTRING(), ORACLE์€ SUBSTR()
    • ํŽ˜์ด์ง• : MySQL์€ LIMIT, ORACLE์€ ROWNUM
  • ๋ฐฉ์–ธ : SQL ํ‘œ์ค€์„ ์ง€ํ‚ค์ง€ ์•Š๊ฑฐ๋‚˜ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ์˜ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ
  • JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฉ์–ธ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ORACLE -> MYSQL ์ด๋‚˜ ๊ทธ๋ฐ˜๋Œ€๋กœ ์ „ํ™˜์ด ์—„์ฒญ ๋น ๋ฅด๋‹ค…
๊ณต์œ ํ•˜๊ธฐ

brinst
๊ธ€์“ด์ด
brinst
Backend Developer

๋ชฉ์ฐจ