[JPA] JPARepository에 대해 알아보자(+사용법, Method)

김민주·2023년 5월 2일
3

SSAFYcial

목록 보기
6/8
post-thumbnail

안녕하세요. 쭈피셜입니다!
9기 여러분 모두 개발은 잘하고 계신가요?
Spring 수업도 끝이 나고 이제 대망의 프론트수업만 남아 있습니다.
점점 종강이 가까워지고 있습니다.
종강이 가까워진다는 것은 파이널 프로젝트도 가까워지고 있다는 뜻이겠죠?ㅎㅎ
모두 건강도 잘 챙기시고 저처럼 감기 걸리지마세요🥶
관통 프로젝트 열정적으로 임해서 모두 자랑스러운 여러분만의 프로젝트를 만드셨으면 좋겠습니다~


오늘은 JPARepository에 대해 알아보겠습니다!!


JPA(Java Persistence API)란

JPA는 "Java Persistence API"의 약자로, 자바 객체를 관계형 데이터 베이스에 영속적으로 저장하고 조회할 수 있는 ORM 기술에 대한 표준 명세를 의미합니다.

JPA를 통해 개발자는 SQL쿼리를 작성하지 않고도 객체를 통해 데이터베이스를 조작할 수 있으며, 객체 지향적인 코드 작성과 유지 보수성이 향상됩니다.

기본적으로 Entity클래스를 작성한 후 Repository 인터페이스를 생성해야하는데요.
Springboot에서 기본적인 작업을 도와주는 JPARepository 인터페이스가 있습니다!




JPARepository

package: org.springframework.data.jpa.repository


JPARepository란

Spring Data JPA에서 제공하는 인터페이스 중 하나로, JPA를 사용하여 데이터베이스를 조작하기 위한 메서드들을 제공합니다.

JPARepository 인터페이스를 상속받는 인터페이스를 정의하면, 해당 인터페이스를 구현하는 클래스는 JPA에서 제공하는 메서드들을 사용할 수 있습니다.

데이터베이스의 추가, 조회, 수정, 삭제의 findAll(), findById(), save() 등의 메서드들을 사용할 수 있습니다. 제공되는 메서드들 이용하여 쉽고 간편하게 CRUD 조작을 할 수 있습니다.
즉, JpaRepository를 사용하면, 복잡한 JDBC(Java DataBase Connectivity) 코드를 작성하지 않아도 간단하게 DB와의 데이터 접근 작업을 처리할 수 있습니다.

JPARepository 인터페이스는 제네릭 타입을 사용하여 Entity클래스와 복합키를 사용하고 있다면 해당 Entity의 ID클래스를 명시합니다. 이를 통해 해당 인터페이스를 상속받는 구현체는 Entity클래스와 ID클래스에 대한 정보를 알고 있어서, 런타임 시점에 적절한 쿼리를 생성하고 실행할 수 있습니다.




JPARepository 사용법


  1. Entity 클래스 정의
    JPARepository를 사용하여 액세스할 엔티티 클래스를 정의해야 합니다.
@Getter @Setter
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private Integer age;
}

  1. JpaRepository 인터페이스 상속받는 인터페이스 생성
    JpaRepository 인터페이스를 상속받아, 커스텀합니다.
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("SELECT u FROM User u WHERE u.age >= :age")
    List<User> findByAgeGreaterThanEqual(@Param("age") Integer age);
}

  1. Spring Bean 등록
    JpaRepository를 사용하여 데이터 액세스를 수행하는 EntityManager가 필요하므로, JpaRepository를 사용하는 클래스는 빈으로 등록되어야 합니다.
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    // ...
}

  1. JPARepository method 사용
    JPARepository 인터페이스에 정의된 메서드를 호출하거나 구현한 메서드를 호출합니다.
@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public Optional<User> getUserById(Long id) {
        return userRepository.findById(id);
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
    public List<User> getUsersByAge(Integer age) {
        return userRepository.findByAgeGreaterThanEqual(age);
    }
}



JPARepository Method


  1. CRUD 메서드

JPARepository는 CrudRepository인터페이스를 상속받습니다.

SPRING DOCS : CrudRepository

count, delete, deleteAll, deleteAllById, deleteById, existsById, findById, save 등의 기본적인 메서드를 제공합니다.


  1. List CRUD 메서드

JPARepository는 ListCrudRepository인터페이스도 상속받습니다.

SPRING DOCS : ListCrudRepository

  • findAll
    엔티티 클래스에 대한 모든 데이터를 조회합니다. 반환값은 List 형태이며, T는 엔티티 클래스입니다. 모든 데이터를 조회하므로, 대용량의 데이터를 조회할 때는 성능 이슈가 발생할 수 있습니다.
  • findAllById
    주어진 ID에 해당하는 엔티티를 조회합니다. 매개변수로는 ID의 Iterable 객체를 전달합니다.
    List<T> findAllById(Iterable<ID> ids)
    이 메서드를 사용하면, ID의 Iterable 객체를 전달하여 여러 개의 엔티티를 조회할 수 있습니다.
  • saveAll
    <S extends T> List<S> saveAll(Iterable<S> entities)
    주어진 엔티티를 모두 저장합니다. 여러 개의 엔티티를 한 번에 저장할 수 있습니다. 반환값으로 저장된 엔티티의 Iterable 객체를 반환하므로, 저장 결과를 확인할 수 있습니다.

  1. Query Creation 메서드

JPARepository는 QueryByExampleExecutor 인터페이스도 상속받습니다.

SPRING DOCS : QueryByExampleExecutor

QBE는 Spring Data JPA에서 제공하는 기능으로, 동적으로 쿼리를 생성할 수 있습니다.
QueryByExampleExecutor는 QBE를 구현한 인터페이스입니다.

  • findOne
    <S extends T> Optional<S> findOne(Example<S> example)
    주어진 조건에 맞는 엔티티 하나를 반환합니다.

  • findAll
    <S extends T> Iterable<S> findAll(Example<S> example)
    주어진 조건에 해당하는 모든 엔티티를 반환합니다.

  • findBy
    <S extends T,R> R findBy(Example<S> example, Function<FluentQuery.FetchableFluentQuery<S>,R> queryFunction)
    주어진 조건에 맞는 쿼리를 생성하여 쿼리 실행 결과를 반환하는 메서드입니다.

    Example<User> example = Example.of(new User(null, null, 30));
    List<User> users = userRepository.findBy(example, query -> query.where(QUser.user.age.goe(30)).orderBy(QUser.user.name.asc()));
    
  • exists
    <S extends T> boolean exists(Example<S> example)
    주어진 조건에 맞는 엔티티가 존재하는지 확인합니다.

  • count
    <S extends T> long count(Example<S> example)
    주어진 조건에 해당하는 엔티티의 수를 반환합니다.

    *Example객체 : 원하는 쿼리조건을 기반으로 만들어진 엔티티 객체


  1. 영속성 컨텍스트 관련 메서드
  • flush()
    현재의 트랜잭션에서 관리되고 있는 영속성 컨텍스트에 있는 변경 내용을 데이터베이스에 즉시 반영하는 메소드입니다. 모든 변경 내용이 즉시 데이터베이스에 반영되므로, 데이터베이스와의 동기화 작업이 매우 빈번하게 발생할 수 있습니다. 이는 성능상 이슈를 유발할 수 있으므로, 적절한 상황에서만 메소드를 사용하는 것이 좋습니다.
public void updateUser(Long userId, String email) {
        User user = userRepository.findById(userId).orElseThrow(() -> new IllegalArgumentException("Invalid user id"));
        user.setEmail(email);
        userRepository.flush(); // 영속성 컨텍스트의 변경 내용을 즉시 데이터베이스에 반영합니다.
    }
  • saveAndFlush
    <S extends T> S saveAndFlush(S entity)
    엔티티를 저장하고, 영속성 컨텍스트의 변경 내용을 즉시 데이터베이스에 반영합니다.
  • deleteAllInBatch
    모든 엔티티를 데이터베이스에서 삭제합니다. 이 메소드는 deleteAll() 메소드와 달리 영속성 컨텍스트를 거치지 않고 바로 데이터베이스에서 삭제하기 때문에, 대규모 데이터 삭제 작업에 적합합니다.

이외에도 더 많은 메소드들이 궁금하다면
Spring DOCS: JpaRepository
에서 확인하시기 바랍니다.



JPARepository 정말 다양한 메소드를 간편하게 쓸 수 있는 편리한 인터페이스인 것 같습니다! 특히 기본적인 CRUD 기능을 간단하게 작성할 수 있도록 도와주고, 영속성 컨텍스트와 관련된 메소드를로 자동으로 엔티티를 관리해주니 더 효율적으로 개발할 수 있을 것 같습니다😊

그럼, 다음 쌒다지식으로 돌아오겠습니다!

💗감사합니다💗

profile
𝐃𝐨𝐧'𝐭 𝐛𝐞 𝐚 𝐩𝐫𝐨𝐜𝐫𝐚𝐬𝐭𝐢𝐧𝐚𝐭𝐨𝐫💫

2개의 댓글

comment-user-thumbnail
2023년 5월 4일

우와 나도 JPA로 할걸 마이바티스 너무 귀찮아요ㅠㅠ

1개의 답글