JPA - 1

์ด๋ฆฌยท2022๋…„ 1์›” 19์ผ
0

๐Ÿš€ ORM๊ณผ JPA

  • ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์ด, ์ธ์Šคํ„ด์Šค์™€ row(record-tuple)๊ฐ€ ์œ ์‚ฌํ•œ ์ ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ฐ์ฒด์ง€ํ–ฅ๊ณผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋งคํ•‘ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.
  • ORM์„ java์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ŠคํŽ™์ด JPA์ด๋‹ค.
  • JPA ์ŠคํŽ™์˜ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›Œํฌ๋“ค ์ค‘ spring boot๋Š” Hiberbate ๊ตฌํ˜„์ฒด๋ฅผ ์ด์šฉํ•œ๋‹ค.

๐Ÿš€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค

package org.zerock.ex2.entity;

@Entity
@Table(name = "tbl_memo")
@ToString
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class Memo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long mno;

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

์—”ํ‹ฐํ‹ฐ๋ฅผ ์œ„ํ•œ ํด๋ž˜์Šค, JPA๋กœ ๊ด€๋ฆฌ๋˜๋Š” ์ธ์Šคํ„ด์Šค์ด๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.


  • @Table

@Entity์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋˜์–ด ํ…Œ์ด๋ธ” ์ด๋ฆ„, ์ธ๋ฑ์Šค ๋“ฑ์˜ ์„ค์ •์„ ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค.


  • @Id : PK์— ํ•ด๋‹นํ•˜๋ฉฐ, entityํด๋ž˜์Šค๋ผ๋ฉด ๊ผญ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  • @GeneratedValue(strategy = GenerationType.IDENTITY)

pk ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•  ๋•Œ ์–ด๋–ค 'ํ‚ค ์ƒ์„ฑ ์ „๋žต'์œผ๋กœ ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.

IDENTITY : ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ํ‚ค์ƒ์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.(mysql & mariadb๋Š” auto_increment)


  • @Column(length = 200,nullable = false)

์นผ๋Ÿผ์— ์ •๋ณด๋ฅผ ์ œ๊ณตํ•œ๋‹ค(๊ธฐ๋ณธ๊ฐ’,null,๊ธธ์ด,์ด๋ฆ„ ๋“ฑ)

  • @Transient : ํ…Œ์ด๋ธ”์— ์ปฌ๋Ÿผ์œผ๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์‹ถ์€ ํ•„๋“œ์— ์‚ฌ์šฉ

๐Ÿš€ JpaRepository

  • JpaRepository๋ฅผ ์ƒ์†ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑ๋งŒ ํ•˜์—ฌ๋„ ์Šคํ”„๋ง์˜ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.(Non-scan)
package org.zerock.ex2.repository;

public interface MemoRepository  extends JpaRepository<Memo,Long> {
//์—”ํ‹ฐํ‹ฐํƒ€์ž…๊ณผ @Id์˜ ํƒ€์ž…์„ ์ง€์ •
}

  • ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค
@SpringBootTest
public class MemoRepositoryTests {

    @Autowired
    MemoRepository memoRepository;
    
    //์•„๋ž˜ ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ๋“ค์€ ์ด ๋ถ€๋ถ„์— ์‚ฝ์ž…๋  ์˜ˆ์ •.    
    
}

  • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ - insert
    @Test
    public void testInsertDummies(){
        IntStream.rangeClosed(1,10).forEach(i->{
            Memo memo = Memo.builder().memoText("sample..."+i).build();
            memoRepository.save(memo);
        });
    }
  1. save( )๋Š” ์—†์œผ๋ฉด insert, ์žˆ์œผ๋ฉด update๋กœ ๋™์ž‘ํ•œ๋‹ค.
  2. ๋กœ๊ทธ์—์„œ Hibernate๊ฐ€ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ตฌ๋ฌธ์„ ํ™•์ธํ•˜๋ฉฐ ๊ณต๋ถ€ํ•  ๊ฒƒ.

  • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ - select
    @Test
    public void testSelect(){
        Long mno = 10L;

        Optional<Memo> result = memoRepository.findById(mno);

        if(result.isPresent()){
            Memo memo = result.get();
            System.out.println(memo);
        }
    }
  1. null ์ฒดํฌ๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•ด Optional ํƒ€์ž…์œผ๋กœ ๋‚˜์˜จ๋‹ค.

  2. getOne( )๊ณผ ๋น„๊ตํ•˜๋ ค๊ณ  ํ–ˆ์ง€๋งŒ getOne์ด deprecated๋ผ์„œ ์ œ์™ธํ•˜์˜€๋‹ค.


  • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ - update
    @Test
    public void testUpdate(){
        Memo memo = Memo.builder().mno(10L).memoText("update...").build();
        System.out.println(memoRepository.save(memo));      
    }
  1. ์Šคํ‚ค๋งˆ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” @Id๋ฅผ ์ฃผ๋ฉด save๋Š” update๋กœ ๋™์ž‘ํ•œ๋‹ค.
Hibernate: 
    select
        memo0_.mno as mno1_0_0_,
        memo0_.memo_text as memo_tex2_0_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno=?
Hibernate: 
    update
        tbl_memo 
    set
        memo_text=? 
    where
        mno=?
  1. ์—†๋Š” ๊ฐ’์„ ์ฃผ๊ณ  ์‹คํ–‰ํ•˜๋ฉด insert๋กœ ๋™์ž‘ํ•œ๋‹ค.
Hibernate: 
    select
        memo0_.mno as mno1_0_0_,
        memo0_.memo_text as memo_tex2_0_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno=?
Hibernate: 
    insert 
    into
        tbl_memo
        (memo_text) 
    values
        (?)

  • ํ…Œ์ŠคํŠธ ๋ฉ”์„œ๋“œ - delete
    • ์—†์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๋ฐœ์ƒ์‹œ์ผœ ๋ฒ„๋ฆฐ๋‹ค...
    @Test
    public void testDelete(){
        Long mno = 11l;

        memoRepository.deleteById(mno);
    }
  1. ์žˆ๋Š” @Id
Hibernate: 
    select
        memo0_.mno as mno1_0_0_,
        memo0_.memo_text as memo_tex2_0_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno=?
Hibernate: 
    delete 
    from
        tbl_memo 
    where
        mno=?
  1. ์—†๋Š” @Id
Hibernate: 
    select
        memo0_.mno as mno1_0_0_,
        memo0_.memo_text as memo_tex2_0_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno=?

No class org.zerock.ex2.entity.Memo entity with id 10 exists!
profile
์–ด์ œ๋ณด๋‹ค ๋‚˜์€ ์‚ฌ๋žŒ์ด ๋˜์ž

0๊ฐœ์˜ ๋Œ“๊ธ€