본문 바로가기

개발/프로젝트

[스프링부트 게시판] 9. JPA SELECT

이번 게시글에서는 데이터베이스에 들어있는 데이터에 대해 확인을 하는 SELECT 작업을 수행하도록 하겠습니다.

 

먼저 5개의 사용자를 추가하도록 이전 post를 통한 회원가입을 진행하도록 하겠습니다.

 

DBeaver

 

이후 이전 시간에 생성시켰던 UserController 클래스에서 SELECT를 확인 할 수 있는 코드를 추가하도록 하겠습니다. 여기서 '{ }'@PathVariable 어노테이션은 주소를 통한 파라미터를 전달받기 위해 사용하였습니다.

 

UserController

 

위와 같은 주소의 예시로 /toy/user/1 이렇게 작성을 해야하는데 실수로 {id}에 해당하는 값이 없어 널(null)값이 될 수도 있습니다. 이러한 변수가 들어가 문제가 발생하는 경우가 있습니다.

 

여기서 JpaRepository 클래스에서 데이터를 가져올 때, 예외를 따로 처리하는 기능이 있습니다.

 

[UserController, (1) User 객체 반환]

@GetMapping("/user/{id}")
public User findUser(@PathVariable Long id) {

    User user = userRepository.findById(id).orElse(new User());

    return user;
}

[UserController, (2) 에러처리(람다식)]

@GetMapping("/user/{id}")
public User findUser(@PathVariable Long id) {

    User user = userRepository.findById(id).orElseThrow(() -> {
        // IllegalArgumentException 예외 처리
        throw new IllegalArgumentException("해당하는 아이디가 없습니다 id : " + id);
    });

    return user;
}

여기서 User의 레포지토리인 UserRepository의 findById(Long id) 함수를 이용합니다. 이 때의 반환 값이 Optional 객체입니다. Optional 객체는 예상치 못한 NullPointerException 예외를 제공되는 메소드를 제공하는 java.util.Optional<T> 클래스에 존재합니다.

 

정상적인 출력, JsonViewer
비정상적인 출력

 

위와 같이 한 사용자의 정보를 알 수 있는 쿼리문 같은 경우 findById([해당 테이블 기본키])를 이용하면 됩니다.

 

혹여나 전체 사용자의 정보를 갖고 오고 싶다면 findAll을 사용하면 됩니다. 이 때의 반환값은 List<[해당 테이블 객체]> 입니다.

 

[UserController]

@GetMapping("/user")
public List<User> findAllUser() {
    return userRepository.findAll();
}

 

JsonViewer

 

이번엔 게시물 출력의 꽃, 페이징(Paging)에 대해 설명드리겠습니다.

 

만약, 수천, 수만개의 게시물을 한번에 출력하도록 하진 않으니 아래에 페이징 UI가 있을 것입니다.

 

예시로 갖고온 구글 페이징

 

이를 만들기 위한 페이징(Paging) 처리JpaRepository에 들어있습니다.

 

UserController

 

위와 같이 UserRepository에 findAll(Pageable pageable) 이란 함수가 존재합니다. 이를 이용하여 코드를 작성합니다.

 

[UserController]

@GetMapping("/user/page/{page}")
public Page<User> pageList(@PageableDefault(size=2, sort="id", direction=Sort.Direction.DESC) Pageable pageable) {
    Page<User> users = userRepository.findAll(pageable);
    return users;
}

 

페이징이란 말 그대로 모든 데이터를 한 번에 출력하지 않고 페이지를 나누어 쪽수별로 제공하는 기능입니다. @PageableDefault 어노테이션을 통해 페이지의 크기(size), 정렬하고자 하는 컬럼명(sort), 어떤 식으로 정렬할 것인가(direction, 오름차순/내림차순 등)Pageable 객체를 생성하여 findAll에 넣어 데이터가 출력할 수 있습니다. 참고로 이 Pageable의 첫 페이지의 인덱스 값은 0입니다.

 

 

JsonViewer

 

위와 같이 User의 기본키 값인 id의 내림차순으로 정렬하였기 때문에 0에 위치한 페이지 인덱스에 5와 4의 id인 사용자가 표현되었습니다. 물론 여기서 데이터 목록만 갖고오도록 할거면 Page<T>의 객체에서 .getContent() 함수를 사용하면 됩니다.

 

[UserController]

@GetMapping("/user/page/{page}")
public List<User> pageList(@PageableDefault(size=2, sort="id", direction=Sort.Direction.DESC) Pageable pageable) {
    Page<User> users = userRepository.findAll(pageable);
    List<User> list = users.getContent();
    return list;
}

 

JsonViewer