기존의 PDF 테이블에는 User 정보가 없었다.
누가 올렸는지 저장을 안하니 List를 줄 수도 없었다.
Domain Pdf에 User 추가
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false)
private User user;
User의 id가 Pdf 테이블에 user_id로 들어감
이렇게 되면 JWT에서 사용자 정보를 가져와 User 만들고 Pdf 저장 시 User 도 저장 가능해졌다.
다음과 같이 업로드 시 JWT 토큰을 입력해야한다.

PdfController
@GetMapping("/pdf")
public ApiResponse<List<PdfResponse>> getPdf() {
User currentUser = SecurityUtil.getCurrentUser(); // 현재 로그인한 유저 가져오기
List<PdfResponse> data = pdfService.getAllUploadedPdfs(currentUser);
return ApiResponse.success(data, "해당 유저의 PDF 리스트 입니다.", HttpStatus.OK);
}
PdfResponse
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class PdfResponse {
private Long id;
private String indexPath;
private Integer maxQuizCount;
private LocalDateTime createdAt;
public static PdfResponse from(Pdf pdf) {
return PdfResponse.builder()
.id(pdf.getId())
.indexPath(pdf.getIndexPath())
.maxQuizCount(pdf.getMaxQuizCount())
.createdAt(pdf.getCreatedAt())
.build();
}
public static List<PdfResponse> fromList(List<Pdf> pdfList) {
// pdflist가 null 이면 pdfList.stream() NPE 발생
if (pdfList == null || pdfList.isEmpty()) {
return List.of();
}
return pdfList.stream()
.map(PdfResponse::from)
.toList();
}
}
PdfServiceImp
// 사용자를 받아 해당 사용자의 Pdf -> PdfResponse로 변환 후 반환
@Override
public List<PdfResponse> getAllUploadedPdfs(User user) {
List<Pdf> pdfs = pdfRepository.findAllByUser(user);
return PdfResponse.fromList(pdfs);
}
이렇게 구현하면 본인의 Pdf를 받아올 수 있다.
여기서 만약 업로드한 Pdf 가 없다면
{
"success": true,
"message": "해당 유저의 PDF 리스트 입니다.",
"data": [],
"statusCode": 200,
"timestamp": "2025-08-04T23:38:05.662623"
}
다음과 같이 응답함
테스트 작성
1. Repository Test - findAllByUser(User user)
@Test
@DisplayName("존재하는 유저의 pdf 목록 조회")
void findAllByUserTest() {
// given
User user = userRepository.save(UserFixture.testUser());
pdfRepository.save(PdfFixture.withUser(user));
pdfRepository.save(PdfFixture.withUser(user));
// when
List<Pdf> pdfs = pdfRepository.findAllByUser(user);
// then
assertThat(pdfs).hasSize(2);
}
2. Service Test - getAllUploadedPdfs(User user)
@Test
@DisplayName("pdf 리스트 테스트")
void pdfListTest(){
//given
User user = UserFixture.testUser();
List<Pdf> mockPdfs = List.of(
// repo에서 2개 가져왔다고 생각
PdfFixture.withUser(user),
PdfFixture.withUser(user)
);
// findAllByUser 호출되면 mockPdfs 반환
when(pdfRepository.findAllByUser(user)).thenReturn(mockPdfs);
// when
List<PdfResponse> result = pdfService.getAllUploadedPdfs(user);
//then
assertThat(result).hasSize(2);
assertThat(result.get(0).getIndexPath()).isEqualTo(mockPdfs.get(0).getIndexPath());
//findAllByUser가 정확히 한 번 호출되었는지 검증
verify(pdfRepository).findAllByUser(user);
}
@Test
@DisplayName("pdf 리스트 테스트")
void emptyPdfListTest(){
// given
User user = UserFixture.testUser();
when(pdfRepository.findAllByUser(user)).thenReturn(List.of());
// when
List<PdfResponse> result = pdfService.getAllUploadedPdfs(user);
// then
assertThat(result).isEmpty();
verify(pdfRepository).findAllByUser(user);
}
마무리
이제 해당 PDF의 상세보기 API를 만들어야한다. 이건 간단하게 만들테니 쉬울거고,
이게 끝나면 본격적으로 Quiz를 AI서버에 요청하고, 응답을 파싱해 DB에 저장하고 나눠서(SSE) 프론트로 전달해줘야한다.
이 부분이 가장 어려울 거 같다.
'공부일지 > 프로젝트' 카테고리의 다른 글
| OAuth2 HTTPS 적용하기 (2) | 2025.07.30 |
|---|---|
| [트러블 슈팅] OAuth2 플랫폼 별 Email 같을 때 다른계정으로 로그인 되는 문제 (0) | 2025.07.18 |
| 프로젝트 진행 사항: 비밀번호 변경 로직에 임시 토큰 추가 (1) | 2025.07.16 |
| 리프레시 토큰 적용하기: 개념편 (0) | 2025.07.06 |
| [사이드 프로젝트 일지] #01 스웨거 작성, 비밀번호 찾기 / 회원 정보 변경 추가 (0) | 2025.06.29 |