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

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

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

  • SimpleJpaRepositoryλŠ” Spring Data JPA(Java Persistence API)μ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ Repository κ΅¬ν˜„ ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • 이 ν΄λž˜μŠ€λŠ” Spring Data JPA의 Repository μΈν„°νŽ˜μ΄μŠ€(CrudRepository, JpaRepository λ“±)λ₯Ό κ΅¬ν˜„ν•˜λ©°, 일반적으둜 μ‚¬μš©λ˜λŠ” CRUD(생성(Create), 쑰회(Read), μˆ˜μ •(Update), μ‚­μ œ(Delete)) κΈ°λŠ₯을 ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ μ—­ν• .

  • SimpleJpaRepositoryλŠ” κ°œλ°œμžκ°€ μ •μ˜ν•œ Repository μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ‘œ, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ κ°„νŽΈν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” 직접 CRUD λ‘œμ§μ„ κ΅¬ν˜„ν•˜μ§€ μ•Šκ³ λ„, SimpleJpaRepositoryλ₯Ό 톡해 μžλ™μœΌλ‘œ μ œκ³΅λ˜λŠ” κΈ°λ³Έ CRUD λ©”μ„œλ“œλ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ SimpleJpaRepository의 λ™μž‘ 방식.

1️⃣ κΈ°λ³Έ CRUD λ©”μ„œλ“œ 제곡.

  • SimpleJpaRepositoryλŠ” save, findById, findAll, delete λ“±κ³Ό 같은 기본적인 CRUD(생성(Create), 쑰회(Read), μˆ˜μ •(Update), μ‚­μ œ(Delete)) λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžκ°€ JpaRepository μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™•μž₯ν•˜μ—¬ μ»€μŠ€ν…€ Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜λ©΄, Spring Data JPAκ°€ λŸ°νƒ€μž„ μ‹œμ μ— SimpleJpaRepositoryλ₯Ό μ‚¬μš©ν•΄ ν•΄λ‹Ή μΈν„°νŽ˜μ΄μŠ€μ˜ κ΅¬ν˜„μ²΄λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•©λ‹ˆλ‹€.

2️⃣ λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μžλ™ μƒν˜Έμž‘μš©.

  • SimpleJpaRepositoryλŠ” Hibernate와 같은 JPA(Java Persistence API) κ΅¬ν˜„μ²΄μ™€ μƒν˜Έμž‘μš©ν•˜μ—¬, 데이터λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ±°λ‚˜ μ‘°νšŒν•  λ•Œ ν•„μš”ν•œ SQL(Structured Query Language) 쿼리λ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜κ³  μ‹€ν–‰ν•©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ 직접적인 μƒν˜Έμž‘μš©μ„ κ΅¬ν˜„ν•  ν•„μš”κ°€ μ—†λ―€λ©°, Spring Data JPAκ°€ 이 λͺ¨λ“  것을 μžλ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

3️⃣ 쿼리 λ©”μ„œλ“œ 지원

  • SimpleJpaRepositoryλŠ” λ©”μ„œλ“œ 이름을 λΆ„μ„ν•˜μ—¬ 쿼리 λ©”μ„œλ“œλ₯Ό μžλ™μœΌλ‘œ μƒμ„±ν•˜λŠ” κΈ°λŠ₯을 μ§€μ›ν•©λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, findByNameκ³Ό 같은 λ©”μ„œλ“œλ₯Ό μ •μ˜ν•˜λ©΄, Spring Data JPAλŠ” μžλ™μœΌλ‘œ name ν•„λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό μ‘°νšŒν•˜λŠ” 쿼리λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.

3️⃣ SimpleJpaRepository의 기본적인 CRUD λ©”μ„œλ“œ.

  • SimpleJpaRepositoryλŠ” λ‹€μŒκ³Ό 같은 κΈ°λ³Έ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.
    • save(S entity)
      • μ—”ν‹°ν‹°λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•©λ‹ˆλ‹€. μ—”ν‹°ν‹°κ°€ 이미 μ‘΄μž¬ν•˜λ©΄ μ—…λ°μ΄νŠΈν•˜κ³ , μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ μƒˆλ‘œ μ‚½μž…ν•©λ‹ˆλ‹€.
    • findById(ID id)
      • μ§€μ •λœ ID둜 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.
    • findAll()
      • λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 λͺ¨λ“  μ—”ν‹°ν‹°λ₯Ό μ‘°νšŒν•©λ‹ˆλ‹€.
    • delete(T entity)
      • λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ—”ν‹°ν‹°λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
    • deleteById(ID id)
      • μ§€μ •λœ ID둜 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ μ—”ν‹°ν‹°λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
    • count()
      • λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯된 μ—”ν‹°ν‹°μ˜ 총 개수λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

4️⃣ μ‚¬μš© μ˜ˆμ‹œ.

πŸ‘‰ UserRepository μΈν„°νŽ˜μ΄μŠ€.

import org.springframework.data.jpa.repository.JpaRepository;

public interface UseRepository extends JpaRepository<User, Long> {
    User findByName(String name);
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ UserRepositoryλŠ” JpaRepositoryλ₯Ό μƒμ†ν•˜κ³  있으며, 이λ₯Ό 톡해 SimpleJpaRepositoryκ°€ UserRepository의 κ΅¬ν˜„μ²΄λ‘œ λ™μž‘ν•˜κ²Œ λ©λ‹ˆλ‹€.
    • findByName, save, findById λ“±μ˜ λ©”μ„œλ“œλ₯Ό λ³„λ„λ‘œ κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„, Spring Data JPAκ°€ SimpleJpaRepositoryλ₯Ό μ‚¬μš©ν•˜μ—¬ 이듀을 μžλ™μœΌλ‘œ μ œκ³΅ν•΄μ€λ‹ˆλ‹€.

πŸ‘‰ μ„œλΉ„μŠ€ ν΄λž˜μŠ€μ—μ„œ μ‚¬μš©.

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

@Sevice
public class UserService {
    
    private final UserRepository userRepository;
    
    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }
    
    public User createUser(String name, Integer age) {
        User user = new User(name, age);
        return userRepository.save(user); // SimpleJpaRepository의 save λ©”μ„œλ“œ μ‚¬μš©
    }
    
    public Optional<User> getUserById(Long id) {
        return userRepository.findById(id); // SimpleJpaRepository의 findById λ©”μ„œλ“œ μ‚¬μš©
    }
    
    public void deleteUser(Long id) {
        userRepository.deleteById(id); // SimpleJpaRepository의 deleteById λ©”μ„œλ“œ μ‚¬μš©
    }
}

5️⃣ SimpleJpaRepository의 ν™•μž₯ 및 μ»€μŠ€ν„°λ§ˆμ΄μ§•.

1️⃣ κΈ°λ³Έ κΈ°λŠ₯ ν™•μž₯.

  • κ°œλ°œμžλŠ” SimpleJpaRepositoryκ°€ μ œκ³΅ν•˜λŠ” κΈ°λ³Έ κΈ°λŠ₯ 외에 좔가적인 μ»€μŠ€ν…€ κΈ°λŠ₯을 Repository에 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, λ³΅μž‘ν•œ 쿼리λ₯Ό 직접 μ •μ˜ν•˜κ±°λ‚˜, 좔가적인 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ @Query μ–΄λ…Έν…Œμ΄μ…˜ μ‚¬μš©.

  • @Query μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λ³΅μž‘ν•œ JPQL(Java Persistence Query Language) λ˜λŠ” λ„€μ΄ν‹°λΈŒ SQL 쿼리λ₯Ό 직접 μž‘μ„±ν•˜μ—¬ λ©”μ„œλ“œμ— μ—°κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.name = :name AND u.age > :age")
    List<User> findByNameAndAgeGreaterThan(@Param("name") String name, @Param("age") Integer age);
}

6️⃣ μš”μ•½.

  • SimpleJpaRepositoryλŠ” Spring Data JPAμ—μ„œ 기본적으둜 μ œκ³΅ν•˜λŠ” CRUD κΈ°λŠ₯의 κ΅¬ν˜„μ²΄λ‘œ, JpaRepository μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 μžλ™μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.
  • κ°œλ°œμžλŠ” JpaRepositoryλ₯Ό μƒμ†λ°›λŠ” Repository μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•¨μœΌλ‘œμ¨ SimpleJpaRepositoryκ°€ μ œκ³΅ν•˜λŠ” μžλ™ CRUD κΈ°λŠ₯을 ν™œμš©ν•  수 있으며, λ©”μ„œλ“œ 이름 기반 쿼리, μ»€μŠ€ν…€ 쿼리 등을 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ κ°„νŽΈν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Spring Data JPAλŠ” λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ λ‹¨μˆœν™”ν•˜κ³ , μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ„ λ†’μ΄λŠ” 데 큰 역할을 ν•©λ‹ˆλ‹€.
  • SimpleJpaRepositoryλŠ” μ΄λŸ¬ν•œ Spring Data JPA의 핡심을 λ‹΄λ‹Ήν•˜λŠ” κΈ°λ³Έ κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€.