νμ€ν μΉπ κ°λ°μ μ§λ§μ π§π½βπ»
β μΈκ³΅μ§λ₯ κ΄μ¬ π€
Categories
-
β£
βΆ COMPUTER_SCIENCE
π: 7 -
β£
βΆ WEB
π: 3 -
β£
βΆ ETC
π: 3-
β
β£
ETCS
π: 10 -
β
β£
SUBBRAIN κ°λ°κΈ°
π: 5 -
β
β
YOS κ°λ°κΈ°
π: 1
-
β
β£
-
β
βΆ AI
π: 9-
β£
AITOOLS
π: 3 -
β£
CV
π: 2 -
β£
DEEP_LEARNING
π: 1 -
β£
DATA_VIS
π: 2 -
β£
GRAPH
π: 1 -
β£
LIGHTWEIGHT
π: 1 -
β£
MATH
π: 1 -
β£
NLP
π: 3 -
β
STRUCTURED_DATA
π: 2
-
β£
Spring5-JPA
Spring5-JPA
_ μ΄λ³΄ μΉ κ°λ°μλ₯Ό μν μ€νλ§ 5 νλ‘κ·Έλλ° μ λ¬Έ _μ μ€νλ§ μΈ μ‘μ μ λ΄μ©μ λ°νμΌλ‘ μ 리ν λ΄μ©μ λλ€.
μ€νλ§μ JDBC
λΏλ§ μλλΌ JPA
, MongoDB
, Neo4
, Redis
κ°μ ν€-κ°, λ¬Έμν, κ·Έλννμ λ°μ΄ν°λ² μ΄μ€ νΌμμ€ν΄μ€λ μ§μνλ€.
μ€νλ§ λ°μ΄ν° νλ‘μ νΈ μ€ νλμΈ μ€νλ§ λ°μ΄ν° JPA
λ₯Ό ν΅ν΄ JPAλ₯Ό μ¬μ©ν΄λ³΄μ.
JPA μ¬μ© μ€λΉ
μ£Όλ‘ μ¬μ©νλ©°, κΈ°λ³Έμ€μ μ΄ λμ΄ μλ Hibernate
λ₯Ό κΈ°μ€μΌλ‘ μ§νλλ€.
JPA μμ‘΄μ± μΆκ°
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
λ§μ½ EclipseLink
κ°μ λ€λ₯Έ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νκ³ μΆλ€λ©΄ <exclusions>
λ‘ hibernate
λ₯Ό μ μΈνκ³ μλ‘ μΆκ°ν΄μΌνλ€.
λν, λμ΄μ schema.sql
νμΌ μλ μ€νμ΄ λμ§ μμΌλ―λ‘, μ²μ λΆνΈμ€νΈλ© ν΄λμ€ λ±μμ DBμ νμν κΈ°λ³Έ sqlμ λ±λ‘ν΄μ€μΌ νλ€.
λλ©μΈ κ°μ²΄μ 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: λ§μ½, κΈ°νμ½ μ΄κΈ°νλ₯Ό μν΄ μμ±μκ° νμν κ°μ²΄λΌλ©΄?
@NoArgsConstructor(access=AccessLevel.PRIVATE, force=true)
μμ±μΌλ‘ μΈλΆμμ μ¬μ©νμ§ λͺ»νκ² λ§λλ€.@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&#60;Order&#62; findByDeliveryZip(String deliveryZip);
// interface λ΄λΆμ μΆμλ©μλμ΄λ―λ‘ μ§μ ꡬνμ ν μ μλ€.
μ΄λ κ² μΆκ°νλ©΄ μ€νλ§ λ°μ΄ν°μμ μλμΌλ‘ λ©μλ μκ·Έλμ²λ₯Ό λΆμν΄ κ΅¬νν΄μ€λ€.
μλ₯Ό λ€μ΄ μμ μμλ find
μ μν΄ μ‘°νμμ, list<Order>
μ΄λ―λ‘ Order
κ°μ²΄μ 리μ€νΈλ₯Ό, ByDeliveryZip
μΌλ‘ μΈν΄ μ£Όμ΄μ§ DeliveryZip
μ ν€λ‘ μ°Ύμμ μ μ μλ€.
μ΄μΈμλ Between
μΌλ‘ λ²μ μΈμ 2κ°κ° μΆκ°λ¨μ μ μμκ³ , And
λ‘ μΆκ°μ μΈ μ‘°κ±΄μ λΆμΌ μ μλ€.
μ΄μΈμλ IsTrue, Contains, IgnoreCase
λ± λ€μν λ©μλλͺ
μ μ΄μ©ν μ μλ€.
- μμΈν κ²μ 곡μλ¬Έμ μ°Έμ‘°
λ§μ½ λ무 볡μ‘νκ±°λ λΆκ°λ₯ν 쿼리μ κ²½μ° @Query
μ΄λ
Έν
μ΄μ
μΌλ‘ 쿼리λ₯Ό μ§μ κ°λ₯νλ€.
@Query("Order o where o.deliveryCity='Seattle'")
List&#60;Order&#62; readOrdersDeliveredInSeattle();
λ€λ§ μ΄λ¬νλ©΄, DBλ§λ€ SQL μΈμ΄κ° λ€λ₯΄λ―λ‘, JPAμ μ₯μ μ λͺ¨λ νμ©ν μ μλ€.
_articles/web/backend/Spring/Spring5-JPA.md