Home > Spring > πŸƒ[Spring] Spring Data JPAλž€ λ¬΄μ—‡μΌκΉŒμš”?

πŸƒ[Spring] Spring Data JPAλž€ λ¬΄μ—‡μΌκΉŒμš”?
Spring Framework

πŸƒ[Spring] Spring Data JPAλž€ λ¬΄μ—‡μΌκΉŒμš”?

  • Spring Data JPAλŠ” Spring Framework의 μΌλΆ€λ‘œ, JPA(Java Persistence API)λ₯Ό λ”μš± μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” λͺ¨λ“ˆ(Module)μž…λ‹ˆλ‹€.
  • JPA(Java Persistence API)λŠ” μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(Relational Database, RDB) κ°„μ˜ 맀핑을 μ œκ³΅ν•˜λŠ” ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€μΈλ°, Spring Data JPAλŠ” 이λ₯Ό 기반으둜 κ°œλ°œμžκ°€ 더 적은 μ½”λ“œλ‘œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•  수 있게 λ„μ™€μ€λ‹ˆλ‹€.

1️⃣ Spring Data JPA의 μ£Όμš” νŠΉμ§•.

1️⃣ κ°„νŽΈν•œ 데이터 μ—‘μ„ΈμŠ€ 계측.

  • Spring Data JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ CRUD(Create, Read, Update, Delete) μž‘μ—…μ„ μ†μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλŠ” 방법을 μ œκ³΅ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” λ³΅μž‘ν•œ SQL 쿼리λ₯Ό 직접 μž‘μ„±ν•  ν•„μš” 없이, Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œ λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μžλ™ κ΅¬ν˜„ Repository.

  • Spring Data JPAλŠ” Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λ©΄, λŸ°νƒ€μž„ μ‹œμ μ— ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄, findById, save, delete와 같은 기본적인 λ°μ΄ν„°λ² μ΄μŠ€ 연산은 λ³„λ„λ‘œ κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

3️⃣ λ©”μ„œλ“œ 이름 기반 쿼리 생성.

  • Spring Data JPAλŠ” λ©”μ„œλ“œ 이름을 λΆ„μ„ν•˜μ—¬ μžλ™μœΌλ‘œ 쿼리λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, findByNameκ³Ό 같은 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λ©΄, name ν•„λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 λ³΅μž‘ν•œ 쿼리도 μ‰½κ²Œ μž‘μ„±ν•  수 있으며, 좔가적인 μ½”λ“œ μž‘μ„±μ΄ 쀄어듀어 개발 속도λ₯Ό λ†’μ—¬μ€λ‹ˆλ‹€.

4️⃣ JPQL 및 λ„€μ΄ν‹°λΈŒ 쿼리 지원.

  • ν•„μš”ν•  경우 JPQL(Java Persistence Query Language) λ˜λŠ” λ„€μ΄ν‹°λΈŒ SQL(Structured Query Language) 쿼리λ₯Ό 직접 μž‘μ„±ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.
    • λ³΅μž‘ν•œ 쿼리λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ μ„±λŠ₯ μ΅œμ ν™”κ°€ ν•„μš”ν•œ 경우 μœ μš©ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5️⃣ νŽ˜μ΄μ§• 및 μ •λ ¬ 지원.

  • Spring Data JPAλŠ” 데이터 쑰회 μ‹œ νŽ˜μ΄μ§•(Paging)κ³Ό μ •λ ¬(Sorting) κΈ°λŠ₯을 기본적으둜 μ§€μ›ν•©λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 λŒ€λŸ‰μ˜ 데이터λ₯Ό 효율적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ£Όμš” ꡬ성 μš”μ†Œ.

1️⃣ Entity 클래슀.

  • λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”κ³Ό λ§€ν•‘λ˜λŠ” μžλ°” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
    • JPA(Java Persistence API) μ—”ν‹°ν‹°(Entity) μ–΄λ…Έν…Œμ΄μ…˜(@Entity)을 μ‚¬μš©ν•˜μ—¬ ν…Œμ΄λΈ” ꡬ쑰λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€.

2️⃣ Repotitory μΈν„°νŽ˜μ΄μŠ€.

  • Spring Data JPAμ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
  • CrudRepository, JpaRepository, PagingAndSortingRepository와 같은 λ‹€μ–‘ν•œ Repository μΈν„°νŽ˜μ΄μŠ€κ°€ μ œκ³΅λ©λ‹ˆλ‹€.
    • 이λ₯Ό ν™•μž₯ν•˜μ—¬ 기본적인 CRUD(생성, 쑰회, μˆ˜μ •, μ‚­μ œ) κΈ°λŠ₯뿐만 μ•„λ‹ˆλΌ νŽ˜μ΄μ§•, μ •λ ¬ 등을 μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ Spring Data JPA의 μ–΄λ…Έν…Œμ΄μ…˜

  • @Entity: 클래슀λ₯Ό JPA μ—”ν‹°ν‹°(Entity)둜 μ •μ˜ν•©λ‹ˆλ‹€.
  • @Id: κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό μ§€μ •ν•©λ‹ˆλ‹€.
  • @Repository: 데이터 μ ‘κ·Ό 객체(DAO)둜 μ‚¬μš©λ  μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” ν΄λž˜μŠ€μ— μ‚¬μš©ν•©λ‹ˆλ‹€. Springμ—μ„œ ν•΄λ‹Ή 클래슀λ₯Ό 빈으둜 관리할 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • @Query: JPQL λ˜λŠ” λ„€μ΄ν‹°λΈŒ 쿼리λ₯Ό 직접 μž‘μ„±ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.

πŸ™‹β€β™‚οΈ APIμ—μ„œμ˜ μΈν„°νŽ˜μ΄μŠ€μ™€ μ†Œν”„νŠΈμ›¨μ–΄ κ³΅ν•™μ—μ„œμ˜ μΈν„°νŽ˜μ΄μŠ€ κ°œλ….
πŸ™‹β€β™‚οΈ JPA μ–΄λ…Έν…Œμ΄μ…˜ - @Entity
πŸ™‹β€β™‚οΈ JPA μ–΄λ…Έν…Œμ΄μ…˜ - @Id
πŸ™‹β€β™‚οΈ μ–Έμ œ @Service,@Repository,@Controller와 같은 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν• κΉŒ?
πŸ™‹β€β™‚οΈ μ—”ν‹°ν‹°(Entity)λŠ” λ¬΄μ—‡μΌκΉŒμš”?

3️⃣ Spring Data JPA μ‚¬μš© μ˜ˆμ‹œ.

1️⃣ μ—”ν‹°ν‹° 클래슀 μ •μ˜.

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneretedValue;
import javax.persistence.GenerationType;

@Entity
public class User {
    @Id
    @GeneretedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;
    
    // κΈ°λ³Έ μƒμ„±μž, getter, setter μƒλž΅
}

2️⃣ Repository μΈν„°νŽ˜μ΄μŠ€ μ •μ˜.

import org.springframework.data.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    // κΈ°λ³Έ CRUD λ©”μ„œλ“œ 외에 μΆ”κ°€ λ©”μ„œλ“œ μ •μ˜
    User findByName(String name);
}
  • μœ„ μ½”λ“œμ—μ„œ UserRepositoryλŠ” JpaRepositoryλ₯Ό ν™•μž₯ν•˜μ—¬, User μ—”ν‹°ν‹°(Entity)와 Long νƒ€μž…μ˜ κΈ°λ³Έ ν‚€(Primary Key)λ₯Ό μ‚¬μš©ν•˜λŠ” Repository둜 μ •μ˜λ©λ‹ˆλ‹€.
  • findByName: λ©”μ„œλ“œ 이름을 기반으둜 Spring Data JPAκ°€ name ν•„λ“œλ‘œ Userλ₯Ό μ°ΎλŠ” 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

3️⃣ Service ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public List<User> getAllUsers() {
        return userRepository.findAll();
    }
    
    public User getUserByName(String name) {
        return userRepository.findByName(name);
    }
    
    public User createUser(User user) {
        return userRepository.save(user);
    }
}

4️⃣ Spring Boot μ„€μ •(application.properties)

spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=secret
spring.jpa.hibernate.ddl-auto=update

4️⃣ Spring Data JPA의 μž₯점.

1️⃣ 개발 생산성 ν–₯상.

  • 데이터 μ ‘κ·Ό μ½”λ“œλ₯Ό 쀄여주며, λ©”μ„œλ“œ 이름 기반의 쿼리 μƒμ„±μœΌλ‘œ 개발 속도λ₯Ό λ†’μž…λ‹ˆλ‹€.

2️⃣ μœ μ—°μ„±.

  • λ³΅μž‘ν•œ 쿼리λ₯Ό 직접 μž‘μ„±ν•  수 있으며, λ‹€μ–‘ν•œ κΈ°λŠ₯을 μ‰½κ²Œ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ Spring μƒνƒœκ³„μ™€ 톡합.

  • Spring Framework와 μ‰½κ²Œ ν†΅ν•©λ˜λ©°, Spring Bootλ₯Ό 톡해 섀정이 κ°„νŽΈν•΄μ§‘λ‹ˆλ‹€.

4️⃣ νŽ˜μ΄μ§• 및 μ •λ ¬ 지원.

  • λŒ€λŸ‰μ˜ 데이터λ₯Ό 효율적으둜 μ²˜λ¦¬ν•  수 μžˆλ„λ‘ κΈ°λ³Έ νŽ˜μ΄μ§•κ³Ό 정렬을 μ œκ³΅ν•©λ‹ˆλ‹€.

5️⃣ μš”μ•½.

  • Spring Data JPAλŠ” JPA 기반의 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ λ”μš± μ‰½κ²Œ ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” Spring λͺ¨λ“ˆμž…λ‹ˆλ‹€.
  • Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 기본적인 CRUD(생성, 쑰회, μˆ˜μ •, μ‚­μ œ) κΈ°λŠ₯κ³Ό λ©”μ„œλ“œ 이름 기반의 쿼리λ₯Ό μ œκ³΅ν•˜λ©°, κ°œλ°œμžκ°€ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš© μ½”λ“œλ₯Ό 쀄일 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 λΉ λ₯΄κ³  κ°„νŽΈν•˜κ²Œ λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό 계측을 κ΅¬ν˜„ν•  수 있으며, 더 λ³΅μž‘ν•œ 쿼리가 ν•„μš”ν•œ 경우 직접 쿼리λ₯Ό μž‘μ„±ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.