728x90

들어가면서…

Spring Data JPA는 개발자가 데이터베이스와 상호작용할 때 일반적으로 발생하는 작업들을 단순화하는 몇 가지 도구를 제공합니다. 이 중에서, Paging과 Sorting을 위한 기능을 Pageable과 Sort 객체를 통해 제공합니다.

Pageable을 사용하면, 특정 페이지의 데이터를 가져오거나 페이지별로 데이터를 검색할 수 있습니다. 예를 들어, 사용자의 계정 정보를 페이징하면서 가져오거나, 특정 시간 범위 내의 로그 정보를 페이지별로 검색하는 등의 작업을 할 수 있습니다.

Sort를 사용하면, 특정 컬럼을 기준으로 데이터를 정렬할 수 있습니다. 예를 들어, 사용자의 이름으로 오름차순으로 정렬하거나, 최근 등록된 게시글을 내림차순으로 정렬하는 등의 작업을 할 수 있습니다.

이제, 실제로 Spring Data JPA에서 Pageable과 Sort를 사용하는 방법을 살펴보겠습니다.

Paging을 위한 Pageable 사용법

Paging을 위해서는, Repository 메소드의 파라미터로 Pageable 객체를 받아와야 합니다. 예를 들어, 다음과 같은 UserRepository가 있다고 가정해보겠습니다.

public interface UserRepository extends JpaRepository<User, Long> {

    Page<User> findAll(Pageable pageable);

}

위 코드에서, UserRepository는 JpaRepository를 상속하고 있습니다. findAll 메소드의 파라미터로 Pageable 객체를 받아와서, Page<User> 타입의 결과를 반환하도록 정의되어 있습니다. 따라서, 다음과 같이 Pageable 객체를 만들어서 UserRepository의 findAll 메소드에 전달할 수 있습니다.

Pageable pageable = PageRequest.of(0, 10);
Page<User> users = userRepository.findAll(pageable);

위 코드에서, PageRequest.of(0, 10)은 첫 번째 페이지에서 10개의 데이터를 가져오도록 Pageable 객체를 생성하는 코드입니다. 이제, UserRepository의 findAll 메소드에 위 Pageable 객체를 전달하면, 첫 번째 페이지의 사용자 정보 10개를 가져올 수 있습니다.

  • Sorting을 위한 Sort 사용법

Sorting을 위해서는, Repository 메소드의 파라미터로 Sort 객체를 받아와야 합니다. 예를 들어, 다음과 같은 UserRepository가 있다고 가정해보겠습니다.

public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findAll(Sort sort);

}

위 코드에서, UserRepository는 JpaRepository를 상속하고 있습니다. findAll 메소드의 파라미터로 Sort 객체를 받아와서, List<User> 타입의 결과를 반환하도록 정의되어 있습니다. 따라서, 다음과 같이 Sort 객체를 만들어서 UserRepository의 findAll 메소드에 전달할 수 있습니다.

Sort sort = Sort.by("name").ascending();
List<User> users = userRepository.findAll(sort);

위 코드에서, Sort.by("name").ascending()은 사용자 이름으로 오름차순으로 정렬하는 Sort 객체를 생성하는 코드입니다. 이제, UserRepository의 findAll 메소드에 위 Sort 객체를 전달하면, 사용자 정보를 이름으로 오름차순으로 정렬한 결과를 가져올 수 있습니다.

  • Paging과 Sorting을 함께 사용하는 방법

Paging과 Sorting을 함께 사용하기 위해서는, Repository 메소드의 파라미터로 Pageable과 Sort 객체를 모두 받아와야 합니다. 예를 들어, 다음과 같은 UserRepository가 있다고 가정해보겠습니다.

public interface UserRepository extends JpaRepository<User, Long>{

    Page<User> findAll(Pageable pageable, Sort sort);

}

위 코드에서, UserRepository는 JpaRepository를 상속하고 있습니다. findAll 메소드의 파라미터로 Pageable과 Sort 객체를 모두 받아와서, Page<User>타입의 결과를 반환하도록 정의되어 있습니다. 따라서, 다음과 같이 Pageable과 Sort 객체를 만들어서 UserRepository의 findAll 메소드에 전달할 수 있습니다.

Pageable pageable = PageRequest.of(0, 10);
Sort sort = Sort.by("name").ascending();
Page<User> users = userRepository.findAll(pageable, sort);

위 코드에서, PageRequest.of(0, 10)은 첫 번째 페이지에서 10개의 데이터를 가져오도록 Pageable 객체를 생성하는 코드입니다. Sort.by("name").ascending()은 사용자 이름으로 오름차순으로 정렬하는 Sort 객체를 생성하는 코드입니다. 이제, UserRepository의 findAll 메소드에 위 Pageable과 Sort 객체를 전달하면, 첫 번째 페이지의 사용자 정보 10개를 이름으로 오름차순으로 정렬한 결과를 가져올 수 있습니다.

이상으로, Spring Data JPA에서 Paging과 Sorting을 위한 Pageable과 Sort 객체를 사용하는 방법에 대해서 살펴보았습니다.

결론

Spring Data JPA에서 Paging과 Sorting을 위한 Pageable과 Sort 객체를 사용하면, 간단하게 데이터를 페이지로 나누어 가져오거나, 원하는 기준으로 데이터를 정렬할 수 있습니다. Pageable 객체를 사용하여 페이징 처리를 하면, 대용량의 데이터를 효과적으로 처리할 수 있고, Sort 객체를 사용하여 원하는 기준으로 데이터를 정렬할 수 있습니다. 또한, Pageable과 Sort 객체를 함께 사용하여 원하는 페이지의 데이터를 정렬하여 가져올 수 있습니다. 이를 통해 Spring Data JPA를 사용하는 개발자들은 간편하게 데이터를 처리할 수 있습니다.


내저장소 바로가기 luxury515

'Back-end > JPA' 카테고리의 다른 글

JPA 패치전략  (0) 2023.04.13
JPA 조인전략  (0) 2023.04.13
JPA 맵핑전략  (0) 2023.04.13
JPA에서 Specification 사용해보기  (0) 2023.04.13
JPA 에서 복합키 를 사용하는 이유 ,구현 방법.  (0) 2023.04.11
728x90

JPA 패치 전략 (Fetch Strategy)이란?

JPA에서 패치 전략이란 연관된 엔티티를 조회할 때, 즉시 로딩(EAGER)과 지연 로딩(LAZY) 방식을 지정하는 것을 의미합니다.

  • EAGER (즉시 로딩)

즉시 로딩은 연관된 엔티티가 항상 같이 로딩되어 가져옵니다. 예를 들어, Member 엔티티와 Team 엔티티가 일대다 관계일 때, Member 엔티티를 조회할 때 연관된 Team 엔티티도 함께 조회합니다.

@Entity
public class Member {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @ManyToOne(fetch = FetchType.EAGER)
    private Team team;
    
    // Getter, Setter
}

@Entity
public class Team {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    // Getter, Setter
}
  • LAZY (지연 로딩)

지연 로딩은 연관된 엔티티가 실제 사용될 때 로딩됩니다. 예를 들어, Member 엔티티와 Order 엔티티가 일대다 관계일 때, Member 엔티티를 조회할 때 연관된 Order 엔티티는 필요할 때 로딩됩니다.

@Entity
public class Member {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @OneToMany(mappedBy = "member", fetch = FetchType.LAZY)
    private List<Order> orders = new ArrayList<>();
    
    // Getter, Setter
}

@Entity
public class Order {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @ManyToOne
    private Member member;
    
    // Getter, Setter
}

내저장소 바로가기 luxury515

728x90

JPA 조인 전략 (Join Strategy)

JPA에서 조인 전략이란 상속 관계 매핑을 위한 전략으로, 부모 클래스와 자식 클래스를 각각 별도의 테이블로 만들고 조인(JOIN) 연산을 이용해 조회하는 방식입니다.

조인 전략 예시 코드

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Item {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    private int price;
    
    // Getter, Setter
}

@Entity
public class Book extends Item {
    private String author;
    
    private String isbn;
    
    // Getter, Setter
}

@Entity
public class Movie extends Item {
    private String director;
    
    private String actor;
    
    // Getter, Setter
}

위 코드에서 Item 클래스에 @Inheritance(strategy = InheritanceType.JOINED) 어노테이션을 추가하여 조인 전략을 사용합니다. Book 클래스와 Movie 클래스는 각각 Item 클래스를 상속받으며, 각각 자신만의 속성을 가지고 있습니다. 이 때, JPA는 각 클래스를 별도의 테이블로 생성하고, JOIN 연산을 이용해 조회합니다.


내저장소 바로가기 luxury515

728x90

JPA 맵핑 전략 (Mapping Strategy)

JPA에서 맵핑 전략이란 데이터베이스 테이블과 객체 간에 매핑하는 방식을 지정하는 것입니다.

맵핑 전략 종류

  1. 객체-관계 매핑 (ORM) : 객체를 테이블에 매핑하는 방식
  1. 클래스-테이블 매핑 : 클래스를 테이블에 매핑하는 방식
  1. 필드-컬럼 매핑 : 필드를 컬럼에 매핑하는 방식
  1. 기본 키 매핑 : 기본 키를 매핑하는 방식
  1. 연관관계 매핑 : 연관관계를 매핑하는 방식

맵핑 전략 예시 코드

@Entity
@Table(name = "MEMBER")
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
    
    @Column(name = "NAME")
    private String name;
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    // Getter, Setter
}

@Entity
@Table(name = "TEAM")
public class Team {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;
    
    @Column(name = "NAME")
    private String name;
    
    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
    
    // Getter, Setter
}

위 코드에서 @Entity, @Table, @Id, @GeneratedValue, @Column, @ManyToOne, @JoinColumn, @OneToMany 어노테이션 등을 이용해 각각의 맵핑 전략을 지정하였습니다.

  • 객체-관계 매핑 : @Entity 어노테이션
  • 클래스-테이블 매핑 : @Table 어노테이션
  • 필드-컬럼 매핑 : @Column 어노테이션
  • 기본 키 매핑 : @Id, @GeneratedValue 어노테이션
  • 연관관계 매핑 : @ManyToOne, @JoinColumn, @OneToMany 어노테이션


내저장소 바로가기 luxury515

'Back-end > JPA' 카테고리의 다른 글

JPA 패치전략  (0) 2023.04.13
JPA 조인전략  (0) 2023.04.13
JPA에서 Specification 사용해보기  (0) 2023.04.13
JPA 에서 복합키 를 사용하는 이유 ,구현 방법.  (0) 2023.04.11
JoinColumn vs MappedBy 에 관하여  (0) 2023.04.11

+ Recent posts