서론

프로젝트 진행중 csv를 파싱할 일이 생겨 파싱해서 DB에 저장하는 코드를 작성했는데 기록하기 위해서 남긴다.

예시 데이터
name,bigtype,material,description,url
쌀밥,한식,쌀,"1. 밥솥에 쌀을 씻어 깨끗하게 세척한다.
2. 물과 쌀의 비율은 1:12 정도로 설정하여 밥솥에 넣는다.
3. 밥솥을 뚜껑으로 덮고, ""취사"" 모드로 설정하여 밥을 짓는다.
4. 밥이 다 익으면, 약 10분 정도 지난 후에 조금씩 저어가며 식힌다.
5. 완성된 흰쌀밥을 그릇에 담아 맛있게 즐긴다.",imageurl
@RequiredArgsConstructor
@RestController
public class TestJobController {

    private final RecipeRepository recipeRepository;
    private final RecipeSequenceRepository recipeSequenceRepository;

    @Transactional
    @GetMapping("/data")
    public String saveData() throws IOException {
        try (CSVReader reader = new CSVReader(new FileReader("src/main/resources/메뉴AWS링크포함.csv"))) {
            String[] nextLine;
            reader.skip(1);
            while ((nextLine = reader.readNext()) != null) {
                int j = 0;
                int k = 1;
                Recipe recipe = Recipe.builder()
                        .foodImageUrl(nextLine[4])
                        .name(nextLine[0])
                        .material(nextLine[2])
                        .category(nextLine[1])
                        .build();

                recipeRepository.save(recipe);

                String[] data = nextLine[3].split("\\\\.");
                for (int i = 0; i < data.length; i++) {
                    if (j >= data.length || k >= data.length) {
                        break;
                    }
                    String sequence = data[j];
                    String content = data[k];
                    j += 2;
                    k += 2;
                    recipeSequenceRepository.save(
                            RecipeSequence.builder()
                                    .sequence(Integer.parseInt(sequence.trim()))
                                    .content(content.trim())
                                    .recipe(recipe)
                                    .build()
                    );
                }
            }
        } catch (CsvValidationException e) {
            throw new RuntimeException(e);
        }
        return "success";
    }
}
  1. 컬럼 기준으로 읽기 위해 readNext 사용 → 한 줄씩 읽어 내려감
  2. description 부분이 nextLine[3]인데 (.)을 기준으로 구분하고 배열을 순회하며 저장함