UMC 10기 - Spring Boot 스터디 #7

정유진·5일 전
post-thumbnail

이번 8주차에서는
Spring Boot에서 자주 사용되는 페이지네이션 방식과 Validation,
그리고 JPA 연관관계를 활용한 객체 그래프 탐색에 대해 학습했습니다.

특히 단순 CRUD 구현을 넘어서:

  • Offset Pagination (Page)
  • Cursor Pagination (Slice)
  • Java Stream API
  • 객체 그래프 탐색
  • @Valid 기반 검증 처리

등 실무에서도 자주 등장하는 개념들을 직접 API로 구현해보며 익힐 수 있었습니다.


그리고 이번 미션에서는:

  • 내가 진행중인 미션 조회 API
  • 내가 작성한 리뷰 조회 API
  • Validation 예외 처리

를 중심으로 구현을 진행했다.



1. Page와 Slice

Spring Data JPA에서는 페이지네이션을 위해 Page와 Slice를 제공함

1) Page

: 전체 데이터 수까지 함께 조회하는 방식

Page<Participate>

특징

  • 전체 페이지 수 제공
  • 전체 데이터 개수 제공
  • count query 추가 실행
장점단점
페이지 번호 기반 UI 구현에 적합count query 때문에 성능 비용 발생 가능
전체 페이지 계산 가능대용량 데이터에서는 성능 저하 가능

사용 예시

PageRequest pageRequest =
        PageRequest.of(page, 3);
Page<Participate> participatePage =
        participateRepository
                .findAllByMemberIdAndStatus(
                        memberId,
                        ParticipatedStatus.CHALLERGING,
                        pageRequest
                );

2) Slice

: 다음 페이지 존재 여부만 확인하는 방식

Slice<Review>

특징

  • count query 실행 X
  • 다음 데이터 존재 여부만 확인
  • cursor pagination에 적합
장점단점
성능 효율적전체 페이지 수 확인 불가
무한 스크롤 구현에 적합

사용 예시

Slice<Review> reviewSlice =
        reviewRepository
                .findByMemberIdAndIdLessThanOrderByIdDesc(
                        memberId,
                        cursor,
                        pageable
                );

2. Java Stream API

  • 컬렉션 데이터를 선언형 방식으로 처리하기 위한 API이고,
  • 반복문 대신 stream을 사용하여 가독성을 높일 수 있음

map()

map()은 데이터를 다른 형태로 변환할 때 사용

return missionList.stream()
        .map(MissionConverter::toMissionPreviewDTO)
        .toList();

의미
Mission 객체 → MissionPreviewDTO 변환


3. 객체 그래프 탐색

JPA에서는 연관관계를 통해 다른 Entity 데이터에 접근할 수 있음

예를 들어:

Participate
 └── Mission

관계가 존재할 때:

participate.getMission()

을 통해 Mission 객체에 접근 가능


사용 예시

Mission mission = participate.getMission();
mission.getContent()
mission.getPoint()
mission.getEndDate()

장점

  1. 객체지향적인 코드 작성 가능
  2. JOIN SQL을 직접 작성하지 않아도 됨

주의점

: Lazy Loading으로 인해 N+1 문제가 발생할 수 있다.


4. @Valid vs @Validated

@Valid

  • Java 표준 Validation Annotation
  • 주로 Request Body 검증 시 사용함
    @RequestBody @Valid MissionReqDTO.CreateMission dto

@Validated

  • Spring에서 제공하는 확장 Validation 기능

특징 :
1. 그룹 검증 가능
2. 클래스 레벨 검증 가능

차이점 정리

항목@Valid@Validated
제공Java 표준Spring
그룹 검증XO
사용 위치DTO클래스/메서드
주 사용 목적Request Body 검증고급 Validation



미션 정리

미션 1) 내가 진행중인 미션 조회 API

  • Offset 기반 페이지네이션(Page) 적용
  • Request Body를 통해 memberId를 전달받도록 구현
  • ParticipatedStatus.CHALLERGING 상태의 미션만 조회하도록 구현

    image
    image

미션 2) 내가 생성한 리뷰 조회 API

  • Cursor 기반 페이지네이션(Slice) 적용
  • 사진 데이터 제외 후 리뷰 정보만 반환
  • 정렬 기준을 query parameter로 분기 처리
  1. sort=id → 최신 리뷰(ID DESC)
  2. sort=stars → 별점 기준 정렬(STARS DESC)

미션 3) Validation 적용

  • Request Body DTO에 Validation Annotation 적용

    1. @NotBlank
    2. @NotNull
    image
  • @Valid를 통한 요청값 검증 적용

    image
  • GeneralExceptionAdvice에서 MethodArgumentNotValidException 처리 구현

    image







이번 주차에서는 단순 CRUD 구현을 넘어 실제 서비스에서 자주 사용되는 페이지네이션과 Validation 처리 방식을 직접 구현해볼 수 있었다.

특히:

  • Offset Pagination과 Cursor Pagination의 차이
  • PageSlice의 사용 목적
  • 객체 그래프 탐색
  • Validation 예외 처리

등을 직접 API에 적용해보며 개념을 더 명확하게 이해할 수 있었습니다 !

profile
개발전공 대학생

0개의 댓글