nonneng.ee
Daeun-rithm
nonneng.ee
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (51)
    • Back-end (17)
      • Server (3)
      • Database (3)
      • Spring (9)
      • Node.js (1)
    • Book (1)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (0)
      • ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„ (1)
    • Algorithm (1)
      • Greedy, Implementation (6)
      • Dynamic Programming (5)
      • Data Structure (3)
      • Sorting (2)
      • Concept (1)
    • TIL (11)
    • Software (3)
      • Design Pattern (3)
    • Computer Science (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • Spring
  • ๋ฐฑ์ค€
  • ์—๋Ÿฌ
  • ์ปดํŒŒ์ผ์„ค์น˜
  • ์•„์ดํ…œ9
  • ์•„์ดํ…œ6
  • Restful API
  • ๋ธŒ๋ฃจํŠธํฌ์Šค
  • Java
  • ์•„์ดํ…œ8
  • ๊ตฌํ˜„
  • ์ˆ˜๋™์„ค์น˜
  • ์ž๋ฐ”
  • APM
  • ํŒŒ์ด์ฌ
  • Postman
  • JPA
  • ์†Œ์Šค์„ค์น˜
  • ์•„์ดํ…œ 23
  • ๊ตฌ๋™์›๋ฆฌ
  • ์•„์ดํ…œ 25
  • node js
  • ์šฐ๋ถ„ํˆฌ
  • ์„œ๋ฒ„
  • MySQL
  • DP
  • jwt
  • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”
  • API
  • ๊ฐ€์ƒ๋จธ์‹ 

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
nonneng.ee

Daeun-rithm

[Spring/Data JPA] ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ
Back-end/Spring

[Spring/Data JPA] ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋Šฅ

2022. 7. 26. 18:09

๐Ÿ˜Š ์ˆœ์ˆ˜ JPA ๊ธฐ๋ฐ˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋งŒ๋“ค๊ธฐ

โ–ช ์ˆœ์ˆ˜ jpa ๊ธฐ๋ฐ˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ

@Repository
public class MemberJpaRepository {
    @PersistenceContext
    private EntityManager em;

    public Member save(Member member) {
        em.persist(member);
        return member;
    }

    public void delete(Member member) {
        em.remove(member);
    }

    public List<Member> findAll() {
        return em.createQuery("select m from Member m", Member.class)
                .getResultList();
    }

    public Optional<Member> findById(Long id) {
        Member member = em.find(Member.class, id);
        return Optional.ofNullable(member);
    }

    public long count() {
        return em.createQuery("select count(m) from Member m", Long.class)
                .getSingleResult();
    }

    public Member find(Long id) {
        return em.find(Member.class, id);
    }
}

โ–ช test code

   @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberJpaRepository.save(member);
        Member findMember = memberJpaRepository.find(savedMember.getId());
        assertThat(findMember.getId()).isEqualTo(member.getId());
        assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        assertThat(findMember).isEqualTo(member); //JPA ์—”ํ‹ฐํ‹ฐ ๋™์ผ์„ฑ ๋ณด์žฅ
    }

   @Test
   public void basicCRUD() {
       Member member1 = new Member("member1");
       Member member2 = new Member("member2");
       memberJpaRepository.save(member1);
       memberJpaRepository.save(member2);

        //๋‹จ๊ฑด ์กฐํšŒ ๊ฒ€์ฆ
        Member findMember1 = memberJpaRepository.findById(member1.getId()).get();
        Member findMember2 = memberJpaRepository.findById(member2.getId()).get();
        assertThat(findMember1).isEqualTo(member1);
        assertThat(findMember2).isEqualTo(member2);

        //๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๊ฒ€์ฆ
        List<Member> all = memberJpaRepository.findAll();
        assertThat(all.size()).isEqualTo(2);

        //์นด์šดํŠธ ๊ฒ€์ฆ
        long count = memberJpaRepository.count();
        assertThat(count).isEqualTo(2);

        //์‚ญ์ œ ๊ฒ€์ฆ
        memberJpaRepository.delete(member1);
        memberJpaRepository.delete(member2);
        long deletedCount = memberJpaRepository.count();
        assertThat(deletedCount).isEqualTo(0);
    }
}

 

๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์„ค์ •

์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์ฒด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ , ์Šคํ”„๋ง์ด ๋งŒ๋“ค์–ด์„œ ์ฃผ์ž…ํ•œ๋‹ค.

public interface TeamRepository extends JpaRepository<Team, Long>{
}

→ JpaRepository๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด @Repository ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ spring data jpa๊ฐ€ ์ธ์‹ํ•˜์—ฌ ๊ตฌํ˜„์ฒด๋ฅผ ์ฃผ์ž…ํ•œ๋‹ค.

 

๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ์ ์šฉ

โ–ช spring data jpa ์ ์šฉ test code

   @Test
    public void testMember() {
        Member member = new Member("memberA");
        Member savedMember = memberRepository.save(member);
        Member findMember = memberRepository.findById(savedMember.getId()).get();
        Assertions.assertThat(findMember.getId()).isEqualTo(member.getId());
        Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
        Assertions.assertThat(findMember).isEqualTo(member); 
    }

    @Test
    public void basicCRUD() {
      Member member1 = new Member("member1");
      Member member2 = new Member("member2");
      memberRepository.save(member1);
      memberRepository.save(member2);

      //๋‹จ๊ฑด ์กฐํšŒ ๊ฒ€์ฆ
      Member findMember1 = memberRepository.findById(member1.getId()).get();
      Member findMember2 = memberRepository.findById(member2.getId()).get();
      assertThat(findMember1).isEqualTo(member1);
      assertThat(findMember2).isEqualTo(member2);

      //๋ฆฌ์ŠคํŠธ ์กฐํšŒ ๊ฒ€์ฆ
      List<Member> all = memberRepository.findAll();
      assertThat(all.size()).isEqualTo(2);

      //์นด์šดํŠธ ๊ฒ€์ฆ
      long count = memberRepository.count();
      assertThat(count).isEqualTo(2);

      //์‚ญ์ œ ๊ฒ€์ฆ
      memberRepository.delete(member1);
      memberRepository.delete(member2);

      long deletedCount = memberRepository.count();
      assertThat(deletedCount).isEqualTo(0);
   }
}

์šฐ์™€!

 

๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„์„

spring data jpa๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€ ๊ตฌํ˜„์ฒด๊ฐ€ ์—†๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์กด์žฌํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ณตํ†ต ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•ด์ค€๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ์˜ˆ๋ฅผ๋“ค์–ด List findByUsername(String username); ์ด๋ ‡๊ฒŒ Username์ด ๋“ค์–ด๊ฐ„ ์ˆœ๊ฐ„๋ถ€ํ„ฐ ๋„๋ฉ”์ธ์— ํŠนํ™”๋œ ๊ธฐ๋Šฅ์ด๋ผ ๊ณตํ†ต์œผ๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋Š”๋ฐ, ์ด๋Ÿฐ ์กฐ๊ฑด๋“ค์€ ์ฟผ๋ฆฌ๋ฉ”์†Œ๋“œ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

[์‹ค๋ฌด ๊ฟ€ํŒ]

โ–ช ์‹ค๋ฌด์—์„œ๋Š” ๊ฐ€๊ธ‰์  ์—”ํ‹ฐํ‹ฐ์— @Setter๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.

โ–ช ํ…Œ์ด๋ธ”์€ pk๋ฅผ _id๋กœ ๋งคํ•‘ํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ด๋ธ”๋ช…_id๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

โ–ช mappedBy๋Š” fk๊ฐ€ ์—†๋Š”์ชฝ์— ๊ฑธ์–ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โ–ช @ManyToOne(fetch = FetchType.LAZY)

    → ์‹ค๋ฌด์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ LAZY ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์ง€์—ฐ ๋กœ๋”ฉ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•œ๋‹ค.

 

[์Šคํ”„๋ง ์ง€์‹]

โ–ช @NoArgsConstructor(access = AccessLevel.PROTECTED)

   → jpa๋Š” ๋””ํดํŠธ ์ƒ์„ฑ์ž๊ฐ€ ํ•„์š”ํ•œ๋ฐ, access level์„ protected๊นŒ์ง€ ์—ด์–ด๋‘์–ด์•ผ ํ•œ๋‹ค.

โ–ช @ToString์€ ๊ฐ€๊ธ‰์  ์—ฐ๊ด€๊ด€๊ณ„ ์—†๋Š” ๋‚ด๋ถ€ ํ•„๋“œ๋งŒ ์‚ฌ์šฉ

   → ๋ฌดํ•œ๋ฃจํ”„์— ๋น ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

'Back-end > Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring/fairer] ๋ฐ˜๋ณต ๊ธฐ๋Šฅ api ์„ค๊ณ„  (0) 2023.01.20
[Spring/Data JPA] ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •  (0) 2022.05.26
[Spring] ์Šคํ”„๋ง Bean๊ณผ ์˜์กด๊ด€๊ณ„ - ์ปดํฌ๋„ŒํŠธ ์Šค์บ” & ์ž๋™ ์˜์กด๊ด€๊ณ„ vs ์Šคํ”„๋ง Bean ์ง์ ‘ ๋“ฑ๋ก  (0) 2022.03.04
    'Back-end/Spring' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [Spring/fairer] ๋ฐ˜๋ณต ๊ธฐ๋Šฅ api ๊ฐœ๋ฐœ - ์กฐํšŒ
    • [Spring/fairer] ๋ฐ˜๋ณต ๊ธฐ๋Šฅ api ์„ค๊ณ„
    • [Spring/Data JPA] ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์„ค์ •
    • [Spring] ์Šคํ”„๋ง Bean๊ณผ ์˜์กด๊ด€๊ณ„ - ์ปดํฌ๋„ŒํŠธ ์Šค์บ” & ์ž๋™ ์˜์กด๊ด€๊ณ„ vs ์Šคํ”„๋ง Bean ์ง์ ‘ ๋“ฑ๋ก
    nonneng.ee
    nonneng.ee

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”