개발지식 먹는 하마 님의 블로그

[내일배움캠프 71일차] 크롤링한 Json 데이터 DB 저장 본문

내일배움캠프 (CS25)

[내일배움캠프 71일차] 크롤링한 Json 데이터 DB 저장

devhippo 2025. 5. 30. 18:56

크롤링한 문제 DB에 저장하기

✔️선행 데이터 등록 필요

이번 프로젝트에서는 문제의 카테고리 (frontend, backend 등)를 Enum이 아닌 엔티티로 관리한다.
Enum은 동적으로 데이터를 확장할 수 없기 때문에 엔티티로 관리하기로 결정하였다.

이런 설계의 특성상 Quiz 엔티티를 생성할 때, Enum인 QuizCategoryType 대신 이를 DB에서 관리하는 QuizCategory 엔티티가 필요로 하기 때문에 반드시 먼저 QuizCategory 데이터가 생성되어있어야 한다.

 

Quiz 등록 API

Json 파일을 입력받기 위해 MultipartFile을 사용하였다.

MultipartFile : 클라이언트로부터 전송된 파일을 서버에서 받기 위한 객체

    public void uploadQuizJson(MultipartFile file, QuizCategoryType categoryType, QuizFormatType formatType){
        try {
            QuizCategory category = quizCategoryRepository.findByCategoryType(categoryType)
                .orElseThrow(() -> new QuizException(QuizExceptionCode.QUIZ_CATEGORY_NOT_FOUND_EVENT));

            CreateQuizDto[] quizArray = objectMapper.readValue(file.getInputStream(), CreateQuizDto[].class);
            ...
        }
    }

getInputStream 메서드로 파일 내용을 Stream 형태로 읽고
ObjectMapper로 JSON 문자열을 Java 객체(여기선 CreateQuizDto)로 바꾼다.

            List<Quiz> quizzes = Arrays.stream(quizArray)
                .map(dto -> Quiz.builder()
                    .type(formatType)
                    .question(dto.question())
                    .choice(dto.choice())
                    .answer(dto.answer())
                    .commentary(dto.commentary())
                    .category(category)
                    .build())
                .toList();

            quizRepository.saveAll(quizzes);

빌더 패턴으로 생성하는 Quiz 엔티티에 매핑한 후 이를 리스트로 모아 한번에 저장한다.

퀴즈 등록 api를 실행하면 Json 파일이 정상적으로 읽히고 DB에 저장된다.

(DB에 저장한 결과 파일 첨부 필요)