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
@Service
@Slf4j
@AllArgsConstructor
public class CustomUserServiceImp implements UserDetailsService {

  private final UserRepository userRepository;

  private final AuthoritiesRepository authoritiesRepository;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    User user = userRepository.findByUsername(username);
    if ("null".equals(user)) {
      throw new UsernameNotFoundException("not found user:" + username);
    }

    CustomUser customUser = new CustomUser();
    customUser.setUsername(user.getUsername());
    customUser.setPassword(user.getPassword());
    customUser.setAuthorities(getAuthorities(username));
    customUser.setEnabled(true);
    customUser.setAccountNonExpired(true);
    customUser.setAccountNonLocked(true);
    customUser.setCredentialsNonExpired(true);
    return customUser;
  }

  public Collection<GrantedAuthority> getAuthorities(String username) {
    List<Authority> authList = authoritiesRepository.findByUsername(username);
    List<GrantedAuthority> authorities = new ArrayList<>();
    for (Authority authority : authList) {
      authorities.add(new SimpleGrantedAuthority(authority.getAuthority()));
    }
    return authorities;
  }
}

내저장소 바로가기 luxury515

'Springboot3.0' 카테고리의 다른 글

[Interface]`UserDetails` 구현  (0) 2023.04.16
Springboot Security  (0) 2023.04.16
728x90
@Data
public class CustomUser implements UserDetails {
  private String username;
  private String password;
  private boolean isEnabled;
  private boolean isAccountNonExpired;
  private boolean isAccountNonLocked;
  private boolean isCredentialsNonExpired;
  private Collection<? extends GrantedAuthority> authorities;
}


내저장소 바로가기 luxury515

'Springboot3.0' 카테고리의 다른 글

[Interface]`UserDetailsService`  (0) 2023.04.16
Springboot Security  (0) 2023.04.16
728x90
@EnableWebSecurity
@Configuration
@AllArgsConstructor
public class SecurityConfig {

  private final CustomUserServiceImp customUserServiceImp;
  @Bean
  public BCryptPasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }

  @Bean
  public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests(
            (auth) ->
                auth.antMatchers("/user/**", "/auth/**").permitAll().anyRequest().authenticated())
        .httpBasic(withDefaults());
    http.headers()
            .frameOptions().sameOrigin();
    http.userDetailsService(customUserServiceImp);
    return http.build();
  }

  @Bean
  public WebSecurityCustomizer webSecurityCustomizer() {
    return (web -> web.ignoring().antMatchers("/images/**", "/js/**", "/webjars/**"));
  }
}


내저장소 바로가기 luxury515

'Springboot3.0' 카테고리의 다른 글

[Interface]`UserDetailsService`  (0) 2023.04.16
[Interface]`UserDetails` 구현  (0) 2023.04.16

+ Recent posts