ν’€μŠ€νƒ μ›ΉπŸŒ 개발자 지망생 πŸ§‘πŸ½β€πŸ’»
βž• 인곡지λŠ₯ 관심 πŸ€–


Categories


Recent views

  • 1
  • 2
  • 3
  • 4
  • 5

Spring5-JPA

  1. JPA μ‚¬μš© μ€€λΉ„
  2. JPA 리퍼지터리 μ»€μŠ€ν„°λ§ˆμ΄μ§•

    Spring5-JPA

    πŸ—£οΈ 좜처

    _ 초보 μ›Ή 개발자λ₯Ό μœ„ν•œ μŠ€ν”„λ§ 5 ν”„λ‘œκ·Έλž˜λ° μž…λ¬Έ _와 μŠ€ν”„λ§ 인 μ•‘μ…˜ 의 λ‚΄μš©μ„ λ°”νƒ•μœΌλ‘œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.

    μŠ€ν”„λ§μ€ JDBC 뿐만 μ•„λ‹ˆλΌ JPA, MongoDB, Neo4, Redis 같은 ν‚€-κ°’, λ¬Έμ„œν˜•, κ·Έλž˜ν”„ν˜•μ˜ λ°μ΄ν„°λ² μ΄μŠ€ νΌμ‹œμŠ€ν„΄μŠ€λ„ μ§€μ›ν•œλ‹€.

    μŠ€ν”„λ§ 데이터 ν”„λ‘œμ νŠΈ 쀑 ν•˜λ‚˜μΈ μŠ€ν”„λ§ 데이터 JPAλ₯Ό 톡해 JPAλ₯Ό μ‚¬μš©ν•΄λ³΄μž.

    ⚠️ μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ‚¬μš©ν•œλ‹€λŠ” κ°€μ •ν•˜μ— μ§„ν–‰λœλ‹€.

    JPA μ‚¬μš© μ€€λΉ„

    주둜 μ‚¬μš©ν•˜λ©°, 기본섀정이 λ˜μ–΄ μžˆλŠ” Hibernateλ₯Ό κΈ°μ€€μœΌλ‘œ μ§„ν–‰λœλ‹€.

    JPA μ˜μ‘΄μ„± μΆ”κ°€

    ✍ JPA μ˜μ‘΄μ„± μ˜ˆμ‹œ
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    

    λ§Œμ•½ EclipseLink 같은 λ‹€λ₯Έ 라이브러리λ₯Ό μ‚¬μš©ν•˜κ³  μ‹Άλ‹€λ©΄ <exclusions>둜 hibernateλ₯Ό μ œμ™Έν•˜κ³  μƒˆλ‘œ μΆ”κ°€ν•΄μ•Όν•œλ‹€.

    λ˜ν•œ, 더이상 schema.sql 파일 μžλ™ 싀행이 λ˜μ§€ μ•ŠμœΌλ―€λ‘œ, 처음 λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ“±μ—μ„œ DB에 ν•„μš”ν•œ κΈ°λ³Έ sql을 λ“±λ‘ν•΄μ€˜μ•Ό ν•œλ‹€.

    도메인 객체에 JPA 맀핑 μ• λ…Έν…Œμ΄μ…˜ μΆ”κ°€

    🧾️ 도맀인 객체 JPA 맀핑 개체둜 지정
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.PrePersist;
    import javax.persistence.Table;
      
    import lombok.Data;
    import java.util.Date; 
    
    import java.io.Serializable;
    import java.util.ArrayList;
    import java.util.List;
    
    @Data
    @Entity
    @Table(name="Taco_Order")
    public class Order implements Serializable {
        private static final long serialVersionUID = 1L;
        
        @Id
        @GeneratedValue(strategy=GenerationType.AUTO)
        private Long id;
    
        private Date placedAt;
    
    	//...
    
        @ManyToMany(targetEntity=Taco.class)
    	private List<Taco> tacos = new ArrayList<>();
    
        public void addDesign(Taco design) {
            this.tacos.add(design);
        }
        
        @PrePersist
        void placedAt() {
            this.placedAt = new Date();
        }
    }
    

    @Entitiy : ν•΄λ‹Ή 도메인 객체λ₯Ό JPA 개체둜 λ³€κ²½

    @NoArgsConstructor: JPA κ°œμ²΄λŠ” 인자 μ—†λŠ” μƒμ„±μžμ—¬μ•Ό ν•˜λ―€λ‘œ, Lombok κΈ°λŠ₯으둜 μƒμ„±μž 인자λ₯Ό 없앨 수 μžˆλ‹€.

    @Id: idκ°€ 될 μ†μ„±μ—λŠ” λ°˜λ“œμ‹œ @Id μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ‹λ³„ν•΄μ€˜μ•Ό 함.

    • @GeneratedValue(strategy=GenerationType.AUTO)둜 DB의 μžλ™ 생성 ID μ‚¬μš©

    @ManyToMany(targetEntity=μ™Έλž˜λ„λ©”μΈκ°μ²΄): λ‹€λŒ€λ‹€ 관계 μ„€μ •

    @PrePersist: νŠΉμ • μ†μ„±μ˜ 기본값을 정해쀄 λ•Œ μ‚¬μš©ν•  λ©”μ„œλ“œ μœ„μ— μ‚¬μš©ν•œλ‹€. 속성λͺ…κ³Ό 같은 이름이어야 ν•˜λ‚˜?

    @Table: 이 μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ DB에 μ €μž₯될 ν…Œμ΄λΈ”λͺ…을 바꾸어쀄 수 μžˆλ‹€.

    title: λ§Œμ•½, κΈ°ν•„μ½” μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•΄ μƒμ„±μžκ°€ ν•„μš”ν•œ 객체라면?

    1. @NoArgsConstructor(access=AccessLevel.PRIVATE, force=true) μ†μ„±μœΌλ‘œ μ™ΈλΆ€μ—μ„œ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜κ²Œ λ§‰λŠ”λ‹€.
    2. @Data, @RequiredArgsConstructor둜 μΈμžκ°€ μžˆλŠ” μƒμ„±μžλ₯Ό μΆ”κ°€λ‘œ μ˜€λ²„λ‘œλ”©ν•œλ‹€.
      ~~~java
      package tacos;
      import javax.persistence.Entity;
      import javax.persistence.Id;

    import lombok.AccessLevel;
    import lombok.NoArgsConstructor;
    import lombok.Data;
    import lombok.RequiredArgsConstructor;

    @Data
    @RequiredArgsConstructor
    @NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
    @Entity
    public class Ingredient {

        @Id
        private final String id;
        private final String name;
        private final Type type;
       
        public static enum Type {
            WRAP, PROTEIN, VEGGIES, CHEESE, SAUCE
        }
    }

    
    <!-- @#@-note@#@λ§Œμ•½, κΈ°ν•„μ½” μ΄ˆκΈ°ν™”λ₯Ό μœ„ν•΄ μƒμ„±μžκ°€ ν•„μš”ν•œ 객체라면?@#@ -->
    
    ## JPA 리퍼지터리 μ„ μ–Έ
    
    μŠ€ν”„λ§ λ°μ΄ν„°λŠ” `CrudRepository<κ°œμ²΄νƒ€μž…,Idνƒ€μž…>` μΈν„°νŽ˜μ΄μŠ€λ₯Ό 기반으둜 μžλ™μœΌλ‘œ `Repository` 클래슀λ₯Ό μžλ™ 생성해쀀닀.
    
    <!-- #@#callout-example#@#`CrudRepository`λ₯Ό μ΄μš©ν•œ λ ˆνΌμ§€ν„°λ¦¬ κ΅¬ν˜„#@# -->
    title: `CrudRepository`λ₯Ό μ΄μš©ν•œ λ ˆνΌμ§€ν„°λ¦¬ κ΅¬ν˜„
    
    μžμ„Έν•œ ν•¨μˆ˜λ“€μ€ [곡식 λ¬Έμ„œ](https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/repository/CrudRepository.html){: .wikilink}{:target=\"_blank\"}{: .externallink} μ°Έμ‘°
    ~~~java
    package tacos.data;
    import org.springframework.data.repository.CrudRepository;
    
    import tacos.Ingredient;
    
    public interface IngredientRepository extends CrudRepository<Ingredient, String> {
    	//count(), delete(), findAll(), findByID(), save() λ“±μ˜ μ—¬λŸ¬ λ©”μ„œλ“œκ°€ μ •μ˜λ˜μ–΄ 있음
    }
    

    μžλ™ μƒμ„±λœ RepositoryλŠ” 기본적인 CRUD λ©”μ„œλ“œκ°€ μ„ μ–Έλ˜μ–΄ μžˆλ‹€.
    μœ„ interface 객체λ₯Ό 가져와 μ‚¬μš©ν•˜λ©΄ λœλ‹€.

    JPA 리퍼지터리 μ»€μŠ€ν„°λ§ˆμ΄μ§•

    μΆ”κ°€λ‘œ μ›ν•˜λŠ” κ³ μœ ν•œ 쿼리λ₯Ό μˆ˜ν–‰ν•˜λ €λ©΄ 리퍼지터리 μΈν„°νŽ˜μ΄μŠ€μ— μ•„λž˜μ²˜λŸΌ μƒˆλ‘œμš΄ λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜λ©΄ λœλ‹€.

    List&#38;#60;Order&#38;#62; findByDeliveryZip(String deliveryZip);
    // interface λ‚΄λΆ€μ˜ μΆ”μƒλ©”μ„œλ“œμ΄λ―€λ‘œ 직접 κ΅¬ν˜„μ„ ν•  수 μ—†λ‹€.
    
    

    μ΄λ ‡κ²Œ μΆ”κ°€ν•˜λ©΄ μŠ€ν”„λ§ λ°μ΄ν„°μ—μ„œ μžλ™μœΌλ‘œ λ©”μ„œλ“œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό 뢄석해 κ΅¬ν˜„ν•΄μ€€λ‹€.

    예λ₯Ό λ“€μ–΄ μœ„μ˜ μ˜ˆμ‹œλŠ” find에 μ˜ν•΄ μ‘°νšŒμž„μ„, list<Order>μ΄λ―€λ‘œ Order 객체의 리슀트λ₯Ό, ByDeliveryZip으둜 인해 주어진 DeliveryZip을 ν‚€λ‘œ μ°ΎμŒμ„ μ•Œ 수 μžˆλ‹€.

    이외에도 Between으둜 λ²”μœ„ 인자 2κ°œκ°€ 좔가됨을 μ•Œ 수있고, And둜 좔가적인 쑰건을 뢙일 수 μžˆλ‹€.
    이외에도 IsTrue, Contains, IgnoreCase λ“± λ‹€μ–‘ν•œ λ©”μ„œλ“œλͺ…을 μ΄μš©ν•  수 μžˆλ‹€.

    • μžμ„Έν•œ 것은 κ³΅μ‹λ¬Έμ„œ μ°Έμ‘°

    λ§Œμ•½ λ„ˆλ¬΄ λ³΅μž‘ν•˜κ±°λ‚˜ λΆˆκ°€λŠ₯ν•œ 쿼리의 경우 @Query μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ 쿼리λ₯Ό 지정 κ°€λŠ₯ν•˜λ‹€.

    @Query(&#34;Order o where o.deliveryCity=&#39;Seattle&#39;&#34;)
    List&#38;#60;Order&#38;#62; readOrdersDeliveredInSeattle();
    
    

    λ‹€λ§Œ μ΄λŸ¬ν•˜λ©΄, DBλ§ˆλ‹€ SQL μ–Έμ–΄κ°€ λ‹€λ₯΄λ―€λ‘œ, JPA의 μž₯점을 λͺ¨λ‘ ν™œμš©ν•  수 μ—†λ‹€.