
이번 8주차에서는
Spring Boot에서 자주 사용되는 페이지네이션 방식과 Validation,
그리고 JPA 연관관계를 활용한 객체 그래프 탐색에 대해 학습했습니다.
특히 단순 CRUD 구현을 넘어서:
@Valid 기반 검증 처리등 실무에서도 자주 등장하는 개념들을 직접 API로 구현해보며 익힐 수 있었습니다.
그리고 이번 미션에서는:
를 중심으로 구현을 진행했다.
Spring Data JPA에서는 페이지네이션을 위해 Page와 Slice를 제공함
: 전체 데이터 수까지 함께 조회하는 방식
Page<Participate>
특징
| 장점 | 단점 |
|---|---|
| 페이지 번호 기반 UI 구현에 적합 | count query 때문에 성능 비용 발생 가능 |
| 전체 페이지 계산 가능 | 대용량 데이터에서는 성능 저하 가능 |
사용 예시
PageRequest pageRequest =
PageRequest.of(page, 3);
Page<Participate> participatePage =
participateRepository
.findAllByMemberIdAndStatus(
memberId,
ParticipatedStatus.CHALLERGING,
pageRequest
);
: 다음 페이지 존재 여부만 확인하는 방식
Slice<Review>
특징
| 장점 | 단점 |
|---|---|
| 성능 효율적 | 전체 페이지 수 확인 불가 |
| 무한 스크롤 구현에 적합 |
사용 예시
Slice<Review> reviewSlice =
reviewRepository
.findByMemberIdAndIdLessThanOrderByIdDesc(
memberId,
cursor,
pageable
);
map()은 데이터를 다른 형태로 변환할 때 사용
return missionList.stream()
.map(MissionConverter::toMissionPreviewDTO)
.toList();
의미
Mission 객체 → MissionPreviewDTO 변환
JPA에서는 연관관계를 통해 다른 Entity 데이터에 접근할 수 있음
예를 들어:
Participate
└── Mission
관계가 존재할 때:
participate.getMission()
을 통해 Mission 객체에 접근 가능
사용 예시
Mission mission = participate.getMission();
mission.getContent()
mission.getPoint()
mission.getEndDate()
: Lazy Loading으로 인해 N+1 문제가 발생할 수 있다.
@RequestBody @Valid MissionReqDTO.CreateMission dto특징 :
1. 그룹 검증 가능
2. 클래스 레벨 검증 가능
| 항목 | @Valid | @Validated |
|---|---|---|
| 제공 | Java 표준 | Spring |
| 그룹 검증 | X | O |
| 사용 위치 | DTO | 클래스/메서드 |
| 주 사용 목적 | Request Body 검증 | 고급 Validation |
ParticipatedStatus.CHALLERGING 상태의 미션만 조회하도록 구현 sort=id → 최신 리뷰(ID DESC)sort=stars → 별점 기준 정렬(STARS DESC)
Request Body DTO에 Validation Annotation 적용
@NotBlank@NotNull@Valid를 통한 요청값 검증 적용
GeneralExceptionAdvice에서 MethodArgumentNotValidException 처리 구현
이번 주차에서는 단순 CRUD 구현을 넘어 실제 서비스에서 자주 사용되는 페이지네이션과 Validation 처리 방식을 직접 구현해볼 수 있었다.
특히:
Page와 Slice의 사용 목적 Validation 예외 처리등을 직접 API에 적용해보며 개념을 더 명확하게 이해할 수 있었습니다 !