기존의 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) 프론트로 전달해줘야한다.

이 부분이 가장 어려울 거 같다.

+ Recent posts