MapleStory Cookie With Halo

๐Ÿƒ Spring/๐Ÿƒ Spring Boot

[SpringBoot][Gradle][JPA]์ž…๋ฌธ. ์„ค์ •๋ถ€ํ„ฐ ์‚ฌ์šฉ๊นŒ์ง€.

๋‰ด์ด NUEY 2025. 1. 10. 00:35
๋ฐ˜์‘ํ˜•

 

JPA
Java Persistence API

 

 

  • ๊ธฐ์กด์˜ ๋ฐ˜๋ณต ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ SQL ์ฟผ๋ฆฌ๊นŒ์ง€ JPA๊ฐ€ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‹คํ–‰ํ•ด์ค€๋‹ค.

  • SQL๊ณผ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ์˜ ์„ค๊ณ„ → ๊ฐ์ฒด ์ค‘์‹ฌ์˜ ์„ค๊ณ„๋กœ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ „ํ™˜.

  • ORM Object Relational Mappping. ๊ฐ์ฒด์™€ ๋งคํ•‘ํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.

  • ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ JPA ์ฑ…์„ ๋ฐœ๊ฐ„ํ•œ ์ดํ›„๋กœ ์šฐ๋ฆฌ ๋‚˜๋ผ์—๋„ ๋ณด๊ธ‰์ด ๋งŽ์ด ๋œ ์ถ”์„ธ๋‹ค.

    ํ•ด์™ธ์—์„œ๋Š” JPA๊ฐ€ ๋” ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ถ”์„ธ์ด๋‹ค.

 


 

ํ™˜๊ฒฝ์„ค์ •

 

  1. build.gradle
    •  implementation 'org.springframework.boot:spring-boot-starter-data-jpa'  ์ถ”๊ฐ€.
    • jdbc ์‚ญ์ œ.

    • ์ถ”๊ฐ€ํ•˜๋ฉด gradle์— jpa์™€ hibernate๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒŒ ํ™•์ธ๋œ๋‹ค.
      ๐ŸŒŸ jpa๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ณ  hibernate๋Š” ๊ตฌํ˜„ ํด๋ž˜์Šค ์ด๋‹ค.
  2. application.properties

    •  spring.jpa.show-sql=true 
      jpa๊ฐ€ ๋งŒ๋“œ๋Š” sql์„ ๋ณด์—ฌ์ค€๋‹ค.

    •  spring.jpa.hibernate.ddl-auto=none 
      jpa๊ฐ€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ๋„ ํ•˜๋Š”๋ฐ none์œผ๋กœ ํ•˜๋ฉด ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
       create ์€ jpa๊ฐ€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ ๋‹ค.


 

์‚ฌ์šฉ๋ฒ•

 

  1. domain

    •  @Entity 
      → JPA๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋œ๋‹ค.

    •  @Id  
      → PK. ๊ธฐ๋ณธํ‚ค๋กœ ์„ค์ •. 

    •  @GeneratedValue(strategy =GenerationType.IDENTITY
      → DB๊ฐ€ ์•Œ์•„์„œ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ IDENTITY๋ผ๊ณ  ํ•œ๋‹ค.
      ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค ๋•Œ ์„ค์ •.

    •  @Column(name = "username") 
      → ๋งŒ์•ฝ์— DB์˜ ์ปฌ๋Ÿผ๋ช…์ด username์ด๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ์ ์–ด์ค€๋‹ค.
      (์ง€๊ธˆ ์‹ค์ œ ๊ณต๋ถ€์ค‘์ด ์‹ค์ œ DB๋Š” ์ด๋ฆ„์ด ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์ ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.)

    • ์ „์ฒด์ฝ”๋“œ
      ๋”๋ณด๊ธฐ
      package hello.hellospring.domain;
      
      import jakarta.persistence.Column;
      import jakarta.persistence.Entity;
      import jakarta.persistence.GeneratedValue;
      import jakarta.persistence.GenerationType;
      import jakarta.persistence.Id;
      
      @Entity
      public class Member {
      
          @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
      
          private String name;
          
          public Long getId() {
              return id;
          }
          
          public void setId(Long id) {
              this.id = id;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      }
  2. repository
    • em.createQuery( : ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    • "select m from Member m"
      Meber as m → Member m ์ด๋ผ ์ ์€ ๊ฒ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•˜๊ณ  select m ํ…Œ์ด๋ธ”์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

    • Member ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด๋ฅผ ํ–ฅํ•ด ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด๋‹ค.
    •  EntityManager 

      • jpa๋ฅผ DI, ์˜์กด์„ฑ ์ฃผ์ž…ํ•˜๋Š” ์ฝ”๋“œ๋‹ค.

      • jpa๋Š” EntityManager๋กœ ๋ชจ๋“  ๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

      • ์Šคํ”„๋ง๋ถ€ํŠธ์— jpa๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ์ž๋™์œผ๋กœ EntityManager๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

      • jpa ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    • ์ €์žฅ & id๋กœ ํšŒ์› ์ฐพ๊ธฐ
      ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ๋‹ค.

      • ์ €์žฅ : em.persist(member);

      • ์กฐํšŒ : em.find(Member.class, id);

      • id๋ฅผ ์ด์šฉํ•ด ์กฐํšŒ/์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด์™€ ๊ฐ™์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.


    • ๋ชจ๋“  ํšŒ์› ์ฐพ๊ธฐ
    • ์ด๋ฆ„์œผ๋กœ ํšŒ์› ์ฐพ๊ธฐ

      • where m.name = :name 
        jdbc์˜ ?๋Œ€์‹  ์ž…๋ ฅํ•  ๊ฐ’์˜ ์ด๋ฆ„์„ ์ ์–ด์ค€๋‹ค.

      • setParameter
        → ์œ„ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๊ฐ’์„ ๋‹ด์•„์ค€๋‹ค.

    • ์ „์ฒด์ฝ”๋“œ
      ๋”๋ณด๊ธฐ
      package hello.hellospring.repository;
      
      import java.util.List;
      import java.util.Optional;
      
      import hello.hellospring.domain.Member;
      import jakarta.persistence.EntityManager;
      
      public class JpaMemberRepository implements MemberRepository {
      
          private final EntityManager em;
      
          public JpaMemberRepository(EntityManager em) {
              this.em = em;
          }
      
          @Override
          public Member save(Member member) {
              em.persist(member);
              return member;
          }
      
          @Override
          public Optional<Member> findById(Long id) {
              Member member = em.find(Member.class, id);
              return Optional.ofNullable(member);
          }
      
          @Override
          public Optional<Member> findByName(String name) {
              List<Member> result= em.createQuery("select m from Member m where m.name = :name"
                                                  , Member.class)
                  .setParameter("name", name)
                  .getResultList();
              return result.stream().findAny();
          }
      
          @Override
          public List<Member> findAll() {
              return em.createQuery("select m from Member m", Member.class)
                      .getResultList();
          }
      }
  3. config
    • EntityManager๋ฅผ DI ์ƒ์„ฑ์ž ์ฃผ์ž…ํ˜•์‹์œผ๋กœ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.
      private EntityManager em;
      
          public SpringConfig(EntityManager em) {
              this.em = em;
          }


    • return new JpaMemberRepository(em);
      → ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๋นˆ ์—ฐ๊ฒฐ์„ jpa๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

 


 

ํ…Œ์ŠคํŠธํ•ด๋ณด๋ฉด CONSOLE์— JPA์˜ ๊ตฌํ˜„์ฒด Hibernate๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ณด์ธ๋‹ค.

 

โ€ป ์‹ค๋ฌด์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜ ์˜๊ตฌ์‹ฌ์ด ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ํ•ด์™ธ์—์„œ๋Š” ์€ํ–‰์—์„œ๋„ ์‚ฌ์šฉํ•œ๋‹ค. ํ˜„์žฌ๋Š” ํ•œ๊ตญ์˜ ํฐ ๊ธฐ์—…๋“ค๋„ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.

 


โ€ป ์ฐธ์กฐ : https://www.inflearn.com/roadmaps/373

๋ฐ˜์‘ํ˜•